OmniAICreator/Qiita-1.07M huggingface dataset:
Handsontableで本格的な帳票の入力フォームを作るとき必要だったことたち

# はじめに
## 「帳票作る機能作って」
...といわれて、いったん今回の要望聞いたところ、
1. 「できる限り画面で編集したものがそのまま印刷される感じ(見た目的に)にしてちょ」
2. 「操作しやすくしてちょ(キーボードでセルを移動できたり...)」
とのこと。
うちの会社でまだweb上で帳票入力機能を作ったことがなかったので、依頼側も
「たり」の続きも出てきません(笑)
きっと料金の合計計算とかはマストで必要、
他にも、日付だったらDate picker的なものがあったらうれしいだろうなとか、
不適切な入力のバリデート機能はそこｓこいるだろうとか、
まだイメージわかなくて上がってきてない要望が、
「操作しやすくしてちょ」という言葉には含まれています(笑)
## Handsontable + Thinreportsでいこう
で、色々調べて、

* 入力フォーム：Handsontable
* PDF出力：Thinreports

でいこう、ということになりました。
PDFフォーム使う案とかもあったのですが、
Handsontableなら料金の計算やらバリデートやら、自由にjsで書けるし、ということで採用。
Thinreportsで別途テンプレートだけ作って表示することに。

もうちょっとだけ詳しく言うと、
Handsontableを本物の帳票と似せて作り(CSS)、
入力フォームとして使います。
それで、入力されたデータをThinreportsでPDFをつくる専用のAPIに投げて
PDFを出力させる、という流れです。
データはHandsontableの出力データをjsonでDB保存します。

## 本記事の位置づけ 
基本的な導入の仕方等はたくさん記事がありますので、そちらをチェックしてください。
本記事では、「Handsontableって、Web上でエクセルみたいなセルを表示できて、
セルの結合とか、色々できるんだなー」という状態から、
実際問題、帳票を作るときに必要になったオプションや実装方法を書いていきます。

# 実際帳票を作る上で必要になったHandsontableの設定メモ
## セルの色などスタイルを変える
項目名の部分は色を変えたり、文字サイズを変えたり・・・
スタイルを変えるには、セルにclassを割り振ってスタイルシートで設定しましょう。

```
cellProperties.className = 'td_white';
```
## readonly
「お名前」「電話番号」など、項目名は編集できては困るのでreadonlyに。

```
cellProperties.readOnly = true;
```
## メニューを表示しない
デフォルトで、右クリック時に「セルをマージする」などなどのメニューが出てきます。
帳票ではいらないので消します。

```
contextMenu: false, 
```

## セルを結合する
エクセルのようにセルを結合することができます。
結合したいセルの中の、最も左上を起点として、そこから縦・横に、いくつを結合するかを記述します。

```
mergeCells:[
  {row: 0, col: 0, rowspan: 3, colspan: 1},
  {row: 1, col: 1, rowspan: 2, colspan: 1},
]
```

## 余分な行を出力させない
Handsontableは、デフォルトで、「最終行の入力をしたら新しい行が新規追加される」という機能があります。
帳票作成の場合、テンプレートの枠が勝手に増えていっては困るので、この設定をしておく必要があります。
また、こちらもデフォルトでは、「1行空行を余分に表示する」という仕様なので、明示的に「いらないよ」と言っておく必要があります。

```
maxRows: 4,
maxColumns: 6,
minSpareRows: 0
```
## 行の幅を動的に変えない
こちらも、自動で伸縮したら困るので数字で設定。

```
colWidths: [80,165,250,80,165,250],
rowHeights: [10,10,10,110]
```

## セル入力後、次に選択されるセルを指定する
案外喜ばれた機能。
縦に入力することが予想される部分と、横の部分とで、
エンターを押したときに次に選ばれるセルを変えることができます。

```
enterMoves: { row: 1, col: 0 }
```
## プルダウン
帳票という性質上、そこに書き込む文言が何パターンかのうちひとつであることはよくあります。
そこで、選択肢の中で選んで入力させてあげます。
選択肢を無視しての自由記述を認めるか否かも決められます。

```
cellProperties.type = 'dropdown';
cellProperties.source = ['ooo','xxx','△△△'];
```


## Date picker
「契約日」など、日付を入力したい場合、jQueryのdatepicker的なものが使えます。

```
cellProperties.type = "date";
cellProperties.dateFormat = "YYYY/MM/DD";
```

## バリデート,料金計算など
自分で好きなようにバリデータをつくるなら、afterChangeに。
料金の合計や、消費税計算などもここに書けます。

```
afterChange: function(change, source) {
  if (change != null) {
    if ($('.vali').height() > 110) {
      alert('行数はみ出てます');
    }
  }
}
```


## 確実に保存してもらうために
これはもはやHandsontableの使い方、とかではありませんが、
確実に保存してからPDF出力してもらう為に、
セルの内容に変更があったら、まずPDF出力ボタンを消し、
保存ボタン(点滅させてめちゃくちゃ目立つ)を表示するようにしました
この辺も、きちんとした書類ということで必要な機能です。

```
afterChange: function(change, source) {
  if (change != null) {
    $('.save_button').addClass('tenmetsu');
    $('.save_box').show();
    $('.pdf_button').hide();
  }
}
```

# まとめ
Handsontableが「エクセルっぽいことがいろいろできる」だけに、
帳票として使うためには、むしろデフォルトの便利機能を明示的にオフにしていくような作業が必要でした。
一通りHandsontableのデフォルトの仕様が頭に入ってこれば
次回からは必要な機能を選びつつ、サクサク作れるかなといったところです。

是非、割ときちっとした用途にも、ご検討ください！
OpalでElectronのアプリをつくる(その3)

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の16日目の投稿として書いています。

昨日の続きで、electron_opalをOpal v0.10.3で動かしてみましょう。

まずは、Opalのバージョンをそのまま上げて動くでしょうか?
cloneしてきたソースコードの*electron_opal.gemspec*をOpalのバージョンを変更します。

```ruby:electron_opal.gemspec
  s.add_dependency "opal", "~> 0.10.0"
```

bundleコマンドでアップデートします。

    $ bundle update

opalのバージョンが0.10.3になりました。
ビルドしてみましょう。

    $ bundle exec rake build
    rake aborted!
    can't modify frozen Array

いきなり失敗しました。`Opal.pathes`がfrozenに変更になったのでしょう。
21行目を

```ruby:lib/electron_opal.rb
  @config.paths = Array.new(Opal.paths)
```

と書きかえます。

つぎは、`load_asset_code`というメソッドがないと言われます。

14日目の記事の書いたとおり、`Opal::Builder.build`を使います。
`Opal::Builder.build`でコンパイルされたコードはロードするとそのまま実行されますが、
元のコードでは`Opal::Processor.load_asset_code`と`env.find_asset`に分かれていて、コンパイルされたコードとそれを呼び出すコードとに分けています。

67行目の`compile_js`は次のように書きかえます。

```ruby:lib/electron_opal#L67
def compile_js(asset_name, options={})
  load_asset_code = Opal::Builder.build(asset_name)
  write_to("#{asset_name}.js", load_asset_code)
end
```

106行目は削除しましょう。

```ruby:lib/electron_opal#L106
      scripts << %{<script>#{Opal::Processor.load_asset_code(@env, @name)}</script>}
```

これだけでは、buildするとファイルがみつからないと言われます。
33行目、`setup_env`を以下のように書きかえます。

```ruby:electron_opal#L33
def setup_env
  config.paths.flatten.each { |p| Opal.append_path(p) }
end
```

51行目はPathnameのままだとだめみたいなので、`to_s`を呼んでStringにしておきます。

```ruby:electron_opal#L51
    asset_name = Pathname.new(file_path).basename(".rb").to_s
```

    $ bundle exec rake build
    $ bundle exec rake

ちゃんと動きましたでしょうか?

これで一応、OpalでElectronアプリが動きました。
今回の修正はelectron_opalにPRしようかと思ったのですが、大分メンテナンスされていないようだし、実はElectronのライブラリのラッパーも持っているのですが、わたしが書いたような`Native`を使う方法ではなく独自のやりかたをしています。
electron_opalをメンテナンスしていくよりは、別に新しいものを作ったほうがよさそうだと思ったのでPRはしませんでした。
ある程度まとまったものが出来たら、また発表しようと思います。
[Unity] Rayが当たっている位置に貼りつくように画像を表示する

　　この記事の内容は、Unity 5.4.1以降で動作を確認しています。

##内容
　VRアプリで多用するRayを見やすくする方法の一つになると思います。

