OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-x3.6プロジェクトにSDKBOXを導入してGoogleAnalyticsを入れる(iOS)

# 概要
cocos2d-x 3.6にSDKBOXからGoogleAnalyticsを入れる記事です。

通常のiosアプリ開発の場合、GoogleAnalytics導入記事が充実していると思いますがcocos2dxを使った場合の導入方法は少なかったので書きました。

## SDKBOXってなに？？
SDKBOXはCocos2d-xのプロジェクトに対してサポートしているSDKを簡単に追加できるプラグインです。今回はGoogleAnalyticsのみを導入します。
![image](https://qiita-image-store.s3.amazonaws.com/0/92552/746e521a-aa73-22e6-432a-5faa3476f699.png)
### 公式HP
http://www.cocos2d-x.org/sdkbox


# 手順

## 1. SDKBOOXのインストール
まずは公式ページの手順どおり、SDKBOXのインストールをしていきます。
http://www.cocos2d-x.org/sdkbox/googleanalytics

といっても、以下のコマンドを叩けば自動でインストールできます
`python -c "import urllib; s = urllib.urlopen('https://raw.githubusercontent.com/sdkbox-doc/en/master/install/install.py').read(); exec s"`

インストールが完了したらターミナルを再起動するのを忘れずに。sdkBoxがきちんとインストールされれば以下のようになります。
![スクリーンショット 2016-01-11 17.44.49.png](https://qiita-image-store.s3.amazonaws.com/0/92552/45d04634-d270-375f-078b-9260fff59f03.png)

## 2. GoogleAnalyticsのimport
最初に、自分の作成しているゲームプロジェクトに移動します。そこで以下のコマンドを叩きます

`sdkbox import googleanalytics`

きちんとインストールできれば、プロジェクトファイルの中に、sdkbox.framework 、PluginGoogleAnalytics.frameworkのフレームワークが追加されていると思います。

インストールが失敗する場合
`sdkbox clean`
を実行して再度やりなおせばうまくいくかもしれません。

## 3. Libraryの追加
インストール後は、Xcodeのプロジェクトの中にライブラリーを追加します。Linked　Frameworks and Librariesの中に
`AdSupport.framework
CoreData.framework
SystemConfiguration.framework`
を追加しましょう。

これでアプリをトラッキングする準備は整いました。

## 4. トラッキングコードの編集
2の手順でResourcesフォルダに追加されたであろう"sdkbox_config.json"を自分の作成したアカウントのトラッキングコードに書き換えます。

```json:sdkbox_confi.json
{
    "android": {
        "GoogleAnalytics": {
            "trackingCode": "UA-XXXXXXXX"
        }
    }, 
    "ios": {
        "GoogleAnalytics": {
            "trackingCode": "UA-XXXXXXXX"
        }
    }
}
```

## 5. コードに埋め込む
最後に、Appdelegete.cppのapplicationDidFinishLaunching()関数でGoogleAnalyticsの初期化を行い、トラッキングしたい部分にコードを埋め込んでいきましょう。


```cpp:AppDelegate.cpp
//ヘッダーファイルの追加
#include "PluginGoogleAnalytics/PluginGoogleAnalytics.h"

USING_NS_CC;
bool AppDelegate::applicationDidFinishLaunching() {
    
    //ここに追加
    sdkbox::PluginGoogleAnalytics::init();
    sdkbox::PluginGoogleAnalytics::startSession();
    
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::createWithRect("GameProject", Rect(0, 0, 640, 1136));
        director->setOpenGLView(glview);
    }
 
    /*  省略  */

    director->runWithScene(scene);

    return true;
}
```
### 埋め込み例
以下の例では、GameScene.cppの中にある、シーン遷移が完了した時に呼ばれる関数onEnterTransitionDidFinish()の中でログの送信を行っています。

```cpp:GameScene.cpp
void GameScene::onEnterTransitionDidFinish()
{
    // シーン遷移が完了したとき
    Layer::onEnterTransitionDidFinish();
    
    //ここのログを送信
    sdkbox::PluginGoogleAnalytics::logScreen("Main Scene");
    sdkbox::PluginGoogleAnalytics::dispatchHits();
    
}
```

リアルタイムで確認できれば成功です！

![スクリーンショット 2016-01-11 18.24.52.png](https://qiita-image-store.s3.amazonaws.com/0/92552/857f4eaf-e24a-3e3e-a78e-3b08a55e9d3e.png)



# まとめ

以前までは、GoogleAnalyticsを導入するのに、SDKファイルをダウンロードしてライブラリーに追加して・・・と面倒な手順が必要でしたが、現在はSDKBOXを利用すればとっても簡単に導入できます。
だれかの参考になれば嬉しいです。
Swiftはじめたい...その６ for文


# 今回はfor文です。
## 素直に使えそうです。

```swift:いろんなforの指定
// ふつーのスタイル
for ( var i = 0 ; i < 10 ; i++ ) {
    print(i)
}
// 括弧なしでもOK
for var i = 0 ; i < 10 ; i++ {
    print(i)
}
// 範囲指定
for var i in ( 0...9 ) {
    print(i)
}
// 範囲指定 <を使ってもいいらしい
for var i in ( 0..<10 ) {
    print(i)
}
// 括弧なしでもOK
for var i in 0..<10 {
    print(i)
}
```

+ カッコがなくてもいいんですね。

## var がなくても？？
+ ``var i in ``って書かなくてもエラーにならないんですね。 

```swift:var がなくてもエラーにならない
// varなしでもOKなの？
for i in 0..<10 {
    print(i)
}
```

+ この場合のiはvarなのでしょうか？

```swift:無指定
for i in 0..<10 {
    print(i)
    i++
}
```

+ エラーになりました。iは変更不可のlet扱いになるようです。

```
error: cannot pass immutable value to mutating operator: 'i' is a 'let' constant
```

## letを明示してみます。

```swift:let
for let i in 0..<10 {
    print(i)
}
```

```
'let' pattern cannot appear nested in an already immutable context
```
+ むむ、無指定だとlet扱いなのにletと書いたらダメなんですね。

## 配列とfor

```swift:配列とfor
// 配列
let arr = ["a", "b", "c"]
for var v in arr {
    print(v)
}
```

```
a
b
c
```

+ ふつーですね。

## 辞書とfor

+ これはいろいろ使いますね。

```swift:dictionary
// 辞書
var dic = ["a":1,"b":2,"c":3]
for d in dic {
    print(d)
}
// 辞書のkeyとvalue
for (key , value) in dic {
    print(key,"=",value)
}
// 辞書のキー
for key in dic.keys {
    print(key,"=",dic[key]!)
}
// 辞書の値でソート
for key in ( dic.keys.sort() {a,b in dic[a] < dic[b] } ) {
    print(key,"=",dic[key]!)
}
```

+ 結果です

```
("b", 2)
("a", 1)
("c", 3)

b = 2
a = 1
c = 3

b = 2
a = 1
c = 3

a = 1
b = 2
c = 3
```

+ perlっぽくもあり、JavaScriptっぽくもあるような。

## まとめ

+ これまで通り素直な感じですね。
+ 私は言うほどwhileって使わないので放置です。

# 今日はここまで

+ 次回はifを試したいと思います。
C++14 : 任意のタプルへ任意のファンクターを適用する apply( my_tuple, my_functor ) の作り方

# 要求

`std::tuple` による任意のユーザー定義のタプル `TUPLE_TYPE` 型の `tuple` オブジェクトに対し任意のユーザー定義のファンクター `FUNCTOR_TYPE` 型の `functor` オブジェクトを適用する `apply` 関数を作成したい。

## 期待される使用例

```cpp
auto tuple = std::make_tuple( 1, 2.3f, '4', "567" );
auto functor = []( auto value ){ std::cout << value << "\n"; };
apply( tuple, functor ); // <-- これを作りたい
```

## 期待される結果

この apply に期待される結果として次の出力を得たい。

```
1
2.3
4
567
```

# そのような `apply` の作り方

```cpp
#include <cstddef>
#include <tuple>
#include <utility>

template < typename TUPLE_TYPE, typename FUNCTOR_TYPE, std::size_t ... INDICES >
void apply( TUPLE_TYPE&& tuple, FUNCTOR_TYPE&& functor, std::index_sequence< INDICES ... > )
{
  using swallow = int[];
  (void) swallow { 1, ( functor( std::get< INDICES >( std::forward< TUPLE_TYPE >( tuple ) ) ), void(), int {} ) ... };
}

template < typename TUPLE_TYPE, typename FUNCTOR_TYPE >
void apply( TUPLE_TYPE&& tuple, FUNCTOR_TYPE&& functor )
{
  constexpr std::size_t SIZE = std::tuple_size< std::remove_reference_t< TUPLE_TYPE > >::value;
  apply( std::forward< TUPLE_TYPE >( tuple ), std::forward< FUNCTOR_TYPE >( functor ), std::make_index_sequence< SIZE >{ } );
}
```

## 使い方

```cpp
#include <iostream>

auto main() -> int
{
  apply
  ( std::make_tuple( 1, 2.3f, '4', "567" )
  , []( auto value ) { std::cout << value << "\n"; }
  );
}
```

## 実行結果

```
1
2.3
4
567
```

## Wandbox

- http://melpon.org/wandbox/permlink/ceeFpSkMnjNyMvDB

# ポイント

- C++14 の機能 : `std::make_index_sequence`, `std::remove_reference_t`
- C++11 の機能 : variadic-templates, r-value-references, `constexpr`, `auto`, `std::tuple_size`, `std::forward`

## トリック

- `apple` の `swallow` 型（つまり `int[]` 型）のブレース初期化により、`functor( std::get< INDEX >( tuple ) )` 的な動作について `INDEX` を `INDICES ...` について一挙に定義する。
    - この時、C++ では `void[]` 型では扱えないので `int[]` としている。
        - よって、`int` 型を作らなくてはならないから `swallow` で初期化される個々の要素は `, int{ }` （カンマ演算子＋`int`オブジェクトの生成）を付加し、結果が `int` 型となるようにしている。
            - このトリックのために `INDICES` が展開された際に完全に `f()` と `, int { }` だけでは `f()` が `int` を返すと困るので間に `, void()` も挟む。
    - `swallow` は生成された後にそれ自体は `apply` の中では使わないのでコンパイラーが warning を出す。そこで `(void)` にキャストしておくことで不要な警告が出で煩わされないようにしている。
    - 空っぽの `int[] { } ` を定義しないためにダミーで先頭に `1` を入れている。

# Reference

- [StackExchange - CODE REVIEW - std::tuple foreach implementation - Answer ( Louis Dionne )](http://codereview.stackexchange.com/questions/51407/stdtuple-foreach-implementation?answertab=active#tab-top)
    - 今回の記事はこの Answer を元にしています。
TotalTerminal が死んだので Alfred Workflow で代替した話

## 概要

- [TotalTerminal](http://totalterminal.binaryage.com/) というショートカットで素早く、Terminal.app を閉じたり開いたすることができるアプリを使っていた。
- But「El Captain」にアップグレードしたら動かなくなってしもうた。
- 調べてみるともうあまりactiveには開発してないらしく、しかも「El captain」で動かすためには、Macの設定を変えないといけないぽい。 
- http://totalterminal.binaryage.com/#sip

## 対応

- 下記参考URLのコメント欄に [Alfred](https://www.alfredapp.com/)の有償版についている、「Workflow」という機能を使うとTotalTerminalと同様のことができるらしい事があったので、まんま同じ事をする。

### 1. Alfredの Workflowをダウンロード

- コメント欄で配布してくれているWorkflowのファイルをDL
- [Workflowダウンロード](https://dl.dropboxusercontent.com/u/333136/Terminal.alfredworkflow)

### 2. Hotkeyの設定

- ダウンロードして、ダブルクリックすると、Alfredの設定画面が立ち上がる。
 
<img width="889" alt="スクリーンショット 2016-01-11 18.04.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/1843/248166ee-c7ea-56d5-196d-28d49ed5d3b2.png">

- Hotkey をダブルクリックして、ショートカットキーを割り当てる。(僕は Ctrl + Q )にしてます。

<img width="400" alt="スクリーンショット 2016-01-11 18.04.46.png" src="https://dl.dropboxusercontent.com/spa/ghyn87yb4ejn5yy/r9jyabqb.png">

これで終わり。楽すぎる。これで「Ctrl + Q」を押すと閉じたり開いたりのトグルになる便利。

## まとめ

- Alfred Workflow お金払ってるなら、もっといろんな事に使ってみようと思った。
- 使い勝手がほとんど変わらない代替案が見つかってよかった。
- 参考記事の作者さん、コメント欄でWorkoflow配布してくれた方に御礼申し上げます。多謝。

## 参考

- [El CapitanでTotalTerminalが動かないならAppleScriptで代用すればいいじゃない?] (http://www.tokoro.me/2015/10/05/el-capitain-totalterminal/)
ES2015で変数名を取得する

# 1: `Function#name`を使う方法

ES2015では、関数式で宣言した関数が無名関数の場合、代入された変数と同じ名前になる。なので無名関数を変数に代入して、`Function#name`で取得すれば変数名の文字列が取得できる。

 * 参考：[The names of functions in ES6](http://www.2ality.com/2015/09/function-names-es6.html)

```js:無名関数を突っ込んでFunction#nameで取得

var v1 = () => {}
console.log(v1.name);	//v1
```

宣言時の変数名のみが関数名となり、別の変数に再代入しても関数名は変わらない。

```js

var tmp = v1;
console.log(tmp.name);	//v1
```

この特徴を使うとある程度汎用的な変数名取得の仕組みが作れる。

```js:変数名を取得するUtil.getValName()

class Util{
	static getValName(val){
	  if(typeof val !== "function")throw TypeError();
		return val.name;
	}
}

//どこかで宣言された変数
var v2 = "hoge";

//...

//変数名を取得したい時
var v2_val = v2;	//元の変数の値を一旦取っておく
var v2 = () => {}	//無名関数を突っ込む;Babelだとvarで再宣言が必要
//この辺を関数でまとめると、変数->引数になった時点で変数名が変わるのでまとめられない

var s = Util.getValName(v2)
console.log(`${s}:${v2_val}`) //v2:hoge
```


ただし、この方法は現時点(2016-01-11)では[Babelなどごく一部の環境](https://kangax.github.io/compat-table/es6/#test-function_name_property_variables_(function))のみ。ES2015の`Function#name`は今一実装が進んでいない。

# 2: `Class.name`を使う方法

```js:クラス式を使ってClass.nameで取得
var v2 = class {}
console.log(v2.name);	//v2
```

1. の応用。

現時点では[Edge13のみ対応](https://kangax.github.io/compat-table/es6/#test-function_name_property_variables_(class))。

# 3: `for(let s in {var})`を使う方法

```js
var v3;
for(let s in {v3}){console.log(s)}	//v3
```

オブジェクトのキー・バリューとして登録して取り出す方法。昔ながらのやり方だが、ES2015では省略記法が使える。

# 4: `Object.keys({var})[0]` を使う方法(追記)

```js
var v4;
console.log(Object.keys({v4})[0]);    //v4
```

こちらの方が直接変数を取り出せるので便利。これも省略記法の活用。
UKキーボードでの特殊入力メモ


![MLA22B.jpeg](https://qiita-image-store.s3.amazonaws.com/0/15786/b1580401-9c53-b98d-f0ac-97fc74b0206d.jpeg "MLA22B.jpeg")

|入力文字|入力方法|
|:-----|:------|
|#(シャープ)|⌥ + 3|
|^(キャレット)|⇧ + ⌥ + I|

⇧: shiftキー
⌥: optionキー

なんかあったら追記していきます。
サーバーサイドSwift "Perfect"に触れてみた



サーバサイドSwiftの[Perfect](https://github.com/PerfectlySoft/Perfect)を試してみました。
[Dockerfile](http://blog.holidayworking.org)があったのでこれを使います。

こちらのDockerfileはPerfectに同梱されている"URL Routing"というサンプルが起動するようになっているので

```
$ docker run -d -p 8181:8181 holidayworking/perfect
```

としてDocker上で起動したら「htt://(コンテナのIPアドレス):8181/foo/bar/baz」とアクセスすると
リクエスト内容がエコーされます。
「bar」の部分は任意の文字に変更できます。
別のサンプルも試してみます。

同梱されているサンプルは同時に動かせないようなので"URL Routing"と入れ替える形で"Tap Tracker"というサンプルを動かしてみようと思います。
まずは先ほどまで使わせて頂いた[Dockerfile](https://github.com/holidayworking/docker-perfect)を編集して使います。

```Dockerfile
#RUN mkdir PerfectLibraries && cd PerfectLibraries && ln -s /Perfect/Examples/URL\ Routing/URLRouting.so .
RUN mkdir PerfectLibraries && cd PerfectLibraries && ln -s /Perfect/Examples/Tap\ Tracker/TapTrackerServer.so     . && cp /Perfect/Examples/Tap\ Tracker/TapTracker.mustache /webroot/
```

URL Routingの代わりにTap Trackerをロードするようにします。
またTapTracker.mustacheを/webrootにコピーしないと動作しないので併せてコピーしておきます。

```
$ docker build -t hoge/perfect .
$ docker run -d -p 8181:8181 hoge/perfect
```
上記のようにイメージを作成して起動しておきます。

TapTrackerのクライアント側はアプリが必要なので
[PefectのGitHub](https://github.com/PerfectlySoft/Perfect)から落としてきます。
Examples/Examples.xcworkspaceをXCodeで開きます。
Tap Tracker のViewController.swiftにホスト名とポート番号の指定があるので環境に合わせて変更します。

```ViewController.swift
let END_POINT_HOST = "localhost"
let END_POINT_PORT = 8181
```

上記のEND_POINT_HOSTをlocalhost以外にした場合はATSで引っかかるのでinfo.plistファイルを編集して許可しておきましょう。
実行してみます。

![Simulator Screen Shot 2016.01.11 17.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/77573/37cb27e9-8514-ff79-e014-1766a6cbc533.png "Simulator Screen Shot 2016.01.11 17.56.44.png")


ボタンをタップするとタップした位置の地図に遷移します。

![Simulator Screen Shot 2016.01.11 17.56.51.png](https://qiita-image-store.s3.amazonaws.com/0/77573/96664978-714e-1a9b-b3ab-6db4bf640a2d.png "Simulator Screen Shot 2016.01.11 17.56.51.png")


シミュレータで動かしたのでマンハッタンになっています。

さてさて、Serverside Swift、当面はモバイルアプリ向けのRESTサービスを提供するアプリケーションサーバとして注力していくそうなのですが、どうなんでしょうかね。楽しみです。
CentOSにnode.js+Express環境を構築して動作を試してみるまで


# 今回の内容
いまさらながらMEANスタックで遊んでみたいと思い、まずは手始めにNode.jsとExpressを入れてみたときの備忘録的なメモ。まずはExpressの公式ページに載っているサンプルを動かしてみた。

# 前提となる環境
今回使った環境は以下のとおり。
* CentOS 6.7 64bit (Vagrant/VirtualBox上に構築したVM)

# 今回導入するもの
* node.js: サーバサイドJavaScriptの実行環境。
* npm: node.jpのパッケージモジュールを管理するためのツール。
* Express: Node.jsで動作するMVCフレームワーク。

# node.jsをCentOSにインストール
* EPELからnode.jsの0.10.x系をインストールできる。
   - お手軽にインストールできるのがメリット。
   - ただし、割と古いバージョンのようなので、最新バージョンを入れたい場合にはソースコードからインストールする必要がある。
## EPELリポジトリを導入
```
$ sudo yum install epel-release
```
## yumでnode.jsとnpmをインストール
```
$ sudo yum install nodejs mpm --enablerepo=epel
$ node -v  # バージョン確認
v0.10.36
$ npm -v  # バージョン確認
1.3.6
```

# Express環境の構築とサンプル実行
## 下準備
* アプリケーション用のディレクトリ用意
```
$ mkdir myapp
$ cd myapp
```
* アプリケーションのnode.jsのモジュール管理の雛形作成
```
$ npm init
```
```
$ entry pont: (index.js) # アプリケーションのメインファイル名app.jsと入力してEnter
```
  - 質問に答えていくとこのアプリケーションのモジュール管理の雛形となるpackage.jsonが生成される。
  - 今回の場合には基本的にEnter連打で問題ないが、entry pointはアプリケーションのメインファイル名を上記の通り指定する。)

## Expressのインストール
npmでExpressモジュールをインストールする。
```
$ npm install express --save
```
  - --saveオプションを付けることで、package.jsonにexpressの情報が追加される。

## ExpressのHello Worldサンプルの実行
Expressの公式ページにあるHello worldサンプルを実行する。
* 先ほど用意したディレクトリにapp.jsという名前で以下の内容のアプリケーションファイルを作成する。

```js:app.js
var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
})
```
* 上記のアプリケーションを実行する。

```
$ node app.js
Example app listening on port 3000!
```

* 実行後にWebブラウザ上で以下のURLにアクセスすると「Hello world!」と表示されれば成功。

```
http://(ホスト名):3000/
```

# 参考にした情報
* http://expressjs.com/
  - こちらの公式ページにあるサンプルを実行
* http://www.atmarkit.co.jp/ait/articles/1412/01/news041.html
javascript側からコントローラーのアクションに値を渡して実行する(自分用メモ)


初歩的なことですが、初めての試みだったのでメモ。

例えば、user_controllerのhogeアクションをjavascript側から実行したい。ルーティングは以下のように設定されているとする。

```rb:routes.rb
get 'hoge' => 'user#hoge'
```

このアクションを実行するのは簡単で、方法はいくつかあるが例えばjqueryを使う場合、

```js
$.ajax(url: '/hoge', type: "GET");
```
最低限これだけでいける。当然パラメータを渡すことも可能で、"hello world"という文字列を渡したい場合、

```js
$.ajax(url: '/hoge', type: "GET", data:{text:"hello world"});
```

こんな感じで渡すことができる。コントローラ側での受け取りはいつも通りで、下記のように受け取る。

```rb
def hoge
    text = params.require(:text)

```

もっとベターな方法があると思うので、アドバイスもらえるとうれしいです。
Let's encryptをApache on Ubuntuで試してみた

待ちに待った割にはすっかり忘れていたのですが、Let's EncryptがBetaで始まっていたので試しに使ってみました。

## clone
[公式ドキュメント](https://community.letsencrypt.org/t/quick-start-guide/1631)にしたがってやってみました。

```bash:
$ git clone https://github.com/letsencrypt/letsencrypt
```

## 証明書の作成
上記ドキュメントによると「Apache HTTP Server」が「最近のDebian系OS」で動いている場合は

```bash:
$ cd letsencrypt
$ ./letsencrypt-auto --apache
```

だけでいいようなのですが…。

```bash:
The apache plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('Unable to parse runtime variables',)
```

と言われてしまったので諦めました…。

正直に必要なことを指定して実行します。

```bash:
./letsencrypt-auto certonly \
           -d hal.mu \
           --webroot \
           -w /home/xx/www/hal.mu \
           -m info@hal.mu
```

すると、規約の承認画面が表示され、

![スクリーンショット 2016-01-11 오후 5.29.54.png](https://qiita-image-store.s3.amazonaws.com/0/108192/2580e15f-861b-3adf-2c8e-de4a4c19ebdf.png)


Agreeすると

```txt:
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to info@hal.mu.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/hal.mu/fullchain.pem. Your cert will expire
   on 2016-04-10. To obtain a new version of the certificate in the
   future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

と表示され

```bash:
ls /etc/letsencrypt/live/hal.mu/
cert.pem  chain.pem  fullchain.pem  privkey.pem
```

のように無事作成されました。


## Apacheへの設定
後はお決まり、Apacheの設定。httpd.confは使用していないので/etc/apache2/sites-available/default-ssl
に

```conf:/etc/apache2/sites-available/default-ssl
        SSLEngine on
        SSLCertificateFile    /etc/letsencrypt/live/hal.mu/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/hal.mu/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/hal.mu/chain.pem
```

のように設定。あとはapacheを再起動してあげると無事に接続できました。

![スクリーンショット 2016-01-11 오후 5.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/108192/f2a4cc68-d513-d08e-c120-0399ef91e8c3.png)

このドメインで証明書が作成できたので、各種フォームをGoogleDriveから内製に移行しようと思います。$›
`npm install` が殺される on 低容量メモリ環境

Digital Ocean の安いやつで試しに node/npm をインストールした時に起こるこれと戦う:

~~~~~~~~~~~~~~~bash
root@ubuntu-512mb-nyc3-01:~/k-ui.jp# npm install
Killed
root@ubuntu-512mb-nyc3-01:~/k-ui.jp# echo $?
137
~~~~~~~~~~~~~~~

原因
--------------

`/var/log/syslog` を確認すると、OOM で殺されているのが分かる。メモリ 512 MB ではダメらしい。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash
root@ubuntu-512mb-nyc3-01:~/k-ui.jp# tail /var/log/syslog
...
Jan 11 03:04:14 ubuntu-512mb-nyc3-01 kernel: [  684.969707] Out of memory: Kill process 2282 (npm) score 882 or sacrifice child
Jan 11 03:04:14 ubuntu-512mb-nyc3-01 kernel: [  684.969927] Killed process 2282 (npm) total-vm:1614964kB, anon-rss:454708kB, file-rss:0kB
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


対処法
------

`npm install` を省メモリ化するアプローチはまだできないっぽいので、スワップ領域を追加するしか無さそう。

terraform を使っているので、下記のようなスクリプトを Droplet 作成時に適応するようにした:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash:attach-swapfile.bash
#!/bin/bash
set -eux

# attach swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile none swap sw 0 0" >> /etc/fstab

# swappiness
echo "vm.swappiness = 10" > /etc/sysctl.d/10-swappiness.conf
sysctl --load /etc/sysctl.d/10-swappiness.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

このスクリプトでは 2GB のスワップ領域を追加している。ついでに swappiness も設定しているけれど、要らないかも。

確認する:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash
$ free -h | grep ^Swap
Swap:         2.0G       136K       2.0G
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

これで `npm install` は殺されなくなる。。。が、依存パッケージが増えたら 2G でも足らなくなることがありそうな気もする。

おわり。
GNU sort で git ls-remote 出力結果をバージョン番号でソートする


たとえば `git ls-remote --tags` の出力結果をバージョン番号で降順ソートする際、普通に `sort` コマンドにパイプした場合、デフォルトのソートが辞書順のためバージョン番号的には古い要素が新しい要素より前に来てしまうことがある。

```bash
$ git ls-remote --tags git@github.com:nodejs/node | sort -t '/' -k 3 -r
（中略）
51ada433640fd646a9496fd0e8cdc946ed86a06c	refs/tags/v0.2.0
ffc1395af0d5495be442eaefd9ce4dd6561c6dba	refs/tags/v0.12.9^{}
（中略）
```

こんな場合は `-V` オプションをつけてあげれば大丈夫。

```bash
$ man sort
（中略）
       -V, --version-sort
              natural sort of (version) numbers within text
（中略）
```

どうやらマイナーバージョンが含まれたバージョニングにおいても適切にソートしてくれるらしい。
実際に適用してみるとこんな感じ。

```bash
$ git ls-remote --tags git@github.com:nodejs/node | sort -t '/' -k 3 -rV
（中略）
8192b251d11e99c207e2f6ca4db19d7123d82dba	refs/tags/v1.0.0
ffc1395af0d5495be442eaefd9ce4dd6561c6dba	refs/tags/v0.12.9^{}
（中略）
```

ちゃんと0系の最新が1系の直後にソートされるようになった。

---

このオプション、Mac に標準で含まれてる BSD sort だと利用できなかった。
Mac でも利用したい場合は coreutils を Homebrew で入れてあげればOK。

```bash
$ brew install coreutils
```

プレフィックス系のオプション何もつけない場合 `gsort` コマンドとしてインストールされる。

```bash
$ git ls-remote --tags git@github.com:nodejs/node | gsort -t '/' -k 3 -Vr
```

もちろんインストール時にプレフィックス指定するなり、エイリアス貼るなりすれば `sort` コマンドそのままで GNU 版を利用することができるようになると思う。
tmux-powerlineを導入した時にステータスラインが改行されまくる

tmux-powerline を導入したものの、ステータスラインがひたすら改行されて　フゴォってなった人へのTips。

https://github.com/erikw/tmux-powerline/commit/e8ff307dcf68adf6cbd363083f44e3e4ebcd1bf9

とか

http://kazuph.hateblo.jp/entry/2013/03/02/181009

とか

わりとiTerm向けの情報は出てくる。

でも、TeraTerm　で解決した話がなかなかない。（TeraTerm で叩いてるユーザ少ないのか。。。)

で、根本的な原因は何かというと、

デフォルトテーマのステータスバーの区切り文字が、マルチバイトの厄介な文字になっていること。

``` tmux-powerline/themes/defaults.sh
if patched_font_in_use; then
  TMUX_POWERLINE_SEPARATOR_LEFT_BOLD="⮂"
  TMUX_POWERLINE_SEPARATOR_LEFT_THIN="⮃"
  TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD="⮀"
  TMUX_POWERLINE_SEPARATOR_RIGHT_THIN="⮁"
else
  TMUX_POWERLINE_SEPARATOR_LEFT_BOLD="◀"
  TMUX_POWERLINE_SEPARATOR_LEFT_THIN="❮"
  TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD="▶"
  TMUX_POWERLINE_SEPARATOR_RIGHT_THIN="❯"
fi
```
カッコよさ重視なのだろうけど、自分もこれでだいぶはまっていた。

自分は基本的にリモートで叩くので、使用するコンソールに依存するという環境はなかなか厳しいので、割り切って以下にしている。

``` tmux-powerline/themes/defaults.sh
if patched_font_in_use; then
  TMUX_POWERLINE_SEPARATOR_LEFT_BOLD=""
  TMUX_POWERLINE_SEPARATOR_LEFT_THIN=""
  TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD=""
  TMUX_POWERLINE_SEPARATOR_RIGHT_THIN=""
else
  TMUX_POWERLINE_SEPARATOR_LEFT_BOLD=""
  TMUX_POWERLINE_SEPARATOR_LEFT_THIN=""
  TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD=""
  TMUX_POWERLINE_SEPARATOR_RIGHT_THIN=""
fi
```

カコヨサは犠牲になるが。
Groongaで学ぶ全文検索 2015-12-18



# 今日のお題：ドリルダウン（ファセット検索)

Groongaで学ぶ全検索12/18に参加した際のメモです。
https://groonga.doorkeeper.jp/events/35021


## ドリルダウンとは

検索の補助に使う集計機能が全文検索の文脈でのドリルダウン

例)
ショッピングサイトで「TV」で検索すると10,000件の商品がヒットする
更にヒットした商品をカテゴリーなどで絞り込む機能などに利用できる。


家電(8,000件) 
書籍(書籍1,000件) 1,000
XXX 100
YYY
.
.
.


* クリックで絞り込める
（全文検索の場合にはキーワードを入れる必要がある)

* 0件の時は出さないなどができるのでユーザーががっかりしない

→わかりやすいユーザーインターフェースを実現できる。

## Groongaでのドリルダウンの仕組み

例えば下記のような商品一覧があるとき
Groongaでは列単位でデータを格納する事でドリルダウンを高速化している。


|No| 名前 | 大カテゴリー | 中カテゴリ |
|:-----------|:-----------|:------------|:------------|
|1| ブラビア  | 家電 |  コンピュータ        |
|2| Groonga入門     |      書籍 | コンピュータ       |
|3| ルル     |      薬 |     　   |
|4|今日の料理     |      書籍 |   　 料理   |



例)

行単位でデータを格納した場合大カテゴリーが書籍の件数を調べるには
各商品毎にバラバラに格納されているため、ハードディスクの様々な場所にアクセスする必要があるが
列単位でデータを格納した場合には、大カテゴリーの件数をカウントすれば良いので連続したデータにアクセスできるため高速に検索できる。

A.行単位でデータを格納した場合

```
「ブラビア、家電、コンピュータ」「Groonga入門、書籍、コンピュータ」...
```

B.列単位でデータを格納した場合

```
大カテゴリー：「家電、書籍、薬、書籍」
中カテゴリ：「コンピュータ、コンピュータ、料理」
```

## 多段階のドリルダウン

例)


書籍
→コンピュータ
→料理

## その他メモ

* GroongaはN個のドリルダウンが可能
* 平均、最大値、最小値、合計なども計算できる
* 対象が何件かを格納している結果セットはKey,Valueのハッシュテーブルで保持,valueはサイズが固定長のバッファなので分類などの情報も格納できる
* OLAP(online analytical processing)などオンラインの分析処理などが求められるので、今後は集計処理を速くすることも必要。
Deviseでパスワードリセット用メールが全てid=1のユーザーに送られてしまう

#パスワードのリセットがうまくいかない

WebBrickのログみたらこんななってた

```
  User Load (0.2ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."reset_password_token" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["reset_password_token", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]]
```

う、うん。。。
とりあえず時間ないので以下の方法で対応した。

#controllerを生成
```
rails g devise:controllers users
```

#`app/controllers/users/passwords_controller.rb`を編集
```rb:passwords_controller.rb
def create
    # self.resource = resource_class.send_reset_password_instructions(resource_params)
    self.resource = User.where(:email => resource_params['email']).send_reset_password_instructions(resource_params)


    logger.debug self.resource.inspect
    yield resource if block_given?

    if successfully_sent?(resource)
      respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))
    else
      respond_with(resource)
    end
  end

```
これで一応うまくいったんだけど自分でこう書かないとパスワードリセットできないのかな....
c++ builder > sound > 音が鳴らない環境 / 鳴る環境 > Win32\Debug以下にある時に鳴らない

```txt:環境
- 実装 : C++ Builder XE4
- 動作 : Windows 7pro
```

http://qiita.com/7of9/items/8da2ff7bc4bafd0c66f7
にて実装していたPlaySound()が鳴らない問題。

鳴る環境と、鳴らない環境が分かった。

- 鳴らない環境 > Win32\Debug以下にあるexeファイル使用時
- 鳴る環境 > 同じexeファイルを他の場所に移した時

これまで遭遇したことのない症状だ。

IDEのバグか?

PlaySound()もMediaPlayer使用時も両方とも音が鳴る環境が見つかった

```Unit1.cpp
void __fastcall TForm1::Button3Click(TObject *Sender)
{
	wchar_t mywin[255];
	GetWindowsDirectory(mywin, MAX_PATH);
	ShellExecute(this->Handle, L"open", L"control", L"mmsys.cpl,,0", mywin, SW_SHOWNORMAL);
	Sleep(1000);

	PlaySound(L"C:\\WINDOWS\\Media\\chord.wav", NULL, SND_ASYNC);

	Sleep(1000);

	MediaPlayer1->FileName = L"C:\\WINDOWS\\Media\\chord.wav";
	MediaPlayer1->Open();
	MediaPlayer1->Play();
}
//---------------------------------------------------------------------------
```

上記の問題により「デバッグ時には音は鳴らない」

## 解決策2 

Win32\Debug以下に.exeファイルがある場合、「名前を変更すれば」鳴るようになった。

例としてProject1.exeをProject1b.exeにする。

ただし、こちらもデバッグ時には音が鳴らない。
[swift-iOS]タップした座標の取得（備忘録）

どうってことでもないですが、大事なことなので忘れないよう、書き留めときます


```swift:ViewController.swift

class ViewController: UIViewController {
var tapLocation: CGPoint = CGPoint()

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// タッチイベントを取得する
let touch = touches.first
// タップした座標を取得する
tapLocation = touch!.locationInView(self.view)
}

}
```
VMware Fusion7上のWin8.1をWin10にしたらハマった件

# 状況
MacBookAir(Yosemite 10.10.5)にVMware Fusion7を入れてWindows8.1を動かしていました。基本的にはMacで足りてるんですが、時々Winじゃないと動かないものを扱わなきゃいけないので。
僕は意外とWin8系嫌いじゃないんですけど、まぁせっかくだし(それに仕事用というより半分趣味でWindows入れてるだけだし)アップデートしてやるか、と。

# 先人の知恵
そこで情報収集。
ネットを見てると、どうやらFusion側の問題ですんなりとアップグレードできないらしい。

-[VMware FusionにインストールしたWindows 8.1で「Windows 10を入手する」アプリが表示されない原因：解決](http://blog.dreamhive.co.jp/yama/13201.html)
-[VMware Fusion 7上のWindows 8.1をWindows 10にアップデートする](http://history.hatenablog.com/entry/2015/07/31/234648)
-[VMware Fusion上のWindows8からWindows10へのアップグレードで大苦戦](http://www.little-spring-web.com/tool/vmware_win10_upg/)

どうやら問題点は大きく2つで、

1. Fusion内のWinでアップグレードのおすすめが降ってこない
2. おすすめが出ても、誘導に従って行う単純なアップグレードじゃダメ→ISOファイルからアップグレードすれば成功

ということらしい。
僕の場合、おすすめは出てきたので前者の問題は未体験ですが、後者の方は確かにその通りでした(1回、素直に誘導に従ってインストーラを動かしたけどダメでした)。

で、上で紹介した記事の通り、MSのサイトからISOファイルをダウンロードしてきて、それをマウントして実行したらWin10が起動するようになりました。
で、ここからが問題。

# VMware Toolsの再インストールができない
紹介サイトでは、「VMware Toolsを再インストールしましょう」と言っているけど、これができなかった。

```
VMware Tools.msiがアクセスできないネットワークリソースにありますうんたらかんたら……(うろ覚え)
```
というポップアップメッセージが出てきてまったくダメ。
管理者権限から起動を選んでもダメ。
こりゃもう仕方ねぇからアンスコして再インスコしかないな、と思ったけど、アンスコするために`C:Program Files/VMware/VMware Tools`ディレクトリを削除しようとおもったら「他のプログラムが使用中」とかでそれもできねぇ。
散々探し回ったあげく、こんなドキュメントを発見。

-[VMware Fusion での VMware Tools のアンインストールと手動インストール (2075276)](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2075276)
-[コマンド ラインを使用した Windows 仮想マシンでの VMware Tools のアンインストール (2097320)](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2097320)

# VMware Toolsのアンスコ→インスコ方法
僕は後者のコマンドプロンプトを使う方法でやりました。
その時の手順を簡単に書き記しておきます。

1. Fusionのメニューバーから`仮想マシン>VMware Toolsの再インストール`実行
2. すると、Dドライブあたりに仮想ディスクがマウントされます
3. Win上で、cmd(コマンドプロンプト)を管理者権限で起動
4. `D:`とタイプして実行(ディレクトリ移動)
    5. `dir`とかやれば今いるディレクトリの中身が見えるので確認するとよい
5. `setup /c`とタイプして実行(これでアンスコ完了)
6. Winを再起動
7. Fusionのメニューバーから`仮想マシン>VMware Toolsの再インストール`実行(こうすると成功する！！)
8. 僕の場合は、ここでディスプレイの解像度が正常に戻りました。
8. 念のためWin再起動
9. 完了

こんな感じです。
途中、アンスコできないときはレジストリをいじれ、みたいな解説も見つけたんで参考までに載せておきます。

-[Unable to upgrade existing VMware Tools (1001354)](http://kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=1001354)

この問題、Fusion7側で対応してくれないんですかねぇ。。。

ということで、以上、Fusion7上Win10アップグレードerへの助けになるかな(?)記事でした。チャオ！
【iOS - Swift】UISearchBarの背景部分を透過させる方法

# UISearchBarの背景部分を透過させるコード

UISearchBarのサブビューまで潜ってUISearchBarBackground（UIImageViewのサブクラス）とUISearchBarTextField（UITextFieldのサブクラス）を直接いじってやるやり方。

```swift
for subview in searchBar.subviews {
    for secondSubView in subview.subviews {
        // 背景部分
        if let imgview = secondSubView as? UIImageView {
            imgview.image = nil
        }
        // テキストフィールド部分
        if let txtview = secondSubView as? UITextField {
            txtview.backgroundColor = UIColor.whiteColor()
        }
    }
}
```

# どのタイミングでこのコードを走らせるか

まず、アプリ起動時からUISearchBarの背景部分を透過したい場合に、`viewDidLoad()`や`viewWillAppear()`内に記述するというのは__避けるべき__だと思う。

これはUISearchBarに対してAutoLayoutを使用している場合に、`viewDidLoad()`および`viewWillAppear()`の時点ではレイアウト制約が反映されていないため、その影響か、UISearchBarのサブビューであるUISearchBarBackgroundとUISearchBarTextFieldに対して再設定を行っても、ちゃんと効いてくれない。

制約が実際に反映されるのは、`viewDidLayoutSubviews()`の時点なので、例えばこのタイミングで透過処理を行えばよい。

```swift
override fun viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // 透過処理（先のコードと一緒）    
    for subview in searchBar.subviews {
        for secondSubView in subview.subviews {
            if let imgview = secondSubView as? UIImageView {
                imgview.image = nil
            }
            if let txtview = secondSubView as? UITextField {
                txtview.backgroundColor = UIColor.whiteColor()
            }
        }
    }
}
```
c++ builder XE4, 10.2 Tokyo > sound >コントロールパネルのサウンドタブを表示する

```txt:動作確認
C++ Builder XE4
  - Windows 7 pro
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
  - Windows 10 pro バージョン 1709
```

##やりたいこと
音量を可視化したい。

Windows7にて右下のvolumeを表示すれば音量は見えるが、自作アプリ実行時にはvolumeは閉じてしまう。

## 実装

参考1 http://www.greatis.com/delphicb/tips/lib/system-volumecontrol.html
参考2 http://stackoverflow.com/questions/4314217/how-to-open-microphone-properties-window/4314761#4314761

参考1のsndvol32.exeはWin7では見当たらないようだ。
参考2を足して(表示タブの番号を1から0に変更し)

```Unit1.cpp
	wchar_t mywin[255];
	GetWindowsDirectory(mywin, MAX_PATH);
	ShellExecute(this->Handle, L"open", L"control", L"mmsys.cpl,,0", mywin, SW_SHOWNORMAL);
	Sleep(1000);

	Beep(2000, 300);
```

これでBeep()処理する前に以下のウィンドウが表示され、その右側のバーで音量の大きさが可視化される。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d6856d3a-d0ba-179b-b2d1-24d363263677.png)
CS-Cart: ステータスを表示だけする方法(選択・変更できないようにする)

CS-Cartで「有効」「無効」などのステータスを選択するコンポーネントに`common/select_popup.tpl`というものがある。おなじみの下の図のようなものだ。

<img width="193" alt="商品____商品_-_管理画面.png" class="img-thumbnail" src="https://qiita-image-store.s3.amazonaws.com/0/889/fa423a90-73d2-d4e3-7fa9-3c78f8308f84.png">

このコンポーネントの引数に、`non_editable=true`を加えると、選択できないようにしつつ、現状のステータスの文言を出すようにすることができる。

```smarty
{include file="common/select_popup.tpl" status=$product.status non_editable=true}
```

<img width="115" alt="商品____商品_-_管理画面.png" class="img-thumbnail" src="https://qiita-image-store.s3.amazonaws.com/0/889/b6601149-0085-12d2-ba69-e5931c3d746b.png">
Intellij,WebStormなどでKarmaプラグインに変更が反映されない。


## 現象
Intellij,WebStormなどで利用するKarmaプラグインを使っていると、テストファイルの変更が反映されない。
手動でKarma Serverを再起動すると変更は反映される。

Karma-browserifyを利用しているときに発生する。

未確認だが、karma-jspmなどでも発生する模様。


## 修正は難しいのかも

jetbrainsのIssuesを見るかぎり、2014年から問題は報告されているが、治っていない。
これは、バグというより仕様かもしれなない。

このため、karma-browserifyなどを利用する場合は、以下の回避策をとるほうがよい。

## 回避策

karmaプラグインの`intellijRunner.js`を直接修正する。

### intellijRunner.js
Macでは以下にある。

`/Applications/WebStorm.app/Contents/plugins/js-karma/js_reporter/karma-intellij/lib/intellijRunner.js`

### 修正箇所
refreshプロパティをfalseからtrueに変更する。

```オリジナル
function runTests() {
  var serverPort = cli.getServerPort();
  var urlRoot = cli.getUrlRoot() || '/';
  if (urlRoot.charAt(urlRoot.length - 1) !== '/') {
    urlRoot = urlRoot + '/';
  }
  runWithConfig({
    port: serverPort,
    refresh: false,
    urlRoot: urlRoot
  });
}
```

```変更
function runTests() {
  var serverPort = cli.getServerPort();
  var urlRoot = cli.getUrlRoot() || '/';
  if (urlRoot.charAt(urlRoot.length - 1) !== '/') {
    urlRoot = urlRoot + '/';
  }
  runWithConfig({
    port: serverPort,
    refresh: true, //ココ
    urlRoot: urlRoot
  });
}
```

## 参考リンク

- [Karma: changes made to specs are not uploaded to server when using karma-browserify : WEB-12496](https://youtrack.jetbrains.com/issue/WEB-12496)
slack > hello world > curlでPostMessage from CentOS 6.5

```txt:動作確認
CentOS 6.5 
```

slackのhello world的なものとしてcurlでPostMessageした。

```bash
$ curl -F channel=#general -F token=xoxp-1807203-181682-181203-a36d7ea -F text="hello wolrd" https://slack.com/api/chat.postMessage
```
(注意: 上記のtokenは本来のものから改変してます)


以下の応答があった。

```txt:応答
{"ok":true,"channel":"C0J4S2PUJ","ts":"1452492242.000002","message":{"text":"hello wolrd","username":"bot","type":"message","subtype":"bot_message","ts":"1452492242.000002"}}
```

slackの#generalチャネルにて以下が表示された。
> bot BOT 3:04 PM
> hello world
Herokuの無料dynoがsleepしてる時間を表示するカスタムエラーページを設定する



Herokuの無料dynoを使ってると1日6時間sleepしないといけないわけですが、
sleep中にアクセスされるとふつうにHerokuのApplication Errorのページを返されるのでちょっと困ってしまいます。

幸いHerokuのエラーページはカスタム可能なので、
sleepしてる時間帯を表示してあげるカスタムエラーページを作りました。

[Heroku Sleep Page](https://github.com/notsobad-jp/herokusleep)


## デモ
http://notsobad-jp.github.io/herokusleep/

こんな感じ。

![Application Error.png](https://qiita-image-store.s3.amazonaws.com/0/11704/f6d6e811-8a5b-e5e0-5559-62868c8595d2.png)



## 使い方
GithubPagesでホスティングしてるので、以下のコマンドで
URLを設定すればそのまま使えます。

    heroku config:set \
    ERROR_PAGE_URL=//notsobad-jp.github.io/herokusleep/


色や文言を変えたいとか、sleep時間が違う人は
適宜カスタマイズして使ってください。


## 参考
[Herokuでサービスを動かすときに設定することまとめ](http://qiita.com/tomomichi/items/397099be69aa33f0afee)

[Error Pages | Heroku](https://devcenter.heroku.com/articles/error-pages)

[Better Error Pages | StatusPage.io](https://better-error-pages.statuspage.io/)
slack > tokenの作り方 / 閲覧 > full-access token

slackでpostMessageするためのtokenをどこで見るのか不明だった。

参考 http://qiita.com/takesato/items/f640be2af2c802938827

こちら
https://api.slack.com/web
にてfull-access tokenの作成ができる。
作成後、このページにてtokenを閲覧できる。

また、OAuth2というのも使えるとのこと。
スロットル　バイ　ワイヤー

#概要
現在の車は、アクセルペダルとスロットルボディは、機械的でなく電気的につながっている。
arduino megaで電子スロットルモジュールを動かして見た。
#動画
https://www.youtube.com/watch?v=5Pm_wxoOnKo
#写真
![MVC-007S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/1a08ecb8-c40a-decb-f50b-4a59de8e2115.jpeg)

#回路図
![fit.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/bff94f88-b409-f216-1739-968452cf5be3.jpeg)

#サンプルコード
```
int a0;
int a1;
void setup()
{
	pinMode(3, OUTPUT);
	digitalWrite(3, HIGH);
}
void loop()
{
	a0 = analogRead(0);
	a1 = analogRead(1);
	if (a0 > a1)
	{
		digitalWrite(3, HIGH);
	}
	else
	{
		digitalWrite(3, LOW);
	}
}
```
React+Typescript+Webpackを試してみた

angularjsしか使ったことがなかったのですが、reactが小回り効きそうでよさそうだったのでtypescriptと組み合わせての導入を試してみました。

javascript関連勉強中。


試した結果は以下のリポジトリに格納しています。
https://github.com/shwld/react-typescript-webpack

### React
コンポーネント単位に実装を分離でき、再利用しやすい。
仮想DOMで差分のみを画面更新するのでパフォーマンスが出る。
みたいな認識。

### Typescript
javascriptのスーパーセット。
javascriptをそのまま拡張子を置き換えても動き、
クラスやenum、ES6の構文などに対応した言語。
静的型付により、visual studio codeと組み合わせると型チェックがいい感じ。

### Webpack
Webアプリに必要なコンポーネントの依存関係を解決して、配布用にまとめることができるツール。
typescriptのコンパイルなども行いつつ、依存関係を解決して一つのファイルにまとめるとかができたり、すごくいろいろできるみたい。

## 試しに使ってみる

```
npm init
```

### Typescriptをインストールする
1.6.0でreactのjsxに対応したらしいのでバージョンに注意
インストールすると`tsc`コマンドが使えるようになる

```
npm install typescript -g
tsc -v
> message TS6029: Version 1.7.5
```

**tsconfig.json**を作成する
(コンパイル設定などを記述するファイル)

```
tsc --init
```

### 型定義ファイルを管理する`dtsm`をインストールする

`dtsm`は日本製の型定義ファイル管理ツールで、npmのように管理できるので使いやすい

```
npm install dtsm -g
```

**dtsm.json**を作成する
(型定義のバージョン情報などを保持するファイル)

```
dtsm init
```

### Webpackをインストールする

```
npm install webpack -g
```

webpackで**typescriptをコンパイルするためのloader**をインストールする

```
npm install ts-loader --save
```

### Reactをインストールする

```
npm install react react-dom --save
```

ReactのTypescript型定義ファイルをインストールする

```
dtsm install react react-dom superagent --save
```

tsconfig.jsonにjsxオプションを追加する

``` json:tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "outDir": "built",
        "rootDir": ".",
        "sourceMap": false,
        "jsx": "react"
    },
    "exclude": [
        "node_modules"
    ]
}
```

webpack.configを設定する

``` js:webpack.config.js
module.exports = {
  entry: [
    './index.tsx'
  ],
  output: {
    path: 'built',
    filename: 'bundle.js'
  },
  resolve: {
    extensions: ['', '.tsx', '.ts', '.js']
  },
  module: {
    loaders: [
      {
        test: /\.ts(x?)$/,
        loader: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  }
};
```

index.tsxにreactっぽいものを書いてみる

``` tsx:index.tsx
/// <reference path="typings/react/react.d.ts" />
/// <reference path="typings/react/react-dom.d.ts" />
import * as React from 'react'
import * as ReactDOM from 'react-dom'
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        Hello, world! I am a CommentBox.
      </div>
    );
  }
});
ReactDOM.render(
  <CommentBox />,
  document.getElementById('content')
);
```

index.htmlを簡単に作る

``` html:index.html
<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello React</title>
  </head>
  <body>
    <div id="content"></div>
    <script src="built/bundle.js"></script>
  </body>
</html>
```

## 実行

```
webpack
```

ブラウザで`index.html`を開く

React.jsいつか使いたい


参考とか
http://ishikuro.hateblo.jp/entry/2015/09/01/124613
http://qiita.com/vvakame/items/38b953ab0f4de63cce8b
どう解決？　PHP 7 では、static でないメソッドを静的にコールすることが非推奨

以下の内容は
1 [静的メソッド]と
2 [静的にコール]を
ゴッチャに理解した上での記事になってますので、忘れてください。（というか個人的メモとして残しておきます。）


------------

> http://php.net/manual/ja/language.oop5.static.php
PHP 7 では、static でないメソッドを静的にコールすることが非推奨になりました。 E_DEPRECATED レベルの警告が発生します。 将来的にはサポートされなくなる見込みです。

じゃあ、どうするの？


``` static.php
<?php
//01 警告対象
class AA{

	public $data;

	function __construct(){
		$this->data = "data aa";
	}

	function getdata(){
		echo $this->data;
	}

}

$aa = new AA();
$aa->getdata(); //これが警告対象



//02 	静的プロパティ,静的メソッドにしないとね。
class BB{

	public static $itijidata = "bb";

	static public function get_itijidata(){
		echo self::$itijidata;
	}

}


BB::get_itijidata();




//03 静的プロパティ,静的メソッド and インスタンスプロパティ、インスタンスメソッドが混在する場合
class CC{

	public static $itijidata = "cc";

	private $data;

	function getdata(){
		$this->data = "ccdata";
	}

	static public function get_itijidata(){

		echo self::$itijidata;

		//	インスタンス プロパティにアクセスするには new する
		$d = new self;

			$d->getdata();
			echo $d->data;
		
	}

}

CC::get_itijidata();








//04 new 1回で済むようにシングルトンパターンに
class DD{

	public static $itijidata = "dd";

	private static $instance;

	private $data;

	function getdata(){
		$this->data = "dddata";
	}


    static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }


	static function get_itijidata(){

		echo self::$itijidata;

		//	複数回　new しないようにシングルトンにする
		$d = self::getInstance();

			$d->getdata();
			echo $d->data;
		
	}

}

DD::get_itijidata();

?>
```


------

参照
http://qiita.com/mpyw/items/41230bec5c02142ae691

静的メンバ
http://www.objective-php.net/basic/static

------

これ以外の方法があるのか、これがベストかはわからないが
04のシングルトンあたりから何かめんどくさいな・・・・
Swift のメソッド毎のコンパイル時間の計測結果を見やすく表示するスクリプト


[Xcode - Swiftのメソッド毎のコンパイル時間を計測してビルド時間を短縮する - Qiita](http://qiita.com/rizumita/items/913b05d799b3712260f6) がすごく便利そうなので試してみたのですが、結果のテキストが長すぎたのでコンパイル時間の長い順に表示するスクリプトを書きました。

ついでに cocoapods 管理下のファイルは結果に含めないようにしてみました。

スクリプトは[こちら](https://github.com/funnything/swift_build_log_parser)

## 使い方


元記事と同様に以下を実行

- Other Swift Flagsに `-Xfrontend -debug-time-function-bodies` を追加
- `xctool -workspace './xyz.xcworkspace' -scheme 'SchemeName' -jobs 1 clean build | tee build_in_detail.txt` [^1]

[^1]: ビルド時間がかなりかかるので tee をかませた

生成されたビルド結果のテキストファイルで

- `cat build_in_detail.txt | perl -pe 's/\x1b.*?[mGKH]//g' | ruby swift_build_log_parser.rb` [^2]

[^2]: エスケープシーケンスを手軽に除去するコマンドとかってないのかなー

とすることで

```
=== File ===
  8294ms SomeView
  6729ms MainViewController
  6513ms MainViewController
  5469ms SomeView
  1067ms Fridge
  1051ms Fridge
   922ms AppDelegate
   914ms API
   869ms API
   609ms OneModel
...
...

=== Method ===
  5932.1ms SomeView.swift:98:10 func currentPosition(model: OneModel) -> CGPoint
  4896.7ms SomeView.swift:98:10 func currentPosition(model: OneModel) -> CGPoint
  3924.1ms MainViewController.swift:280:10 @objc func syncWithRemote(state: Int)
  3921.6ms MainViewController.swift:286:79 (closure)
  3911.8ms MainViewController.swift:326:56 (closure)
  3713.8ms MainViewController.swift:280:10 @objc func syncWithRemote(state: Int)
  3712.0ms MainViewController.swift:286:79 (closure)
  3705.3ms MainViewController.swift:326:56 (closure)
  1560.1ms MainViewController.swift:207:10 @objc func bindDynamically(isInit: Bool)
  1491.9ms MainViewController.swift:207:10 @objc func bindDynamically(isInit: Bool)
...
...

=== Build time ===
414618 ms
```

こんな感じで結果を整理することができます。

## 感想

関数を大きくしすぎないことは、人間にとっての Readability のみならず、型推論をするコンパイラにとっての Readabilty も向上させるのだなと思いました。
マイナンバーチェックデジット用Javaコード


CodeIDの回答でマイナンバーDigit番号をチェックするコード
算出方法：https://codeiq.jp/sites/default/files/answer_ready/2007/mynumber.html

public class MyNmaber {

    /**
     * 11,12桁半角数字
     */
    private static final String CHECK_REGEX = "[0-9]{11,12}";


    public static void main( String[] args ) throws IOException {

        int c;
        StringBuilder input = new StringBuilder();
        while ( ( c = System.in.read() ) != -1 ) {

            if ( c == 10 ) {

                checkMyNmber( input.toString() );
                input = new StringBuilder();
                continue;
            }

            input.append( (char) c );

        }

    }


    private static void checkMyNmber( String myNmber ) {

        if ( !Pattern.matches( CHECK_REGEX, myNmber ) ) {
            System.out.println( "Error" );
            return;
        }

        String checkDigit = calcDigit( myNmber.substring( 0, 11 ) );

        if ( myNmber.length() == 11 ) {
            System.out.println( checkDigit );
        } else {
            if ( checkDigit.equals( myNmber.substring( 11, 12 ) ) ) {
                System.out.println( "OK" );
            } else {
                System.out.println( "NG" );
            }

        }
    }


    private static String calcDigit( String number ) {

        int sum = 0;
        for ( int i = 1; i <= 11; i++ ) {

            int pn = Integer.valueOf( number.substring( 11 - i, 12 - i ) );
            int qn = i <= 6 ? i + 1 : i - 5;
            sum += pn * qn;
        }

        int mod = sum % 11;

        if ( mod <= 1 ) {
            return "0";
        } else {
            return String.valueOf( 11 - mod );

        }

    }
}
Struts2と複数ファイルアップロード


# Struts2とアップロード

Struts2は標準でファイルアップロードの機能が使えます。特に設定アイルを編集することがなく、その受け口となるActionクラスに受け取り用のフィールドを用意するだけです。

なお、公式のサンプルコードでは単一のファイルアップロード方法は記載していますが、複数のファイルアップロードにも対応しています。

## アップロードに必要なこと

Struts2でファイルアップロードを実装するためには次の手順で行います。

* 送信フォームをマルチパートにするか、HTML5のFileAPIを利用する
* 受け取りActionにアップロードファイルのフィールドを設定する

あと、アップロードしたファイルを保存する仕組みは、各自で実装します。
Struts2のアップロード機能は、アップロードしたファイルを中間ファイルのFileオブジェクトに格納するところまで担います。

## フォーム

送信フォームでは、通常のHTMLでも構いません（＝strutsタグは必須ではありません）

たとえばHTML5のFileAPIとjQueryを利用した場合は以下のようになります。

```html:index.html
<script>
$(function() {
	if (!window.FileReader) {
		alert("File APIがサポートされていません。");
		return false;
	}

	// アップロードのdiv要素
	var filedrop = $("#filedrop");

	// デフォルトイベントのキャンセルを関数化
	var eventCancel = function(event) {
		event.preventDefault();
		event.stopPropagation();
		return false;
	}

	// ドロップイベントを関数化
	var dropfileHandler = function(event) {
		event.preventDefault();

		var files = event.originalEvent.dataTransfer.files;

		uploadFiles(files);
	};

	// イベントを関連付け
	filedrop.bind("dragenter" , eventCancel);
	filedrop.bind("dragover" , eventCancel);
	filedrop.bind("drop" , dropfileHandler);
});

var uploadFiles = function(files) {
	var formData = new FormData();

	var filesLength = files.length;

	for ( i=0; i<filesLength; i++ ) {
		formData.append("uploadfile" , files[i]);
	};
	uploadProgress();

	$.ajax({
		url: 'upload' ,
		type: 'POST' ,
		data: formData ,
		processData: false ,
		contentType: false ,
		success: function(data) {
			// アップロード成功
		} ,
		failure : function(data) {
			// アップロード失敗
		}
	});
};
</script>

<form id="filedropform" method="POST">
	<div id="filedrop" class="filedrop">
		<p>アップロードするjpegまたはpngファイルをドロップしてください</p>
	</div>
</form>
```

ファイルを`<div id="filedrop">`にドラッグ＆ドロップすると、ファイルアップロードを行います。

## Action

先ほどのjQuery.ajaxで送信した内容を受け取るActionクラスでは、アップロードしたファイルを受け取るためのフィールドを追加します。

フィールド追加のルールとして、**アップロード時のパラメータ名がフィールド名になります。**
先ほどの例では、`formData.append("uploadfile" , files[i]);`で指定していますので、フィールド名は uploadfileになります。

なお、アップロードしたファイルについては、次の情報も取得できます。

|内容|フィールド名|フィールド名の例|
|:---|:---|:---|
|アップロードしたファイルのFileオブジェクト|アップロード時のパラメータ|uploadfile|
|ファイル名|アップロード時のパラメータ+FileName|uploadfileFileName|
|ファイルのコンテンツタイプ|アップロード時のパラメータ+ContentType|uploadfileContentType|

以下は実装例です。

```java:UploadAction.java
@Namespace("/")
@Results({
	@Result(name = ActionSupport.SUCCESS, type="json" , params={"root","result"}),
})
@Controller
@Scope("prototype")
@Log4j2
public class UploadAction extends ActionSupport {

	/**
	 * デフォルトアクション。
	 */
	@Action("upload")
	public String start() throws Exception {
		// アップロードしたファイルの保管などをここに。。
		
		return SUCCESS;
	}

	/**
	 * アップロードファイルのFileオブジェクト
	 */
	@Getter @Setter
	private File[] uploadfile;

	/**
	 * アップロードしたファイルのコンテンツタイプ
	 */
	@Getter @Setter
	private String[] uploadfileContentType;

	/**
	 * アップロードしたファイルの元ファイル名
	 */
	@Getter @Setter
	private String[] uploadfileFileName;

	/**
	 * Ajaxレスポンスの文字列
	 */
	@Getter @Setter
	private Map<String, Object> result;
}
```

ファイルアップロード用に追加したフィールドは、配列が指定できます。
…そう、複数のファイルアップロードもこれだけで可能です。例えば2つのファイルをドラッグ＆ドロップで選択した場合は、配列の長さは自動的に2としてくれます。

## サンプルコード

SpringとMybatisを使ってアップロードしたファイルを保存するサンプルをgithubに公開しております。

https://github.com/A-pZ/piclib
陳腐化しない Clojure の情報を書くために気をつけるべきこと/あるいは情報が陳腐化していることに気付くために知っておきたいこと

Clojure を始めたばかりの人が躓くポイントのひとつが日本語の情報が少なく、情報があっても古いため現在のバージョンとは勝手が違い役に立たない事が沢山あることだと思います。

具体的には Luminus というテンプレートがありますが、これを使った例をブログ記事などで書くときに以下のように書いてあることが多々あります。

```shell-session
$ lein new luminus myapp
```

そして、これを読んで一年後に同じように実行した人は全く違うテンプレートが展開されてしまい( Luminus の場合、 1 年違えば使用されているライブラリがかなり変わります)困り果ててしまいます。何故か。それは Leiningen の new タスクは特に指定がない場合、最新のテンプレートを自動的に clojars からダウンロードしてきて使うためです。

なので、何かしらのテンプレートを使った記事を書く人は次のように書くことを心がけるといいと思います。

```shell-session
$ lein new luminus myapp --template-version 2.9.8.81
```

こうすることによって特定のバージョンを明示的に指すことができ、後からブログなどの記事を読んだ人も全く同じように再現させることが出来ます。またこのようにテンプレートのバージョンを指定していない記事を見かけた場合は、今と違う可能性があるということを念頭に置いて読むと躓くことがなくなると思います。

またどのバージョンを使ったのか確認したい場合はローカルの Maven リポジトリを確認すると良いでしょう。

```shell-session
$ ls -l ~/.m2/repository/luminus/lein-template  
total 40
drwxr-xr-x  7 ayato_p  staff    238  1 11 13:26 2.9.8.81
drwxr-xr-x  7 ayato_p  staff    238  1 11 13:26 2.9.8.85
-rw-r--r--  1 ayato_p  staff  10367  1 11 13:26 maven-metadata-clojars.xml
-rw-r--r--  1 ayato_p  staff     40  1 11 13:26 maven-metadata-clojars.xml.sha1
-rw-r--r--  1 ayato_p  staff    266  1 11 13:26 resolver-status.properties
```

こうすることで現在ダウンロードされているテンプレートのバージョンが分かるはずです(テンプレートを使って雛形を作ったあとに、そのプロジェクトがどのテンプレートとバージョンを使って作られたのか知る術はありませんが、このようにすれば最新のバージョンが使われているので推測は可能です)。

あるいは現在の最新のテンプレートのバージョンを知りたい場合は Clojars を見ると良いでしょう。
例えば、 Luminus のテンプレートであれば次の URI で表示出来ます。
https://clojars.org/luminus/lein-template

また、バージョン情報はテンプレート以外でも大事ですが、ほとんどの場合ライブラリのバージョンは綺麗に書いてあるケースが多いと思うのでこれについてはあまり気にする必要はないかもしれません。ただ、ライブラリのバージョンが明記されてない場合は、あまり信用して読まない方がいいでしょう。

## まとめ

* テンプレートを使った情報を書く場合はテンプレートのバージョンを明記しよう。
* テンプレートに限らずライブラリなどのバージョンも明記しよう。
* テンプレート/ライブラリの README やドキュメントなどをちゃんと読もう。