OmniAICreator/Qiita-1.07M huggingface dataset:
GitLab Omnibusをインストールしたときのログローテーション（CentOS6.5）

CentOS6.xにGitlab Omnibusをインストールする方法は、ほぼ[公式](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md)の通りですし、

* [Vagrant内のCentOS 6.5にGitLab Omnibusをインストールしてみた話](http://qiita.com/tacck/items/d025f02e1db656a6fc66)
* [CentOS 6.5にGitLab Omnibusをインストール](http://www.sea-bird.org/pukiwiki/index.php?CentOS%206.5%A4%CBGitLab%20Omnibus%A4%F2%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB)

あたりに注意点含めて書いてあるのでそちらをどうぞ。

ちなみに自分がいれたのは、gitlab-6.8.2_omnibus-1.el6.x86_64.rpm。

インストールはまぁ、問題なく終わってすぐGitLabが使えるようになると思います。
バックアップの方法も[公式ドキュメント](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#backups)の通りでできます。

しかし、/etc/logrotate.d ディレクトリなんか見てもログローテーションの設定がないです。
ちなみに、ログは /var/log/gitlab 配下にいくつかディレクトリあってそこに出力されています。

nginxやpostgresqlをはじめ、各サービスは[runit](http://smarden.org/runit/index.html)でデーモン化されて、標準出力はsvlogdでログに出力されているので、それでローテーションされるので問題ないですね。

それでも rails のログや、nginxのアクセスログはローテーションする設定がないので、その設定はしてやる必要があるようです。

自分は以下のようにしました。

### railsのログ

/etc/logrotate.d/gitlab ファイルを以下の内容で作成。これは、https://github.com/gitlabhq/gitlabhq/blob/master/lib/support/logrotate/gitlab より拝借。

```
/var/log/gitlab/gitlab-rails/*.log {
    daily
    missingok
    rotate 40
    compress
    notifempty
    copytruncate
}

/var/log/gitlab/gitlab-shell/gitlab-shell.log {
    daily
    missingok
    rotate 40
    compress
    notifempty
    copytruncate
}
```

### nginxのログ

nginxのプロセスにUSR1シグナルを送る感じになるので、svコマンドから送るようにしました。
/etc/logrotate.d/nginx を以下の内容で作成した。

```
/var/log/gitlab/nginx/*.log {
    missingok
    notifempty
    sharedscripts
    postrotate
       /opt/gitlab/embedded/bin/sv 1 /opt/gitlab/service/nginx
    endscript
}
```

### 別件。PostgreSQLへのアクセス

ちなみに、GitLab Omnibus では PostgreSQL がインストールされてしまうわけですが、これにアクセスするには以下のコマンドを使うとよいです。

```bash
$ /opt/gitlab/embedded/bin/psql -h localhost -U gitlab -d gitlabhq_production
```

という感じで、GitLab をうまく運用できるのではないでしょうか。。。
'tmp' vs 'Temp' 一時ファイル用ディレクトリの命名はどちらか。

一時ファイルディレクトリの名前はtmpにするか、tempにするかちょっと考えたのでメモ。どうでもよさそうな事ですが…笑

# Windows

```bat
> echo %TEMP%
C:\Users\UserName\AppData\Local\Temp

> echo %TMP%
C:\Users\UserName\AppData\Local\Temp
```

Tempフォルダである。他にも`C:\Windows\Temp`というフォルダも。

# Unix

```
/tmp
/var/tmp
```

あまり関係はないですが、こんな記事も。
[/tmpと/var/tmpの仁義無き戦い](http://qiita.com/kuni-nakaji/items/f29be14be578b5a19d4b)

# Mac

[MAC OSX のディレクトリ構造](http://tantanu.minibird.jp/forum/topic.php?id=61)によれば、

```text
/tmp
/private/tmp
```

# 結論

**どちらでもよさそうだ。**
しかし、UNIXであれば`tmp`とした方が違和感がなく感じる。
Windowsであれば`Temp`なのでしょうね。
SSHトンネルでPostgreSQLに接続

# SSHトンネルを使う

## 参考URL

* [PostgreSQL - SSHトンネルを使った安全なTCP/IP接続](http://www.postgresql.jp/document/8.4/html/ssh-tunnels.html)
* [Windows(Putty): Qiita - リモートサーバ上のMySQLにSSHトンネル経由でアクセス（Putty）](http://qiita.com/saba1024/items/5cf626dbf0c0896e9b49)

## SSH例

```sh
ssh -L 12000:localhost:5432 hoge@example.com
```

Windowsの場合、Putty設定＞接続＞SSH＞トンネル

* 源ポート：空いている適当なポート（例：12000）
* 送り先：localhost:5432

追加ボタンを押し忘れないようにする。
接続する前に設定を保存しておくと便利。

SSH接続してログインする。
サーバーの設定はデフォルトではNGなので、例えば次のように設定する。

# サーバーの設定例
## postgresql.confの修正

次をアンコメントする。

```conf:postgresql.conf
listen_addresses = 'localhost'
```

## pg_hba.confの修正

```conf:pg_hba.conf
# "local" is for Unix domain socket connections only
local   all         all                               ident
# IPv4 local connections:
host    all         all         127.0.0.1/32          password
# IPv6 local connections:
host    all         all         ::1/128               password
```

こんな感じにする。

※サーバーに接続する人がただ一人だけなら、passwordの代わりにtrustを設定すると便利。
trustを設定する注意点についてはこちらに記載されていました。
http://www.postgresql.jp/document/9.3/html/auth-methods.html#AUTH-TRUST

## 設定を反映

```sh
service postgresql reload
```
VagrantとDockerでRicty生成

[Dockerでdebianプラクティス](http://qiita.com/tsuyoshi_cho/items/6a20a1566f6cdcc9c818)で公表するといっていたもの。
まだ、いろいろ不備がありますが。
Dockerの習作です。

#What?
Vagrant upでDocker内で[Ricty](save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html)を生成する環境を用意します。

#Where?
https://github.com/tsuyoshicho/buildricty-docker
https://registry.hub.docker.com/u/tsuyoshicho/buildricty/

詳細はREADME.md参照。

#Why?
Dockerの「使い捨てでの環境」を実践できるものであるということ、小規模なこと、自前でVagrant で環境作ってあったけど、移動とかめんどくさかったので。
Boxにするほどではないし...。

なお、Rictyはライセンスの都合、生成済みのフォントを配布できない(しないようにしている)という事情があります。
ここまでお膳立てしてても問題ないか、というがちょっと気になりますが...まあコマンド打つ前は存在しないし、平気かな。

#other info
##主要な作業とか挙動
* Dockerfileから最新環境構築
* 構築済みイメージをpull

##Docker
* ビルド時にツール類を取得
* 実行時にツールやフォントを最新にし、生成

##ファイルの移動
* 生成したフォント(docker cp)
* Dockerfileのプロビジョニング時(scp)

これらはREADME.mdにtipsメモとして記載。

##自分でやったこと
* 生成環境構築
* githubにVagrantifle/Dockerfile登録
* 説明(README.md)を作成、登録
* Docker Hubへ登録
* Qiitaに投稿

#Issue
* フォントをパッケージからもってくるため、最新でない。
すぐ覚えられる！CSS3で使えるカラーキーワード

# Dark~
```
darkorange
darkviolet
darkred
darkgreen
darkblue
darkgray
darkcyan
darkmagenta
darkorange
```

# deep~
```
deepskyblue
deeppink
```

# light~
```
lightblue
lightcyan
lightgray
lightgreen
lightpink
lightseagreen
lightskyblue
lightyellow
```

# medium~
```
mediumblue
mediumpurple
mediumseagreen
```

# 詳しくは
https://developer.mozilla.org/ja/docs/Web/CSS/color_value
RedmineのPDF出力でalpha channel 有りのpngを含むとエラーが出る(解決)

#問題の内容
RedmineのWikiでPDFを出力しようとしたら内部エラー発生。
原因を調べるためlogファイルを見てみると下記のようなエラーが出ていました。

```
pdf: Image: error: TCPDF error: Alpha channel not supported:
```

#解決策

ぐぐってみると既に公式のRedmineで課題として報告されていました。

[Feature #12447 Support for PNG with alpha channel in pdf export](http://www.redmine.org/issues/12447)

チケットのコメントにもあるようにこの問題に対応するためのプラグインを作ってくれた方がいました。
https://github.com/t-yuki/redmine_pdf_export_backports

##プラグインのインストール

githubから取得→再起動するだけでOKでした。

```
cd /opt/redmine-2.5.1-1/apps/redmine/htdocs
git clone https://github.com/t-yuki/redmine_pdf_export_backports.git ./plugins/redmine_pdf_export_backports

touch ./tmp/restart.txt

```

※Linux版bitnami redmine 2.5.1-1にて

プラグイン作者のtoyotaさんありがとうございます。
【暫定】kivy-iosで文字列をShift_jisに変換する方法メモ kivy v1.8.0


　Kivy-iosはデフォルトのままだとマルチバイトの日本語コーデックが組み込まれません。なので、設定の変更をして再コンパイルします。

”kivy-ios/src/python_files/”配下にあるModulesSetupに下記の記述を追加します。

```txt:ModulesSetup
# for Japanese(Windows Charactor Code)
_codecs_jp cjkcodecs/_codecs_jp.c
_multibytecodec cjkcodecs/multibytecodec.c
```

これだけだと、「UnicodeDecodeError: 'ascii' codec can't decode....」のようなエラーが発生してうまくいきません。いろいろ調べた結果、デフォルトのコーデックがasciiになっているためのようで、Python-2.7.1のデフォルトをutf-8に変更します（これは、コンパイルするときに新たに取ってきてしまうので ".cache"のgz2を直接変更します）。
下記のファイルを”Lib”配下に追加します。

```python:sitecustomize.py
import sys
sys.setdefaultencoding("utf-8")

```

これで"tools/build-all.sh"を実行すれば準備完了です。

```python:sample

utf8data = '１２３４'
sjisdata = utf8data.encode('shift_jis')
print to_hex(sjisdata)

実行すると正しく変換されます。

0x8250825182528253
```


【注意】どうも、まだ完全ではないようで逆変換ができません。なにか分かり次第UPDATEする予定です。
MacOS X 10.8.5 のemacsでdoxymacs

普通に[Doxymacs = Doxygen + Emacs](http://doxymacs.sourceforge.net/) から
ソースをDLして`./configure`したら、x86_64用の何かが足りないようだった。。

ふと
`brew search doxymacs`
したらなんと有るじゃないか。

ということで
`brew install doxymacs`

その後
`~/.emacs.d/init.el`に

```el 
(require 'doxymacs)
(add-hook 'c-mode-common-hook 'doxymacs-mode)
```

で動作した。。他に何もしてないはずなんだけどこれで動くのか。。
MEAN.IO　server.jsのファイル参照順序　備忘録

Javascriptを勉強し始めて間もないので、間違いがあれば訂正頂けるとうれしいです。
今回はserver.jsからどのファイルがどの順番で参照されているかのメモです。
meanを使ってオリジナルのものを作る場合にいじる必要のあるファイルを見ていきます。(他にもあれば助言ください。)

MEANバージョン：0.3.3

> `$APP_HOME`はmeanコマンドで各種ファイルが展開されるディレクトリとします。

#サーバサイド($APP_HOME/server.js)
抜粋でメモしていきます。

```server.js①
var config = require('./server/config/config');
```
`config`に`$APP_HOME/server/config/config.js`を実行したものを代入しています。
`config.js`ではさらに`$APP_HOME/server/config/env/`にあるファイルを呼び出しています。

```config.js
module.exports = _.extend( //オブジェクト拡張関数？
  require('./env/all'),
  require('./env/' + process.env.NODE_ENV) || {}　//　起動モードによって読み込むファイルが変わる
);
```

読み込んだ設定ファイルから`config`には以下の情報が入っているはず。
`db`は`all.js`と動作モード毎、どちらのファイルでも定義されてるように見えて、どちらが参照されているかは理解できてません。。。

```
config = {
  root: , port: , hostname: , db: , templateEngine: , sessionSecret: ,
  sessionCollection: , app: {name: }, facebook: {略}, twitter: {略},
  github: {略}, google: {略}, linkedin: {略}
}
```

以上でコンフィグの読み込みは終了したと思われますので、再びserver.jsに戻って次の処理に移ります。

```server.js②
var app = require('./server/config/system/bootstrap')(passport, db);
```
`app`に`./server/config/system/bootstrap.js`を実行したものを代入しています。

```bootstrap.js①
function bootstrapModels() {
　require('../util').walk(appPath + '/server/models', null, function(path) {
　　require(path);
　});
}
```

`./server/models/`配下のファイルをすべて読み込んでいる？
デフォルトでは`user.js`のみで、これはOpenIDのログインに必要なユーザ情報を集約しているようです。

```util.js
if (stat.isFile() && /(.*)\.(js|coffee)$/.test(file)) {
　callback(newPath);　//　スクリプトファイルならフルパスをbootstrap.jsへ返す。
} else if (stat.isDirectory() && file !== excludeDir) {
　walk(newPath, excludeDir, callback);　//　ディレクトリならさらにwalk関数を回す。
}
```

という理解で間違いないはず・・
最後に`express.js`を呼び出している模様。

```express.js
var app = express();
require(appPath + '/server/config/express')(app, passport, db);
```

`express.js`は長くなるので次回に回します。
ここまでの図を適当に作成してみました。(sphinx使いたいだけなので随時更新します。)

![mean-server.jpg](https://qiita-image-store.s3.amazonaws.com/0/43273/bcdd26fe-47d6-0c6e-c2a0-46fa014b2983.jpeg)
vimで単語を検索してから別の単語に置換を単語の再入力が無いように


```lovelive.text
umi_chan × kotori
nontan × erichika
maki_chan × nikoni
kayochin × rin_chan
```

    /umi_chan<Enter>
    :%s//honoka<Enter>

```lovelive.text
honoka × kotori
nontan × erichika
maki_chan × nikoni
kayochin × rin_chan
```
Mac Chrome上でAndroid ChromeのDeveloper Toolsを表示する方法

備忘録

#Mac Chrome上でAndroid ChromeのDeveloper Toolsを表示する方法

##準備

###Macの設定
「Chome」→メニュー→「ツール」→「デバイスを検証」(chrome://inspect/#devices)
「Discover USB devices」をチェックします。

###Androidの設定
「設定」→「開発者向けオプション」
「USBデバッグ」をオンにします。

##使用手順

###1.
AndroidとMacをUSBケーブルで接続します。

###2.
USBデバッグを許可しますか？
「OK」を押します。
煩わしければ、「このパソコンからのUSBデバッグを常に許可する」にチェックをいれる。

###3.
「Chome」→メニュー→「ツール」→「デバイスを検証」(chrome://inspect/#devices)
開いているページの一覧が表示されています。
表示されていない場合は、「Port forwarding...」をクリック。

###機能

####新しいページを表示
「Open tab with url」に表示したいURLを入力→「Open」
　

|表示|機能|
|:-----------|:------------|
| inspect      |このページをDeveloper Toolsで開きます。|
| focus tab     |このページをAndroid上で表示します。|
| reload       |このページを再読み込みします。|
| close         |このタブを閉じます。|
「ログ解析」で頭の片隅にあると役に立つかもしれないLogParserの話


# この話題でわかること

- LogParserというWindows上で動くログ解析ツールを紹介
- 動作的にはテキストをSQLで抽出することができる
- LogParserの動作方法

LogParserのダウンロードはこちらから。
http://technet.microsoft.com/ja-jp/scriptcenter/dd919274.aspx


ログ解析が必要になったとき、シェルとかJavaとかプログラムを書けばできそうだけど、正直面倒。（っていうかLinuxだったらすぐできんのにな的なときとかよくある。）
出力したいことは簡単なのになーって思っている人に、Windows上で動くLogParserというツールをご紹介します。
テキストをSQLクエリで解析するツールなのでログ解析以外にも使えます。アイデアや対象データ形式によります。
もう、Windowsにさようならしたはずの俺がこんなこと書くのが不思議だなあ。

# やれること
前段に記載の通り、SQLでやれそうなことができます。
Databaseではカラムに対して抽出条件を記載しますが、LogParserは基本的に１行を１カラムとして捉えて実行します。（IIS等のログフォーマットに沿って解析することでもできるようですが、無知な為触れません。）

例えば、"2014/05/20 14時00分"にアクセスされた情報が取得したい場合、
ログファイルには日時文字列が記載されてますが、

```access.log
2014/05/20 14:00:00 +0000 GET /index ......
2014/05/20 14:01:42 +0000 GET /index ......
2014/05/20 14:03:30 +0000 GET /login ......
```
この１行が１カラムなので、単純に以下のようなSQLで取得できます。

```SQL
SELECT text FROM access.log WHERE SUBSTR(text,0,16) = '2014/05/20 14:00'
```

簡単過ぎて鼻毛が出ちゃいますね。
感覚的にはテキストエディタの検索機能と同じです。
行をレコードとして扱える分、COUNTも取得できるし、LIKE文も使えます。
ただし、

**全てのSQLクエリが使えるわけではないこと**

この辺りが少しややこしい印象を受けるかもしれません。
では、実際の使い方を見てみましょう。

# 実例（サンプル）

■アクセスログから単位時間辺り（分）のPV数が知りたい
前提条件）

- LogParser.exeが「C:\Program Files (x86)\Log Parser 2.2」にある
- access.logのフォーマット形式で、日時文字列が行頭から始まっていること。（


```
C:\Program Files (x86)\Log Parser 2.2>LogParser -i:TEXTLINE "SELECT SUBSTR(text,0,16),count(*) from C:\access_log.20140520 GROUP BY SUBSTR(text,0,16)"
```

具体的には書きませんが、例えば、リクエストリソース単位（ページ単位）で集計したい場合は、
ApacheなりのLogFormat形式を考えて、INDEX_OF関数を使って文字列を検索しSUBSTRで抜き出す、それをGROUP BYするとか、、まあこの辺はSQLの話なので省略しますね。


# もっと知りたい
自分がよく使っていた頃はあまり日本語のドキュメントがありませんでした。
どのクエリ（関数）が使えるんだよー！って困ってました。OfficeのAccessってVB関数が使えたりして頭がごちゃごちゃする傾向がありましたよね。

前置きが長くなりましたけど、結局、LogPaser自体が出してくれるヘルプが一番良いです。

**LogParser -h GRAMMAR**

「-i:IISW3C」のような-iオプションを使うと、規定フォーマットに沿って解析してくれて、
何文字目とか泥臭いことしなくて済むよーっていう見出しだけ記載して、
もう少し知りたい方はやってみるとHappyになるかもしれません。
Ruby SNMPを使ったJuniperルータのBGP状態の取得


RubyでJuniperルータのBGP状態をSNMPで取得する方法

## MIB

MIBはこちら。

http://www.juniper.net/techpubs/en_US/junos10.3/topics/reference/mibs/mib-jnx-bgpmib2.txt

```
jnxBgpM2PeerState OBJECT-TYPE
        SYNTAX     INTEGER {
            idle(1),
            connect(2),
            active(3),
            opensent(4),
            openconfirm(5),
            established(6)
        }
```

```1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0 ```で一覧を取得できるようだ。

## CLIから

ルータのCLIから```show snmp mib```で確認することができる。

```
router> show snmp mib walk jnxBgpM2PeerEntry
```

## OID

IPv4はこんな感じ。1のあとにIPv4アドレスがドット表記で続く。前が自分のアドレス、後ろがpeerのアドレス

```
SNMPv2-SMI::enterprises.2636.5.1.1.2.1.1.1.14.0.1.192.168.0.1.1.192.168.0.2
```

IPv6はこんな感じ。2のあとになにやらたくさんの数字が続く。これはIPv6アドレスを8bitごとに区切って、10進数で表記したもの。```2001:db8::1```は```32.1.13.184.0.0.0.0.0.0.0.0.0.0.0.1```になる。

```
SNMPv2-SMI::enterprises.2636.5.1.1.2.1.1.1.14.0.2.32.1.13.184.0.0.0.0.0.0.0.0.0.0.0.1.2.32.1.13.184.0.0.0.0.0.0.0.0.0.0.0.1
```

# IPアドレスをOIDに変える

IPAddrクラスを拡張するとこんな感じに書ける

```ruby
class IPAddr
  def to_oid
    if self.ipv6?
      return self.to_string.delete(":").scan(/.{2}/).map{|h| h.hex}.join(".")
    end
    self.to_s
  end
end
```

## SNMPで取得する

Ruby SNMP http://snmplib.rubyforge.org/ を使うとこんな感じで書ける。

```ruby
protocol_id = peer_address.ipv4? 1 : 2
oid = "1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2.0.#{protocol_id}.#{local_address.to_oid}.#{protocol_id}.#{peer_address.to_oid}"
begin
  snmp_manager = SNMP::Manager.new(:Host => host, :Community => community, :timeout => 1, :retries => 1)
  r = snmp_manager.get_value(oid)
  if r.to_s == "noSuchInstance"
    # no peer
  else
    if r.to_i == 6
      # established
    else
      # down
    end
  end
rescue => ex
  # SNMP error
end
```

```SNMP::NoSuchInstance``` の判定方法がうまくいかなかったので、to_sで文字列として判定してます。
実行ファイルの互換モードを設定する

レジストリが本体らしい。

# 実行ファイルのプロパティで設定する

![Compatibility.png](https://qiita-image-store.s3.amazonaws.com/0/33674/72c52854-19ad-8eff-42a8-f0ec6b8d719b.png)

# レジストリで設定する

>HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

「名前」にファイルのフルパスをにして、「データ」に以下の値を設定する

| データ    | 意味             |
|:--------|:------------------|
| ~ WIN8RTM  | 互換モードでこのプログラムを実行する Windows 8 |
| ~ WIN7RTM  | 互換モードでこのプログラムを実行する Windows 7 |
| ~ VISTASP2 | 互換モードでこのプログラムを実行する Windows Vista (SP2) |
| ~ VISTASP1 | 互換モードでこのプログラムを実行する Windows Vista (SP1) |
| ~ VISTARTM | 互換モードでこのプログラムを実行する Windows Vista |
| ~ RUNASADMIN | 管理者としてこのプログラムを実行する |
Railsのupdate直後に激おこされたので鎮めるの巻

Rails4.1.0から4.1.1にしようとbundle updateして無事に終わった感じだったんで最後の確認をしようとしたらば以下の様に激おこ。

    $ bin/rake about
    There is a version mismatch between the spring client and the server.
    You should restart the server and make sure to use the same version.
    
    CLIENT: 1.1.3, SERVER: 1.1.2


ググると同様の人がいたので以下のコマンドでspringさんを沈静化。

    $ bin/spring stop

再び確認すると無事に色々表示に。

    $ bin/rake about
    About your application's environment
    （略）
<frame>の中にある要素をjQueryのセレクタで取得する方法

#概要
`<frame>`の中に配置された要素をjQueryで取得したい、という場面を考えます。

# 説明
下記のようなHTMLファイルがあり、`id="catchme"`のdiv要素のテキストをjQueryで書き換えます。jQueryのスクリプトはparent.htmlで取り込まれています。

```html:parent.html(抜粋)
<frameset attr="略">
  <frame id="f0" src="f0.html"></frame>
  <frame id="f1" src="f1.html"></frame>
</frameset>
```

```html:f1.html

<html>
  <body>
    <div id="catchme">hello</div>
  </body>
</html>
```

`$()`の第2引数にbodyを渡してやることによって取得できます。

```js
// NG
$('#catchme').text('Good night');

// OK
$('#catchme', top.frames[1].document.body).text('Good night');
```

# 編集後記
* `top.frames[1]`の部分を`top.client`に変えるのではだめでした。
* f1.htmlの中でjQueryを取り込むのが本来のやり方かと思います。今回は非常にレガシーなシステム（frameを使っている時点でお察し）なので…
RedmineとGitの連携メモ

* OS: ubuntu14.04lts
* ベアリポジトリは/home/user/git/public/barerepository.git

#Gitのインストール
```text:
$sudo aptitude install git
```

gitをインストール．

そのほかは[基本的なgitコマンドまとめ](http://qiita.com/2m1tsu3/items/6d49374230afab251337)を参考に．

#Redmineの設定
図1　Redmine>管理>設定>リポジトリ
![Screenshot from 2014-05-23 18:43:39.png](https://qiita-image-store.s3.amazonaws.com/0/44482/8e977841-e18c-a0c7-e9ad-07e48725d8af.png)

APIキーを生成しておく．
<br>
***
図2　Redmine>プロジェクト>プロジェクト名>設定>新しいリポジトリ
![Screenshot from 2014-05-23 18:53:35.png](https://qiita-image-store.s3.amazonaws.com/0/44482/9ccabcfb-2c14-633e-4653-97fa22480b4a.png)
Gitと連携させるベアリポジトリを設定する．
識別子はファイル名とかわかりやすいように，メインリポジトリや最新コミットを表示させるかどうかはオプションで．

#Gitのhooksを利用する
```bash:/home/user/git/public/barerepository.git/hooks/post-reseive
#!/bin/sh
WGET="/usr/bin/wget"
REDMINE_URL_BASE="http://localhost/redmine/"
REDMINE_REPOS_API_KEY=redmine_api_key
REDMINE_PROJECT_ID=redmine_project_id
 
echo "redmine update"
RESPONSE=$($WGET "${REDMINE_URL_BASE}sys/fetch_changesets?key=${REDMINE_REPOS_API_KEY}&id=${REDMINE_PROJECT_ID}")
echo $RESPONSE
exit 0
```
ベアリポジトリのhooksの下にpost-receiveを作成する．
<br>

```text:
$sudo chmod 775 /home/user/git/public/barerepository.git/hooks/post-reseive
```
post-receiveの権限を書き換える．

これにより，ベアリポジトリにpushされたときにRedmineが自動で更新されるようになる．
<br>
##ちなみに
図1のように参照用キーワードを*に変えておけば，チケット番号をコミットメッセージに書いてあげるだけでチケットと紐付けされる．

```text:
$git commit -a -m "これは練習だよ! #1"　　　　　　//こんな具合に

```
<br>
##参考サイト
* [[git][redmine] pushした際にRedmine側の「リポジトリ」の情報も更新する](http://blog.iss.ms/2011/08/30/125938)
Travis CIでDeployGateにapkをアップロードする


# 概要
Travis CIでビルドが成功した時にDeployGateにapkをアップロードする方法です。

# DeployGateのトークンを環境変数に書いておく
[TravisCI - Travis CIでsecret valueを扱う - Qiita](http://qiita.com/arukoh@github/items/0315e6b2c1ac046ab34f)

```shell-session
% travis encrypt DEPLOYGATE_TOKEN=...
```

といった感じに環境変数 ``DEPLOYGATE_TOKEN`` の値を暗号化します。

さきほどのコマンドで生成した暗号化された環境変数を ``.travis.yml`` に追加します。

```.travis.yml
env:
  global:
    - secure: XXXX
```

# .travis.yml に書く
``after_success`` に書きます。

```bash:.travis.yml
after_success:                                                                                                                                                                    
  - if [ "${TRAVIS_BRANCH}" = "develop" -a "${TRAVIS_PULL_REQUEST}" = "false" ]; then curl -F "file=@${TRAVIS_BUILD_DIR}/build/apk/project-debug-unaligned.apk" -F "token=${DEPLOYGATE_TOKEN}" https://deploygate.com/api/users/name/apps ;fi 
```

上記の例ではテスト対象のブランチがdevelopかつPull Requestのテストでない時のみDeployGateにアップロードしています。

アップロードするapkはプロジェクト名やbuild typesによって異なるので ``project-debug-unaligned.apk`` を変更してください。

```bash
"file=@${TRAVIS_BUILD_DIR}/build/apk/project-debug-unaligned.apk"
```

また、アップロードするかどうかを判定するブランチ名も適宜変更してください。

```bash
"${TRAVIS_BRANCH}" = "develop"
```

お好みで[APIドキュメント](https://deploygate.com/docs/api?locale=ja)を見てメッセージなどをつけてみるのもよさそうです。
FMDBとSQLCipherを合わせて使う

ほとんどこちら -> (http://labs.torques.jp/2012/11/19/3018/ )に書かれてた通りだけど詰まったとこのメモ。

# Xcodeでのsqlcipherのビルド時にエラー
`clang: error: no such file or directory: ..../sqlite.c`

先にmakeする。
-> http://stackoverflow.com/questions/19490208/unable-to-build-sqlcipher-in-xcode-missing-sqlite3-c

# PodFile
```
pod 'FMDB'
pod 'FMDB/SQLCipher'
```
て両方するのかと勘違いしていたが、

```
pod 'FMDB/SQLCipher'
```
だけでOK。

# [FMDatabaseQueue inTransaction:]でsetKeyするとエラー

エラーの出た例

```objc
FMDatabaseQueue *q = [[FMDatabaseQueue alloc] initWithPath:@"DB_PATH"];
[q inTransaction:^(FMDatabase *db, BOOL rollback){
  [db setKey:@"SECRET"];
  // ほげほげする
}];
```

`Unknown error calling sqlite3_step (11: database disk image is malformed) eu`
（最後の`eu`てなんだかよく分からないけど付いてたママ）

`[FMDatabaseQueue inTransaction:]`に入った時点で、`begin transaction`されちゃっているので、その前に`[FMDatabase setKey:]`しないとダメ

```objc
FMDatabaseQueue *q = [[FMDatabaseQueue alloc] initWithPath:@"DB_PATH"];
[q inDatabase:^(FMDatabase *db){
  [db setKey:@"SECRET"];
}];
// ↑を1回最初にしてから

[q inTransaction:^(FMDatabase *db, BOOL rollback){
  // ほげほげする
}];
```
LabVIEW Tips: NaN/Inf/-Infの時に表示されないようにする

# デジタル数値表示器で、値がNaN/Inf/-Infの時に表示されないようにする

デジタル数値制御器/表示器で、NaN/Inf/-Infが表示されると嫌がられるので表示を隠す。正確には見えないようにごまかす。
結果表示を、文字列表示器に変更して、Nan/Inf/-Infの時だけ空（ブランク）にするという方法もあるが、ちょっと手間がかかるので、透明にしたらどうよ？という案です。


![TranspareTextNanInfValue.jpg](https://qiita-image-store.s3.amazonaws.com/0/43526/45f88e1e-9ff5-f479-5de9-2f8733327a2e.jpeg)

できれば、デジタル数値制御器/表示器のプロパティとかで
Nan/Inf/-Inf の時は非表示、みたいなのがあるといいのですが。
SELECTの実行結果にページャーが利用されるのを抑制する

#概要
PostgreSQLの環境によって、SELECTの実行結果が1画面に収まらない場合に自動的にページャーが利用されます。

```
 id  |   username    
-----+---------------
1    | AAA
2    | BBB
3    | CCC
:  <--- こんな感じで出力が一旦止まる。スペースを押下すると続きのレコードが表示される。
```

実行結果をコピペしたいんだ！という場合などには無効化できます。

#変更コマンド
psql上で`\pset pager`を実行するだけです。
実行するたびに、ONとOFFが切り替わります。

```
postgres=# \pset pager
Pager usage is off.
postgres=# \pset pager
Pager is used for long output.
postgres=# \pset pager
Pager usage is off.
postgres=# \pset pager
Pager is used for long output.
```

明示的にON/OFFを指定することもできます。

```
postgres=# \pset pager off
Pager usage is off.
postgres=# \pset pager off
Pager usage is off.
postgres=# \pset pager on
Pager is used for long output.
postgres=# \pset pager on
Pager is used for long output.
```
npmでグローバルにインストールしているモジュールだけを表示する

npmでグローバルにどんなモジュールをインストールしてたかなー、と以下を実行すると

```shell-session:Terminal
$ npm ls -g
/Users/macbookpro/.nodebrew/current/lib
├─┬ bower@1.3.3
│ ├── abbrev@1.0.5
│ ├── archy@0.0.2
│ ├─┬ bower-config@0.5.0
（略）
```

となってしまって、依存モジュールを表示されましても……と萎え萎えだったのですが、`depth`オプションというのがあったのですね。

```shell-session:Terminal
$ npm ls -g --depth 0
/Users/macbookpro/.nodebrew/current/lib
├── bower@1.3.3
├── casperjs@1.1.0-beta3
├── coffee-script@1.7.1
├── grunt-cli@0.1.13
├── node-dev@2.1.5
├── node-inspector@0.7.3
├── npm@1.4.9
├── uglify-js@2.4.12
├── yeomania@0.0.2
└── yo@1.1.2
```

と、`--depth 0`を指定すると直下のものだけ表示できます。

毎回指定するのが面倒な場合は

```ini:.npmrc
depth = 0
```

としておくと`$ npm ls -g`とするだけで常に同じ結果になります。

まあ、正直何を入れていたかわからないから`$ nodebrew migrate-package`でいいや、で今まで済んでいたので、これからもそうなのでしょうが。
Thrift 0.9.1のインストールではまった件


MacOSX上へのthrift 0.9.1のインストールに難儀したのでメモしておきます。
PHP用のファイルが足りないことが原因だったので、PHPを使わない人は除外すれば起きないかと思います。
CPPでもエラーが起きましたが僕は使わないので見なかったことにします。

なお、ThriftはHomebrewにも上がっていました。brewで試して上手く行けばおめでとうございます。

さて、Thriftのソースは[ここ](http://thrift.apache.org/download)からダウンロードできます。

```thrift:shell
wget https://dist.apache.org/repos/dist/release/thrift/0.9.1/thrift-0.9.1.tar.gz
tar zxf thrift-0.9.1.tar.gz
cd thrift-0.9.1
./configure
make && make install
```

本来ならこれでインストールできるはずです。
しかし、makeを叩いた段階で以下のエラーが出ました。

> Making all in php
> Making all in test
> make[4]: Nothing to be done for `all'.
> cd src/ext/thrift_protocol/ \
> 	  && make

phpのテストでこけてる感じです。
> ext/thrift_protocol

とあるので、thriftのextensionが無いのか？と想像できました。
thriftのソースの中を見てみたら

> lib/php/src/ext/thrift_protocol/

があったので、これが該当しそうですね。
この中でphpizeを叩いてみましたが、config.m4が存在しないということでエラーになってしまいます。
このファイルが無いことでextensionのビルドがこけてたみたいですね。
ぐぐったところriken.jpのリポジトリから0.9.0を落としてきて使いまわす人もいましたが、既に0.9.0は消されててぐぬぬでした。

オフィシャルのdownloadページを見なおしたらgitリポジトリの情報が載っていたので見てみることにしました。

```thrift:shell
git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
```

gitリポジトリの中にはconfig.m4がいてくれたので、それを使ってビルドし直したら無事にインストールできました。
config.w32はいたので、Windowsだったらビルドできるのかな？その辺はあまり詳しくないのでなんとも言えませんが。

Thriftはgolangにも対応してるようですね。
使ってみようかな
Node.jsの開発で `warn  - error raised: Error: listen EADDRINUSE` って怒られるときの対応


最近PCの調子が悪くて突如落ちる時があります。
Node.jsで開発をしているときにこんな感じで予期せぬ終了があると、Node.jsを次に起動するときに`warn  - error raised: Error: listen EADDRINUSE`って怒られるときがあります。

```通常に起動後に異常終了
$ node app.js
　info  - socket.io started
　Express server listening on port 3002
・
・
・
(←プロセスの途中でPCが落ちる等で異常終了)

$ node app.js
   info  - socket.io started
   warn  - error raised: Error: listen EADDRINUSE

(←次に実行するとerrorに)
```

`warn  - error raised: Error: listen EADDRINUSE`はそのポートが既に使われてる場合に発生するみたいです。つまり異常終了時のNode.jsプロセスが生きてるんですね。

##解決策1 しばらく待ってから実行
そのうちNode.jsのプロセスが切れてくれるのを待ちます。

##解決策2 起動ポートを変更する
app.jsのポートを変更して再起動すれば解決します。

##解決策3(本命) プロセスを切って再実行
複数人開発等でポートの変更を出来ない場合もあります。
例えば、http://localhost:3000 というアクセスの仕方をフロントエンジニアに教えておいて，そこでデバッグしてもらうときなどそういうケースは多い気がします。

そんなときは、`psコマンド(とgrep)でプロセス名を調べて、killでプロセスを終わらせて、Node.jsを再実行すれば解決`します。

```プロセス調査->プロセス強制終了
$ ps aux | grep node
user 18200  0.4 13.2 990828 80392 pts/0    Sl+  08:43   0:03 node app.js
user 18455  0.0  0.1 114492   892 pts/1    S+   08:55   0:00 grep node
$ kill 18200
```

再び実行すれば問題無く起動します。

```
$ node app.js
   info  - socket.io started
　　Express server listening on port 3002
```


##このエラーのときも同じ対応でいけるかも
追記: 2014/6/4

```
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EADDRINUSE
```

## 追記: 2017/7/2

久々にこのエラー出してしまった

```
events.js:182
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
```
hubotが入ってるDockerfileを書いた


ちょっと雑だけど、Hubotが入ってるDockerfile書いてみた。
簡単に入るからほとんど何も特殊なことはしなくて済む。
ただ、このDockerfileだとredisは最初起動してないので起動させる必要がある。
しかし、Hubotいいですね。
hubotに「the rules」って聞いた時の返しが好き。

```
# DOCKER-VERSION 0.11.1
# VERSION 0.0.1

FROM centos:6.4

MAINTAINER python_spameggs

# sysconfig network
RUN echo "NETWORKING=yes" > /etc/sysconfig/network

RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# yum
RUN yum update -y
RUN yum install -y passwd
RUN yum install -y sudo
RUN yum install -y gcc
RUN yum install -y gcc-c++
RUN yum install -y make
RUN yum install -y vim
RUN yum install -y git
RUN yum install --enablerepo=epel -y mosh
RUN yum install -y openssl-devel
RUN yum install -y zlib-devel
RUN yum install -y readline-devel
RUN yum install -y bzip2-devel
RUN yum install -y libevent-devel
RUN yum install -y openssh
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install -y cmake
RUN yum install -y npm
RUN yum install -y redis

# ssh
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config

# user
RUN useradd python_spameggs
RUN echo 'foo' | passwd --stdin python_spameggs

# sudo
RUN echo 'python_spameggs ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/python_spameggs

# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime

# sshd
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop

# redis
RUN /etc/init.d/redis start
RUN chkconfig redis on

# npm
## coffee-script
RUN npm install -g coffee-script
## hubot
RUN npm install -g hubot

USER python_spameggs
WORKDIR /home/python_spameggs
RUN hubot --create myhubot

USER root
WORKDIR /home/python_spameggs/myhubot
## sushi-yuki
RUN npm install -g hubot-sushiyuki
RUN cp package.json package.json.back
RUN sed -ri 's/">= 2.5.0 < 3.0.0"/">= 2.5.0 < 3.0.0",\n    "hubot-sushiyuki": "0.0.2"/g' /home/python_spameggs/myhubot/package.json
RUN cp external-scripts.json external-scripts.json.back
RUN echo '["hubot-sushiyuki"]' > external-scripts.json
RUN ./bin/hubot

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
```

お寿司追加してみた。
[naoya/hubot-suhiyuki](https://github.com/naoya/hubot-sushiyuki "naoya-sushiyuki")

それとcentosは[オフィシャル](https://registry.hub.docker.com/_/centos/ "centos")のものに変更とredisを起動するようにした。
Tilda で新しいタブを開いた時に .bashrcを読み込むように設定。

Mintでアコーディオンメニューみたいに画面上から落ちてくるターミナル「Tilda」が初期設定では`.bash_profile`を読み込んでくれなくて寂しかったので修正。

## 原因

Tildaが新しいタブを開いた時に`.bash_profile`を開かないのは、そもそも`.bash_profile`はログイン時に開くものだから正常な動作らしい。（んじゃ、なんでUbuntuとかMacだと読みこむの？という疑問の答えは知りません。)

## 解決策

タブ開いた時に呼び出すシェルを`bash`じゃなくて`bash -l`とログインオプションつけてログインしてることにしちゃいましょう。

`Preferences`->`Title and Command`タブの`Command`-.`Custom Command:` に `bash -l`と入れればOK。

![20140523.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/b6bc287b-d66a-419b-7eec-bfe60e0cbab2.jpeg)
UnityでiOSのGameCenterを利用するためのサンプルコード


# 概要

UnityでiOSのGameCenterを利用し、リーダーボードの表示とユーザーのスコアを送信する手順を説明します。

![リーダーボード.PNG](https://qiita-image-store.s3.amazonaws.com/0/16400/9a756484-db79-4aaf-62ba-bb717de421db.png "リーダーボード.PNG")


プラグインなどは使わず、UnityEngine.SocialPlatformsを使っています。

手順

- iTunes Connectでアプリ登録
- iTunes Connectでリーダーボード登録
- Unityで実装

# iTunes Connectでアプリ登録

iOS Developer CenterでAppIDを登録後、iTunes Connectでアプリ登録しリーダーボードを有効にする必要があります。

参考
https://sites.google.com/a/gclue.jp/ios-docs/leader-boardtoachievementno-zuo-cheng

リーダーボードを登録し、登録した任意のリーダーボードIDを利用することになります。

# Unityで実装

リーダーボードの表示とスコア登録のために、ひとつのユーティリティクラスにまとめました。

```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.SocialPlatforms;

public class RankingUtility {

    //ユーザー認証
    public static void Auth()
    {
        // 認証のため ProcessAuthenticationをコールバックとして登録
        // This call needs to be made before we can proceed to other calls in the Social API
        Social.localUser.Authenticate (ProcessAuthentication);        
    }
    
    // 認証が完了した時に呼び出される
    // 認証が成功した場合、サーバーからのデータがSocial.localUserにセットされている
    private static void ProcessAuthentication (bool success)
    {
        if (success) {
            Debug.Log ("Authenticated, checking achievements");

        
        } else {
            Debug.Log ("Failed to authenticate");
        }
    }
    
    // リーダーボードを表示する
    public static void ShowLeaderboardUI()
    {
        Social.ShowLeaderboardUI();
    }
    
    // リーダーボードにスコアを送信する
    public static void ReportScore (long score)
    {
        //このIDは任意の登録したものを使う
        string leaderboardID = "score";
        
        Debug.Log ("スコア " + score + " を次の Leaderboard に報告します。" + leaderboardID);
        
        Social.ReportScore (score, leaderboardID, success => {
            
            Debug.Log(success ? "スコア報告は成功しました" : "スコア報告は失敗しました");
        });
    }
}
```

## 利用方法

```cshap
RankingUtility.Auth();
```
認証のためにまず最初に実行する。

```cshap
RankingUtility.ReportScore(long score);
```
スコアをリーダーボードに送信する。

```cshap
RankingUtility.ShowLeaderboardUI();
```

リーダーボードを表示する(モーダルで表示される）。
スコア送信時にリーダーボードを指定しているのに、表示には指定しないのが不思議に思うのは正解で、リーダーボードが複数あればそれを選ぶUIになるようです。


# 注意事項

- XcodeでGameCenterを有効化にしておく
- iTunesのテストユーザーを使う
 - サンドボックスなら自動的に現在のユーザーはログオフされる
 - テストユーザーをiTunes Connectから作成しておくこと

# 参考

Unity公式リファレンスマニュアル ソーシャルAPI
http://docs-jp.unity3d.com/Documentation/Components/net-SocialAPI.html
Google Map読込完了後に一度だけ処理したい時

なんやかんやのメモ。

```js
$(function(){	//ページ読込後の処理
  //gmap初期化  
  var myMap = new google.maps.Map(document.getElementById('map'), {
    zoom: 7,//地図縮尺
    center: new google.maps.LatLng(34.420263,133.242224),//地図の中心点
    scrollwheel: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });
 
  google.maps.event.addListenerOnce(myMap, 'idle', function(){
    //gmap初期化後の処理
  });
});
```
nitrous.ioでSinatraやNoSQLを使ってみよう

# nitrous.ioについて

![87273-d99f6a2e0583e0b32cdde5ef17c94876-medium_jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/25585/761fe42e-75e2-8c63-4215-94d05549ab54.jpeg)


nitrous.ioはブラウザ上で使えるIDE(Integrated Development Environment)になります。nitrous.ioを使うメリットとしては、

1. partsというツールを使って、開発環境を整える手間を格段に減らせること
2. クラウド上でコードを作成できるので、どこからでもコーディングをできること
3. Webサーバーを起動すると、ローカルとは違ってどこからでもアプリケーションにアクセスできるとこ

になります。

デメリットとしては、無料のアカウントでは使えるメモリやハードディスクの容量が少ないので、ジェネレータやサーバーの起動などが遅いことです。

したがって、モックなどの軽量なものをさっと開発するときにはnitrous.ioを使用し、実際にサービスとしてデプロイするならAWSやHerokuを使用することをオススメします。

ちなみに現在開発中のアプリケーションがGithubにあるのなら、すぐにnitrous.ioにクローンできるので、ローカルのアプリケーションをGithubにpushしてnitrous.ioを使ってみましょう。

# nitrous.ioを始めよう
1. [nitrous.io](https://www.nitrous.io)にアクセスして、ユーザー登録します
2. ユーザー登録のフォームを送信したら、確認メールが届くので、メール内のURLにアクセスして登録完了
3. "Open Dashboard"ボタンをクリックして、ダッシュボードを起動
4. このような画面が出てきたらOKです！
![Nitrous_IO.png](https://qiita-image-store.s3.amazonaws.com/0/25585/c9d09f69-e313-8c92-97d9-d9ae67922125.png)

# IDEを起動
続いて、sinatraアプリケーションを作成するために、「box」というものを作成します。
このboxはvagrantのものと同じように、sinatraなどを動かすための仮想環境を構築することになります。

1. templateを"Ruby/Rails"に選択
2. Nameに好きなboxの名前を入力
3. Regionを"East Asia"に選択 (サーバーを動かす場所になります)
4. 最後に、もしGithubのリポジトリをクローンしたいなら、Download a Github repoのところに自分のGithubのリポジトリURLを入力します

Create Boxをクリックすると自動的にBoxが立ち上がります。
その後出てくる画面はオプションなので、必要なければ次に進んでください。

あとは、少し待ってるとBoxが立ち上がるので、IDEボタンを押してIDEを立ち上げてください。

![Nitrous_IO.png](https://qiita-image-store.s3.amazonaws.com/0/25585/a84c1e4c-3b53-20c5-0136-8ed41ba579a9.png)

Boxなどについてもっと詳しく知りたい方は、こちらのドキュメントを参照してください。
[nitrous.io support](http://help.nitrous.io)

# Hello World
それでは、nitrous.ioのIDEを使ってSinatraのアプリケーションを動かしてみましょう。

まずはIDEの下部にあるコンソール画面から、sinatraのgemをインストールします

```shell-session
$ gem i sinatra
```

続いてsinatraで"hello world"を表示するアプリケーションを作成してみましょう

![Nitrous_IO.png](https://qiita-image-store.s3.amazonaws.com/0/25585/fb35cd36-5a23-a25e-f78c-5fd3329e94f5.png)

1. workspaceフォルダにsinatraの本体であるapp.rbを作成
2. sinatraのコードを記述
3. コンソールからworkspaceフォルダに移動し、sinatraを起動

```shell-session
$ cd workspace
$ ruby app.rb -o '0.0.0.0' -p 3000
```

起動が確認できたら、上部タブのPreviewから"Port 3000"を選択してsinatraのアプリケーションにアクセスします。

![sample-sinatra-115959_apne1_nitrousbox_com.png](https://qiita-image-store.s3.amazonaws.com/0/25585/205f2910-f224-4755-f9da-3afa9daa09ff.png)

"hello world"と表示されていれば成功です！

# Next Step(1): autopartsを使う
nitrous.ioでは"autoparts"というツールを使うことが出来ます。このautopartsを使って、RedisやMongoDBをnitrous.ioのbox内で起動してみましょう！

![Nitrous_IO.png](https://qiita-image-store.s3.amazonaws.com/0/25585/b6f67217-d089-00ac-a47b-d15e5a4ea006.png)


1. IDEの上部タブに、Autopartsがあるので、Manage Packagesを選択してください
2. redisやmongodbと入力し、installボタンをクリック

あとは待ってるだけで、自動的にMongoDBやRedisなどを使用することが出来ます。

SinatraからMongoDBやRedisを使用する方法は、こちらのSinatraの公式ドキュメントを参照してください。
[Sinatra Recipes - Databases - Mongo](http://recipes.sinatrarb.com/p/databases/mongo)


# Next Step(2): 他に何ができるか

Autopartsで扱えるのは、NoSQLだけではありません。PythonのpipやNode.jsなども利用することが出来ます。

他にもどんなものが使えるか、以下のAutopartsのドキュメントを参考にして、クラウドでのアプリケーション開発を楽しんでください！

[Installing Databases and Tools with Autoparts](http://help.nitrous.io/autoparts/)
libcurl.aをiOSとOS X向けにビルドする

すばらしいスクリプトがあったため、何もしなくてよかった

https://github.com/brunodecarvalho/curl-ios-build-scripts

デフォルトで使われるSDKバージョンが古いので新しいの指定する

```bash
./build_curl --sdk-version 7.1 --osx-sdk-version 10.9 --verbose 
````
iOSにおけるUIColorのカテゴリ管理

僕はiOSのプロジェクトを作った後には必ず、UIColor + App というカテゴリを作る。
そしてアプリで使う色はすべて、このクラスで管理する。
参考したのはbootstrapのless。

こんな感じで定義します。

```objc
@interface UIColor (App)
+ (UIColor *)accentColor;
+ (UIColor *)keyColor;
+ (UIColor *)appBackgroundColor;
+ (UIColor *)textColor;
@end
```

そして、アプリで使う画像なんかもUIImage + App を作ってやってます。
遅くなったvagrant-completionを速くする


(2014/05/28 追記)
homebrew-completions/vagrant-complationがupdateされて、hard cordされるversionが使用されるようになりました。
なので、この対策は不要になります。

----
今日(2014/05/23)、`$ brew upgrade vagrant-completion`を実行した後、vagrantの補完にやたらと時間がかかるようになったので調べてみた。

# 遅くなった理由
----
https://github.com/Homebrew/homebrew-completions/pull/20
https://github.com/Homebrew/homebrew-completions/pull/23
このへんのIssueの影響で、official bash completionを使うように変更された。
コメントにも書かれてるけど遅い。
補完をするたびに`vagrant --help`でcommand listを取得するから遅いっぽい。

# 対策
----
https://github.com/mitchellh/vagrant/blob/master/contrib/bash/completion.sh
はcommandsをhard cordしてあるので、homebrewで強制的にHEADのversionをinstallする。

```
$ brew unlink vagrant-completion
$ brew install --force --HEAD vagrant-completion
```

これでおしまい。
`vagrant --help`が速ければ、バージョンアップしても対応できるんだろうけど。
誰か上手くcacheしてくれるようなscriptに改修してくれないかな。
Redmineインストールメモ

* OS:ubuntu14.04lts

#MySQLをインストール，設定

```bash:
$sudo aptitude install mysql-server
```

インストール時にrootのパスワードを設定．
<br>


```text:/etc/mysql/my.conf
[mysqld]
character-set-server = utf8
[mysql]
default-character-set = utf8
```

my.confにちょっと追加して，`service mysql restart`する．



#apache2インストール，設定

```bash:
$sudo aptitude install apache2 libapache2-mod-passenger
```

apache2とrailsを公開するためにpassengerをインストール．
<br>

```text:/etc/apache2/apache2.conf
ServerName localhost
```

apache2.confの最後とかに追加しないと警告文が出るので追加．
<br>

```text:/etc/apache2/sites-enabled/000-default.conf
<Location "/redmine">
    RailsBaseURI /redmine
</Location>
```

後々シンボリックリンクしたときにRedmineにアクセスできるように追加．



#Redmineのインストール，設定

```bash:
$sudo aptitude install redmine-mysql
$sudo aptitude install redmine
```

redmine-mysqlとredmineをインストール．
インストール時にMySQLのパスワード入力とRedmineのデータベースのパスワードを入力．
インストール時に何やらデータベースを構築してくれているらしい．
<br>

```bash:
$gem install buinder
```
buinderをインストール
<br>

```bush:
$sudo chown -R www-data:www-data /usr/share/redmine
```

Redmineディレクトリの所有者権限を変更する．
<br>

```bash:
$sudo ln -s /usr/share/redmine/public /var/www
```
apacheのDocumentRootの/var/wwwにシンボリックリンクを張る．
<br>

終わったら`service apache restart`をして，localhost/redmineにアクセスしてみる．
Redmineのページが表示されたら
>ユーザ名: **admin**
>パスワード: **admin**

でログインできる．
MintLinuxの各種設定をDropboxで同期

別にMintに限らず複数のPC間の設定同期に使えるのですが、Mintの設定してる時のでそのメモということで。

## やり方

```shell-session
$ ln -s ~/Dropbox/rc/.ssh ~/.ssh
$ ln -s ~/Dropbox/rc/.bashrc ~/.bashrc
$ ln -s ~/Dropbox/rc/.bash_profile ~/.bash_profile
```

な感じで。もちろん、Dropbox内には適切なファイルを用意しておきましょう。
MYSQLでWHERE句など条件を指定してmysqldumpする

任意のレコードだけ手作業で別のDBへ移したいときとかに。

```shell-session
$ mysqldump --opt -u root -p データベース名 テーブル名 "-w where id=1" > dump.sql
# CREATE TABLEを書き込まない場合は-t,–no-create-infoオプション
```
Apacheで「MaxClients of 350 exceeds ServerLimit value of 256 servers」





`ServerLimit`が`MaxClients`より後に定義されていると「MaxClients of 350 exceeds ServerLimit value of 256 servers」のapache起動時にようなエラーが出る。

```txt:apache2.conf
<IfModule mpm_prefork_module>
    StartServers         10
    MinSpareServers      30
    MaxSpareServers      50
    MaxClients          350
    MaxRequestsPerChild 100
    ServerLimit         350
</IfModule>
```

解決法としては順番を変えるだけっぽい

```txt:apache2.conf
<IfModule mpm_prefork_module>
    StartServers         10
    MinSpareServers      30
    MaxSpareServers      50
    ServerLimit         350
    MaxClients          350
    MaxRequestsPerChild 100
</IfModule>
```
よくつかわれるHTTPリクエストコード

**2xx : Success**
200 : 成功

**4xx : Client Error**
400 : BadRequest（URLに変な間違いがあった時など）
403 : Forbidden（アクセス権限がないなど）
404 : NotFound（URIと一致するものがない）

**5xx : Server Error**
500 : Internal Server Error（サーバー内部でエラーが発生した）



※詳細はこちら
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/status.html
謎のGAEエラー No endpoint found ...


昨日触った時は動いていたアプリなのに、急に動かなくなった(というかAPIが反応しなくなった)ので確認してみたら、エラーが出てた。

	ブラウザ側 : Failed to load resource: the server responed with a status of 404 (Not Found)

	GoogleAppEngineLauncher側:
		WARNING  2014-05-23 02:35:08,615 api_config_manager.py:247] No endpoint found for path: _ah/api/discovery/v1/apis/xxxxxxxx/v1/rpc

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/44441/677bb62d-2f0c-d784-8af1-57ffb2a13793.png "ss1.png")


色々調べたけど原因特定できず。
時間が経てば治るっぽい(エラーが出なくなる)のと、正常に動いていたのを確認したあとにソース、設定なにも弄っていないので、google先生の問題か何らかの接続制限臭いんだよなあ。
ただ、エラーが読み込みに必要なモジュールが見つからないというものなので、制限にしてはおかしいし。

とりま、2回発生して2回目は11時頃発生して14時50分現在まだ治っていない。。。。

*** 追記 ***

やっぱりgoogle先生の問題だった。
gapi.client.load() の呼び出し時にGET先のURLに間違いがあるため、エラーとなる模様。
※ 通常 "http://appname.appspot.com/_ah/api/discovery/v1/apis/サービス名/バージョン/rpc"
　みたいなアドレスになるはずなのに、現状は
　"http://appname.appspot.com/_ah/api/_ah/api/....."
　のように"_ah/api"の箇所が2重になっている。

いつ治るんだろうか。。。。。

- [参考：code.google.com](https://code.google.com/p/google-api-javascript-client/issues/detail?id=147)
MojocliciousでTengを使う設定


# 概要

MojoliciousにはO/RマッパはないのでTengを導入する。

# Tengのインストール

cpanmでインストールする。
また、hookを設定するために、
Class::Method::Modifiersもインストールする。

```shell
$ cpanm Teng Class::Method::Modifiers
```

# Tengのファイルを作成する

lib/MyApp/DB.pmというファイルを作成する。
このファイルでは以下のような設定を記述する。

- Tengを継承
- 有効にしたいプラグインの設定
- hookの設定

プログラムは以下のような内容になる。

```perl:lib/MyApp/DB.pm
package MyApp::DB;
use parent 'Teng';
use DateTime;

# プラグイン有効
__PACKAGE__->load_plugin('Pager');
__PACKAGE__->load_plugin('Count');

# hookの設定
use Class::Method::Modifiers;

# updateメソッド時にupdated_atに現在時刻を自動入力する
before update => sub {
    my ($self, $table_name, $update_row_data, $update_condition) = @_;
    if ( !$update_row_data->{updated_at} ) {
        $update_row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    }
};

# insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before insert => sub {
    my ($self, $table_name, $row_data) = @_;
    $row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    $row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};

# fast_insertメソッド時にupdated_at/created_atに現在時刻を自動入力する
before fast_insert => sub {
    my ($self, $table_name, $row_data) = @_;
    $row_data->{created_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
    $row_data->{updated_at} = DateTime->now->set_time_zone('Asia/Tokyo')->strftime('%Y-%m-%d %H:%M:%S');
};


1;
```

hookの設定は、
全テーブルにcreated_at/updated_atのカラムが存在している前提の内容になっている。


次に、lib/MyApp/DB/Schema.pmを作成する。
このファイルでは以下のような設定をする。

- Schemaの設定
- inflate/deflateの設定

主にスキーマの設定をしていくが、
Teng::Schema::Loaderを使用している場合は、何も書かなくて良い。

```perl:lib/MyApp/Schema.pm
package AM::DB::Schema;
use Teng::Schema::Declare;
1;
```

スキーマ設定の書き方については、
以下のページが参考になる。
https://metacpan.org/pod/Teng::Schema::Declare

すでにDBにテーブルがあり、
スキーマ設定を一つ一つ書くのが面倒くさい場合は、
Teng::Schema::Dumperを使うと楽。
https://metacpan.org/pod/Teng::Schema::Dumper


# Tengを参照する設定

Tengに参照するhelperを設定する。

```perl:myapp.pl
app->helper(
    db => sub {
        my $c = shift
        $c->{___myapp_db} ||= do {
            my $dbh = DBI->connect(@config);
            Teng::Schema::Loader->load(
                namespace => 'MyApp::DB',
                dbh       => $dbh,
            );
        };
        return $c->{___myapp_db};
    }
);
```

この設定で、Controllerから$self->dbでTengを参照することができる。

```perl:myapp.pl
get '/' => sub {
    my $self = shift;

    $self->stash->{users} = [$self->db->search('users')];

    $self->render();
};
```

実際はController内でDBの処理は書かずに、
Modelに渡すなどしたほうが良い。

Teng自体の使い方は、以下のページが参考になる。

クイックスタート - Teng-Doc 0.01 documentation
http://walf443.github.io/teng-doc/quickstart.html
git-svn使用中にSVNサーバ移行によりChecksum mismatch発生


タイトル通りですが、git-svnでコードの管理をしている最中に、SVNサーバの移行が行われ、git-svn rebaseでChecksum mismatchが発生しました。SVNを使用しない！とすれば解決出来たかも知れませんが、まだSVNにコミットが発生する可能性があったため、git-svnが正常動作するようにしました。

#状況

##管理スタイル
SVNで管理している既存製品があり、自分一人で改修することになった。周りの了承を得てから、Gitへ移行しつつ、SVN側も少しは変更が入る可能性があったため一人でgit-svnを使用していた。

##SVNサーバ移行
WindowsXPで動いていたSVNサーバを、サポート切れ＆動作が重いので仮想マシンのCentOSへ移行。この際、旧WinXPと同じIPをCentOSに割り当てた。

##問題現象
`git-svn`時に必ずchecksumが不一致となり、うまく行かない。

```shell-session:shell
$ git svn rebase
Checksum mismath: hoge/trunk/hoge.cs xxxxxxxxxxx
expected: aaaaaaaaaaa
     got: bbbbbbbbbbb
```

stackOverflowで[こんなの](http://stackoverflow.com/questions/3156744/git-svn-rebase-checksum-mismatch)見つけたけど、多分根本的な原因が違う。サーバが変わって元のSVNリポジトリのチェックサムと合わなくなったと思われる(予想)。

#最終目標

git-svnが使用出来て、gitのログ、変更内容が正常に入っているgitリポジトリを作る。

#解決方法
移行後のSVNからは`git svn clone`でローカルリポジトリを作成出来るから、旧SVNサーバのgit-svnリポジトリ(旧リポジトリ)から新サーバのgit-svnリポジトリ(新リポジトリ)に変更を反映させ、以降は新リポジトリを使用する様にする。

##前提

* svnのトランクとmasterが一致
* 作業内容はmasterから分かれたAブランチにコミットされ、masterには未マージ

##手順

1. 新SVNサーバからgit-svnリポジトリを作成する。
1. 旧リポジトリのリモートとして、新リポジトリを追加する  
``` 
$ ls
oldrepository  newrepository  
$ cd oldrepository  
$ git remote add svn ../newrepogitory
$ git fetch svn   
```

1. 新リポジトリと旧リポジトリを合わせる。
この時点では新リポジトリと旧リポジトリでは、コミットが内容は同じでもコミットIDがちがうので別物として扱われるので、旧リポジトリのmasterを新リポジトリのmasterに変える。
`git rebase svn/master`
1. 旧リポジトリの変更が入ったブランチAをmasterからの派生に変える
```
$ git checkout A
$ git rebase master
```
1. 新リポジトリに旧リポジトリの変更(ブランチA)を送る
`git push svn A`

以上でgit-svnが正常に動作し、変更点も入った新リポジトリができました。
RSpec3の新しいFormatter APIについて

いよいよRSpec3時代が近付いてきました。
betaとかrcで新しいバージョンが出る度にハマり所を仕込んでくるので、そろそろ落ち着いて欲しい所です。

RSpec3は表記の変更だけでなくて内部実装をがっつりリファクタリングしてるため、Formatterの作りも結構変わっています。
カスタムFormatterを自分で作ってる人とかForkして改造する人以外にはあんまり関係無いかもしれませんが、一応どう変わったのか書いておきます。
(そもそもそういう人は自分でソース読むし……)


Formatterの基本となるクラスは`RSpec::Core::Formatters::BaseFormatter`というクラスです。
これは2系でも3系でも変わってません。

RSpec3系で大きく変わったのは、`Formatters.register`というメソッドを呼び出してFormatterクラスを登録しなければいけなくなった点です。

```ruby
class BaseFormatter

  # all formatters inheriting from this formatter will receive these notifications
  Formatters.register self, :start, :example_group_started, :close
```

引数になってるのはクラスを表す定数と、引っ掛けるイベントの名前です。
必要無いイベントは無視できるようになったのがありがたいですね。

そして、今までFormatterには直接exampleの情報や実行時間が渡されていました。
2.14だとこんな感じ。

```ruby
# BaseTextFormatter
def dump_summary(duration, example_count, failure_count, pending_count)
  super(duration, example_count, failure_count, pending_count)
  dump_profile unless mute_profile_output?(failure_count)
  output.puts "\nFinished in #{format_duration(duration)}\n"
  output.puts colorise_summary(summary_line(example_count, failure_count, pending_count))
  dump_commands_to_rerun_failed_examples
end
```

これが3系だと一旦通知情報をまとめる`Notification`というクラスにカプセル化されて渡されます。
そのため表示の整形なんかに利用していたメソッド全般がこっちに移っています。
なのでカスタムFormatterを作っていて`Formatter`クラスに整形のメソッドがあると思って呼び出しを行っているとぶっ壊れます。

3.0.0.rc1だとこんな感じ

```ruby
# BaseTextFormatter
def dump_summary(summary)
  output.puts summary.fully_formatted
end
```

超簡素になってますね。

ちなみに`Notification`は通知の種類ごとにいくつか種類があり、それぞれ必要な情報を詰めてメソッドを生やした`Struct`のサブクラスになっています。

RSpec3でカスタムFormatterを作る時には、このNotificationクラスを見ると、どんなメソッドが利用できるのかが大体把握できます。

しかし厄介なことに、この新しいFormatterのAPIは3.0.0.beta2と3.0.0.rc1の間で互換性がありません。
beta2の時点ではリファクタリングがまだ中途半端な状態でリリースされてたらしい。
3系を利用していても、自分がどのバージョンを利用しているか注意してください。
(rc1から大きく変わったりしないだろうな……とbkbkしている)

もしRSpec2系時代のFormatterを継続して利用したい場合は、`rspec-legacy_formatters`というgemを入れる事で対応できるはずです。

APIが全然違うので、2系と3系で両対応させようと思ったらバージョンで分岐してクラス差し替えるしか無さそう。
タグを指定してansible-playbookを実行する

# なぜタグ付けをするか
タスクが増えてくると毎回全タスクを実行していると時間がかかります。
ネットワークが遅いと待ち時間にイライラすることになり、
精神衛生的によくありませんね。

そこでタグ機能です。
タスクにタグ付けをしておけば、
対象のタスクだけを実行することができます。


# タグ付け
[ansibleで仮想マシンにnginxを入れる](http://qiita.com/kanuma1984/items/2f89142fc3cab702e84d)
上記をもとに説明していきます。

local.ymlがplaybookにあたります。
ではでは、local.ymlの中身を見てみましょう。

```yaml:local.yml
---
# file: provisioning/local.yml
 - name: Nginx Playbook # タスク名
  hosts: local          # 対象ホスト 
  sudo: yes             # sudoするか
  roles:                # 実際のタスクを記述しているディレクトリ
    - nginx
  tags:                 # タスクをタグ付け
    - nginx
```

一番下の部分がタグ付けです。
ここではnginxの個々のタスクではなく、
nginxという単位でタグ付けしています。

タグ付けは以上で完了です。
次は実際にplaybookを実行してみます。


# playbookの実行
タグを指定して実行する際のコマンドは以下になります。

```bash
$ ansible-playbook provisioning/local.yml --tags "nginx" -i provisioning/inventory/local

```

これで指定したタグのみ実行されます。
今はnginxのタスクしかありませんが、
増えてくると使える子になってきます。

以上です。
Unreal Media Serverを触ってみる

## 【Unreal Media Serverとは】
* Unreal Media Serverは、ライブとオンデマンド機能を提供するソフトウェアストリーミングサーバーです。RTMP, RTMPT, HLS, MPEG-TSなどプロトコルを処理し、Flash Player, Silverlight, Windows Media Player, Unreal Media Player, mobile devicesにコンテンツを引き渡す。
* [ホームページ](http://www.umediaserver.net/umediaserver/overview.html)
* [マニュアル](http://www.umediaserver.net/umediaserver/source.html)
 * PDF版マニュアルがないが、youtubeでいろいろな機能が紹介される
* インストールについて
 * [インストール方法](http://www.umediaserver.net/umediaserver/install.html)
 * [ダウンロード](http://www.umediaserver.net/umediaserver/download.html): Unreal Media Server, Unreal Live Server, Unreal Archival Server, Streaming Media Player

## 【VOD配信】
#### RTMP
* サーバー設定
 * サーバーを起動し、F1-HB.mp4ファイルをFile resourcesに作ったvirtualfolder（例えば、mediaroot）に保存する
* VLC Playerで再生
 * rtmp://ip_adr:5119/vod/mediaroot/F1-HB.mp4

#### HLS
* サーバー設定
 * Live broadcastsを右クリックし、「New Live Broadcast」をクリックし、「Rebroadcast live RTMP  / RTSP / ...」を選択する
 * Live broadcast aliasに、任意文字列を入力する(例：hlstest)
 * 「Local or multicast IP address: port to receive MPEG2-TS from」に、mpts://を選択し、ip_adr:1234を入力する
 * 「OK」ボタンを押す
 * 生成したhlstestを選択し、右クリックし、「Start HLS broadcasting」を選択する
 * web folder URLは、 *.tsファイルの絶対パス
 * web folder pathは、playlistと.tsファイルの保存場所
 * windows上に、apacheサーバーをインストールする
 * 上記のweb folder pathをhtdocs場所に設定する

* iphoneで再生
 * http://1ip_adr/hlstest.m3u8(例)
* VLC Playerで再生
 * http://ip_adr/hlstest.m3u8(例)

* 制限事項
 * broadcastで配信するので、seekできない

## 【RTMPでライブストリーミング（RTMP→RTMP）】
#### 環境と設定
* flash encoder
 * rtmp://ip_adr:5130/live/flashtest
* 5310は、ライブ用ポート
 * flashtestは、broadcastだ
* unreal media server
 * rtmp用broadcastを用意する
* unreal media player

#### 結果
* 遅延：　１ｓ
* VCL playerで、再生すると、遅延は、３s
* 安定性：　良い

##【ライブのために、RTSPでパブリッシュ】
* [このビデオ内容](https://www.youtube.com/watch?v=wLvlIwKXCG0&list=PLPN8tYSma7UgkwiUmSvzqasR5RLZfmlS0)より、IP cameraとRTSPで通信できることが分かった
* RTSPでパブリッシュは、encoder software(サーバー)が必要である
 * 参照：　[RTSP software and hardware servers, cameras and encoders. With Unreal Media Server configuration program, create a live broadcast of type "Rebroadcast live RTMP/RTSP/MPEG2-TS/MMS stream", select rtsp:// protocol and specify the RTSP URL. All major brand IP cameras, Orban Opticodec, VLC, Wowza server and any other RTSP-compliant servers are supported.](http://www.umediaserver.net/umediaserver/faq.html)


## 【その他の機能】
* 料金について
 * $695/5台
* windowsをしかサポートしないので、linuxより料金高い
 * 例： c3.xlarge
 * linux: $0.210/h
 * windows: $0.376/h
* レコード機能（WowzaのnDVR）
 * [参照](https://www.youtube.com/watch?v=d0jGR9BaHYQ&list=PLPN8tYSma7UgkwiUmSvzqasR5RLZfmlS0)
* DRM機能がなし
* [SDK](http://www.umediaserver.net/bin/UMediaSDK.zip)

## 【メリットvs.デメリット】
#### メリット
* 料金はWowzaよりやすく、RTMPとHLSのVOD配信をサポートする
* IP cameraに対して、RTSPパブリッシュできる

#### デメリット
* windowsをしかサポートしない
 * windows server 2008, windows server 2012を進め
 * windows7(開発環境かな)に、いろいろ不安定がある
* broadcastでHLS配信できたが、seekできない
* IP cameraとサーバーに、RTSP通信しかできない

## 最後
* ライブストリーミングに趣味がある方は、ぜひ試してみてください