OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのEC2上でNginxを使ってRailsを動かす

# 目的
* Nginx を利用し 80 ポートで受けたリクエストを 3000 ポートで起動した Rails アプリに渡す。

# 前提
* EC2 の OS は Ubuntu
* EC2 の Security Group はポート 80, 3000 を許可
* rails がインストール済み
* nginx がインストール済み

# Nginx の動作確認

```bash
$ sudo service nginx status
```

> nginx is running

* EC2 の Public DNS でブラウザからアクセス
    * ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
    * Welcome to Nginx! のページが表示される

# Rails アプリ動作確認
* サンプルアプリ作成

```bash
$ rails new TestApp
```

* アプリ起動

```bash
$ rails s
```

* ブラウザからアクセス
    * ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com:3000
    * Welcome aboard のページが表示される


# Nginx の設定ファイル編集
* 設定ファイルを下記のように編集

```/etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
#  デフォルトで読み込む設定ファイルを読まないようにする
#    include /etc/nginx/conf.d/*.conf;

    server {
# リクエストを受けるポート
        listen   80;
        server_name localhost;

        location / {
# 80 ポートで受けたリクエストを 3000 ポートに中継する
            proxy_pass http://127.0.0.1:3000;
        }
    }
}
```

* 設定ファイルの再読み込み

```bash
$ sudo service nginx reload
```

* Nginx の再起動

```bash
$ sudo service nginx restart
```

* 80 ポートでブラウザからアクセス
    * ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
    * Welcome aboard のページが表示される
django の管理画面の検索で Elasticsearch を使う


データが80万レコードくらいになってくると標準の LIKE 検索では無理な感じなので Elasticsearch を導入して検索できるといいなーと思って試してみました。 Haystack のドキュメントにはまだ書かれてなかったんだけど、簡単にできました。

django で Elasticsearch を使う方法はこちらを参考にしました。

http://django-haystack.readthedocs.org/en/latest/tutorial.html
https://gist.github.com/voluntas/6739918

以下のものがインストールされていることを前提とします。

- Elasticsearch
- django
- Haystack

あと、以下のようなモデルがあるということにします。

```python:models.py
from django.contrib.auth.models import User
from django.db import models

class Memo(models.Model):
    user = models.ForeignKey(User)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
```

search_indexes.py を書く。

```python:search_indexes.py
import datetime

from haystack import indexes

from memo.models import Memo


class MemoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
	user = indexes.CharField(model_attr='user')

    def get_model(self):
        return Memo

    def index_queryset(self, using=None):
        return self.get_model().objects.filter(created_at__lte=datetime.datetime.now())
```

admin.py を書きます。ここで Haystack の SearchModelAdmin を継承するのがポイント。 search_fields は適当に入れておく。

```python:admin.py
from django.contrib import admin
from haystack.admin import SearchModelAdmin

from memo.models import Memo


class MemoAdmin(SearchModelAdmin):
    list_display = ('user', 'created_at',)
    search_fields = (
        'text',
    )

admin.site.register(Memo, MemoAdmin)
```

適当にデータをいれて

```shell
$ python manage.py rebuild_index
```

管理画面にログインして普通に検索すると Elasticsearch を使ってくれるはず。
Javascriptで文字列をモールス信号に変換してネットの海で助けを求める


*トントントンツーツーツートントントン・・・*

届いているでしょうか？

「無人島にひとつだけ持っていくとしたら？」
と聞かれて
「ノートパソコン」
とうっかり答えてしまった時の為に、
Javascriptで文字列をモールス信号に変換するプログラムを作ってみました。

これです。

**モールス信号変換**
**http://xiidec.appspot.com/morse.html**

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/33890/6062d899-d6f9-46ae-e455-06dd276b8ce6.png "ss.png")

上のテキストボックスに変換したい文字列(英数字)を入力すると、
0と1に変換してピーピー音がなります。

##モールス信号はどうやってお話しするの？
短い「ピッ」と長い「ピー」の組み合わせで言葉を作るあれです。
「ピッ」「ピー」を「トン」「ツー」に言い換えるとなんか玄人っぽいですね。

モールス信号の代表例がこの

・・・ーーー・・・

「SOS」。
「S」が「・・・」で「O」が「ーーー」。
ピンクレディの『SOS』という曲のイントロにはモールス信号の
SOSが入っているのでラジオで放送できなかった…というエピソードは有名ですね。

具体的なルールはWikipediaを参考にしましょう。

>国際モールス符号は短点（・）と長点（－）を組み合わせて、アルファベット・数字・記号を表現する。
>長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。
>また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。

なるほど。
非常にシンプルですね。

##プログラム
Javascriptで実装してみるとこんな感じになります。
解説は後ろのほうで。

```morse.html
<HTML>
  <HEAD>
        <style type="text/css">
        </style>
    <Script>
var audio = new Audio();
audio.src = "etc/pi.wav";
var dict = {
	"a":"10111",
	"b":"111010101",
	"c":"11101011101",
	"d":"1110101",
	"e":"1",
	"f":"101011101",
	"g":"111011101",
	"h":"1010101",
	"i":"101",
	"j":"1011101110111",
	"k":"111010111",
	"l":"101110101",
	"m":"1110111",
	"n":"11101",
	"o":"11101110111",
	"p":"10111011101",
	"q":"1110111010111",
	"r":"1011101",
	"s":"10101",
	"t":"111",
	"u":"1010111",
	"v":"101010111",
	"w":"101110111",
	"x":"11101010111",
	"y":"1110101110111",
	"z":"11101110101",
	"1":"10111011101110111",
	"2":"101011101110111",
	"3":"1010101110111",
	"4":"10101010111",
	"5":"101010101",
	"6":"11101010101",
	"7":"1110111010101",
	"8":"111011101110101",
	"9":"11101110111011101",
	"0":"1110111011101110111",
	".":"10111010111010111",
	",":"1110111010101110111",
	"?":"101011101110101",
	"!":"1110101110101110111",
	"-":"111010101010111",
	"/":"1110101011101",
	"@":"10111011101011101",
	"(":"111010111011101",
	")":"1110101110111010111",
	" ":"0"
}
function morse(){
	var morse_str=conv(document.getElementById("inp").value)
	play_sound(morse_str)
}
function conv(word_str){
	var strs = word_str.toLowerCase().split('');
	var rtn ="";
	for(var i =0;i<=strs.length-1;i++){
		if(dict[strs[i]]===undefined){
		}else{
			rtn+=dict[strs[i]]+"000";
		}
	}
	return rtn;
}
function play_sound(morse){
	var mstrs=morse.split('');
	var mesEle=document.getElementById("mes");
	mesEle.value="";
	var timer=setInterval(function(){
			audio.currentTime = 0;
			if(mstrs.length<=0){
				audio.pause();
				clearInterval(timer);
				return;
			}
			var onoff=mstrs.shift();
			if(onoff=="0"){
				audio.pause();
			}else{
				audio.play();
			}
			mesEle.value=mesEle.value+onoff;
	},100)
}
    </Script>
  </HEAD>
<BODY onLoad="">
<h1>モールス信号変換</h1>
入力値:<input type="text" id="inp" value="SOS" size="35"><input type="button" value="変換" onclick="morse()"><br>
↓</br>
<textarea id="mes" rows="4" cols="40" wrap="soft"></textarea><br>
</BODY>
</HTML>
```

##解説
100行中の49行くらいが変換テーブルです。
仕組みは非常に簡単。

まず`conv()`で文字列を1文字ずつ１と０に変換しています。
１は音を鳴らす、０は鳴らさない、文字と文字の間には0が3つ。

そして`play_sound()`で実際に音を鳴らします。
あらかじめ用意したwavファイルを再生して、0か1かに応じて0.1秒毎に止めたり鳴らしたりしています。

そう、これだけ。

##まとめ
応用すれば音響カプラ通信も実現できそうですね。
無人島で助けを呼ぶ際にはそちらも検討してみます。
Pythonで内包表記をインデントする

Pythonの内包表記は便利ですが、ちょっと複雑なことをしようとすると、多段階にネストすることになってしまいます。そして、ネストすると可読性が著しく落ちます。このため、ネストの階層が深くなったら、ブロック表記に書きなおしている人も多いのではないかと思います。

しかし、ルールを決めてインデントすれば、ネストしても可読性を損ないません。たとえば以下のような形です。