```C#:Raymanager.cs
public class RayManager : MonoBehaviour {

    //Rayの基本設定用
    public GameObject dive_Camera; //(VR用カメラとして使用させてもらっています)
    public GameObject reticle; //表示したい画像をアタッチ
    Vector3 defaultPos;
    Quaternion defaultRotation;
    public float rayDistance;

    void Start () {
        //Rayの初期化設定
        defaultPos      = reticle.transform.localPosition;
        defaultRotation = reticle.transform.localRotation;
    }

    void Update () {
        //Rayの射出(VR用にdive_Cameraを使用しているがRayを生成すれば何でもよい)
        Ray ray = new Ray(dive_Camera.transform.position, dive_Camera.transform.rotation * Vector3.forward);
        RaycastHit hit;

        //Rayが当たっているときの処理
        if (Physics.Raycast(ray, out hit, rayDistance)) {
            //Rayの可視化（デバッグ用）
            Debug.DrawLine(dive_Camera.transform.position, hit.point, Color.red);
            Debug.DrawRay(hit.point, hit.normal, Color.green);


            //Rayの位置・動作を決める部分
            reticle.transform.rotation = Quaternion.LookRotation(hit.normal);
            reticle.transform.position = hit.point + (hit.normal * hitRayPosition); //hitRayPosition は画像が当たった対象にめり込まない程度に設定する

            //略
        }
        //デフォルトのRayの位置
        else {
            reticle.transform.localPosition = new Vector3(0, 0, defaultPos.z);
            reticle.transform.localRotation = defaultRotation;
        }
    }
}

```

　タイトル回収に重要なのは`reticle.transform.rotation`の部分です。↓のように書くことで、画像の表れ方に味を加えることもできます。

```
reticle.transform.rotation = Quaternion.Slerp(reticle.transform.rotation, Quaternion.LookRotation(hit.normal), Time.deltaTime * 10.0f); 
```

　↓のような動作になります。

