OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > Assume that you have an employee database program that has [an intermittent error].

@ Code Complete (No. 17496 / 36077)

> Assume that you have an employee database program that has <font color=red>an intermittent error</font>.

http://eow.alc.co.jp/search?q=intermittent&ref=sa
> 一時的に止まる、断続的な、間欠的な

1. データベースプログラムの名前を「インターミ」と名付ける。
2. 愛称「インターミったん」
3. インターミったんは時々おかしな動作をする (インターミったん, エラー)

The program named "Intermi" has an intermittent error.

あほであるが、記憶には残りそう。Pink Elephantなみに印象的なものは記憶に残りやすいので、可能な限りそういうあほな覚え方を探すことにしている。
例: http://qiita.com/7of9/items/aac8230ac7c7b5d44ba6

単位系の記憶で「見舞いなの！ピコ」と言って「ミリ、マイクロ、ナノ、ピコ」の順番を覚える覚え方が某月刊誌(情報処理技術者試験?)に1995年頃に掲載されていた。ピコという子供が花束を持って見舞いに来ている絵がついていた。それを見た瞬間に覚えた、という経験をしている。
kintone レコード集計の関数化

#kintone レコード集計の関数化

よくあるレコード集計を関数にして、簡単にできるようにします。
集計キー、集計項目とも複数指定できます。

