OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby Array#flattenは階層を指定できる


```ruby
[[[]]].flatten
  # => []

[[[]]].flatten(0)
  # => [[[]]]
[[[]]].flatten(1)
  # => [[]]
[[[]]].flatten(2)
  # => []
[[[]]].flatten(-1)
  # => []
```

デフォルト値は`-1`.
ネストが深くなると実害ありそうなので意識する必要がある.

```ruby
[[1,[2,3]], [4,[5,6]], [7,[8,9]]].flatten
  # => [1, 2, 3, 4, 5, 6, 7, 8, 9]
[[1,[2,3]], [4,[5,6]], [7,[8,9]]].flatten(1)
  # => [1, [2, 3], 4, [5, 6], 7, [8, 9]]
```

# References

* http://stackoverflow.com/questions/5612625/how-to-flatten-an-array-of-arrays-but-not-all-the-way-down
* http://apidock.com/ruby/Array/flatten
koa-routerとkoa-staticでNginxやApacheのaliasみたいな感じで静的ファイルを公開する

例えば`/static/hoge.png`みたいになURLで配信したい場合に、

```
.
├── app.coffee
└── static
    └── hoge.png
```

という構成を取ろうとして

```coffeescript:app.coffee
Router = require 'koa-router'
serve = require 'koa-static'

api = new Router
api.get '/static/*', serve './static'
```

とすると、一見うまく動きそうですが、実際`/static/hoge.png`のリクエストを送っても`404`になってしまいます。実は、このコードだと

```
.
├── app.coffee
└── static
    └── static
        └── hoge.png
```
このようにファイルを配置しないと適切にファイルを公開できないのです。要は`koa-static`は単純に指定したディレクトリにHTTPのパスをくっつけることしかしないってことです。

## 対処法
`koa-static`はそのパスを`this.path`から読み取るので、`serve`の前に`this.path`を書き換えてやるだけです。

```coffeescript:app.coffee
api.get '/static/*', (next)->
    parts = @path.split '/'
    parts.splice 1, 1
    @path = parts.join '/'
    yield next
, serve './static'
```

非常に限局的な話ですが、同じような問題で困った方が居たら参考にしてください。
AWS OpsWorks用に作った自作レシピ

## deploy_notifier

https://github.com/f96q/deploy_notifier

* デプロイが終わった時にチャットルームに通知するレシピ
*  slack, hipchatの通知に対応
*  Custom Chef Recipesのdeployのところに入れて使います

## dotenv

https://github.com/f96q/dotenv

* OpsWorksの管理画面のEnvironment Variablesで設定した値から.envを生成するレシピ
* 手動でrakeタスク実行とかバッチ処理で別プロセスで動く都合でEnvironment Variablesの環境変数を引き継げないときなどに使えます

## authorized_keys

https://github.com/f96q/authorized_keys

* OpsWorksでアプリを動かすユーザーのauthorized_keysにcustom jsonで設定された公開鍵を追加するレシピ

## nginx_real_ip

https://github.com/f96q/nginx_real_ip

* ELBがフロントにいる場合、アクセスログがELBのipになってしまうので実際のipを表示されるようにするレシピ

* ELBのipを指定して使います

* 特定のipのみなどのアクセス制御する場合などに

## htpasswd

https://github.com/f96q/htpasswd

* custom jsonにアプリごとにユーザー名とパスワードを設定するとhtpasswdファイルが生成されます
* htpasswdコマンドを使かわない実装になってるのでapacheをインストールしなくても使えます

### nginx + unicornの構成で使う場合 

OpsWorksの標準のunicornのレシピをカスタマイズするといいです。

unicorn/templates/default/nginx_unicorn_web_app.erb

```
location / {
  <% if @application[:nginx][:basic_auth] -%>
    auth_basic "<%= @application[:domains].first %>";
    auth_basic_user_file "<%= "/etc/nginx/htpasswd.d/#{@application[:application]}" %>";
  <% end -%>
}
```
Eclipse+APIvizでjavadocにクラス図を出力

Eclipse環境にAPIvizを設定してJavaDocにクラス図を合わせて出力する。
前はdoxygen+graphvizでやってたが、何となくjavadocの方が出力したhtmlの見た目が好きなので。
ということでAPIvizを使ってみようと思ったのだがあまり日本語資料がないのでメモ。
でもAPIvizって2012で開発止まってるんだよなぁ。

<h1>実行環境</h1>
Windows8.1, Eclipse4.5(Pleiades All in One), Java1.8, APIviz1.3.2
**※APIvizは必ず最新版(現時点:1.3.2)を使用してください。1.3.1より前はJDKのバージョンが合わないようでエラーが発生します。**