　![貼りつくRay.gif](https://qiita-image-store.s3.amazonaws.com/0/134754/0911f5c5-150c-3bfc-248e-a85dd4205811.gif)

　Rayの当たった位置にオブジェクトを生成する場合などにも使用できるので、試してみてください。


##参考
(http://answers.unity3d.com/questions/16952/instantiate-based-on-raycasthitnormal.html)
(https://docs.unity3d.com/ja/current/ScriptReference/RaycastHit-normal.html)
(https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.LookRotation.html)
bootstrap-tagsというプラグインを使う~tag-itが使えない人へ〜

※中学生の頃の記事なので読みにくいです。すみません。(ちなみに、Rails系の記事全てその年代なので共通して酷いです)

#Railsでbootstrap-tagsとういう、bootstrapプラグインを使う
[リンク](https://github.com/maxwells/bootstrap-tags)
[デモ](http://maxwells.github.io/bootstrap-tags.html)
##紹介
・SCSSを使って書かれている、`bootstrap`ベースのため、`tag-it`など`jquery-ui`ベースのものと異なり競合が起きない
・同じようなものとして、`bootstrap-tags-input`があるがこれには、標準でオートコンプリート機能がない。しかし、この`bootstrap-tags`には搭載されてる。
**素晴らしい！！**
##導入
```application.js
//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require nested_form_fields
//= require jquery-ui
//= require bootstrap-tags
//= require_tree .
```
scss版があるので、scss版を選んだ

```application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";
@import "application_helper";
@import "bootstrap-tags";
```
```XXX.coffee
$ ->
  Tags.bootstrapVersion = '3'
  $('#small').tags
    tagSize: 'sm'
    suggestions: [
      'alpha'
      'bravo'
      'charlie'
      'delta'
      'echo'
      'foxtrot'
      'golf'
      'hotel'
      'india'
    ]
    tagData: [
      'juliett'
      'kilo'
    ]
  return

```
```XXX.erb
<div id="XXX"></div>
```
#####リンクを見て貰えばわかると思うが一応解説
`$('#XXX').tags`
id(XXX)に、対してタグを設置できる
`Tags.bootstrapVersion = '3'`
は、bootstrapのバージョン指定可能2~3までのはず
 `tagData`
は、予め、入力された状態のタグを指定可能
`suggestions`
は、オートコンプリートのデータ`gon`などを使って、より拡充可能
`tagSize: 'sm'`
は、タグのサイズ

##最後に
あんまり情報がないので、英語でもRailsに導入した例が見つからなかったんで、書きました。
情報が、少ないですが、`bootstrap-input-tags`、よりは高性能だと思うので、使っていただけると嬉しい。
PythonからGPU使用率などの情報を取得する(nvidia-smiコマンド)



サーバのどのGPUが空いてるか調べたい→プログラムからGPU使用率とか取れないのかな〜と思ってちょっと調べたらいつも使っている`nvidia-smi`コマンドはオプション次第でマシンリーダブルな出力を出してくれそうなことがわかりました。

# --query-gpuオプション

`--query-gpu`オプションは欲しい情報を並べるとそれをとってきて`--format`オプションで指定した出力スタイルに加工して出力してくれます。

たとえば以下のような情報を指定することができるようです。

- index: 0からはじまるハードウェアのマシン上の番号, "0"とか"1"とか
- memory.free: 空きGPUメモリ量, "5123 MiB" とか
- memory.used: 使用GPUメモリ量, "3451 MiB" とか
- memory.total: GPUに搭載されているメモリ量, "8113 MiB" とか
- utilization.gpu: GPU使用率, "12 %" とか
- utilization.memory: GPUメモリ使用率, "49 %" とか
- timestamp: nvidia-smiコマンドが実行された時間, "2016/12/16 22:05:43.771" とか
- uuid: グローバルにユニークな変化しないID。GPUに貼られてる番号とかは関係ないらしい, "GPU-92275dc5-b7cc-1a5f-0348-f389e3040f2b" とか

他にもいろいろキーがあるので`nvidia-smi --help-query-gpu`で確かめてみてください。

# --formatオプション

`--query-gpu`で指定した情報をCSVに吐き出すために使用します。`--format=csv`が一番シンプルな呼び出し方ですが、`noheader`と`nounits`も指定することができます。

- `noheader`: CSVの一番最初の行としてヘッダ行が出てこなくなる
- `nounits`: たとえばGPU利用率(utlization.gpu)を取得したとき "10 %" となるのが "10" になる

これらを組み合わせて `--format=csv,noheader` とか `--format=csv,noheader,nounits` とできます。


# Pythonでnvidia-smiの情報を取得する関数

```python
import subprocess
import json

DEFAULT_ATTRIBUTES = (
    'index',
    'uuid',
    'name',
    'timestamp',
    'memory.total',
    'memory.free',
    'memory.used',
    'utilization.gpu',
    'utilization.memory'
)

def get_gpu_info(nvidia_smi_path='nvidia-smi', keys=DEFAULT_ATTRIBUTES, no_units=True):
    nu_opt = '' if not no_units else ',nounits'
    cmd = '%s --query-gpu=%s --format=csv,noheader%s' % (nvidia_smi_path, ','.join(keys), nu_opt)
    output = subprocess.check_output(cmd, shell=True)
    lines = output.decode().split('\n')
    lines = [ line.strip() for line in lines if line.strip() != '' ]

    return [ { k: v for k, v in zip(keys, line.split(', ')) } for line in lines ]


import pprint
pprint.pprint(get_gpu_info())
```

こんな感じで動きました。

- 第一引数( `nvidia_smi_path` ): `nvidia-smi`コマンドのパスを絶対パスなどで指定したい場合にセットしてください。デフォルトでは`'nvidia-smi'`になっています。
- 第二引数( `keys` ): 取得したい情報を各要素が文字列の`list`または`tuple`オブジェクトで指定してください。デフォルトではコード中の`DEFAULT_ATTRIBUTES`にリストされている内容になっています。
- 第三引数( `no_units` ) : 各キーの値に単位を含めたいかどうかを`bool`でセットしてください。デフォルトでは`True`になっており、単位は省かれます。
- 返り値:
  - GPUユニット個数分の`dict`要素を持つ`list`オブジェクト
  - `dict`の各キーは第二引数で指定したもの
  - `dict`の各値はバイト文字列(`index`や`utilization.gpu`を数値として扱いたい場合は`int()`かけてください)

これで`slack`などで`bot gpu status`とかたずねるとGPU利用状況を教えてくれるbotが簡単に作れそうですね。
Enjoy!
プロデューサーとディレクターとエンジニアの業務を並行してやってみたら炎上した件

本題の案件が今年で一旦区切りがつくようなので、いい機会と思い本案件の「だめ」だったとこと「こうすべきだった」のを書きたいと思います。


## かんたんなあらすじ
元エンジニアのKは「プロデューサーの視点での考え」というのを知りたく、プロデューサーへの道を探していました。

ある日、仲の良いクライアントから新規アプリ開発の企画・運用・開発全ての受託案件を持ちかけられたのをきっかけに、プロデューサー職にジョブチェンジしました。

しかし、クライアントの希望するリリーススケジュールはキツキツで、すぐに作業開始しないと間に合わないという状態。

にもかかわらず、人的リソースの調達が上手くいきません。

そこでKは**プロデューサー、ディレクター、エンジニアリーダー、API及びインフラ構築**の作業を兼務し、なんとかスケジュールに間に合わせようとしました。
（フロントエンジニア、デザイナーは別に用意）

「この体制で上手くプロジェクトを進められるのか…」という漠然な不安をKは持ちつつ、プロジェクトはスタートし、**結果炎上したのでした。**

果たしてKは何がまずかったのか


## 出来ないことを無理に自分でやろうとした
はい。

プロデューサー業務もディレクター業務もやったこと無いのに全部の業務を「やります！やらせてください！」といった結果、当然**ボトルネックがK**になりました。

Kはすべての業務の要のため、Kが遅れるとその後の全作業が遅れます。

遅れるだけでは終わらず、スケジュールに間に合わせようとするために、クライアントとの調整、企画の内容、コーディング、アプリのチェック、どれもこれも中途半端になっていき、**全関係者に迷惑をかけました。**

### こうすべきだった

自分ができないことをやらなくちゃいけないことなんてこと、しょっちゅう起きます。

そういうときはちゃんとそこのケアを用意しておきましょう。

プロデューサー／ディレクター業務やったこと無くて不安であればヘルプ要因やアドバイザーの用意をあらかじめしておきましょう。

プロジェクトがスタートしてからだとコストの問題等で用意が出来なくなったりします。

Kの場合は途中からベテランディレクターが入ってくれため、なんとか落ち着きましたが、**人件費のコストが初期想定から大幅に増加しました。**


##  エンジニア側によりすぎた
エンジニアって楽しい。

自分ができることをやると作業が進むし楽しですよね。

自分がやったこと無いのをやるのも新しい発見が見つかれば楽しいですが、作業が進まないのはストレスが溜まります。

Kは本来プロデューサーです、しかしエンジニアの作業が楽しいといってエンジニアの作業ばかりやることになり、プロデューサー／ディレクター業務が疎かになっていくのです。

また、Kの場合企画内容やクライアントとの調整時もエンジニア目線となり、**まず技術側の都合を考えた体での進め方**になっていました。

Kは最後までエンジニア目線での進め方を貫いたため、クライアントとの定例ではエンジニア関連の話ばかりになり、アプリに関しては**目新しい企画もなく、マネタイズの設計も弱い**提案となってしまいます。

結果、リリース後のKはエンジニアリーダーとしての調整がメインとなり、プロデューサーとしての業務は**クライアントの手助けを得るようになってしまいました。**


### こうすべきだった

エンジニアの業務はエンジニア担当者にまかせるべきでした。

もしコスト等の問題で１人で兼務しなければいけない場合は、並行して作業を行うことはせず、**一切エンジニアの作業をしない日等を決めて**作業したほうがいいと思います。

また、プロデューサー業務とディレクター業務の並行も良くないと思います、マネタイズのことを考ながらいい企画を考えるのは難しいと思います。


## 全関係者との調整作業が想像以上に大変だった

Kは今まで業務を

1. ディレクターからの依頼
2. 工数見積
3. 開発／テスト
4. リリース

という流れを短期間で行っていました。

その流れをそのままに当てはめてプロデューサーの業務を行って　1. クライアントからの依頼　になったところ

その依頼を実現するために、プロジェクト関係者に対しての調整（許諾確認等）作業が必要なのですが、その作業が多すぎるということに気が付きました。

特に社外関係者との調整は**先方都合等でしょっちゅう予定が狂います**ので、その都度調整を調整する必要があり、社外関係者が多ければ多いほどその作業に時間を取られます。

調整を忘れたりしたりした日には、

- 許諾が取れない
- 素材が提供されない
- 必要なIDが来ない

等でスケジュール遅延が逃れられません。


### こうすべきだった

担当する業務の範囲を明確にリスト化し、それぞれの項目に対して誰がいつまでに何をやる、というのを関係者全員に対して認識してもらうようにすべきでした。

また、確認作業はしつこいくらいに行うべきです。
（先方はやってくれているであろうという希望的観測は捨て去るべき）


## 終えてみて
今年いっぱいなのでまだ終わってはないんですが。

Kはやりたかったプロデューサーの業務が出来たのでしょうか。

プロデューサーの視点というのは見えたのでしょうか。

Kは関係者全員を１人で調整・管理しながらコーディングするのは無理だとわかったようです。

いま、Kはエンジニア職に戻っています。
iTunesConnectでInReviewのときにアプリをちょっと古いFastlaneで差し替えるのは危険

題名通り危ない。
もしかしたらFastlaneのドキュメントに書いてあるのかもしれない。
またどこ(Fastlane(deliver?) or Apple?)の不具合なのか本記事では追跡はしていない。


# 何が危ないのか

iTunesConnect上で、配信準備完了となっているバージョン/ビルドが、実際に公開されているものと異なることが発生する。

# 何故異なる事に気がついたのか

実装/リリースした機能が動作しなかったことで発覚。
また、サーバー側でアプリからのリクエストのヘッダーをロギングしているのだが、
そのログにアプリ側からおくったヘッダー情報内に含めているバージョンやビルドが異なっていることが分かった。
最終的に申請中にFastlaneで申請しているアプリを変更したもの のみ この症状が出ていることまで特定でき、原因判明となった。

# どの様な環境/状況で、どのようなFastlaneのlaneを実行したのか

## 環境

`macOS Sierra 10.12.1`

```
➜  ~ ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
➜  ~  fastlane --version
fastlane 1.111.0
➜  ~ gym --version
gym 1.12.1
➜  ~ deliver --version
deliver 1.16.1
```


※12月10日の時点でのバージョンとなる。のでバージョンが若干異なる可能性あり。


## ビルド用のlane

アプリをBuild(`gym`)してiTunesConnectにUpload(`deliver`)するだけ。

```Fastfile.rb
  lane :build do
	    	gym(scheme: "jp.foo.baaa.bbb", use_legacy_build_api:true)
	    	deliver(force: true,
	    		skip_screenshots:true,
	    		submit_for_review:false,
	    		skip_metadata:true,
	    		app_identifier:scheme_name)
  end
```

## TestFlightとSubmit用のlane

Apple側での処理が完了したらこれを実行する。
申請とTestFlightをやってくれる。

```Fastfile.rb
lane :submit_test do

Spaceship::Tunes.login('account', 'pw')
Spaceship::Tunes.select_team

begin
	app = Spaceship::Tunes::Application.find("jp.fooo.baaaa.aaaa")
	v = app.edit_version
	v.release_notes["ja"] = "Thank you guys"
	v.release_on_approval = 'true'
	builds = v.candidate_builds
	v.select_build(builds.first)
	v.save!

	# Testflight
	begin
	  train = app.build_trains["77.1.0"]


	  # Access all builds for a given train
	  train.builds.count
	  build = train.builds.last

	  # Enable beta testing for a build train
	  # This will put the latest build into beta testing mode
	  # and turning off beta testing for all other build trains
	  train.update_testing_status!(true, 'internal', build)
	  slack(message: "`#{my_address}` Testflight: #{"jp.fooo.baaaa.aaaa"} ", success: true)
	rescue => ex
	  slack(message: "(2) `#{my_address}` #{"jp.fooo.baaaa.aaaa"} #{ex}", success: false)
	end

	# Submit
	begin
	  submission = app.create_submission
	  submission.export_compliance_uses_encryption = false
	  submission.add_id_info_uses_idfa = false
	  submission.content_rights_contains_third_party_content = false
	  submission.content_rights_has_rights = false

	  # Finalize app submission
	  submission.complete!
	  slack(message: "`#{my_address}`: Submit: #{"jp.fooo.baaaa.aaaa"} ", success: true)
	rescue => ex
	  UI.error("(3) Something went wrong: #{ex}")
	  slack(message: "(3) `#{my_address}` #{"jp.fooo.baaaa.aaaa"} #{ex}", success: false)
	end

	rescue => ex
	UI.error("(1) Something went wrong: #{ex}")
	slack(message: "(1) `#{my_address}` #{"jp.fooo.baaaa.aaaa"} #{ex}", success: false)
	end

end
end
```


## 状況
* 2016年11月24日〜25日に申請
* 2016年12月2日に再度Upload
* 2016年12月6日に発覚

# 最新版では大丈夫なのか？

不明.
ただし、Rejectすることができるようになった。
https://github.com/fastlane/fastlane/commit/3263ea1e0bdc5fc17de500a5efb8ec26345ac3af
spaceship 1.111.0~


# 最後に

発覚したとき冷や汗かいた。
きちんとRejectさせてからUploadしてやったほうが安全ということを学習した。
Androidで自身のアプリのPlay Storeを開く

# Androidで自身のアプリのPlay Storeを開く

## まずは結論

以下のコードが良いようです。

```kotlin
    fun openMyAppPlayStore() {
        val id = BuildConfig.applicationIdForStore
        try {
            context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + id)))
        } catch (anfe: android.content.ActivityNotFoundException) {
            context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + id)))
        }
    }

