OmniAICreator/Qiita-1.07M huggingface dataset:
自動生成ドキュメントを無料で Web 上で最新に保つ（Wercker + Doxygen + Heroku）

# はじめに

Doxygen を使うと，C/C++ をはじめとする様々な言語のコードから自動でドキュメントが生成できます．

ただ，Doxygen のドキュメント生成は，依存関係の画像なんかを生成するということもあり，結構遅いです．ビルドの度にやろうとは思えません．しかし，そこそこ新しいものがすぐ見れたら便利です．

そこで，push したら勝手にドキュメントを生成してどこかに置いておいてくれたら便利だなと思いませんか？これを，Wercker と Heroku を使って無料で実現します．

# やり方

## 自分のコード (GitHub / BitBucket)

Doxygen がドキュメントを生成できるように，`Doxyfile` を作って置いておきます．詳しくはググって下さい．

## Heroku

生成したドキュメントは Heroku に置かせてもらうことにしましょう．Heroku に登録し，アプリケーションを作っておきます．

## Wercker

CI サービスには Wercker を使いましょう．GitHub/BitBucket 両方使えて，プライベートリポジトリもいけるので便利です．準備として，Wercker に登録して，アプリケーションを作成し，自分の GitHub/BitBucket リポジトリに接続しておきます．

### wercker.yml

Wercker にやってもらうことは，リポジトリ直下の `wercker.yml` で指定します．テストなどを除いてドキュメントに関連がありそうな部分だけを取り出すと，以下のようになりました．

```lang:yaml
box: bendiken/cxx14@0.0.8
build:
  steps:
    - script:
        name: document
        code: |
          doxygen

deploy:
  steps:
    - script:
        name: installation
        code: |
          sudo apt-get update
          sudo apt-get install -y curl zip unzip
    - script:
        name: preparation
        code: |
          curl https://codeload.github.com/nulltask/heroku-static-provider/zip/master -o heroku-static-provider-master.zip
          unzip -o heroku-static-provider-master.zip
          cp -r html/* heroku-static-provider-master/public/
    - heroku-deploy:
        source_dir: heroku-static-provider-master/
        # cwd: heroku-static-provider-master/
```

ざっくり解説します．build では doxygen を実行します．deploy では，以下を行っています．