```py3
itemList = [
    (item.name, item.price)
	for item in record.items()
    for purchase in purchases
    if purchase.campaignName in {
        campaign.name
        for campaign in camapigns
    } and purchase.date > datetime.date.today() - datetime.timedelta(days = 7)
]
```

1. 内包表記の外側の括弧のインデントを揃え、中身を一つインデントさせる。
2. 要素, for句, (for句)...,（if句)で分割する。

ちょっと慣れは必要かもしれませんが、慣れればブロック表記よりもずっと読みやすくなります。ブロック表記だと、内包表記では不必要なリスト保存用の変数が増えて可読性が落ちることを考えると、内包表記で無制限にネストできることのメリットはかなり大きいと思います。
iptablesの設定【最小構成】

iptablesの最小構成設定です。
この設定では自分からのアクセスは全て許可され、外部からのアクセスはPingとSSH以外全て拒否されます。

#設定
##ディレクトリ作成
shellスクリプトを格納するディレクトリを作成する

```
# mkdir /root/bin/
```

##iptables.shの作成

```
# vi /root/bin/iptables.sh
```

下記の内容をコピーアンドペーストする。
※日本語に対応していない場合はコメントにある日本語が文字化けする恐れがあります。

```lang:vim操作
: a
```

```lang:iptables.sh
#!/bin/sh

# iptables 初期化
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# 受信を破棄 / 送信を許可 / 通過を拒否
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ping(icmp)許可
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT

# ssh許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

################################
##### サービス設定ここから #####


##### サービス設定ここまで #####
################################

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP
```

```lang:vim操作
[ESC]
: wq
```

##スクリプトを実行
スクリプトを実行するとiptablesが適用されます。

```
# sh /root/bin/iptables.sh
```

##実行結果を確認
```
# iptables -nL
```

#運用
##OS起動時に自動でiptablesを適用する
ここまでの設定で既にiptablesは適用されていますが、OSの再起動するとせっかく設定したiptablesが消されて初期状態に戻ります。
再起動するたびにスクリプトを手動で実行するのも手間ですので、OS起動時に自動的に実行してもらいます。

```
# vi /etc/rc.local
```

下記を追記

```lang:rc.local
sh /root/bin/iptables.sh
```

##iptablesを停止する
CentOS 5.xでは`# iptables -F`を使用していましたが、6.xで同じ事をするとSSHが切られたりして不安定なため、サービスを停止することをお勧めします。

```lang:CentOS6.x
# /etc/init.d/iptables stop
```

##iptablesを再開する
先ほど`iptables stop`で停止したので、`iptables start`をしがちですが、普通にスタートをしても初期設定に戻ってしまいます。
なので、shを実行しましょう。

```
# sh /root/bin/iptables.sh
```
Ubuntu 12.04 LTSにnginxを導入する


ubuntu 14.04 LTSの正式リリースを心待ちにしています。
いつも忘れるので忘備録ということで、自分用にメモしておきます。

##ん？なんか特殊な操作が必要なの？
古いバージョンを使う分には、大丈夫です。普通にaptitudeで入ります。

```Bash
sudo aptitude update
sudo aptitude install nginx
```

ですね。
でも、新しいバージョンのものをさっくり入れたい場合は、下記をしておくと便利でしょう。

##リポジトリに追加

```sudo vim /etc/apt/sources.list.d/nginx.list```

に、

```Bash
deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx
```

を記述して保存。

##鍵を追加

```Bash
curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
```
これをやっとく。

##で、最後に

```Bash
sudo aptitude update
sudo aptitude install nginx
```

簡単だけどいつも忘れる。
いい加減chefるか。
Rubyで前処理。Pixivタグ検索結果に対しタグカウントを実行。

