OmniAICreator/Qiita-1.07M huggingface dataset:
ヌーラボBacklog管理用アプリケーションを作ってみた。

#はじめに
[ヌーラボ Backlogの管理についての考察](http://qiita.com/takanemu/items/aff2d36d6aa2207f32e3)にて、Webのみでの管理を断念しAPIを使って必要情報を抜き取ることにしました。
C#のライブラリを[Github](https://github.com/mtaniuchi/CSJSONBacklog)に見つけ不足機能をPull Requestして追加して貰い（まだNuGetは未更新）テキストベースで運用していました。
自分で使う分には、コンソールでバッチ叩くのも苦じゃないのですが、今後誰かに引き継ぐことも考えてアプリケーションにしてみました。

#アプリケーション概要
アプリケーションは、WPFで作成しました。
メトロデザインのライブラリを入れているため無駄にケバくなっているのは趣味です。
表示される情報は、下記の通りとなります。

1. プロジェクト未参加ユーザー
不必要になったプロジェクトは削除する方針のためプロジェクトに参加していないユーザーは削除対象となります。

1. メンバーの居ないグループ
ユーザーが登録されていないグループも削除対象とします。

1. 直近1ヶ月にアクセスの無いプロジェクト
活動の停止したプロジェクトをアーカイブ化して、一覧から消すのに利用しています。プロジェクト一覧に表示されるプロジェクト数を減らして管理し易くします。

1. アーカイブ化されているのに、最近アクセスの有ったプロジェクト
暫く停滞していたが活動が復活したプロジェクトとなります。アーカイブ化を解除してプロジェクト一覧に表示されるようにします。

1. 1年間にアクセスの無いプロジェクト
弊社の案件は完成後一年間の瑕疵担保期間を設けることが多いので、1年間アクセスの無かったプロジェクトをリストアップします。プロジェクト管理者への確認を経てローカルへバックアップした後にプロジェクトの削除を行います。

#スクリーンショット
1. ログイン画面
スペースネームとAPIキーを入力します。値を保持しますので、次回は入力の必要はありません。
![バックログメンテナーパス入力.png](https://qiita-image-store.s3.amazonaws.com/0/7839/cee68ecc-2101-65e6-59a1-c3f935ce47bf.png)

1. 通信中
起動時に全てのデータをダウンロードするため少々時間がかかります。
![バックログメンテナー通信中.png](https://qiita-image-store.s3.amazonaws.com/0/7839/cf9b3fa9-3782-b40f-4c63-ee29b8a30b46.png)

1. 通常画面
画面上部に並んだタブで表示を切り替えてください。
![バックログメンテナー通常.png](https://qiita-image-store.s3.amazonaws.com/0/7839/c5257098-951e-7c52-1291-545116b2c2cf.png)

#利用方法
[Github](https://github.com/takanemu/BacklogMaintainer)で公開していますので、VisualStudioでコンパイルして利用してください。
swiftで文字列を抜き出す

Stringクラスで文字を抜き出すためのクラスを作成しました。

```
extension String {
    func extract(start startPos: Int, end endPos: Int) -> String {
        return self[self.startIndex.advancedBy(startPos)...self.startIndex.advancedBy(endPos)]
    }
}
```

stringクラスの拡張なので使い方は簡単で
var str = "123456"
str. extract(start:1, end:2) //23

という形で利用できます。
Dosでvimを使ってみる

家では主にMacを、個人のサーバーはLinux（CentOS7）です。
ですが、会社ではWindowsを使っています。
これまでは特に問題なかったんですが、会社で空き時間にRubyを勉強し始めた際に
Dosでbundleコマンドなどを打って、そのままrbファイルを編集したくなりました。
使い慣れたvimをそのままDosでも使えないか？と思い設定したので、その備忘録です。
特に難しいことはないです…。
## 環境
* Windows 7 Professional（64bit）
* vimはkaoriyaさんのものを使用
* 場所は**「%USERPROFILE%\vim74-kaoriya-win64」**に配置

## 設定（パスを通す）
まずはvimをパスに通します。
まぁこれを見てるような方々は重々承知かと思いますが、折角なのでキャプチャ付きで(笑)

* Windowsボタンでスタートを開いて「コンピュータを右クリック」
* 「プロパティ」を選択し「システムの詳細設定」を選択
* こんな画面が出るので「環境変数」を押下
![kankyou.png](https://qiita-image-store.s3.amazonaws.com/0/90107/7515972d-4f7b-0332-7460-354b10fdaa7e.png)


* 画面の通り「Path」を選択し「編集」を押下
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/90107/f7a807e8-7c78-c9df-7650-53bb54843463.png)


* 最後に「**%USERPROFILE%\vim74-kaoriya-win64;**」と追加
![path.png](https://qiita-image-store.s3.amazonaws.com/0/90107/ba88441f-3c1c-b8ba-3064-7ff4b8284b00.png)

## 実際に動かしてみる
では、実際に動かしてみます。

![cmdvim.gif](https://qiita-image-store.s3.amazonaws.com/0/90107/2901e312-25e2-784b-9ca1-8a30b0be22a7.gif)

上手くgifが撮れてませんが…、こんな感じで動くようになりました！
（マウスのアイコンまで入ってるし…）
以外にちゃんとvimrcも反映されてます（当たり前ですがwww）
![vim.png](https://qiita-image-store.s3.amazonaws.com/0/90107/4cc82b1b-8498-e9cd-fd47-cffe146b83b0.png)

## その他
「vi」とかでエイリアス設定してる…とかって場合、Windowsだと「**doskey vi=vim $***」でいけるそうです。
ですが、どうもbashrcとは動きが違うらしく、閉じるとその設定が消えてしまいます(´･ω･`)
自分は普段から「vim hoge」でやってるのであまり関係ありませんが…

## 最後に…
やっぱり開発にはMacが1番ですね！
もちろん会社ではActive Directoryとか組んだり、IEでないと動かないソフトを使ってたりしますし
C#でデスクトップアプリとか楽に作れるなど、Windowsもいいところはたくさんあります♪
フリーのソフトも多いですからね(･∀･)
自宅でも会社でも、各々の一長一短を認識して適材適所で使っていきたいものです( `･ω･´)
リアクティブ進捗どうですか

進捗ストリームを受け取り、
完成したら煽ってくる進捗ストリームに変換して返す。
なるべく`IO<T>`以外は使わない方針で作成。


```csharp
static IObservable<string> HowIsTheProgress(IObservable<string> source, string[] words)
{
    var _source = Observable.Repeat("_", words.Length)
        .Concat(source)
        .Buffer(words.Length + 1, 1);

    var word = _source
        .TakeWhile(xs => !xs.Take(words.Length).SequenceEqual(words))
        .Select(xs => xs.Last());

    var count = word
        .Count()
        .SkipUntil(_source.SkipWhile(xs => xs.Take(words.Length).SequenceEqual(words)))
        .Select(x => $"???\n{x}文字で煽られました").Take(1);

    return word.Merge(count);
}
```

```csharp
var words = new[] { "進捗", "どう", "です", "か" };
var random = new Random();
var dummy = new object();
var source =
    Observable.Repeat(dummy).Select(_ => words[random.Next(0, words.Length)])
    .Publish().RefCount();

//var source = new Subject<string>(); //デバッグ用

HowIsTheProgress(source, words).Subscribe(x => Console.Write(x));

//source.OnNext(words[0]);//1
//source.OnNext(words[0]);//2
//source.OnNext(words[0]);//3
//source.OnNext(words[1]);//4
//source.OnNext(words[2]);//5
//source.OnNext(words[3]);//6
//source.OnNext(words[0]);
//source.OnNext(words[1]);
//source.OnNext(words[2]);
//source.OnNext(words[3]);
```

```
どうですですですどうです進捗進捗かですかかどうどうですどうかどう進捗進捗どうですどうですどうどう進捗進捗進捗か進捗進捗進捗進捗ですかどうどう進捗ですかかか進捗進捗進捗ですか進捗かか進捗進捗どうどうかどう進捗どうかです進捗進捗進捗ですですです進捗ですか進捗どうどうです進捗どうか進捗ですどうですどうかどうか進捗進捗ですかかですどう進捗進捗進捗ですかかですどうどうです進捗どうですですですどうどうか進捗進捗どう進捗どう進捗どうか進捗どうですか???
122文字で煽られました
```
VirtualBoxで`VirtualBox is complaining that the kernel module is not loaded`


Ubuntu 14.04LTSホスト上で

```
$ vagrant up
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

VirtualBox is complaining that the kernel module is not loaded. Please
run `VBoxManage --version` or open the VirtualBox GUI to see the error
message which should contain instructions on how to fix this error.
```

エラーメッセージ見てみろというので確認

```
$ VBoxManage --version
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (3.19.0-49-generic) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/rcvboxdrv setup

         You will not be able to start VMs until this problem is fixed.
5.0.14r105127
```

（VirtualBoxの？）recompileをしろというので、

```
$ sudo /sbin/rcvboxdrv setup
Bad argument setup
```

おい！どうすんだよ！

...ってことで[askUbuntu](http://askubuntu.com/questions/705720/virtualbox-kernel-driver-not-installed-error-despite-running-sbin-vboxconfig)

どうやら`sudo /usr/lib/virtualbox/vboxdrv.sh setup`を使うらしい。


```
$ VBoxManage --version
5.0.14r105127
```

直った。
これってKernelのUpdateの度に必要なんだっけ？...
SDチェックツール > Check Flash

SDの正常性の確認ツール

Check Flash
http://mikelab.kiev.ua/index_en.php?page=PROGRAMS/chkflsh_en

2010年12月のversion 1.16が最新版のようだ。

かれこれ7年くらい使用しているが、自分の用途としては使い勝手がよい。

## アクションタイプ
  
- 読み書きテスト
  - 最小パターン : 22分くらい
メモ: gnuplot + inkscape の相性


gnuplot のラベル機能って貧弱。大量にグラフを生成する場合には役に立つが、細かい微調整はひたすら面倒くさい。

出力がpdfやsvgなら、inkscapeで直接編集できるのでよい。半透明の微調整なども楽に出来る。

[例の図を挿入]
Keytoolを使用したSHA2 SSL証明書作成メモ

Https通信する際に、自前でオレオレ証明書を作成する際のメモ

## 環境
レガシーな環境を想定して、Javaは1.7で実施

```shell-session
[vagrant@vagrant-centos63 ~]$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Client VM (build 24.80-b11, mixed mode, sharing)
```

```shell-session
[vagrant@vagrant-centos63 ~]$ openssl version
OpenSSL 1.0.0-fips 29 Mar 2010
```


## キーストアの作成

発行した秘密鍵や証明書チェーンを保存するためのキーストアを作成する。

```
# keytool -genkeypair -alias testkeystore -keyalg RSA -keysize 2048 -keystore test.jks -storetype JKS -validity 3650 -keypass hogehoge -storepass hogehoge
```

上記コマンドの実行後、いくつか聞かれるの内容の応答サンプル。

```shell-session
What is your first and last name?
  [Unknown]:  example.com
What is the name of your organizational unit?
  [Unknown]:  TestUnit
What is the name of your organization?
  [Unknown]:  Test
What is the name of your City or Locality?
  [Unknown]:  Chiyoda-ku
What is the name of your State or Province?
  [Unknown]:  Tokyo
What is the two-letter country code for this unit?
  [Unknown]:  JP
Is CN=example.com, OU=TestUnit, O=Test, L=Chiyoda-ku, ST=Tokyo, C=JP correct?
  [no]:  yes
```

完了すると、`test.jks`が作成される。

```shell-session
[root@vagrant-centos63 keytest]# ls
test.jks
```

## CAの作成
自前の証明書を作成するために、同じサーバにCAを作成しておく。

```
 # cd /usr/local/ssl
 # ./CA.sh  -newca
```

## 証明書要求(CSR)の作成
 認証局に署名してもらうための証明書要求を作成する。

```
 # keytool -certreq -alias testkeystore -sigalg SHA256withRSA -file test.csr -keypass hogehoge -keystore test.jks -storepass hogehoge -storetype JKS
```

## CAでの署名
CAで署名して、証明書を発行する。この際にsha2ハッシュの証明書にしてもらうように、オプションで指定する。

```
# openssl ca -md sha256 -keyfile /usr/local/ssl/CA/private/cakey.pem -cert /usr/local/ssl/CA/cacert.pem -in test.csr -out testservercert.crt -days 1460 -policy policy_anything
```

上記を実行すると`testservercert.crt`が作成される。これの中身を、`-----BEGIN CERTIFICATE-----`と`-----END CERTIFICATE-----`とその中身だけになるように、ほかを削除しておく。

## CAの登録
作成した自前CAを登録する。

```
# keytool -importcert -alias testRootCA -file /etc/pki/CA/certs/ca.crt -keystore test.jks -trustcacerts -storepass hogehoge
```

## 証明書の登録

```
# keytool -import -alias test -file testservercert.crt -keypass hogehoge -keystore test.jks -storepass hogehoge
```

## 証明書の確認

``` 
 # keytool -list -v -keystore /root/key4/test.jks -storepass hogehoge
```
Unityで大きな画像ファイルをたくさん扱う方法

# PC用スタンドアロン環境向けにUnityで大きな画像ファイルをたくさん扱う際のメモ。

PC向けにADV的なものを作る場合、1280x720や1920x1080、あるいはそれ以上に大きな画像ファイルを何百枚と扱うかと思いますが、Unityだと若干の工夫が必要です。スマホ向けはここでは考えません。

ここではCG枚数に応じた選択肢をいくつか提示してみたいと思います。

## 10枚程度の場合

素直にDXT5で埋め込みましょう、とても楽です。今ならCrunch textureがあるので結構な枚数でも無理なく詰め込めると思います。なめらかな肌のグラデなどは若干失われるかもしれませんが見てもわからないかもしれません。自分の目に自信がない場合はデザイナーに相談すべきです。

## 30枚程度の場合

Unityで2Dをやる場合の定番アセット2dtoolkitにはスプライトシートをpngで保存する機能があります。これとマルチアトラスを組み合わせると、簡単に扱えます。
ただ、こいつはべらぼうにメモリを食うので100枚を超えると無理です。
またスプライトシートの作成もすごく遅いので結局は次の方法が良いでしょう。
2dtkを使用していて部分的に大きな画像を使いたい、といった特殊な用途向けですね。

## それ以上の場合、あるいは全て

pngファイルを直接読み込んでスプライトを作成しましょう。やり方は拡張子をbyteに変えてResourceフォルダに置き、Texture2D.LoadImageを使います。
このやり方だと作成した画像ファイルを特定のフォルダに名前を変えて放り込むだけなので簡単な上に、いちいちUnityが変換しないので作業が軽いというのも良いですね。
1280x720決め打ちのコードだとこんな感じです。このままだと画面をシェイクさせた時に困るなーみたいなこともぼんやりと考えておくべきですが、２のべき乗の事は忘れましょう。

```csharp:load.cs
TextAsset img = Resources.Load<TextAsset> (filename);
Texture2D tex = new Texture2D (1280, 720, TextureFormat.RGBA32, false);
tex.LoadImage (img.bytes);
tex.Apply(true,true);
GetComponent<SpriteRenderer>.sprite = Sprite.Create(tex,  new Rect(0, 0, 1280, 720), new Vector2(0.5f, 0.5f), 4);
```

Sprite.Createの第4引数はPixelPerUnitです。私はドットゲームを作ることが多いので、1280x720のスクリーンに320x180で表示するのですが、PPUを4にするだけでカメラをわけなくても表示できます。楽ですね。
Resources.UnloadUnusedAssets()なども適宜呼んでやりましょう。
c++ > STL勉強 > cbegin() / cend() > constnessの保証

http://qiita.com/SaitoAtsushi/items/d26a5cfa5453d8d91b63
のコードを参考に STL や template を勉強中。

今回目に止まって自分が知らなかったものは

```cpp
template<class T>
typename continuous<T>::const_iterator continuous<T>::begin(void) const {
  return data.cbegin();
}
```

のcbegin()というメソッド。

以下を見つけた。
http://stackoverflow.com/questions/12001410/what-is-the-reason-behind-cbegin-cend

> Now, we have syntactic assurances that SomeFunctor cannot modify the elements of the vector (without a const-cast, of course).

普通のbegin()/end()を使った場合は要素のconstnessが保証できないので、cbegin()/cend()が導入された、という僕の解釈。
技術英語 > about 140 tons [worth] of trash / Kyoto is a city [worth] visiting. / That's worth considering.

@ LOE > November 23, 2012

http://loe.org/shows/shows.html?programID=12-P13-00047
> they’ve got through about 140 tons <font color=red>worth</font> of trash,


http://eow.alc.co.jp/search?q=worth&ref=sa
> 2. 《数学》相当する数［量］◆数字の各けたの持つ意味を表す時に用いられる。

worthがつくことで「相当」という修飾語がつくのは理解できるが、上記の例文の場合にあえてworthをつける理由が未消化。

trashなので「相当」はいらないのではと思ったりする。

- およそ140トンのごみ
- およそ140トン相当のごみ

...

ごみを食べ物と交換するプログラムの話なので、交換したものが140トン「相当」、と言っている気がしてきた。


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

Kyoto is a city worth visiting.

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

>That's worth considering.
>それは検討に値する

@ 強くなる英語のディスカッション by 崎村耕二さん
Michael Abrash Interview 4

http://qiita.com/7of9/items/f197d182232f03440df3
の続き


Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)


(1:46-)
You know, at that time there was no difficult <font color=red>XXX1(part of???)</font> entering industry except <font color=blue>doing coming</font> up with the money to buy a computer. That was a challenge.

(1:55-)
At that point, it was just a <font color=red>XXX2</font> anything to work. So anybody could write a game, all it took was one floppy to ship it on, you could sell yourself if you want it.

(2:04-)
Well, back in the 70th, ... ah, late 70th, I was a graduate student at energy management policy. So, I had everything but <font color=red>written(?writing?)</font> my dissertation. And then I had this microcomputer. And I <font color=blue>had do</font> some stuff on it for work them. It was way more interesting to write games on it than I finish my PhD. So that's what I did previously.


赤文字ははっきり聞き取れない部分。

青文字はそのように聞き取れるが、文法的にしっくりいかない部分。
CoreBluetoothでどうにもならない不具合に詰んだ時


## 背景

現在、iPhoneと[Intel Edison](http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html)をBluetoothで連携させたプロダクトを開発しているのですが、iOS側は[CoreBluetooth](https://developer.apple.com/jp/documentation/CoreBluetoothPG.pdf)ってのを使って実装してます。(ちなみに、iOS側が[Central](https://developer.apple.com/library/tvos/documentation/CoreBluetooth/Reference/CBCentral_Class/index.html)でEdison側が[Peripheral](https://developer.apple.com/library/prerelease/ios/documentation/CoreBluetooth/Reference/CBPeripheral_Class/index.html))
その途中で、さっきまで検出できていた[Service](https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBService_Class/)が、ある時から検出されなくなってしまいました。iOS側とEdison側それぞれ色々コードを書き換えて試したのですがどうにもなりませんでした。しかし、あるたった一つのことで解決したので、それを今回はご紹介します。

## 解決法
iPhoneのBluetoothを一度Offにしてから、Onに戻す！！！
これだけ！！私の場合、本当にこれだけで直りました。(いままでの苦労はなんだったんだ...)
なんでも、開発途中でPeripheral側で内容を変更すると、iPhoneのBluetoothをOff/Onしないと変更が反映されないということがあるそうです。なので、Serviceが検出できない時以外も、一度これを試してみる価値はあると思います。
こちらの記事を参考にしました。これのトラブル3です。詳細はこちらをご覧ください。(http://d.hatena.ne.jp/shu223/20141202/1417480457)

## まとめ
もうどうにも直らない！！嫌だ！！と思ってた時に、参考記事を見つけた時は神が舞い降りてきたと思いました。BugFix出来た感動と、この筆者の方への感謝と、同じ目にあった人を助けられればという気持ちで、この記事を投稿してみました。
余談ですが...初めてハードウェア開発と並行でそれに連携したiOSアプリの開発を行っております。(※ハードウェアの方は私が開発してるわけではありません)
アプリだけでは出来ないことが出来るようになるという当たり前の事実に気づき、なんだか視野が広がっている気がします。
完成まで頑張ろうと思います。
Mizuna（ミズナ）プロジェクトを始めます☆


アプリ開発を行う際、要件定義・設計を行いますが、容易に画面イメージを記載できるアプリが欲しくて作ることにしました。
アプリ名は「Mizuna（ミズナ）」と命名しました。

### 取り敢えず目指す事
* チーム開発時の設計書の記載に使用する事を想定して共同編集できるようにする
* 画面設計用のボタンやリストなどのコントロール（図形）部品を用意しておく
* 一般的なお絵かきツールと違って、コントロール（図形）のイメージを左寄せ配置、右寄せ配置など部品配置用のプロパティを設定できるようにする
* コントロール（図形）部品は、レイヤー管理できるようにする
* コントロール（図形）部品は、部品毎にプロパティを持たせる
* 複数のファイルを開けるようにする
* 一つのファイル内に複数のキャンバスを持てるようにする
* キャンバスは、自動でサイズ変更されるようにする
* 一つのキャンバス内には複数の画面イメージを記載できるようにする
* 記載したイメージは印刷できるようにする
* Mac、Windows で動作できるようにしたいので、Lazarus で開発する
* アプリ開発で必要になったコントロールや処理は、コンポーネント化する
* 途中で完成を諦めないように開発経過を独り言のように呟く

他は徐々に追記していく、、

### 共同編集
* 共同編集機能を作るならデータ共有できるサーバか何かが必要そう
* コスト的な事を考えると Google App Engine をバックエンドに利用かな？と考えてます
VVVVでノードの使い方が分からなくなったとき

# ノードの使い方が分からなくなったとき

## 検索してもなかなか見つからない
Googleで[vvvv node名]と検索しても、有名ではないものは中々ひっかからない。
　そんなときはダウンロードをしたvvvv.exeが入っているフォルダを探すとノードの使用方法が分かる。
　各ノードには　ノードパッチ　＋　ヘルプパッチが用意されている

## ヘルプパッチの探し方
　使い方が分からないノードがあったら、vvvvに最初からあるノードであればヘルプノードが用意されている。
　分からないノードをクリックしてF1キーを押すことで、ヘルプパッチを開くことができる。
![search05.png](https://qiita-image-store.s3.amazonaws.com/0/111261/00f6fb54-79d9-7dee-5cfe-be69c59c0369.png)

## ヘルプパッチをいじる際の注意
　ヘルプパッチは保存可能なので、いじって保存してしまうと、次回開いた時にヘルプとして機能しなくなってしまうことが考えられる。
　ヘルプパッチを開いたら、まず自分のパッチ or New Patchにコピーしてからいじるか、別名保存で自分の編集しているフォルダに別名保存する。

## 壊したヘルプパッチの場所を特定して、上書き
　ヘルプを壊してしまったら、公式からvvvvをダウンロードして、該当のヘルプパッチを上書きするのがいい。
　場所は以下の場所になる。ヘルプパッチのウィンドウにパスが書かれているので、ウィンドウのタイトルを見ながら、パスに移動することもできる。
1. vvvv.exeの格納フォルダに移動![search.png](https://qiita-image-store.s3.amazonaws.com/0/111261/5c2d5198-a685-c16c-1968-ae22d73c2659.png)
2. lib->nodeフォルダに移動![search02.png](https://qiita-image-store.s3.amazonaws.com/0/111261/0506b091-9002-3aad-9036-a2a7d493c007.png)
3. 検索したいノードを検索バーに入力し、ノード名help.v4pを右クリック -> ファイルの場所を開く[search03.png](https://qiita-image-store.s3.amazonaws.com/0/111261/8c7e2941-5848-2087-e9a0-292ac39ff9a8.png)
4. 壊したヘルプパッチを上書きする

ヘルプパッチは英語の説明だけど、数値をいじって動きを確認しながら覚える

vvvv.exeが格納されているgirlpowerにはもう少し広義的なノードの使い方が書かれたパッチがあるので、やりたいことに迷ったら、それらしいフォルダをのぞいてみると解決することもある。

## 追記
　twitterで#vvvv_jpタグを呟くと助けてくれ人が現れます。
nginx+php-fpm+CakePHP2.xでのセキュリテイ対策

それぞれ実施するかはサイトの特性にあわせるとして、PHPでサイト作成する場合のセキュリテイ対策の備忘。
CakePHPについては、2.xの情報なのでご注意ください。

## CORS(Cross-Origin Resource Sharing)対策
- 対策方法：Access-Control-Allow-Originヘッダの出力
- 設定方法：nginxのconfに記述。制限できるなら対応ドメインを指定。ドメインの複数指定は単純に２つ記述ではないので注意。

> nginxの該当ドメインの設定ファイルで
> add_header Access-Control-Allow-Origin http://hogehoge.com;

## 意図しないサイトからiframeのソースとして使われないための対策
- 対策方法： X-Frame-Optionsヘッダの出力
- 設定方法：nginxのconfに記述。同サイトは許可であれば、SAMEORIGIN。

> nginxの該当ドメインの設定ファイルで
> add_header X-Frame-Options SAMEORIGIN;

## CSRF（Cross-Site Request Forgery）対策
- 対策方法：CakePHPのSecurityコンポーネント利用が便利
- 設定方法：フォームを利用するコントローラでSecurityコンポーネントを利用設定。ビューではフォームをFormヘルパのcreate/endメソッドで開始/終了する

> コントローラ
> class HogeController extends AppController {
>   :
>     public $components = array('Security');
>   :
> }
>
> ビュー
> <?php echo $this->Form->create('hoge', array('type' => 'post')); ?>
> :
> <?php echo $this->Form->end(); ?>
> 上記後、formタグのすぐ後にdata[_Token][key]が自動挿入されていれば成功。

## SQLインジェクション
- 対策方法：CakePHPのModelを利用する際に、find/save等のデータアクセスメソッドを利用する。色々な理由でqueryメソッドを利用する場合は、個別でエスケープする。CakePHP2.xまではSanitizeクラスが使えるが、3.xでは削除予定らしいので注意。


## クロスサイトスクリプティング（cross site scripting）
- 対策方法：基本的にデータを出力する際はh()で括る。フォームの場合は、$this->Form->inputで項目を出力する。

## Cookieのsecure 属性
- 対策方法：サーバ全体がHTTPSというポリシーであれば、php.iniのsession.cookie_secureを1に。個々のアプリケーションで設定する場合は、CakePHPのコントローラのbeforeFilterで、$this->Cookie->secure = trueを指定。
- 備考：Apacheの場合は、.htaccessでも可能。ロードバランサー配下の場合、CakePHPでHTTPSプロトコルが判別できない場合がある。この場合はphp.iniで設定すると対応できることもある。
Pythonメモ書き(Multi Processing, python3 pip, facebook API)

- Multi Processing
  http://d.hatena.ne.jp/torasenriwohashiru/20110528/1306594075
  http://qiita.com/yubais/items/5a9d91fe03fe715b21d0

- Python3 pip
  http://stackoverflow.com/questions/10763440/how-to-install-python3-version-of-package-via-pip-on-ubuntu

- Windows pip
  python -m pip install -U pip
  https://pip.pypa.io/en/stable/installing/

- Facebook API
  http://qiita.com/mima_ita/items/439da39b3361fba67a1f
  http://language-and-engineering.hatenablog.jp/entry/20111006/p1
  http://so-zou.jp/web-app/tech/web-api/facebook/

- 使えそうなライブラリ
  http://pythontips.com/2013/07/30/20-python-libraries-you-cant-live-without/
golangのテスト結果をJUnit Report形式で出力して、CircleCIで表示

```
test:                                                                                                                                 
  override:            
    - go get -u github.com/jstemmer/go-junit-report                                                                                                                 
    - mkdir -p $CIRCLE_TEST_REPORTS/golang                                                                                            
    - |                                                                                                                               
      { go test -v $(go list ./...|grep -v vendor); echo $? > /tmp/status;} | go-junit-report > $CIRCLE_TEST_REPORTS/golang/junit.xml;
      exit `cat /tmp/status`;                                                                                                         
```

これでOK
telnetからSMTPを使ってメール送信

yahooのメールにtelnetからSMTPを使ってメール送信してみます。

```
$ telnet smtp.mail.yahoo.co.jp 25
Trying 183.79.29.237...
telnet: connect to address 183.79.29.237: Connection refused
telnet: Unable to connect to remote host
```
はい。Connection refusedされましたね。
これはプロバイダがOutbound Port 25 Blockingをかけているからです。
なので、サブミッションポートの587を指定して繋ぎます。

```
$ telnet smtp.mail.yahoo.co.jp 587
Trying 183.79.29.237...
Connected to smtp.mail.g.yahoo.co.jp.
Escape character is '^]'.
220 smtp526.mail.kks.yahoo.co.jp ESMTP
EHLO localhost
250-smtp526.mail.kks.yahoo.co.jp
250-AUTH LOGIN PLAIN XYMCOOKIE
250-PIPELINING
250 8BITMIME
MAIL FROM:自分のメールアドレス
530 Sorry, please use SMTP-AUTH instead - for help go to http://www.yahoo-help.jp/app/answers/detail/a_id/79799/p/622
Connection closed by foreign host.
```
はい。Connection closedされました。
エラーメッセージからもわかるように、SMTP-Auth(SMTP認証)が必要です。
なので、以下のコマンドを使って認証用の文字列を生成します。
```
printf "%s\0%s\0%s" メールアドレス メールアドレス パスワード | openssl base64 -e | tr -d '\n'; echo
```
で、出力された認証用文字列をコピーしておきます。

```
telnet smtp.mail.yahoo.co.jp 587
Trying 183.79.29.237...
Connected to smtp.mail.g.yahoo.co.jp.
Escape character is '^]'.
220 smtp530.mail.kks.yahoo.co.jp ESMTP
EHLO localhost
250-smtp530.mail.kks.yahoo.co.jp
250-AUTH LOGIN PLAIN XYMCOOKIE
250-PIPELINING
250 8BITMIME
AUTH PLAIN 認証用文字列
235 ok, go ahead (#2.0.0)
MAIL FROM:送信元メールアドレス
250 ok
RCPT TO:送信先メールアドレス
250 ok
DATA
354 go ahead
Subject: hoge
From: 送信元メールアドレス
To: 送信先メールアドレス

hello!
.
250 ok 1454173930 qp 24032
quit
221 smtp531.mail.kks.yahoo.co.jp
Connection closed by foreign host.
```

で、yahooメールを見てみるとメールが届いているのが分かります。
ActiveRecordを試すためのPlaygroundを作る

# Playground

って作れないのかなと思ってググったら、gistが2件引っかかった。

- https://gist.github.com/seanbehan/3274577
- https://gist.github.com/BugRoger/9fb697269925079331ce

これを元に自分なりのActiveRecord用のPlaygroundを作った。

[futoase-sandbox/ActiveRecordPlayground](https://github.com/futoase-sandbox/ActiveRecordPlayground)

# 使う前に

```
> bundle ins --path
```

で、必要なgemをインストールする

# 使い方

## pryで作成したmodelのテスト

```
> bundle ex rake pry
```

で、試すことができる。

```rb
[1] (^_-)-☆ > (main)> Seed.build
[2] (^_-)-☆ > (main)> f = Fruit.new
=> #<Fruit:0x007fbcca58eec0 id: nil, item_type_id: nil, name: nil, price: nil>
[3] (^_-)-☆ > (main)> taxes = f.taxes.new
=> #<Tax:0x007fbcc8d0ef80 id: nil, tax_typable_id: nil, tax_typable_type: "Fruit">
[4] (^_-)-☆ > (main)> tax_types = taxes.tax_types.new
=> #<TaxType:0x007fbcc8a66350 id: nil, tax_id: nil, name: "eight">
[5] (^_-)-☆ > (main)> tax_type = taxes.tax_types.new
=> #<TaxType:0x007fbcca055ee0 id: nil, tax_id: nil, name: "eight">
[6] (^_-)-☆ > (main)> tax_type.name = :eight
=> :eight
[7] (^_-)-☆ > (main)> tax_type.save!
D, [2016-02-04T01:56:33.730505 #13750] DEBUG -- :    (0.1ms)  begin transaction
D, [2016-02-04T01:56:33.732197 #13750] DEBUG -- :   SQL (0.3ms)  INSERT INTO "taxes" ("tax_typable_type") VALUES (?)  [["tax_typable_type", "Fruit"]]
D, [2016-02-04T01:56:33.733426 #13750] DEBUG -- :   SQL (0.1ms)  INSERT INTO "tax_types" ("name", "tax_id") VALUES (?, ?)  [["name", "eight"], ["tax_id", 1]]
D, [2016-02-04T01:56:33.734465 #13750] DEBUG -- :   SQL (0.1ms)  INSERT INTO "tax_types" ("name", "tax_id") VALUES (?, ?)  [["name", "eight"], ["tax_id", 1]]
D, [2016-02-04T01:56:33.735222 #13750] DEBUG -- :    (0.1ms)  commit transaction
=> true
```

## テストの実行

[minitest](https://github.com/seattlerb/minitest)を使ってテストを書いている。

```
> bundle ex rake test
```

# なんで作ったのか

polymorphicな関係のModelを作る時に、
わざわざRails Appでscaffold使ってModel作るのが大げさだと感じたから。

今後しばらくこういうヤツはお世話になる気がする。
[意訳]あなたのワークフローをWebpack化しよう


このポストは以下の記事を意訳したものです。
[Webpack Your Workflow](https://medium.com/front-end-developers/webpack-your-workflow-7c8f59c0c97c#.qfldy56c0)
もし誤りなどありましたら、ご指摘いただけると幸いです。

（以下、訳）

## 序文
```Grunt```のconfigファイルが指数関数的に肥大化し、私たちを怯え上がらせた後、```Gulp```とその親友である```Browserify```が街にやった来ました。彼らはキラキラしていて、わかりやすくパワフルでした。そして、シンプルゆえに __長〜いパッケージの一覧__を必要とし、イライラしながら紐付ける必要がありました。

プロジェクトを始めるための手っ取り早いセッティングは、苦痛となってしまいました。

そんなある日、私は新しくてよりパワフルなツールを発見しました。Gulpと同様のビルドプロセスが可能で、かつより良いツールです。


_アプリケーションを最適化する前に、ワークフローを最適化するべきです。そうすれば、もっと多くの時間をアプリケーションに充てることができます。_
_\- Dan Abramov(Reduxの作者)_


## Webpack

新しいツールの名前は、Webpackと言います。Webpackは私の理想にぴったりでした。Webpackはビルドにおける問題を解決し、GruntやGulp, Browserifyが必要なくなるほどの大きなパワーを持っていました。

Webpackでは、シンプルなconfigファイルでビルドプロセスを定義できます。たしかにGruntのconfigファイルは厄介でしたが、タスクをしっかりとこなしてくれるのならば、config自体は悪いものではありません。

つまり...

ファイルが変更される度に、自動コンパイルと自動更新されるような、ES6で書かれたReactのSPAがあるとします。Webpackはこれをどれほど単純に実行できるのでしょう？

なんと、たった25行のconfigファイルで済みます。こちらが私の最新のプロジェクトから持ってきたgistのコードです。

```webpack.config.js
module.exports = {
  entry: "./app/app.js",
  output: {
    path: './public',
    filename: "bundle.js",
    publicPath: '/'
  },
  // webpack-dev-server config for refreshing and more
  devServer: {
    inline: true,
    contentBase: './public',
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /(node_modules|bower_components)/,
        loader: 'babel',
        query: {
          presets: ['react', 'es2015']
        }
      }
    ]
  }
}
```

ps. Webpack1系はES6のモジュールをネイティブではサポートしていません。Webpack2系では、サポート予定です。最高じゃないですか？ :)

Webpackは、あなたがソースディレクトリからデスティネーションディレクトリへとファイルを移動するだろうと予測します。なおかつ、JavaScriptで作業をすることが求められます。

あなたは、画像ファイルやCSSファイルの処理についても気にするかもしれません。

結論から言うと、これらのファイルをコンポーネントへと直接インポートすることができます。

```import-example.js
//import your CSS (or less, etc) for the component
import style from './style.css'


//import your images for the component
import img   from './img.png'
```

Webpackは賢いので、動的にCSSと画像を制御します。もしCSSファイルが大きくなければ、スタイルシートを読み込みますし、もし大きければ圧縮します。Webpackはファイルのサイズを気にしてくれるのです。

このCSSへの対応は、画像への対応を含めて、```url-loader```というプラグインを用いることで実現します。もし充分に画像が小さいならば、base64にエンコードしてくれます。

これはまだ、Webpackのほんの一面に過ぎません。


### コード分割最高！

Webpackはソースをバンドルに分割しますし、あるいはあなたが複数のエントリーポイントを設定することもできます。なので、必要なページのみをダウンロードすることができます。

もしSPAが巨大ならば、この機能は本当に役に立ちます。ユーザは巨大で単一なJavaScriptファイルを落とす代わりに、必要なファイルのみを落とすことができるのです。

Webpackについてもっと学びたいですか？では、ドキュメントを見る代わりにPete Huntの[Webpack-howto](https://github.com/petehunt/webpack-howto#webpack-howto)を見ることをオススメします。

そして、覚えておいてください。

__がんばるのではなく、賢くやりましょう__


読んでくださりありがとうございました。
個人的に探り入れてるクラウドサービスやオープン・ソースプロジェクト関係のメモ

個人的に探り入れてるクラウドサービスやオープン・ソースプロジェクト関係のメモ。（というかリンク集…）

##インフラ

| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|なんでも|AWS|https://aws.amazon.com/jp/|
|PaaS+コンテナ+IaaS+DevOps|Bluemix|https://console.ng.bluemix.net/|
|コンテナ|Docker|https://www.docker.com/|
|PaaS|CloudFoundry|https://www.cloudfoundry.org/|
|PaaS|Heroku|https://www.heroku.com/|

##Webサービス管理

| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|APIプロキシ|octoparts|http://m3dev.github.io/octoparts/|
|遅延・障害許容管理|Hystrix|http://techblog.netflix.com/2012/11/hystrix.html|
|分散トレース|zipkin|https://github.com/openzipkin/zipkin|

##データストア

|種類|プロジェクト|リンク|
|:--|:-- |:--  |
|インメモリkvs|Redis|http://redis.io/|
|NoSQL|MongoDB|https://www.mongodb.org/|
|NoSQL|Apache Cassandra|http://cassandra.apache.org/
|NoSQL|Apache CouchDB|http://couchdb.apache.org/|
|NoSQLクラウドサービス|Cloudant|https://cloudant.com/|

##データ処理

| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|分散データ処理|Apache Hadoop|https://zookeeper.apache.org/|
|アナリティクス|Apache Spark|http://spark.apache.org/|
|コーディネーションエンジン|Apache ZooKeeper|https://zookeeper.apache.org/|

##pub/subメッセージング

| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|MQTT|mosquitto|http://mosquitto.org/|
|AMQP|rabbitmq|https://www.rabbitmq.com/|
|?? |Apache Kafka|http://kafka.apache.org/|
|WebSock|Socket.IO|http://socket.io/|

##監視

| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|ログ収集|Fluentd|http://www.fluentd.org/|
|可視化|kibana|https://github.com/elastic/kibana|
|総合監視|zabbix|http://www.zabbix.jp/|

##その他
| 種類 | プロジェクト| リンク|
|:--|:-- |:--  |
|コグニティブ|IBM Watson Developer|https://www.ibm.com/smarterplanet/us/en/ibmwatson|/developercloud/|
chainer.links.Linearを使って離散コサイン変換

ざっとググったところ出てこなかったこともあり、メモ。
離散コサイン変換(Discrete Cosine Transform, DCT)をchainer.links.Linearクラスを使って作成してみました。

離散コサイン変換とは、高速フーリエ変換(Fast Fourier Transform, FFT)の親戚で、FFTの実数部を引き出すのと同じ意味合いになります。(詳しい解説は他の方の説明に頼ります)

以下の関数DCT(wave)を使うと、scipy.fftpack.dct(wave)と同じ結果が返ってくることを確認しました。
モジュールのimportは、[Chainerのチュートリアル](http://docs.chainer.org/en/stable/tutorial/basic.html)に準じて行っています。

```python:DCT.py
def DCT(wave):
    num_base = np.size(wave.data[0,:])
    lDCT = L.Linear(num_base,num_base)
    for n in range(num_base):
        for k in range(num_base):
            lDCT.W.data[k,n] = 2*np.cos(np.pi*k*(2*n+1)/(2*num_base))
    lDCT.b.data[:] = 0.0
    return lDCT(wave)
```

私がはまった点は、
・Linearに渡すのはVariable形式
・np.array([[入力ベクトル]])のように、次元を2次元にして渡す
という点です。
これを使うとDCTを使ったChainや誤差関数を作れる(はず)です。(まだ未使用です)

(追記：2016年2月4日)
逆離散コサイン変換(Inverse DCT, IDCT)も作ってみました。
[Scipyのドキュメント](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.fftpack.dct.html)より、scipy.fftpack.dct(wave)はデフォルトでType2を返します。
この場合逆変換はType3を使用すればよいので、実装は以下の通りとしました。

```python:IDCT.py
def IDCT(wave):
    num_base = np.size(wave.data[0,:])
    lIDCT = L.Linear(num_base,num_base)
    for n in range(num_base):
        for k in range(num_base):
            if(n==0):
                lIDCT.W.data[k,n] = 0.0
            else:
                lIDCT.W.data[k,n] = 2*np.cos(np.pi*(k+0.5)*n/num_base)
    lIDCT.b.data[:] = wave.data[0,0]
    return lIDCT(wave)
```


このIDCTの注意点は、バッチ処理には使えない(！)ということです。
よりよい実装があればよいのですが。。
標準入力を受け取れるシェルスクリプト、関数の作成（パイプで繋げられるようにする）

シェルスクリプトでパイプで繋げられると便利なので、標準入力を受け取れるようにする方法メモ

# 実装例. 引数または標準入力で受け取った数値を合計するスクリプト

```bash:sum.sh
#!/bin/bash

# 標準入力を受け取る関数実装例　`cat -` を使う 
_sum() {
    local sum=0

    for i in $(cat -)
    do
        sum=$((sum + i))
    done

    echo $sum
}

# 標準入力を受け取るスクリプト実装例
# NOTE:
# if ~ fi にパイプをつなげると有効な方の標準出力を受け取れる
if [ -p /dev/stdin ]; then
    cat -
else
    echo $@
fi | _sum
```

# 実行例

```bash
# 引数で受け取る
$ ./sum.sh
0

$ ./sum.sh 1 2 3
6

$ ./sum.sh {0..100}
5050

# 標準入力で受け取る
$ echo -n | ./sum.sh
0

$ echo 1 2 3 | ./sum.sh
6

$ echo {0..100} | ./sum.sh
5050
```

その他、`read` を使う例と `/dev/stdin` を使う例は以下を参照
[USP友の会:シェルスクリプトでの標準入力の読み方](https://www.usptomo.com/PAGE=20120212)

# 参考
[Bash シェルスクリプトで標準入力を受け取る - アウトプットができる技術者に](http://the-pleiades.hateblo.jp/entry/2014/02/23/234629)
[USP友の会:シェルスクリプトでの標準入力の読み方](https://www.usptomo.com/PAGE=20120212)
イベントを聞くPromiseのメモリリークとその対策

# 追記

Node v11.13.0にて、 `events` モジュールに `once` が追加された。可能ならこちらを使うと面倒がない。本記事で説明しているリスナの解除までやってくれる。
ref. https://nodejs.org/api/events.html#events_events_once_emitter_name

```javascript
const { once, EventEmitter } = require('events');
const ee = new EventEmitter();

for(let i = 0; i < 20; ++i) {
  once(ee, 'done').then(() => console.log('done'));
  ee.emit('done');
}
```

---
ES2015でのPromiseの標準化や昨今のFluxブームに伴って、Promiseでイベントを聞く場面は増加しているものと思う。

# メモリリークの例

```javascript
const EventEmitter = require('events').EventEmitter;
const ee = new EventEmitter();

for(let i = 0; i < 20; ++i){
  new Promise((resolve, reject)=>{
    ee.once('error', reject);
    ee.once('done', resolve);
  });
  ee.emit('done');
}
```

たとえばこんなコードを書いたとする。`.once`でリスナを登録して満足してしまっているが、一度も`'error'`が発行されないので、`'error'`の方に登録したリスナは登録されたままになる。

実際、上記のコードをreplから実行してみると、

```
(node) warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener (events.js:239:17)
    at EventEmitter.once (events.js:265:8)
    at repl:3:4
    at repl:2:1
    at REPLServer.defaultEval (repl.js:164:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:393:12)
    at emitOne (events.js:82:20)
    at REPLServer.emit (events.js:169:7)
```

こんな出力が得られる。EventEmitterは、イベント名に対して11個以上登録された状態になるとこのような警告を発する。この個数は`.setMaxListeners`から変更が可能である。

# 解決法
リスナが呼ばれてPromiseの状態が確定するときに、もう一方のリスナも解除してやればよい。

```javascript
const EventEmitter = require('events').EventEmitter;
const ee = new EventEmitter();

for(let i = 0; i < 20; ++i){
  new Promise((resolve, reject)=>{
    function onDone(arg){
      resolve(arg);
      cleanUp();
    }
    function onError(arg){
      reject(arg);
      cleanUp();
    }
    function cleanUp(){
      ee.removeListener('done', onDone);
      ee.removeListener('error', onError);
    }
    ee.on('error', onError);
    ee.on('done', onDone);
  });
  ee.emit('done');
}
```

ここで、`.on`ではなく`.once`を使用してもよい。`.once`は内部的に上記コードのようなラッパをリスナとして登録しているが、`.removeListener`は賢く元のリスナを見て削除してくれる。
Scalaの標準入力

[Paiza](https://paiza.jp/challenges)や[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)などのオンラインプログラミングを久しぶりにやると、忘れてることが多いのでメモ。
標準出力を扱う方法がいくつかあるので、状況によって使い分けます。

* [scala.io.StdIn](http://www.scala-lang.org/api/2.11.7/index.html#scala.io.StdIn$)オブジェクトを利用
* [scala.io.Source](http://www.scala-lang.org/api/2.11.7/index.html#scala.io.Source$)オブジェクトの`stdin`メソッドを利用
* [java.util.Scanner](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)クラスを利用

## 単一行を読み込む場合
単純に一行読み込みたい場合は`io.StdIn.readLine()`を使用します。
####例：スペース区切の文字を昇順ソートして出力
```text:input
 e c a b d 
```

```Scala:Main.scala
object Main extends App {
  val strAry = io.StdIn.readLine().split(' ')
  println(strAry.sorted.mkString(" "))
}
// 出力結果
// a b c d e
```

## 複数行読み込む場合
複数行読み込みたい場合は`io.Source.stdin.getLines()`を使用し、for式で処理します。

###### 例:各行の数字を昇順ソートして出力
```text:input
 1 4 3 5 2
 3 5 2 1 4
 1 3 2 4 5
```

```Scala:Main.scala
object Main extends App {
  for(line <- io.Source.stdin.getLines()) {
    val numAry = line.split(' ').map { _.toInt }
    println(numAry.sorted.mkString(" "))
  }
}
// 出力結果
// 1 2 3 4 5
// 1 2 3 4 5
// 1 2 3 4 5
```

## 参考：java.util.Scannerを利用する
ScalaではJavaクラスを簡単に利用することができます。

```text:input
 1a2a3a
```
```scala:Main.scala
object Main extends App {
  val scanner = new java.util.Scanner(System.in)
  scanner.useDelimiter("a")
  while(scanner.hasNext){
    println(scanner.next)
  }
}
// 出力結果
// 1
// 2
// 3
```
##### 参考
* [Javadoc: java.util.Scanner](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)

* [競技プログラミングにおけるScalaの標準入力を楽にする](http://qiita.com/cohalz/items/a54bfc70e4bbc33440cb)
Redmineを使い始めるシリーズ（7）チケットはクローズしましょう！ 

###使い始めは、新しいチケットも細々・・。
管理者や限られたメンバがチケットを作成。
しかし他メンバも慣れてくると、あっという間にチケット乱立状態に。
Redmine的には良いことかもしれないが・・・。

でも、チケット＝課題、アクションアイテムなら管理しUpdateするのが目的ではなく、さっさと解決するのが目的。

**ということで、チケットをクローズするには・・ステータスを終了に。**

チケットには、優先度や担当者の前に、ステータスというリストボックスがある。
ここががデフォルトは「新規」としてチケットがスタート。

###Redmineではステータスに以下6個がある。

新規：新たに登録されたもの。
進行中：作業に着手し対応中。
解決：担当者の作業が終了。例えば、開発ならテスト、問題ならレビュー待ちの状態を指す。
フィードバック：差し戻し。ウォッチャーで指定した次の人が判断。例えば、テストやレビューの結果、修正や追加作業が必要となった時。
終了：チケットの終了。通常は管理者だけが選択でき、ワークフローで設定。
却下：チケットは発行したが、着手せず、着手必要がないと判断したもの。

###ここで注意するのは、新規では作業未着手がRedmineルール。

つまり、管理者がチケットを発行するイメージ。
そしてチケットを割り当てられた担当者が、何かアクションして編集することで進行中にステータスを変え、進捗率を上げていくのがRedmineの使い方となる。
その時に、担当者はRejectとして却下もできる。


採用されなかった新機能の提案、バグとして報告されたが修正する必要のないもの（報告者の誤認など）
Redmineを使い始めるシリーズ（6）ステータスこそ秘訣 

Redmineを実業務、プロジェクトでいかに定着させるか。
いくら良いツールであっても、全員が信奉者ではないので使うことを日常化することがキーとなる。

ではその秘訣はなんだろう。

チケットが仕事


課長、部長、上司、上長、承認、決裁、Approve、
Redmineを使い始めるシリーズ（5）ウォッチャーと閲覧者 

###新しいチケット、を作成する時に一番下にあるのがチケットのウォッチャー。

チェックボックスがプロジェクトメンバごとに用意されているが、これはどうすれば良いんだ。
ウォッチャーって日本語訳すれば、（この新しいチケットを）見る人となるが。
設定する？、しない？、その違いは？なぜ？？？

その前に、Redmineでいうウォッチとは、
チケットだけでなく、Wiki、フォーラムなど情報が更新されたら設定したメールアドレスに通知が行くことを意味している。

**つまりチケットを見る人、ではなくこの更新の通知メールが行く人＝ウォッチャーとなる。**

ウォッチャーのチェックボックスで、この通知メールが行く人を指定することができるわけだ。
そして、チケットが更新されたので確認するよう促すことができる。
チケットは自分で更新するだけではなく、ウォッチャーの追加でチームワークとなる。

・・・と言っても、これがまた弊害の元凶。
そもそも、Redmineトで仕事するとメールのような一方向コミュニケーションから、チケットで双方向へ改善しその分メールも減る、が効果なのに。
普通プロジェクトは、メンバがいくつものチケットに関わるので、ウォッチャーとするとちょっとした編集だろうが何だろうが、更新されればメールが大量到着・・・でうんざり状態。きっと直ぐに自動仕分けで専用フォルダ、もしくは迷惑メールやゴミ箱行きになってしまう。
従い、ウォッチャーは本当に必要な人だけ、つまり上司やチケットの次作業者に限定すべきかと。

さて、日本語の”見る人”はどうなったんだ？

###まずプロジェクトを見る/見れる人の制御は
プロジェクトの「設定」→「情報」の画面で、「公開」のチェックボックスのオン/オフでできる。
チェックされていれば、そのプロジェクトは公開プロジェクトとなり、プロジェクトの参加有無だけでなくRedmineへのユーザ登録有無にもかかわらず、URLを知っている全ての人が閲覧できる。

従い、プロジェクトに少しでも関係ある人が情報を閲覧できるので、まさに公開情報として便利。
但し、インターネット上でRedmineのサーバを利用していると、無関係な第三者も情報にアクセスできるので影響範囲を十分理解しておくことが必要。

更に、チケットは見るだけではなく編集ができる、できないも制御可能。

###それが、Redmineの認証
管理者で「設定」→「認証」の画面で「認証が必要」のチェックボックスをオンにすると、公開であってもなくても全てのユーザーはID、PWの認証を求められることになる。逆にオフだと、認証なしで無しでアクセスできる状態になる。

###以上からRedmineの閲覧を纏めると
閲覧可能範囲
公開 オフ 誰でも閲覧可能(ログインも不要)。Redmineのデフォルト設定です。 
公開 オン Redmineにログイン中のユーザー全員が閲覧可能 
非公開 オン Redmineにログイン中かつプロジェクトのメンバーに登録されているユーザーのみ閲覧可能 
非公開 オフ 同上
サブドメインでAWS Certificate Manager

# やりたいこと
サブドメインが切られた開発環境でACMを使いたい。

# まずやってみたこと(失敗)

```
Validation email is sent to contact addresses listed in WHOIS and to common 
administrative addresses for the domain. Email is not sent to the AWS account 
owner unless the owner is also listed as a domain contact in WHOIS. 
```

と書いてあったので、そのまま申請(`･ω･´)b
してみたけど、開発用サブドメンで受けるメールサーバなんて無いから、当然届かない。

# うまくいったやり方
これだけのためにわざわざメールを受けるだけのサーバを作りたくない…
でも、サブドメインだとWHOIS見てくれないっぽい…
ってことで、SESを利用。

### SESで受信設定
1. SESの左メニューの下の方、**Email Receiving**から**Rule Sets**をクリック。
1. **Create Rule**ボタンをクリック。
1. メールアドレスは、5アドレスに送られるメールアドレスのうちの1つだけ登録する。<br>
　例）　admin@subdomain.example.com
1. **Add Recipient**ボタンをクリックして**Recipient**に入れる。
2. **Verify Domain**をクリックして、DNSにTXTレコードを入登録する
3. **Next Step**をクリック
4. S3の設定をする。<br>
　Add action : S3<br>
　S3 bucket : Create S3 Bucket<br>
　Bucket Name : 適当にわかりやすい名前を<br>
　Prefix : 適当に
1. **Next Step**をクリック
2. **Rule Name**を適当に、あとはデフォルトで**Next Step**をクリック
3. **Create Rule**
4. DNSにMXレコードを登録<br>
　例）　subdomain.example.com	MX	10 inbound-smtp.us-east-1.amazonaws.com.
1. テストメールを送信

### Certificate Manager
1. **Certificate Manager** → ~~Add domain names~~ **Request a certificate**
2. **Domain name**に*subdomain.example.com*
3. **Add another name to this certificate**をクリックして_*.subdomain.example.com_
4. **Review and request**ボタンをクリック。
5. **Confirm and request**ボタンをクリック。<br>
　認証用のメールが上で作ったS3に入っているので、認証用URLをブラウザで開く。<br>
　subdomain用と*.subdomain用の2種類届くので、両方共クリックする必要あり。<br>
　text/htmlパートは無視して、メールの上の方にあるtext/plainパートだけ読めばOK。
1. 開いたページで、**I Approve**をクリック。

以上、あとはCloudFrontの証明書一覧に自動的に現れます。

### ELB
まだTokyoリージョンは未対応なので、どうしてもELBで使いたければ**US East(N. Virginia)**で使わないといけない(´・ω・｀)

# 他
とりあえず、メモと記憶を頼りに書いたので文字しかないけど、
気が向いたら画像も入れたい。。。
requests で ujson を使う

[Requests](http://docs.python-requests.org/en/master/) v2.9.1 では json ライブラリとして

* simplejson があればそれを使う
* なければ json を使う

という実装になっており、json ライブラリの関数で使っているのは dumps, loads のみなので、それらの互換性のある他の json ライブラリ、例えば ujson を使うこともできる。

以下のようにモジュールを格納している変数を上書きすれば切り替えられる：

```py
import requests
import ujson

requests.models.complexjson = ujson
```

ただし、

* あくまでも今の Requests の実装でうまくいく方法に過ぎない（外部仕様として保証されているわけではない）ので、 Requests のバージョンアップでうまくいかなくなる可能性があること
* モジュール変数を書き換えているので、プロセス全体に影響してしまうこと

には注意。

# 参考文献

https://github.com/kennethreitz/requests/issues/1595
当時は requests.models.json という変数名だったが、こっそりリネームされていたようです。
以下のバージョンでは complexjson という名前になっています:

```
% git tag --contains fb6dade6
v2.8.0
v2.8.1
v2.9.0
v2.9.1
```

（明確な理由がなきゃ変えないといいつつ、不明確なコミットメッセージで変更されているのが気になったりしますが）
メモ: knockd 付属の knock でポートをノックしても上手く行かないときは -d1 を指定すると良いかも (?)

## 用途
私は自宅から、趣味の用途で使っている VPS にアクセスできるようにしています。
IP が固定できない状況でも、ある程度のセキュリティを担保できるように、ポートノッキングを設定しています。
ノッキングを行わないとそもそも SSH のポートにアクセスできないように設定しています。

## 状況

実際にノックするとき、 [knock](http://www.zeroflux.org/projects/knock) を使っているのですが、
3 個以上のポートをノックする手順を設定した時に、なぜだか上手く動作しないということがありました。

結局、根本の原因はわからなかったのですが、現象そのものはオプションの指定で解決したので備忘録として書き留めておきます。

OS は OS X 10.11.3 (15D21) で、 knock は knock 0.7 です。 Homebrew を使ってインストールしました。

## テスト

問題を切り分けるために SSH の代わりに Netcat にし、何度か実験しました。
(仮に SSH のポートを 10022 、ノックする手順を 10023, 10024, 10025 とします。)

### テストしたコマンド

```console:接続不可能
$ knock 10023 10024 10025
$ nc -v -z my.example.com 10022
```

(同時に別の端末で tcpdump を grep 付きで起動しておく)

### こんな感じで出れば成功

```shell-session
Connection to my.example.com port 10022 [tcp/*] succeeded!
```

このようにコマンドを叩くと、だいたい 2, 3 回チャレンジして成功する、という感じでした。
少し間を置いて実行すると 1 回で成功することもありますし、 8 回連続でタイムアウトして失敗したこともありました。


## 対処方法

delay のオプションとして -d1 を指定します。
1 ミリ秒待つ、ということです。

```
$ knock -d1 10023 10024 10025
```

たった 1 ミリ秒待っただけで、この問題は発生しなくなりました。
(推測: このオプションがないと、順番通りでなく SYN を送ってしまう、または到達してしまうということ？ )

どこかのポートスキャンを防ぐような Firewall に引っかかっているのであれば、閾値が 1 ミリ秒のような小さい時間に設定するメリットは薄いと思うので、まだ自分の中では納得がいってません。

また、 tcpdump を見る限りでも、 -d1 がある場合とない場合で動作に違いはなさそうでした。


# 余談

ssh_config に次のように設定しておくと、 ssh のコマンド実行時に knock も実行するので、非常に楽です。

```ssh_config
ProxyCommand bash -c 'knock -d1 %h [ノックするポート] ; nc %h %p'
```
React.jsでformのSubmitを無効化させるとき

よく忘れるのでメモ
e.preventDefault();
してからAction

```
class GeneratePin extends Component {
  handleSubmit(e) {
    e.preventDefault();
    const { someAction } = this.props;
    someAction();
  }

  render() {
    return (
      <form
        className="form-horizontal"
        onSubmit={this.handleSubmit.bind(this)}>
        <Input type="select" label="" name="num" placeholder="">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
        </Input>
        <button className="btn btn-default">送信</button>
      </form>
    );
  }
}

```
Ansible モジュール debug

#debug
実行中にステートメントを出力する

##概要
実行中にステートメントを出力するモジュール。playbookを停止せずに変数や式をデバッグするのに便利。「when:」ディレクティブと同時に使ってデバッグする際に有用である。

##オプション

|引数|必須|デフォルト|値|備考|
|:---------|:---------|:---------|:---------|:---------|
|msg|no|Hello world!||出力用のカスタマイズされたメッセージ。省略時、汎用的なメッセージが出力される。|
|var|no|||デバッグする変数名。<b>msg</b>引数とお互いに排他的である。|

##使用例

```yaml:
# ホスト毎にループバックアドレスとゲートウェイを出力する
- debug: msg="System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"

- debug: msg="System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
  when: ansible_default_ipv4.gateway is defined

- shell: /usr/bin/uptime
  register: result

- debug: var=result

- name: Display all variables/facts known for a host
  debug: var=hostvars[inventory_hostname]```
```

###Ansibleコアモジュール
このモジュールはコア・アンシブルチームによりメンテナンスされます。
[Linux]LVMを用いたディスク増設

先日サーバのディスク増設を行った際に色々と調べたので、ディスク増設〜Linux側の認識まで整理したいと思います。

# 前提
- サーバ : HP ProLiant ML110 Gen9
- OS : RedHat Enterprise Linux 6.4
- ディスクボリューム : LVM
- ストレージコントローラ : HP H240 Smartホストバスアダプター

# 増設ディスクの調達
今回はHP社のML110 Gen9というタワー型のサーバにディスク増設をしました。
ホットプラグの2.5型を1つ搭載していたので、2.5型のディスクを最大8個まで積めます。
サーバを購入した時は2.5型450GB×3でRAID5を組んでいたのですが、想定外に容量が必要となり、2.5型450GB×5を購入して5個でRAID5を組みます。
※最初から買っとけよ、という指摘はスルーします。。。

今回買ったディスクはこんなやつです。
![HP14XQD.jpg](https://qiita-image-store.s3.amazonaws.com/0/21630/1fef2977-039a-cc6d-8b60-675218a36867.jpeg)


またRAIDごとの仕組みや性能については[ここ](http://h50146.www5.hp.com/products/servers/proliant/support/old/support_01/support01_03_06.html)が参考になると思います。

# ディスクの増設
早速ディスク増設!と行きたいところですが、サーバのフロントパネルをどうやって開ければいいかわからず、早速サポートに電話・・・・・。

細かく教えてくれた後に、「[User Guide](http://content.etilize.com/User-Manual/1029962677.pdf)に書いてあるけどね。」と一言。
※一応色々調べたのですが、User Guideに書いてあるとは思いませんでしたね。

HPのサポートは24時間でオンラインチャットや電話もあるので非常に満足のサポートですね!お勧めです!

記載通りに側面のパネルを外し、フロントパネルを外しました。
その後、ブランクパネルを外し、購入したディスクを5つホットプラグに挿しました。
**注意）側面パネルを外すので、サーバの電源は落としてケーブル類は全て抜いた方が良いです。**

# アレイの作成
アレイの作成はHPの[Smart Storage Administrator(SSA)](http://h50146.www5.hp.com/lib/products/servers/proliant/manuals/742648-191_ja.pdf)で作成します。

アレイの作り方は以下が参考になります。
[HP ProLiant サーバー - Smart Storage Administrator (SSA) を使用した RAID 5 の作成方法](https://h20628.www2.hp.com/km-ext/content-webapp/document?docId=emr_na-c04100830)

増設したディスク5本を選択してRAID5を作成します。5分くらいで作成は完了です。
※パリティチェックが走りますが、平行して作業して問題ないです。

# LVMの作成
今回は既存のVGに追加したRAID5の約2TB弱を追加する形で増設を行います。

VG増設までの流れは以下のとおりです。

1.パーティションの作成
↓
2.pvの作成
↓
3.vgの拡張
↓
4.lvの拡張

## パーティションの作成
パーティション作成するコマンドとしては`fdisk`や`parted`がありますが、`fdisk`は2TB以上のパーティションが切れないということで、いつも`parted`を使うようにしています。
なので、今回も`parted`でパーティションを作成します。

### デバイスの確認
今回すでにアレイを2つ作成していたので、追加されたアレイのデバイス名は[/dev/sdc]となります。

まずはデバイスが存在することを確認します。

```
 # parted -l /dev/sdc
```

### パーティションの作成

```
 # parted /dev/sdc
 (parted) mklabel gpt
 (parted) mkpart primary 1 -0
 (parted) set 1 lvm on
```

mkpartでパーティションのサイズを指定しますが、`-0`とすると全容量を割り当てることになります。

これでもう1回`parted`コマンドで確認すると/dev/sdc1のパーティションができていることが分かります。

```
 # parted -l /dev/sdc
```

## pvの作成
先ほど作ったパーティションに対してpvを作成します。

```
 # pvcreate /dev/sdc1
```

## vgの拡張
既存のvgをvg_testとした場合、vg_testに先ほど作ったpvを追加します。

```
 # vgextend vg_test /dev/sdc1
 # vgdisplay 
```

vgdisplayでvg_testの"Free PE"を確認すると今回追加したディスク容量が増えていることが分かります。

## lvの拡張
後は既存のlvを必要に応じて拡張すればOKです。
※ここではlv名をlv_testとして記載しています。

```
 # lvresize -L +100G /dev/mapper/lv_test
 # resize2fs /dev/mapper/lv_test
```

vgにさえ登録してしまえば、後は今ままで通り、lvに好きに容量を割り当てられるので、LVMはやっぱり便利ですね。
【Cocos2d-x】ただの平面画像で魔法陣的なアレをやる

# ただの平面画像を擬似立体で魅せる

今回紹介するテクニックの結果はこんな感じ。

![magic_circle.gif](https://qiita-image-store.s3.amazonaws.com/0/85825/e3bdf6d7-4bfb-5d1e-70f9-19b1883e1592.gif)

使ったのはこの画像。

![magic_circle.jpg](https://qiita-image-store.s3.amazonaws.com/0/85825/fe76fd6e-25ee-f5ad-5fb5-7a663d2f958d.jpeg)
http://f.hatena.ne.jp/naoki1202/20071127012246

## やり方

1. 魔法陣の画像で`Sprite`を生成する。
2. Y方向を潰して立体感を出す為に`Node`クラスのフレームを生成して`setScaleY(0.5f)`しておく。
3. フレームに魔法陣を`addChild()`する。
4. 後は回すなりスケール変えるなりご自由に。

## ソースコード

`cocos new`した`HelloWorldScene::init()`に書いた感じ。

```cpp
// 潰して奥行きを表現する為の枠
Node *frame = Node::create();
frame->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
frame->setPosition(Director::getInstance()->getVisibleSize()/2);
frame->setScaleY(0.5);
this->addChild(frame);

// 魔法陣
Sprite *magic_circle = Sprite::create("magic_circle.jpg");
magic_circle->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
magic_circle->setPosition(frame->getContentSize()/2);
magic_circle->setScale(0.0f);
frame->addChild(magic_circle);

// アニメーション
FiniteTimeAction *action1 = Spawn::create(RotateBy::create(0.2f, 90.0f),
                                          ScaleTo::create(0.2f, 2.0f), NULL);
FiniteTimeAction *action2 = RotateBy::create(1.5f, 300.0f);
FiniteTimeAction *action3 = Spawn::create(RotateBy::create(0.2f, 90.0f),
                                          ScaleTo::create(0.2f, 3.0f),
                                          FadeOut::create(0.2f), NULL);
CallFunc *reset = CallFunc::create([magic_circle]() {
    // リピートの為にリセット
    magic_circle->setScale(0.0f);
    magic_circle->setOpacity(255);
});

magic_circle->runAction(RepeatForever::create(Sequence::create(action1,
                                                               action2,
                                                               action3,
                                                               reset,
                                                               DelayTime::create(1.0f), NULL)));
```

## おまけ

魔法使いを上にのせてみた。
ガチャとか引いて出てくるときこんな感じ？

![magician.gif](https://qiita-image-store.s3.amazonaws.com/0/85825/770a6c46-f07e-f3d0-11c9-387a3be0a628.gif)

ただ、魔法陣の発光を上方向に表現するのは、ただの平面画像じゃ無理。
Rails5.0.0.beta2でOpalが動かなかった話


```
rails g channel chat

/Users/hoge/.rvm/gems/ruby-2.3.0@alpha/gems/opal-0.8.1/lib/opal/sprockets/server.rb:7:in `require': cannot load such file -- rack/showexceptions (LoadError)
```

おお、もう…。

で、なぜこうなるかというと、Rack 2.x系は`rack/showexceptions`が`rack/show_exceptions`にリネームされているから。

つまり、

```/Users/hoge/.rvm/gems/ruby-2.3.0@alpha/gems/opal-0.8.1/lib/opal/sprockets/server.rb
require 'rack/file'
require 'rack/static'
require 'rack/urlmap'
require 'rack/builder'
require 'rack/deflater'
require 'rack/directory'
require 'rack/showexceptions'
require 'opal/source_map'
require 'sprockets'
require 'sourcemap'
require 'erb'
require 'opal/sprockets/source_map_server'
require 'opal/sprockets/source_map_header_patch'

（以下略）
```

を、

```/Users/hoge/.rvm/gems/ruby-2.3.0@alpha/gems/opal-0.8.1/lib/opal/sprockets/server.rb
require 'rack/file'
require 'rack/static'
require 'rack/urlmap'
require 'rack/builder'
require 'rack/deflater'
require 'rack/directory'
require 'rack/show_exceptions'
require 'opal/source_map'
require 'sprockets'
require 'sourcemap'
require 'erb'
require 'opal/sprockets/source_map_server'
require 'opal/sprockets/source_map_header_patch'

（以下略）
```

こうしてやれば動く。

```
rails g channel chat
Running via Spring preloader in process 54449
      create  app/channels/chat_channel.rb
      create  app/assets/javascripts/channels/chat.coffee
```

`create  app/assets/javascripts/channels/chat.coffee`…。
結局のところ、opal-railsにchannel_generatorがないので、書かないといけない模様。
macのrailsサーバーにスマホ実機でアクセスする

macローカルでrailsウェブサービスを作ってて、スマホ実機でテストしたいとき。
エミュレータでもいいけど、実機じゃないとテスト出来ないときってありますよね...

### 1. mac、スマホを同じwifiに繋ぐ

### 2. macのローカルIPを調べる

ネットワーク環境設定で確認。↓の場合は`192.168.11.8`

<img width="665" alt="ip.png" src="https://qiita-image-store.s3.amazonaws.com/0/29775/5e234ef5-3a4e-c1bf-6c3c-8b94de292205.png">

### 3. IP指定でrailsサーバーを立ち上げる

IPが`192.168.11.8`の場合

```
bundle exec rails s -b 192.168.11.8
```

(-bオプションでIP指定できます）

### 4. スマホでアクセス

以下の様なURLにスマホでアクセスすればOK。
`http://192.168.11.8:3000/`
rails マイグレーションで dateのデフォルト値を設定する(postgres)

## 環境
rails 4.2.4
postgres (PostgreSQL) 9.4.1

## 本題
date型のデフォルト値を設定したい場合、
1. データを格納するときにデフォルト値を入れる
2. sql文を実行する

の2つの方法がありますが、1だと入り口が複数あるときに漏れが生じ得ます。
sql文を発行しましょう

```xxx_change_column_to_account.rb
class ChangeColumnToAccount < ActiveRecord::Migration
  def up
    execute "ALTER TABLE accounts ALTER COLUMN expired_at SET DEFAULT CURRENT_TIMESTAMP + interval '1day';"
  end

  def down
    execute "ALTER TABLE accounts ALTER COLUMN expired_at DROP DEFAULT;"
  end
end
```
もし全てのtableにdefault値を設定したい場合、次のようにするとtable名を配列で取得できます。

```table_list.rb
def tables_except_schema_migrations
    ActiveRecord::Base.connection.tables.tap {|table| table.delete('schema_migrations') }
end
```
ちなみに、`change_column :accounts, :expired_at, :date, default: (Time.now + 1.day)` とやると
マイグレーション時に評価され、デフォルト値がいつも同じ日付になってしまいます。