OmniAICreator/Qiita-1.07M huggingface dataset:
c++ builder XE4, 10.2 Tokyo > sound > beep音を鳴らす > Beep();

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

Beep音の鳴らし方。

参考 http://www.geocities.jp/asumaroyuumaro/program/tips/beep.html

```Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Beep(); // 標準Beep音

	Sleep(1000);
	MessageBeep(MB_ICONASTERISK);
	Sleep(1000);
	MessageBeep(MB_ICONEXCLAMATION); //警告
	Sleep(1000);
	MessageBeep(MB_ICONHAND); //システムエラー
	Sleep(1000);
	MessageBeep(MB_ICONQUESTION); //問い合わせ
	Sleep(1000);
	MessageBeep(MB_OK); //一般の警告音
}
```

参考ページには
`messageBeep()`と小文字の`m`始まりの関数名だが、XE4ではエラーとなった。
`MessageBeep()`と大文字の`M`始まりの関数名にしたら動いた。

<hr>
(追記 2016/01/07)

自分が聞いた音の感じ

- MB_ICONEXCLAMATION > やわらかい音
- MB_ICONHAND > 重い音
- MB_OK > 軽い音
Python で、LibreOffice アプリを使う（3）ライブラリの追加

libreoffice の python にパッケージを追加するのは結構やっかいです。
**windows** の場合だけですが、そこそこ入れることができました。
環境は、
LibreOffice 5.0.3
Window 7 


# windows の libreoffice python にパッケージを追加してみる