```

`BuildConfig.applicationIdForStore`は追加で設定したもので詳細は後で記載します。

## コード解説

try-catchしている`android.content.ActivityNotFoundException`はPlay Storeアプリを無効にしているAndroid端末で発生します。  
例外発生時はブラウザでPlay Storeを開く実装にしていますが、Play Storeアプリが無効だとアプリのインストールができないので、エラーメッセージの方が良いかもしれません。

### BuildConfig.applicationIdForStore

Android開発では```Build Variants```毎に```applicationIdSuffix```を付与していることが多いと思います。

```gradle
android {
    buildTypes {
        debug {
            applicationIdSuffix = ".debug"
        }
        staging {
            applicationIdSuffix ".stg"
        }
        release {
        }
    }
}
```

このような環境で`BuildConfig.APPLICATION_ID`を使ってPlayStoreを開くとrelease以外はSuffixが付与されているため正常に動作しません。  
そのためいずれの`Build Variants`でも正常にPlay Storeを開けるようにSuffixなしのApplicationIdを参照できるように`BuildConfig.applicationIdForStore`を追加しました。  
独自のBuildConfigの値はbuild.gradleで以下のように設定できます。

```gradle
android {
    defaultConfig {
        applicationId "com.hoge.fuga"
        // Play Store遷移時に Suffix なしの applictionId が必要なため追加します。
        buildConfigField "String", "applicationIdForStore", "\"${applicationId}\""
    }
}
```

## 参考にしたページ

* [stackoverflow](http://stackoverflow.com/questions/11753000/how-to-open-the-google-play-store-directly-from-my-android-application)
Ubuntu 上で docker をソースからビルドして使ってみる方法のメモ

Ubuntu 上で docker をソースからビルドして使ってみるの、意外と簡単にできた。docker のビルドに docker が使われていておもしろい感じだった。muddydixon 氏に教えてもらったけど、こういうのは[セルフホスティング \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)というんだそうです。

もしかしたら make するために他にもいろいろパッケージが必要かもだけど、基本は下記の手順でうまくいくっぽい。(事前に [Install Docker on Ubuntu \- Docker](https://docs.docker.com/engine/installation/linux/ubuntulinux/) にある `apt-get install -y docker-engine` する手順で Ubuntu に docker をインストールしてあることが前提。)

```bash
## git リポジトリをもってくる
git clone https://github.com/docker/docker.git

## もってきたリポジトリに移動
cd docker/

## ビルド環境のビルド (をしているっぽい)
make build

## docker のバイナリ群をコンパイル
make binary

## 元の docker バイナリを .org つきで退避しつつ、
## コンパイルされたバイナリ群へシンボリックリンクを張る
for binary in docker-containerd docker-containerd-ctr docker-containerd-shim dockerd docker-proxy docker-runc
do
  mv /usr/bin/$binary{,.org}
  ln -nsf $(pwd)/bundles/$(cat VERSION)/binary-daemon/$binary /usr/bin/$binary
done
mv /usr/bin/docker{,.org}
ln -nsf $(pwd)/bundles/$(cat VERSION)/binary-client/docker /usr/bin/docker

## dockerd の再起動
/etc/init.d/docker restart

## dockerd のバージョンがビルドしたものになっていることを確認
docker info | grep "Server Version"

## docker コマンドのバージョンがビルドしたものになっていることを確認
docker -v
```
Cloudera ManagerでHadoopノードのラックIDを指定する

Hadoopには、ラックの位置を意識してデータを配置するラックアウェアネスという機能がある。この機能を使うことにより、ラック障害などによる複数ノードの同時ダウンなどに対する耐障害性を持たせることができる。

本記事では、Cloudera Manager にてラックIDを設定する方法を説明する。

ラックアウェアネスの機能そのものについては[Apache Hadoop の該当ページ](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/RackAwareness.html)を参照のこと。

# 環境
- Cloudera Manager 5.9.0

# 手順

トップメニューから、 **ホスト** → **すべてのホスト** をクリックする。

![CM59 トップメニュー ホスト.png](https://qiita-image-store.s3.amazonaws.com/0/17749/8e430bc0-aa72-991c-a377-94a15021081d.png)


ラックIDを設定したいノードにチェックをつけ、 **選択内容に対するアクション** → **ラックの割り当て** をクリックする。


![CM59 すべてのホスト 選択内容に対するアクション.png](https://qiita-image-store.s3.amazonaws.com/0/17749/9103aef6-9959-e2fa-54a6-cf56b14f11ae.png)


ラック名を入力する。ラック名はスラッシュで始まる、ファイルパスのような方式で記載しなければならない。例: /rack1, /group1/rack2


![CM59 すべてのホスト ラックの割り当て.png](https://qiita-image-store.s3.amazonaws.com/0/17749/132d09bf-7021-3cea-b752-c52b76ef629b.png)


影響を受けるサービスを再起動する。


# 参考

Cloudera 公式ドキュメント: http://www.cloudera.com/documentation/enterprise/latest/topics/cm_mc_specify_rack.html
学生が独学で応用情報技術者試験

# 概要
独学で応用情報技術者試験に受かりました。
参考書や参考サイトを記述します。
受ける人の参考になれば。

# 午前
午前の問題集です。このサイトにはとてもお世話になりました。ありがとうございました。:hugging:
http://www.ap-siken.com/
無料です。

おすすめは区分別にしてくれている
テクノロジ系 : http://www.ap-siken.com/index_te.html
マネジメント系 : http://www.ap-siken.com/index_ma.html
ストラテジー系 : http://www.ap-siken.com/index_st.html
です。
自分が今どの分野をやっているかがわかりやすいです。
平成22年以下もありますがそれはやらなくていいでしょう.

# 午後
##参考書
午後の問題集は

https://www.amazon.co.jp/2017-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E5%8D%88%E5%BE%8C%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865750673/ref=sr_1_5?s=books&ie=UTF8&qid=1481885983&sr=1-5&keywords=%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85

このシリーズが解説が良くて良いと思います。
##どの選択問題を解けばいいの？
どの選択問題を解くのか永遠の課題となってます。
自分が思った、おすすめ選択問題を発表します。
まず選択問題はこの10問です。
###応用情報技術者午後選択問題
1.経営戦略,情報戦略,戦略立案・コンサルティング技法
2.プログラミング(アルゴリズム)
3.システムアーキテクチャ
4.ネットワーク
5.データベース
6.組み込みシステム開発
7.情報システム開発
8.プロジェクトマネジメント
9.ITサービスマネジメント
10.システム監査
では、おすすめを発表します。
###おすすめ大:sunny:
6.組み込みシステム開発
解きやすいです。おすすめです。
8.プロジェクトマネジメント
国語の問題です。おすすめです。
9.ITサービスマネジメント
国語の問題です。おすすめです。
###おすすめ中:cloud:
3.システムアーキテクチャ
4.ネットワーク
5.データベース
難易度が高い年と低い年がまちまちです。
###おすすめ小:umbrella2:
1.経営戦略,情報戦略,戦略立案・コンサルティング技法
2.プログラミング(アルゴリズム)
7.情報システム開発
10.システム監査
とっつきにくいイメージがあります。(私は勉強してないのでわかりません。:scream:)
# 最後に
2週間は勉強しましょう。
有用なOnClickListenerを目指して

# 目的
AndroidでのButtonやImageViewなんかをクリックしたときどのようにclickを書くのがいいのかと考えていたのですが今まで使ってきたものを紹介して他にもないかなというスタンスで書きます

## 1つ目
一般的?な感じで書いてみる

```.java
Button mButton = (Button)findViewById(R.id.floating_button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //action
            }
        });
```

## 2つ目
自分が一番多用している方法

```.java
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(click);

private View.OnClickListener click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //action
        }
    };
```

目的として分離することで見やすくなるようにしています。

## 3つ目
上記にある方法を複数扱うときに、Viewごとのidで分けて判断します

```.java
Button button1 = (Button)findById(R.id.button1);
Button button2 = (Button)findById(R.id.button2);
button1.setOnClickListener(click);
button2.setOnClickListener(click);

private View.OnClickListener click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button1:
                　// action
                    break;
                case R.id.button2:
                    //action
                    break;
            }
        }
    };