#概要
[前回記事](http://qiita.com/nezuq/items/55800d55c03606e0b13c)で取得したPixiv検索結果CSVからタグを抽出し、タグの出現数を降順に列挙する。

#コード
```ruby:TagCount.rb
# coding: UTF-8

require 'csv'

h = {}
h.default = 0
CSV.foreach('INPUT.csv', encoding: "UTF-8") do |row|
	row[13].split(' ').each do |item|
		h[item] += 1
	end
end

CSV.open("OUTPUT.csv", "wb") do |csv|
	h.sort_by{|key, value| -value}.each do |set|
		csv << [set[0], set[1]]
	end
end

puts 'end!'
```

#出力結果（サンプル）
男の娘,35
こんな可愛い子が女の子のはずがない,10
だが男だ,10
オリジナル1000users入り,9
女装男子,8
オリジナル,8
女装,8
（以下略）
Amazon S3のオブジェクトをMacのコンソールから削除した時のメモ

Amazon S3でオブジェクトを削除するときに、いちいちWebコンソールやアプリケーション経由の操作では大変なので、コマンドラインでサクッと対応した時のメモ
#s3cmdのインストール
`brew install s3cmd`

#S3の設定
```
$ s3cmd --configure
Access Key: *********
Secret Key: *********
Encryption password:
Path to GPG program[None]: None
Use HTTPS protocol[No]: True
HTTP Proxy server name:
HTTP Proxy server port: 0
```
設定ファイル`~/.s3cfg`が出来上がる。

ついでにリージョンも東京に変更
```
$ vi ~/.s3cfg
bucket_location = ap-northeast-1
```

削除
```
$ s3cmd del s3://[bucket名]/[対象オブジェクト名]
```

#参考

Mac OS Xでs3cmdを使って、Amazon S3、さくらのBASE Storageのファイルを操作する
http://qiita.com/isaoshimizu/items/657595cbf05d2b3bec81

s3cmd - Eucalyptus
http://oss.infoscience.co.jp/eucalyptus/wiki/s3cmd/
railsコマンドがおかしくなった時にやってみた事


- Rails 4系
- `bundle install --binstubs`
- `spring --binstub`

この辺りをごちゃごちゃやっていたら、

`Bundler is using a binstub that was created for a different gem.`

とか出たり、`rails server`、`rails console`とかやっても`rails new`のヘルプが出るだけになってしまった…。

で、その時にやった方法をメモ。

# binをごっそり消す

```console
$ cd RAILS_ROOT
$ rm -rf ./bin
```

# --binstubsで別のパスを指定している場合はそのディレクトリも消す

```console
$ rm -rf path_to_binstubs
```

# binディレクトリの生成

```console
$ bundle exec rake rails:update:bin
```

# `bundle install --binstubs`

これで、`spring`の効果はないけど`rails console`が動くようになった。

# `spring binstub --all`

ここまでやって

```console
$ ./bin/rails console
```

とかが2回目以降、爆速に！
redmineのログインでリダイレクトループ

# redmineのログインで無限にリダイレクトループ

最近プライベートサーバにredmineを導入したのだが、
ブラウザのcookieを消すなどしてセッションが一度切れた状態となったあと、

**redmineにアクセスすると無限にリダイレクトループとなりログイン出来なくなってしまった。**

ので暫定処置のメモ。

※設定の「設定」->「認証」->「認証が必要」にチェックが入っている場合に再現。

## 環境
環境は下記のとおり。OSはFedora16をさくらのVPSで運用してます。
redmineはnginxとunicorn連携。

* os: 3.6.11-4.fc16.i686.PAE
* httpサーバ: nginx/1.0.15
* rails: 3.2.16
* db: mysql 5.5.29
* redmine(svnからcheckout):  http://svn.redmine.org/redmine/branches/2.4-stable  (rev.12902)

# 調査・解析

## ググってみた

ググってもあまり情報がなく、本家のトラッカに類似のチケットはあがってた。
http://www.redmine.org/issues/12161

> "settings.login_required" to 0 in the database will fix the problem.

とあるように、dbのデータを直接書きかえて「認証が必要」の設定を一旦OFFにすることで現象を回避してログインできるが、根本解決に至らずに再現しなくなったことになっている様子。

## コードを追う

調べてみたところ、ここで何度もredirectされているよう。
このredirect_toの1行をコメントアウトするとリダイレクトループが止まった。

```rb:app/controller/ApplicationController.rb
def require_login
#途中省略
     redirect_to :controller => "account", :action => "login", :back_url => url

```

このメソッドは

```rb:app/controller/ApplicationController.rb
 def check_if_login_required
     # no check needed if user is already logged in
     return true if User.current.logged?
     require_login if Setting.login_required?
 end
```

から呼ばれるのだが、ログイン画面のコントローラであるらしきAccountControllerの実装は下記のように、check_if_login_requiredをskipすることになっている。

```rb:app/controller/AccountController.rb
skip_before_filter :check_if_login_required, :check_password_change
```

ところが使っているrailsのバージョンが古い？（未確認）のか、
これが機能していない。。
そのため何度もAccountControllerへのリダイレクトが無限に繰り返されている。

# 対処、というか暫定処置

再度ググってみたが、大して情報が見つけられず。

というわけで、超暫定対処だが、
このrequire_loginメソッドでコントローラがAccountControllerだったらリダイレクトしないようにした。

```rb
def require_login
#途中省略
            if params[:controller] != 'account'
              redirect_to :controller => "account", :action => "login", :back_url => url
            end

```

ひとまず不便さは解消。
これでとりあえず様子見かな。

betterな解求ム！
Firefoxさんはぶられてしまったん？

Firefoxでの挙動がおかしい。

投稿一覧を出してみると、こう
![rapture_20140326232153.png](https://qiita-image-store.s3.amazonaws.com/0/3790/6f18a62a-becb-7d6d-bda5-a3f7328ea43c.png)

右パネルがすっからかんで編集もできない。

Chrome系だとこうなのに…
![rapture_20140326232215.png](https://qiita-image-store.s3.amazonaws.com/0/3790/9817c30f-ed4c-142b-ee0a-86ec097cca7b.png)

Qiitaに限らず最近Firefoxでだけ動かないっていうサイトが多い気がする。
解せぬ…

っていうバグレポートはここに書いていいのかな？
cocos2d-x  C++からJNIでJavaを呼ぶ方法

需要があるかわからないけど
JNI呼び出しは色んな方法があるとおもいますが
cocos2d-xらしい？ 呼び方を


#JNIとは
Javaとネイティブ（C言語等）を橋渡しするものです


##お題
SDカードのディレクトリgetExternalStorageDirectory() のパスを返すだけの
簡単なものを作ります


##java
```java:FileUtil.java
package com.murasamelabo.Android.Util;

import android.os.Environment;

public class FileUtil {
	public static String getExternalStorageDirectory(){
		String s="";
		s = Environment.getExternalStorageDirectory().getPath();
		return(s);
	}
}
```

パッケージ名： com.murasamelabo.Android.Util
クラス名： FileUtil
メソッド名  static String getExternalStorageDirectory()


##C++
生JNIでもいいけど、cocosライブラリのccdandroidAndroidJavaEngine.cpp を参考に　cocos流儀で

```cpp:bind.h
#include "bind.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <string>
#include <android/log.h>

namespace JavaBind
{

std::string getExternalStorageDirectory()
{ 
	std::string str;

	cocos2d::CCLog("getExternalStorageDirectory::start");

	cocos2d::JniMethodInfo methodInfo;
	// Javaのメソッドを探す
	cocos2d::JniHelper::getStaticMethodInfo( methodInfo, "com/murasamelabo/Android/Util/FileUtil",  "getExternalStorageDirectory", "()Ljava/lang/String;" );

	// メソッド呼び出し。今回はStatic関数かつ、String型が戻り値なので CallStaticObjectMethod を使う
	jstring jpath  = (jstring)methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);
 
	// お約束の文字列変換
	const char* npath = methodInfo.env->GetStringUTFChars(jpath, NULL);
	str = npath;

	// 解放
	methodInfo.env->ReleaseStringUTFChars(jpath, npath);
	methodInfo.env->DeleteLocalRef(methodInfo.classID);
	cocos2d::CCLog("getExternalStorageDirectory::fin:%s", str.c_str() );
    	
	return str;
}

}

```


##まとめ
生でJNI触った人ならわかると思いますが、かなり簡単になってますね

C++ゲンガーとしては、リソースの解放あたりを unique_ptrで出来ないかとか
もっとラップして template使って 便利にしたいとか欲望が出ますね

まー とりあえず、サンプルで。
TypeScriptとBrowserifyは併用できるのか？

結論として、source mapが正常に作られないようです。

こんな.tsを作って実験しました。

```ts:main.ts
import sub = require('./sub')


console.log('hello world');
sub.hoge();
```

```ts:sub.ts
export function hoge() {
    console.log('good morning')
}
```

----

tscでビルドします。

```bash
tsc main.ts --module commonjs --sourcemap
```

実行結果

```js:main.js
var sub = require('./sub');

console.log('hello world');
sub.hoge();
//# sourceMappingURL=main.js.map
```

```js:sub.js
function hoge() {
    console.log('good morning');
}
exports.hoge = hoge;
//# sourceMappingURL=sub.js.map
```

----

更にbrowserifyでくっつけると…

```bash
browserify main.js -d -o build.js
```

実行結果

```js:build.js
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var sub = require('./sub');

console.log('hello world');
sub.hoge();
//# sourceMappingURL=main.js.map

},{"./sub":2}],2:[function(require,module,exports){
function hoge() {
    console.log('good morning');
}
exports.hoge = hoge;
//# sourceMappingURL=sub.js.map

},{}]},{},[1])
//# sourceMappingURL=data:application/json;---省略---
```

一つのファイルにsource mapが３つもくっついちゃってます。
当然上手く認識されるはずもなく…。

大人しくrequire.js使っとけって話ですね。
Excelで数字のみを抽出する関数、文字のみを抽出する関数

# <i class="fa fa-check-circle-o"></i> よくあるお悩み
>Excelでセルから数字のみを抽出したい、文字のみを抽出したい。
>既存の関数だけでは、数字や文字の量が変わると対応できない。
>VBAはよくわからないから、手っ取り早く関数を教えて！

これ、配列数式と関数を組み合わせだけで、簡単に解決できます。
(数字や文字の長さが一定であれば、LeftやRight関数だけを使えばラクです)

# <i class="fa fa-check-circle-o"></i> いきなり答え

例えばA1(数字+文字)がある場合、A2(数字のみ),A3(文字のみ)のように自動で出力したい時。

```ini
@Excel2010
A1 = "50mg" 
A2 = 50
A3 = "mg" 
```

以下の関数で、数字だけ/文字だけを抽出できます。

```ini
@Excel2010
A1 = 50mg ;元データ
A2 = LOOKUP(10^17,LEFT(A1,COLUMN($1:$1))*1) ;A1から数字のみ"50"を抽出
A3 = SUBSTITUTE(A1,A2,"") ;A1から文字のみ"mg"を抽出
```

# <i class="fa fa-check-circle-o"></i> 解説
巷にはこの関数の解説が少ないので、ここで解説します。


## <i class="fa fa-check-square-o"></i> 数字のみを抽出する関数
```ini
@Excel2010
A2 = LOOKUP(10^17,LEFT(A1,COLUMN($1:$1))*1) ;A1から数字のみ"50"を抽出
```

3つの関数が入り組んでいます。LEFT関数に1を乗じているのもポイントですね。

関数の動きを、ひとつひとつ見ていきましょう。

```ini
COLUMN($1:$1) ;配列数式
;1から256までの連続した数字が入る単純な配列。
;INDEX(配列,n)で、配列n番目のデータが見れます。中身を確認した結果は以下の通り。
;INDEX(COLUMN($1:$1),1)=1
;INDEX(COLUMN($1:$1),2)=2
;INDEX(COLUMN($1:$1),256)=256
```
ここまでは、(1,2,3・・・,256)というただの配列です。
次に元データ(A1セル)にアクセスします。

```ini
LEFT(A1,COLUMN($1:$1)) ;配列数式
;元データが入るA1セルを、配列番号の数分だけ左から切り出した配列。
;INDEX(配列,n)で、中身を確認した結果は以下の通り。
;INDEX(LEFT(A1,COLUMN($1:$1)),1)=5
;INDEX(LEFT(A1,COLUMN($1:$1)),2)=50
;INDEX(LEFT(A1,COLUMN($1:$1)),3)=50m
;INDEX(LEFT(A1,COLUMN($1:$1)),4)=50mg
```
元データから文字データを切り出しました。すべて"文字データ"の扱いなので、これをうまく利用します。

```ini
LEFT(A1,COLUMN($1:$1))*1)  ;配列数式
;配列へ1を掛けることで、"文字データ"を"数字データ"にします。
;INDEX(配列,n)で、配列n番目のデータを見れます。中身はこんな感じでした。
;INDEX(LEFT(A1,COLUMN($1:$1))*1,1)=5
;INDEX(LEFT(A1,COLUMN($1:$1))*1,2)=50
;INDEX(LEFT(A1,COLUMN($1:$1))*1,3)=#VALUE
;INDEX(LEFT(A1,COLUMN($1:$1))*1,4)=#VALUE
```
文字データ配列へ1を乗じたことで、数字データだけ残りました。

```ini
LOOKUP(10^17, 配列)
;配列の最後にあるデータを返します。
;10^17は、超大きい数字の意味。
;今回、最後の配列は[2]です。50が入っていましたね。
;10^17,LEFT(A1,COLUMN($1:$1))*1=50
```
一番桁数が大きい配列を取り出せました。これで数字のみの抽出は完了。


## <i class="fa fa-check-square-o"></i> 文字のみを抽出する関数
```ini
@Excel2010
A3 = SUBSTITUTE(A1,A2,"") ;A1から文字のみ"mg"を抽出
```

こちらは簡単です。

```ini
SUBSTITUTE(A1,A2,"")
;元データから数字を除きます。
```
"50mg"から50を除いて、"mg"が残りました。これで文字のみの抽出は完了。

# <i class="fa fa-check-circle-o"></i> 応用例
関数で単位を抽出したい場合に便利ですね。使い回しも利きます。単位がわかれば、CONVERT関数で単位合わせもできますよ。

例1: 10Mドル vs 100百万円、100mg vsと0.1g、どちらが大きい？などを自動処理
例2: M$10, €100を比較(単位の文字が左側にあるので、LEFT関数ではなくRIGHT関数を使えばOK)

# <i class="fa fa-check-circle-o"></i> 参考
こちらも参考にしてください。

一番下のデータを取得する LOOKUP関数
http://www.relief.jp/itnote/archives/003450.php
>誰がはじめに見つけたのかわかりませんが、Excelを使いこんでいる方の間では結構有名な、「裏ワザ」といっていい方法です。


おわり
sbt-extrasでsbtを複数バージョン運用する

プロジェクトによってビルドしているsbtのバージョンが違ったりすることもあるので、sbtを複数バージョン同居させたいことないでしょうか？
sbt-extrasを使うと簡単にできます。


[paulp/sbt-extras](https://github.com/paulp/sbt-extras)

# 前提条件
* JDKがインストールされていればOK。Scalaが実行できなくても問題無し。

# セットアップ
## スクリプトのダウンロード
任意の場所にsbt-extrasのsbtスクリプトをダウンロードし、実行権限を付与します。ここでは、本家の説明通り~/bin/sbtに保存します。

```bash
$ curl -s https://raw.github.com/paulp/sbt-extras/master/sbt > ~/bin/sbt && chmod 0755 ~/bin/sbt
```

## 環境変数にPATHにスクリプトのディレクトリを設定
このスクリプトを実行できるように、~/binを環境変数PATHに設定しておきます。.bash_profile等に記述します。

```bash|.bash_profile
export PATH=$PATH:~/bin
```

## 指定のバージョンのsbtをインストールする
このスクリプトを実行してsbt本体をインストールします。
今回はScala2.10系でsbt0.13.0をインストールしてみることにします。以下のコマンドを実行すると、指定のバージョンのsbt-launcher.jarがダウンロードされます。

```bash
$ sbt -v -210 -sbt-version 0.13.0 -sbt-create
No extra sbt options have been defined
Detected sbt version 0.13.0
(省略)
```

-vはScalaのバージョン、-sbt-versionオプションでsbtのバージョンを指定できます。公式に記述されている-vオプションとバージョンの対応は以下のようになってます。

|-v|Scalaのバージョン|
|:--|--:|
|-28|2.8.2|
|-29|2.9.3|
|-210|2.10.3 (or latest 2.10.x release or RC)|
|-211|2.11.0-M4 (or latest milestone)|

-sbt-versionオプションは存在するsbtのバージョンをそのまま指定すれば良いです。指定しない場合、現在は0.13.1がインストールされるようですが、デフォルトバージョンはおそらくsbtのリリース状況によって変わってくるのでしょう。

## ダウンロードしたsbtを実行する

sbt-extrasによって~/.sbt/launchers/0.13.0/sbt-launch.jarにsbt本体のJarがダウンロードされているはずです。これをjavaコマンドを使って実行します。

-jarでjarのパスを指定した後は、aboutのようなsbtの固有のコマンドを指定します。

```bash
$ java -jar ~/.sbt/launchers/0.13.0/sbt-launch.jar about
```

# まとめ
sbt-extrasを素の状態で使ってみましたが、スクリプト書けばもっと楽な運用ができそうですね。nodebrew的な。
ソースコードの文字コードチェックスクリプト

# はじめに
昔、ソースコードの文字コードチェックの必要が出てきたので、pythonで作りJenkisで定期的にチェックを走らせるようにしたのでそのメモ

# なぜソースコードの文字コードチェックが必要？

 * ゲームを開発してると、海外対応とか出てきて、s-Jisのソースに日本語が書かれてたりするとなにか問題になりがち。

 * ソースコードをウェブで見るとコメントが化ける！(出先でコード確認し辛い)
 * せっかくDoxygen形式でコメントをかいたのに全部化ける。

 * 意味不明なコンパイルエラーとか起こったり起こらなかったり。

# 実装

```mojicodecheck.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
	@brief  文字コードチェック
	@author DM
	@date   2012/10/13
"""

import os, os.path, sys, re, time
import glob
import codecs
import chardet

# 無視するフォルダ
ignorelist  = ["tgs","tools_src","shader","ext"]

# チェックするファイルの拡張子
extention  = [".c",".cpp",".h",".inc",".inl",".hpp"]

# 	main
def main():
	sys.stdout = codecs.getwriter("shift_jis")(sys.stdout) # 出力
	sys.stdin = codecs.getreader("shift_jis")(sys.stdin) # 入力

	# 使い方表示
	if len(sys.argv) < 2 or len(sys.argv) > 4:
		__usage()
		sys.exit(0)
		
	start_time = time.clock()

	# プロジェクトのディレクトリ
	path = os.path.normpath(sys.argv[1])	# モジュールファイルのパス取得
	print(path)
	
	
	ret = True

	
	for (root, dirs, files) in os.walk(path):
		for file in files:
			file_path = os.path.join(root, file)
			
			base, ext = os.path.splitext(file_path)
			
			ignore = False
			for d in ignorelist:
				if file_path.find(d) > 0:
					ignore = True
					break;
			
			if ignore == True:
				continue
			
			if ext in extention:
				try:
					f = open(file_path, 'r')
					data = f.read()
					p = chardet.detect(data)
					if p['encoding'] == 'SHIFT_JIS':
						print('error',p['encoding'],file_path)
						ret = False
				except IOError:
					print(file_path, 'cannot be opened.')
				finally:
					f.close()

	end_time = time.clock()
	print("complete![time: ",(end_time - start_time),"sec]")
	
	if ret == False:
		CODE='S001'
		MESSAGE='shift-jis still exists!!'
		EXPECTED='S999-error'
		ACTUAL='sample ' + CODE +' '+ MESSAGE
		sys.exit(EXPECTED+' '+ACTUAL)
	
# __main__
if __name__ == '__main__':
	#psyco.full()
	main()

```

 * あとはJenkinsで定期的に

```
python mojicodecheck.py ${BUILD_DIR}
```

を実行すれば、
```
[MojiCodeCheck] $ /bin/sh -xe /tmp/hudson2121374754708119058.sh
+ python /var/lib/jenkins/workspace/soilproject/common/tools/mojicodecheck.py /var/lib/jenkins/workspace/soilproject
/var/lib/jenkins/workspace/soilproject
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/TGLSystemTypes.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/TGLEffectEmit.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgZanplu.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgSpiral.cpp')
('complete![time: ', 15.200000000000001, 'sec]')
S999-error sample S001 shift-jis still exists!!
Build step 'Execute shell' marked build as failure
Notifying upstream projects of job completion
Finished: FAILURE
```

こんな感じでs-Jisなソースがログに出力されます。
※現在アスタブリードでは、 **s-Jisなファイルが78ファイル存在します。** 言語対応に関係ないソースばっかなので放置してます( ´∀｀)

おしまい。
Androidの標準ブラウザで、contentプロパティを指定した要素はtransformを含んだkeyframesアニメーションが再生されない

# 発生条件

- Android 標準ブラウザ （4.0.4と2.2.1で発生確認）
- keyframesアニメーションさせる要素に contentプロパティを指定
- keyframes内でtransformプロパティを指定

以下にサンプルコードを示す。
四角いブロックが大きくなるのを繰り返すだけの簡単なアニメーション。
が、動作しない。

```css
div {
  position:absolute;
  width: 100px;
  height: 100px;
  content: "";
  -webkit-animation: anime 1s linear 0s infinite normal;
}

@-webkit-keyframes anime {
  0% {
    -webkit-transform: scale(1);
  }
  100% {
    -webkit-transform: scale(2);
  }
}
```


## 詳細
``transform: scale();``だけでなく、``transform: translate();``や``transform: rotate();``も不可。
一方で、transform以外であれば問題ないようだ。
（正確には、transformの場合にはアニメーションしないことだけ確認した）

また、keyframes内ではなく、要素自体にtansformを指定することは問題ない。
以下のサンプルコードは動作する。

```css
div {
  position:absolute;
  width: 100px;
  height: 100px;
  content: "";
  -webkit-transform: translate(0px, -10px);
  -webkit-animation: anime 1s linear 0s infinite normal;
}
@-webkit-keyframes anime {
  0% {
    top: 10px;
    background-color: #f00;
  }
  100% {
    top: 20px;
    background-color: #00f;
  }
}
```


# 対策

``content``プロパティをはずせばいい。

・・・ということは、疑似要素でのアニメーションは回避すべき。




### なんで``content``なんて付けているのか
当初は、アニメーションさせる要素を``::before``疑似要素にしていたため。
Androidの標準ブラウザでのみ動いてくれないので、通常のブロック要素に切り替えてみたのだが、その際に``content``プロパティを削除するのを忘れていた。そのおかげで原因がつかめないまま、かなりの時間を無駄にした。

レアケースだと思うが、同じ陥穽に落ちた同志の助けとなるように、ネットの荒野に投げておく。
wp-cli で MAMP の mysql を使用する。


本家にもリンクが貼ってあるが、こちらのを参考に
http://stackoverflow.com/questions/4145667/how-to-override-the-path-of-php-to-use-the-mamp-path/10653443#10653443

下記を .bash_profile に記述

```
export MAMP_PHP=/Applications/MAMP/bin/php/php5.x.x/bin

export PATH="$MAMP_PHP:$PATH"
```


```
export WP_CLI_PHP=/Applications/MAMP/bin/php/php5.x.x/bin/php
```


また、このエラーに対してはシンボリックリンクを貼ることで解決。

```
mysql Can't connect to local MySQL server through socket '/Applications/MAMP/tmp/mysql/mysql.sock'
```

```
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
```

http://ifmeister.com/how-to-solve-wp-cli-for-mamp-errors/
Werckerで RSpec+Seleniumを使ってCI


##Wercker良いですよね。
__無制限に、無料でプライベートリポジトリをビルド＋デプロイ__って、β版が終わった後の扱いが不安になるほどです。

*(Werckerは、自動でテスト＋デプロイができるウェブサービスです)*
http://wercker.com/

さて、テスト駆動も佳境になってくると、JSが必要となるテストを書かざるをえないと思います。ヘッドレスなPhantomJSなども良いですが、所感では、Seleniumの安心感はすごくあります。
ブラウザ互換でのテストも容易ですし。

なによりCIにおいては、デプロイ前のビルドを自動化することで、多少の時間は許容できるのがメリットではないでしょうか。そこで、
ここではWerckerにて、RSpec/Capybara/Selenium環境下でのテストを紹介します。

Wercker自体の使い方は下に詳しいので、ここでは直接 Seleniumが関係する部分のみ記述します。

*Wercker自体の使い方*
http://blog.mah-lab.com/2014/01/08/rails-wercker-heroku-deploy/


###WerckerでSeleniumを使う

```wercker.yml
build:
  steps:
      - script:
          name: Enable virtual display(thanks to zephiransas blog!
          code: |
            export DISPLAY=:99.0
            start-stop-daemon --start --quiet --pidfile /tmp/xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1024x768x24 -ac +extension GLX +render -noreset
            sleep 3

      - desmondmorris/selenium-install@0.0.2

      - script:
          code: |
            bundle exec rspec
```

###部分解説その1

```
> export DISPLAY=:99.0
> start-stop-daemon --start --quiet --pidfile /tmp/xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1024x768x24 -ac +extension GLX +render -noreset
> sleep 3
```

上記パートは、下記 Wercker公式ブログでも紹介されています。
http://blog.wercker.com/2013/11/28/django-selenium.html

Werckerがビルド時に立ち上げる Linux環境化で、Seleniumが使うブラウザを立ち上げるためには、ヴァーチャルスクリーンを立ち上げておかなければいけません。上記がそのスクリプトです。

-

###部分解説その2
```
- desmondmorris/selenium-install@0.0.2
```
上記は、Werckerの醍醐味でもある 第三者が作成、公開したスクリプト/仮想環境を使用するという宣言です。
https://app.wercker.com/#explore/steps/search/
にて、現在公開されているスクリプト（Wercker上では __STEP__と呼ぶようです）を一覧できます。

実際に上記のSTEPを見に行くと、seleniumのスタンドアロンサーバをダウンロードし、
キャッシュディレクトリ上で 起動していることが分かります。
https://github.com/desmondmorris/wercker-step-selenium-install/blob/master/run.sh

##注意
自分たちのケースでは、テストがたまに失敗したり、かと思ったらさっきまで通っていたテストが Werckerのビルドでのみ失敗したりすることが起きました。これは、Seleniumが外部(s3)に置かれたファイルを呼びにいき、その応答時間次第で結果が変わる、という状態だったからです。
現在は `sleep 3` など読まれるまで十分な時間を待つという応急処置で対処していますが、実際には __VCR gem__ などを使って、外部との通信は 固定化した方がよいかと思います。

https://github.com/vcr/vcr‎
http://morizyun.github.io/blog/webmock-vcr-gem-rails/


それでは、ハッピーTDDライフを！
jqueryで同じようなイベント処理のまとめ方

* 処理がほぼ同じだけど微妙に違う、みたいなパターンをどう書くか。
* if文書いたら負けかなと思っている。

# すべて個別に書く

```html
<a href="/aaa" id="eventA">aaa</a>
<a href="/bbb" id="eventB">bbb</a>
```

```js
$('#eventA').on('click', function(){
  console.log('Aが押された');
});

$('#eventB').on('click', function(){
  console.log('Bが押された');
});

```

## メリット

* わかりやすい

## デメリット

* 冗長

## 使いどころ

* イベント発火点が固定（増えない）の時
* 同じように見えるけど、別の処理の時

## 備考

* これはまとめたと言わない


# 要素自身に（data）属性を持たせる

```html
<a href="/aaa" class="event" data-hoge="A">aaa</a>
<a href="/bbb" class="event" data-hoge="B">bbb</a>
```

```js
$('.event').on('click', function(){
  console.log($(this).data('hoge') + 'が押された');
});

```

## メリット

* メソッドが1つになった
* 仮に`/ccc`が増えてもjs側の修正が不要

## デメリット

* HTMLへの記述が多くなる
* その都度要素への参照が必要になる

## 使いどころ

* イベント発火点が固定ではない（複数ある）時
* イベント発火点に関連した何かをしたいとき

## 備考

* `<a href="/aaa" class="event" hoge="A">aaa</a>`
として、`$(this).attr('hoge')`でも取れますが、突然謎の属性が現れると混乱するので、data-xxxにしておくのが良いと思います。

* また、data()メソッドの利点として、`data-hoge='{"a":"123"}'`のようにJSONを指定すれば、オブジェクトで取得できるので、複数の値を渡したくなってもそのままで使えます。

# イベントセット時に値を持たせる

* on()の引数でfunctionの前にオブジェクトを渡すと、`event.data`で後から参照できるようになります。
* 文字列で渡してしまうとセレクタ扱いになるので、文字列以外で渡してください。（セレクタも渡せばdataは文字列で渡せます）

```html
<a href="/aaa" class="eventA">aaa</a>
<a href="/bbb" class="eventB">bbb</a>
```

```js
var handleClick = function(event){
  console.log(event.data.name + 'が押された');
}
$('.eventA').on('click', {name: 'A'}, handleClick );
$('.eventB').on('click', {name: 'B'}, handleClick );

```

## メリット

* jsだけで完結する（HTMLに不要なデータを持たせたなくても良い）

## デメリット

* jsへの記述が多くなる


## 使いどころ

* イベントセットする時点で、渡すべき値をjsが知っている時
または、jsだけが知っていれば良い時

* HTMLを自由にできない（変更できない）時

# まとめ

* 適材適所だと思いますが、HTMLを変更（追加）する修正や、要素に連動した処理をすることが多いと思うので、`data-xxx`のパターンを良く使います。
* HTMLを変更できず、data属性を付けることができない時等に、`event.data`が役に立つので、覚えておいて損はないかと思います。
新人育成に便利？Telnet練習用サーバを書いてみた

新人にTelnetでサーバやらNW機器の操作を経験させたいが、VMでLinuxを動かすだけならともかく、ロードバランサなどを用意するのは大変である。そんなわけでPythonのsocketserverを使ってTelnet接続をシミュレートする練習用サーバを書いてみた。

適当なコマンドを入力したら、それに応じた出力をするようif文で書いておき、TeraTermなどのターミナルで接続する。

```python
if command == "exit":
  sys.exit()

elif command == "ls":
  self.write("bin     etc     proc    usr     dev     home\r\n")
```

ちゃんとTelnetプロトコルを喋るので、現場で使ってるターミナルで使えるし、マクロなどの実験台としてもいい。

```python:server.py
import sys
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

    prompt = "$ "

    def command(self,command):
        print(command)
        if command == "exit":
            sys.exit()

        elif command == "ls":
            self.write("bin     etc     proc    usr     dev     home\r\n")

        elif command == "ls -l":
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 bin\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 etc\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 proc\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 usr\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 dev\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 home\r\n")

    def write(self,str):
        self.request.sendall(bytes(str,"UTF-8"))

    def handle(self):

        buff = []

        while True:
            self.data = self.request.recv(1024)

            if self.data == bytes("\r\x00","UTF-8"): # 改行
                self.write("\r\n")
                self.command("".join(buff))
                del buff[:]
                self.write(self.prompt)
            elif self.data == bytes("\x03","UTF-8"): # Ctrl+C
                sys.exit()
            else:
                self.request.sendall(self.data)
                try:
                    buff.append(self.data.decode("UTF-8"))
                except UnicodeDecodeError:
                    print(self.data)

if __name__ == "__main__":

    HOST, PORT = "localhost", 23

    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()
```

ちなみに本来であれば、Telnet接続する際のコマンドなんかも解釈させたいところだが、今のところオウム返しさせている。独自に拡張させたい場合は、下記のサイトが参考になる。

http://www5e.biglobe.ne.jp/aji/3min/55.html

コマンドヒストリーとかTab補完も無理。うちの職場はZshなんでぇ～という方にも、この練習台は向かない。でも、SSH版は密かに作ってみたかったり。
クライアント側でSSHのタイムアウトを防止する（クライアントがLinuxの場合）

Puttyではなく、Linux標準のターミナルから別のサーバにSSH接続する際、タイムアウトを制御するために、`~/.ssh/config`を用意し、以下の一行を追加する。

```:~/.ssh/config
ServerAliveInterval 60
```

これで、自動的に60秒毎にサーバが生きているかどうか自動的に問い合わせされるようになり、タイムアウトしなくなる。


仕事で使うPCをWindowsからLinux(Linux Mint)に置き換えた。
GUIでSSHといえばPuttyでしょ！ということで入れてみたけど非常に使いづらい。
デフォルトのフォントがすごく汚いし、なによりコピペができない。これは致命的！
ということでLinux標準のターミナルに衣替え。
プロファイル毎に管理するサーバを登録しておけばもうPutty要らず。
例外の継承関係を可視化するショートコード

```php:ソースコード
<?php
$lines = array();
foreach (preg_grep('/Exception\z/i', get_declared_classes()) as $class) {
    $classes = array();
    do {
        $classes[] = $class;
    } while ($class = get_parent_class($class));
    $lines[] = implode(' -> ', array_reverse($classes));
}
sort($lines);
echo implode(PHP_EOL, $lines);
```

```scala:実行結果の例
Exception
Exception -> DOMException
Exception -> ErrorException
Exception -> LogicException
Exception -> LogicException -> BadFunctionCallException
Exception -> LogicException -> BadFunctionCallException -> BadMethodCallException
Exception -> LogicException -> DomainException
Exception -> LogicException -> InvalidArgumentException
Exception -> LogicException -> LengthException
Exception -> LogicException -> OutOfRangeException
Exception -> PharException
Exception -> ReflectionException
Exception -> RuntimeException
Exception -> RuntimeException -> OutOfBoundsException
Exception -> RuntimeException -> OverflowException
Exception -> RuntimeException -> PDOException
Exception -> RuntimeException -> RangeException
Exception -> RuntimeException -> UnderflowException
Exception -> RuntimeException -> UnexpectedValueException
Exception -> RuntimeException -> mysqli_sql_exception
```

#### PHP言語自体の開発者に言いたい文句

- なんで **IOException** って存在しないの
- **IOException** が無いなら **Exception** とすべきところをなんで [**RuntimeException** を投げる](http://www.php.net/manual/ja/splfileobject.construct.php#refsect1-splfileobject.construct-errors) の
- 何で **mysqli_sql_exception** だけスネークケースなの
- 何で固有例外クラスのうち **PDOException** と **mysqli_sql_exception** だけが **RuntimeException** を継承してるの

```scala:個人的にこうあってほしい
Exception
Exception -> DatabaseException
Exception -> DatabaseException -> MysqliExeption
Exception -> DatabaseException -> PDOException
Exception -> DOMException
Exception -> ErrorException
Exception -> IOException
Exception -> LogicException
Exception -> LogicException -> BadFunctionCallException
Exception -> LogicException -> BadFunctionCallException -> BadMethodCallException
Exception -> LogicException -> DomainException
Exception -> LogicException -> InvalidArgumentException
Exception -> LogicException -> LengthException
Exception -> LogicException -> OutOfRangeException
Exception -> PharException
Exception -> ReflectionException
Exception -> RuntimeException
Exception -> RuntimeException -> OutOfBoundsException
Exception -> RuntimeException -> OverflowException
Exception -> RuntimeException -> RangeException
Exception -> RuntimeException -> UnderflowException
Exception -> RuntimeException -> UnexpectedValueException
```
XOOPS: ユーザを新規追加するプロシージャ


試してないが、たぶんこれで合ってるはず……

```php
/**
 * @param string $uname
 * @param string $email
 * @param string $password
 * @param float $timezoneOffset
 * @param bool $userMailOk
 * @throws RuntimeException
 */
function addUser($uname, $email, $password, $timezoneOffset, $userMailOk)
{
	/** @var XoopsMemberHandler $memberHandler */
	$memberHandler = xoops_gethandler('member');
	/** @var XoopsUser $user */
	$user = $memberHandler->createUser();
	$user->set('uname', $uname);
	$user->set('email', $email);
	$user->set('user_viewemail', 0);
	$user->set('user_avatar', 'blank.gif');
	$user->set('timezone_offset', $timezoneOffset);
	$user->set('pass', md5($password));
	$user->set('user_mailok', $userMailOk);
	$user->set('actkey', substr(md5(uniqid(mt_rand(), 1)), 0, 8));
	$user->set('user_regdate', time());
	$user->set('level', 1);

	if ($memberHandler->insertUser($user) === false) {
		throw new RuntimeException("Failed to add user");
	}

	if ($memberHandler->addUserToGroup(XOOPS_GROUP_USERS, $user->get('uid')) === false) {
		throw new RuntimeException("Failed to add user to group");
	}
}

```
トラッキングされていない大量のゴミファイルをまとめて削除する - clean


めったに使わないわりに覚えてないと超面倒なのでメモ。
例えばこういう状態のときに、gomi連中を全部まとめて削除するgitコマンド。

```
$ git status
## branch
?? gomi.file
?? gomidir/gomi1.file
?? gomidir/gomi2.file
?? gomidir/gomi3.file
?? gomikuzu1.file
?? gomikuzu2.file
# 以下ずらーっといらないファイルが延々と
```

正解はコレ。

```
$ git clean -n #dry-runで確認
$ git clean -f #削除実行
```

ディレクトリも再起的に削除したい場合は更に```-d```オプションを追加。

```
$ git clean -dn #dry-runで確認
$ git clean -df #削除実行
```

参考：```git help clean```
android update コマンドのエラー

```bash
$ android update project -p .
Error: The project either has no target set or the target is invalid.
Please provide a --target to the 'android update' command.
```

みたいなエラーが出る場合。

暗に指定されている SDK が入っていない可能性が高いか、そもそもターゲットを指定が必須のパターンです。

まず、`android` コマンドで SDK Manager を起動し、API 17(べつに17じゃなくても良い)の SDK をインストールして、再度 `update project` コマンドを実行してみてください。

それでも上記のエラーになる場合は、`--target android 17` のオプションを `update` コマンドの引数に与えてみてください。
Bootstrap3 + headroom.js が動かないときの対処法


スクロールに合わせてヘッダーをいい具合に表示・非表示させる事ができるheadroom.jsが
Bootstrap3だと動かなかったので、対処法をメモしておきます。

headroom.jsについて

[JS]ヘッダをスクロールに合わせて表示・非表示する1ランク便利なスクリプト -Headroom.js
<http://coliss.com/articles/build-websites/operation/javascript/js-headroom.html>

jQuery Plugin – Headroom.js の使い方
http://miyakawa.me/?p=4777




これをBootstrap3のnavbarで構成したヘッダーに使って見ましたが動かなかったので、
調べたところStackOverflowにそのものずばりの回答がありました。

How do you use headroom.js with Bootstrap 3 navbar?
<http://stackoverflow.com/questions/20648451/how-do-you-use-headroom-js-with-bootstrap-3-navbar>


bootstrap3で動かない場合は、下記のCSSを追加します。

```HTML
<style type="text/css">
.headroom {position: fixed;top: 0;left: 0;right: 0;transition: all .2s ease-in-out;}
.headroom--unpinned {top: -100px;}
.headroom--pinned {top: 0;}
</style>
```

無事、解決しました。。
Imagick 拡張を使って gif アニメーションを作る

```php:gif.php
<?php

// gifアニメーションに使う画像リスト
$img_path_list = array(
	"1.png",
	"2.png",
	"3.png",
);

// gifアニメーション作成
$im = new \Imagick;
$im->setformat( "gif" );
foreach( $img_path_list as $path ) {
	$im_tmp = new \Imagick( $path );
	$im_tmp->setformat( "gif" );
	$im_tmp->setImageDelay( 50 ); // 画像切り替えmsec
	$im_tmp->setImageIterations( 0 ); // ループ回数、0で無限ループ
	$im->addImage( $im_tmp );
	$im_tmp->destroy();
}
$im->optimizeimagelayers(); // 一応最適化（効くのこれ？）
$out = $im->getImagesBlob();
$im->destroy();

// 保存
file_put_contents( "out.gif", $out );

```
ZabbixエージェントのWindowsへのセットアップメモ

#環境
Zabbix Server:CentOS
Zabbix Agent :Windows Server 2008 R2 Standard
Zabbixは2.2.1

#メモ
1.下記URLからエージェントをダウンロード
http://www.zabbix.com/jp/download.php

2.対象のWindowsサーバに配置し、解凍すると「bin」と「conf」フォルダから「bin」を選ぶ

3.「win32」と「win64」のうち「win64」を選択

4.「zabbix_agentd.exe」「zabbix_get.exe」「zabbix_sender.exe」を\C直下「zabbix_agent」ディレクトリを作成して配置 ※ディレクトリの場所と名前は任意

5.2の「conf」の中の「zabbix_agentd.win.conf」を「zabbix_agentd.conf」として4の「zabbix_agent」ディレクトリへ保存

6.「zabbix_agentd.conf」を編集し保存する

 LogFile=c:\zabbix_agentd.log
 ↓↓↓
 LogFile=c:\zabbix_agent\zabbix_agentd.log

 Server=127.0.0.1
 ↓↓↓
 Server=＜ZabbixサーバのIP＞

 ServerActive=127.0.0.1
 ↓↓↓
 ServerActive=＜ZabbixサーバのIP＞:10051

 Hostname=Windows host
 ↓↓↓
 ###Hostname=Windows host

 # HostnameItem=system.hostname
 ↓↓↓
 HostnameItem=system.hostname

 # HostMetadata=
 ↓↓↓
 HostMetadata=Windows

7.Zabbixサーバで「設定 -> アクション -> 自動登録」 でエージェントの自動登録を作成しておく

アクションの実行条件：ホストメタデータに含まれる Windows
アクションの実行内容：ホストを追加
                   ホストグループに追加：Windows
                   テンプレートとリンク：Template OS Windows

8.コマンドプロンプトで下記を実施し、インストールする ※helpで大体わかる

C:\>cd zabbix_agent

C:\zabbix_agent>zabbix_agentd.exe -h
Zabbix Agent Win64 (service) v2.2.1 (revision 40801) (09 December 2013)

usage: zabbix_agentd.exe [-Vhp] [-idsx] [-m] [-c <config-file>] [-t <item key>]

Options:

  -c --config <config-file>  Absolute path to the configuration file
  -p --print                 Print known items and exit
  -t --test <item key>       Test specified item and exit
  -h --help                  Give this help
  -V --version               Display version number

Functions:

  -i --install          Install Zabbix agent as service
  -d --uninstall        Uninstall Zabbix agent from service
  -s --start            Start Zabbix agent service
  -x --stop             Stop Zabbix agent service
  -m --multiple-agents  Service name will include hostname



C:\zabbix_agent>zabbix_agentd.exe -i -c zabbix_agentd.conf
zabbix_agentd.exe [29588]: service [Zabbix Agent] installed successfully
zabbix_agentd.exe [29588]: event source [Zabbix Agent] installed successfully


9.zabbix_agentのスタート
C:\zabbix_agent>zabbix_agentd.exe -s -c zabbix_agentd.conf
zabbix_agentd.exe [29352]: service [Zabbix Agent] started successfully


10.zabbixサーバ側で追加されていることを確認

#今後
アイテム等を今後検討していきたい。
Java インナークラスを外部でインスタンス化する


例えばこういうケース

```java
public Hoge {
	public Piyo {
    }
}
```

で、PiyoはHogeのインスタンスに依存しているので外部からは

```java
new Piyo();
```

は実行できない。
ので、先にHogeをインスタンス化してからそいつに付随するインスタンスとしてNewする。書き方はこう

```java
Hoge a = new Hoge();
Piyo b = a.new Piyo();
```

a.newとか初めて見たのでびっくり。

因みにインナークラスを使うと特定のクラスにだけパブリックとかが実現できるので便利。

追記
ちなみに、classをインナークラスをstaticで宣言すればHoge.classに付随するPiyoが普通のnew文で作成できる。
How to line up method parameters vertically with php-mode

php-mode をデフォルトで使っていると、こんな風にインデントします。

```php
$stmt =	$dbh->prepare("insert into users(name, email, password) values " .
"(:name, :email, :password)");
```

僕はこーゆー風にしたいのですね。

```php
$stmt = $dbh->prepare("insert into users(name, email, password) values " .
                      "(:name, :email, :password)");
```

まあ、どうでもいいコトなのかも知れませんが、ちょっとむかついたので調べました。

```el
(add-hook
 'php-mode-hook
 '(lambda ()
    (c-set-offset
     'arglist-cont-nonempty '(c-lineup-arglist-operators
                              c-lineup-arglist
                              c-lineup-cascaded-calls))))
```

これでイケました。
`c-lineup-arglist-operators`, `c-lineup-arglist`, `c-lineup-cascaded-calls` を順番に評価し、評価できた (nil にならなかった) 位置に移動します。デフォルトの評価は `c-lineup-cascaded-calls` だけでした。

デフォルトの言いたいことは、こーゆー風にしろというコトなのかもしれませんが…。

```php
$stmt = $dbh->prepare(
    "insert into users(name, email, password) values " .
    "(:name, :email, :password)"
);
```

以下を参考にしました。
http://d.hatena.ne.jp/gct/20101126/1290755504
http://www.geocities.co.jp/SiliconValley-Bay/9285/EMACS-JA/emacs_257.html
http://www.gnu.org/software/emacs/manual/html_node/ccmode/Operator-Line_002dUp.html
http://www.gnu.org/software/emacs/manual/html_node/ccmode/List-Line_002dUp.html
Mac の Chromeでスーパーリロードがうまくできない件について


Command+R でリロードしても古いコンテンツが出てきてしまうので、キャッシュを強制的に無視して読み込む方法を調べたのでメモ。

devtools の設定にDisable cache (while DevTools is open)があるのでこれを有効にしてDevToolsを起動しながら開発するしかなさそう。

Shift+F5とかCommand+Shift+R とかいろいろ試したもののうまくいかず。
cssについて

# bootstrap

グリッドデザインシステムなので、基本は、

* row
* col-lg-幅

[基礎部分の解説](http://www.xmisao.com/2013/10/20/bootstrap-container-row-col-tips.html)
[bootstrap offcial site](http://getbootstrap.com/)
[bootsttap3超速レビュー](http://html5experts.jp/shumpei-shiraishi/1538/)
[初心者のための簡単なbootstrap入門](http://designup.jp/bootstrap3-beginner-91/)


# 参考サイト
// すごくよくまとまっている css2.0
http://hp.vector.co.jp/authors/VA022006/css/

// css3.0 ブラウザ別対応表
http://ebisu.com/note/css3/

// css3.0 リファレンス
http://memopad.bitter.jp/w3c/css3/css3_reference.html

// css, html5 機能のブラウザ対応表
http://fmbip.com/litmus/

// css チートシート
http://www.textdrop.net/wp-content/uploads/css-cheat-sheet-v2-ja.pdf

// css3.0 リファレンス詳細
http://www.textdrop.net/wp-content/uploads/css-cheat-sheet-v2-ja.pdf

# 要素

[わかりやすいサイト](http://taneppa.net/display-inline-block/)

ブロックレベル要素内に、インライン要素は含めることはできる。
インライン要素内に、ブロックレベル要素は含めることはできない。

```html
○ <div><a href=xxx >sample</a></div>
× <span><h1>sample</h1></span>
```
基本的には、bodyタグ内に直接インライン要素を設定することはできない。

```html
× <img src=xxx alt=xxx>
○ <div><img src-xxx alt=xxx></div>
```

## ブロックレベル要素

ブラウザでの表示に際してもひとつの「ブロック（通常改行を伴う表示上のまとまり）」として扱われます。

* div
* h1
* ul
* table

etc...

## インライン要素

ブロックレベル要素の内容として用いられるもので、文書の構造を構成するというより、ブロックレベル要素内の特定の部分になんらかの役割や機能を持たせる要素です。

* span
* img
* a

etc...


# 位置(postion)

文章フロー = 記載通りに表示される流れ

## 相対位置配置(relative)

文章フローから相対的に指定分を適用する。

## 絶対位置配置(absolute)

文章フローから取り除かれ、画面左上から絶対的に指定する。

## フローティング(float)

* left
* right




# 優先度
http://www.stylish-style.com/csstec/base/order.html

|要素|ポイント|
|:--:|:--:|
| *（全称セレクタ）      | 0ポイント|
| p,h1　などのタグ      |    1ポイント|
| .sample（classの場合）|10ポイント|
| #sample（IDの場合）   | 100ポイント|


複数使用した場合は、ポイントを足していき、
足したポイントが一番大きい設定が優先される。

# 要素の指定方法

## 要素などの複数条件指定

空白なしで、つなげる

```css
div#new{
}
```

## 子孫要素指定

空白でつなぐ

```css

div #child{
}
```

## 要素の状態を表す

:(コロン)でつなぐ

``` css
a:hover{
}
```

## グループ化

,(カンマ)でつなぐ

```css
div #first, div #second{
}
```

# スコーピング

## スコープの制限範囲 sample

* モジュール毎
* ページ毎

```css
#new{
}

#new h1{
}

#old{
}

#old h1{
}
```

# cssボックスモデル

![スクリーンショット 2014-05-16 8.20.31.png](https://qiita-image-store.s3.amazonaws.com/0/34329/6a84cb81-ca62-4fe8-1ab6-736ff06d0831.png)

## マージン(margin)

マージンは、要素とその周辺の他の要素との間の余白領域です。それぞれの端からどれくらい
の空間を空けるかを指定します。要素に背景がある場合、このマージンは空で透明になります。

## ボーダー(border)

ボーダーは、境界となる線(または他のスタイルで使われる装飾)です。ボーダーの太さ、スタイル、色を指定できます。

## パディング(padding)

パディングは、要素の境界の内側にある余白領域です。それぞれの端の内側の内容との間にど
のくらいの空間を空けるかを指定します。

## コンテンツエリア(contents area)

コンテンツエリアは、要素の最も内側の領域で、要素の内容が含まれます。他のプロパティとの間の幅や高さを設定できます。

# tips

## 動的にサイズを変更させる

サイズだけの変更などは、idで共通部分のcssを記載し、
サイズなどの変更分のcssは、別のクラスで作成しておき、classを動的に変更させて活用する。
CocoaPodsでアプリ側ターゲットのbuild_settingsを変更する方法


Xcodeで、End-to-End testsやIntegration testsを実行するときに、テスト時だけ行う処理とか逆に行わない処理とかを書きたいと思いますが、
メソッド差し替え等の手段を使えない場合、下記のようにマクロを定義しておかないと余計な処理が走って面倒なことになります。

```objectivec
#ifndef APP_TESTING
    // テスト以外のときだけ実行する処理
    // 広告SDKとかが勝手にブラウザへ飛ばす処理とか
#endif
```

CocoaPodsを使っていると、アプリ側のbuild_settingsの`Preprocessor Macros`が書き換わるので
同時にアプリで使用するマクロも、`pod`コマンドを実行したときに一緒に定義する方法ないかなと思って、
試した所うまく行ったのでメモ

`post_install`のブロックでworkspaceかなんかを参照する変数かなんかあるのかとおもっていたのですが、
どうやら、ないようなので`xcodeproj`を使ってアプリ側のprojectを開いて変更すればいいようです


```ruby:Podfile
TESTING_TARGETS = %w[AppTests AppIntegrationTests]
post_install do |installer|
  # アプリ側のxcode projectを開く
  Xcodeproj::Project.open('App.xcodeproj').tap do |project|
    targets = project.targets.find_all do |target|
      TESTING_TARGETS.include?(target.name)
    end
    # Test用macro定義
    targets.each do |target|
      target.build_configurations.each do |config|
        if config.name == "Debug"
          preprocessor_definitions = config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] || ['$(inherited)']
          preprocessor_definitions = [preprocessor_definitions] unless preprocessor_definitions.instance_of?(Array)
          preprocessor_definitions.push('APP_TESTING=1').uniq!

          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = preprocessor_definitions
        end
      end
    end

    project.save
  end
end
```
jquery-fileupload-railsでUncaught TypeError: Cannot read property 'innerHTML' of null 

# 状況
`//= require jquery-fileupload/basic`ではエラーが出ないが`//= require jquery-fileupload`に変更したら，Templateを使わないフォームで`Uncaught TypeError: Cannot read property 'innerHTML' of null `が出た

# 解決策

```js
$("#hoge").fileupload({
  autoUpload: true
  uploadTemplateId: null
  downloadTemplateId: null
});
```

のように`uploadTemplateId`と`downloadTemplateId`を明示的に`null`にする．
Wowza Streaming Engine開発者向け版のライセンス更新手順

### ライセンス申請
* 申請場所
 * http://www.wowza.com/pricing/trial
* 入力内容
 * 名前
 * メール
 * 会社名
* メールでライセンスが返信される

### Wowzaサーバーへのログイン
* ツールなど
 * putty
 * key pair
* putty設定
 * puttyセッションを作成
 * プロキシ設定
 * 認証設定（key pair）
 * ユーザ設定
* wowzaサーバーへ
 * 起動して、Public DNSをコピー
 * putty session画面に、public DNSをHost Nameに入って、openボタンをクリックする

### ライセンス更新
* Server.license場所
 * /usr/local/WowzaMediaServer/conf
* ファイル更新
 * 古いライセンスファイルを作成する
 * 古いライセンスをコメントアウトする
 * 新しいライセンスを1行目に追加する

### 確認
* /usr/local/WowzaMediaServer/bin/下に、./startup.shで起動できること
* ブラウザから、[Public DNS]:[ポート]へアクセスできること