### setuptools を入れる。
* libreoffice インストール、マクロが動く(jre インストール）が前提

* libreoffice の python にpath を通す　(下記を、環境変数 PATH に追加)

 * C:\Program Files (x86)\LibreOffice 5\program


* 32bit 版 openssl を入れ、PATHを通す(libreoffice の python は、32bitなんで、64bit はだめみたい)

```
ダウンロード
http://slproweb.com/download/Win32OpenSSL_Light-1_0_2d.exe
PATH
C:\OpenSSL-Win32\bin

```

* setuptools をインストールする

```
https://bootstrap.pypa.io/ez_setup.py
を メモ帳（でもいい）を使って、適当な場所に、ez_setup.py を保存。
python ez_setup.py を管理者権限で実行し、easy_install にPATHを通す
C:\Program Files (x86)\LibreOffice 5\program\python-core-3.3.3\Scripts
```

### 管理者権限で、easy_installしてみた（パッケージもいろいろあって、インストールできたり、できなかったり）
 * selenium
 * pymysql
 * ipython

ipython がはいったので、ぐっと楽です。

pip は入るけど、動きません。

### sqlite もいれておく

参考にしたのは、http://p--q.blogspot.jp/2014/03/libreoffice30pythonsqlite.html

* python3.3.5 をインストール https://www.python.org/downloads/release/python-335/
手作業で必要なファイルを移動します。あとは、下記の作業をします。

```
C:\Python33\Lib\sqlite3
C:\Python33\DLLs\_sqlite3.pyd
を
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
へコピー

C:\Python33\DLLs\sqlite3.dll
を
C:\Program Files (x86)\LibreOffice 4\program
へコピー。
```
文系エンジニアのための機械学習の勉強法

## 対象読者
* とりあえずスクリプト言語の経験がある
* 高校まで数学の勉強していた人
* これから機械学習、とりわけディープラーニングを学んでいこうとしている人

## 前置き
非理系のための勉強法は下記のブログが有名かと思います。
> [数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路](http://bit.ly/1RqtKjf)

自分も上記ブログを参考に勉強を行ってきました。

しかしながら、改めて自分の勉強を振り返ってみるに、よりよい勉強方法を提供できると思いましたので、ここに記しておきます。

## 機械学習を学ぶにあたって必要な知識
機械学習を学ぶにあたっては、下記の3つの知識が必要になってきます。

* **数学**
* **機械学習**
* **プログラミング言語**

機械学習の理論を学ぶために数学の知識が不可欠であり、その理論を実装するためにプログラミング言語が必要になってきます。

## 数学
数学に関しては、**微分、線形代数、統計**の知識が必要になります。
下記を一通り学べば、最低限、必要な数学の知識はつくかと思います。

* [わかりやすい経済学教室　ぴーすけ講座](http://psuke.hungry.jp/mathindex.html)（サイト）
* [線形代数　行列と行列式 (大学入門ドリル) ](http://www.amazon.co.jp/dp/4501625503)（書籍）
* [線形代数 ベクトルと固有値 (大学入門ドリル)](http://amzn.to/1HfkD4n)（書籍）
* [図解・ベイズ統計「超」入門 あいまいなデータから未来を予測する技術](http://amzn.to/1XhPmzq)（書籍）
* [マンガでわかる統計学　素朴な疑問からゆる～く解説](http://amzn.to/1SRlI2T)
（書籍）

## 機械学習系
これまで様々な書籍やサイト、動画、スライドなどを見てきましたが、まずは下記の書物を学習していくと良いと思います。

* [はじめての機械学習](http://amzn.to/1O9q5XR)（書籍）
* [ITエンジニアのための機械学習理論入門](http://amzn.to/1Yn65nx)（書籍）
* [深層学習](http://amzn.to/1lbSDUH)（書籍）

一応、日本で一番技術系の書物が揃っていると言われる新宿図書館の紀伊国屋書店で全て立ち読みしたりもしてきたので、書物に関しては、上記以上に分かりやすいものは現在ないのでは？と思っています。
（機械学習系の書物はどんどん出てきているので、出版情報は常にウォッチしておくことをお勧めします）

## プログラミング言語

**python、c++のいずれかの知識が必要**になります。

機械学習系のブログはほとんどpythonで記載されていますし、ライブラリやフレームワークはpythonとC++で記載されています。

しかしながら、まずはpythonを学ぶと良いでしょう（※）。

* 普通に記述するならpython
* プログラムを高速化したいのであればC++

だからです。

pythonに関しては、**python + numpy + matplotlib** を学ばなくてはなりません。
> numpy・・・行列演算ライブラリ
> matplotlib・・・グラフ描画ライブラリ

これらはほぼほぼセットで使用されます。

（※）pythonではなくmatlab/octaveでもよいかもしれません。研究機関では必ず使われていますし、上記のpythonのライブラリはmatlabを理解していれば簡単に理解し使うことができます。
matlabに関しては[「最新MATLABハンドブック」](http://amzn.to/1FuSP9W)をお勧めします。

## 勉強の心構え
機械学習は気軽に勉強することができません。
難しい式や専門用語の連続で**きっと心が折れるでしょう**。

そこで、心を折れなくするための心構えを紹介しておきます。

### 概要を捉えてから細部を理解していく

他の人が書いた大きなプログラムを理解していく時と同じで、**大から小を理解していく**ことは効果的です。

* まずは言葉で意味を理解し、そのあとに、式を理解していく
* ところどころ式の変形の意味がわからないけど、気にしない

その時その時では大雑把な理解でも、量をこなせば理解していけます。
機械学習系の情報はたくさん揃ってきているので、とにかく量をこなせば、部分的な理解を補っていくことができるはずです。

### 言葉への抵抗をなくす
機械学習系の書物などを読んでいると、必ず、複雑な数式や記号、よく分からない専門用語に接することになります。そうすると、読むこと自体が辛くなってきて機械学習に拒絶反応していくことになると思います。

**まずは読み方を調べて発音できるようにするところからスタートしましょう。**
これで言葉への慣れが生まれ、そんなに文章を読むのが辛くなくなっていきます。

それで文章をまずは読み、全体感を把握していくことができると思います。

### とりあえずソースを写経する
ソースから理解の促進が図られる時もあります。
書物を読んで意味がわからなかったら、ブログなどを参照してソースを写経してみましょう。
もちろん処理の流れを理解してから行わないと意味がありませんが、はじめは数式の意味は理解できなくても良いでしょう。
これも概念や言葉への抵抗をなくすことにつながります。

## サイト紹介
最後に勉強の際に参考になるかもしれないサイトを紹介しておきます。

* [スタンフォードの機械学習講座](https://class.coursera.org/ml-005/lecture)
* [ニューラルネットワークと深層学習](http://nnadl-ja.github.io/nnadl_site_ja/index.html)
* [静岡大学のニューラルネットワークの説明](https://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/net/net.htm)
* [機械学習をはじめよう](http://gihyo.jp/dev/serial/01/machine-learning)
* [これなら分かる最適化数学](http://amzn.to/1oRLuUI) 

 
以上
Tendermint (コンセンサス・アルゴリズム)まとめ

以下に移行しました<br><a href="http://block-chain.jp/tech/tendermint/" title="Tendermint (コンセンサス・アルゴリズム)まとめ">Tendermint (コンセンサス・アルゴリズム)まとめ</a>
c++ builder / naming > Econos - Delphi 4 開発者ガイド コーディング標準

C++ Builderで開発するときの命名規則。

ふと、delphiで使われる規則が気になった。

検索して見つかったのは以下。
http://srgia.com/docs/cs.html

上記のページの元になったページは現在読めないが、上記のページが参考になる。

例えば
> コンポーネントのインスタンスの命名規則
> コンポーネントのプレフィクス
> Standard タブ
> chk	TCheckBox
> cb	TComboBox


以前、TCheckBoxについてCB_XXXとしていたところ、TComboBoxやTColorBoxを後から追加時にCB_XXXがかぶって困った。

chkとcbで文字数がことなるのは引っかかるが、考えの元としては使える。
Raspberry PiでWi-Fiアダプタ2本挿した時にハマったこと


「無線LANでインターネット接続しつつデバイスに対しダイレクトWi-Fi接続」を同時にやりたかったのですが、あまりそういう解説記事が無かったのでちょっとハマりました。

## 消費電力が高いWi-Fiアダプタは危険

当初はWi-Fiアダプタは、安価で入手しやすいBUFFALO製の[WLI-UC-GNM](http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm/)を使用していました。ですがどうやら消費電力が他の製品に比べて **最大2.5W** と高めで、2本挿して使うとかなり熱くなります。
気づかずそのまま使用していたら、 **RaspberryPiが焼けてお亡くなりになってしまいました。**

今はPLANEXの[GW-USNANO2A](https://www.planex.co.jp/products/gw-usnano2a/)（消費電力 **最大1.3W**）を購入し、問題なく動作しています。

## `/etc/network/interfaces`にどう書けばいいの？

Wi-Fiアダプタ1本の場合は、

1. `wpa_passphrase`コマンドをリダイレクトして`/etc/wpa_supplicant/wpa_supplicant.conf`に追記
2. `sudo service networking restart`

でOKですが、2本の場合はインターフェースごとに読み込む`wpa_supplicant.conf`を分ける必要があります。下記のように`/etc/network/interface`の各セクションごとに`wpa-conf`を使って設定ファイルのパスを指定してやります。

```:/etc/network/interfaces

~~~省略~~~

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
      address 192.168.1.10
      network 192.168.1.0
      netmask 255.255.255.0
      gateway 192.168.1.1
      broadcast 192.168.1.255
      dns-nameservers 192.168.1.1       
      wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan0.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
      wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan1.conf

~~~省略~~~

```

wlan0は`wpa_supplicant_wlan0.conf`を、wlan1は`wpa_supplicant_wlan1.conf`を指定しています。これで別々のSSID、パスワードを設定できます。

ちなみにwpa_supplicant.confの書き方について調べていたら、[ここ](https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf)に詳しく載っていました。ここまで詳細に設定しなくても動いちゃいますが（ ~~というか英語読めない~~ ）、興味があったら見てみると良いかもしれません。
powershellの@()の謎を解く

powershell で配列の配列は以下のように書くことができる

```
$ary = @(@(1, 2), @(3, 4))
```

しかし、以下は、配列の配列にはならない `@(1, 2)`と同じになってしまう。

```
$ary = @(@(1, 2))
```

powershellを使っていて必ず引っかかる理解不能な挙動である。この記事ではこの挙動について実験でわかったことを説明する。

その前に配列を可視化するために簡単な関数を定義しよう。
この関数を使ってどのような配列が定義されているかを確認しながら説明する。

```ps1:prettyprint.ps1
function p {
  Param($obj)

  Write-Host (prettyprint $obj)
}

function prettyprint {
  Param($obj)

  $result = New-Object System.Text.StringBuilder;

  . {
    switch ($obj.GetType()) {
      { $_.BaseType -eq [System.Array] } {
        $sep = ", "
        $result.Append("[")
        for ($i = 0; $i -lt $obj.Length; $i++) {
          if ($i -eq $obj.Length - 1) {
            $sep = ""
          }
          $result.Append((prettyprint $obj[$i]))
          $result.Append($sep)
        }
        $result.Append("]")
      }
      { $_.Name -eq "String" } {
        $result.Append("""$obj""")
      }
      { $_.BaseType -eq [System.ValueType] } {
        $result.Append($obj)
      }
      default {
        $result.Append("[$($_.Name)]").Append($obj.ToString())
      }
    }
  } | Out-Null

  $result.ToString()
}
```

例えば、最初の例は以下のように表示される

```ps1
p @(@(1, 2), @(3, 4))
# => [[1, 2], [3, 4]]
```

```ps1
p @(@(1, 2))
# => [1, 2]
```

確かに2番目の例 `@(@(1, 2))` は、二重の配列になっていない。

## 配列リテラルの基本

まず、配列表記の基本は以下である。

```ps1
$ary = 1,2,3     # 3要素の配列
$ary = @(1,2,3)  # 3要素の配列
$ary = ,1        # 1要素の配列
$ary = @(1)      # 1要素の配列
$ary = @()       # 0要素の配列
```

## ```@()``` の規則１

```
@()の中の配列は常に一重の配列展開が行われる
```

まず、わかりにくいが`@(1,2)`は、そもそも`1,2`が配列なのでこれが一重だけ展開されていると見る。
この過程を以下のように図示する。
(ここで、[] は便宜上配列表現であると見なしてほしい。`1,2`は`[1,2]`と表記する)

```
@(1,2) => @([1,2]) => [1,2]
```

従って、`@(@(1,2))`は、

```
@(@(1,2)) => @(@([1,2])) => @([1,2]) => [1,2]
```

`@(@(@(1,2)))`でも同じである。結局 `[1,2]`になる。


これで、`@(@(1,2),@(3,4))`が配列の配列になることの説明もつく。`@(1,2),@(3,4)`は`[[1,2],[3,4]]`であるから外側の配列だけが一重展開される。

```
@(@(1,2),@(3,4))
=> @([@([1,2]),@([3,4])])
=> @([[1,2],[3,4]])
=> [[1,2],[3,4]]
```

`@()`という記述自体が不要なだけのようにも思えるが、`@()`は1要素、0要素の配列表現に必要である。

```
@(1) => [1]
@() => []
```

## ```@()``` の規則２

```
@()の中では「式」を配列の要素とみなし、複数の式は複数の要素になる。配列の一重展開は「式」単位に行われる。
```

(例)

```
p @(1; 2) # => [1, 2]
```

`@()`の中で複数要素を行単位に書くことができるのはこの規則からである。

```
p @(
  1
  2
)
# => [1, 2]
```

そして、`@(@(1,2),@(3,4))`が二重配列になるのに以下が一重配列になるのはこの規則からである。
(「式」単位に一重展開されるため、[1,2] は、1,2 に、[3,4]は、3,4になる)

```
p @(
  @(1,2)
  @(3,4)
)
# => [1,2,3,4]
```

以下が配列の配列になるのは "," で終わる行は「式」が終わっていないからである(2行でひとつの式になっている)

```
p @(
  @(1,2),
  @(3,4)
)
# => [[1,2],[3,4]]
```

また、以下が二重配列になるのは,により各式が二重配列([[1,2]])になっており、それが展開されるからである。

```
p @(
  ,@(1,2)   # [[1,2]]
  ,@(3,4)   # [[3,4]]
)
# => [[1,2],[3,4]]
```

以下など直感に反した結果になるが上記で説明が付く(最初の要素[1,2]は展開され2要素になる。次の要素[[3,4]]は展開され[3,4]になる)

```
p @(
   @(1,2)
  ,@(3,4)
)
# => [1, 2, [3, 4]]
```

これらの規則は関数の出力でも同じである

```
function foo {
  @(1, 2)
 ,@(3, 4)
}

p (foo)
# => [1, 2, [3, 4]]
```

以上、実験と予想を基に記事をまとめた。これらについて公式に説明しているドキュメントがあれば教えてほしい。
俺俺Stan manual翻訳:5-2-Improper Uniform Priorsまで

本文章はStan Modeling Language
[Stan Development Team. 2015. Stan Modeling Language Users Guide and Reference Manual, Version 2.7.0.](http://mc-stan.org/documentation/)の5-2章: Priors for Coefficients and Scalesの翻訳となります。  

訳者は勉強がてら翻訳しようと思っただけで、プログラムの専門家でもデータ解析の専門家でもありません。そのため誤訳・意味の取り違えなどあると思いますが、その際はご指摘いただけると幸いです。5章は長いので何回かに分けて進めたいと思います。また、翻訳ペースも気分しだいです。ご了承ください。科研やその他申請書の延長戦をこなしているうちに気がついたらVer. 2.8.0が出ていますがとりあえず気にしないことにします。とりあえず少しづつでも進めようと思ったので今回はここまででご勘弁を…。

##5.2.回帰係数・尺度の事前分布
このセクションでは回帰の回帰係数や尺度の事前分布をモデル化するために利用可能な手法を示します。単変量の階層モデルについての事前確率については5.9で、多変量モデルの事前確率については5.12で紹介します。また、5.11ではモデルを識別するための事前分布について議論します。

###背景知識
[Gelman, 2006](http://www.stat.columbia.edu/~gelman/research/published/taumain.pdf)には尺度パラメータの事前分布の選択、[Chung et al., 2013](http://link.springer.com/article/10.1007%2Fs11336-013-9328-2)には尺度パラメータの罰則付き最尤法、[Gelman, 2008](http://www.stat.columbia.edu/~gelman/research/published/priors11.pdf)には回帰係数の事前分布の選択についての解説がまとまっています。

###Improperな一様分布
Stanのデフォルト設定では、宣言された制約により決められた値から、パラメータに一様な確率分布を与えます。デフォルトの設定、つまり制約無しで宣言されたパラメータの一様分布は(-∞,∞) の範囲で与えられますが、制約条件として0を下限として与えられたパラメータの場合には、(0,∞)が十分に広い一様分布として与えられます。いずれの事前分布も、積分すると1にならず、それらの密度関数を定式化することができないという意味でimproperな分布だということができます。
Stanではimproperな事前分布を使ってモデルを定式化することができますが、サンプリングや最適化を上手く実行するためには、事後分布がproperなデータが得られているか確かめる必要があります。確認のためには通常、最低限のデータをデータ量が必要ですが、推論の出発点としてや、感度分析のためのベースラインとして有用でしょう（すなわち、事前分布が事後分布に与える影響を考慮するということ）。
一様分布は定められた尺度によって固有の分布をとります。例えば、尺度パラメータσ > 0を与えた場合、一様分布は (0,∞),q(σ) = c  (我々はqを使うようにしています。これは、"密度"は非正規とは限りませんが、非正規として扱うことができるためです。)となります。また、logスケールの尺度パラメータ、logσが与えられた場合には一様分布は (-∞,∞), q(logσ) = c として働きます。log変換にはヤコビアン近似が必要であるため、これらは分散の異なる事前分布として機能します。Section 55.1に、より詳細な変数変換やそのために必要なヤコビアン近似についての情報を載せています。
Stanでは沿った制約値に均一な確率密度を確保するために、自動で制約付きで宣言された変数のために必要なヤコビアンを調節します。ヤコビアンの調節は、最尤推定に基づく最適化の際にはオフになります。
El Capitan の phpenv で cakephp3 の開発サーバーを動かすまで

phpenv のインストールについては、以下の記事をを参考にさせていただきました。

+ <a href="http://qiita.com/yurishima/items/8df59615bbd085522e92">Macでphpenv + php-buildによる環境構築した際にハマった時のメモ（OpenSSLとか）</a>
+ <a href="http://qiita.com/omega999/items/c5b1c177331f8d342efd">phpenv+php-build環境によるphpバージョン管理~Mac（Yosemite）編~</a>

## phpenv + php-buildのインストール

基本的に homebrew を利用してインストール。

```bash
brew install phpenv
brew install homebrew/dupes/libiconv
brew install openssl
brew install autoconf
brew install automake
brew install libxml2
brew install icu4c
brew link icu4c --force
brew link openssl --force
brew link autoconf
brew link automake

git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build

echo 'export PATH="$HOME/.phpenv/bin:$HOME/pear/bin:$PATH"
eval "$(phpenv init -)' >> ~/.bash_profile
source ~/.bash_profile
```

## php5.5.30 をインストール

CakePHP3.x は PHP 5.4.16 以降が必要とのこと。作業時点で PHP5.5.x の最新版を使う。

```bash
phpenv install 5.5.30
phpenv global 5.5.30
phpenv rehash
```

### intl拡張のインストール

intl拡張がないと

```
Fatal error: Class 'IntlDateFormatter' not found...
````

のようなエラーが出るので pecl を利用してインストール。


```bash
curl -O http://pear.php.net/go-pear.phar
php go-pear.phar

pecl install lntl
echo "extension=intl.so" >>  $HOME/.phpenv/versions/5.5.30/etc/php.ini
```

### 開発サーバーの起動


```bash

php bin/cake.php server

Welcome to CakePHP v3.1.4 Console
---------------------------------------------------------------
App : src
Path: /Users/username/project/src/
DocumentRoot: /Users/username/project/webroot
---------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`
```
Ruby on Rails チュートリアル 第1章 - 演習＆答え

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-70453381-1', 'auto');
  ga('send', 'pageview');

</script>

#演習
1. リスト1.8のhelloアクションを書き換え、「Hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。課外作業: Railsの表示では「非ASCII文字」もサポートされています。スペイン語特有の逆さ感嘆符「¡」を含む「¡Hola, mundo!」を表示してみましょう (図1.19)20。
2. リスト1.8のhelloアクションを複製して、第2のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト1.10のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します (図1.20)。

出所）[Ruby on Rails チュートリアル：実例を使って Rails を学ぼう](http://railstutorial.jp/)

#答え
1.
controllersを変更
hello_app/app/controllers/application_controllers.rbにて、下記を追加

```lang:application_controllers.rb
def hello
    render text: "¡Hola, mundo!"
end
```

2.
①controllersに追加
hello_app/app/controllers/application_controllers.rbにて、下記を追加

```lang:application_controllers.rb
def goodbye
render text: "goodbye, world!"
end
```
②routes.rbに追加と編集
hello_app/config/routes.rb　にて、下記を追加

```lang:routes.rb
#root 'application#hello'
root 'application#goodbye'
```

終わり
Rails: posts_pathについて

Post_pathとは以下の場合、#indexの事。
つまり下のケースだと、posts/indexにリダイレクトするように指定している。
間違ってたらごめんなさい。

まだちょっと混乱中、これどういう仕組みでindexを指定してるんだろ？

route.rb

posts GET  /posts(.:format)     posts#index
posts_new GET  /posts/new(.:format) posts#new
          GET  /posts/:id(.:format) posts#show
          POST /posts(.:format)     posts#create

-----------------------------------------------------------
  def create
    @post = Post.new(
      title: params[:post][:title],
      author: params[:post][:author].
      text: params[:post][:text]
    )
    if @post.save
      refirect_to posts_path
    else
      render :new
    end
  end
WKWebViewの画面遷移で注意すべき事

既に何人もの方がWKWebViewに関する記事を書いていますが、ハマった事があったので…意外な事にこの件に触れている記事を見かけなかったので。

普通にWKWebViewをメインのViewにしている時には問題が無いのですが、segueで表示された画面がWKWebViewを使っていた時に、NavigationContollerの戻るをタップすると、アプリがクラッシュしました。

WKWebViewは遷移された先のViewControllerで

```Objc:
- (void)viewDidLoad {
	[super viewDidLoad];
    
    // configurationの作成
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.allowsInlineMediaPlayback = YES;
    configuration.allowsAirPlayForMediaPlayback = YES;
    configuration.requiresUserActionForMediaPlayback = YES;
    configuration.allowsPictureInPictureMediaPlayback = YES;
    
    webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    webView.translatesAutoresizingMaskIntoConstraints = NO;
    webView.allowsLinkPreview = YES;
    webView.allowsBackForwardNavigationGestures = YES;
    [_childView addSubview:webView];
    
    webView.navigationDelegate = self;
    webView.UIDelegate = self;
    // Autolayout
    NSDictionary *views = NSDictionaryOfVariableBindings(webView);
	[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[webView(>=0)]-0-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[webView(>=0)]-0-|"												  options:0
                                                                      metrics:nil
                                                                        views:views]];
    
    // Propertiesの監視
	[webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
	[webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
	[webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
	[webView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
	[webView addObserver:self forKeyPath:@"canGoForward" options:NSKeyValueObservingOptionNew context:nil];
	
    _backButton.enabled = NO;
    _forwardButton.enabled = NO;
 
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com"]]];
}
```
として初期化したとします。

このViewControllerが消える時に

```Objc:
- (void)viewDidDisappear:(BOOL)animated
{
    webView.navigationDelegate = nil;
    webView.UIDelegate = nil;
}
```

とすれば大丈夫！みたいな記述が多いのですが、実は


```Objc:
- (void)viewDidDisappear:(BOOL)animated
{
	[webView removeObserver:self];
	
    webView.navigationDelegate = nil;
    webView.UIDelegate = nil;
}
```

の様にプロパティ監視をしている`Observer`の`remove`も必要になります。
[Swift]AVFoundationでカメラを使う


#ソース元
https://akira-watson.com/iphone/camera.html
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/3-avfoundation/002-kamerano-qi-dongto-hua-xiangno-bao-cun

この2つのソースコードを使いました。

#コード


```Swift:ViewController

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    //カメラセッション
    var captureSession: AVCaptureSession!
    //デバイス
    var cameraDevices: AVCaptureDevice!
    //画像のアウトプット
    var imageOutput: AVCaptureStillImageOutput!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //セッションの作成
        captureSession = AVCaptureSession()
        
        //デバイス一覧の取得
        let devices = AVCaptureDevice.devices()
        
        //バックカメラをcameraDevicesに格納
        for device in devices {
            if device.position == AVCaptureDevicePosition.Back {
                cameraDevices = device as! AVCaptureDevice
            }
        }
        
        //バックカメラからVideoInputを取得
        let videoInput: AVCaptureInput!
        do {
            videoInput = try AVCaptureDeviceInput.init(device: cameraDevices)
        } catch {
            videoInput = nil
        }
        
        //セッションに追加
        captureSession.addInput(videoInput)
        
        //出力先を生成
        imageOutput = AVCaptureStillImageOutput()
        
        //セッションに追加
        captureSession.addOutput(imageOutput)
        
        //画像を表示するレイヤーを生成
        let captureVideoLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession)
        captureVideoLayer.frame = self.view.bounds
        captureVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        //Viewに追加
        self.view.layer.addSublayer(captureVideoLayer)
        
        //セッション開始
        captureSession.startRunning()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func cameraStart(sender: AnyObject) {
        //ビデオ出力に接続
        let captureVideoConnection = imageOutput.connectionWithMediaType(AVMediaTypeVideo)
        
        //接続から画像を取得
        self.imageOutput.captureStillImageAsynchronouslyFromConnection(captureVideoConnection) { (imageDataBuffer, error) -> Void in
            //取得したImageのDataBufferをJPEGを変換
            let capturedImageData: NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
            //JPEGからUIImageを作成
            let Image: UIImage = UIImage(data: capturedImageData)!
            //アルバムに追加
            UIImageWriteToSavedPhotosAlbum(Image, self, nil, nil)
        }
    }


}
```

#GitHub
https://github.com/ShinokiRyosei/SampleCamera
active record migrationを他言語のフレームワークに導入する方法

Railsで使われているmigration機能は便利なのでほかのフレームワークに使いたい場合は以下の方法でできます
データベースはpostgresを使用

* gemfileを作成

```gemfile
source 'https://rubygems.org'

ruby '2.2.2'

gem 'pg'
gem "activerecord"
gem 'active_record_migrations'
```

* ライブラリをインストールする

```
$ bundle install
```

今現在最新(2015年11月時点)rubyのversionが2.2.3だと下記のエラーになります

```
NoMethodError: private method `load' called for Psych:Module
```

なので2.2.2を使用

* ルートパスにRakefileを作成して下記を記入

```:Rakefile
require 'active_record_migrations'
ActiveRecordMigrations.load_tasks
```

* ルートパスにdbフォルダを作成して、dbフォルダの中にmigrateフォルダを作成

dbフォルダにrailsと同じ要領でymlファイルを作成、初期の状態だとconfig.ymlというファイル名で読み込むようになっているのでconfig.ymlを作成

```config.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: hoge_development

test:
  <<: *default
  database: hoge_test

production:
  <<: *default
  database: hoge_production
```

* 以下のコマンドを打って作成

```
$ rake db:create
```

migrationの作成等はRailsと同じなので省略します

* rakeコマンドを使用した時に下記のエラーがでたらBigDecimalをuninstallする

```
: warning: already initialized constant BigDecimal::NAN
```

* アンインストール

```
$ gem uninstall bigDecimal
```
Android Studio 1.5 で Gradle sync failed が発生する場合の対処法


Android Studio を 1.4 から 1.5 にアップグレードしたら、既存のプロジェクトが以下の様なエラーを出してビルドできなくなってしまった。

```
Gradle sync failed: /Applications/Android Studio.app/Contents/gradle/gradle-2.4/lib/plugins/gradle-diagnostics-2.4.jar (No such file or directory)
```

ググったら以下のエントリが見つかった。

* [AndroidStudio1.5 Betaにしたらビルドエラーになったこととその対処法](http://tiro105.hateblo.jp/entry/2015/11/08/150709)

これで解決するプロジェクトとそうでないプロジェクトがあった。

解決しないプロジェクトは `build.gradle` を以下のように変更して gradle のバージョンを最新にすることで解決した。

```diff
@@ -5,7 +5,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:1.3.0'
+        classpath 'com.android.tools.build:gradle:1.5.0'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
```
mysqldumpで特定のテーブルのみダンプするやつ

ダンプしたいテーブルを正規表現で決めれるやつ。
```TABLE_LIST=`mysql -u ユーザ名 -h 接続先 DB名 -sN -e'show tables;' | grep -e"正規表現"`; \
mysqldump -u ユーザ名 -h 接続先 DB名 ${TABLE_LIST[@]} > ダンプファイル名.sql```

ここまで書いてみて、ググったらxarg使ってる記事があって、
それだわ・・・って思いました。

ちなみに、特定のテーブルを除外する場合は、grep -vでイケると思います。（試してはいない）
watchOS 2 で The operation couldn't be completed. が出た

Apple Watch対応アプリのアップデートをするのにwatchOS 2への対応を行ってビルド成功したのに下記エラーが表示されてシュミレーターで起動できずにハマったのでメモ。

こちらの記事を参考にして無事解決。

http://qiita.com/koogawa/items/432b9c65035b6ba17c8b

参考記事では、

> つまり、WatchKit Extensionのbundle identifierが、親のWatchAppのbundle identifierをPrefixに持ってないとダメってことらしいです。（watchOS 1ではこんなことはなかった）

ってことで、確かにそうなっていないとビルドエラーになりますが、私の場合は、

|Watch App|com.tattin.SampleWatchOS2.watch|
|---|---|
|**WatchKit Extension**|**com.tattin.SampleWatchOS2.watchext**|

というような感じでPrefixに関しては問題なかったのでビルドは問題なく成功。

ただ、アプリをシュミレーターで起動しようとすると、、、

```
The operation couldn’t be completed. (LaunchServicesError error 0.)
```

ですって。

iOS DeveloperのApp IDsでも上記内容で登録して、プロビジョニングプロファイルは存在している（watchOS 1では問題なく公開できていた）のにアプリを起動できなくなってしまいました。

http://stackoverflow.com/questions/29097067/xcode-6-2-watchkit-sample-app-doesnt-start-the-operation-couldn-t-be-complete

この辺をみて、bundle identifierを修正。

|Watch App|com.tattin.SampleWatchOS2.watchkitapp|
|---|---|
|**WatchKit Extension**|**com.tattin.SampleWatchOS2.watchkitapp.watchkitextension**|

プロビジョニングプロファイルは修正していないけど、無事アプリが起動。

ふぅ、無事解決。
あとは審査登録できれば・・・。
line monitor > コスト計算 (151122) > 11,000円くらい

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

コスト計算でおよその費用の確認をした。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/41955e4a-39ef-289e-a10a-2c0ed749c2e1.png)

上記に加えて、304SH (30,000円)が別途かかるがこのあたりは1万円くらいの安いandroidスマホを用意するか、不便を気にしないなら、Unityソフトを手持ちのPCやMacOSXで動かしてもいい。

IPアドレスをRPi2起動時に表示したいので、さらにキャラクターディスプレイ代として2000円くらいはかけると1万1千円くらい。

TX RX crossはハンダ付けをするので、ハンダ付けできない場合は、通常のクロスケーブルを２つ必要。200円が1000円程度にはなる。
Java8 資格

仕事上で、Java8資格が必要になるかどうかそれぞれ意見が出ましたが、Java8資格できたら、java8の基本が良いという意味だと考えております。
どんな仕事でも、基本の知識に大事にします。
下記、資格取得方法またjava8勉強方法としてでも知りましょう。

## Java SE 8 Programmer I
[Silver SE 8と同じレベルです。こちらに概要を参考しましょう。](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-808&p_org_id=70&lang=JA)
英語でる方は[この本](https://www.amazon.com/OCA-Certified-Associate-Programmer-1Z0-808/dp/1118957407/ref=sr_1_2?s=books&ie=UTF8&qid=1466391382&sr=1-2&keywords=java+certification)でお勧めます。
時間は人経験によりです。二週間でも良いと考えております。

## Java SE 8 Programmer II
[Gold SE 8と同じレベルです。こちらに概要を参考しましょう。](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-809&p_org_id=70&lang=JA)

英語でる方は[この本](https://www.amazon.com/OCP-Certified-Professional-Programmer-1Z0-809/dp/1119067901/ref=pd_sim_14_1?ie=UTF8&dpID=51Xhky--jCL&dpSrc=sims&preST=_AC_UL480_SR384%2C480_&psc=1&refRID=NZ9JT7QXJT2T88PWWZY3)でお勧めます。
時間は人経験によりですが。私の場合なら、2月間かかりました。

## 参考資料
他のjava8本が多くですが。以下の本でもamazon usで良く評価になります。
[Java: The Complete Reference](https://www.amazon.com/Java-Complete-Reference-Herbert-Schildt/dp/0071808558/ref=pd_sim_14_2?ie=UTF8&dpID=516CL5AVKVL&dpSrc=sims&preST=_AC_UL480_SR393%2C480_&psc=1&refRID=BSRQMEEEX6TP3WJRRGM0)
[Java 8 in Action: Lambdas, Streams, and functional-style programming](https://www.amazon.com/Java-Action-Lambdas-functional-style-programming/dp/1617291994/ref=pd_sim_14_3?ie=UTF8&dpID=51JNZZSTmFL&dpSrc=sims&preST=_AC_UL480_SR384%2C480_&psc=1&refRID=BSRQMEEEX6TP3WJRRGM0)
技術英語 > that probably [alone] could do the job / do the trick

@ LOE > June 8, 2012

<font color=red>[注意] リンクページを開くと鳥の音声が流れるようです。</font>

http://loe.org/shows/shows.html?programID=12-P13-00023
> that probably alone could do the job

aloneとcould do the jobの組合せが耳に残った。

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=do+the+trick&ref=sa
> do the trick
1. 〈話〉目的を達する［達成する］、成果を挙げる、うまくいく
2. ...

That will do the trick.
のような使い方をVoyagerで聞いた気がする。
S3 Glacierアーカイブをフォルダごと復元

一度Glacierアーカイブ化したS3オブジェクトを階層を追いながらWeb上の画面から復元していくのはけっこう辛い。コマンドラインから一気に復元実行できると良い。

## 方法
公式の aws-cli とは別に、非公式の [s3cmd](https://github.com/s3tools/s3cmd) というツールがあり、これを用いるととても楽である。

### s3cmd インストール・設定
```
$ sudo yum -y install s3cmd
$ s3cmd --configure
…
Access Key: xxxxxx ← 入力
Secret Key: xxxxxx ← 入力
…
Save settings? [y/N] y ← 入力
```

### s3cmd によるフォルダまるごと復元
以下のようにすれば folder1 配下をまるごと復元してくれる。(有効期限3日)

```
$ s3cmd restore --recursive --restore-days=3 s3://bucket-name/folder1/
```

以下のようにすればバケットまるごと復元してくれる。(有効期限3日)

```
$ s3cmd restore --recursive --restore-days=3 s3://bucket-name/
```

## s3cmd によるフォルダまるごとダウンロード
復元が完了したら、以下のようなコマンドでフォルダまるごとダウンロードできる

```
$ s3cmd get -r s3://bucket-name/folder1/ .
```

## s3cmd による再帰的復元が途中で中断される場合
既に復元を開始しているアイテムが1個でもフォルダ内に含まれていると、「Object restore is already in progress」というエラーとなり、フォルダまるごとの復元が中断されるようでした。
以下プルリクエストにて該当エラーをスキップする処理を入れてみたので、同様の問題で困った場合には試してみると良いです。

- [Ignore RestoreAlreadyInProgress exception on restore command #667](https://github.com/s3tools/s3cmd/pull/667)

## 参考
- [aws-cli - まとめてGlacierからS3に戻すためのワンライナー - Qiita](http://qiita.com/fanglang/items/91770ea74dfc03beb554)
    - 参考になりました。最初はこちらを試してみたのですが、速度がやや遅かったので一旦使用を断念。
- [How to restore folders (or entire buckets) to Amazon S3 from Glacier? - Stack Overflow](http://stackoverflow.com/questions/20033651/how-to-restore-folders-or-entire-buckets-to-amazon-s3-from-glacier)
    - s3cmd の紹介があり、これを試してみることにしました。
- [s3tools/s3cmd](https://github.com/s3tools/s3cmd)
    - s3cmd リポジトリ。
MySQL&MariaDBのbinlog formatの話

## まとめ
MySQLの古いバージョンとMariaDBのデフォルト(2015年11月現在)のbinlog formatが、状況が復元できない可能性のあるunsafeなstatement_based formatであるので、必要なら変更した方が良いという話。最新のMariaDBのデフォルトはmixedなので問題は少ない。

個人的に重要な気がしたのでメモ代わりに。

## binlog formatの種類
binlog formatにはstatement-basedとrow-basedの2種類がある。簡単に言えば、statement-basedはクエリ単位で、row-basedは行変更単位で変更を保存する仕組みだと認識している。

運用上問題となるのは、statement-basedだと、復元時に異なった状態になる可能性がある、unsafeなクエリが稀に存在するということである。

詳細は以下のURLが詳しいが、どのような操作がunsafeかの例で言うと、

- 不定の対象に対してUPDATEをかける(例：UNIQUEなROWに対してORDER BYせずにLIMITしてUPDATE)
- 変更クエリでRAND()などのSTATEMENT
- INSERT ... ON DUPLICATE KEY UPDATEで複数のUNIQUEなKEYを持つ(PRIMARY含む)

などは「ありそう」な気がする。(最後は実際仕事であった)

https://dev.mysql.com/doc/refman/5.6/ja/replication-sbr-rbr.html

row-basedではそのような問題はないが、logの量が多くなりがちなので、パフォーマンス上の問題が出る可能性がある。このため、問題のあるクエリだけをrow-basedで処理するMIXEDというモードも用意されている。

## 対処
binlog_format変数がGLOBALとSESSIONそれぞれで参照、設定できるので、STATEMENTをMIXEDなりROWなりに変更する。

確認

```
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
```

一時的な変更

```
SET GLOBAL binlog_format = 'MIXED';
```

永続的にはmy.cnfに書けば良い。

## どのMODEを選ぶべきか
結局のところは、unsafeなクエリがどれぐらいありそうか、パフォーマンスは、という2つの問題に帰着する。

正直なところデフォルトのSTATEMENTを選ぶ理由は無いように思える。パフォーマンスの問題でstatement_basedにしたいとしても、unsafeなクエリだけrow_basedにするMIXEDがある以上それを使えばいいからである。ただbinlogをそもそも重視してない(replicationしてない)のであれば面倒だし変えないという話は勿論あるか。

MyFleetGirlsでこの問題に気付いたときは既にSTATEMENTで運用していたので、変更を最小にするべくMIXEDにしたが、最新のMySQL(5.7.7以降らしいと聞いた)ではROWがデフォルトらしい。この2つのどちらかを選ぶかはパフォーマンスの話が大きい気がするが、一概にMIXEDの場合が早いとも限らないらしい(実際InnoDBだとReplication側が行Lockになってはやいよ、という話はあった)ので、ちゃんと調査した方が良さげ。

## 追記
最新のMariaDBのbinlog formatはmixedらしいので、最初から問題の出にくい仕様になっており、あんまり気にしなくてもよくなりそうな雰囲気はある。
https://mariadb.com/kb/en/binary-log-formats/
SwiftでESCを使う(コマンドライン出力に色をつける)


C言語だとESC(27 = \x1b = \033)を使って`"\x1b[31mあああ"`としてやれば、コマンドライン出力に色をつけたりできるけど、swiftでは違うみたいなので調べた。

swiftだと`"\u{nn}"`で1バイトのユニコードスカラ値を表現するので、`"\u{1b}[31mあああ"`となる.

ちなみに他の言語だと`"\e"`がESCとして使えるのが結構ある

[ANSI escape code](https://en.wikipedia.org/wiki/ANSI_escape_code)

```sh
➜  ~  swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9
```

[gist:colorTest](https://gist.github.com/kanetai/d57189e7f13f49158ee8c7f9056ce69c)

```swift:colorTest.swift
#!/usr/bin/swift
import Foundation

public enum ESCCode : UInt {
    case Reset = 0, Bold = 1, Faint, UnderLine = 4, BlinkSlow, Negative = 7
    case Black = 30, Red, Green, Yellow, Blue, Magenda, Cyan, White
    case BackgroundBlack = 40, BackgroundRed, BackgroundGreen, BackgroundYellow, BackgroundBlue, BackgroundMagenda, BackgroundCyan, BackgroundWhite
    
    static let backGroundColorOffset: UInt = 10
    static func escapeCode(value: UInt) -> String { return "\u{1b}[\(value)m" }
    
    var escString: String { return self.dynamicType.escapeCode(self.rawValue) }
}
extension String {
    func escape(esc: ESCCode, reset: Bool = true) -> String {
        return "\(esc.escString)\(self)\(reset ? ESCCode.Reset.escString : "")"
    }
}

public func printError(message: String, exit shouldTerminate: Bool = false, terminator: String = "\n") {
    if let data = "\(message.escape(.Red))\(terminator)".dataUsingEncoding(NSUTF8StringEncoding) {
        NSFileHandle.fileHandleWithStandardError().writeData(data)
    }
    if shouldTerminate { exit(1) }
}

let str: String = "abcABC"
for i: UInt in ESCCode.Bold.rawValue..<ESCCode.Negative.rawValue+1 {
    if let esc = ESCCode(rawValue: i) {
        print("\\x1b[\(esc.rawValue)m  \(str.escape(esc))")
    }
}
print("")

print("    | \\x1b[3*m | \\x1b[4*m |")
print("___ | ________ | ________ |")
for i: UInt in ESCCode.Black.rawValue ..< ESCCode.White.rawValue+1 {
    if let color = ESCCode(rawValue: i), bcolor = ESCCode(rawValue: i+ESCCode.backGroundColorOffset) {
        print("*=\(i-ESCCode.Black.rawValue) |  \(str.escape(color))  |  \(str.escape(bcolor))  | ");
    }
}

print("")

printError("警告")
printError("warning", exit: true)
print("unreachable")
```

![スクリーンショット 2015-11-22 5.54.45.png](https://qiita-image-store.s3.amazonaws.com/0/102093/e78ad23a-408a-5025-597f-a4ecd2b9ed36.png "スクリーンショット 2015-11-22 5.54.45.png")
TomcatとEclipseとログ

Eclipse MarsとTomcat8で開発しててログを設定しようとしてもあまり良い情報が出てこなくてTomcatの公式ドキュメント見ても最終的にどうすれば良いんだまとめてくれって感じだった。

# ぼくが本当に必要だったもの

まずは、プロジェクトの ``WEB-INF/classes/logging.properties`` に以下を書きます。

```properties
handlers = java.util.logging.ConsoleHandler

java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

org.example.level = ALL
```

EclipseのTomcatの起動の構成で、VM引数に ``-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager`` を追加するとINFO未満のログレベルが表示できます。

# 解説

Tomcatでログを設定する場所は3段階ほどあります。

1. JREの設定 ``${JAVA_HOME}/lib/logging.properties``
2. Tomcatの設定 ``${CATALINA_BASE}/conf/logging.properties``
3. アプリケーションの設定 ``WEB-INF/classes/logging.properties``

JREの設定で大抵はConsoleに投げるようになっているはずです。公式のExampleのようなTomcatの設定は、運用時に必要になってくるのではないでしょうか。

``logging.properties`` は、いたって普通の ``java.util.logging`` の設定で十分です。とりあえず最初は ALL で全部流しちゃえば良いと思います。レベルやパッケージで減らしたい場合はTomcatのドキュメントを参照してください。

Tomcatは独自の ``LogManager`` を利用しているので、Eclipseのコンソールに表示できるように起動時に設定します。2のTomcatの設定も行っているようであれば、 ``-Djava.util.logging.config.file="${CATALINA_BASE}/conf/logging.properties"`` も追加します。
Xcode, Swift, iOS端末でiBeaconデモアプリ作成【メモ】

#基本的な作り方
「SwiftとiBeaconを使ってお母さんが自分の部屋に近づいて来た事を警告するアプリをつくる」
http://qiita.com/oggata/items/5de43d71692d1abcff7c

- 主に「coreLocation.framework」を使うことでiBeacon通信を使ったアプリをSwiftで実装することができる。

##【送信機の作成】
####**node.js使用の際の参考サイト**

「いまアツいJavaScript！ゼロから始めるNode.js入門〜5分で環境構築編〜」
http://liginc.co.jp/web/programming/node-js/85318

- 送信機はサイト通りに進めれば問題なく作成可能
- サイトでは送信機と受信機でUUIDのフォーマットが異なるが、ここは揃える必要がある。
- ([例] var uuid = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; → 'ABCDEFG-01234-abcdefg' )
- 後ほど出てくるSwiftでの受信機作成の際は送信機と揃えて'ABCDEFG-01234-abcdefg'

##【受信機の作成】

- この記事では「Swift1.0」が使われているため、10箇所近いエラーが出る。
- 「Swift1.0」は2014年9月にリリースされたもので、2015年9月にリリースされた「Swift2.0」で仕様が大きく変わったため。
- 多くのエラーはXcodeのコンソールでエラー内容を見てぱぱっと直せる。

####**エラーが出た際の参考になるサイト**
「Swiftでsubstringをする」
http://hack.aipo.com/archives/9131/
「既存コードのSwift2.0とiOS9対応の暫定措置」
http://qiita.com/bloody_snow/items/9d7571552614655250cc

- この記事が書かれた時は必要なかったであろう設定がiOS8からは必要に
- iOS8から「coreLocation.framework」を使う際にはあらかじめ設定が必要
- 「coreLocation.framework」はiOSアプリで位置情報と地図を使うためのフレームワーク

####**coreLocation関係で参考になるサイト**
「CoreLocationを使ってバックグラウンドで位置情報を取得する」
http://blog.shoby.jp/entry/2015/06/16/022557
「iBeaconを使用前に設定しとくこと」
http://qiita.com/mzuk/items/9a051120b26a49902888

***
★以上のことを参考にしながら進めれば「送信機:PC → 受信機:iOS端末」でiBeaconアプリは作成できる。

最後に修正したverのgithubリンク
「ViewController.swift」
https://github.com/GoSato/iBeaconDemo/blob/master/iBeaconDemo/ViewController.swift

- 基本ファイルの置き換えorコピペで大丈夫なはずですが、Labelとstatus,uuidなどの変数は自分でconnectしてあげる必要があります。

<img width="320" alt="IMG_6135.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82250/5e985a57-d414-533b-3cee-5e3d55cc94c6.jpeg">       <img width="320" alt="IMG_6136.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82250/11974dbf-d34a-6e4c-6129-676869038dc3.jpeg">
Swift APIのavailabilityチェックはextensionでもできた〜

状況に応じて `#available` や `@available` を使うことで、OSのバージョンによって処理を分けることができます。が、今日、コードを書いていてこれがextension単位でも効くことを知りました。

## ドキュメントにも載ってる頻出の使い方

```swift
guard #available(iOS 8.0, OSX 10.10, *) else { return }
```

```swift
@available(iOS 8.0, OSX 10.10, *)
func useShinyNewFeature() {
    // ...
}
```

## extensionでも使える


```
// MARK:-
// MARK: SHORTCUT
@available(iOS 9.0, *)
extension AppDelegate {
    func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
        ...
    }
}
```

これはちょっとうれしかった。


## 参考

- [Using Swift with Cocoa and Objective-C (Swift 2.1): Adopting Cocoa Design Patterns](https://developer.apple.com/library/prerelease/watchos/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html)
- [[Swift] WWDC で 発表された Swift 2.0 の新フィーチャー – OS バージョンに応じて処理を変える方法 ｜ Developers.IO](http://dev.classmethod.jp/server-side/language/checking-api-availability/)
UICollectionViewCell の大きさについて


## はじめに
今度 Swift でアプリ作ることになって TableView みたいな見た目を
CollectionView で作ってみようと思っていざ作ったけど何かおかしい。

**UICollectionViewCellの幅ってどうやって決めるの？**

今更感もある。でも使わないと知らないものだ。
そもそも TableView で作れと。

以下備忘録。Swift 本格的にやっていこうかな。
クラスメソッドの書き方もわからなかったのでついでに。

## UICollectionViewCell の設定
iOS 6 から導入された UICollectionView は今まで色々使ってきたけど，
いわゆるタイルみたいな使い方しかしたことなく，セルの幅と高さは
Storyboard の設定で直接数字いじって決めてたわけです。

原因がわかった。セルの Width が 600 になってたから。
CollectionView の方はできても セルは AutoLayout の設定ができない。
セルの中はしっかりできますけどね。どうやったらいいのか調査。

## CollectionViewCell の長さを可変にする
結論から言うと，UICollectionViewDelegateFlowLayout の
デリゲートメソッドを使うだけだった。返り値は CGSize で
TableView 見たくするために Width はディスプレイサイズの幅，
Height は適当に 120 にした。Util のとこは後の項参照です。

```Swift
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        
	// Util からでディスプレイサイズ取得
	// Width はそれを使い，高さは適切な値で返してやる
	let returnSize = CGSize(width: Util.returnDisplaySize().width, height: 120)
	
	return returnSize
}
```
あとは通常通り，必須のデリゲートメソッドを設定すればいい。
これで数値にこだわらずに書けるようになりそうだなー。
Objective-C も同じように書けるはず。機会あれば使おう。

**追記(2017/05/28)**
Swift3 だと下記のようになる。最近は extension を使って分けて書いている。

```swift:HogeViewController.swift
extension HogeViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // 例えば端末サイズの半分の width と height にして 2 列にする場合
        let width: CGFloat = UIScreen.main.bounds.width / 2
        let height = width
        return CGSize(width: width, height: height)
    }
}
```


## クラスメソッドの書き方
1回目は直書き，同じファイルで2回目使う場合はメソッド作成，
違うファイルでも使う場合は Util で。最近やっと定着してきた。
それも Objective-C の話で今回初めて Swift で使う機会きたので書く。
まぁだいたい Util に入れるものって決まってたりしますけどね。

今回はディスプレイサイズが欲しかったので，
Util.swift でクラスメソッド書く。

```Swift:Util.swift
class Util: NSObject {
	/**
     * 使用端末のディスプレイサイズを返す
     * @return displaySize (.width と .height)
     */
    class func returnDisplaySize() -> CGSize {
        let displaySize = UIScreen.mainScreen().bounds.size

        return displaySize
    }
```

ちなみに Objective-C だと下記。
Swift の方はファイルも一つだし楽だったかもなー。

```obj-c:Util.h
@interface Util : NSObject

+(CGSize)returnDisplaySize;

@end

```

```obj-c:Util.m
@implementation Util

+(CGSize)returnDisplaySize {
    CGSize displaySize = [[UIScreen mainScreen] bounds].size;
    
    return displaySize;
}

@end

CGSize size = [Uitl returnDisplaySize]; // 呼ぶとき

```

## おわりに
今回は Swift での UICollectionViewCell の可変について書いた。
ついでにクラスメソッドについても書いた。
一度確認すればもう迷うこともないかな。
画面サイズが 4 種類にもなった影響もあって UI 周りの再勉強が
必要だと感じる。iPad Pro が出て今まで特に考えなくてもよかった，
iPad アプリの改修に頭抱えている現場も意外とありそうだなー
とか思ったり思わなかったり。

ご覧いただきありがとうございました。
もっとこうした方が適切とかありましたらコメントお願いいたします。
スクリプトで無線LANにWi-Fi接続する　-Linux編 (Raspberry Pi対応)-


Wi-Fiダイレクトで直接デバイスに無線接続するときに、いちいち`/etc/network/interfaces`をいじって`ifdown wlan0 && ifup wlan0`とかしていた訳ですが、いかんせん面倒くさい。
そこで、SSIDとパスワードを指定するだけでお手軽に接続できるスクリプトを作りました。
Raspbian Wheezy、Ubuntu14.04で動作確認済みです。ちなみにMac編は[こちら](http://qiita.com/kota65535/items/4cd13ac28de51648e370)です。

```bash:wificonn_linux.sh
#!/bin/bash
set -u
export LANG="C"

function usage() {
  cat <<EOT
Usage: bash ${0##*/} <interface-name> <network-SSID> <password>
EOT
}

# 引数チェック
if [ $# -ne 3 ]; then usage && exit 1; fi

# 指定されたインターフェースが存在するか調べる
iwconfig $1 > /dev/null 2>&1
if [ $? -ne 0 ]; then
  echo "Device named '$1' not found."
  exit 2
fi

# すでに接続されていれば終了
iwconfig $1 | grep -wq "ESSID:\"$2\"" && ifconfig $1 | grep -q 'inet addr'
if [ $? -eq 0 ]; then
  echo "Already connected."
  exit 0
fi

# インターフェースを再起動
ifconfig $1 down
ifconfig $1 up
if [ $? -ne 0 ]; then
  echo "Failed to activate interface $1"
  exit 4
fi

# 指定のSSIDを持つアクセスポイントがあるか調べる
iwlist $1 scan | grep -wq "ESSID:\"$2\""
if [ $? -ne 0 ]; then
  echo "The wi-fi network with SSID:'$2' not found."
  exit 3
fi

# wpa_supplicantが動いていたら殺す
pkill -f "wpa_supplicant.+-i *$1 .*"

# SSIDを設定
iwconfig $1 essid $2

# WPA認証タイムアウト秒数
WPA_AUTH_TIMEOUT=20
is_connected=false
current_time=$(date +%s)
# wpa_supplicantをnohupで起動し接続。stdbufはバッファリングを防止するために必要
while read -t ${WPA_AUTH_TIMEOUT} line; do
  echo "  $line"
  echo $line | grep -wq 'CTRL-EVENT-CONNECTED'
  if [ $? -eq 0 ]; then
    is_connected=true
    break
  fi
  # タイムアウト判定
  if [ $(($(date +%s) - ${current_time})) -gt ${WPA_AUTH_TIMEOUT} ]; then
    echo "Timeout."
    break
  fi
done < <(nohup bash -c "wpa_passphrase $2 $3 | stdbuf -oL wpa_supplicant -i $1 -D wext -c /dev/stdin 2>&1 &")
if ! $is_connected; then
  echo 'WPA authentication failed.'
  pkill -f "wpa_supplicant.+-i *$1 .*"
  exit 5
fi

# IPアドレス割り当て
ifconfig $1 | grep -q 'inet addr'
if [ $? -ne 0 ]; then
  dhclient $1
  ifconfig $1 | grep -q 'inet addr'
  if [ $? -ne 0 ]; then
    echo 'IP address cannot not be assgined.'
    exit 6
  fi
fi

echo 'Connected successfully.'
exit 0
```

## 使いかた

```
$ bash wificonn_linux.sh <interface-name> <network-SSID> <password>
```

* 実行にはルート権限が必要です。一般ユーザーは`sudo`してください。
* `<interface-name>`はwlan0, wlan1などのインターフェース名を指定します。インターフェース名は`iwconfig`で確認できます（老婆心）。
* 生のパスワードを入力する必要があるので、共同のマシンでは注意してください。


## 一応解説

Debian系Linuxで無線LANの設定を行うときは、種々の解説サイトにもあるように

1. `wpa_passphrase`の出力をリダイレクトし、PSKの暗号化と同時に設定ファイルを作成する
1. `/etc/network/interfaces`に`wpa-conf <設定ファイルのパス>`と書く

のが一般的です。こうしておくと`wpa_supplicant`が勝手に立ち上がり、設定ファイルを読み込んでよろしく認証を行ってくれます。今回は設定ファイルを使わないため、`wpa_supplicant`の設定ファイルを`-c /dev/stdin`として標準入力に設定し、`wpa_passphrase`の出力をパイプで流しこむようにしました。

* `wpa_supplicant`を起動させたらそのログ出力を一行ずつ読み込んで、OKっぽいログ(**CTRL-EVENT-CONNECTED**)が出ていたら成功とみなします。もっといい判定方法があるかも？
* 一定時間以上経ってもダメならタイムアウトエラーにしています。環境によっては`WPA_AUTH_TIMEOUT`の値を調整する必要があるかもしれません。
* `stdbuf -oL`はバッファリング動作を変更するコマンドで、`wpa_supplicant`が出力をバッファに貯めずに一行ずつ吐き出すようにしています。
* IPアドレスは`dhclient`コマンドで動的に割り当てています。

バグや指摘などありましたら、ぜひコメント欄か[Twitterの方](http://twitter.com/Tomoz256)までお願い致しますm(__)m
RomoのSwift sample codeをXcode7.1(Swift2.1)で動くようにしてみた


以前、[RomoSDKをSwiftで使う。【導入編】](http://qiita.com/ken0nek/items/ccdfefe274bd00203957)を参考に、Xcode6.1.1(Swift1.1)でRomoサンプルコードを動かす事ができたのですが、Xcode7.1(Swift2.1)で動かそうとするとエラーになります。
XcodeもSwiftも初心者ですが、Xcodeのバージョンをあげながら、エラー対応をまとめてみました。
結果的には、Swiftのバージョンがあがるたび、動作やsyntaxが変わっているのが原因のようです。

# Xcode6.1.1(Swift1.1)
最初に試したバージョン問題なし。

# Xcode6.2(Swift1.1)
問題なし。

# Xcode6.3(Swift1.2)
## RMCoreControllerPID.hに関するエラー
下記を追加。

```RMCoreControllerPID.h
#undef I
```

## touches*メソッドの引数指定記述変更
[こちら](http://qiita.com/osamu1203/items/09ab7ba89b2101a855f7)と[こちら](http://stackoverflow.com/questions/28771896/overriding-method-with-selector-touchesbeganwithevent-has-incompatible-type)を参考に、touchesBegan,touchesMoved,touchesEnded,touchesCancelledの引数を下記のように変更。

```変更前
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        let touchLocation = touches.anyObject()?.locationInView(self.view)

```

```変更後
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first
        let touchLocation = touch!.locationInView(self.view)
```

# Xcode6.4(Swift1.2)
問題なし。

# Xcode7.0.1(Swift2.0)
## touches*メソッドの引数指定記述変更
[こちら](http://stackoverflow.com/questions/28771896/overriding-method-with-selector-touchesbeganwithevent-has-incompatible-type)を参考に、touchesBegan,touchesMoved,touchesEnded,touchesCancelledの引数を下記のように変更。


```変更前
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first
        let touchLocation = touch!.locationInView(self.view)
```

```変更後
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let touchLocation = touches.first!.locationInView(self.view)
```

## シミュレータでiPhone6/6Sを選択した場合、表示画面の右側が空白になる。
原因不明。
iPhone5sでは正常表示するので、当面iPhone5sを使用する事で問題先送り。

![romo20151122.png](https://qiita-image-store.s3.amazonaws.com/0/4779/d9096480-b56b-8937-d08d-e846d9a6e6af.png "romo20151122.png")

# Xcode7.1(Swift2.1)

## シミュレータでiPhone6/6Sを選択した場合、表示画面の右側が空白になる。
事象継続中。

## 実機転送時、エラー発生
試していなかったが、Xcode7.0.1以前でも同事象でていたかもしれない。

```
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

[こちら](http://stackoverflow.com/questions/31561286/xcode-7-and-enable-bitcode-yes-setting-does-not-work)を参考にproject -> target -> build settings -> Build Options -> Enable Bitcode->No に変更
下記の通り、iPhone5s実機での動作を確認

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/4779/bdb87021-64dc-0426-df57-a34477f35866.png" alt="romo_iphone5s.png" title="romo_iphone5s.png" width="374" height="685"></a></p>

# まとめ
* Swift2.1でRomo SDKを始める場合、遭遇するエラーの対応方法をまとめました。
* これでやっとSwift2.1でRomo開発がすすめられます。

# 参考
[Xcode 6-7系のバージョン間の微妙な差異まとめ](http://qiita.com/mono0926/items/2ea3f6a9258ffb705b5f)
Doker Handbook


# Docker ハンドブック
## 1. 環境構築
### 1.1. 環境
- Ubuntu 14.04 LTS

### 1.2 インストール
```bash
$sudo apt-get install docker.id
```

※ 注意：パッケージ名は <FONT COLOR=red>"docker"</FONT>ではない。

### 1.3. 動作確認
```bash
$sudo docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.2.1
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64
```

## 2. image操作
### 2.1. リモートimageの検索
- 最新のUbuntuを使用する場合

```bash
$sudo docker search ubunut 
```

- 最新のCentを使用する場合
```bash
$sudo docker search centos
```

- CentOS 6を指定する場合

```bash
$sudo docker search centos6
```

### 2.2. imageの取得
```bash
$sudo docker pull ubuntu
```

### 2.3. imageの確認
- imageの一覧

```bash
$sudo docker images
```

- image IDのみ表示

```bash
$sudo docker images -q
```

- リポジトリを指定したimage IDの表示

```bash
$sudo docker images -q ubuntu
```

###  2.4. imageの削除
- image IDを指定してimageを削除

```bash
$sudo docker rmi <image ID>
```

- ubuntu のimage削除

```bash
$sudo docker rmi $(sudo docker images -q ubuntu)
```
ソースを実行ファイルに埋め込む方法

C# - ソースを実行ファイルに埋め込む方法 - Qiita
http://qiita.com/ymko/items/7cf9a19e03ba9dcebfaa
のgolang版

# ツールの準備

```bash
$ go get -u github.com/jteeuwen/go-bindata/...
$ which go-bindata
~/.go/bin/go-bindata
```

# ソースの準備

* data/以下ハードリンクして置いておくことがミソ
* build -o で出力ファイル名を指定
* 再帰的にやるにはどうしよう・・・

```bash
$ cat main.go
package main

import (
        "log"
        "fmt"
)

//go:generate go-bindata data/
//go:generate go build -o srcres

func main () {

        data, err := Asset("data/main.go")
        if err != nil {
                // Asset was not found.
                log.Fatalln(err)
        }

        fmt.Println(string(data))
}
$ mkdir data
$ ln main.go data/
```

 
# コンパイル＆実行

```bash
$ go generate
$ ./srcres
```

# デバッグ実行

* デバッグ実行する場合はAsset()を呼べるようにbindata.goも指定しないといけない

```bash
$ go run main.go
# command-line-arguments
./main.go:13: undefined: Asset
$ go run bindata.go main.go
```

# 参考

go-bindata でコンパイル時にリソースを埋め込んじゃおう！ - Qiita
http://qiita.com/ikawaha/items/c02d84cfd00f8f442500

アセット的なアレを実行バイナリ内に入れる話。
http://blog.satotaichi.info/one-binary-using-go-bindata/

go-bindataをgo:generateで実行する - きょこみのーと
http://kyokomi.hatenablog.com/entry/2015/01/17/211502