```
   
以上列記したのがわたしが今まで書いてきて方法をまとめました
画像にAssetBundleが適応できない場合の対処


# 現象
Unity5.5で発生。
エディターに画像をインポートした後にAssetBundleを変更してもmetaファイルに反映されない。

![unity_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/9634/b05a62de-36ad-c8e0-9507-4cc8812cb7b1.jpeg)

![unity_002.jpg](https://qiita-image-store.s3.amazonaws.com/0/9634/5c04802a-fa8c-ec1f-a010-5bd0e0632305.jpeg)


# 対応

Pixel Per Unitなどの設定値を変更し、「Apply」ボタンを押す。
これによりAssetBundleの変更がmetaファイルに反映させるようになります。

![unity_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/9634/8081ae7a-fdc7-97b1-0d1a-dc47a5095c80.jpeg)

試したところjpg,pngファイルのみこの状況になるようです。
FRISKケースサイズ

# 新FRISKのケースサイズ
いつのまにかサイズが変わっていた…
少し面積が増えたので、実装面積が確保できて嬉しい。
ざっくり計測なので、参考程度にどうぞ。

## 内寸
入れる所。フリスクの出口のところは入れてない。
> 58.8(L) × 32.8(W) × 9.1(H) mm

長方形の基板入れるなら58×32mmがいいかな。
出口の所を入れると、8×11mm増やせる。

![FRISK.PNG](https://qiita-image-store.s3.amazonaws.com/0/111373/94771120-d172-54a5-2db1-9125d4e18200.png)


## 外寸
> 70.4(L) × 36.9(W) × 10.9(H) mm
日付の英語表記を取得する（Excel, VBA, PowerShell）

# 概要

Excel、VBA、PowerShellそれぞれで、日付データを英語表記に書式設定する方法を確認する。

Excel、VBAの感覚でPowerShell(.NET)でやろうとしたらハマったので、その備忘録も含む。

# コード

現在の日付（例：12月16日）を`Dec.16`に書式設定する場合の例。

## Excelワークシート関数

```:Excel
=TEXT(NOW(),"mmm.dd")
```

## VBA

```vbnet:VBA
Debug.Print VBA.Format$(Date$, "mmm.dd")
```

## PowerShell

```ps1:PowerShell
[DateTime]::Now.ToString( #書式指定文字列に加えてカルチャの指定が必要
    'MMM.dd',
    [Globalization.CultureInfo]::GetCultureInfo('en-US').DateTimeFormat #米国カルチャ
)
```

# ハマったところ

PowerShellでは既定のカルチャとして、OSのカルチャ（`$PSCulture, $PSUICulture`）を使用するため、日本語環境だと英語表記に書式設定できない。

```ps1
PS>Get-Date -Format MMM.dd
12.16
```


また、`Get-Date`コマンドレットにはカルチャを指定するパラメータが無さそうなので、.NET Frameworkの力を借りる必要がある。

具体的には`DateTime`型のToStringメソッドの以下のオーバーロードを使用する必要がある。

```ps1
PS>[DateTime]::Now.ToString
string ToString(string format, System.IFormatProvider provider)
```

# あとがき

どうせなら

```ps1
PS>Get-Date -Format MMMM.dd
師走.16
```

みたいに書式設定されると面白いのに、と思ったり。

# 参考

>[DateTime.ToString メソッド](https://msdn.microsoft.com/ja-jp/library/8tfzyc64(v=vs.110).aspx "DateTime.ToString メソッド ")


> [日時（DateTimeオブジェクト）を文字列に変換する](http://dobon.net/vb/dotnet/string/datetimeformat.html "日時（DateTimeオブジェクト）を文字列に変換する")
AndroidStudioさんに聞いた都道府県知名度

アプリで都道府県のenumを作成した際に
AndroidStudioさんにTypoをめっちゃ疑われてたのですが、
最新のバージョンで開いてみたところ、だいぶ改善されてた！

# 結論
Typo指摘が31県から1県に改善されててうれしい反面、数年後はTypo指摘の処理時間が増えていくのではという不安。
あと、東海・北陸と四国の知名度がんばれ！

## Android Studio 1.5.1 時点でのTypo指摘
<img width="540" alt="スクリーンショット 2016-12-15 18.52.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/130316/e55fc561-767b-45ca-7c34-b136f3f16d71.png">

|分類|Typoを疑われた都道府県|認識された都道府県|
|:---|:---|:---|
|北海道・東北|**青森, 岩手, 宮城, 福島**|北海道, 秋田, 山形|
|関東|**神奈川, 埼玉, 茨城, 栃木, 群馬**|東京, 千葉|
|甲信越|**新潟, 山梨, 長野**|なし|
|東海・北陸|**愛知, 岐阜, 静岡, 富山, 石川, 福井**|三重|
|関西|**兵庫, 滋賀, 和歌山**|大阪, 京都, 奈良|
|中国|**鳥取, 島根, 山口**|岡山, 広島|
|四国|**徳島, 香川, 愛媛, 高知**|なし|
|九州・沖縄|**熊本, 大分, 宮崎**|福岡, 佐賀, 長崎, 鹿児島, 沖縄|

## Android Studio 2.2.3 時点でのTypo指摘
<img width="531" alt="スクリーンショット 2016-12-15 18.53.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/130316/15688788-fff3-abb9-7248-9a25634aa650.png">

|分類|Typoを疑われた都道府県|認識された都道府県|
|:---|:---|:---|
|北海道・東北|なし|北海道, 青森, 岩手, 宮城, 秋田, 山形, 福島|
|関東|**群馬**|東京, 神奈川, 埼玉, 千葉, 茨城, 栃木|
|甲信越|なし|新潟, 山梨, 長野|
|東海・北陸|なし|愛知, 岐阜, 静岡, 三重, 富山, 石川, 福井|
|関西|なし|大阪, 京都, 兵庫, 滋賀, 奈良, 和歌山|
|中国|なし|鳥取, 島根, 岡山, 広島, 山口|
|四国|なし|徳島, 香川, 愛媛, 高知|
|九州・沖縄|なし|福岡, 佐賀, 長崎, 熊本, 大分, 宮崎, 鹿児島, 沖縄|

# おまけ：Atomさんにも聞いてみた
<img width="651" alt="スクリーンショット 2016-12-15 18.57.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/130316/8fd1f940-d2f7-794a-24b4-b27703856256.png">

|分類|Typoを疑われた都道府県|認識された都道府県|
|:---|:---|:---|
|北海道・東北|**岩手, 宮城**|北海道, 青森, 秋田, 山形, 福島|
|関東|**神奈川, 埼玉, 栃木, 群馬**|東京, 千葉, 茨城|
|甲信越|**山梨**|新潟, 長野|
|東海・北陸|**愛知, 三重**|岐阜, 静岡, 富山, 石川, 福井|
|中国|**鳥取, 島根**|岡山, 広島, 山口|
|四国|**香川, 愛媛**|徳島, 高知|
|九州・沖縄|なし|福岡, 佐賀, 長崎, 熊本, 大分, 宮崎, 鹿児島, 沖縄|
パスワードを Key chain access で管理している場合にリポジトリ毎にアカウントを使い分ける


元ネタ: https://coderwall.com/p/9ub-6a/using-multiple-accounts-with-git-or-github


`git config --global --edit` で設定を編集

```
[credential]
  helper = osxkeychain
  useHttpPath = true