<h1>インストール</h1>
1. まず、APIvizにはGraphvizが必要なので下記サイトからダウンロード、インストール。サイトが停止している場合は日や時間を適当に調整。夜中やってたら停止してた・・・
   [Graphviz - Graph Visualization Software](http://www.graphviz.org/Download.php)

2. 環境変数「Path」に、「＜Graphvizインストールフォルダ＞\bin」(dot.exeのあるフォルダ)を追加する。

3. APIvizの最新版zipファイルを下記サイトからダウンロードし、任意のフォルダに展開する。(例-C:\work\ProgramFiles\apiviz)
  [JavaDoc doclet for API visualization](
https://code.google.com/p/apiviz/)

<h1>環境設定</h1>

１. プロジェクト右クリック⇒エクスポート⇒Java⇒JavaDocを選択

２. 「カスタム・ドックレットを使用」を選択。下記設定を行い「次へ」ボタン押下

```
ドックレット名:org.jboss.apiviz.APIviz
ドックレットクラスパス:C:\work\ProgramFiles\apiviz\jar\apiviz-1.3.2.GA.jar
```

３. 「追加のJavaDocオプション」に以下を指定

```
 -encoding utf-8
 -charset utf-8
 -windowtitle サンプルプロジェクト ←javadocのタイトル。プロジェクト名とか指定する
 -sourceclasspath C:\work\workspace\sample\bin　←.classファイル出力フォルダパス
 -d C:\work\workspace\sample\doc\main　←javadoc出力先フォルダパス
```

※AntとかMaven2の設定は[本家サイト(英語)](https://code.google.com/p/apiviz/)に詳しい記載があるのでそちらを参照する事。

<h1>実際の出力</h1>

こんな感じで
![image1.gif](https://qiita-image-store.s3.amazonaws.com/0/96681/e4451022-245e-1278-4d3b-8a97ab3ec350.gif)
AndroidManifestをProductFlavorで上書き


flavor/AndroidManifest.xmlで、上書きしたい項目を、

```xml:AndroidManifest.xml
tools:replace="icon, label"
android:icon="@drawable/flavor_ic_launcher"
android:label="@string/flavor_app_name"
```

って書く。
[ProductFlavorでAndroidManifest.xmlを使い分ける方法は、前に書いた。](http://qiita.com/mickamy9/items/0285ce1035ec1a224ae7#androidmanifest%E3%82%92debug-release%E3%81%A7%E5%88%86%E3%81%91%E3%82%8B)
CentOSでmongodbを再起動できない時の解決方法

startもstopもrestartもできなくて困っていた．

`/var/log/mongodb/mongod.log`の中身を見ると，

```
2015-11-06T12:59:42.191+0000 [initandlisten] exception in initAndListen: 10310 Unable to lock file: /var/lib/mongo/mongod.lock. Is a mongod instance already running?, terminating
```

なんか邪魔なファイルがあるっぽいのでこれを消したらrestartできた(´◔౪◔)۶ﾖｯｼｬ!
OS XにHomebrewでNumPy, SciPy, Matplotlibを入れる(2015/11現在）

# あらまし

以下を参考に掲題のソフトウェアをインストールしたが、若干ハマったので記事にしました

* http://hiho-developer.hatenablog.com/entry/20131221/1387564021
* http://hiho-developer.hatenablog.com/entry/20131221/1387630390

# SciPyインストール

元記事の通り、以下をインストールします。

```
brew update
brew install python3
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew linkapps
```

```
pip3 install numpy
```

ここでハマりその1。

ここまでは良かったのですが、`gfortran`のインストールでエラーが出ました。
曰く、gfortranはgccパッケージに吸収されたとか。

なので、`brew install gfortran`の代わりに

```
brew install gcc
```

そして元記事に戻り、

```
easy_install cython
brew install swig
pip3 install git+http://github.com/scipy/scipy/
```

これでSciPyはインストール出来ました。

# matplotlib

ここでハマり？その2。
元記事ではfreetypeのパスがうまくなく、シンボリックリンクを貼っていましたが、
現在は不要のようです。

```
brew install freetype
# sudo ln -s /usr/local/include/freetype2 /usr/include/freetype ## 不要！
pip3 install matplotlib
```

# IPython

元記事どおり、以下でインストールできます。

```
pip3 install ipython
```

# 参考記事

* http://hiho-developer.hatenablog.com/entry/20131221/1387564021
* http://hiho-developer.hatenablog.com/entry/20131221/1387630390
ツールは単純に作る

ツールは単純に作った方が使いやすい。

 データの入力用のツール、データ処理用のツールを１つのプログラムとするよりは、別々のツールのままにしておく方が便利だ感じた。
　データの入力作業は、入力ミスをともないがちだ。１つのプログラムにしてしまうと、入力ミスをどう防ぐか、入力ミスを修正する機能までプログラムを書かなくてはならなくなる。
　データの入力作業自体は、別の目的でも同じ入力方法を用いることがある。そのときに、ツールをデータ入力と処理とを１つのプログラムにしてあると、データの入力部分も再度、別プログラムの中に入れなくてはならなくなる。
　データの入力作業、入力ミスの修正機能、データ処理自体、これらを１つのプログラムにしてしまうと、プログラムの見通しが悪くなり、メンテナンスもしづらくなってしまう。だから、ツールは単純に作ろう。Pythonなどのライブラリが充実した言語だと、とても簡潔に処理を記述できる。OpenCVの機能の大半はPythonでimport cv2で使える。短い行数でツールが作れる。

　単純なツールを作って、作業を楽に進めよう。


追記：入力データをグラフにしてチェックするツールも作ろう。
WindowsでNumPy, Pandas, Matplotlib, IPython, SciPyを使いたいなら

# tl;dr

[WinPython](http://winpython.github.io/)

# あらまし

数値解析やらなんやらでNumPy, Pandas, Matplotlib, IPython, SciPyを使いたい場合、
通常のPython(python.orgで配布されているという意味で)ではeasy_install やコンパイラでライブラリのビルドやらたくさんのことをしないといけないようです。

* http://qiita.com/mojaie/items/995661f7467ffdb40331
* http://scipy.jp/install.html

# ...さくっと使いたいですよね。

そこで[WinPython](http://winpython.github.io/)です。

WinPythonは以下が全部入りです。

* NumPy
* SciPy
* Sympy
* Matplotlib
* Pandas
* pyqtgraph
* IPython
* Spyder

また、インストーラはデフォルトでPortableなので、コントロールパネルから削除しなくてもインストール先のディレクトリを削除すればアンインストール完了です。

もし関連付け等をしたければ、WinPython Controll Panelから設定ができます。

# 注意事項

WinPythonでググると http://winpython.sourceforge.net/ が最初に出てきますが、このページの先頭に書いてあるとおり、
今は http://winpython.github.io/ でホストされています。最新版もこちらでのみ公開されているので、注意が必要です。

# 参考

* http://winpython.sourceforge.net/
* http://www.scipy.org/install.html
* http://qiita.com/mojaie/items/995661f7467ffdb40331
Lensを使った Text から String への変換

[lens-aeson](http://hackage.haskell.org/package/lens-aeson)でJSONをパースした時によく使うのでメモ。例えば以下の様なJSONがあって名前を取り出して表示したいとする。

```json
{
    "age": 24,
    "name": "lotz"
}
```

普通に[key](http://hackage.haskell.org/package/lens-aeson/docs/Data-Aeson-Lens.html#v:key)で取り出して[_String](http://hackage.haskell.org/package/lens-aeson/docs/Data-Aeson-Lens.html#v:_String)でパターンマッチをすると文字列は`Text`で取得される。だけど`String`で欲しい場合もあって、もちろん[unpack](https://hackage.haskell.org/package/text/docs/Data-Text.html#v:unpack)を使えばいいんだけど出来ればLensで処理してしまいたい。そんな時は[lens](http://hackage.haskell.org/package/lens)にある`Data.Text.Lens`の[unpacked](http://hackage.haskell.org/package/lens/docs/Data-Text-Lens.html#v:unpacked)というIsoが役に立つ。

```hs
{-# LANGUAGE OverloadedStrings #-}

import Control.Lens
import Data.Maybe (fromJust)
import Data.Aeson.Lens
import Data.Text.Lens

jsonString :: String
jsonString = "{\"age\": 24, \"name\": \"lotz\"}"

main = putStrLn . fromJust $ jsonString ^? key "name" . _String . unpacked
-- lotz
```
RedmineのCSVおよびPDFの文字化けを解消

自分のタスク管理用に稼働させているRedmineでCSVやPDFを出力すると文字化けが発生します。これを解消したので、手順を説明します。

# 前提

* Redmineは[openshift/openshift-redmine-quickstart · GitHub](https://github.com/openshift/openshift-redmine-quickstart)で構築。
* OpenShift上で稼働。

# 手順

[PDFおよびCSVの文字化けを回避する — Redmine.JP](http://redmine.jp/faq/general/pdfcsv/)によれば、`config/locales/ja.yml`を開き、`general_csv_encoding: CP932`にすれば良いとのこと。

`rhc git-clone myredmine`で稼働中のソースコードを取得して、`config/locales/ja.yml`を開いたところ、既に`general_csv_encoding: CP932`になっていました。

試しに`general_csv_encoding: SJIS`に設定して`git push`したところ、文字化けが解消しました。
UnityでCSVを扱う。または如何にしてnugetを使って楽をするか。

UnityでCSVファイルを読み込むときにCsvHelperを使うサンプルが見当たらなかった＆フツーのC#な人たちはnugetを使うのがデフォルトといいますか、使い慣れてると思うんですがUnity周りの人たちは意外と知らなかったりするんじゃないかなーと思い、記載してみました。

Unityでは使えないライブラリも多いと思いますが、C#使っててnuget使わないともったいないかもですよ。

* * *

UnityでCSVを簡易に扱うなら
string line = reader.ReadLine();
string[] values = line.Split(',');
というようにSplitで「,」で区切るだけでもいいのですが、「,」がCSV文中に含まれている場合などに対応できません。
そこで、CsvHelperの助けを借ります。

CsvHelperはC#でCSVファイルを読み込むためのライブラリです。
http://joshclose.github.io/CsvHelper/




まずは[nugetのサイト](https://www.nuget.org/packages/CsvHelper/)を開く。
画面左側のDownloadをクリックすると

csvhelper.X.X.X.nupkg (X.X.X部分はバージョン番号により可変)がダウンロードできる。
このファイルは実のところzipファイルなので適当な解凍ソフトで解凍する。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/61393/40eb56f4-5b9d-3e2a-afa0-a07815f7d1de.png)

/lib/net20　フォルダにあるCsvHelper.dllだけが必要。他のファイルは必要なし。
CsvHelper.dll　をUnityプロジェクトのAssets以下のどこかに置く。


で、あとは以下のように使用します。

```csharp:sample.cs

using System.IO;
using System.Text;
using UnityEngine;
using CsvHelper;


public class sample : MonoBehaviour
{
	void Load()
	{
		TextAsset csv = Resources.Load( "sample_csv" ) as TextAsset;

		StringReader	strReader = new StringReader(csv.text);
		CsvReader		csvReader = new CsvReader(strReader);

		while (csvReader.Read())
		{
			string[] records = csvReader.CurrentRecord;
			Debug.Log(records[0]);
			Debug.Log(records[1]);
			Debug.Log(records[2]);
		}
	}
}
```

CSVファイルの１行目は強制的にヘッダ行（フィールド定義行）とみなされるので注意。



自作クラスにマッピングする形での読み込み等もできる。
そのあたりの詳しくは以下リンク参照。



http://kageura.hatenadiary.jp/entry/2015/05/01/193000
http://kageura.hatenadiary.jp/entry/2015/05/20/200000
ELB配下のnginxで正規表現を使ったIP制限をする

タイトルの通り、ELB配下のnginxで正規表現を使ったIP制限をする必要があったのでメモ。

# 環境

+ AmazonLinux
+ nginx1.8.0
+ ELBに流れたトラフィックがEC2に流れるように設定

# 前提知識

+ ELBを経由するとアクセス元のIPアドレスはリクエストヘッダのX-Forwarded-Forに記載される。nginxでは組み込み変数として$http_x_forwarded_forとして取得可能
+ 正規表現でないIPアドレスの許可はallow,denyディレティブを設定することで可能（そもそもSecurityGroupで制限はできる）
+ nginxではsetディレクティブを利用することで自分で変数を設定することが出来る

```nginx.conf
# example
set $foo "Hello World!";
```

+ ifディレクティブを使うことで条件分岐が出来る。ただし、公式サイトでも利用時の注意が書いてあるので一度利用する場合には見ておいたほうが良い（次項で記載）

# ifディレクティブ利用時の注意点

以下の公式記事にあるようにifディレクトリを利用の際には注意が必要。

[If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)

具体的には以下のような副作用がある

+ locationコンテキスト内での利用で意図しない動作になる場合がある（例が記載されている。2つヘッダを加えたつもりが１つしか追加されていない）
+ 最悪、SIGSEGVでクラッシュ

とはいえどうしても使いたい場合にはどうするか

+ `try_files`を使う
+ ifディレクティブ内で`return`と`rewrite...last`を利用する(これは安全と書いてある）
+ locationコンテキストでなく、serverコンテキストで利用できないか検討する
+ それでもどうしても使いたい場合、テストをしっかりする

という感じだと思います。
なので、ifは絶対使うなということでなく、可能な限りlocationディレクティブで使うのはやめてどうしても使いたい場合も、しっかりテストしてねという話だと思います。

# やってみる

今回はデフォルトの状態のnginx.confのserverディレクティブを変更し、正規表現で指定されたIP以外のアクセスの場合、ステータスコード403を返却するようにしてみます。

```/etc/nginx/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        root         /usr/share/nginx/html;

        set $invalid_access 1;

        # ELB health check
        if ($http_user_agent = "ELB-HealthChecker/1.0") {
                set $invalid_access 0;
        }
        
        # allow IPs
        if ($http_x_forwarded_for ~* ^111\.111\.111\.11[0-9]$) {
                set $invalid_access 0;
        }
        if ($invalid_access) {
                return 403;
        }
```

以下、ざっと説明。

+ 変数 **$invalid_access** を独自で定義し、デフォルトは1(不正）とする
+ UserAgentで **ELB-HealthChecker/1.0** となっているものはELBのヘルスチェックなので0(許可)（もっと厳密にやる場合、上記ELBのUAかつアクセスするlocationがヘルスチェック用のパスの場合のみOKとすると良いと思います)
+ 正規表現でアクセス可能なIPが$http_forwarded_forに指定されいている場合も0(許可）
+ $invalid_accessが1の場合、不正アクセスとみなしステータスコード403を返却する

試しにnginxのインストールしたEC2からELB経由でアクセスしようとすると403となり、正規表現で記載したIPアドレスからのアクセスの場合、HTMLが取得できます。

その他条件を増やす場合も同じようにifディレクティブを増やせば大丈夫かと思います。
PowerShellのスクリプトを、実行権限がRestrictedのまま実行するためのおまじない

##おまじない
PowerShellを起動後、以下のコマンドを実行する

```ps1:
function call($path){
  $script = Get-Content $path
  Invoke-Expression("&{$script} $args")
}
```

##使い方（例）
```ps1:
function call($path){
  $script = Get-Content $path
  Invoke-Expression("&{$script} $args")
}

call sample.ps1 minr
```

```ps1:sample.ps1
param($name)
echo ('私の名前は' + $name + 'です')
```

```txt:結果
私の名前はminrです
```



##まとめ

用法用量を守ってお使い下さい。
RubyからRustの関数をつかう → はやい

この記事ではruby 2.2.3とrustc 1.4.0を使用しています。

# すごい要約

- [RubyからGoの関数をつかう → はやい - Qiita](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02)
- [Crystalで書く → はやい - Qiita](http://qiita.com/etmnk/items/2801cd09c6ec4439c8fd)

とのことです。

# Rust、はやい

最初にRubyとRustの計算速度を比べるため、フィボナッチ数を単純に計算するやつをそれぞれ書きました。

```rb:fib.rb
def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(40)
```

```rust:main.rs
fn fib(n: u32) -> u32 {
    if n <= 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

fn main() {
    println!("{}", fib(40));
}
```

実行結果は以下です。

```:Ruby
$ time ruby fib.rb
102334155

real    0m12.538s
user    0m12.462s
sys     0m0.047s
```

```:Rust
$ time cargo run
102334155

real    0m1.468s
user    0m1.398s
sys     0m0.063s
```

```:ビルド済みRust
$ time ./target/release/fib
102334155

real    0m0.517s
user    0m0.514s
sys     0m0.002s
```

この処理だとRustの方がはやいようです。

# Rustを共有ライブラリにする

RustをShared LibraryとしてコンパイルしてRubyから呼ぶために以下の変更を加えます。

```rust:lib.rs
#[no_mangle]
pub extern fn fib(n: u32) -> u32 {
    if n <= 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}
```

```toml:Cargo.toml
[lib]
name = "fib"
crate-type = ["dylib"]
```

ビルドします。

```
$ cargo build --release
```

`target/release` 以下に `libfib.dylib` が生成されていたら成功です。


# RubyからRustの関数を呼ぶ

事前に `ffi` をインストールしてください。

```ruby:rust-fib.rb
require "ffi"

module Fib
  extend FFI::Library
  ffi_lib 'target/release/libfib.dylib'
  attach_function :fib, [:uint], :uint
end

puts Fib.fib(40)
```

# Ruby meets Rust

速度の計測です。

Ruby | Ruby + Rust | Ruby + Go |
:---|:---|:---
13.311s | 0.629s | 0.725s
13.262s | 0.639s | 0.723s
13.621s | 0.621s | 0.720s

どの言語も仲良くやっていくのが平和でよいなと思いました。
[ITMS-90502]アプリ申請時エラーの対処


```
ERROR ITMS-90502: “Invalid Bundle. Apps that only contain the arm64 slice must also have ‘arm64′ in the list of UIRequiredDeviceCapabilities in Info.plist.”
```

と言われてtvOSのアプリが申請できなかった。
PodのすべてのInfo.plistに

```xml
<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>arm64</string>
	</array>
```
を追記したら通った。
varよりletを使った方が良い

と思いました。

たとえば、0から4までの整数を返す5つの関数を作成しようと思って次のようなコードを作成したとしましょう。これを実行すると、期待に反して、arrayのそれぞれの要素を呼び出して得られる値は全て5となります。

```js
function F() {
... var array = [];
... for (var i = 0; i < 5; i++) {
..... array[i] = function () {
....... return i;
....... };
..... }
... return array;
... }
undefined
> var array = F();
undefined
> array[0]();
5
> array[1]();
5
> array[2]();
5
> array[3]();
5
> array[4]();
5
```

これ自体はJavaScript以外の言語でもやってしまいがちな間違いです。修正しましょう。

```js
> function F() {
... var array = [];
... for (var i = 0; i < 5; i++) {
..... var j = i;
..... array[j] = function () {
....... return j;
....... };
..... }
... return array;
... }
undefined
> var array = F();
undefined
> array[0]();
4
> array[1]();
4
> array[2]();
4
> array[3]();
4
> array[4]();
4
```

JavaScript以外の普通の言語の感覚で修正しましたが、これでも上手く行きません。C#などならこれで上手く行くはずなのですが。

これは、JavaScriptの場合、変数の有効範囲は関数単位だからです。上のコードの場合、変数`j`の有効範囲は関数`F`の全域です。ブロック単位の有効範囲というものは`var`で宣言された変数にはなく、5回のループの中で使われている変数`j`は全て**同じ変数**です。

このような場合には`let`で変数を宣言しなければなりません。`let`で宣言された変数はブロック単位の有効範囲を有します。

```js
> function F() {
... var array = [];
... for (var i = 0; i < 5; i++) {
..... let j = i;
..... array[j] = function () {
....... return j;
....... };
..... }
... return array;
... }
undefined
> var array = F();
undefined
> array[0]();
0
> array[1]();
1
> array[2]();
2
> array[3]();
3
> array[4]();
4
```

ちなみに、`let`を使いたくない場合には、クロージャを使います。

```js
> function F() {
... var array = [];
... for (var i = 0; i < 5; i++) {
..... array[i] = (function (x) {
....... return function () {
......... return x;
......... };
....... }(i));
..... }
... return array;
... }
undefined
> var array = F();
undefined
> array[0]();
0
> array[1]();
1
> array[2]();
2
> array[3]();
3
> array[4]();
4
```
上流工程を後で取り戻すにはどれほどのことをすればよいのか

# 0. きっかけ

後から参入したプロジェクトで仕事を進めていくうちに、自分が入るより前の工程での検討不足やミスを洗い出すことをまずしないとやっていけない、ということが何度かありました。前工程のツケを押しつけられたように感じ、ツケを取り戻す分だけ作業が増えて面倒に思うこともしばしば。そんなわけで、前工程で手抜きを取り戻すのにどのくらいコストがかかるのか、ちょっと調べてみました。

# 1. Error Cost Escalation Through the Project Life Cycle

いかにもそれっぽいタイトルの論文がありました。
http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20100036670.pdf

超ななめ読みですが、三つの尺度で、要件定義を1とした場合、それをテストで取り戻すのが、21倍、61~78倍、28倍、のようです。

要件定義で1時間分さぼったのをテスト工程でとりかえそうとしたら、3人日(1人日=8h)はみておく必要があるということでしょうか・・・

# 2. THE SOFTWARE ECONOMICS OF LATE BUG FIXES:

バグ修正を後回しにすることの経済という感じでしょうか。
http://www.wsrcg.com/PDFs/Software-Economics.pdf

システムテストを1とした場合、要件定義が50~75という図になっていますね。


# 3. むしろITパスポートの問題になってる

「システム開発における、エラーを検出した時期とその不具合の修正にかかる対応費用の関係を最も適切に示したグラフはどれか。」

http://itpro.nikkeibp.co.jp/article/COLUMN/20100120/343445/

比率がどのくらいはともかく、後にいくほど増えるというのは常識として持っておきなさいということでしょうか。

# 4. そういえば、テストの仕事はしばしば新人にまわされているような...

この業界、テストやドキュメント作成が新人の仕事みたいな話はよく聞きますね。それは、上流工程の責任をうやむやにして、無垢な新人に??... 

# 5. もっと知らないとやばい!!

弱肉強食、撃たなければ撃たれる、ような業界だとこの頃感じていましたが。もっと仕組みをおさえなければ。

#### 参考サイト

http://www.atmarkit.co.jp/ait/articles/0812/15/news140.html

https://www.x-rad.jp/wp-content/uploads/2015/04/xRAD20150424NEC.pdf

http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20100036670.pdf

http://www.ramm.com/manuals/Find%20the%20Answer/#25707.htm

http://wiz7.hatenablog.com/entry/2015/03/30/060000

https://ja.wikipedia.org/wiki/%E4%BA%BA%E6%9C%88%E3%81%AE%E7%A5%9E%E8%A9%B1

http://ameblo.jp/openoffice-road/entry-10859352784.html
UnityでParseを使う時に陥りがちなワナ

皆さんParse使ってます？
[こちら](http://qiita.com/Ijoru/items/19b53566eef1d01e97ac)の記事でも書きましたが、秒間30リクエストまで無料というゲーム開発者を幸せにしてくれる脅威のmBaaSです。

で、Parseで検索してみると結構サンプルが出てくるんですよね。
見てみると、みなさま大抵はレスポンスの受け取りにContinueWith()を使ってらっしゃる。
公式のDocsにも書いてあるので当然です。

ただ、実はContinueWith()を使うとハマります。
今回はそこらへんに関してちょこっとノウハウを書いてみようと思います。

## 何が問題なのか？
んでは、ParseのHogeテーブルから全件取得するクエリを書いてみましょう。
※↓は正常系のみ書いてます。組み込む際はエラーハンドリングの処理も書きましょー

```csharp
    public void ParseRequestTest()
    {
        var query = new ParseQuery<ParseObject>("Hoge");
        query.FindAsync().ContinueWith(t => {
            var objectIds = new List<string>();

            // FindAsync()だとt.ResultにはIEnumerable<ParseObject>が入っている
            foreach (var parseObject in t.Result) {
                // とりあえずobjectIdでも集めてみようかな
                objectIds.Add(parseObject.ObjectId);
            }

            // uGUIのTextに表示してみようかな
            GameObject.Find("ObjectIds").GetComponent<Text>().text = objectIds.ToString();

            // ついでにPlayerPrefsにも放り込んでみようかな
            PlayerPrefs.SetString("objectIds", objectIds.ToString());
            PlayerPrefs.Save();
        });
    }
```

至って普通のコードに見えますが、実行するとコケます。

理由はカンタン。
ContinueWith()のコールバックは別スレッドで実行されるので、UnityのAPIが使えないのです。
GameObjectもいじれませんし、PlayerPrefsへの書き込みもできません。

## じゃあどうすればいいの？
答えは単純で、ContinueWith()を使わなければOK。
実際にContinueWith()を使わないメソッドを作ってみましょー。

```csharp
    public void ParseRequestTest()
    {
        StartCoroutine(ParseRequestTestCoroutine());
    }

    private IEnumerator ParseRequestTestCoroutine()
    {
        var query = new ParseQuery<ParseObject>("Hoge");

        // ContinueWith()のコールバックで得られるリクエストスレッドオブジェクトは○○Async()の戻り値でも得られるのでコレを利用
        var t = query.FindAsync();
        yield return new WaitUntil( () => t.IsCompleted );// リクエストが終わるまで待つ

        var objectIds = new List<string>();
        // FindAsync()だとt.ResultにはIEnumerable<ParseObject>が入っている
        foreach (var parseObject in t.Result) {
            // とりあえずobjectIdでも集めてみようかな
            objectIds.Add(parseObject.ObjectId);
        }

        // uGUIのTextに表示してみようかな
        GameObject.Find("ObjectIds").GetComponent<Text>().text = objectIds.ToString();

        // ついでにPlayerPrefsにも放り込んでみようかな
        PlayerPrefs.SetString("objectIds", objectIds.ToString());
        PlayerPrefs.Save();
    }
```

Parseのタスクオブジェクトは、ContinueWith()のコールバックだけではなく○○Async()メソッドの戻り値としても受け取れるので、こいつのIsCompletedを監視すればOK。
ちとコードが長くはなりますが、一般的なコルーチンとして扱えるのでベンリです。

---

2016/6/1追記: Unity5.3から登場したWaitUntilを使ったパターンの編集リクエストをいただきましたので、反映しました。
taskがIsCompletedになるのを待っていた部分で、whileの代わりに使用しています。
情報ありがとうございます！
td-agentのBufferFileの状態をzabbixで監視したかった

# 今回はtd-agentのバッファーディレクトリ内からいろいろ情報取得したかったので、ざびたんに協力してもらいました。

- まずはエージェントへの設定から。※今回は動作中のzabbixを対象としています。

```lang:/etc/zabbix/zabbix_agentd.d/userparameter_td-agent.conf 
UserParameter=td-agent.dirused[*],du -bs $1 | cut -f1 2>/dev/null
UserParameter=td-agent.bufnum[*],ls -lt $1 2>/dev/null | wc -l
UserParameter=td-agent.filetime[*],ls -trl --time-style='+%s' $1 | head -n2 | sed -e '1d' | sed -E 's/\s+/,/g' | cut -d, -f6 2>/dev/null
```
1行目：とあるディレクトリの使用容量取得
2行目：とあるディレクトリにある全バッファーファイル数の取得
3行目：とあるディレクトリにある一番古いバッファーファイルのエポックタイム取得

----
その後、zabbixのWebコンソールから下記のアイテムを設定。

- 1行目に対応するアイテム
![zbx_tda1.png](https://qiita-image-store.s3.amazonaws.com/0/96605/12cf5b87-1fed-9ba0-c728-47cbecab66e1.png)

----
- 2行目に対応するアイテム
![zbx_tda2.png](https://qiita-image-store.s3.amazonaws.com/0/96605/629dc73c-5372-9e3d-0b07-1bce1d6dde63.png)

----
- 3行目に対応するアイテム
![zbx_tda3.png](https://qiita-image-store.s3.amazonaws.com/0/96605/c6596105-235d-b662-fb61-ec4f0f648238.png)

----

あとは適当にグラフやトリガーを設定するだけです。
Macでアプリがフリーズしたら強制終了しよう！やり方6選。


ああ、フリーズした！反応しない！ぐるぐる言っとる！仕方ないアプリ強制終了しよう。
ってよくありますよね。
ということで、知っている限りでMacでアプリケーションを強制終了させる6つの方法を書いてみました。

- Dockで右クリックをしてからOptionを押す
- 左上のダイアログ（りんごマーク）を押す
- `Cmd+option+esc` でダイアログを出す
- Activityモニターから操作する
- Terminalから操作する
- 非推奨方法

## Dockから強制終了させる方法
かつてはDockで目的のアプリ上で右クリックすると強制終了の項目が並んでいた気がするのですが、現在では終了だけです。それではぐるぐるしたやつは解決できません。
そこで **Option押す** と終了が強制終了に変わります。

![kobito.gif](https://qiita-image-store.s3.amazonaws.com/0/58800/5cea0b5d-b2a0-450e-2737-029a3869e88d.gif "kobito.gif")

※ ときどき混乱している人いるんですけど、終了は終了であってCmd+Qも終了であって、強制終了ではないのです。

よい点

+ Dock上で右クリックは誰にでもわかりやすそう

わるい点

+ Option押すのはわかりにくそう

とはいえOption押すとなにかと変わるのはMacの王道なので、カフェでコーヒー飲んでSafariしか使ってない人たちにも知っておいてもらいたいものです。

## 左上からダイアログを出す方法

ここです。

![force_quit.png](https://qiita-image-store.s3.amazonaws.com/0/58800/9b82229b-d8c1-6434-7fa8-41193ba9affa.png "force_quit.png")

*Shift押すとダイアログを出さずに最前面にあるアプリが強制終了されます。スクリーンショット撮る都合でそっちが表示されています*

強制終了を選択してみるとこのようなダイアログが出ます。

![Kobito.6ix3rr.png](https://qiita-image-store.s3.amazonaws.com/0/58800/febb8dc1-2d30-98fc-ac9d-d8db54b99fd0.png "Kobito.6ix3rr.png")

選べば終了できます。簡単ですね。

よい点

+ 困ったらりんごマーク押してみ？の法則(今考えた)にしたがっている
+ 選びやすい気がする！
+ Shift押すと最前面のアプリを強制終了できるので早い

わるい点

+ 特にないのですが、ショートカットの方が早いのでそっち覚えた方が個人的におすすめ


## キーボードショートカットでダイアログを出す方法

`Cmd+option+esc` を押すと以下のようなダイアログが出るので選んで終了です。

![Kobito.6ix3rr.png](https://qiita-image-store.s3.amazonaws.com/0/58800/febb8dc1-2d30-98fc-ac9d-d8db54b99fd0.png "Kobito.6ix3rr.png")
*使い回し画像です*

これまたShiftを押すとダイアログを出すまでもなく即強制終了です。

よい点

+ 早い
+ Shiftをつければ爆速。

わるい点

+ 意図せずにShiftも押しちゃうと有無を言わさず今使用しているアプリが死にます。保存しますか？とかないんで作業中のやつは生きててくださいと祈るだけです。

Shift押すか押さないかの判断がきちんとできる人にはこれが一番おすすめです。

## Activity Monitorから

Activity Monitorを起動して強制終了したい項目を選びましょう。**意図的に** Not Responding状態にされたFireFoxを選べばいいですね！

![Kobito.WEHo1G.png](https://qiita-image-store.s3.amazonaws.com/0/58800/267e5b00-7e73-4a60-349c-8fa5d02e6f58.png "Kobito.WEHo1G.png")

![Kobito.gFS4zM.png](https://qiita-image-store.s3.amazonaws.com/0/58800/b8262297-1ef6-a056-515b-a07062b23c25.png "Kobito.gFS4zM.png")


よい点

+ フリーズしているのは文字が赤くなるからまちがえないと思う
+ DockやLaunchpadから起動できるGUI感
+ Spotlightからも起動できる
+ Windowsのタスクマネージャー感が移行してきた人にはいいかも？

わるい点

+ 選択肢多くて探すのが大変
+ ステップ多い気がする

## ターミナルから

id特定して、`sudo kill`しまーす！イェイイェイ！っていうやり方。
[プロセスをプロセス名でkillする方法](http://qiita.com/14021939/items/05c88cbd64f896116bec)というのも見つけました。

よいところ

+ どうせターミナル開いているって人へターミナルを操作させる安心感

わるいところ

+ 慣れが必要
+ id特定とかいろいろとめんどいので自分ではほとんどやらない

やれますよ程度に書いているだけですし、この方法採用したい人は別にこの記事見て学ぶことなんてないやろとかいう考えによる雑なやつ。


## 電源ボタン長押ししちゃう

そもそもこの記事を書く発端です。
**『アプリがフリーズしたら、Mac自体を終了させて解決しています！』** と聞いて『は？なにその荒業』ってなったので書きました。

よい点

+ 大胆さアピール

わるい点

+ なんでMac自体を強制終了させてんねん

やめましょう。

## 結論

個人的にはCmd+Option+escが早くてスキです。ダイアログも選びやすいですし。別にりんごマークから起動させてもいいと思います。
でも、WindowsからMacに移りました！って会社の人には一律アクティビティモニタの存在教えてます。習慣の尊重のつもりです。ありがたいのかどうかは知りません。

Mac自体の再起動についてはアグレッシブだなーって思います。

以上です。
PhantomJSことはじめ

phantomJSのQuickStartを参考にしながら導入していこうと思います
http://phantomjs.org/quick-start.html

# インストール

```bash:
$ brew install phantomjs
```

# hello world

```javascript:hello.js
console.log('hello world');
phantom.exit();
```

実行

```bash:
$ phantomjs hello.js
> hello world
```

# ページのロード
ページをロードして、ページまるごとpng画像として保存します

```javascript:pageload.js
var page = require('webpage').create(),
	system = require('system'),
	address;

if (system.args.length === 1) {
	console.log('Usage: pageload.js <some URL>');
}

address = system.args[1];

page.open(address, function(status) {
	if (status !== 'success') {
		console.log('FAIL to load the address');
	} else {
		page.render('page.png');
	}
	phantom.exit();
});
```

実行

```bash:
& phantomjs pageload.js http://google.com
```

結果
page.pngという画像が保存されているはずです

# ページのロードまでの時間を測定

リクエストを送ってからページをロードするまでの時間(ミリ秒)を測定します

```javascript:loadspeed.js
var page = require('webpage').create(),
	system = require('system'),
	t,
	adress;

if (system.args.length === 1) {
	console.log('Usage: loadspeed.js <some URL>');
}

t = Date.now();
address = system.args[1];

page.open(address, function(status) {
	if (status !== 'success') {
		console.log('FAIL to load the address');
	} else {
		t = Date.now() - t;
		console.log('Loading ' + system.args[1]);
		console.log('Loading time ' + t + 'msec');
	}
	phantom.exit();
});
```

実行

```bash:
$ phantomjs loadspeed.js http://google.com
> Loading http://google.com
> Loading time 210msec
```
apt-get install で libssl-dev が 404 Not found と言われました。

UbuntuでPython環境を作ろうとしたらエラーがでました。VagrantのUbuntu14.04です。

# apt-get install が 失敗
apt-get でインストールしようとしたところ失敗しました。

```bash:
sudo apt-get install build-essential zlib1g-dev libbz2-dev libssl-dev libreadline-dev libncurses5-dev libsqlite3-dev libgdbm-dev libdb-dev libexpat-dev libpcap-dev liblzma-dev libpcre3-dev curl python-pip

略

Need to get 3,722 kB/33.5 MB of archives.
After this operation, 126 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Err http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ trusty-updates/main linux-libc-dev amd64 3.13.0-48.80
 404  Not Found [IP: xxx.xxx.214.78 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main linux-libc-dev amd64 3.xxx.0-48.80
 404  Not Found [IP: xxx.xxx.91.13 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main libdpkg-perl all 1.17.5ubuntu5.3
 404  Not Found [IP: xxx.xxx.91.13 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main dpkg-dev all 1.17.5ubuntu5.3
 404  Not Found [IP: xxx.xxx.91.13 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main libssl-dev amd64 1.0.1f-1ubuntu2.11
 404  Not Found [IP: xxx.xxx.91.13 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main libssl-doc all 1.0.1f-1ubuntu2.11
 404  Not Found [IP: xxx.xxx.91.13 80]
```
libssl-devが入りません(^o^;

# apt-get を update する

```
sudo apt-get update 
```

# 再度installすると

```
sudo apt-get install 略
```
今度は成功しました＼(^o^)／
ag(the_silver_searcher) で特定のファイルだけ検索する

[ggreer/the_silver_searcher](https://github.com/ggreer/the_silver_searcher)

ag で検索する時に， `--csharp` (とか `--ruby` )とかすれば特定のファイルだけで検索してくれるようになるので， Unity のコードを検索する際に prefab とか除外したければ， `--csharp` を使えば良いのですが(詳しくは `ag --list-file-types` 参照)
Unity で開発していると逆に **prefab**  やら **meta** ファイルの中だけを検索したい場合があります．

**prefab** や **meta** はファイルタイプに用意されていないようなので，検索したければファイル指定無しで絞り込むか， `find` と組み合わせるしか無いかなーって思ってたんですが…次の書き方でいけました．(zsh の場合)

```shell-session
ag -G '.*\.meta' PATTERN
ag -G '.*\.prefab' PATTERN
```

あと，こういう検索したい時は大抵 guid を調べる時なので，

```
ag -G '.*\.prefab' PATTERN -B 10 -A 10
```
とかすると， `PATTERN` の前後も拾えるので，どの GameObject かあたりつけやすくなります．
JAVA 配列の宣言と確保

<FONT color="#ff0000">■配列の宣言と確保</font>
**型名 配列変数名[];
配列変数名 = new 型名[要素数];**

例

```java
int a[];
a = new int[5];
```
<br>


<FONT color="#ff0000">■配列の宣言と確保をまとめた記述方法</font>
**型名 配列変数名[] = new 型名[要素数];**
配列の宣言と要素の確保はまとめて次のように記述することもできます。

例

```java
int b[] = new int[5];
```
リリース用keystoreでAPKをビルドするとGooglePlayGameServiceが使えなくなってしまった問題


### 状況

デバッグ中は問題なくGooglePlayGameServiceが使えてたのに、リリース用のkeystoreを作ってビルドするとサインインに失敗する問題に直面した。

### 解決方法
どうやらkeystoreが変わるとゲームサービスへの再登録が必要らしい。
BundleIdentiferが同一でも、認証周りで通らなくなる模様。

リリース用keystoreで著名されたAPKをアップロードした後、GooglePlayDeveloperConsoleのゲームサービス＞リンク済みアプリの画面から`別のアプリをリンク`を押してアプリを登録。
すると以下のような画面になり、２個目のアプリとしてリンクされた。

![Kobito.qRNRfP.png](https://qiita-image-store.s3.amazonaws.com/0/97509/13ca13c2-a348-f972-7936-0acd9b61a6c5.png "Kobito.qRNRfP.png")

これで、デバッグとリリースどちらも動くようになった。
baserCMSのインストールとリセット


最近、baserCMSのカスタマイズを行っているので、その辺のナレッジをまとめます。
今回は導入編として、インストールとリセット方法について紹介します。

##baserCMSとは？
CakePHPベース作られた国産のCMSです。
詳細は[公式サイト](http://basercms.net/)を参照ください。

##インストール
以下の2 種類があります。
* インストラーページからのインストール（[詳細はこちら](http://basercms.net/manuals/3/introductions/4.html)）
* cakeコマンドでのインストール

今回は、cakeコマンドでのインストールについて説明します。
cakeコマンドに関しては[こちら](http://book.cakephp.org/2.0/ja/console-and-shells.html)を参照ください。

今回は、baserCMSに内包されているBcManagerというシェルを使ってインストールします。
以下の要領でシェルを実行します。

```
コマンド仕様:
${baserCMSのインストールディレクトリ}/app/Console/cake bc_manager install {サイト名} {データベースの種類} {管理者アカウント名} {管理者パスワード} {管理者Eメール} -host {DBホスト名} -database {DB名} -login {DBユーザー名} -password {DBパスワード} -prefix {DBプレフィックス} -port {DBポート} -baseurl {RewriteBaseに設定するURL}

実行例(ローカル環境でMySQLを使用の場合):
$/Library/WebServer/Documents/basercms/app/Console/cake bc_manager install http://localhost/ mysql admin password admin@test.com -host localhost -database localdb -login root -password password -prefix mysql_ -port 3306 -baseurl http://localhost/

```

データベースの種類は、以下のように設定するようです。
* MySQL:mysql
* PostgreSQL:postgres
* SQLite3:sqlite

ポート番号などはデータベースの種類に応じて引数なしでも実行できるようです。

##リセット
既存のマスターデータやインストール時の設定に関しては、以下のcakeコマンドを実行することで簡単に削除出来ます。

```
コマンド:
${baserCMSのインストールディレクトリ}/app/Console/cake bc_manager reset

```

削除後は、再度上記のインストール手順でインストールが可能です。
数値を min <= n < max の範囲で正規化する関数

作ったのだがこれで合ってんのかな？自信がない

```php:normalize.php

/**
 * 数値を $min <= $num < $max 内で 正規化する
 * @param number $num
 * @param number $min
 * @param number $max
 * @return number
 */
function normalize($num, $min = 0, $max = 1)
{
    $range = abs($max - $min);
    if ($num < $min) {
        return $num + $range * ceil(abs($num - $min) / $range);
    }
    elseif ($max <= $num) {
        return $num - $range * (floor(abs($num - $max) / $range)+1);
    }

    return $num;
}

```

```php:テスト

// 16進数
for ($i = -32; $i < 32; $i+=7) {
	echo $i." (0, 16) -> ".normalize($i, 0, 16)."\n";
}

// ラジアン
for ($i = 0; $i < 10; $i++) {
	$r = rand() - rand()/1000;
	echo $r." (-PI, PI) -> ".normalize($r, -pi(), pi())."\n";
}

```


```shell-session:実行結果

-32 (0, 16) -> 0
-25 (0, 16) -> 7
-18 (0, 16) -> 14
-11 (0, 16) -> 5
-4 (0, 16) -> 12
3 (0, 16) -> 3
10 (0, 16) -> 10
17 (0, 16) -> 1
24 (0, 16) -> 8
31 (0, 16) -> 15
230283879.779 (-PI, PI) -> -1.3747130930424
2045730304.267 (-PI, PI) -> 0.98633527755737
1993853281.497 (-PI, PI) -> -2.8259015083313
1015556022.465 (-PI, PI) -> -0.23845529556274
350758900.913 (-PI, PI) -> -0.54170942306519
1684963287.536 (-PI, PI) -> 0.87791776657104
1426762641.857 (-PI, PI) -> 0.44229292869568
2100096247.081 (-PI, PI) -> -1.9372346401215
333925744.924 (-PI, PI) -> -0.43795067071915
866942637.172 (-PI, PI) -> 0.52180182933807

```
CentOS7 でtimezoneを設定する

参考にしたURL
****
http://qiita.com/dumpty-alma@github/items/0e43c1b585f1fb90ec8e 

初めの状態
***

おっと、vagrant box からCentOS7をインストールしたら、時間の表示がこのような感じだった。

```bash
[root@localhost ~]# date
Fr 6. Nov 11:12:16 CET 2015
```

timedatectl　というコマンドがあるらしい・・

```bash
timedatectl -h
timedatectl [OPTIONS...] COMMAND ...

Query or change system time and date settings.

  -h --help              Show this help
     --version           Show package version
     --adjust-system-clock
                         Adjust system clock when changing local RTC mode
     --no-pager          Do not pipe output into a pager
  -P --privileged        Acquire privileges before execution
     --no-ask-password   Do not prompt for password
  -H --host=[USER@]HOST  Operate on remote host

Commands:
  status                 Show current time settings
  set-time TIME          Set system time
  set-timezone ZONE      Set system timezone
  list-timezones         Show known timezones
  set-local-rtc BOOL     Control whether RTC is in local time
  set-ntp BOOL           Control whether NTP is enabled
```

timezoneの変更
***
設定できるtime-zone はこれで表示される

```bash
[root@localhost ~]# timedatectl list-timezones
```

では、設定

```bash
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo
[root@localhost ~]# date
Fr 6. Nov 19:24:03 JST 2015
```

なおった～♪
JAVA this(引数); 同一クラスの別コンストラクタの呼び出し

**this(引数); 
別コンストラクタの呼び出し
this(引数)のthis()は、同一クラスの別コンストラクタのを呼び出すためのものです。**

■Character.java

```java
public abstract class Character {
	String name;
	int hp;

	public Character(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	public Character(String name) {
		this.name = name;
	}

	Character() {
		this("冒険者");
		System.out.println("Hero2のコンストラクタが動作");
	}

	public String getName() {
		return this.name;
	}

	public int getHp() {
		return this.hp;
	}

	public void run() {
		System.out.println(this.name + "は逃げ出した");
	}

	public abstract void attack(Matango2 m1);

}
```

■Wizard.java

```java
public class Wizard extends Character {
	int mp;

	public Wizard(String name, int hp) {
		super(name, hp);
	}

	Wizard() {
		super();
	}

	public void attack(Matango2 m) {
		System.out.println(this.name + "の攻撃!");
		System.out.println("敵に3ポイントのダメージ");
		m.hp -= 3;
	}

	public void fireball(Matango2 m) {
		System.out.println(this.name + "は火の玉を放った!");
		System.out.println("敵に20ポイントのダメージ");
		m.hp -= 20;
		this.mp -= 5;
	}

}
```

■Main23.java

```java
public class Main23 {
	public static void main(String[] args) {
				// P519
		Wizard hazardW1 = new Wizard();
		Wizard hazardW2 = new Wizard();
		System.out.println("hazardW1の名前は" + hazardW1.getName() + "です");
	}
}
```

■実行結果
hazardW1の名前は冒険者です
PCRプライマーのTm算出とか濃度計算とか効率化したい

大学の研究でDNAの合成や点変異の導入といった作業をする機会が最近増えてきたため、頻繁にプライマーを設計している。プライマーのTmを算出したり濃度計算するために先生からExcelのファイルをもらったんだけど、イマイチ使いづらい。なのでTmや濃度を計算する簡単なスクリプトをRubyで作ってみた(既存のものを探したほうが早いかもしれないけど)。

## 必要な機能
1. DNA合成PCRプライマーの塩基配列を入力するとTmを算出できる。
2. 点変異導入PCRプライマーの塩基配列を入力するとTmを算出できる。
3. A260の値を渡すことで濃度を算出できる。
4. リバースプライマーの塩基配列を出力できる。

とりあえずこのくらい。

## Primerクラスの定義

あまり深く考えずにクラスを作ってみた。

```rb
class Primer

	def initialize(ary)
		@original_ary = ary.upcase
		@adenine = @original_ary.count "A"
		@guanine = @original_ary.count "G"
		@thymine = @original_ary.count "T"
		@cytosine = @original_ary.count "C"
		@abs_c = @adenine*15300+@guanine*11800+@thymine*9300+@cytosine*7400
	end

	#m_conメソッド：A260を引数とすることでμMスケールの濃度を算出する
	def m_con(abs)
		abs.fdiv(@abs_c)*1000000
	end

	#tmメソッド：アニーリング温度を算出して返す
	def tm
		60.8+0.41*(@guanine+@cytosine)/@original_ary.size*100-500.fdiv(@original_ary.size)
	end
	#tm_insertメソッド:点変異導入時に使用。インサート塩基数を引数としてアニーリング温度を算出して返す
	def tm_insert(ins_num)
		81.5 + 0.41*(@guanine+@cytosine)/@original_ary.size*100-675.fdiv(@original_ary.size-ins_num.to_f)
	end
	#tm_mismatchメソッド:点変異導入時に使用。ミスマッチ塩基数を引数としてアニーリング温度を算出してお返す
	def tm_mismatch(mis_num)
		81.5 + 0.41*(@guanine+@cytosine)/@original_ary.size*100-675.fdiv(@original_ary.size) - mis_num.fdiv(@original_ary.size)
	end

	#rvメソッド。initializeで与えた配列のRv配列を返す
	def rv
        @original_ary.tr("ATGC", "TACG").reverse
    end
end
```

## 動作確認

例えばDNA合成を行うに際して、"CTCTGGACTCTAGCACTGAG"というプライマーのTmや濃度を計算する場合、

```rb
#task1という名前でインスタンスを作成。コンストラクタに塩基配列を渡す。
task1 = Primer.new "CTCTGGACTCTAGCACTGAG" 

#Tmの算出。tmメソッドはTmの値を返す。
p task1.tm

#リバース配列の出力。rvメソッドはインスタンス作成時に渡した塩基配列に対するリバースの配列を返す。
p task1.rv

#濃度の計算。m_conメソッドはA260の値を引数として受け取り、μMスケールの濃度を返す。
p task1.m_con 61.87

```

結果

```rb
58.349999999999994
"CTCAGTGCTAGAGTCCAGAG"
293.0838465182378
```

あくまで自分用に作ったものなので色々と雑ですが・・・
暫定版 YouTube 立体視360度動画のアップロード方法


待ちに待った[YouTubeのVR動画プレイヤーの3D(立体視)対応が来ました!!](http://youtube-global.blogspot.jp/2015/11/youtube-presses-play-on-virtual-reality.html)。
AndroidのYouTubeアプリもCardboardに対応し、3DVR動画が楽しめるようになりました。
そこで、YouTubeに3DVR動画のアップロードする方法を調べてみました。
~~まだ公式でアップロード方法が公開されていないため、正式公開される頃にはこの手順ではなくなると思います。
公式に3D動画のアップロード方法が公開されたら、この手順よりもっと手軽なものになると思います(期待的予想)。~~
[公式でアップロード方法が公開されました。](https://support.google.com/youtube/answer/6316263?hl=ja&ref_topic=2888648)
ということで、暫定版は終了です。

##動画はトップボトムのEquirectangularを用意
動画は、左目用のEquirectangular映像を上、右目用Equirectangular映像を下に並べてたいわゆるトップボトムの映像を用意します。
PCも対象にする場合は、できれば3840x2160@30FPS(4K)でエンコしたものを、Cardboard(モバイル)のみを対象にする場合は2560x1440@30FPSでエンコしたものを用意します。

##メタデータ埋め込み
VR動画をYouTubeにアップロードするには、動画にメタデータを埋め込んでからアップロードしなければなりません。
[こちら](https://support.google.com/youtube/answer/6178631?hl=ja)の360度動画アップロード方法解説ページからMac、Windows用のメタデータ埋め込みアプリ、またはメタデータ埋め込みPythonスクリプトをダウンロードしてください。今回はWindowsのアプリでの解説のみとさせていただきます。
1. アプリをダウンロードして解凍すると、360 Video Metadata Tool.exeが解凍されますので、起動します。
2. "Open"ボタンをクリックして、用意したトップボトムの3DVR動画を開きます。
3. "Spherical"をチェックした後、"3D Top-bottom"のチェックボックスが有効になりますので、ここもチェックします。
4. "Save as"ボタンをクリックして、メタデータを埋め込んだ動画を保存します。

![ytb_meta埋め込みアプリ.png](https://qiita-image-store.s3.amazonaws.com/0/17554/35496f82-929c-f812-08de-e67a816c6515.png)


##メタデータ埋め込んだ動画をYouTubeにアップロード
YouTubeのページの右上にある"アップロード"ボタンをクリックして、メタデータを埋め込んだ動画をアップロードします。
すると、アップロード/動画の処理の進捗および、動画の設定を行う画面に切り替わります。
上に、プログレスバーが表示されていますが、ここは２段階となっており、アップロードの進捗が終了した後、動画の処理の進捗を表示します。
![ytb_upload_progress.png](https://qiita-image-store.s3.amazonaws.com/0/17554/e57efec4-9835-7bcd-7be0-1f78dce7543d.png)
![ytb_process_progress.png](https://qiita-image-store.s3.amazonaws.com/0/17554/3423297c-693d-cca4-67b9-d4a367a8cd3f.png)
下は、動画の各種設定する部分となっております。3D動画の項目がありますが、Side by side~となっており、また、この時点での3D動画の設定は古いものでアナグリフ表示を行う設定となります(多分)。
**この時点では、3D動画の設定のところにはチェックを入れないでください。**
そのほかの項目は必要であれば設定しても構いません。
![ytb_3D_setting_before.png](https://qiita-image-store.s3.amazonaws.com/0/17554/2d07bbfb-64e3-ff8c-a8f5-9556f3c6f4ae.png)

##動画の処理が完了するまで待ちます。
動画の処理が完了するまで待ちます。ちなみに496MBの動画で約15分弱かかりました。
![ytb_処理完了.png](https://qiita-image-store.s3.amazonaws.com/0/17554/e8fc4004-617c-de3c-d0e4-43dc532204cd.png)

##改めて動画の編集画面で、3D動画の設定を行う。
動画の処理が完了したら、上のプログレスバーの右横にある公開ボタンをクリックした後、https://www.youtube.com/my_videos (動画の管理ページ)にアクセスして、いったん現在の編集画面から出ます。
そして、今回アップロードした動画の編集ボタンをクリックし再度、動画の編集画面にアクセスします。
![ytb_video_edit.png](https://qiita-image-store.s3.amazonaws.com/0/17554/9f838091-e92f-ecf4-5ec9-27374d6717b1.png)
すると、3D動画の設定のところが、Side by side~ではなくTop to bottom~に変わっていますので、
**ここで3D動画のチェックボックスにチェックを入れます。**
![ytb_動画の管理.png](https://qiita-image-store.s3.amazonaws.com/0/17554/ef75dc39-2533-b872-46a7-b1d76552feee.png)

あとは、動画の編集ページの上または下にある"変更を保存"ボタンをクリックして反映すると、VRプレイヤーが3D対応になります。
c++ builder XE4, 10.2 Tokyo > ある名前のFormがあるかどうかチェック

```txt:動作環境
C++ Builder XE4 on Windows 7 pro
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

ある名前（例: Form2)のフォームがあるかどうかを知りたい。

http://stackoverflow.com/questions/25610673/delphi-find-form-by-name
でのdelphi実装を参考に以下の実装をした。


```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// method 1
	TComponent *formPtr = Application->FindComponent(L"Form2");

	if (formPtr == NULL) {
		OutputDebugString(L"Form2 not found");
	} else {
		OutputDebugString(L"Form2 found");
	}

	// method 2
	for(int idx=0; idx < Screen->FormCount; idx++) {
		if (Screen->Forms[idx]->Name == L"Form2") {
			OutputDebugString(L"Form2 found");
			return;
		}
	}
	OutputDebugString(L"Form2 not found");
	return;

}
```
Mac上のDockerでホストマシンのCPUコアを最大限に使う


Docker、開発環境の構築に便利ですよね！
ローカルを汚さずにサクっと開発環境を作れるし、別のマシンに環境を配ったり、サーバにデプロイしたりするのも楽チンです。

僕は主に開発環境としてDockerを利用していて、ホストマシンからマウントしたソースコードをコンテナ内で実行することによってコードと実行環境を分離しています。

数百万件のデータを扱ったり何かとCPUヘビーな処理をしたくなる時もあるのですが、そんな時にDockerコンテナからホストマシンのCPUを最大限利用する方法を調べてみました。

ちなみに環境は物理2コア、仮想4コアのMacBookProです。

## 今回利用するDockerのバージョン

こんな感じです。

```
Boot2Docker version 1.8.2, build master : aba6192 - Thu Sep 10 20:58:17 UTC 2015
Docker version 1.8.2, build 0a8c2e3
docker-machine version 0.4.1 (e2c88d6)
```

## CPU負荷テスト用のイメージを準備、試してみる

CPUに負荷をかけることだけを目的としたうまいイメージがあったので、本当にCPUが使えているかどうか試すためにまずはこれをpullしてきます。

```
$ docker pull jess/stress
```

このイメージからコンテナを起動してホスト側マシンのCPUに負荷をかけることが出来れば、ちゃんとCPUが使えていることになりますね！

早速起動してみましょう。コマンドはこちらになります。

```
$ docker run --rm -it jess/stress --cpu 4
```

最後の--cpu 4というのはコンテナが起動した際に実行されるコマンドのオプションで、負荷をテストするCPUの数を指定できます。

今回はテストに利用しているMBPが仮想4コアなので、--cpuには4を指定してみました。

実行した結果はどうなるでしょうか？

```
$ stress: info: [1] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
```

うまく起動できました。topコマンドでCPU利用率を確認してみます。
Boot2DockerのプロバイダにVirtualBoxを利用しているため、ホスト側から見えるコマンド名はVBoxHeadlessになっています。

```
PID    COMMAND      %CPU
36580  VBoxHeadless 100.3
```

おや、負荷をかけるCPUの数に4を指定しているのに実際に負荷がかかっているのは100%(仮想1コア分)になってしまっているようです。

コンテナ内からホストのCPUを全て使えていないようですね。

## Boot2Dockerに割り当てているコア数を確認する

ここで確認するべきなのは、Macは直接Dockerをインストール出来ないので何らかの仮想環境にBoot2DockerというDocker専用の環境を立ち上げて、その中でDockerコンテナを動かしている、という点です。

ということで、VirtualBox上で立ち上げられているBoot2Dockerの設定を確認してみましょう。
一旦Boot2Dockerをストップしてから、VirtualBoxを開きます。

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/28762/72922532-ade9-2830-cf8e-be5a363b4227.jpeg "005.jpg")

左上のギアアイコンの設定ボタンから、システム→プロセッサーと進んでいくと…

![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/28762/29d611d0-9d68-1432-0bde-122737829ff2.jpeg "008.jpg")

案の定、1CPUしか割り当てられていないことがわかります。

これが原因でstressコンテナから2つ以上のCPUコアに負荷をかけようとしても、実際は1コアしか使えなかったわけですね。

ではここを緑色になっている範囲の最大値である4CPUに指定して再度試してみましょう。

## 結果

実行するコマンドは先程のものと同じです。

```
$ docker run --rm -it jess/stress --cpu 4
```

topコマンドはどうなっているでしょう。

```
PID    COMMAND      %CPU
36580  VBoxHeadless 370.8
```

370.8%、ほぼほぼ仮想4コア分の400%が使えていると考えて良さそうです。

これでコンテナ内で並列に大量の処理を行いたい時も、ホストのCPUパワーをあますところなく利用できますね！

## おまけ: 逆にCPU利用数を制限する

VirtualBoxでBoot2Dockerが利用できるコア数を増やしてしまうと、そのVM上で動く全てのコンテナがその分のCPUリソースを利用できるようになってしまいます。

それが嫌な場合、コンテナを起動する時に利用可能なCPUを指定するオプションを使うことによって、コンテナ単位で利用できるCPUに制限を与えることができます。

具体的には

```
$ docker run --rm -it --cpuset-cpus="0,1" jess/stress --cpu 4
```

こんな感じで、--cpuset-cpusオプションを使います。

"0"と指定すると0番目のCPUのみ、"0,1,2"と指定すると0,1,2番目のCPUのみ利用、といった感じで利用するCPUを制限できます。"0-3"などと範囲指定することも可能です。

先程、4コア利用可能と設定したBoot2DockerVM上でコンテナを立ち上げて確認してみましょう。

仮想4コア0,1,2,3番のコアがあるので、そのうちの0,1,2番目、3つのCPUのみ利用できるように制限してコンテナを起動してみましょう。負荷をかけようとするCPUの数は4にしておきます。

```
$ docker run --rm -it --cpuset-cpus="0,1,2" jess/stress --cpu 4
```

topコマンドを確認してみます。

```
PID    COMMAND      %CPU
36580  VBoxHeadless 297.2
```

負荷をかけるCPU数を4つと指定したにもかかわらず、仮想4コア400%中の約300%、つまり3つ分のCPUリソースのみ利用できている表示になっています。

うまく制限できているということですね。
ruby syntax error unexpected keyword

rubyにて。『Loader.rb:12: syntax error unexpected keyword_else(SyntaxError)else^ 、Loader.rb:15:syntax error unexpected keyword_else(SyntaxError)end^』がでております。


以下がコードですが、endはきっちりとじており、何が問題か悩んでおります。お力添えいただけると幸いです。

require './Opener.rb'

class Loader
	def loading
		arry = Array.new
		yomikomi=Opener.new
		spst = yomikomi.fileopen
		n = 2
		while spst.cell(n,7) != nil do 
			if spst.cell(n,7) == 'なし' then
			n++
			else
			arry = spst.cell(n,7)
			n++
			end
		end
	end
end
NSCalendarを使ったNSDateの日数の加算、２つの日時の差分、月日時などの取得

いろいろ調べたところ、あまりまとまっているものがなかったので、NSCalendarを使ったNSDateの扱い方についてまとめてみました。


Xcode: 7.1
Swift: 2.1

```swift
//NSCalendarインスタンス
let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
//* 海外の情報だとNSCalendar.currentCalendar()を使っているものが多いが、日本の場合、和暦に設定しているとバグる可能性があるので使わないほうがよいらしい。

//現在
let now = NSDate()

//10日後
let in10days = cal.dateByAddingUnit(.Day, value: 10, toDate: now, options: NSCalendarOptions())

//3ヶ月前
let before3Months = cal.dateByAddingUnit(.Month, value: -3, toDate: now, options: NSCalendarOptions())



//日時指定
//* eraValueとは紀元前:0, 紀元後:1
let date_2015_11_15_20_15 = cal.dateWithEra(1, year: 2015, month: 11, day: 15, hour: 20, minute: 15, second: 0, nanosecond: 0)!

//月を取得
let month = cal.component(.Month, fromDate: date_2015_11_15_20_15) // => 11

//時間を取得
let hour = cal.component(.Hour, fromDate: date_2015_11_15_20_15) // => 20



//2つの日時の差分
let unitFlags: NSCalendarUnit = [.Year, .Month, .Day, .Hour, .Minute, .Second]
let components = cal.components(unitFlags, fromDate: before3Months!, toDate: in10days!, options: NSCalendarOptions())

print(components.year) // 0
print(components.month) //3
print(components.day) //10
print(components.hour) //0
print(components.minute) //0
print(components.second) //0


//もしも2つの日時の差分を日数でほしいなら
let componentsByDay = cal.components([.Day], fromDate: before3Months!, toDate: in10days!, options: NSCalendarOptions())

print(componentsByDay.day) // 102
```
OpenHEVC

Summary up below 
https://github.com/OpenHEVC/openHEVC

# What does openHEVC support?
    Main Profile (all conformance bitstreams except BUMPING)
    Main 10 Profile (except different combination of luma/chroma bitwidth)
    Range extension (4:2:2/4:4:4)
    Bitstream aligned with April 2014 HEVC standard
    support of SHM4.1 bitstreams
# What is the compiling infrastructure?
    MSVC2013
    gcc
    clang
# Where is the source code of openHEVC?
    openHEVC is located at https://github.com/OpenHEVC/openHEVC.
    openHEVC is under LGPL2.1 license
    reusing ffmpeg runtime for multithreading
解析したいデータが別サーバーにあるとき

## 手元に転送できる場合

```
rsync -auv remote_server:/path/to/data ~/local/data/dir
```

これがいつもできないから記事書いてるのだが、一応まとめておこう。
以下の場合に困難になる：

- データ量が膨大な場合
  - 手元のストレージが不十分（ノートPC等）
  - 通信速度、制限に問題がある場合
- データの更新が必要な場合
  - rsyncした時点から更新されない
  - cron, systemd.timer等で短い時間で更新すればいける？

つまり逆に以下の場合にはこの方法でも行けることになる：

- リアルタイムである必要がない
- データ量が少なく通信に問題がない
  - 予めデータを転送しておくことができるならデータは手元のストレージに十分入る限りOK

## 仮想的に手元にあるように扱う

NFS/sshfs等でマウントしてローカルにあるように扱う。
sshfsはSSHの設定さえしてあれば使えるので便利。

```
sshfs remote_server:/path/to/data ~/local/data/dir
```

この方法だと(一人で使用している限り)データの同期が自動的に確保されており、
手元のストレージを圧迫しないので大規模なデータを高速なローカルLAN内で扱うのに便利となる。
ただし通信が安定して高速でない場合にはあまり有効ではない。

## 別サーバーで解析を実行する

なるべく通信量を減らすには、解析結果だけを通信すればいい。
例えばipython notebookをサーバーで起動して、そこで解析を行えば生データを通信せずにすむため、
通信量を減らすことができる。
また通信が不安定でも状態がサーバーに残るので再接続も容易となる。

```
ssh -L 10088:localhost:8888 remove_server
cd /path/to/data
ipython notebook
```

ipython notebookはデフォルトでlocahostからしか接続できない（？）のでSSHで転送しておく。
これで http://localhost:10088/ でアクセスできる。

難点としては複数のサーバーにデータがまたがっている場合に、
結合的な解析が実行できないことである。
これについては上の方法と組み合わせることで解決できる場合も多いだろう。
Mac 上に Processing を使った Kinect アプリの開発環境を作る

# 環境

- OS X 10.11.1
- Homebrew Cask


# インストール

```zsh
$ brew install libfreenect libusb
$ brew cask install processing
```


# Processing

「スケッチ」→「ライブラリをインポート」→「ライブラリを追加」

「OpenKinect for Processing」が今回使うライブラリ．


# まとめ
ちょー簡単でした．


# 参考
- [Open Kinect for Processing](https://github.com/shiffman/OpenKinect-for-Processing)
- [Skeleton Tracking with Kinect & Processing](http://itp.nyu.edu/~tlc345/blog/skeleton-tracking-with-kinect-processing/)
JAVA 拡張for文 for(要素の型　任意の変数名:配列変数名) { ・・・}

**拡張for文----------------------------------------------------------------------------------- 
for(要素の型　任意の変数名:配列変数名) {
┆
}
------------------------------------------------------------------------------------------------**
拡張for文とは、配列の要素を1つずつ取り出すループを簡単に書くために導入された新しいfor文の文法です。

■Test02.java

```java

public class Test02 {
	public static void main(String[] args) {
		int[] score = { 20, 30, 40, 50, 80 };
		for (int value : score) {
			System.out.println(value);
		}
	}

}
```

■実行結果
20
30
40
50
80
Crystalで書く → はやい

[RubyからGoの関数をつかう → はやい](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02)の便乗。

フィボナッチ数計算のコードをそのまんま、拡張子だけcrに変えて試してみた。
(桁はちょっと少なめで検証)

```crystal:fib.cr
def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(40) #50だとrubyの実行時間がかかりすぎたため
```

で、結果。

(ruby: 2.2.2, crystal: 0.9.1)

```:ruby

$ time ruby fib.rb
102334155

real  0m17.136s
user  0m17.050s
sys 0m0.063s
```

```:crystal
$ time crystal fib.cr
102334155

real  0m1.960s
user  0m0.990s
sys 0m0.400s
```

```:ビルド済みcrystal
$ crystal build fib.cr --release
$ time ./fib
102334155

real  0m0.646s
user  0m0.639s
sys 0m0.004s
```


go(1.5.1)の

```:go
$ time go run fib.go
102334155

real	0m1.386s
user	0m1.216s
sys	0m0.116s
```

```:ビルド済みGo
$ time ./fib
102334155

real	0m0.765s
user	0m0.755s
sys	0m0.006s
```

と比較すると大差ないレベル。

## 追記

crystalでのShared Library作成についてはまだ検討中らしい。
[Add the ability to create a dynamic library](https://github.com/manastech/crystal/issues/921)