1. **installation**: まず必要なものをインストール．
2. **preparation**: Heroku にアップロードするディレクトリを用意．
    * Heroku に静的コンテンツを置くため，nulltask さんの [heroku-static-provider](http://null.ly/post/56856650450/heroku-3) を用意します．
    * `html` ディレクトリに生成された Doxygen ドキュメントをその中にコピー．
  
3. **heroku-deploy**: Wercker 公式 step の heroku-deploy を呼びます．

ちなみに:

* ビルドやテストも行いたい場合，build の steps に追加することになります．
* heroku-deploy で source_dir を使うと deprecated と言われるのですが，対応する機能は cwd で提供する予定とのことながらまだ提供されていないので，source_dir を使ってます．
* 今回は Doxygen のインストールされた box を使ってますが，box によっては Doxygen 自体のインストールが必要だと思います．

### デプロイ設定

Wercker のアプリケーション設定で Deploy Target を追加し，Heroku API Key を登録する必要があります．

1. Wercker のアプリケーション設定を開きます．
2. Add deploy target で Heroku を選び，API Key を登録します．
3. Auto deploy に master とか書いておきます．

## 完成

Auto deploy に指定したブランチに push してしばらくすると，`http://(名前).heroku.com` にドキュメントが現れていることでしょう．めでたし！


## Heroku から毎回 ssh key の追加の通知がきてウザい？

Wercker で ssh key を生成し，Heroku に登録します．

1. Wercker で ssh key を生成
2. Wercker の Deploy の設定で，ssh key を使う設定をします．
3. `wercker.yml` の `heroku-deploy` 下に `key-name: (ssh key につけた名前)` という行を追加します．
4. Heroku に公開鍵を追加します．
GW-450D をLMDE 17.1  「64bit」 <= ここ大事　にインスコするには

#今北三行

こちらの素晴らしいブログポストをご覧ください｡
この方のおかげでやっとうまく行きました｡ありがとうございました｡
id:kaiware-daikon様のおかげで無駄な買い物にならずすみました｡
(色々やったぶんの時間は無駄になったけど)
http://kaiware-daikon.hatenablog.com/entry/2014/10/01/210439

#何するとダメか
ふつーにやるとハマります｡64Bitなので｡(なにその初見殺し｡)

#1　(上司っぽく)あーあれだろ､公式から落とせば動くだろ?え?
ハマります｡Makeが通りません｡ググってソースを変更してもドライバを認識しません｡ 
include/os/rt_linux.hの一部を変更してやると通りますがデバイスは認識しません｡

#2 (イラついた上司っぽく)じゃあ[英語の記事だ｡](http://forums.linuxmint.com/viewtopic.php?f=49&t=191243)英語でググれよ
クソ時間がかかるだけでなんの効果もありませんでした｡

あとはblacklistconfにいれろだの､あれをこっちにコピーしろだの､デフォルトのドライバを変更して云々｡｡｡｡｡｡｡

#全部ダメ

自分のOSが64bitということを忘れていました｡
で､ドライバ｡ググったら出てきました｡
ここにある64bitのドライバーを使いましょう｡
それで終わりです｡
https://bitbucket.org/sanrath/mediatek_mt7610u_sta_driver_linux-64bit/downloads
UnityでAnimationClipをスクリプトから編集する

#以外にそのまんまの例が見当たらなかった
完全にスクリプトでAnimationClipを自動生成するのではなく、エディタで編集したAnimationClipをスクリプトから整形したかったのですが、成功するまでにちょっと手間取ったのでメモ。

#BoxColliderの形状アニメーションを小数点第三位までで丸めるエディタ拡張の例
```csharp
public class RoundBox : Editor
{
    [MenuItem("Edit/Round Box %#r")]
    private static void Do()
    {
        foreach(var i in Selection.gameObjects) {
            foreach(var clip in AnimationUtility.GetAnimationClips(i)) {
                foreach(var binding in AnimationUtility.GetCurveBindings(clip)) {
                    var curve = AnimationUtility.GetEditorCurve(clip, binding);
                    if(binding.propertyName.StartsWith("m_Offset.") || binding.propertyName.StartsWith("m_Size.")) {
                        for(int j = 0; j < curve.keys.Length; j++) {
                            var key = curve.keys[j];
                            key.value = ((int)(key.value * 1000.0f)) * 0.001f;
                            curve.MoveKey(j, key);
                        }
                        AnimationUtility.SetEditorCurve(clip, binding, curve);
                    }
                }
            }
        }
    }
}
```

#重要な点
既存のAnimationClipを編集するには以下の二点の手順が必要です。
* **AnimationCurve.MoveKey**でAnimationCurveにキーフレーム値の変更を知らせる
* **AnimationUtility.SetEditorCurve**でAnimationClipにAnimationCurveの変更を知らせる

上記のソースで言えば `curve.keys[j].value = newvalue;` などとしても文法エラーにはならず書けてしまうため、期待どおりに動作しそうに思ってしまうのですが、実際はMoveKey、SetEditorCurveを使用しないと値を変更しても無視されてしまいますよ、という話でした。

Keyframe は値型なので、`curve.keys[j].value = newvalue;` が無意味なのはまぁそりゃそうかな、という話なんですが、AnimationUtility.GetEditorCurveはAnimationCurveのコピーを返してるんですかね？
child擬似クラス

#連続する要素の最初もしくは最後の要素に指定をする方法
:first-child　最初に現れる要素にだけ適用
:last-child　最後に現れる要素にだけ適用

今回は最後の文字の下のボーダーを無しにする指定
HPのサンプル作成
↓一部

```lang:HTML
<div class="main-menu">
	<h3>革新的な技術</h3>
	<ul>
		<li><a href="#">環境への取り組みについての説明ページです</a></li>
		<li><a href="#">ecoキャンペーン開催中です</a></li>
		<li><a href="#">オフィスの移転に関して</a></li>
		<li><a href="#">最新商品のご紹介</a></li>
		<li><a href="#">新規サービスを開始しました</a></li>
		<li><a href="#">環境賞受賞に関してはこちらをご確認ください</a></li>
	</ul>
</div>
```
```lang:CSS
.main-menu{
	border:solid 1px #ebebeb;
	width:243px;
	height:340px;
	margin:15px 5px 0px 0px;
}
.main-menu h3{
	width:237px;
	height:30px;
	padding:7px 0px 0px 7px;
	margin:0px;
	font-weight:normal;
	font-size:15px;
	background:#eeeeee;
}
.main-menu ul{
	padding:0px 10px 0px 10px;
	margin:0px;
}
.main-menu ul li{
	border-bottom:dashed 1px #ebebeb;
	padding:12px 0px 12px 5px;
	font-size:12px;
	list-style-type:none
}
.main-menu ul li:last-child{
	border-bottom-style:none;
}
.main-menu ul li a{
	text-decoration:none;
}
```
~/.ssh/configについて

# .ssh/configとは

.ssh/configとは、ssh経由でのリモートサーバーの接続する際に利用される設定ファイルです。

# .ssh/configを書くと何が嬉しいか

たとえばですが、sshコマンドでリモート接続する際の一般的な記述は以下のようになります。

```zsh:
# 一般的な接続方法
ssh hoge.example.com

# ユーザー名を指定する場合は以下
ssh ユーザー名@hoge.example.com

```

　シンプルな接続の場合は上記のような簡易な記述で済むのでそんなに面倒臭くないですが、ポート番号がデフォルト(22)では無い場合、公開鍵認証で、鍵がデフォルトの名前ではなかったりした場合、コマンドが複雑になってしまいます。

```zsh:
# ポート名を指定する場合
ssh ユーザー名@ホスト名 -p ポート番号

# 公開鍵認証の場合
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵の名前

# ポート名及び、公開鍵認証の場合
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵の名前 -p ポート番号
```

こんな時に.ssh/configは役立ちます。

```.ssh/config
Host 任意の接続名(hoge)
HostName ホスト名
User ユーザー名
Port ポート番号
IdentityFile 鍵へのPATH(例えば~/.ssh/hoge.key)
```
このような設定を書いていると

```zsh:
ssh hoge
```

このような記述で接続出来るようになります。
私はHostの任意の接続名にプレフィックスとしてアンダーバーを2個付けています。Hostの補完が効いて便利です。(zshの場合。bashは知らない）

```
アンダーバーを2個つけてタブを押すと補完がでる
ssh __[TAB]
 __hoge			__fuga
 __bar
```


また、せっかく接続したのに一定時間操作しないとサーバーから接続が切断されてしまったりする事があります。

こんな時に.ssh/configは役立ちます。

```zsh:.ssh/config
# サーバーへ定期的(今回は60秒毎)に生きている報告をする(全体的に記述を有効にする場合は先頭辺りに書いておくといい)
ServerAliveInterval 60

# 個別に有効にしたい場合は、個別の設定に行を開けないで追記しておくといい
Host 任意の接続名(hoge)
    HostName ホスト名
    User ユーザー名
    Port ポート番号
    IdentityFile 鍵へのPATH(例えば~/.ssh/hoge.key)
    ServerAliveInterval 60
```

と設定した後で

```zsh:
ssh hoge
```

で接続すると、自動でssh_agentが生きている報告をするので、接続が切断されなくなります。

　簡単に接続出来て、細かい所に気配りが出来るなんて便利なので、使うしかないですよね。

# .ssh/configで困ること[追記あり]

## 設定ファイルが分割出来ない

追記内容
***

まず、以下のコマンドをそっと実行してみてください。

```zsh
$ ssh -V
```

戻ってきたバージョンが 7.3p1 以降の場合は、.ssh/config でincludeキーワードが利用できますので、そちらの検討をするのがいいかもしれません。
その場合、以下のURLが参考になるかと思います。

* `Include`キーワードで`ssh_config`を分割できるようになった件
    * http://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0

(追記ここまで)
***

　書くと大変便利になるのですが、.ssh/configは一つの設定ファイルで分割ができないので、接続先が増えていくと設定ファイルの管理がとたんに面倒になります。

### なので設定ファイルを分割してみた

設定ファイルが分割出来ると何が嬉しいかというと、

* 1つ1つの設定ファイルの行数を短く押さえられるので管理が若干楽になります
* プロジェクト毎に設定ファイルを分割出来るので、プロジェクトメンバーで共有できたりするしれません
* 終わったプロジェクトや使わなくなった設定を削除しやすくなるので、設定ファイルに使わなくなった設定が残りづらくなります


この問題にはいろいろな方が立ち向かっているので、以下のURLなどが参考になります。

* sshコマンド用の拡張関数を書く
    * http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/
* rubyでssh用のコマンドを作る
    * http://blog.katty.in/4936
* aliasで分割した設定ファイルをマージするコマンドを用意する
    * http://qiita.com/tumf/items/73e495e1274bc25acf5f

自分の場合は、

* http://qiita.com/tumf/items/73e495e1274bc25acf5f

の記事の方法が手軽なので利用させてもらっています。(tmufさんありがとうございます)

手順としては、以下のようになります。

* 鍵の置き場所と分割した設定ファイルの置き場所を作成します

```
$ mkdir ~/.ssh/keys
$ mkdir ~/.ssh/conf.d
$ chmod 700 ~/.ssh/keys ~/.ssh/conf.d
```

* 分割した設定ファイルを~/.ssh/conf.dに鍵を~/.ssh/keysに配置します

```zsh:
$ ls -al ~/.ssh/keys ~/.ssh/conf.d

~/hoge/.ssh/conf.d:
config  <-- 共通の設定を書く用の設定ファイル
# -- 以下個別の設定ファイル --
hoge.conf
fuga.conf
bar.conf
foo.conf

~/.ssh/keys:
# -- それぞれの鍵 --
hoge.key
fuga.key
```

* .zshrcなどにsshの設定を結合する用のコマンドエイリアスを作成します

```zsh:.zshrc
alias ssh-config-update="cat ~/.ssh/conf.d/common-config ~/.ssh/conf.d/*.conf > ~/.ssh/config"
```

* .zshrcなどを再読み込みして、~/.ssh/configを更新します(~/.ssh/configは書き換えられてしまうので、注意が必要です）

```zsh:
$ source ~/.zshrc
$ ssh-config-update
```
こんな感じで、比較的手軽に設定ファイルを分割出来るようになります。


# まとめ

.ssh/configは便利なので、アクセスする接続先が多い方は是非利用してみて下さい。
zshはとてもいいです。
5分でWEBアプリケーションの開発をスタート（［Docker = FuelPHP + ACCON］リリース）

# 最新の手順は【[Qiita:ACCONの導入と起動確認](http://qiita.com/maemori/items/93ca5074b28d1ed012ea)】をご参照ください。

# 概要

## FuelPHPをベースとしたWebアプリケーション開発・実行基盤をリリース（MITライセンス）  
  DBアクセスとアクセス制御が必要なWebアプリケーションの開発が従来と比べ、開発に掛かる工数が90〜95%OFF! [^1]

# 構成
 * ベースコンテナイメージ [ubuntu-nginx-phpfpm-redis-mysql](https://registry.hub.docker.com/u/accon/ubuntu-nginx-phpfpm-redis-mysql/ "accon/ubuntu-nginx-phpfpm-redis-mysql")
 * [FuelPHP 1.7.3](http://fuelphp.jp/ "FuelPHP")
 * [ACCON 1.0](https://kurobuta.jp/books/book/manual/accon/ "ACCON") （データベースの利用とアクセス制御が必要なWebアプリケーションの基本機能を提供するモジュール）

-----
# 【 [Dockerfile一式は、こちらからダウンロード](https://kurobuta.jp/download/view/17 Dockerfile一式) 】

# イメージの取得
```bash:
docker pull accon/fuelphp-accon:1.00
```

-----

# 1.ローカルに「Data Volume（共有ディレクトリ）」の「workspace」と「data」 ディレクトリの作成
```bash:
mkdir -p ~/Develop/release/accon/data-volume/workspace
mkdir -p ~/Develop/release/accon/data-volume/data
```
 * パスは任意ですが、OSのユーザディレクトリ配下である必要があります。
 * 初回起動時に上のディレクトリにプロジェクトが設置されます。
  * workspace：FuelPHPのプロジェクトが配置されます。（Xdebugのポートは9001）
  * data：データベースの作成用SQLが配置されます。（起動時に実行）

  初回起動は多少の時間が掛かります。起動後、ブラウザでアクセスするとサンプルアプリの稼働を確認できます。

# 2.起動（バックグラウンドでFuelPHP+ACCONを起動）
```bash:
docker run -d \
 -v ~/Develop/release/accon/data-volume/data:/develop/data:rw \
 -v ~/Develop/release/accon/data-volume/workspace:/develop/workspace:rw \
 -p 80:80 \
 -p 443:443 \
 -p 3306:3306 \
 -t -i \
 -h project-server-01 \
 --name project-server-01 \
 accon/fuelphp-accon:1.00
```

## 2.1.OSのみ起動（FuelPHP+ACCONを、後で手動で起動）
```bash:
docker run -d \
 -v ~/Develop/release/accon/data-volume/data:/develop/data \
 -v ~/Develop/release/accon/data-volume/workspace:/develop/workspace \
 -p 80:80 \
 -p 443:443 \
 -p 3306:3306 \
 -t -i \
 -h project-server-01 \
 --name project-server-01 \
 accon/fuelphp-accon:1.00 \
 /bin/bash
```

### 2.2.コンテナにアタッチを行いアプリケーションの起動
```bash:
docker attach project-server-01
#サービスの起動
/etc/service/fuelphp-accon
```
 * ログアウト：[ctrl+p] → [ctrl+q]

-----
## コンテナのスタート
```bash:
docker attach project-server-01
```

## コンテナのストップ
```bash:
docker attach project-server-01
```
-----
# Dockerfile
```
##
# fuelphp-accon
#
#  用途: FuelPHP 開発・実行基盤
#  構成: image[ubuntu-nginx-phpfpm-redis-mysql] + FuelPHP(1.7.3) + ACCON(1.0)
#
# Part of the ACCON.
#
# Copyright (c) 2015 Maemori Fumihiro
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
#
# @version    1.00
# @author     Maemori Fumihiro
# @link       https://kurobuta.jp
FROM accon/ubuntu-nginx-phpfpm-redis-mysql:1.00
MAINTAINER Maemori Fumihiro

# インストール
RUN mkdir -p /develop/archive
## FuelPHPの設置
RUN curl -k http://fuelphp.com/files/download/34 > /develop/archive/fuelphp.zip
RUN unzip /develop/archive/fuelphp.zip -d /develop/archive/workspace
RUN mv /develop/archive/workspace/fuelphp-1.7.3 /develop/archive/workspace/project

# 設定
ADD module/fuelphp-accon /etc/service/fuelphp-accon
RUN chmod +x /etc/service/fuelphp-accon
# HTTPはHTTPSへリダイレクト
ADD conf/default /etc/nginx/sites-available/default

# PORT
EXPOSE 22 80 443 3306 9001

# 起動
CMD ["/etc/service/fuelphp-accon"]
```
概要、利用方法は後日。

-----

[^1]: 開発対象の特性、外的要因、開発者の熟練度により変動します
RPiイメージをSDへRestoreする


久々に引っ張り出したRPiが動作しない。
HDMIをつなげて画面を見てみると、Ext4がエラーしている。

...ということで、SDをリストアする羽目になった。

ちなみに環境はMacBookです。

## SDカードのデバイス名をチェックする


```shell
diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   ...
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk4
   1:                 DOS_FAT_32                         15.7 GB    disk4s1
```

ここでは、
/dev/disk4がそれっぽい。これを間違うと代償が大きいので注意。

## マウントをはずす
(ここが抜けていたので追記）

```shell
diskutil umountDisk /dev/rdisk4
```


## SDカードへ書き込む

カレントフォルダに書き込むべきDisk imageファイル(restore.dmg)があるものとします。

```shell
sudo dd if=restore.dmg of=/dev/rdisk4 bs=1m
```

これをすると、しばらくの間、だんまりになってしまい本当に仕事をしているのか不安になります。
of=/dev/rdisk4 ではなく、of=/dev/disk4 でもいいようですが、実効時間がかなり遅くなるようなので、r付きにしましょう。（実際、数十倍違う感じでした。印象論だけど）

音沙汰がなくて不安な時は、Ctrl + T で状況を確認できます。こんな感じ。

```shell
load: 2.52  cmd: dd 44227 uninterruptible 0.02u 5.03s
7147+0 records in
7146+0 records out
7493124096 bytes transferred in 615.751572 secs (12169070 bytes/sec)
```


## 書き込み完了後
SDカードを取り外します。

```shell
diskutil eject /dev/disk4
Disk /dev/disk4 ejected
```

## 書き込んだSDでRPi起動後
よりサイズの大きなサイズへのSDカードでは、書き込んで起動後に

```shell
sudo raspi-config 
```
でパーティション拡張を行えば良いっぽい。
これは、初回のRPi用のSDカード作成時と同じか。そりゃそうか。


## 参考
- [RPiイメージをSDへBackupする](http://qiita.com/urakarin/items/f8d7785b8b1ddee6ff39)
- [Raspberry Pi の SD カードの準備がスッキリと納得できるようになるかもしれない話(少しだけコンピュータ・アーキテクチャっぽい話も)](http://qiita.com/UedaTakeyuki/items/4f97240b5fd7fc8a4d0b)
なぜ、〜か？に答えてくれていて、非常に納得感あります。
- [Raspberry PiのSDカードをコピーする](http://shokai.org/blog/archives/7943)

おわり。
shebang なしのスクリプトを setuidgid 経由で実行して “exec format error"

daemontools でハマったことと、その回避策の共有です。

※(追記) daemontools に限った話ではなかったので、タイトル変えました。

## 動作環境

* CentOS 6.2

## エラー発生状況

`/service/app-foo/run` は以下の内容:

```bash
#!/bin/sh
exec 2>&1
set -e
exec sh -c 'exec \
    setuidgid app \
    /home/app/foo/start
  '
```

`/home/app/foo/start` は以下の内容:

```bash
APP_ROOT="/home/app/foo"

source /etc/profile.d/rbenv.sh

cd $APP_ROOT

bundle install

exec bundle exec foo
```

(追記)
今回のエラーは、以下のようなもっと単純なスクリプトでも再現しました。

```bash
echo foo
```

### 正常に動作する操作

以下は期待通り動作します。

* app ユーザで `/home/app/foo/start` をシェルから実行
* 同 app ユーザで `sudo /home/app/foo/start` をシェルから実行

### エラーになる操作

```bash
% sudo /service/app-foo/run
setuidgid: fatal: unable to run /home/app/foo/start: exec format error
% sudo sh -x /service/app-foo/run
+ exec
+ set -e
+ exec sh -c 'exec \
    setuidgid app \
    /home/app/foo/start
  '
setuidgid: fatal: unable to run /home/app/foo/start: exec format error
```

`sudo svc -u /service/app-foo` しても上がりません。
同じエラーが multilog に吐かれ続けます。

## 回避策

`/home/app/foo/start` に shebang `#!/bin/sh` を足しました。
この結果、`run` スクリプトの手動実行も、daemontools 経由の起動もできるようになりました。

めでたしめでたし。

## 原因についての推測

`setuidgid` 経由だとシェルスクリプトを適当に解釈することができなくなるようです。
shebang をつけなくても、上記の `run` スクリプトから `setuidgid app` を外したところ、`run` スクリプトを手動実行することができました。

`setuidgid` をつけてスクリプトを動かす場合、shebang が必要になると思われます。
Devise + Gmail で認証メールを送信する

###1)アプリケーションに以下の記載を追加

```config/initializers/devise.rb
  config.mailer_sender = 'hogehoge@gmail.com'
```

```config/enviroments/production.rb
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  port: 587,
  user_name: 'hogehoge@gmail.com',
  password: 'password',
  authentication: 'plain',
  enable_starttls_auto: true
}
```

###2)googleから「不正なログインがブロックされました」のメールが来た場合は本文中の以下より、トラブルシューティングを行う

```
このログインがご自身によるもので、アクセスできない場合は、http://support.google.com/mail?p=client_login でトラブルシューティングの手順を行ってください。 
```
Github Bitbucket から Gitbucket に移行する手順


Gitで管理している数が多くなってきたので自サーバーに設置したGitbucketへ移行することになった。そのときの手順。

```
git remote add origin https://example.com/git/username/project_name.git
```

でいけるものとおもってたけども一度設定してあると別のコマンドで設定しないといけないっぽい。

originの設定確認

```
git config -l
```

[gitのリモートリポジトリoriginのURLを変更する](http://d.hatena.ne.jp/kanonji/20110829/1314596493)

の通りに

```
git remote set-url origin https://example.com/git/username/project_name.git
```

originの設定確認

```
git config -l
```
変更されているか確認して

```
git push -u origin master
```
bashでCamelCaseとsnake_caseの変換

# bashでCamelCaseとsnake_caseの変換

力技。

※末尾の改行が消えちゃうので注意

```bash
function snake_case() {
    hoge=$(while read -s -n 1 c; do
        case $c in
        [A-Z] ) echo -n _${c,};;
        *) echo -n $c;;
        esac
    done)
    # 頭にも "_" がつくので除外
    echo -n ${hoge:1}
}

function Camelize() {
    IFS='_' read -a hoge
    for c in ${hoge[*]}; do
        echo -n ${c^}
    done
}
```

```bash:usage
echo "this_is_snake_case_sentence" | Camelize | snake_case
```
ubuntu 14.04でldap経由でのsudoを使う

久しぶりのみゅみゅです。
ldapユーザがsudo使うって普通にsudoersに書けば終わりかと思ったらそうは問屋がおろしませんでした。

## 1.sudo-ldapのインストール

```shell-session
root@raidtest:~/ldapbackup# export SUDO_FORCE_REMOVE=yes
root@raidtest:~/ldapbackup# apt-get install sudo-ldap
root@raidtest:~/ldapbackup# export SUDO_FORCE_REMOVE=no
```
※ exportしないと怒られる

これだけでした。
（スキーマ入れろとかあったけど、sudoersはldap経由じゃないのでいいのです）
らくちんらくちん
Apple WatchKit もくもく勉強会 #7 に参加してきました


# はじめに
* 6月28日(日)に開催されたAppleWatch勉強会に参加してきました
    * イベント
        * https://coedo-dev.doorkeeper.jp/events/25732
    * 関連サイト（公開グループ AppleWatch watchOS Developers Japan）
        * https://www.facebook.com/groups/944846408876597/

# やったこと
* 利用方法の検討
    * 概要
        * 購入者同士での利用方法の意見交換
    * そのとき出た意見
        * メーラーなどに入力短縮機能を付ければ活用できるか？

* watchOS2について
    * 入れた人（1名）
        * （まだ使って時間が経ってないので）あまり違いが分からない
        * ちょっと重くなった気がする
        * 特定の画面表示時にまだバグが残っている
    * 入れてない人（他全員w）
        * watchOS2は、まだ不安定みたいなので上げれない
        * 一度上げたら戻せるかわからないので上げれない
            * 工場出荷状態に戻せると思うので大丈夫だと思うが、、、
        * **iPhoneのOSをOS9betaにしないといけないので入れれない**
            * 他アプリのリリースをしているので上げれない
        * 私はiTune実行環境が自宅にしか無かったので上げれませんでした、、、（その場で上げたかったｗ）

* その他
    * バーコード、QRコードなどの読込／作成用のSDKがiOS7から標準で提供されている
        * http://www.lumber-mill.co.jp/notes/reviews/140813_barcode.html
    * xcodeのシミュレーターに画像をコピペする方法があった
        * http://dev.classmethod.jp/smartphone/iphone/copy-and-paste/

# まとめ
* 今回は、watchOS2に対する抵抗もあり、あまりAppleWatch関連の開発を進めることは出来ませんでした。
    * 私自身、まだApplewatchの良い使い道が思いつかずに悩んでいます。。。
* 各自が開発したアプリの情報などから新たなアイデアや情報が得られるのが良かったです。
    * バーコード関連のアプリ作成などが作りやすくなっていた点
    * AppleStoreにリリース手段など（以前と販売手続きなどが大分異なっていた点）
* もくもく勉強会は、時間が長くて腰を落ち着けて作業や話し合いが出来るのでとても良いと思います。
MacでSSH Git

##設定ファイル作成
###下記の内容で ~/.ssh/config ファイルを作成します

ssh://git@proj.dev.atomb.it/var/repos/admin.git
ssh://git@proj.dev.atomb.it/var/repos/app.git


```
Host admin
    HostName proj.dev.atomb.it
    User hoge
    IdentityFile ~/.ssh/id_rsa.hoge
    Port 22

Host app
    HostName 192.168.1.222
    User hogehoge
    IdentityFile ~/.ssh/id_rsa.office.server
    Port 22
```


```
git clone ssh://proj.dev.atomb.it/home/repositories/remote.git
```

###~/.ssh/config はすべてのSSH接続で共有

```
ssh admin
```
HipChat APIのaccess tokenを作成する。


# 概要
HipChat APIではAccess Tokenが必要です。
作成の仕方を和訳しつつまとめました。

# access token
[Getting started](https://www.hipchat.com/docs/apiv2)の右側にあるようにHipChat Rest API version2を使うにはpersonal access tokenが必要となります。
以下のURLからログインして取得します。
https://www.hipchat.com/sign_in?d=%2Faccount%2Fapi
access tokenには以下のようにscopeがあります。

|scope名|説明|
|:----:|:-----:|
|Administer Group|グループのアドミン権限|
|Administer Room|Roomのアドミン権限|
|Manage Rooms|roomの作成/更新/削除権限|
|Send Message|1:1 private chatにメッセージを送る権限|
|Send Notification|Roomに通知する権限|
|View Group|グループやグループのuser/roomの情報を取得する権限|
|View message|roomとこのaccess tokenを持っている人に対するprivate chatを取得する権限|
|View Room|roomの情報と参加者を取得する権限。ただし、履歴は取得できない|

ページの下からLabel名を入力し必要なScopesを選択してCreateしましょう。
なお、ScopesとあるようにShiftを押しながら複数のScopeを選択可能です。
![create_new_token.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/f6ad3451-8fd6-da01-7ae3-f1165e801d8d.jpeg)
Tomcatでreloadable="false"にしてもweb.xmlを変更すると読み込み直しが発生するんですね... autoDeployの設定も必要です。

タイトルそのままですが...

#web.xmlを保存しなおしたらログにリロードのメッセージがでて、あれ？reloadble="false"にしてなかったっけ？と思った次第。

説明を見直すと、

|Attribute|Description|
|:--------|:----------|
|reloadable|Set to true if you want Catalina to monitor classes in /WEB-INF/classes/ and /WEB-INF/lib for changes, and automatically reload the web application if a change is detected. This feature is very useful during application development, but it requires significant runtime overhead and is not recommended for use on deployed production applications. That's why the default setting for this attribute is false. You can use the Manager web application, however, to trigger reloads of deployed applications on demand.|

と書いてありました。
https://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Context_Parameters


reloadable="true"時の更新確認対象は/WEB-INF/classes/以下と/WEB-INF/lib以下って書いてあります。


ん？/WEB-INF/web.xmlがどうこうとは書いてないような...？

# web.xmlの更新も自動チェックしないようにするには

conf/server.xmlにある\<Host\>の設定でautoDeploy="false"にするとweb.xmlを書き換えても勝手に（自動で）リロードされません。

|Attribute|Description|
|:--------|:----------|
|autoDeploy|This flag value indicates if Tomcat should check periodically for new or updated web applications while Tomcat is running. If true, Tomcat periodically checks the appBase and xmlBase directories and deploys any new web applications or context XML descriptors found. Updated web applications or context XML descriptors will trigger a reload of the web application. The flag's value defaults to true. See Automatic Application Deployment for more information.|

https://tomcat.apache.org/tomcat-8.0-doc/config/host.html#Common_Attributes

ちょっと古いバージョンですがここにも書いてありました。
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/deployer-howto.html#Deploying%20on%20a%20running%20Tomcat%20server

> /WEB-INF/web.xml ファイルが更新された場合、 Web アプリケーションを再配備。


(2015/07/01追記)
チェックボックスを選択すると has_may through がどんどん増える系のフォーム


```rb:モデル
class Post < ActiveRecord::Base
  has_many :taggings
  has_many :tags, through: :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :post
end

class Tag < ActiveRecord::Base
  has_many :posts
  has_many :posts, through: :taggings
end
```
こういう一般的な many to many の関係があって、Post 作成時に Tag も一緒に選んで設定したいみたいなとき。
結論から言うと ```Post.new(tag_ids: [1,2])``` というように```関連先の名前_ids```を配列で渡せばよしなにやってくれる。

```rb
[1] pry(main)> Post.new(tag_ids: [1,2]).taggings
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags`  WHERE `tags`.`id` IN (1, 2)
=> [#<Tagging id: nil, post_id: nil, tag_id: 1, created_at: nil, updated_at: nil>, #<Tagging id: nil, post_id: 1, tag_id: 2, created_at: nil, updated_at: nil">]
```

なのでこれをフォームで受け渡せるようにすればいい。

```slim:ビュー
 h1 記事作成
 = form_for @post do |f|
   = f.collection_check_boxes :tag_ids, Tag.all, :id, :name do |tag|
     label.checkbox-inline
       = tag.check_box
       = tag.object.name
```

ストロングパラメーターで配列受け渡せるように

```rb:コントローラ
def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to posts_path
  else
    render :new
  end
end

private

def post_params
  params.require(:post).permit(tag_ids: [])
end
```
Mac 版 Oracle SQL Developer のTNS接続が出来ない


## 環境
- MacOSX
- SQL Developer
    - バージョン4.1.1.19.50　
    - 2015年6月22日更新
- Oracle InstantClient
    - Version 11.2.0.4.0 (64-bit)

## 事象
TNS接続したら以下のエラーが流れた。
```no ocijdbc12 in java.library.path ```

以下の手順により、解決
1. Preferences -> データベース -> 拡張 へ移動
2. Oracle Clientの使用 へ ✔
3. $ORACLE_HOME を記入
4. OCI/Thickドライバの使用 へ ✔
5. Tnsnamesディレクトリ へ $TNS_ADMIN を記入
6. OK

解決

(嫌いだけど) 良きOracle Lifeを
c++ builder > dialogのOKボタン押した時のクローズ処理のキャンセル > ModalResult = mrNone;


```txt:動作確認
C++ Builder XE4
```

ダイアログの処理でOKボタンを押した時、ある条件でダイアログを閉じたくない時がある。

    ModalResult = mrNone;
とすれば閉じるのをキャンセルできる。


[参考@SO]( http://stackoverflow.com/questions/3616695/conditionnaly-prevent-ok-button-from-closing-dialog )
poderosa で vim 使っても xterm-256color にならなかった


単にTERMへ設定されていなかっただけ。
Poderosaに限らないことだった。

```shell-session
$ echo $TERM              
xterm
```

`~/.bashrc` や `~/.zshrc` へ入れておこう

```bash

if [ -e /usr/share/terminfo/x/xterm-256color ]; then
        export TERM='xterm-256color'
else
        export TERM='xterm-color'
fi

```

良き poderosa Lifeを
AWS CLIからBucket内の全容量を確認する


CLI 最高
```
$ aws s3 ls s3://mybucket --recursive --human-readable --summarize
 2013-09-02 21:37:53   10 Bytes a.txt
 2013-09-02 21:37:53  2.9 MiB foo.zip
 2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
 2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
 2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
 2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
 2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
 2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
 2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
 2013-09-02 21:32:57  398 Bytes z.txt

 Total Objects: 10
    Total Size: 2.9 MiB
```
コマンド長いので、以下のように省略可能。

```
$ aws s3 ls s3://mybucket --recursive --human --sum
```
設定內容在 UIButton 中對齊位置


# 可以設定的對齊屬性

- `contentHorizontalAlignment` (型別為 `UIControlContentHorizontalAlignment`)
- `contentVerticalAlignment` (型別為 `UIControlContentVerticalAlignment`)

在一個初始化後的按鈕 instance （實例，實體），這兩個 property 的預設值分別是 `UIControlContentHorizontalAlignmentCenter` 以及 `UIControlContentVerticalAlignmentCenter` 。

也就是 UIButton 預設所看到的垂直及水平置中的文字或圖片。

# 型別說明

各自對齊方式的常數：

## 垂直 - [UIControlContentVerticalAlignment](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/#//apple_ref/c/tdef/UIControlContentVerticalAlignment)

``` objc
typedef enum {
   UIControlContentVerticalAlignmentCenter  = 0,
   UIControlContentVerticalAlignmentTop     = 1,
   UIControlContentVerticalAlignmentBottom  = 2,
   UIControlContentVerticalAlignmentFill    = 3,
} UIControlContentVerticalAlignment;
```

依序分別是 **置中**(Center) 、 **置頂**(Top) 、 **置底**(Bottom) 、 **佈滿**(Fill) 

## 水平 - [UIControlContentHorizontalAlignment](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/#//apple_ref/c/tdef/UIControlContentHorizontalAlignment)

``` objc
typedef enum {
   UIControlContentHorizontalAlignmentCenter = 0,
   UIControlContentHorizontalAlignmentLeft    = 1,
   UIControlContentHorizontalAlignmentRight = 2,
   UIControlContentHorizontalAlignmentFill   = 3,
} UIControlContentHorizontalAlignment;
```

依序分別是 **置中**(Center) 、 **置左**(Left) 、 **置右**(Right) 、 **佈滿**(Fill)
[Rails 4.x] JBuilderがなんとも使い辛いので、ActiveModelSerializerとActiveRecord::Serializationのto_jsonでなんとかやってみた 1

# はじめに

JBuilderのシンタックスになんともしっくりこないので、簡単なrender jsonでなんとかしていました。

```rb
render json: { hoge: @hoge }, status: 200
or
render json: @hoge, status: :ok
```

でも、複雑なjsonを整形する必要が出てくると、as_jsonなどを使ってmodel側で指定したり、controller内で整形用のメソッドを用意したりと、コードが見づらくなってしまいました。

JBuilderを使えば、いい感じに収まりがつきましたが、どうもシンタックスが嫌でした。

そこで ActiveModelSerializersを使うことにしました。

# ActiveModelSerializer

## 概要

app/serializers/以下にjsonの整形を担当するコードを書いていきます。
JBuilderの様な特別なDSLを使うことはなく、Railsのコードでよく見る書き方を用いて書けます。

## Install

```rb:Gemfile
gem 'active_model_serializers'
```

## Usage

```rb
$ rails g serializer hoge(model_name)
```

```rb:app/serializers/hoge_serializer.rb
class HogeSerializer < ActiveModel::Serializer
  # write attributes you want to render of the Model
  attributes :profile, :updated_time, :url, :stadium_address, :tel

  # write association you want to use in this rendering json
  has_many :friends

  # delegation code
  delegate :current_user, :to => :scope

  # Configuration of each attributes
  def profile
      "#{object.name} #{object.address}"
  end

  def updated_time
    object.updated_time.to_i
  end

  def url
      "http://www.nfl.com/#{obje.ctcity}"
  end

  def players
      object.players.collect { |player| [player.name, player.number, player.age]}
  end

  def tel
      if current_user.is_admin?
        {:tel_num => object.tel_num, :available => object.avaliable_range, :costs => object.costs}
      else
        {}
      end
  end

end
```

### configuration of output of association

make a serializer of the model. and write config code.

```rb
$ rails g serializer friends
```

```rb:app/serializers/friend_serializer.rb
class HogeSerializer < ActiveModel::Serializer
  attributes :name, :photo
end
```

### Controller

```rb:hoge_controller.rb

~~

def show
  ~~
  
  render json: @hoge, status: :ok
end
```

if you want to use various serializer at a controller...

```rb
  render json: @hoge, status: :ok, serializer: HogeSerializer
``` 

# One More Thing

指定するステータスコードは、例えば200でも:okでもいいかと思いますが、どちらにしても全部把握しておいたほうがいいので、以下をチェック。

[StatusCode](http://guides.rubyonrails.org/layouts_and_rendering.html)


# References

- ActiveModelSerializers
  - http://eewang.github.io/blog/2013/07/23/using-activemodel-serializers-to-build-great-json-interfaces/
  - http://railscasts.com/episodes/409-active-model-serializers?language=ja&view=asciicast
  - http://y-yagi.tumblr.com/post/63976647257/active-model-serializers
- ActiveRecord::Serialization
  - http://apidock.com/rails/ActiveRecord/Serialization/to_json
  - http://d.hatena.ne.jp/gutskun/20120601/1338517632
Rails 4.2以降限定 ブレイクポイントを超簡単に貼る。

rails4.2で実装されたweb consoleを使います。

実行中のコードをとめて変数の中をみることが目的です。

やり方は超簡単です。

rubyのエラーをおこすだけです。

例えば下記のようなコードでSettingsの値を実行中にみたいとします。

```rb
  #railsの変数をjavascriptのメモリ領域に展開
  def userSessionData()
    html = '<script type="text/javascript">'
    html += "window.userData = {};"
    html += "window.setting = {};"
    html += "window.setting.apiurl = '#{Settings.apiurl}';"

    session[:userinfo].each{|key, value|
      html += "window.userData.#{key} = '#{value}';"
    }
    html += '</script>'

    return html
  end
```

適当にエラーを起こして止めます。

```rb
  #railsの変数をjavascriptのメモリ領域に展開
  def userSessionData()
    html = '<script type="text/javascript">'
    html += "window.userData = {};"
    html += "window.setting = {};"
    html += "window.setting.apiurl = '#{Settings.apiurl}';"

とまれ！！

```

するとエラー画面が表示されます。

![スクリーンショット 2015-06-30 15.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/5565/41b44355-2fb3-dccc-1ae9-cda6ac08ee19.png)

株に表示されたWeb ConsoleにSettingsとうつとSettingsが評価され中身をみることができます。

![スクリーンショット 2015-06-30 15.32.48.png](https://qiita-image-store.s3.amazonaws.com/0/5565/dff126df-5d65-08e3-6888-6c52bafdda6a.png)

ちなみにerbの中に<%= console %>と書けば常にコンソールをHtml上にだすこともできます。

実行後の結果でよければこちらでみてもいいと思います。

ちゃんとしたやり方はきっとあるのですが、
面倒なのでこれでデバックしています。
YOLPでCenterMarkControlの表示／非表示のやり方

Windows7でYOLP使って簡単な地図を表示するWEBページを作っています。
質問は、
  ymap.addControl(new Y.CenterMarkControl({
  　　visibleButton: true,
  　　visible: true
  }));
みたいにして地図に追加した地図中央の赤い四角いマークを、状況によって
表示・非表示を切り替えたいのですが、show/hideっていうメソッドが
あるのでしょうか？調べたのですが良く分かりません。
具体的なコードの記述方法をお教え下さい。
Jenkinsから見えるulimitの結果がおかしい場合

# 前提

jenkinsを公式リポジトリからダウンロードして実行している場合。

# 問題

`/etc/security/limits.conf` などを弄ってjenkinsユーザから触れるulimitの値を変更することができる。一例としてはこんな感じ。

```:/etc/security/limits.conf
jenkins   soft   nofile  655360
jenkins   hard   nofile  655360
```

その結果を確認するには

```shell-session:
 $ sudo su jenkins
 $ ulimit -a
```

で可能である…と思われるが。
jenkinsの実行中で `ulimit -a` した場合と結果がズレる事がある。

```
+ ulimit -a
(前略)
nofiles              8192  # <= 655360 に設定したはずなのに 8192に 減ってる
(後略)
```

これではjenkinsで想定通りの実行ができなくて不便である。

# 原因

そういう時は `/etc/default/jenkins` の中身を疑ってみる。

```config:/etc/default/jenkins
(前略)
# OS LIMITS SETUP
#   comment this out to observe /etc/security/limits.conf
#   this is on by default because http://github.com/jenkinsci/jenkins/commit/2fb288474e980d0e7ff9c4a3b768874835a3e92e
#   reported that Ubuntu's PAM configuration doesn't include pam_limits.so, and as a result the # of file
#   descriptors are forced to 1024 regardless of /etc/security/limits.conf
MAXOPENFILES=8192
```

jenkins起動時にここの数値でulimitの値を上書きするので結果が狂う。
詳細に関しては `/etc/init.d/jenkins` スクリプト中に書いてある。

```config:/etc/init.d/jenkins/
    (中略)
    # If the var MAXOPENFILES is enabled in /etc/default/jenkins then set the max open files to the 
    # proper value
    if [ -n "$MAXOPENFILES" ]; then
        [ "$VERBOSE" != no ] && echo Setting up max open files limit to $MAXOPENFILES
        ulimit -n $MAXOPENFILES
    fi
    (後略)
```

# 対策

1. `/etc/default/jenkins` から該当行を削除する
2. `/etc/default/jenkins` の `MAXOPENFILES` の値を自分好みにする
ターミナルのサイズが変わったのに getmaxyx() の返す値が変わらないとき

ターミナルをリサイズしても `getmaxyx(stdscr, y, x)` の返す値は変わらない。つまり `stdscr` は自動的にリサイズされない。

`stdscr` を現在のターミナルのサイズに合わせるには `endwin()` してから `initscr()` する。

```c
endwin();
initscr();
getmaxyx(stdscr, y, x);
```
なぜfirefoxで$_FILES['userfile']['type'] のzip判定に躓いていたのか

アップロードファイルのMIME-Type問題。
実際引っかかったのは初めて。
網羅は当然大変なので、自分が引っかかった箇所のみ

# <i class="fa fa-cubes"></i> 概要

* firefoxからのzipファイルアップロードが弾かれていた
* IEを使うか、拡張子を消すことで回避していたらしい
* 原因はPHPのzipファイル判定
* MIME-Typeがfirefoxのみ`application/x-zip`
* ブラウザによって扱いが違うから注意
* そもそも、書き換え可能な箇所なので鵜呑みにするな

# :dog2: きょうの嫌コ(ード)

```php

if (  !eregi("x-zip-compressed"	, $_FILES['userfile']['type'])
   && !eregi("octet-stream"		, $_FILES['userfile']['type'])
   && !eregi("force-download"	, $_FILES['userfile']['type'])
{
   $echo = "zipファイルではありません。";
}

```

~~`ereg`使っている~~
~~if文わかりづらい→[ド・モルガンの法則]~~[^1]
**firefoxからのアップロードがzip扱いされない**

# <i class="fa fa-flask"></i> 検証

## コード

```html:form.html

<!DOCTYPE html>
<html>
  <body>
    <form enctype="multipart/form-data" action='post.php' method='post'>
      <input type='file' name='userfile'/>
      <input type='submit' />
    </form>
  </body>
</html>

```


```php:post.php

<?php
var_dump($_FILES['userfile']['type']);

```

## 結果

| ブラウザ                             | zip                          | 拡張子削り                    |
|:------------------------------------|-----------------------------:|:----------------------------:|
| IE 11                               | application/x-zip-compressed | application/x-zip-compressed |
| Chrome 43                           | application/x-zip-compressed |     application/octet-stream |
| firefox 38                          | application/x-zip            |     application/octet-stream |
| Win10 build 10130 Spartan 15[^2]    | application/x-zip-compressed | application/x-zip-compressed |

仮にIEでzipファイルの判定に失敗していたら、「拡張子消せば通る」という迂回策も失敗していたわけか…

# <i class="fa fa-flag-checkered"></i> 結論

`!eregi("x-zip"	, $_FILES['userfile']['type'])`
足せばいいんじゃないでしょうか
`!eregi("x-zip-compressed"	, $_FILES['userfile']['type'])`
も内包しちゃうと思いますが

[ド・モルガンの法則]: https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87
[^1]: `&&`よりも`||`が楽。`!`が少ないほうが楽。…と思っている
[^2]: 今日のbuild 10158 で正式にEdgeになったそうです
WBX®FP3A2(KAVOと互換)エアースケーラー

●歯のクリーニング、歯周治療、根管治療のファンクションを備えています。
●歯科ユニットに接続し、使用します。
●冷却システムが付き、使用する際に本体の温度を確保しています。
●歯肉、エナメル質に傷を付けずに歯石、歯垢、茶渋等を落とすことができます。
![A2 KAVO - 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/77721/a99f49cd-c251-bd63-8b14-fcdbbc748499.jpeg)

![A2 KAVO - 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/77721/e62d78c5-437e-6a36-4090-5da800e2623f.jpeg)

![20150630141547.jpg](https://qiita-image-store.s3.amazonaws.com/0/77721/fc020dca-a59b-5e9d-3ff6-e0e714e91e59.jpeg)


2ホールと4ホールの仕様がございます。ご使用中のユニットのホースによって、適当なタイプをお選びください。
https://www.dentalzz.com/category-63-b0-%E3%82%A8%E3%82%A2%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%BC.html
Android デフォルトで起動するアクティビティの設定

Android アプリケーションで最初に起動するアクティビティ（デフォルトのアクティビティ）を設定する方法。

```xml:AndroidManifest.xml
<activity ...>
    <!-- 目的のアクティビティ内に -->
    <!-- ここから -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- ここまでを追加 -->
</activity>
```

以上。なんだかググラビリティ低いのでメモ的に記事化しておく。

## 参考
- [How to set default activity for Android application](http://www.mkyong.com/android/how-to-set-default-activity-for-android-application/)
Swift マルチスレッドでの同期処理（synchronized）

## Swiftでの同期処理

[What is the Swift equivalent to Objective-C's “@synchronized”?](http://stackoverflow.com/questions/24045895/what-is-the-swift-equivalent-to-objective-cs-synchronized)

### GCD を使う

```swift
let lockQueue = DispatchQueue(label: "com.test.LockQueue")
lockQueue.sync {
    // critical section code
}

```

### objc_sync_enter / objc_sync_exit を使う

```swift
public func synchronized(obj: AnyObject, closure: () -> Void) {
    objc_sync_enter(obj)
    closure()
    objc_sync_exit(obj)
}

synchronized(self) {
    // critical section code
}
```

私は後者を採用しました。
なぜ iPhone の画像は Android の画像よりもずっと高品質なのか

原文は「 https://github.com/bither/bither-android-lib/blob/master/REASON.md 」

-----

## なぜ iPhone の画像は Android の画像よりもずっと高品質なのか

Android と iPhone との比較は多くの点で議論されており、どちらがより良いかは、Android の画像の質は iPhone とくらべてずっと劣るという点を除けば、未だ結論が出ていません。Facebook、Twitter、Instagram 等どれを使っていても、写真をとって、フィルタをかけて、ソーシャルネットワーク上に公開すると、いつも Android から投稿される写真は画質が劣化しています。しかし何故でしょう？

私達は昨年の間調査をし、そしてついに、Google が犯したほんのちょっとしたミスが原因であることを突き止めました。それは本当にちょっとしたミスでしたが、その影響はすべての画像を扱うアプリケーションに波及するほど大きく、現在に亘っても影響が続いています。

問題は、`libjpeg`です。

`libjpeg`といえば、数多くのオープンソースプロダクトでも使用されており、Android も画像の圧縮に使っています。Android のソースコードを見ると、Android では、`libjpeg`を直接使用せず、`Skia`という画像処理エンジンをベースに使用していることがわかります。`Skia`は Google がメンテナンスをしているエンジンで、必要な機能はすべて実装されており、Google や他の多くのプロダクト（Chrome、Firefox、Android など）で広く使われています。`Skia`はうまく`libjpeg`をカプセル化しており、だれでも簡単に画像処理ライブラリを作ることが出来るようになっています。

`libjpeg`を使って圧縮を行うとき、非常に重要な`optimize_coding`というパラメータがあります。ドキュメントによると、このパラメータについて以下のような説明があります。
> ```
> 
> boolean optimize_coding
>     TRUE causes the compressor to compute optimal Huffman coding tables
>     for the image.  This requires an extra pass over the data and
>     therefore costs a good deal of space and time.  The default is
>     FALSE, which tells the compressor to use the supplied or default
>     Huffman tables.  In most cases optimal tables save only a few percent
>     of file size compared to the default tables.  Note that when this is
>     TRUE, you need not supply Huffman tables at all, and any you do
>     supply will be overwritten.
> ```

`optimize_coding`を`TRUE`に設定すると、より多くのディスクスペースと時間を要するために、デフォルト値は`FALSE`とされていることがわかります。

ドキュメントも普通ですし、`libjpeg`も安定していることから、何も問題はなさそうに見えます。しかし、このドキュメントが 10 年以上前に書かれた、ということにもっと注目すべきです。その頃は、メモリも計算能力もとても限られていました。しかし、今日のコンピュータやスマートフォンが持っている計算能力を鑑みると、これはもはや問題ではなくなりました。その代わりに、私達は画質と画像サイズについてより注目していくべきなのです。

Google の`Skia`を担当しているエンジニアは、このパラメータを設定しませんでした。つまり、`Skia`の`libjpeg`は`optimize_coding`が`FALSE`のままです。そして`Skia`はこのパラメータを完全にライブラリに隠蔽してしまったため、`Skia`の外からこのパラメータを設定することすらも出来ません。このことが大きな問題となり、私達は大きなファイルサイズと劣化した画像を強いられています。

私達は`optimize_coding`を様々な画像でテストしました。圧縮後の画質を同じにしようとしたとき、`optimize_coding`を`TRUE`にした時に比べて、`FALSE`にした時のファイルサイズは 5〜10 倍に膨れ上がりました。この違いはとても大きなものです。

私達はまた、iOS と Android での Jpeg 圧縮の差異についても検証しました。同じ原画像に対し、おなじ画質レベルを保つ場合、Android のほうが 5〜10 倍のファイルサイズを必要とします。

結果は明らかです。Apple は`optimize_coding`と`Huffman tables`についての重要性を良く知っており、Google はそうではなかったということです(Apple は独自の Huffman table アルゴリズムを使っており、画像圧縮についてより多くのチューニングをしているようです)。

最終的に、私達は Android の提供する画像圧縮機能を使わないことにしました。その代わりに、自分たちでビルドした`libjpeg-turbo`をベースとしたライブラリを使うことにしました(libjpeg-turbo もパフォーマンスが改善されています)。これによって、私達はこれまでより 5〜10 倍スペースを確保し、同じかよりよい画質を得ることができました。これは誰もがすべきことだと思います。

-----

という訳で、Android の `libjpeg` が何故腐っていると言われ続けているのかが良くわかる記事の紹介でした。
VPSにdocker環境構築

# 目的

vps上にdockerの環境を作りたいと思います。

# 前提

[さくらのVPS](http://vps.sakura.ad.jp/)を使っています。
OSはカスタムインストールで `CentOS 7` にしています。

ほぼ自分用メモなので不親切なのはご了承下さい。

# はじめにセキュリティ確保

ここでは詳しくやりませんが、セキュリティの確保のため、
最低限として、rootで作業しないように一般ユーザを作成します。

* リモートの作業(root)
    1. 一般ユーザの作成
        1. `useradd mimura`
        1. `passwd mimura`
    2. 一般ユーザが`sudo`できるようにする
        * `visudo` で設定
    3. root のsshログインを止める
        * `vi /etc/ssh/sshd_config`
            * `PermitRootLogin no` を設定
        * `systemctl restart sshd`
* ローカルの作業
    1. ローカル環境で鍵認証に使うキーを生成する
        * macの場合は`ssh-keygen`
    2. 生成したキー（公開鍵のほう）をvpsへアップロード
        * `scp .ssh/genereted_key myvps.vs.sakura.ne.jp:/home/mimura/.ssh/authorized_keys`
        * chmod も忘れずに
            * $ chmod 700 ~/.ssh
            * $ chmod 600 ~/.ssh/authorized_keys
    3. ローカルに`.ssh/config`を作っておけば便利
* リモートの作業(一般ユーザでしかログインできない)
    1. sshの鍵認証を設定する
        * `sudo vi /etc/ssh/sshd_config` で下記のように編集
            * `RSAAuthentication yes`
            * `PubkeyAuthentication yes`
            * `AuthorizedKeysFile .ssh/authorized_keys`
                * ↑アップロードしたファイルパスにする
    2. sshdを再起動
        * `sudo systemctl restart sshd`
    3. ローカルから鍵認証でログインできるのを確認
    4. sshのパスワード認証を止める
        * `sudo vi /etc/ssh/sshd_config`
            * `PasswordAuthentication no`
    5. sshdを再起動
        * `sudo systemctl restart sshd`

> ここでsshd_configの設定に失敗すると、ssh接続できなくなってしまいどうしようもなくなってしまいますが、さくらのVPSではWebブラウザのコントロールパネルからコンソール機能が利用できるので、いざというときもリカバリー可能です。

セキュリティ確保には他にもいろいろやった方がよいことがありますが、
ここでは一般ユーザで作業するまでにして先に進みます。

# dockerのインストール

1. まずupdate
    * `sudo yum update`
2. dockerのインストール
    * `sudo yum install docker-io`
3. インストールされたのを確認
    * `sudo systemctl start docker`
    * `sudo docker info`
        * 状態が表示されればOK

# 一般ユーザでdockerが使えるようにする

1. dockerグループを追加します。
    * `sudo groupadd docker` 
2. 一般ユーザをdockerグループへ追加
    *  `sudo gpasswd -a mimura docker`
3. dockerデーモンの再起動
    * `sudo systemctl restart docker`
4. 一般ユーザの再ログイン
    * `Ctrl+D`からの`ssh`
3. 一般ユーザで動くことを確認
    * `docker info`


ここまでで環境ができました。

# Moby Dockを表示してみる

* `docker run docker/whalesay cowsay 'Congrats!!!'`
または

* `docker run -t -i docker/whalesay bash`
    * `# cowsay 'Congrats!!!'`

環境構築としては以上になります。
OpenGrokの日本語化

# OpenGrokの日本語化

1. ctagsの日本語版のインストール。
1. opengrok.jarを実行するときに、-Dfile.encoding=UTF-8の追加。

下記ページを参考。
http://discypus.jp/wiki/?%A5%BD%A5%D5%A5%C8%2FOpenGrok
> java -Dfile.encodng=UTF-8 -jar lib\opengrok.jar ...(略)

OpenGrokのWindowsへのインストールは下記を参考にした。
[OpenGrokをWindowsで動かす MRSa's blog/ウェブリブログ](http://mrsa.at.webry.info/201403/article_1.html)
※ただし、2015/06現在でのOpenGrokの安定版のブランチ名は、0.12-stableの模様。

2015/07/16 追記 0.12.1がリリースされた模様。
http://opengrok.github.io/OpenGrok/
sublime text > 2つめ以降のフォルダをFODLERSに表示する > フォルダをドラッグする

FOLDERSとしてある特定のフォルダを表示する機能がある。
2つめのフォルダを表示したいと思い「File > Open Folder...」でフォルダを選択すると、別ウィンドウが立ち上がってしまう。

エクスプローラで表示されるフォルダを FOLDERSという表示部分にドラッグすれば、今まで表示していたフォルダに加えて、追加したフォルダも表示できるようになる。

メニューからは該当の処理は見当たらなかった。
vagrant-berkshelf プラグインをwindows環境で動作させる方法

## Encoding::InvalidByteSequenceError の問題について

Windows上のvagrant 環境でvagrant-berkshelf プラグインをインストールすると、コマンドプロンプトから `vagrant up` を実行した際に以下のエラーが出ます。

```bash
The stdout and stderr are shown below:

    stdout:
    stderr: C:/opscode/chefdk/embedded/lib/ruby/gems/2.0.0/gems/json-1.8.2/lib/j
son/common.rb:155:in `encode': "\xA0" on Windows-31J (Encoding::InvalidByteSeque
nceError)
```

このエラーは、 `C:\opscode\chefdk\bin\berks.bat` に「set RUBYOPT=-EUTF-8」の記述を追加することで回避できます。
かなりワークアラウンドっぽいですが...
しかし、Chef Development Kit はそれほどアップデートが激しくないので、おそらく問題ないと思います。

修正前 (berks.bat)

```bash
  @ECHO OFF
  "%~dp0\..\embedded\bin\ruby.exe" "%~dpn0" %*
```

修正後 (berks.bat)

```bash
  @ECHO OFF
  set RUBYOPT=-EUTF-8
  "%~dp0\..\embedded\bin\ruby.exe" "%~dpn0" %*
```

なお、Berkshelf をコマンドプロンプトから直接実行した場合も、同様のエンコーディングに関するエラーになりますが、こちらはコントロールパネルの「システム」から環境変数を設定することでも回避可能です。

参考URL:
http://crosawassant.hatenablog.com/entry/2015/02/06/121321

## Vagrantfile の chef.cookbooks_path が上書きされてしまう問題について

vagrant-berkshelf プラグインを有効にすると、Vagrantfile の  `chef.cookbooks_path` が上書きされ、強制的に cookbooks ディレクトリ のみを参照するようになります。
通常 Chef を単体で使用している場合は site-cookbooks ディレクトリ配下にクックブックを記述していくので、結果として vagrant-berkshelf プラグインを有効にした途端に、`Cookbook not found` エラーが頻発することになります。
この問題の解決は、Berkshelf の流儀？に沿って cookbooks ディレクトリに全てのクックブックをまとめるような運用フローにするか、またはこの辺りのPRが取り込まれるのを待つしかないようです。
https://github.com/berkshelf/vagrant-berkshelf/pull/266
coreosでmountをする

ぐぐってみると、unitではなく、下記公式サイトにあるようなcloud-config.ymlで解決する方法が多いです。

https://coreos.com/docs/cluster-management/setup/mounting-storage/

systemctlを利用してでも可能であり、備忘録として残します。

---

## 対象

* mount用のデバイス（すでにmkfs済）
  /dev/xvdb

* mount先のディレクトリ（すでにmkdir済）
  /data

## 1. /etc/systemd/system/data.mountを作成する

```bash
sudo vim /etc/systemd/system/data.mount

# 編集内容を標準出力（①）
cat /etc/systemd/system/data.mount
```

①の出力結果

```
[Unit]                      
Description=GlusterFS Data Directory
                            
[Mount]                     
What=/dev/xvdb              
Where=/data                 
Type=ext4                   
Options=defaults,noatime,noexec
                            
[Install]                   
WantedBy = multi-user.target 
```

## 2. systemctlを利用して、data.mountを開始する

```bash
cd /etc/systemd/system

# 定義ファイルを有効にする（①）
systemctl enable data.mount

# ユニットを開始する（②）
systemctl start data.mount

# ユニットの状態確認（③）
systemctl status data.mount
```


③のコマンドの出力結果

```
● data.mount - GlusterFS Data Directory
   Loaded: loaded (/etc/systemd/system/data.mount; enabled; vendor preset: disabled)
      Active: active (mounted) since Tue 2015-06-30 04:43:12 UTC; 9min ago
          Where: /data
          What: /dev/xvdb
          Memory: 268.0K
                                                                                                                                                                                                             
        Jun 30 04:43:12 ip-10-200-0-110.nasa.future.co.jp systemd[1]: Mounting GlusterFS Data Directory...
        Jun 30 04:43:12 ip-10-200-0-110.nasa.future.co.jp systemd[1]: Mounted GlusterFS Data Directory.
```

## 3. rebootして再ログイン後に、ちゃんとmountされてるかをみてみる

```bash
reboot

ssh -i hogehoge.pem core@*.*.*.*

# mountされてるか確認（①）
df -h
```

①の出力結果を確認

```bash
Filesystem      Size  Used Avail Use% Mounted on       
devtmpfs        2.0G     0  2.0G   0% /dev          
tmpfs           2.0G     0  2.0G   0% /dev/shm         
tmpfs           2.0G  284K  2.0G   1% /run          
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvda9       28G   45M   28G   1% /             
/dev/xvda4      985M  349M  585M  38% /usr          
tmpfs           2.0G     0  2.0G   0% /media        
tmpfs           2.0G     0  2.0G   0% /tmp          
/dev/xvdb       985G   72M  935G   1% /data         
/dev/xvda6      108M   56K   99M   1% /usr/share/oem  
```

行けました。
Rails アソシエーション 多対多の関係

#多対多モデル
今回例とする多対多モデルは
ArticleテーブルとTagテーブルです。
「記事(Article)は複数のタグも持つことが出来、
タグ(Tag)は複数の記事につけることが出来る」
という状態を考えます。

##多対多モデルの定義

```rb:article.rb
class Article < ActiveModel::Base
  has_many :article_tags
  has_many :tags, through: :article_tags
end
```

```rb:tag.rb
class Tag < ActiveModel::Base
  has_many :article_tags
  has_many :tags, through: :article_tags
end
```

```rb:article_tag.rb
class ArticleTag < ActiveModel::Base
  belongs_to :article
  belongs_to :tag
end
```

throughによって「経由」を定義しています。

#多対多モデルの使用

throughを使うことで下記のようなことが出来るようになります。

##多対多関係を利用してレコードの作成
```rb
article = Article.create(title: "railsのマスター法")
article.tags.create(name: "rails")
```
これでタグを記事に関連付けて生成することが出来ます。

##リレーションを追加する
```rb
article = Article.create(title: "railsのマスター法")
article.tags.create(name: "rails")

tag = Tag.create(name: "ruby")
article.tags << tag
```

##リレーションを利用してレコードを取得する
```rb
article = Article.create(title: "railsのマスター法")
article.tags.create(name: "rails")

tag = Tag.create(name: "ruby")
article.tags << tag

article.tags #記事についたタグのレコードを取得出来る。
```