```

## 参考

* [git を https 経由で使うときのパスワードを保存する - Qiita](http://qiita.com/usamik26/items/c655abcaeee02ea59695)
* [Using multiple accounts with git or Github (Example) || Coderwall](https://coderwall.com/p/9ub-6a/using-multiple-accounts-with-git-or-github)
Jubatus K-Meansクラスタリングの動きの確認

[Jubatus Advent Calender 15日目の記事](http://qiita.com/ymhara/items/079706c2de0b75795494)でblobsのデータをk-meansがどうして上手くクラスタリングしないのか，点の追加と重心位置の変化をアニメーションにすることで確認してみました．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/61092/7ad10218-1d90-7282-583a-f8e57cffe1ee.gif)

[mp4データ(Qiitaはvideoタグの埋め込みに対応していないようなので)](https://gist.github.com/kazuki/70d749c10392aa7bab3ed06c6a0bbb3b/raw/cca8ede0ab3856a8a4a21ec476ff805c7a3f6fb5/anime.mp4)

データは乱数から生成するため，15日目の記事と同じ結果にはならず，
今回のデータでは最終的には期待する結果になりました．
しかし，途中で左右に分割される場面も見受けられます．

このグラフをよくよく見てみると縦軸と横軸のスケールが結構違うんですね．
15日目の記事中にも以下のような言及がありました．

> おそらく分布が楕円状になっているため今回はうまくクラスタリングできなかったものと考えられます。

なので，縦軸と横軸のスケールが違うので，
上下でクラスタが別れることが必ずしも正解とは限らないデータだったようです．


[検証スクリプト](https://github.com/kazuki/jubatus-advent-calendar/tree/master/15_comment)
Jupyter で、カーネルに IPerl を加える。


20161216

単に `Perl` を `Jupyter` で実行したいだけなら、[Dockerfile](https://hub.docker.com/r/stuffox/jupyter-perl/~/dockerfile/)がある。


## 環境

- @`CentOS7.2.1511`
- `jupyter` は設定済み、実行確認済み。
- `python` は、`pyenv` で管理している `anaconda2-4.0.0`[^1] & `anaconda3-4.0.0`
- `perl` は、`plenv` で管理している `5.24.0`


[^1]: 2.7.11 と 3.5.1。 `jupyter` は双方デフォで入っている。3.5.1 は、 RISE インストール時に 3.5.2 にアップグレードしてしまった。


### python の設定

2 系 3 系の切り替えが出来る様にしとこ。

設定方法は、周知の通り。

```console
$ pyenv shell anaconda2-4.0.0
$ jupyter kernelspec install-self --user
$ pyenv shell anaconda3-4.0.0
$ jupyter kernelspec install-self --user
```

どちらかで、

```console
$ jupyter notebook           #A
```

`tree` => `new` で `Notebooks` に 2 と 3 の選択が現れる。


## Perl の設定

### IPerl のインストール

- 上記 `python` の設定後の実行
- `yum` は不必要なものも入っているかもしれない[^2]。

[^2]: `perl-devel` は何も考えずに叩いてしまったが、、、

```console
$ plenv shell 5.24.0
$ sudo yum install perl-devel zeromq zeromq-devel
$ cpanm Devel::IPerl --notest
```

でインストール自体は終了。もしかしたら、この時点でカーネルはインストールされているのかもしれないが、私は、

```console
$ kill %1          # #A が起動してるなら
$ iperl notebook
```

して一旦 `jupyter` を立ち上げた。

普通に、カーネルが入った様で、`Python` 側から立ち上げても、`IPerl 0.006` カーネルでノートブックが作成できるようになった。

![iperl01.png](https://qiita-image-store.s3.amazonaws.com/0/64084/2f7f470d-217a-cbaf-28bb-d359b0973d68.png "iperl01.png")


![iperl02.png](https://qiita-image-store.s3.amazonaws.com/0/64084/4a158b5c-ec2b-b383-ee65-668d03be1a76.png "iperl02.png")


## ついでに RISE

`conda` するだけなんだから、入れとこう、、、

```console
$ pyenv shell anaconda3-4.0.0
$ conda install -c damianavila82 rise
```

- インストールした環境で #A しないと使えない[^3]。

[^3]: この場合だと、2系で #A すると、画面上にアイコンが表われなかった。
HSPプログラムコンテストを振り返る

#はじめに
2003年から始まったHSPプログラムコンテストも今年で14年目。ちょっと振り返ってみました。

#作品数
![ss 2016-12-16 13.33.13 HSPプログラムコンテスト 登録.png](https://qiita-image-store.s3.amazonaws.com/0/151962/3a7d7e2c-3293-4636-3d9b-a8c6d88c21f4.png)

これがやりたかっただけだったり・・・コンテストの作品ページで特定文字列で検索して数えたものなので実際の応募数とは少し違うかもしれません。

近年は色々な制作ツールがあるのもあると思うんですが、減ってますね・・・これは仕方ないとは思います。むしろ14年でこれはかなり健闘しているのでは？

個人的にはHSPTV（ショート）部門の減少が残念です。2003年なんて一般と同程度だったんですよ。手軽かつ突き詰めても熱い部門だと思うんですが・・・axファイルの制限サイズが 2500バイト(2003年,2004年) → 4096バイト(2005年,2006年) → 6000バイト(2007年~) と変わったことも影響しているのでしょうか。手軽さが減ったとか？サイズを使い切る必要はないのですが。あと2007年からHSPTVブラウザが必要になったのも遊ぶ側からすると少し面倒になったかもしれません。

一般は減ってはいますがTV部門ほどではないですね。小粒な作品から大作まで様々でツール系も沢山ありますが、どちらかといえばゲーム系が多い感じです。一般は大体毎年、締切間近になると一気に応募されます。

2012年から始まったDish部門はまだ5年ですが20前後で安定しています。スマホに展開できるのが魅力。ただ環境構築が結構面倒なのでそこをクリアできればもっと増えそうです。

#年別
コンテストページのリンク、ページ開設日、作品受付期間やstart.axサイズ制限など [HSPWiKiコンテスト情報](http://quasiquote.org/hspwiki/HSP%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88) にまとまっています。

##2003
HSP 2.6 時代。HSPプログラムコンテストの始まり。過去最多の作品応募数。この頃はまだ今のSoupSeedのようなユーザーページはなく、作品もメールで直接送っていたようです。参加賞はオリジナルデザインのコースター。

##2004
作品はサイト上のフォームから送れるように。参加賞はステッカー。私はここが初参加でした。

##2005
HSP 3 時代突入。ショート部門のサイズ制限が 2500 → 4096 に。参加賞は下敷き。

##2006
サイトが onionsoft.net → hsp.tv に移行し一新。コンテストの作品紹介番組「コンテストTV」はじまる。参加賞はネックストラップ。

##2007
ショート部門 → HSPTV部門 に名称変更。サイズ 4096 → 6000、ランキング機能が使用可能に。コンテストTVも8月号と11月号の2回。参加賞は色鉛筆セット。

##2008
毎年の恒例感が出てきた。参加賞は携帯クリーナー。

##2009
HSPTV部門で 物理エンジンOBAQ が使用可能に。「秋葉原ロケテゲームショウ１」にコンテスト作品の展示。参加賞はクリアファイル。

##2010
コンテストTVが生放送に。参加賞はパズルキーホルダー。

##2011
HSP3Dish賞新設（専用の部門はまだ）。HSPTV部門で特定の素材が使用可能に。上位入賞者にトロフィーが贈呈。参加賞はピンバッジ。

##2012
10周年！HSP3Dish部門新設。ユーザー向けページSoupSeed開設。Vectorソフトライブラリと相互連携可能に。東京ロケテゲームショウ出展。参加賞はピンバッジ。

##2013
デジゲー博に作品展示。コンテストのトップページ上部にふりーむの広告が！参加賞は手提げバッグ。

##2014
デジゲー博に作品展示も恒例に。参加賞はコンパクトミラー。

##2015
各部門の優秀賞を廃止し一本化。[HSP部屋](http://hsproom.me/)の投稿作品も応募可能に。参加賞は革製しおり。

##2016
コンテストのロゴが2015のものから変わってないような・・・参加賞はまだ不明です。[コンテスト内訳調べてみた](https://twitter.com/skymonsters_Ks/status/802466112403218432)

#おわりに
今後もコンテストが続くか分かりませんが、開催される限りは何かしら参加していきたいですね。
cakephp3における日付のバリデーション

#今回やりたいこと

postされてくる日付を、現在の日付(今日)より、前であればvalidationを有効にしたい

#基本

app/src/Model/Table/HogeTable.php

POST入力値等の入力値チェックは validationDefault に記述する
saveの入力値チェック(Entityチェック)は buildRules に記述する

http://qiita.com/kozo/items/be1b32d1670e64f723f7

cakephp3のバリデーションは2パターン存在

#思考の流れ

自分で考えたbadコードを、プレビューしていただき、
より良いコードになった流れです。

public function validationDefault(Validator $validator)

bakeにより、デフォで設定されているのが、
下記の初期段階です。
※hoge_date は、postされてくるinputのラベル名になります。

```◯◯Table1.php
$validator
  ->date('hoge_date', ['ymd', 'mdy'])
  ->requirePresence('hoge_date', 'create')
  ->notEmpty('hoge_date');
```

次に
手動でadd部分を加えようとしてました。(他はデフォで記載済み)

```◯◯Table2.php
$validator
  ->date('hoge_date', ['ymd', 'mdy'])
  ->requirePresence('hoge_date', 'create')
  ->add('hoge_date',[
       'date' => [
         'rule' => ['boolean'],
         'message' => '今日より前の日付はダメ',
       ],
   ])
  ->notEmpty('hoge_date');