集計処理は、[「javascript の Array.reduce() を使って JSON データを group by (sum) する」](http://qiita.com/tbtbt/items/cb9b746f099b93c1fd64) を基に開発させて頂きました。
ありがとうございます。

#在庫アプリの一覧表示

![recordsSummary1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/553611a4-ccfd-5f5b-d3bc-450474a27a2a.png)

#集計処理の例

recordsSummary 関数にレコード・集計キー・集計項目を指定して呼び出します。

一覧表示イベントで、レコード集計する例です。
・商品名で、在庫数を集計
・倉庫店舗名、商品名で、在庫数と金額を集計

※event.records は、表示ページのレコードとなります。
アプリのレコード全件を集計する場合は、API で取得する必要があります。

```
////////////////////////////////////////////////////////////////////////////
// kintone JavaScript: Summary of kintone records.
//  2016.11.11 by rex0220
////////////////////////////////////////////////////////////////////////////
(function() {
    "use strict";
    
    // 一覧表示
    kintone.events.on("app.record.index.show", function(event) {
        var records = event.records;
        console.log('records',records);

        var summary1 = recordsSummary(records,['商品名'],['在庫数']);
        console.log('summary1',summary1);

        var summary2 = recordsSummary(records,['倉庫店舗名','商品名'],['在庫数','金額']);
        console.log('summary2',summary2);

        return event;
    });

    // レコード配列を指定のキーで集計する
    function recordsSummary(records, keys, sumKeys) {
        var sumKeys2 = sumKeys.concat(['$count']);

        var hash = records.reduce(function(res,record) {
            // 集計キーを作成
            var key = keys.reduce(function(s,k) {
                if(s) s += '\t';
                s += record[k]['value'];
                return s;
            },'');
            // 初めての集計キー
            if(!(key in res)) {
                // 集計キーをオブジェクトに設定
                var keyList = keys.reduce(function(h,k) {
                    h[k] = record[k]['value'];
                    return h;
                },{});
                // 集計項目の初期値を設定
                res[key] = sumKeys2.reduce(function(h,k) {
                    h[k] = 0;
                    return h;
                }, keyList);
            }
            // データを集計（加算）
            sumKeys.forEach(function(k){
                if(record[k]['value'])
                    res[key][k] += Number(record[k]['value']);
            });
            res[key]['$count']++;
    
            return res;
        },{});

        // キーソート
        var hashKeys = Object.keys(hash);
        hashKeys.sort();

        // 配列化
        var summary = [];
        for(var i in hashKeys){
            var k = hashKeys[i];
            if(hash.hasOwnProperty(k)){
                summary.push(hash[k]);
            }
        }

        return summary;
    }

})();

```

#集計結果

$count は、集計したレコード数です。
平均を算出する場合に使用します。

![recordsSummary2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/58ca8f6d-af80-f800-e0e3-15e9905a78c7.png)
【c++】文字列中に含まれる漢字の文字コード取得

#漢字の判別
文字列中に含まれている漢字を1つ1つ区別したかったので
文字コードを利用してやってみた.
やったこと忘れないための自分用メモ.
##文字列に含まれる漢字の文字コードを取得・表示
```cpp:sample.cpp
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//s_jisの全角文字の1バイト目かどうかを判定する関数
int check_s_jis_zenkaku(unsigned char c){
   if(((c>=0x81)&&(c<=0x9f))||((c>=0xe0)&&(c<=0xfc)))return 1;
   else return 0;
} 

//入力された文字列に漢字が含まれているか調べる関数
//　引数　［charへのポインタ型変数］
//　返り値［漢字の文字コードが入ったint型のvector］
vector<int> checkKanji(char *str){
	unsigned int moji_code;//文字コード(16bitコード)
	unsigned char first_byte, second_byte;//第1byte、第2byte(8bitコード)
	char *ch;//文字列走査用
	vector<int> res;//返り値のベクトル

	ch = str; //文字列受け取り
	while(*(ch) != '\0'){
		first_byte	= (unsigned char)*ch;//第1バイトに変換
		second_byte = (unsigned char)*(ch+1);//第2バイトに変換
		moji_code	= first_byte*256 + second_byte;//文字コードに変換

		//文字コードが（s_jisの）漢字の部分ならvectorに格納
		if( ((moji_code >= 0x889f) && (moji_code<=0x9872)) || ((moji_code >= 0x989f) && (moji_code<=0xEAA4)) && 
			  ((second_byte>=0x40) && (second_byte<=0xFC)) &&  ((first_byte < 0xA0) || (first_byte > 0xDF)) && (second_byte!=0x7F)
			){
				res.push_back(moji_code);
		}
		//全角か半角かで進めるバイト数を変える
		if(check_s_jis_zenkaku(*ch)==1){ ch+=2; }
		else{ ch+=1; }
	}
	return res;
}

void main(){
	int ii;
	string str;
	vector<int> code_list;
	cout << "qで終了..." << endl;
	while(true){
		cout << "input >> "; cin >> str;//文字列の取得
		if(str=="q" || str=="ｑ"){ break; }//終了処理
		code_list = checkKanji(const_cast<char*>(str.c_str()));
        //取得した文字コードを16進数で表示
		if(code_list.size()==0){ continue; }
		for(ii=0; ii<code_list.size(); ii++){ cout << "[" << hex << code_list[ii] << dec << "]" << "\t"; }
		cout << endl;
	}
}
```

実行結果
* * *
qで終了...
input >> 犬
[8ca2]
input >> いぬ
input >> inu
input >> inu犬
[8ca2]
input >> 犬猫
[8ca2]  [944c]
input >> 犬猫犬
[8ca2]  [944c]  [8ca2]
* * *
##感想
s-jisとeucで被ってる部分があるそうで今回はとりあえずs-jisでやってみた.
最後に環境を... win7 64bit, visual studio 2010 

色々と拙いが備忘録だし最初の投稿はこんな感じで.
###参考にさせていただいたページ
http://www.tohoho-web.com/wwwkanji.htm
http://vivi.dyndns.org/tech/cpp/binHex.html
http://www5f.biglobe.ne.jp/~fuku-labo/library/program/cpp/2/076.htm
機械学習論文読みメモ_14

[The Teaching Dimension of Linear Learners](http://pages.cs.wisc.edu/~jerryzhu/pub/tdlinear.pdf), ICML2016
Teaching dimensionは対象とするモデルを学習者に教える際に、理論的に要求される最小の訓練データサイズの事である。
従来研究では、訓練データと一貫性を持つ全ての仮説集合を推定するversion space learnerに関するtreaching dimensionを扱っていた。
本論では、最適化手法により最適な仮説関数を推定する学習者に関するteaching dimensionを扱う。
特にリッジ回帰、SVM、ロジスティック回帰に関するteaching dimensionを求めた。

[A Kernelized Stein Discrepancy for Goodness-of-fit Tests](https://arxiv.org/pdf/1602.03253.pdf), ICML2016
Stein’s identityとRKHSを組み合わせる事で、尤度計算を要求しない新たな２つの分布間差異を比較する統計量を提案する。
Stein’s identityは分布間の距離に関して一般的なboundを与える理論である。
この理論は分布関数の微分値と入力の分散に関して成り立ち一致性を示す。
Stein’s identityの特定例として[Stein’s lemma](https://en.wikipedia.org/wiki/Stein%27s_lemma)もある。
この一致性をもとに、実際の計算値のズレ量をStein discrepancy measureとして利用する。
本論ではこのmeasureをRKHSで計算する。
提案した統計量を用いる事で確率モデルがどれだけ観測データに適合しているかの検定を行う事が可能になる。
この検定は、複雑で高次元なデータに適用可能で、また正規化係数の計算も必要がない。

[DR-ABC: Approximate Bayesian Computation with Kernel-Based Distribution Regression](https://arxiv.org/pdf/1602.04805.pdf), ICML2016
approximate bayesian computation(ABC)は尤度フリーの事後分布計算を可能とするフレームワークである。
ABCは生成モデルからサンプルしたデータと訓練データとの要約統計量を比較する事でサンプリング精度を測るサンプリング手法である。
この時要約統計量をどのように選ぶかが重要であり、それの一般的な選択手法は少ない。
本論ではカーネル法に基づく分布回帰を用いる事で提案する。
これは特性カーネルを利用したRKHSへの分布埋め込みをもとにしたカーネル回帰手法に基づく。
また条件付き確率に対する分布回帰を用いる事でデータの特定構造に関する知識を取り入れた手法も提案する。
計算コストの低いフーリエカーネルを用いる事でlarge scale dataにも適用可能である。
dockerコンテナ内に無理やりzshの設定を突っ込むメモ

スマートな方法が思い付かなかったのでシェルスクリプトでラップするという雜な手段を取った。

```zsh
#!/bin/zsh

set -e

container_name="container_app_1"

cp_to_container()
{
  if ! docker exec ${container_name} test -e $2; then
    docker cp -L $1 ${container_name}:$2
  fi
}

cp_to_container ~/.zshenv /root/.zshenv
cp_to_container ~/.oh-my-zsh /root/.oh-my-zsh
cp_to_container ~/.zsh /root/.zsh
cp_to_container ~/.zshrc /root/.zshrc
cp_to_container ~/.zshrc.github /root/.zshrc.github
cp_to_container ~/.zshrc.peco /root/.zshrc.peco
cp_to_container ~/.gitconfig /root/.gitconfig
cp_to_container ~/.gitconfig.local /root/.gitconfig.local
cp_to_container `which diff-highlight` /usr/bin/diff-highlight

if ! docker exec ${container_name} test -e /usr/bin/peco; then
  docker exec ${container_name} sh -c "curl -L -o /root/peco.tar.gz https://github.com/peco/peco/releases/download/v0.4.5/peco_linux_amd64.tar.gz && tar xf /root/peco.tar.gz -C /root && cp /root/peco_linux_amd64/peco /usr/bin/peco"
fi

docker exec -it ${container_name} sh -c "export TERM=${TERM}; exec zsh"
```

これで、手元のマシンと同じ様な感じで開発用コンテナを操作できる。
ホームディレクトリを丸ごとマウントするという手段も無くは無かったが、大げさ過ぎるし事故った時にヤバイので止めた。
Immutable.jsで型（モデルクラス）を作ってコメントで楽をしよう

## コメントががが
オブジェクトを引数で渡しちゃうとコメントがこんな感じになります。

```js
/**
 * ほげする関数
 *
 * @param {object} param                いろいろ入ってるよ
 * @param {string} param.namae          名前だよ
 * @param {number} param.nenrei         年齢だよ
 * @param {object} param.kuwashiku      さらに突っ込んで
 * @param {string} param.kuwashiku.are  あれだよ
 * @param {string} param.kuwashiku.kore これだよ
 * @param ...たくさん書く...
 */
function hoge(param) {
```

大変ですね。
大変だと書かない人が出てきたり、IDE使ってたとしてもメンテしなくなったり、、、
そして後々になってparamの中の構造がわからず、ログに出して確認しなきゃいけなくなったり。。。

なので immutable.js でクラスを作って楽に書こう！という話です。

```js
import Murabito from './models/Murabito';

/**
 * ほげする関数
 *
 * @param {Murabito} murabito これだけになる！楽チン！
 */
function hoge(murabito) {
```

## イミュータブルなベースを作る
まずは拡張しやすいベースを作ります。
ここでは hito というベースを作ってみました。

```js
import { Record } from 'immutable';

const hito = extendValues => class extends Record({
    namae  : '',
    nenrei : 0,
    ...extendValues,
}) {};
```

hito は関数式で、実行されるとクラスを返します。
引数のオブジェクトの値はデフォルト値となります。
extendValues というのが味噌なのですが、ひとまず置いておきます。

## ベースからシンプルなクラスを作る
hito関数を実行するとクラスが返りますので、これを extends してクラスを作ります。

```js
// 何もせずに拡張する
class Hito extends hito({}) {}

// インスタンスを生成
const hitoA = new Hito({
    namae  : '山田',
    nenrei : '14',
});
console.log(hitoA.toJS()); // { namae: '山田', nenrei: '14' }
```

new する時に初期値を渡してあげることで、 Hito クラスから hitoA（山田くん14歳）を生成することができました。
これでイミュータブルな人を量産できますね！！

```js
const hitoB = new Hito({ namae  : '佐藤', nenrei : '15' });
const hitoC = new Hito({ namae  : '鈴木', nenrei : '16' });
const hitoD = new Hito({ namae  : '高橋', nenrei : '17' });
```

どれも Hito型 として楽にコメントできます。

## 拡張してみる
Hito型だけでは辛くなってきたので、拡張して Murabito型を作ってみましょう。

```js
class Murabito extends hito({
    serifu : '',
}) {
    hanasu() {
        return `${this.namae}：　${this.serifu}`;
    }
}
```

味噌である extendValues に増やしたいプロパティを入れたオブジェクトを渡します。
これにより、元々もっていた namae, nenrei に加えて serifu を持つことができるようになりました。
ついでにメソッドも書いてみました。
これはインスタンスが楽しみですね♪　では早速、

```js
const murabitoA = new Murabito({
    namae  : 'おじさん',
    nenrei : 33,
    serifu : '今日もいい天気だね',
});
console.log(murabitoA.toJS());   // { namae: 'おじさん', nenrei: 33, serifu: '今日もいい天気だね' }
console.log(murabitoA.hanasu()); // おじさん：　今日もいい天気だね
```

村人A（おじさん、33歳）を生成することができました。
台詞もバッチリです。

## 安心して型として使える
おじさんに続いておばさんを生成してみます。

```
const murabitoB = new Murabito({
    namae  : 'おばさん',
    nenr   : '',
    serifu : 'レディに齢を言わすんじゃないよ',
});
console.log(murabitoB.toJS()); // { namae: 'おばさん', nenrei: 0, serifu: '' }
```

おっと、おばさんの威圧に怖気付いて、 nenrei をタイポしてしまったようです。
でも安心してください。タイポした nenr は murabitoB のプロパティとして増えることはありません。
また nenrei にはクラス定義時に指定したデフォルト値の０が入っています。
このように、Murabito型は定義した3つのプロパティをちゃんと保証してくれます。
やったね！

## まとめ
- Immutable.Recordを使って、色々な人型を作ってみました。
- 引数に渡せば内容もはっきりしててわかりやすい！しかもイミュータブル！
- これで楽できるから、ドキュメント自動生成しなかったとしても、I/Fコメントをちゃんと書こう！

## 参照
- [immutable-js#334 Extend record classes](https://github.com/facebook/immutable-js/issues/334#issuecomment-226097016)
Macで簡単！Pythonを用いた単位ステップ応答のプロット

制御を勉強したことのある人であればおなじみの **単位ステップ応答** を実際にプログラムに計算させてグラフに出力してみたいと思います。

----
**この記事の対象**

- 制御分野を勉強されている方
- Pythonを使用したシミュレーションに興味がある方
- Python初心者の方

---

```math
\frac{d^{2}x(t)}{dt^{2}} + \alpha \frac{dx(t)}{dt} + \beta x(t) = u(t)
```

今回は、上記の微分方程式で示されるシステムに関してプログラムを作成していこうと思います。
このような数学モデルでは計算が複雑で面倒なので、制御分野ではラプラス変換を用いて時間領域から周波数領域に変換してから計算をします。ですが、コンピュータに計算させてしまえば一瞬で導き出してくれちゃいます。

## 1.Macを選んだあなたは正解！
Mac（OS X/macOS）には標準でPythonがインストールされています。古すぎる場合などはアップデートが必要なことがありますが、ここでは省略させていただきます。

## 2.必要なパッケージをインストール
Pythonでは、`pip`というパッケージ管理システムを利用します。ここでインストールしたパッケージは、`import`といった感じでプログラム側から読み込んで使用することができるようになります。もし、バージョンアップするように言われたら`pip install --upgrade pip`を実行しましましょう。

```
$ pip install numpy
Requirement already satisfied: numpy in /usr/local/lib/python2.7/site-packages

$ pip install scipy
Collecting scipy
  Downloading ..... (21.8MB)
.....
Installing collected packages: scipy
Successfully installed scipy-0.18.1

$ pip install matplotlib
Collecting matplotlib
  Downloading ..... (11.2MB)
.....
Installing collected packages: ..... pytz, pyparsing, matplotlib
Successfully installed ..... pytz-2016.7 six-1.10.0
```

## 3.プログラミング
お好きなエディタで以下のプログラムを記述し、拡張子`py`で保存してください。

```sample.py
from scipy.integrate import odeint
from math import *
import numpy
import matplotlib.pyplot as plot

# 変更してみましょう
alpha = 17
beta = 777

def derivative(x, t):
    dx = [ x[1], - beta * x[0] - alpha * x[1] + 1.0 ]
    return dx

x_init = [0.0, 0.0]
time = numpy.linspace(0.0, 5.0, 10000)
x = odeint(derivative, x_init, time)

# 出力部分
plot.figure()
plot.plot(time, x[:, 0])
plot.show()
```

## 4.実行
pythonに引数としてプログラムファイル名を渡してあげると、実行されます。

```
$ ls
sample.py

$ python sample.py
```

<img width="300" alt="スクリーンショット 2016-11-11 1.10.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/128344/df528c77-1fa9-7284-47d8-cc48d9de6dff.png">
macOS, iOSの座標系の差分を吸収する方法

# 本文書の目的
macOS, iOSのグラフィクスの座標系は、macOSが原点を左下に置くLLO(Lower Left Origin)、iOSが原点を左上に置くULO(Upper Left Origin)と、それぞれ異なっている。これは、macOS, iOSのいずれでも動作するフレームワークを開発するときに、混乱の元となる。
本文書では、macOS, iOS各々の各ソフトウェアコンポーネントの座標系についてまとめる。また、[CoreGraphics](https://developer.apple.com/reference/coregraphics)ベースのフレームワークを作成するときの、座標系選択の戦略について述べる。

# 履歴
## 更新履歴
2016/11/08 新規作成
## 参考文献

# 座標系
以下に各OS, フレームワークが使用している座標系を挙げる。macOSとiOSで、CoreGraphicsの座標系が異なっている。

<table>
  <tr>
    <th>カテゴリ</th>
    <th>macOS</th>
    <th>iOS</th>
  </tr>
  <tr>
    <td>GUI</td>
    <td>LLO (AppKit)</td>
    <td>ULO (UIKit)</td>
  </tr>
  <tr>
    <td>CoreGraphics</td>
    <td>LLO</td>
    <td>ULO</td>
  </tr>
</table>
これでは、共用のCoreGraphicsベースのグラフィクスフレームワークを開発しづらいので、CoreGraphicsの座標系をmacOS標準のLLOに統一することにする。
iOSにおいて、CoreGraphicsの座標系をULOからLLOに変えるためには、GUIからCoreGraphicsに与えるパラメータ、CoreGraphicsからGUIに与えるパラメータに関して、座標変換を施す必要がある。
以下の章で、

1. CoreGraphicsの座標系をULOからLLOに変更する方法
2. CoreGraphicsとGUIの間で、パラメータの座標系を変換する方法

について述べる。

# CoreGraphicsの座標系をULOからLLOに変更する方法
下記の処理を追加することで、```CGContext```の座標系を変換できる。

```
context.translateBy(x: 0.0, y: height)　// heightはGraphics領域の高さ
context.scaleBy(x: 1.0, y: -1.0)
```

# CoreGraphicsとGUIの間で、パラメータの座標系を変換する方法
## ULOからLLOへの変換
各種イベントで位置を表すパラメータ(touchから取得)は、LLOに変更する必要がある:
```func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)```
```func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)```
```func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)```
drawメソッドも、
```func draw(_ dirtyRect: CGRect)```
更新領域を表すRectを、LLOに変更する

## LLOからULOへの変換
矩形情報(invalidRect)をULOに変更する
```func setNeedsDisplay(_ invalidRect: CGRect)```

# まとめ
座標系の変更には、相当のコストが発生するので、ソフトの構想段階で、

* 各コンポーネントをULO/LLOのいずれにするか
* ULO⇄LLO変換はどこで行うか

決めておくと良い
Swiftで超簡単に日付から年齢を算出する方法 (Swift 3.0.1)

どうぞ！

```DateUtils.swift

import Foundation

class DateUtils {
    
    static func age(byBirthDate birthDate: Date) -> Int {
        let timezone: NSTimeZone = NSTimeZone.system
        let localDate = NSDate(timeIntervalSinceNow: Double (timezone.secondsFromGMT)) as Date
        
        let localDateIntVal = Int(string(localDate, format: "yyyyMMdd"))
        let birthDateIntVal = Int(string(birthDate, format: "yyyyMMdd"))
       
        print(localDateIntVal!)
        print(birthDateIntVal!)
        
        let age = (localDateIntVal! - birthDateIntVal!) / 10000
        print(age)
        
        return age
    }

    static func date(_ string: String, format: String) -> Date {
        let formatter: DateFormatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.date(from: string)! as Date
    }
    
    static func string(_ date: Date, format: String) -> String {
        let formatter: DateFormatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: date as Date)
    }
    
    static func simpleDate(string: String) -> String {
        let tmp = string.replacingOccurrences(of: "-", with: "/")
        let res = tmp.substring(from: tmp.index(tmp.startIndex, offsetBy: 5))
        return res
    }

}
```
AppLovinの動画データのキャッシュを削除する

# 目的
AppLovinのリワード広告のキャッシュを削除する方法を紹介します。

# 問題点
AppLovinのリワード広告は動画や画像ファイルをキャッシュすると、
自動で削除してくれません。

放っておくといつの間にかアプリの容量が300MBとかになってたりするし、
ユーザからの苦情の元にもなります。

# 早速削除
```delete.kt
fun deleteAdCacheForAppLovin() {
    val AD_PATH = "${Environment.getExternalStorageDirectory().path}/Android/data/${Application().applicationContext.packageName}/files/al/"
    if (!File(AD_PATH).exists()) {
        return
    }

    File(AD_PATH).listFiles().forEach { fileName ->
        if (!fileName.delete()) {
            // 削除に失敗したらVM終了時に削除を試みる
            fileName.deleteOnExit()
        }
    }
}
```

端末によっては違うディレクトリにあるかもしれない。
Galaxy、Xperia、P8Liteは上記コードで問題なく削除できた。
Null安全な言語をめぐるエトセトラ　その１　３種の「現場」

#序
ちょっとポエムを。最近、null 安全 （null safety）をめぐる、[かなり力の入ったエントリー](http://qiita.com/koher/items/e4835bd429b88809ab33)が界隈の人々の間でバズっている模様。
今のところ、主には、iOS界隈の人はもはや外せない選択肢であるSwiftのnull安全な記法が話題の中心かな。

これから、各言語の年末のAdvent Calendarのかっこうのネタとなっていくのかも、と、なんとなく読み流していいたのだけれども、今腰掛け的にいるAndroid案件の現場のテストフェーズでヌルポ障害(null pointer exception)が発生中であることと、もう少し踏み込む次の案件で、PHP+Javascriptに替えて、Hack+Typescript2という、null 安全な組み合わせの採用をたまたま検討中なこともあって、ちょっと興味が出てきた。ということで、Swift、Kotlin、Typescript2 、RustなどのNull安全な言語が、どのようなシチュエーションで必要とされるのかを、ふつうの現場視点(飛び抜けてすごい人がいるわけではない現場の視点)でちら見しておきたい　(...本格的な組込案件はやったことがないので、そのあたりの考察は全く欠けているのであしからず)。

nul安全とは何か、とかは、上のエントリーやその周辺エントリーを見てね。
ちょっとだけ、個人的な思いを書いておくと、こなれたNull安全な言語が普及すると多くの人が少し幸せになれると思う。昔からscala書いてて、null安全でない、ということを意識したことはなかったけれど、確かにnull安全でない書き方も普通に許容されているという意味では、scalaはnull安全な言語に分類されないのだろう...scalaの黒魔術とか良く言われてきたし、null安全なscalaのコードは読みにくかったりするんで、たしかにそうなのかも(scala3.0(？)がnull安全でより簡潔に書ける方向に舵を切ってくれるとうれしいな)。

#[1]web開発の現場
ユーザーとブラウザを介してやり取りする普通のweb開発の現場では、Null安全な言語の普及はさほど進まないのではないかと思う。理由は、メジャーな言語の今風のwebフレームワークは一般的に起こりうる場合の安全な書き方についてはベストプラクティスをそれぞれに確立していて、その枠内にいる限りにおいては、ヌルポの類で苦しむことはあまりないから(むしろ、その他の問題の方が多発する)。

とはいえ、コンパイラがnull安全性をチェックしてくれるのはうれしいはず。nodejs界隈の人々がtypescript2を本格的に採用しはじめると、そこにweb開発でのnull安全のベストプラクティスが蓄積されていくのかも。
他方、null安全ではないとされる言語でもnull安全なフレームワークを作ることはできて、scalaで昔使っていたliftwebはいろいろツッコミが入っているフレームワークではあるけれど、null安全への配慮はかなり盛り込まれていて、何度も続いた改修の中で、本番稼働時にヌルポで落ちたことはなかった(はず)。当時から、「Scalaではnullを（原則）使わない」文化[参考](https://twitter.com/kmizu/status/782360813340286977?ref_src=twsrc%5Etfw)はそれなりにあって、今は、ふつうのscala使いはnullを必要がないないかぎり使わないだろう。

メジャー言語のwebフレームワークもnull安全を意識した進化を徐々に遂げていき、結果として、住み分けに落ち着くのではないかと予想。


#[2]スマートフォン開発の現場
ここでは、Null安全な言語の普及が望まれている。Objective-Cからnul安全なSwiftへのシフトはまさしくその流れだし、Android開発でのnul安全なホープKotlinもまさしく流れを生み出している。

お硬い業務系アプリ開発の現場なんかでも、問題は生じている。例えば、ICカードで認証して基幹システムから情報を受取り、外出先でQRコードで読み取った情報を帳票出力するAndroidアプリをい開発...なんていかにもな業務系案件。業務系案件では、仕様書の体裁揃えなどなどいろいろと開発以外のタスクが多くある中で、ミドルウェア(デバイスドライバなど)の仕様と実装をきめ細やかにチェックする時間が取れなかったりする。そうなると、QRコード読取など、スレッド間のタイミング調整がシビアになる場合に、機種依存のヌルポが多発したりする。こうした問題を、SwiftやKotlinは軽減していけるのかもしれない。

ただ、iOSの普及はシェアは諸般の事情で頭打ちだろうし、受託業務系のJavaな開発現場で、発注主に対し次のKotlinで行きましょうと説得できる人が少なそうなところが、null安全な言語の普及の足かせになるのかも。

#[3]IoT，fintech、そして、ブロックチェーン案件の現場

話は飛んで、今のときめくバズワード、IoT，fintech、そして、ブロックチェーンにまつわる案件の現場について。
このあたりは、ベストプラクティスが確立していないだけあって、状況が許せば、開発環境はなんでもありになるのではと思う。
このIoT案件はC+Null安全なnimでいきましょう、fintechアプリのクライアントはtypescript+nativescriptで書くのが１番安上がりっす、ブロックチェーンアプリといえばこれからはgoでしょ、的な。...Goは分類上、型安全な言語ではないとされるだろうけど。

IoT，fintech、あるいは、ブロックチェーンで「稼ぐ企業」が、Null安全な言語を採用した場合、それがきっかけで、いずれかのNull安全な言語が伸びるのではないかと予測。


#続きは...

今、Null安全ではない言語でスマートフォン開発をやっていて、これから、null安全な言語(Hack+typescript)でweb開発をちょっとだけする。その後は、IoT+ブロックチェーンな案件をすることになりそう。ということで、上の[1]～[3]のいずれかに関する考察をしていきたい。

個人的な好みはnull安全でない、とされるscala+dartの組みあわせなので、null安全とされない言語の逆襲、的なことも書けるならば書いてみたい。
...いやでも、null安全で書きやすい言語のどれかが、ガツンと普及してほしいなとも思うよ^_^　そのきっかけは、あえて一択とするならIoT開発の現場から。
kintone で SpreadJS 9J の Service Pack 1版

#SpreadJS 9J の Service Pack 1版

2016年7月にリリースされていましたが、ほとんど触っていませんでした。
プラグイン開発に使えるといいんですがライセンスの関係で無理でした。
開発ライセンスでは、アプリへの組み込みは問題なく使えますが、プラグインへの組み込みはNGです。

Service Pack 1リリース
http://jp.spread.grapecity.com/spreadjs/blog/update/20160727/


いろいろ機能が追加されています。

- テーブルスライサー
- クライアントサイドExcelIO
- Excel2013/2016テーマ
- 印刷機能

クライアントサイドExcelIOは、 SpreadJSクライアント側でExcelファイルの入出力ができるということで、データの入出力が簡単にできそうです。

#kintone アプリでの使用例

![SPREADJS01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/39b19a68-ec98-06b8-3dd0-fb9ec4830eab.png)

サンプルを少しいじって、カスタム画面に表示しました。

データは、2000行x AK カラムのExcel ファイルを読み込んでみました。
少し時間がかかりますが Excel シートが再現されています。

もちろん、セルデータのコピペなども出来ますので、大量データのメンテなどにも使えそうです。
PHP製CMS concrete5 のインストール

# concrete5
**concrete5** の 5.7 を **CentOS 7** にインストールした手順をまとめた。

# ファーストインプレッション
数年以上前に社内で試用して以来、久しぶりに触ってみた。
根本的には変わっていないようだったが今風に進化している感じ。デザイン重視の **pimcore** といったところか。
使いこなすには装飾センスと構成力が必要そう。

余力があれば、他CMSとの比較記事で [concrete5 Japan Advent Calendar 2016](http://www.adventar.org/calendars/1439) に参加したい。

# システム要件
公式のシステム要件は以下の通り。[^requirements]

* PHP 5.3.3 以上 (PHP 5.6 以上を推奨)
* PHP モジュール
    * CURL
    * zip
    * mcrypt
    * openssl
    * GD (with freetype)
    * mysql
    * mbstring
    * iconv (Zend Locale で必要)
* PHP 設定 (primarily for file uploads) 
    * post_max_upload_filesize = 20
    * post_max_size = 20
    * php memory limit to 96 (More may be needed for memory intensive operations, such as upgrading.)
* PHP Safe Mode Off
* MySQL 5.1.5 以上
* MySQL Innodb table support.
* Apache/IIS (Apache を推奨)

[^requirements]: https://www.concrete5.org/documentation/background/system_requirements

# 構成例
以下の環境条件となった。

* CentOS 7.2.1511 (1610-01)
* Apache 2.1.6
* PHP 5.4.16
* MariaDB 5.5.50
* concrete5 5.7.5.9

# インストール
## EPEL リポジトリーの追加
```bash
yum install epel-release
yum update
```
php-mcrypt をインストールするのに必要。

## Apache / PHP / MariaDB のインストール
```bash
yum install httpd mariadb mariadb-server php php-gd php-mbstring php-mcrypt php-mysql php-xml
sed -i.org 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
systemctl start httpd mariadb
systemctl enable httpd mariadb
```
## firewalld の設定
```bash
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
```
## データベースとDBユーザーの作成
```bash
cat << "_EOQ_" | mysql -u root -p
CREATE DATABASE `concrete5` CHARACTER SET 'utf8';
CREATE USER 'concrete5'@'localhost' IDENTIFIED BY 'concrete5';
GRANT ALL ON concrete5.* TO 'concrete5'@'localhost';
_EOQ_
```
## concrete5 のセットアップ
```
curl -L http://www.concrete5.org/download_file/-/view/90125/ -o concrete5.7.5.9.zip
yum install unzip
unzip concrete5.7.5.9.zip
mv concrete5.7.5.9/* /var/www/html && rm -fr concrete5.7.5.9
chown -R apache:apache /var/www/html
chcon -R -t httpd_sys_script_rw_t /var/www/html
```

# CMS 関連記事
* [GitHubで人気の高いCMSランキング](http://qiita.com/bezeklik/items/45fa04b83792743b7cbf)
* [PHP製CMS Octoberのインストール](http://qiita.com/bezeklik/items/aaa47ea4be04270cb9e5)
* [PHP製CMS Gravのインストール](http://qiita.com/bezeklik/items/7593579462cb0557fd3d)
* [PHP製CMS Pagekitのインストール](http://qiita.com/bezeklik/items/2bd0eaa50bd36f5de0e6)
* [PHP製CMS Bolt のインストール](http://qiita.com/bezeklik/items/ca6783ccb748df4baad8)
* [PHP製CMS concrete5 のインストール](http://qiita.com/bezeklik/items/fd2ff842bf86b2e8f943)
* [PHP 製 オープンソースCMS「Pimcore」のインストール](http://qiita.com/bezeklik/items/1aed99d3a68367be7a2b)
* [CentOS 6.6 に eZ Publish 5.4 をインストールする](http://qiita.com/bezeklik/items/c5fee4120249f5adc6ed)
プルリクの送り方


1. github上でfork
2. ローカルにclone
3. `git branch hoge`でブランチ作る
4. `git checkout hoge`でhogeに切り替え
5. 編集
6. `git add hoge.foo`
6. `git commit -m "fix hogehoge"`でコミット
7. `git push origin hoge`でpush
8. github上でPullRequest
ios開発でTDDをやるために最低限やっておくこと

TDDに限らず単体テストを動作させたら早めに結果が欲しいでしょう。
ios開発では、何も考えずに書くとAppDelegateが呼ばれて、Controllerが呼ばれて・・・となり、時間が無駄にかかったり、テストケースが動く前に落ちたりします。

知っている人にとっては当たり前の解決方法ですが、意外と日本語記事が少なかったので、後輩のために書いてます。

# Main Interfaceをコードで書く

以下の部分を書いているとテストを動作させるとそこのControllerが動くので消しておきます。

![スクリーンショット 2016-11-10 23.54.02.png](https://qiita-image-store.s3.amazonaws.com/0/10494/a46f6097-605f-4c4a-05a9-4b065e6f4874.png "スクリーンショット 2016-11-10 23.54.02.png")

上記の代わりにコードで書いときます。

```AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        window.rootViewController = storyboard.instantiateInitialViewController()
        window.makeKeyAndVisible()

        return true
    }
```

# main関数を作成


まずは、自分のmain関数を動作させたいので、AppDelegateクラスの ```@UIApplicationMain``` を削除しておきます。

```diff
-@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate {
```

次に、以下のファイルを作成します。

```main.swift
let appDelegateClass: AnyClass? =
    NSClassFromString("テストターゲット名.TestingAppDelegate") ?? AppDelegate.self
let args = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
UIApplicationMain(CommandLine.argc, args, nil, NSStringFromClass(appDelegateClass!))
```

Objective-Cでは以下です。

```main.m
int main(int argc, char *argv[]) {
    @autoreleasepool {
        Class appDelegateClass = NSClassFromString(@"TestingAppDelegate");
        if (!appDelegateClass) {
            appDelegateClass = [AppDelegate class];
        }
        return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));
    }
}
```

# テスト用のAppDelegateを作成

以下のファイルをテストターゲットに置きます。

```TestingAppDelegate.swift
class TestingAppDelegate: NSObject {
    var window: UIWindow?
}
```

Objective-Cでは以下です。

```TestingAppDelegate.h
@interface TestingAppDelegate : NSObject
@property(nonatomic, strong) UIWindow *window;
@end
```

```TestingAppDelegate.m
@implementation TestingAppDelegate
@end
```

以上です。
Python,Jupyterで代数曲線をインタラクティブに表示する

http://qiita.com/hoxo_m/items/5ca984d9dcac16090223
こちらの投稿を参考にしてPython, Juyterでもやってみました。

スライドバーを動かすと異なるパラメータの曲線がプロットされます。
ipywidgetsをインストールしてやってみてください。

```python
import numpy as np
import pylab as plt 
import matplotlib.cm as cm
%pylab inline
from ipywidgets import  interact


N=5
delta=0.1
xs= np.arange(-N, N, delta)
ys = np.arange(-N, N, delta)
X, Y = np.meshgrid(xs, ys)

def fmesh(f,xs,ys):
    return [[f(x,y)for x in xs] for y in ys]

@interact(a=(-10, 10, 2),index=(1,5,1))
def plot(a,index):
    f=lambda x,y: (y**2-(x + a)*x**2)**index
    plt.figure(figsize=(6,6))
    ticks=range(-5,5)
    plt.xticks(ticks)                                                       
    plt.yticks(ticks) 
    interval = [i/4  for i in range(30)]
    CS=plt.contour(X, Y, fmesh(f,xs,xs),interval)
    plt.clabel(CS, inline=0, fontsize=10)
    plt.contourf(X,Y, fmesh(f,xs,xs))    
    plt.grid()
```
![arith.png](https://qiita-image-store.s3.amazonaws.com/0/12005/7a890dc6-965f-d848-1010-4c9772916f3b.png)

https://gist.github.com/xiangze/558ec538191012462d16b1113cbf803b#file-arithmeticcurveplot-ipynb

参考
http://qiita.com/y__sama/items/654ed8ab7464718876f9
http://qiita.com/tanemaki/items/e965cd9c25acbeed860c
pythonでfoursquareのAPIを使う際の初期設定

# ブラウザでの準備

まずfoursquareに登録します。次に以下のリンク先の「Create New App」でアプリを作成しましょう。
https://developer.foursquare.com/

アプリを作成するには次の三つを設定する必要があります。

+ Download / welcome page url
+ Your privacy policy url
+ Redirect URI(s)

webで公開するようなアプリじゃなくて試しに動かしたいだけなら
http://www.example.com/
とかでも全然大丈夫です。

設定を終えるとClient id,Client secretという二つの値が設定されるはずです。これはのちほど利用します。

# 開発環境での準備

まずはfoursquareのラッパーをインストールします。

`pip install foursquare`

次にセットアップを行うコードを書いてみましょう。なおこのコードはpython3なのでpython2の場合は`input`を`raw_input`に変えましょう。

```python3:setup.py
import foursquare

# 作成したアプリの情報を設定
CLIENT_ID=#(作成したアプリのClient id）
CLIENT_SECRET=#(作成したアプリのClient secret)
REDIRECT_URI=#(作成したアプリのRedirect URI)

# clientオブジェクトを作成
client = foursquare.Foursquare(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, redirect_uri=REDIRECT_URI)

# アプリの認証
auth_uri = client.oauth.auth_url()
print(auth_uri)

# 表示されたauth_uriにブラウザからアクセスし、URIの「?code=」の後から「#」の前までの文字列を入力
code=input("INPUT CODE:")
# アクセストークンを取得
access_token = client.oauth.get_token(code)
print(access_token)

# アクセストークンを設定
client.set_access_token(access_token)

# 試しに自分のユーザ情報出力する
# ユーザ情報が表示されたら無事成功
user = client.users()
print(user)
```

以上のコードでアクセストークンを得たらあとは繰り返し使えます。具体的には次のコードのような感じです。

```python3:test.py
import foursquare

# 作ったアプリの情報
ACCESS_TOKEN=#(設定したACCESS_TOKEN)

# clientオブジェクトを作成
client = foursquare.Foursquare(access_token=ACCESS_TOKEN)

# 試しに自分のユーザ情報出力する
# ユーザ情報が表示されたら無事成功
user = client.users()
print(user)
```


# 参考URL
mLewisLogic/foursquare
https://github.com/mLewisLogic/foursquare
foursquare APIでできること #4sqdevjp
http://qiita.com/koogawa/items/df92ec1c7eb750312b77
foursquareAPI - Connecting
https://developer.foursquare.com/overview/auth
RaspberryPi3のセットアップ続き〜VNCやWi-fi設定

こんばんは:whale2:

[前回](http://qiita.com/B73W56H84/items/f84763e9e5f9d3b21f7d)は、RaspberryPi3本体に有線LANでインターネット接続して、MacBookAirからSSHまでしました。
引き続き設定をしていきます。


## VNCでリモートデスクトップ
あると便利なVNC

#### Raspberry Pi 側の準備
```bash:インストール
$ sudo apt-get install tightvncserver
```

```bash:起動＆初回のパスワード設定
$ sudo vncserver :1 -geometry 800x600 -depth 24
You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
xauth:  file /root/.Xauthority does not exist

New 'X' desktop is raspberrypi:1

Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/raspberrypi:1.log
```

```bash:vncserverを終了するとき
$ sudo vncserver -kill :1
```

#### MacBookAirから接続

`Finder` > `移動` > `サーバへ接続... ⌘K`

![スクリーンショット 2016-11-10 23.15.09.png](https://qiita-image-store.s3.amazonaws.com/0/76589/1807453b-414d-7efa-dd5d-1851e0135404.png)

`vnc://[RaspberryPiのIPアドレス]:5901`を入力して接続。

## Wi-fiの設定

せっかくリモートデスクトップしているので[このページ](http://igarashi-systems.com/sample/translation/raspberry-pi/configuration/wifi.html)にない設定方法です。

raspbianの画面の右上にある<i class="fa fa-long-arrow-up" aria-hidden="true"></i><i class="fa fa-long-arrow-down" aria-hidden="true"></i>みたいなアイコンがWi-fi設定です。

そこで自宅のWi-fiルータのSSIDを選んで、KEYを入力したら完了です。（かんたん）
<i class="fa fa-long-arrow-up" aria-hidden="true"></i><i class="fa fa-long-arrow-down" aria-hidden="true"></i>だったアイコンが<i class="fa fa-wifi" aria-hidden="true"></i>みたいなアイコンに変わります。[^1]

これで10mのLANケーブルとおさらばです:scissors:

## キーボードレイアウト変更

[Apple Keyboard (US)](https://www.amazon.co.jp/dp/B001UHN7TI)を使っているのに、`Shift+2`で`@`が出なくってつらい。

raspbian画面左上の
`ラズベリーアイコン` > `設定` > `キーボードとマウス`
`キーボード`タブの`keyboard layout`から`米国` `英語(US)`を選びます。

## 日本語入力設定

Google 日本語入力っぽい`mozc`を導入する。

```bash
$ sudo apt-get install ibus-mozc
$ sudo apt-get install fcitx fcitx-mozc
```

入力切替のショートカットが設定できてないけど、一旦アイコンから`入力モード`を切り替えたら日本語入力できたのでよしとする。

## おわり

注文している部品が届いたら続く。はず。

## 参考と注釈

* [WIFI - Raspberry Pi 公式ドキュメントを日本語訳](http://igarashi-systems.com/sample/translation/raspberry-pi/configuration/wifi.html)
* [Raspberry PiにVNCで接続する - ぱせらんメモ](http://d.hatena.ne.jp/pasela/20121225/raspi_vnc)
* [インストールしておくと便利なアプリケーションなど](http://raspibb.blogspot.jp/2015/04/blog-post.html)

[^1]: 内部では`/etc/wpa_supplicant/wpa_supplicant.conf`ファイルが更新されています。
4ステップで始めてみた最新MQ Pulsar

## 前置き
先週の土曜日に[オープンソースカンファレンス](http://www.ospn.jp/osc2016-fall/)に遊びに行った際に、今年9月に公開されたOSSのMQ(Message Queue)であるPulsarの話を聞くことができ、以前から少し気になっていたので使ってみた。Yahoo! Inc.の方が「どうして我々はPulsarを作ったのか？」や「主な特徴や運用実績」などを"英語"で説明して頂いた。とりあえず、Pulsarとは一言でいうと、「スケーラブルで低レイテンシーなPub/Sub メッセージングシステム」！よくわからない。

詳しい紹介は「[ハイパフォーマンスでスケーラブルなメッセージングシステム：Pulsarの紹介](https://techblog.yahoo.co.jp/infrastructure/pulsar_introduction/)」に任せるとして、ここでは最低限の情報のみ記述します。以下私の認識なので、間違っていたらごめんなさい。

#### 最低限のPulsar情報
- MQとは高速にメッセージ（文字列）をやり取りする仕組み
- Apache Camel: ActiveMQ も同様のMQの機能を持つOSS
- コンポーネントとして以下の3つが登場人物
    - Broker(ブローカー)
    - Publisher(パブリッシャー)または、Producer(プロデューサー)
    - subscriber(サブスクライバー)または、Consumer(コンシューマー)
- PulsarはProducer,Consumerと呼んでいるので、そちらをここでは使用する。役割は以下の通り。
    - Broker：メッセージを仲介する人
    - Producer：メッセージを送る人
    - Consumer：メッセージを受け取る人
- MQを利用するとメッセージの送り手と受け手の関係が、1対1でなく、N対Nにすることができる

ソースコードはGitHub https://github.com/yahoo/pulsar

## 使ってみる
オープンソースカンファレンスで頂いた資料に「Pulsarの利用はかんたん4ステップ」と書かれているのでとりあえずそれをやってみる。
※注意：java8をインストールする必要がありました。

##### 1. GitGubからパッケージをダウンロードして展開し、Standalone serverを起動します。
```
$ curl -L -O https://github.com/yahoo/pulsar/releases/download/v1.15.2/pulsar-1.15.2-bin.tar.gz
$ tar xvfz pulsar-1.15.2-bin.tar.gz
$ ./pulsar-1.15.2/bin/pulsar standalone
```
##### 2. 別ターミナルを立ち上げてConsumerを起動します。
```
$ cd pulsar-1.15.2/bin/
$ ./pulsar-client consume -s 'sub' 'persistent://sample/standalone/ns1/my-topic'
```
##### 3. さらに別のターミナルを立ち上げて、Producerを起動しメッセージを送信します。
```
$ cd pulsar-1.15.2/bin/
$ ./pulsar-client produce -m 'Hello Pulsar!' 'persistent://sample/standalone/ns1/my-topic'
```
##### 4. Consumer側のターミナルに先ほどProducerから送信したメッセージが表示されます。
```
----- got message -----
Hello Pulsar!
2016-11-10 14:49:54,387 - INFO  - [main:PulsarClientImpl@302] - Client closing. URL: http://localhost:8080/
2016-11-10 14:49:54,695 - INFO  - [main:ConsumerImpl@571] - [persistent://sample/standalone/ns1/my-topic] [sub] Closed consumer
2016-11-10 14:49:54,838 - INFO  - [main:CmdConsume@154] - 1 messages successfully consumed
2016-11-10 14:49:54,847 - INFO  - [pulsar-client-io-1-1:ClientCnx@94] - [id: 0x9ca18431, L:/127.0.0.1:49311 ! R:localhost.localdomain/127.0.0.1:6650] Disconnected
```

java8をインストール必要があり、standaloneを立ち上げる際にはじめエラーが出たが、思ったよりは簡単だった。
自宅に一度brokerであるpulsar standaloneサーバを立てておけばいろいろできそう？いろんなセンサ情報をproduceでとりあえずbrokerに投げといて、DBに保存するなり、その場で処理するなりはconsumeで実装すると、、、夢は広がる！でも、普通のMQTTのbrokerでもいい気がする。まぁ登壇者によると、高機能で高信頼性らしいから今後何かに使用してみようと思う。デメリットとしては、現在OSSの日本語ドキュメントがない。新しい物好きの方は是非お試しあれ！

## 動作環境メモ
上記のコマンドは、windows上のvagrantで起動したCentOS6.4で動かしてみました。virtualbox上のubuntuではうまくいかなかった。virtualbox調子悪い気がする。
null安全について私見

null安全を誤解している人達へのメッセージ http://qiita.com/omochimetaru/items/ee29d4c6eb0d78f02b15 を読み、自分の考えとややずれがあったので、せっかくなので久しぶりに記事を書いてみることにします。

私個人としてはnull安全どころかさらに強力な型システムがあったほうが嬉しいですが、記事としては中立のつもりで書きます。

# はじめに＋まとめ

最も重要な点として、null安全というのは型チェックの延長線上にあるということです。

言ってみればジェネリクスと同じようなもので、型チェックでできることが少し広がって記述が少しだけ煩雑になる代わりにより多くのミスが防げるようになるという機能です。
ただ、null安全は継承やジェネリクスや型クラスなどの型システムの機能の中ではかなり単純な割にメリットが大きいので型チェックが好きな人は学んでおくのが良いと思います。

Go言語ユーザーには「ジェネリクス欲しい」という人と「ジェネリクス不要、このままでいい」という人がいます。
特に、型チェックのためじゃなく速度のためにGoやC++を使っているんだという人にとっては言語機能は少ないほうがよいと考えるのも不思議ではないでしょう。
null安全についても好みの問題ということでいいのではないでしょうか。

PHPやRuby, JavaScript等をそのまま利用する「型チェック自体が不要」だという人にとっては、null安全などどうでもよいことです。というか**nullだけ**防いだところで何だという感じです。
型好きな人たちがなんかいっとるわーと適当にスルーするのが良いと思います。


# 参照先の記事の意見に対する自分の考え

**意見: Null Object Patternによってnullにまつわる問題は解決する。**

きっと「null安全」という言葉がミスリードしてしまったのでしょう。`Option`型と呼んだ方がわかりやすいと思います。
この機能の目的は「必ず、あるUserが存在する状況」と「Userは存在するかもしれないし、存在しないかもしれない状況」を区別したいということです。
ヌルぽで死ぬのを避けるのが目的ではないんです。

**意見: null安全があっても、ちゃんとやるのを忘れているかもしれないのでは**

参照記事の通りですが、ありえないです。うっかり`int`に文字列を代入しちゃったぜってくらいありえないことです。
ただ後で触れますが、既存資産との連携でちゃんとやるのをミスるのはあり得る話です。

**意見: 文法が難しそう、例えばデフォルト値を書くのはめんどくさそう**
**意見: Swiftで実用的なWebアプリケーションは作れない。null安全は実用的ではない。**
**意見: null安全にするためには型推論が必要らしいが、これはコンパイル待ち時間を増やす。生産性が下がるだけだ。**
**意見: 新しい機能を導入すると理解しない人によって新しいパターンのバグが生み出されるだけだ。null安全には意味がない。**
**意見： null安全がそんなに素晴らしいなら、その反面高いコストがあるはずだ。生産性が下がるはずだ。**

コストに見合わないという意見ですね。わかります。

もしScalaやRustのようにライブラリも含めてnull安全を試せるという環境であれば、間違いなくメリットを感じることでしょう。「もう型チェックなしでは生きられない」と言うプログラマがいるようにもしかしたら「もうnull安全なしには生きられない」という意見に変わるかもしれません。試してみては？

TypeScriptやKotlinのようにnull安全を考慮してないコードと連携するすることが多い環境だと、確かに面倒さが勝るかもしれません。前にKotlinでAndroidアプリを書いたときは結構苦しんだ覚えがあります。
（Kotlinではnon-nullに代入した箇所で動的にnullチェックされるため、引数の`?`を付け忘れると実行時に死ぬ）
SwiftでもObjective-Cで書かれたサードパーティーのライブラリをガンガン利用して、自分の書くコードはあまりない状況だとメリットを感じにくいような気がします。

言語の型システムの外の話ですが、静的解析ツールを用いてnullチェックするという話は、本当に好きな人や必要に迫られてる人だけがやればいいと思います。


**意見: nullになりうるポインタ変数はよく扱う。私はその変数がnullになる場所、ならない場所を考慮できるし、assertionを書いているからバグもすぐに発見できる。今更特に何も便利にならない。**
**意見: テストコードを書けばバグはカバーできる。null安全をありがたがっているのは、テストコードが書けない無能プログラマだ。**
**意見: nullに関してバグがあっても、ちゃんと動作チェックすれば発見して直せる。それに、製品の網羅的な動作チェックはどっちにしたって必要なことだ。null安全には意味がない。**

そのまま型チェック必要・不要論とほぼ一緒だと思われます。
好みの問題ですね。

**意見: ?.のような機能はRubyにも&.がある。Rubyはnull安全に分類されるはずだ。**

型チェックのない言語は比較対象ではありません。


**意見: null安全がそんなに素晴らしいなら、すでに普及しているはずだ。普及していないのだから、大したものではないはずだ。**

おかげさまで、最近作られた言語はだいたいnull安全なのではないかと思います。

一方で、既存の言語にライブラリの互換性を保ちながら、新しい機能を導入するというのは本当に大変なんです。
JavaやC#では後からジェネリクスが追加されたためイケてないところがあったりしますし、
PHPなんかだと標準ライブラリ内にエラー値を返すものと例外を投げるものが混在していたりします。


**意見: Javaがnullを代入できるようにしたのには、理由があるはずだ。だから正しいはずだ。**

理由があるのと正しいのは別です。C言語にポインタがあるのも、Javaではポインタがなくなったのも理由があります。たいていはトレードオフでしょう。

Javaは、すべての型が内部的に`0`の初期値を持つという設計になってます。
例えばもしnullがないとJavaで `new User[100]`とやったときにどうなるでしょう。C++はコンストラクタが100回走りますが、Java設計者はきっとそれを避けたかったでしょう。
今設計しなおすなら配列はプリミティブ型と`Object?`だけで他は`ArrayList<T>`を使うという方針になるのでしょうか。
読み込みに使えそうなアニメーション2 〜Windows10風〜

### 開発環境

+ XCode8.1
+ Swift3

![20161110.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/e60a5cac-1136-dc4b-aee5-31c28966cc71.gif "20161110.gif")


Windows10のアップデート中のアニメーションを見てて、なんとなく作ってみた。

githubへのリンクは以下
[LoadingAnimationSample](https://github.com/rnsm504/LoadingAnimationSample)

元にしたサンプルはクックパッドの開発ブログにあるやつ。
[心地よいアニメーションを求めて](http://techlife.cookpad.com/entry/2015/10/02/180247)
CAReplicatorLayerはここで初めて知った。


```ViewController
        // CAReplicatorLayerを生成、追加
        let replicatorLayer = CAReplicatorLayer()
        replicatorLayer.frame = view.bounds
        view.layer.addSublayer(replicatorLayer)
        
        let circle = Circlelayer()
        circle.frame = CGRect(x: self.view.frame.midX-40, y: self.view.frame.midY - 80, width: 80, height: 80)
        replicatorLayer.addSublayer(circle)
        circle.setNeedsDisplay()
        
        let animation = CAKeyframeAnimation(keyPath: "position")
        animation.fillMode = kCAFillModeForwards
        animation.isRemovedOnCompletion = false
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        
        let x : CGFloat = self.view.frame.size.width/2
        let y : CGFloat = self.view.frame.size.height/2
        let radius : CGFloat = 100.0
        
        let cyclePath : CGMutablePath = CGMutablePath()
        cyclePath.addArc(center: CGPoint(x:x, y:y), radius: radius, startAngle: CGFloat(M_PI*(3/2)), endAngle: CGFloat(-M_PI*(1/2)), clockwise: false)
        
        animation.path = cyclePath
        
        let blinkAnimation = CAKeyframeAnimation(keyPath: "opacity")
        blinkAnimation.fillMode = kCAFillModeForwards
        blinkAnimation.isRemovedOnCompletion = false
        blinkAnimation.values = [1, 0, 1, 1, 1]
        
        let group = CAAnimationGroup()
        group.animations = [animation, blinkAnimation]
        group.duration = 5
        group.repeatCount = .infinity
        
        circle.add(group, forKey: nil)
        
        replicatorLayer.instanceCount = 6
        replicatorLayer.instanceDelay = 0.1
        let angle = (2.0*M_PI)/30
        replicatorLayer.instanceTransform = CATransform3DMakeRotation(-CGFloat(angle), 0.0, 0.0, 1.0);

```
【Swift】メモ帳アプリのサンプルコード

# 概要
メモ帳アプリのサンプルコードです。

iOS標準のメモ帳アプリほど高機能ではありませんが、
最低限必要な機能を実装してみました。
メモの保存はNSUserDefaultsを利用しています。

* メモ追加
* メモ編集
* メモ削除
* メモ数表示（追加、削除時に変更）
* メモ追加時間表示

# github
https://github.com/menomoto/Sample_Apps/tree/master/notes

* [プロジェクトファイルの不要な設定を削除](https://github.com/menomoto/Sample_Apps/commit/e68a2b3b790e582dbadd1d8229e40f854da0ee99)しました。

# 結果
![サンプル](http://i.imgur.com/WjoI6KB.gif)
Ubuntu16.04 GTX1060でNVIDIA Driver入れるためにやったこと


## 環境

OS: ubuntu 16.04
GPU: GTX1060

## 最初に

公式サイトから.run形式のドライバをダウンロード

F1 + Alt + Ctrlでターミナルに入って

`
sudo service lightdm stop
`

する。そして、ダウンロードした.runファイルのあるディレクトリまで行って

`
chmod +x #{ファイル名}
sudo ./#{ファイル名}
`

を実行する。

これでやってもうまくいかなかったので、いろいろやった

## やったこと その１

blacklistにnouveau含めいろいろ入れた。

```
blacklist nouveau
blacklist vga16fb
blacklist nvidiafb
blacklist rivafb
blacklist rivatv
```

## やったこと その2

追加のドライバから、NVIDIAの367を選択した

## やったこと その3

ここでドライバのインストールの際に、libGL.so.1が無いという旨のエラーメッセージが出るようになったので、

```
sudo update-alternatives --config x86_64-linux-gnu_gl_conf
```

をと入力し、mesaを選択した。そうすると`/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1`が出てくるので、`sudo ln -sf /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so.1`とシンボリックリンクを貼ってから再びインストールした。しかしながら見つからないってエラーは消えなかった。

## やったこと その4

とりあえずいろいろ調べてみたところ、

```
$ sudo apt-get install nvidia-367
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev
```

でその3の問題が解決できそうな感じがしたので、実行した。そしてCUDAも入れたかったので、

```
sudo apt install linux-generic
sudo apt install nvidia-cuda-toolkit
```

を入れて、

```
export PATH=/usr/local/cuda-7.5/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
```

を.bashrcに記載し、再起動した。

結果

```
$nvidia-smi
Thu Nov 10 23:37:21 2016       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57                 Driver Version: 367.57                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 0000:01:00.0     Off |                  N/A |
| 40%   26C    P0    29W / 120W |    734MiB /  6072MiB |     25%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      1181    G   /usr/lib/xorg/Xorg                             458MiB |
|    0      2112    G   compiz                                         271MiB |
|    0      2528    G   unity-control-center                             1MiB |
+-----------------------------------------------------------------------------+
```

動いてるぞ...？

## 最後に
結局どの設定によってうまく動かせるようになったかは不明だけど、NVIDIAのドライバを入れることができたっぽい。詳しい人、コメントいただけると嬉しいです。
Quickのfdescribeやfitをgrepするスクリプト書いた（+Xcode上でwarningとして表示させた）

最近はQuickとTDDでガリガリテスト書いてます。http://qiita.com/shindyu/items/1d644dfabd067de7233a

その作業中にあると便利かなと思ったスクリプト作ってみたのでメモ。

## 前置き
iOSテストフレームワークQuickには特定のテストのみを実行するための

```
fdescribe, fcontext, fit
```
という構文があります。
https://github.com/Quick/Quick/blob/master/Documentation/ja/QuickExamplesAndGroups.md#指定した-examples-だけ一時的に実行する

一般的にテスト駆動で開発を進めるとテスト数が増加するので、それに伴ってテスト実行時間も増加します。そのため、今書いたテストだけを実行したい！っていう時にはこのfocusが非常に便利です。

しかし、例えばあるテストでfdescribeが残ったままコードをcommitしたりpushしたりすると、以降すべてのテストが実行されない状態のコードが使われることになります。
テスト駆動開発の場合は失敗するテストを書くところから始めるので、すぐ間違いに気づくのですが、精神衛生上あまりよろしくないし、commitやpushする前にわざわざxcodeでfdescribeやfitを検索するのも面倒です。

## 本題
というわけで前置きが長くなりましたがスクリプト書きました。
（現在の開発スタイルではcommitの前にMakefileでコマンドラインからテスト実行する流れになっているので、Makefileから使えるようにします。）

Makefile

```
tests:
     checkF <テスト実行>
checkF:
     ./bin/checkF.sh <DIR1> <DIR2> ...
```

checkF.sh

```
pattern="fdescribe\|fcontext\|fit"

find $* -type f -name "*.swift" -print | xargs grep -rnw -e $pattern --color=auto
```

checkF.shの引数にディレクトリ（複数指定可能）を指定すると、対象ディレクトリ内にある（今回は）.swiftファイルをgrepして、対象文字列（fdescribeかfcontextかfit）を含むファイル名と行番号をセットで表示します。


　
##追記：
### Xcodeで特定文字列をgrepしてwarningにする方法
この記事書いてる途中で、これXcodeのRun Scriptに同じようなfind/grep書いて、それをwarningとして出せばxcode上でわかるしめっちゃ便利じゃね！？ってことに気づいたので同じ内容をxcodeのrun scriptに設定。

```
KEYWORDS="fdescribe|fcontext|fit"
echo "searching ${SRCROOT} for ${KEYWORDS}"
find SampleTests \( -name "*.swift" \) -print0 |\
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" |\
perl -p -e "s/($KEYWORDS)/ warning: \$1/"
```

<img width="698" alt="スクリーンショット 2016-11-10 23.35.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/9d61f3b5-1257-5007-95d8-a8dc18ba897d.png">


<img width="950" alt="スクリーンショット 2016-11-10 23.34.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/714168d5-2155-1d91-891e-af54200bdd0c.png">

スクリプトあんまり書いたことなかったので色々と勉強になりました。

参考：http://stackoverflow.com/questions/24183812/swift-warning-equivalent
LogentriesでBunyanログレベル毎にカラータグを付ける設定ファイル

Logentriesには Community Pack という JSON ベースで設定ファイルを定義できる共有機能があります。
Bunyanログにログレベルのカラータグを付けるための設定ファイルを作ったので共有しておきます。

https://gist.github.com/tilfin/9fa2aa756fbfe59128641cc0bf38ef50

1. Community から Import Community Pack を選んでダイアログを表示させる。
2. 上記のJSONをローカルに保存して読み込む。
3. ダイアログを進めて対象のログファイルを選択する。

参考情報）https://docs.logentries.com/docs/community-packs/
VagrantのSynced FoldersでNFSを利用するときにsudoのパスワード入力を省略する

`vagrant up`時に毎回パスワードを尋ねられるのが煩わしかったのでsudoersを設定したのですが初歩的なことに嵌っていたのでその備忘録。

# まとめ

- `/etc/sudoers`に追記するときはこれよりも後ろに記述すること!  
    ```
    %admin ALL = (ALL) ALL
    ```
- もしくは`/etc/sudoers.d/`の下に個別にファイルを作る!  


以下、失敗談込みの設定の流れ


# 0. 環境

- macOS Sierra 10.12.1
- Vagrant 1.8.6


# 1. sudoersに追記する

Macだとsudoersにこれを追加します。

```
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
```

編集には`sudo visudo`を使います。
sudoersを眺めていると"Cmnd alias specification"の項目があるので「ここに書けば良さそう」とここに上の4行を貼り付けました。

保存して意気揚々と`vagrant up`!
パスワードを尋ねられました……orz

OSの違いなのかと数日悪戦苦闘しながらsudoersを眺めていると"Cmnd alias specification"の下に"%admin ALL = (ALL) ALL"を見つけました。
ひょっとして……と思いつつ設定を"%admin ALL = (ALL) ALL"の下に移動させるとvagrant upがすんなり起動しました。
"%admin ALL=(root) NOPASSWD: 〜"が打ち消されていたんですね……


# 2. sudoers.dにファイルを作る

sudoersファイルだとまた同じミスを行っていまいそう かつ 他にも設定を入れると長くなってしまうので`/private/etc/sudoers.d/`にファイルを作ることにしました。
このディレクトリはsudoersの末尾で読み込まれます。
`#includedir /private/etc/sudoers.d` ←この部分です。
※先頭の#を消す必要はありません(コメントではありません)  

```bash
$ cat /private/etc/sudoers.d/vagrant-nfs
# NFS - Synced Folders - Vagrant by HashiCorp
# https://www.vagrantup.com/docs/synced-folders/nfs.html
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
```


# まとめ

- `/etc/sudoers`に追記するときはこれよりも後ろに記述すること!  
    ```
    %admin ALL = (ALL) ALL
    ```
- もしくは`/etc/sudoers.d/`の下に個別にファイルを作る!  

他の設定ファイルでもそうですが、記述順序には気をつけましょう……


# x. 参考

- [NFS - Synced Folders - Vagrant by HashiCorp](https://www.vagrantup.com/docs/synced-folders/nfs.html)
ScalaでSlack連携 その2

# slack apps

基本的には↓のURLの内容に従う。
https://api.slack.com/docs/oauth

# authorize url を作る

- client_id
- scope

が必要。

## client id 取得
Basic Information に書かれています。

![2016-11-10_23h06_40.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/6b5aebb6-5f25-efc6-3052-8fa568e1b043.jpeg)

## scope
https://api.slack.com/docs/oauth-scopes

## 作成

```scala
  def authorizeUrl(clientId: String, scope: String): String = {
    s"https://slack.com/oauth/pick_reflow?client_id=$clientId&scope=$scope"
  }
```

# access token url を作る

- code
- client_id
- client_secret

が必要

## code 取得
先程の authorize url にアクセスして許可するとリダイレクトURLに飛びます。
その際のリダイレクトurlにcodeが含まれているのでそちらを取得します。

## client secret 取得
client idを取得したときのページに有ります。

## 作成
```scala
  def mkAccessTokenUrl(code: String, clientId: String, clientSecret: String) = {
    s"https://slack.com/api/oauth.access?client_id=$clientId&client_secret=$clientSecret&code=$code"
  }
```

# Access Token を取得
access token urlにアクセスするとjsonが返ってくるのでそこから取得します。

```json
{"ok":true,"access_token":"<ここにアクセストークン>","scope":"<スコープ>","user_id":"<ユーザーID>","team_name":"<チーム名>,"team_id":"<チームID>"}
```

# ユーザー一覧を取得してみる

jsonからアクセストークンを取得して users.list にアクセスするとjsonが返ってくる。

```scala
  def getUserList(accessToken: String)(implicit wsClient: WSClient) = {
    val url = s"https://slack.com/api/users.list?token=$accessToken"
    wsClient.url(url)
      .get()
      .map(_.json)
  }
```

# メモ

```scala
  def exec[A](f: Future[A])(implicit wsClient: WSClient, system: ActorSystem) = {
    f
      .andThen { case _ => wsClient.close()}
      .andThen { case _ => system.terminate()}
  }
```