```

ruleのところを、いったんbooleanにしていますが、
完成系は、ここにfunction名を記載し、                    

```
'rule' => dateCheck
```

などと記載し、別ファンクションを作るつもりでした。

```
public function dateCheck($hoge_date) {
      if( $now  === $hoge_date){
            echo "その日付は今日です";
        }else if( $now > $hoge_date){
            echo "その日付は過去です。予約できません";
        }else{
            echo "その日付は未来です";
}
```

このようなファンクションを作成し、戻り値に、falseを返すようにする。
そうすることで、`'rule' => ['false']` という記述により、エラーメッセージが出るというロジックにしようと考えてました。

ここまでが、いわゆる記述量が多いbadコードでした。

参考に、、、
http://book.cakephp.org/3.0/ja/core-libraries/validation.html#id8

## 現在時間という日付の取得方法 (横道にそれます)

比較するのは、postされた日付と、現在の時間。
どのようにしようか、、、、、

phpの関数で、今日の日付が取れる

```
$today = date("Y/m/d”);//2016/12/15
```

postされたdataの日付の形式を変える 
(postされてる日付は12/2)

```
$hoge = date('Y/m/d', strtotime($date[‘hoge’]);//2016/12/02
```

cakeのオブジェクトを使用して、こんなのもできる

```
use Cake\I18n\Time; (宣言)
```

```
$now = new Time();
$now = date('Y/m/d', strtotime($now));
```

ただこれだと、オブジェクトを出しているだけなようです。


dubug($now);の結果

```
object(Cake\I18n\Time) {
    'time' => '2016-12-15T06:59:42+00:00',
    'timezone' => 'UTC',
    'fixedNowTime' => false
}
```

やるならこんな感じの方が無難

```
echo $now->format('Ymd’);//20161215
```

#betterなcodeに変身

cakephp3.2から出ているオブジェクトを使ったスマートな方法です。
Cake\I18n\FrozenDate

```
$validator
    ->date('checkin_date', ['ymd', 'mdy'])
    ->requirePresence('checkin_date', 'create')
    ->add('checkin_date', [
        'date' => [
            'rule' => function($value){
                return (new FrozenDate($value))->isFuture();
            },
            'message' => '今日より前の日付はダメ',
        ],
    ])
    ->notEmpty('checkin_date');
```

FrozenDate
というオブジェクトを使うことで、(cake3.2から使える？？)
自前でphpで判定をすることなく、
->isFuture()こうゆうメソッドを使うだけで、現在より過去か未来かとかの判定ができるようです。

ちなみに、引数の$valueは、特にどこかで宣言されてる変数ではなく、予約語？？的な扱いかと思われます。
中身としては、今回postされてくる、
`$this->request->data['checkout_date']`の中身ですが、
各、`$validator`ごとに、`$value`で対象のデータを取得できると思います。
UIScrollViewのスクロールバーを任意の画像に変更する

## はじめに

UIScrollViewのスクロールバーを指定の画像に変更する機会があったのでメモ代わりの共有

## サンプルソース

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        scrollView.delegate = self
    }
}

extension ViewControlelr : UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 縦スクロールバー
        let verticalScrollIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 1)] as! UIImageView)
        verticalScrollIndicator.image = UIImage(named: "vertical_scrollbar_image")
        // 横スクロールバー
        let horizontalScrollIndicator: UIImageView = (scrollView.subviews[(scrollView.subviews.count - 2)] as! UIImageView)
        horizontalScrollIndicator.image = UIImage(named: "horizontal_scrollbar_image")

        // 任意の色に変更したいときは以下
        // verticalScrollIndicator.backgroundColor = UIColor.red
    }
}
炎の型工房 火の型 13日目 : ボールに動きをつけよう!!：Pongを作ろう --4--

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です

<img width="400" alt="magic.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/4ba854aa-4ddf-59b1-e98b-ca1302099c4c.png">




<ruby>大地<rt>だいち</rt></ruby>をつかんで

<ruby>理解<rt>りかい</rt></ruby>、<ruby>分解<rt>ぶんかい</rt></ruby>、<ruby>再構築<rt>さいこうちく</rt></ruby>

そして

<ruby>理解<rt>りかい</rt></ruby>、<ruby>分解<rt>ぶんかい</rt></ruby>、<ruby>再構築<rt>さいこうちく</rt></ruby>
# ボールに<ruby>動<rt>うご</rt></ruby>きを<ruby>付<rt>つ</rt></ruby>けよう


## まっすぐ<ruby>進<rt>すす</rt></ruby>ませてみる

### コードを<ruby>追加<rt>ついか</rt></ruby>する
<img width="500" alt="v001.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/24e51e40-7464-f85c-ba0b-e1746cda0ad1.png">


　

### <ruby>確認<rt>かくにん</rt></ruby>する

https://scratch.mit.edu/projects/136834032/

<img width="500" alt="v002.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/15645a99-b94b-172d-1bde-9b938fe2bacf.png">


1. <ruby>緑<rt>みどり</rt></ruby>の<ruby>旗<rt>はた</rt></ruby>をクリックすると、ボールが<ruby>動<rt>うご</rt></ruby>き<ruby>出<rt>だ</rt></ruby>すこと


　

　
　　　
　　



## <ruby>壁<rt>かべ</rt></ruby>にぶつかると、Ballが<ruby>跳<rt>は</rt></ruby>ね<ruby>返<rt>かえ</rt></ruby>るようにしよう

<img width="411" alt="v003.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/d1c760ec-fbe5-664d-ecf8-1f4361500d5a.png">


### <ruby>確認<rt>かくにん</rt></ruby>する
https://scratch.mit.edu/projects/136834619/
　　　
<img width="334" alt="v004.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/54cb7843-8dd1-5089-a51e-9355c86b1a48.png">


1. <ruby>緑<rt>みどり</rt></ruby>の<ruby>旗<rt>はた</rt></ruby>をクリックすると、ボールが<ruby>動<rt>うご</rt></ruby>き<ruby>出<rt>だ</rt></ruby>すこと
2. ボールが<ruby>壁<rt>かべ</rt></ruby>にあたると<ruby>跳<rt>は</rt></ruby>ね<ruby>返<rt>かえ</rt></ruby>ること



## Thanks
<div>
ここまで、<ruby>読<rt>よ</rt></ruby>んでくれてありがとう!!
</div>

<div>
では、<ruby>次回<rt>じかい</rt><ruby>、また
<ruby>会<rt>あ</rt></ruby>えることを、
<ruby>楽<rt>たの</rt></ruby>しみにしています。
</div>

そして、<ruby>次回<rt>じかい</rt></ruby>は、ラケットを<ruby>追加<rt>ついか</rt></ruby>します

<div>
ではでは
</div>
Play Framework 2.5でIntegrationTestが動かなくて困った話

Play Frameworkの2.5でnewしたプロジェクトのテストが動作してくれなくて困ったのでメモ。
そのうち改善されると思いますが。

結論からいうと、Selenium周りがちゃんと動いてくれない。Firefoxでテストするよう変更して下記の通り変更した。

### 1. geckordrivarのダウンロードと展開
https://github.com/mozilla/geckodriver/releases

### 2. 最新版seleniumへの依存に変更
build.sbtのdependenciesに追加

    "org.seleniumhq.selenium" % "selenium-java" % "3.0.1",
    "net.sourceforge.htmlunit" % "webdriver" % "2.6"

### 3. テストのsetUp()に追加

    System.setProperty("webdriver.gecko.driver","[geckordrivarへのパス]");

以上
Kobitoでも表の入力のスニペットが欲しい


Qiitaでは、`数字`x`数字`を入力すると、テーブルを挿入するためのスニペットとしてはたらきます。
一方、Kobitoにはそのような機能がないので、表の入力が面倒くさいです。

![スクリーンショット 2016-12-16 18.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/74551/adb375ae-46ae-2fd3-25d6-6488d5f45104.png "スクリーンショット 2016-12-16 18.38.06.png")
mac OSX El Capitan Sierra に node install

#Angular2やりたいなぁ...


```
$ npm install
bash: npm: command not found
```
あれ...？

#インストール
homebrewが入っているのでnodebrewのインストールから

```
$ curl https://raw.githubusercontent.com/hokaccha/nodebrew/master/nodebrew | perl - setup
```
パスとnodebrewアップデートとnodeインストール

```
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

$ nodebrew selfupdate

$ nodebrew install latest
```

...長い...終わった...

```
$ node -v
bash: node: command not found
```

あれ？

```
$ nodebrew list
v7.2.1

current: none
```

ああ...

```
$ nodebrew use v7.2.1
use v7.2.1
$ nodebrew list
v7.2.1

current: v7.2.1
$ node -v
v7.2.1
$ npm -v
3.10.10

```

完了
CapistranoでGitHubにアクセスする際のネットワークプロトコルをhttpsにする

Capistranoからデプロイする際に、SSHプロトコルを使ってGitリポジトリのコードを取得するのが一般的かと思いますが、HTTPプロトコルで取得することも可能です。

あらかじめ[Personal access tokenを発行](https://github.com/settings/tokens)しておきます。

Capistranoを実行する環境で環境変数に発行したPersonal access tokenを設定し、デプロイスクリプト側で次のように`repo_url`を設定します。この例では環境変数`GITHUB_TOKEN`に設定しています。

```rb:config/deploy.rb
set :repo_url, "https://#{ENV["GITHUB_TOKEN"]}@github.com/<organization>/<repository>.git"
```

以前は`git_https_username`と`git_https_password`で設定可能でしたが、Capistrano 3.1から廃止されていました。
Installing Emacs 25.1.1 on CentOS 6.8

仮想 PC 上でやってるので、Guest Additions をインストールした段階で gcc とかはインストールされるんで、そういう前提で書いてます。

# ncurses のインストール

```bash
% curl http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.0.tar.gz | tar zxf -
% cd ncurses-6.0/
% ./configure
% make
% sudo make install
```

# ソース・ゲット ＆ 展開

```bash
% sudo yum install -y xz
% curl http://core.ring.gr.jp/pub/GNU/emacs/emacs-25.1.tar.xz | tar Jxf -
```

# ビルド ＆ インストール

```bash
% cd emacs-25.1/
% ./configure --without-x # X Window System は使わない
% make
% sudo make install
```

# バージョン・チェック

```bash
% emacs --version
GNU Emacs 25.1.1
Copyright (C) 2016 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```
jenkinsをまるっと移行

##背景
コスト削減で、jenkins用サーバーを既存環境へ一本化しjenkins用サーバーを落とす

##前提
移行前、移行先共に centos
移行対象となるjenkinsは、
・phpのbuild用(phpmd/phpcpd/phpunit/phpcs)
・github連携
・slack連携
・運用サーバー（別サーバー）にファイルのdeployを行う

##作業
1.移行先サーバーにjenkinsをインストール 
→[参照][CentOS 6.x系へのJenkins インストール](http://qiita.com/____Masa_____/items/1069bc520ddd6d5a739d)

2.移行前サーバーで既存データを圧縮

```
sudo su
cd /var/lib/
/usr/bin/zip -r jenkins.zip jenkins
```

３．scp で移行先へ送る

```
scp {target.zip} hoge@{IP}:{PATH}
```

4.移行先サーバーにてgithubに登録用のkeyを作成

```
sudo su - jenkins
ssh-keygen
```
ついでに接続先となるサーバーへsshしておく。
→接続情報を保存しておけば認証で落ちることがない
→hosts.allow設定とかにも気づける

5.buildまわりの設定
インストール手順は、下記を参考にしました。
　ー phingをインストール [参照][Phingのインストール](http://qiita.com/t_ishida/items/bee331cdd11dd839565e)
　ー phpunitをインストール [参照][第1章 PHPUnit のインストール](https://phpunit.de/manual/current/ja/installation.html)
　ー phpcpdをインストール [参照][sebastianbergmann/phpcpd](https://github.com/sebastianbergmann/phpcpd)

6.なんとなくBlue-ocean(beta)を入れる
[Blueocean手順](https://jenkins.io/projects/blueocean/#use-the-beta)

7.webhook周りの修正
 - githubの各リポジトリ
 - slack

##さいごに
参照先の方々、勉強させていただきました。ありがとうございます。
jenkinsのユーザーに関しては、移行できなかった
blue oceanのpipelineを設定して視覚的にリッチにしたい
移行するならjenkinsに変わる（超える）無料のCIツールにしたかった。。。
[Java] if(hoge != null) {...}の代わりにOptionalを使う

いまいちOptionalの使いドコロがわかっていなかったのですが、こういうことだったのかなぁと理解しました。

# 変数`hoge`が`null`でないときのみ、`hoge`のメソッドを実行したい

## 従来のやりかた

```java:
if (hoge != null) {
    hoge.fuga();
}
```

## `Optional`を使ったやりかた

```java:
Optional
    .ofNullable(hoge)
    .ifPresent(o -> o.fuga());
```

どっちのほうが見やすいかな？ :smile: 

# 変数`hoge`が`null`でないときは、`hoge`のメソッド実行結果を返す

## 従来のやりかた

```java:
fugo = hoge != null ? hoge.fugo() : null;
```

## `Optional`を使ったやりかた

```java:
fugo = Optional
    .ofNullable(hoge)
    .map(o -> o.fugo())  // Optional<?>が返ってくるので、
    .orElse(null);       // orElseで値そのものか、デフォルト値（ここではnull）を返すようにする
```


これくらいだと、3項演算子のほうが見やすいかな？ :smile: 

# 変数`hoge`が`null`でないときは、`hoge`のメソッドを呼び、メソッドの結果が`null`でないときは、さらにメソッドを呼ぶ

何書いてあるかわかんないですね。コード見てください。

## 従来のやりかた

```java:
instant = null;

if (hoge != null) {
    date = hoge.getDate();

    if (date != null) {
        instant = date.toInstant();
    }
}
```

あるいは、こんなんどうでしょう？

```java:
instant = hoge != null
    ? (hoge.getDate() != null
        ? hoge.getDate().toInstant()
        : null) 
    : null;
```

## `Optional`を使ったやりかた

```java
instant = Optional
  .ofNullable(hoge)
  .map(o -> o.getDate())     
  .map(d -> d.toInstant())   
  .orElse(null);
```

どっちのほうが見やすいかな？ :smile:
Mac OS SierraにScipyをインストール

# 概要
科学計算のためにScipyをインストールしようとしたら苦戦したので、インストールまでの手順をメモ

# 環境
Mac OSX Sierra
インストール済みだったもの
- pip
- git
- Numpy
未インストールだったもの（Scipyのインストールに必要だった）
- Cython
- gFortran

#  結果
最終的に必要だった作業をまとめました。
具体的にエラーと戦った過程は次節へ

まず、[GCC Wiki](http://gcc.gnu.org/wiki/GFortranBinaries)からOS X El Capitan用のgFortranをダウンロードしてインストール
次に、コマンドを実行

```
$ pip install Cython
$ git clone https://github.com/scipy/scipy.git
$ cd scipy
$ sudo python setup.py build
$ sudo python setup.py install
```

# 実際に取り組んだ過程
## エラー１個目
愚直にダウンロードを試みる

```
$ git clone https://github.com/scipy/scipy.git
$ cd scipy
$ sudo python setup.py build
Cythonizing sources
(中略)
Exception: Cython either isn't installed or it failed.
Traceback (most recent call last):
  File "setup.py", line 415, in <module>
    setup_package()
  File "setup.py", line 399, in setup_package
    generate_cython()
  File "setup.py", line 205, in generate_cython
    raise RuntimeError("Running cythonize failed!")
RuntimeError: Running cythonize failed!
```

Cythonがないと言われたのでCythonを入れることに


```
$ pip install Cython
（略）
Successfully installed Cython-0.25.2
```

## エラー２個目
Cythonが入って喜び勇んで再びScipyのインストールに挑戦

```
$ sudo python setup.py build
（略）
running build_clib
customize UnixCCompiler
customize UnixCCompiler using build_clib
building 'dfftpack' library
error: library dfftpack has Fortran sources but no Fortran compiler found
```

喜びも束の間、Fortranコンパイラーが必要と怒られる。
そこで、
http://gcc.gnu.org/wiki/GFortranBinaries#MacOS
ここからElCapitan用のgFortranをダウンロード＆インストール

## Scipyビルドをリトライ
gFortranを入れたので、Scipyのビルドをリトライ
```
$ sudo python setup.py build
```
ビルド中にWarningの表示がたくさん出て色々心配になりましたが、ひとまずビルド完了（ビルドに結構時間がかかりました）

## Scipyをインストール
ビルドができたのでインストール

```
$ sudo python setup.py install
（略）
Finished processing dependencies for scipy==0.19.0.dev0+1755a9f
```
なんとかインストール！

## Scipyの実行確認
最後に実行確認

```
$ python
>>> import scipy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "scipy/__init__.py", line 103, in <module>
    raise ImportError(msg)
ImportError: Error importing scipy: you cannot import scipy while
        being in scipy source directory; please exit the scipy source
        tree first, and relaunch your python intepreter.
```
まさかのエラー
scipyのディレクトリ内でimportしようとして怒られているらしいので、ディレクトリから抜けて実行

```
$ cd..
$ python
>>> import scipy
```
無事インポートできるように。
[SciPy.orgのサンプル](https://docs.scipy.org/doc/scipy/reference/tutorial/general.html)を参考に、念のためさらに実行確認

```
>>> import numpy as np
>>> from scipy import optimize
>>> np.info(optimize.fmin)
 fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None,
      full_output=0, disp=1, retall=0, callback=None, initial_simplex=None)
```


無事エラーなく動きました！
お疲れ様でした。

# 参考文献
[Mac に SciPy をインストール](http://akiyoko.hatenablog.jp/entry/2013/06/15/140101)
[numpy, scipy, gensim をインストール](http://blog.kenkov.jp/2014/12/18/numpyscipy.html)
参考にさせていただきました。ありがとうございました。
iOSでvideoタグをinline再生する

iOS上でvideoタグをフルスクリーンではなくinlineで再生したい場合がある。

1. videoタグを再生ではなく、currentTimeを動かす→[iPhone Safariで動画をインライン再生する方法](http://qiita.com/hadakadenkyu/items/75162099d0bf7cdcfdc7)
2. iOS10の場合、videoタグにwebkit-autoplayesinlineとplaysinlineを指定する→ [iOS 10 Safari から video の inline 再生が可能になります](http://uupaa.hatenablog.com/entry/2016/08/29/171809)

2の場合

```html
<video id="backgroundvideo" webkit-playsinline playsinline autoplay loop>
  <source src="./video.webm" type="video/webm">
  <source src="./video.mp4" type="video/mp4">
  <p>動画を再生できる環境ではありません。</p>
</video>
```
という風に2つ指定してあげて下さい。
githubのPR/issue一覧で地味に便利なショートカット

## githubで目的のPRやissueを探す時間が惜しい！
例えば、こういったフィルターをワンタッチで出せます
![image](https://qiita-image-store.s3.amazonaws.com/0/41657/0d90de6f-7aab-a317-f8ee-7f135f5bd9c8.png)



|ショートカットキー|内容|
|---|---|
|U|Authorのフィルターが開く|
|L|Labelsのフィルターが開く|
|M|Milestoneのフィルターが開く|
|A|Assigneeのフィルターが開く|
|return|↑で選択したフィルターが走る|
|J|PR/issue一覧の選択状態が下方向に移動する|
|K|↑の逆|
|return|↑で選択状態にしたPR, issueを開く|

もはやキーを2つではなく1つ押せば使えちゃうので、とても気に入ってます
(というか、実はトラックパッドに一切触れずにgithubは使い切れるかも...この調子で行くと)

例えば自分が開いたPRを見たければ、 `/pulls` にアクセスした上で、 `U` を押した瞬間にreturnキーを押すと、デフォルトが自分が選択されているので、一瞬で見ることができます。
ポチポチやったら3秒位かかるのが、0.5秒でできます！

お試しあれ！
C++のOpenCVをCMakeで使う

## 概要
マルチプラットフォームで動作するC++のOpenCV。
画像を表示するだけのシンプルな例。
https://github.com/ryokomy/opencv_helloworld

## 使い方
```
git clone https://github.com/ryokomy/opencv_helloworld.git
cd opencv_helloworld
mkdir build
cd build
cmake ..
make
./opencv_helloworld
```

## 結果
![Screen Shot 2018-02-28 at 15.21.11.png](https://qiita-image-store.s3.amazonaws.com/0/141797/781555ca-6ffa-989a-1e76-c588788fd89d.png)