OmniAICreator/Qiita-1.07M huggingface dataset:
container_castをつくった

コンテナの中身をそのままに、入れ物のコンテナだけを変えるキャストを思いついたのでガリガリ書いてみました。
requirements:
共通：
　フリーのbegin, endを使ってイテレータが取得できること。
　キャスト先とキャスト元のコンテナのvalue_typeが等しいこと。
コピーする場合：　value_typeがコピーコンストラクタを持つこと。
ムーブする場合：　value_typeが例外を投げないムーブコンストラクタを持つこと。

ムーブコンストラクタを持っていても、例外を投げるかもしれない場合は例えstd::moveを使って渡そうともコピーが行われます。
また、ムーブされた後のコンテナの要素数はムーブ前と変わりません。中にはムーブされた要素の残骸が残ります。

既知の問題点
1.　ムーブの際の例外保証
　すなわち、新しいコンテナのメモリ確保などで例外が発生した場合に要素をちゃんと元のコンテナに戻してくれるか、というのが気になるところなのです。STLは要素がムーブの際に例外を送出しなければやってくれるように記憶していますが、少し自信がありません。

2.　value_typeが等しくなければコンパイルエラーになる
　これは安全のためにわざとやったのですが、convertibleであればコンパイルエラーにしなくてもいいような気もする…というのが微妙なところです。

使用例:

```cpp
struct throwable
{
  throwable() = default;
  throwable(throwable&&) {}
};
struct no_throwable {};

...中略...

  std::vector< throwable > vec;
  vec.resize(3);
  auto list0 = container_cast< std::list< int > >(vec); // copy
  auto list1 = container_cast< std::list< int > >(std::move(vec)); // copy

  std::vector< no_throwable > vec1;
  vec1.resize(3);
  auto list2 = container_cast< std::list< int > >(vec); // copy
  auto list3 = container_cast< std::list< int > >(std::move(vec)); // move
```

コードのすべては以下になります。


```cpp
#include <iterator>
#include <type_traits>
#include <utility>

template< class Container1, class Container2,
  typename std::enable_if<
    std::is_same< typename Container1::value_type,
                  typename Container2::value_type >::value,
    std::nullptr_t >::type = nullptr >
Container1 container_cast(const Container2& c)
{
  return {begin(c), end(c)};
}

template< class Container1, class Container2,
  // if each value_type is same type.
  typename std::enable_if<
    std::is_same< typename Container1::value_type,
                  typename Container2::value_type >::value,
    std::nullptr_t >::type = nullptr,
  // if !is_nothrow_move_constructible and copy_constructible.
  typename std::enable_if <
    !std::is_nothrow_move_constructible<
      typename Container1::value_type >::value
    && std::is_copy_constructible<
      typename Container1::value_type >::value,
    std::nullptr_t >::type = nullptr >
Container1 container_cast(Container2&& c)
{ // copy
  return container_cast< Container1 >(c);
}

template< class Container1, class Container2,
  // if each value_type is same type.
  typename std::enable_if<
    std::is_same< typename Container1::value_type,
                  typename Container2::value_type >::value,
    std::nullptr_t >::type = nullptr,
  // if nothrow_move_constructible.
  typename std::enable_if <
    std::is_nothrow_move_constructible<
      typename Container1::value_type >::value,
    std::nullptr_t >::type = nullptr >
Container1 container_cast(Container2&& c)
{ // move
  return {
    std::make_move_iterator(begin(c)),
    std::make_move_iterator(end(c))};
}
```
[MAC]CLIP STUDIO PAINT EXフィルタープラグインSDKのビルドが通らない場合の対処法

フィルタープラグインSDKの公開年月が経ち、Xcode7でサンプルソースのビルドが通らない場合の対処法を記載します。

エラーは大きく分けて2件発生すると思われます。

1. The run destination My Mac is not valid for Running the scheme 'HSV'.
2. Unsupported compiler 'com.apple.compilers.llvmgcc42' selected for architecture 'x86_64'

***
###実行環境
- [CLIP STUDIO PAINT フィルタープラグインSDK]
(http://www.clip-studio.com/clip_site/download/clipstudiopaint/cspsdk)

- Xcode 7.2


***


###1-1.The run destination My Mac is not valid for Running the scheme 'HSV'.
![スクリーンショット 2015-12-14 22.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/68400/eceada0f-51fb-489e-1c54-55cbc4ee5c27.png "スクリーンショット 2015-12-14 22.10.44.png")



####1-2.対策
####[MacOSX10.5.sdk]を追加します。
古いSDKの入手方法は下記URLがとても参考になります。
[Xcode6にOS X 10.8SDKを追加する](http://qiita.com/yasnis/items/11e14d9f168e88460c78)

DLしたSDKを下記のパスに追加します。
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
![スクリーンショット 2015-12-14 23.05.30.png](https://qiita-image-store.s3.amazonaws.com/0/68400/112084b6-0660-66e9-d3ba-4ae371e9c4d8.png "スクリーンショット 2015-12-14 23.05.30.png")




XCodeのBuild Settingsに戻り、Base SDKを[Latest OS X]に変更します。
![スクリーンショット 2015-12-14 22.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/68400/dff667fe-b954-f349-c1ba-761b6e329d88.png "スクリーンショット 2015-12-14 22.24.10.png")



***

###2-1.Unsupported compiler 'com.apple.compilers.llvmgcc42' selected for architecture 'x86_64'

####2-2.対策
####使用するコンパイラを変更します。
[HSV]列のプルダウンより[Default Compiler]を選択
![スクリーンショット 2015-12-14 22.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/68400/9a8a609f-5add-0365-2533-8d02371868bd.png "スクリーンショット 2015-12-14 22.06.53.png")

***

上記２件の対策後にビルドが通れば成功です。
サンプルプラグインのbundleファイルが作成されました。 
![スクリーンショット 2015-12-14 22.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/68400/b1dcecdb-e3ce-c805-a6fb-250f94c0f3af.png "スクリーンショット 2015-12-14 22.54.33.png")


***
参考URL(ありがとうございました)

- [Xcode6にOS X 10.8SDKを追加する](http://qiita.com/yasnis/items/11e14d9f168e88460c78)


-  [ClipStudioPluginSDKのビルドが出来ない[mac]](http://qiita.com/kuranari/items/ed36c1806ac0fe9cae40)
mDrawbotkitで画像が読み込めないのはフォルダ名が原因

#初めに
お絵描きロボットキットのmDrawbotが通常販売されるようになったとのことで、
購入の前にアプリだけ試してみようと思いました。

[商品ページ](https://www.switch-science.com/catalog/2551/)
[アプリページ](http://learn.makeblock.cc/mdrawbot/)

私の環境はMacbook Pro,El Capitanです。

#実施しようとしたこと
画像が正しく読み込まれるのか試そうとしたところ、
読み込みボタンを押しても画面上に出てきませんでした。

#解決方法
上記のアプリページからアプリを落とすと、解凍時にフォルダ名が文字化けしているため、
適当なフォルダ名に変更したところ、正しく読み込むことができました。

#追記
読み込みは出来ましたが、plotはまだできてません。。。
Slack API with CakePHP

# CakePHP で Slack の WebAPI クライアント作ってみた

https://github.com/HirokiYagyu/Slack

ここ。

完全に業務の外の時間でやったので、なかなか時間が取れず色々気が回ってません。
本当ならこれにあわせて [CakePHP Api Docs](https://github.com/cakephp/cakephp-api-docs) を利用してドキュメントを生成したり、テストを用意したり、Travis で CI 回したりもしていたんですが…

実は公式の CakePHP Api Docs には不思議な挙動をする箇所があり、それに気づいて色々やろうとしてたら、本筋から脱線して時間が取れなくなりました。

# Slack API with CakePHP

これは Slack 上の Web API と呼ばれるものを実装し、CakePHP のプラグインとして提供しています。
対象は CakePHP 2.x のみで、Cake3 に対応するのはまた別の機会に行い、公開する予定です。

## 使い方

通常の CakePHP のプラグインと何ら変わりは有りません。
プラグインや、そのプラグインが持ってる `Component` についての Howto は [公式 Doc](http://book.cakephp.org/2.0/en/plugins/how-to-use-plugins.html) を見てもらうとか、[DebugKit](https://github.com/cakephp/debug_kit) の導入を見てもらって参考にするとかしてください。

調べればいくらでも出てきますので、ggrks。

----

```php:APP/Config/bootstrap.php
// ファイルの一番末尾に書き出してください.
CakePlugin::load('Slack',['bootstrap'=>true]);
```

```php:APP/Plugin/Slack/Config/bootstrap.php
<?php
namespace Slack;

// YOUR API ACCESS TOKEN
define(__NAMESPACE__.'\API_TOKEN','ここを自分のトークンに書き換えてね！');
```

```php:App/Controller/SamplesController.php
<?php
App::uses('AppController', 'Controller');

/**
 * Slack API プラグインのサンプル用コントローラ.
 */
class SamplesController extends AppController
{
    public $component = ['Slack.Chat'];

    public function index()
    {
        $channel_id = 'C01234567';
        $post_result = $this->Chat->post($channel_id, 'hola!');
        debug( $post_result );
    }
}
```

ツ、ツンデレじゃないんだからね！
分かんなくなると困ると思ったから、全部書いてあげたんだからｎ

----

さて、上記の通りでやれば問題ありませんが、一部引っかかりそうなところもありましたので掲載しておこうと思います。

## 注意点：プラグイン読み込み時、オプションで `'bootstrap'=>true` を付けないとめんどくさい

まず、プラグインの読み込み時は必ずプラグイン側の `bootstrap.php` を読み込むようにしてください。

```php:APP/Config/bootstrap.php
CakePlugin::load('Slack',['bootstrap'=>true]);
```

では、Slack プラグインのほうの `bootstrap.php` では何をしているのかというと、これも先ほど記載したように

```php:APP/Plugin/Slack/Config/bootstrap.php
define(__NAMESPACE__.'\API_TOKEN','xoxb-define-your-token');
```

`Slack\API_TOKEN` を定義しているだけです。
基本的にすべての API `method` は必要とされる場合はこの `Slack\API_TOKEN` で指定された `token` を利用して Slack Web API に接続します。
なので、ここに API 利用者 (もしくは Bot) の `token` を設定するといちいちメソッド呼び出し時にオプションで指定する必要がなくなって便利です。

### 捕捉： token を動的に変更したい場合

もし `Slack\API_TOKEN` で自分のトークンを指定しない場合は、毎回各コンポーネントの呼び出しの際に以下のように `token` を引数で指定する必要があります。
逆に言えば、 `bootstrap.php` で指定した `token` は、メソッド呼び出し時に動的に変更(というより上書き)できます。

特にソフトウェア側で WebAPI の `token` を __複数__ 使い分ける場合はこの方法が必要になりますね。
(複数の bot で AI を使って自動的に会話学習させる場合とか？ いちいち `Slack` を使う意味が無いんですけど(笑))

```php:App/Controller/SamplesController.php
<?php
App::uses('AppController', 'Controller');

class SamplesController extends AppController
{
    public $component = ['Slack.Chat'];

    public function index()
    {
        $post_result = $this->Chat->post('C01234567', 'hola!', [ChatComponent::OPTION_AS_USER=>true, ChatComponent::OPTION_TOKEN=>'xoxb-0000000000-aaaaaaaaaaaaaaaaaaaaaaaa']
    }
}

```
長ったらしいですね(笑

そのうちオプションの部分もクラス化して、ディスクリプタクラスを用意しようかな、とも考えています。
今の指定方法はクソースレベルです。実は定数なんてただの文字列なので、無理やり定数使う必要もありません。間に合わせです。ごめんなさい。

一先ずこれにて CakePHP で Slack Web API を実装した記事を終わろうと思います。
それではよきエンジニアライフを！
underscoreコードリーディング（invoke）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##invokeとは


###[underscorejs.orgのinvoke](http://underscorejs.org/#invoke)

こんな説明。
>####_.invoke(list, methodName, *arguments) 
>Calls the method named by methodName on each value in the list.
>Any extra arguments passed to invoke will be forwarded on to the method invocation.


```javascript
_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
=> [[1, 5, 7], [1, 2, 3]]
```

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


第二引数のmethodNameで指定したメソッドをlistのすべての値に対して実行する。
*argumentsはmethodNameで指定されたメソッドに渡される


（例示されているのだと、[5,1,3].sort と[3,2,1].sortが呼び出されている事がわかる）

```javascript
'use strict';

var _ = require( "underscore" );

var arr = [ "a", "abc", "abcde" ];$

var _arr = _.invoke( arr, 'charAt', 1 );

console.log( _arr );
```
とすると

```javascript
node invoke.js
[ '', 'b', 'b' ]
```

となる


###[underscore.invoke](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L271)

コード的にはこのあたり。

```javascript

  // Invoke a method (with arguments) on every item in a collection.
  _.invoke = function(obj, method) {
    var args = slice.call(arguments, 2);
    var isFunc = _.isFunction(method);
    return _.map(obj, function(value) {
      var func = isFunc ? method : value[method];
      return func == null ? func : func.apply(value, args);
    });
  };

```

関数としての引数は2つで、それ以外はargsとしてargumentsをsliceして受け取る。
sliceはArray.prototype.slice。
argumentsには{ obj, method, hoge, fuga, piyo }とくるため、
slice(arguments,2)で[ hoge, fuga, piyo ]をargsに格納する。

_.isFunctionでmethodがfunctionかどうかを確認し、trueだった場合はmethodを、そうではない場合はvalue[method]をfuncに代入する。
（value[method]がありえるのかよくわからないけど）nullではない場合は、func.apply(value,args)を行う。
RxJS の Operators (12) - Operators to Convert Observables

この記事は [bouzuya's RxJS Advent Calendar 2015](http://www.adventar.org/calendars/1200) の 14 日目です。

# はじめに

今日は [ReactiveX の Operators to Convert Observables](http://reactivex.io/documentation/operators.html#to) について [RxJS の API ドキュメント](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/observable.md)を読んだりサンプルコードを書いたりしていきます。

また [RxJS 4.0.7](https://github.com/Reactive-Extensions/RxJS/tree/v4.0.7) を対象にしています。

# Operators to Convert Observables

## `Observable.prototype.toArray`

- [ReactiveX - To operator](http://reactivex.io/documentation/operators/to.html)
- [`Observable.prototype.toArray` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/toarray.md)
- [`Observable.prototype.toArray` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/linq/observable/toarray.js)

流れるデータを `Array` にまとめて流します。

```js
import { Observable } from 'rx';

Observable
  .from([1, 2, 3])
  .toArray()
  .subscribe(
    value => console.log(`onNext: ${value}`),
    error => console.log(`onError: ${error}`),
    () => console.log('onCompleted')
  );
// onNext: 1,2,3
// onCompleted
```

特に難しくないです。これで相互変換できるので、以下のようなこともできます、意味はないですが。

```js
import { Observable } from 'rx';

Observable
  .from([1, 2, 3])                          // -3-2-1->
  .toArray()                                // -[1,2,3]->
  .flatMap(array => Observable.from(array)) // -3-2-1->
  .subscribe(
    value => console.log(`onNext: ${value}`),
    error => console.log(`onError: ${error}`),
    () => console.log('onCompleted')
  );
// onNext: 1
// onNext: 2
// onNext: 3
// onCompleted
```

## `Observable.prototype.toMap`

- [`Observable.prototype.toMap` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/tomap.md)
- [`Observable.prototype.toMap` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/linq/observable/tomap.js)

ES6 Map に変換します。

```js
import { Observable } from 'rx';

Observable
  .from([1, 2, 3])
  .toMap(value => `key${value}`)
  .map(map => Array.from(map.keys()).map(k => `${k}:${map.get(k)}`))
  .subscribe(
    value => console.log(`onNext: ${value}`),
    error => console.log(`onError: ${error}`),
    () => console.log('onCompleted')
  );
// onNext: key1:1,key2:2,key3:3
// onCompleted
```

特に言うことはないです。

## `Observable.prototype.toSet`

- [`Observable.prototype.toSet` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/toset.md)
- [`Observable.prototype.toSet` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/linq/observable/toset.js)

ES6 Set に変換します。

```js
import { Observable } from 'rx';

Observable
  .from([1, 2, 3, 2])
  .toSet()
  .map(set => Array.from(set.values()))
  .subscribe(
    value => console.log(`onNext: ${value}`),
    error => console.log(`onError: ${error}`),
    () => console.log('onCompleted')
  );
// onNext: 1,2,3
// onCompleted
```

特に言うことはないです。

# おわりに

ReactiveX の Operators to Convert Observables を見ました。

どうということはないですね。
paiza POH ando #_poh 水着チャレンジ


| |URL|
|:--|:--|
|解答集|http://qiita.com/cielavenir/items/2fd430a3468a068feef5|
|withVaList()を書いた話|http://qiita.com/cielavenir/items/2598d47b97a7c9caf970|
|水着チャレンジ(のrobustな解法)|http://qiita.com/cielavenir/items/46f873191b37736d5062|

N!の下位0を取り除いた状態の下位9桁を求める問題。
普通に考えると、iを掛けて、10で割れるだけ割って、10\*\*9の余りを取れば良いと思うかもしれない。
しかし、これだと、Nが5の冪の場合に死ぬ。問題文の制約の場合、(本番テストケースには含まれていないが)最悪ケースは390625(==5\*\*8)であり、正解するためには10\*\*17で計算して最後に10\*\*9の余りを取る必要がある。これはかなりcostlyである。
これを防ぐためには、予め下位の0の個数を求め、各iに対し予め2で割ったり5で割ったりしておくと良い。
0の個数を求めるには、5の冪で割った商を足しあわせれば良い。

この方法であればint64で計算できる。

なお、「5の冪の階乗」がコーナーケースであるというのはえちごやえちぜん氏の指摘です。感謝します。
https://twitter.com/echigoyaechizen/status/676288524383993856

```rb:paizapoh7_4c.rb
#!/usr/bin/ruby
N=gets.to_i
z=0
n=N
while n>0
	z+=n/5
	n/=5
end
r=1
c2=0
c5=0
(1..N).each{|_|
	i=_
	while c2<z && i%2==0
		c2+=1
		i/=2
	end
	while c5<z && i%5==0
		c5+=1
		i/=5
	end
	r*=i
	r%=10**9
}
p r
```

```swift:paizapoh7_4c.swift
//usr/bin/env swift $0 $@;exit
let N=Int(readLine()!)!
var z=0
var n=N
for ;n>0;n/=5 {z+=n/5}
var r:Int64=1
var c2=0
var c5=0
var j=1
for ;j<=N;j++ {
	var i=j
	for ;c2<z && i%2==0;i/=2 {c2++}
	for ;c5<z && i%5==0;i/=5 {c5++}
	r*=Int64(i)
	r%=1000000000
}
print(r)
```
PEPPER Macのpythonインタプリタでpepperに接続する


# sshでログインしないでMacからpepperに直接接続する

## 概要

ChoregrapheをインストールするとSDKがインストールされるので
SDKのパスをpythonに通してから起動する。

## 手順

### 1. 下記のようなshellスクリプトを作成する。

*naoqi-console*

```sh
#!/bin/bash

NAOQI_PATH=[Choregarphe.appのパス]/Contents/Resources/lib

# SDKのパスをpythonに通す
export PYTHONPATH=${PYTHONPATH}:${NAOQI_PATH}
export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${NAOQI_PATH}

/usr/bin/python
```

### 2. shellスクリプトを実行する

```sh
sh naoqi-console
```

### 3. naoqiのsdkにパスが通っているpythonのインタプリタが起動する。

```sh
$ sh naoqi-console 
Python 2.7.10 (default, Jul 14 2015, 19:46:27) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

### 4. naoqiモジュールをインポートできてればOK

```sh
>>> import naoqi
```

以上
Spring BootでNo qualifying bean of typeが出た時の原因と対応

初歩的な内容になりますが、Spring Bootを使って開発していると「No qualifying bean of type・・・・」ってエラーを見かけることがあります。だいたいログの内容はこんな感じです。

```
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.domain.repository.CustomerRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
 ```

インスタンスが見つからないよーってことはわかりますが、一応公式を確認して訳してみました
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/NoSuchBeanDefinitionException.html
 ※Spring4系です、多分他のVerでも同じ感じだと思います。

 「BeanFactory(というSpringのDIコンテナとして中心的な役割を果たすクラス)が、定義が見つからないインスタンスの要求を受けた時にこの例外が投げられる。
これは、インスタンス定義が見つからない、インスタンスがユニーク(一意)ではない、関連するインスタンス定義がないまま手動でシングルトンインスタンスが生成された、ということを指している。」
 ！！？？だそうです。

 以下に原因と対応をメモしておきます。

# 原因1：アノテーションが付与されていない

初歩的なミスですが、対象クラスをコンテナ管理対象にするためのアノテーションの付け忘れです。
 以下のアノテーション等があります。
 　・@Component
　・@Controller
　・@Service
　・@Repository　(ただし、SpringのCrudRepositoryを継承している場合はなくても大丈夫)

なので、各クラスを確認してアノテーションを付与しているか確認しましょう。

# 原因2：パッケージ構成がおかしい

Spring Bootでは、@SpringBootApplicationアノテーションもしくは@ComponentScanアノテーションが付いたクラスのパッケージを起点に、配下のパッケージを再帰的にスキャンして、その中から原因1で述べたアノテーションが付与されたクラスをコンテナ管理対象とします。
 以下のようなイメージです。

```
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      ├─example　←起点となるパッケージ
│  │  │      │  │  App.java ←@SpringBootApplicationが付与されているクラス
│  │  │      │  │
│  │  │      │  ├─controller
│  │  │      │  │  └─api
│  │  │      │  │          RestCustomerResource.java ←@Controllerが付与されているクラス、コンテナ管理対象となる
│  │  │      │  │
│  │  │      │  └─domain
│  │  │      │      ├─model
│  │  │      │      │      CustomerModel.java ←アノテーションなし、コンテナ管理対象外となる
│  │  │      │      │
│  │  │      │      ├─repository
│  │  │      │      │      CustomerRepository.java ←@Repositoryが付与されているクラス、コンテナ管理対象となる
│  │  │      │      │
│  │  │      │      └─service
│  │  │      │              CustomerService.java ←@Serviceが付与されているクラス、コンテナ管理対象となる
│  │  │      │
│  │  │      └─service
│  │  │              HogeService.java ←@Serviceが付与されているクラス、だがコンテナ管理対象外となる
```

com.service.HogeServiceは、@Serviceアノテーションが付いていますが、起点となる「com.example」配下ではないためコンテナ管理対象外となります。
このクラスを「com.example」配下のクラスで@AutowiredをつけてDIしようとすると「No qualifying bean of type・・」エラーが発生します。

なので、パッケージ設計をしっかりやっておかしなことにならないようにしましょう。

# 原因3：APT等のジェネレータで自動生成されたクラスにアノテーションが付与されていない

結構ハマりがちなのがこれです。
 実は自分も、[Spring Boot + Doma2で2WaySQLを使うまで](http://qiita.com/ARS_2000/items/4c680ec9b31725687e04)、でSpring Boot起動時に「No qualifying bean of type・・・・」が出ていました。
 例えば、DomaではDAOの実装クラスは自動生成してコンテナ管理対象とするのですが、その時に何の設定も入れないと「No qualifying bean of type・・」エラーが発生します(自動生成されたクラスにアノテーションがないため)。
そんな時のために、Domaでは@AnnotateWithアノテーションというのが用意されていて、自動生成されたクラスにアノテーションをつけることが可能です。なのでこれを利用することで解決することが出来ました(自分の場合はdoma-spring-boot-starterのConfigAutowireableを利用しました)。
http://doma.seasar.org/apidocs/org/seasar/doma/AnnotateWith.html
http://doma.readthedocs.org/ja/stable/config/#id22

なので、独自ジェネレーター等を利用してクラスを自動生成しているプロジェクトなんかは、そのあたりの仕組みをどうやるかの検討が必要になるかと思います。

# その他の原因：・・・

 その他としては、今後Springを利用しながら発生ベースで書き足したいと思います。
Babel、Webpack、Mocha、ESLint のセットアップ


ES6 (ES2015) 対応のために、Babel 6 を導入したところ、プリセットとプラグインの管理が思ったよりも煩雑になったので、セットアップの作業手順をまとめることにしました。

ES6 (ES2015) の使う機能を検討しておく 
---------------------------------

テストコードを Node.js (v8) だけで実行するだけですむのであれば、Node.js がサポートする[機能](https://nodejs.org/en/docs/es6/)だけ使えば、テストコードを Babel で変換しなくてすみます。

Babel
-----

### インストール

コマンドラインツールを導入します。

```bash
npm install -g babel-cli
```


### Async/Await

「[Async/Await を使って HTTP リクエストを送信する](http://qiita.com/masakielastic/items/96e5142f1326b6998533)」の記事をご参照ください。


Webpack
-------

### セットアップ
`rauschma/webpack-babel-demo` のリポジトリを利用させてもらいます。

```bash
git clone https://github.com/rauschma/webpack-babel-demo.git
cd webpack-babel-demo/
npm install
```

`webpack.config.js` の内容を見てみましょう。`loader` に `babel-loader`、`presets` に `es2015` が指定されていることを確認します。

```js:webpack.config.js
module: {
  loaders: [
    {
      loader: 'babel-loader',
      test: dir_js,
      query: {
        presets: ['es2015'],
      },
    }
  ]
}
```

### 依存関係の書き方

どのような選択肢があるのかについて[Managing Jquery plugin dependency in webpack](http://stackoverflow.com/q/28969861/531320) の回答にまとめられています。


Mocha
-----

### インストール

グローバルなコマンドとして使えるようにインストールします。

```bash
npm install -g mocha
```

### ES6 (ES2015) 対応

`babel-core` およびプリセットを導入します。

```bash
npm init -y
npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
```

node v5 でテストを実行するなら `babel-preset-es2015` の代わりに `babel-preset-es2015-node5` を使うこともできます。

```bash
npm install --save-dev babel-preset-es2015-node5
```

`package.json` に読み込むプリセットとプラグインを指定します。

```js:package.json
{
  "babel": {
    "presets": [
      "es2015"
    ]
  }
}
```

テストのコードを用意します。

```js:test/index.js
import assert from 'assert';

describe('test', () => {
  let foo = 'bar';

  it('bar を返す', () => {
    assert.equal('bar', foo);
  });
});
```

テストを実行してみましょう。

```bash
mocha test --compilers js:babel-core/register
```

`npm test` コマンドを定義します。

```js:package.json
{
  "scripts": {
    "test": "mocha test --compilers js:babel-core/register"
  }
}
```

### power-assert


`espower-babel` と一緒にインストールします。

```bash
npm install --save-dev power-assert espower-babel
```

テストコードを用意します。

```js:test.js
import assert from 'power-assert';

class Message {
  getValue() {
    return 'Hello World'
  }
}

describe('Hello espower-babel', () => {
  it('should return "Hello World"', () => {
    let msg = new Message();

    assert('Hello World' === msg.getValue());
  });
});
```

テストコードを実行してみましょう。コードは `test` ディレクトリにあることを想定します。

```bash
mocha --compilers js:espower-babel/guess test
```


ESLint
------

### インストール

コマンドツールをインストールします。

```bash
npm install -g eslint
```

### console.log、alert を使う

デフォルトでは `console.log`、`alert` の利用は無効になっています。コメントで無効にしてみましょう。

```js:app.js
/* eslint-disable no-alert, no-console */

console.log('Hello');
```

コマンドを実行してエラーが表示されないことを確認してみましょう。

```
eslint app.js
```


`package.json` に　`rules` を追加することもできます。

```js:package.json
{
  "eslintConfig": {
    "rules": {
      "no-console": 0
    }
  }
}
```
PEPPER pythonインタプリタでデバッグする


# pythonインタプリタでデバッグするメモ

## 概要

* 検証するときや、デバッグするときに便利

## 前提

* sshでpepperにログインする。

## 使用法

#### 1. pythonコマンドでインタプリタを起動

```sh
$ python
Python 2.7.3 (default, Sep  8 2015, 19:02:10) 
[GCC 4.5.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

#### 2. naoqiモジュールからALProxyをインポート

```sh
>>> from naoqi import ALProxy
```

#### 3. 使いたいサービスに接続

```sh
>>> m = ALProxy("ALMemory", "localhost", 9559) # 接続先はlocalhost, ポートは9559を指定する。
```

#### 4. APIをコールする

```sh
>>> m.raiseEvent("Hoge/TestEvent", "hugahuga")
```

以上。
MegaPOVでポストプロセスを使ってD言語くんを降臨させる


# はじめに

プログラミング言語のマスコットの秀逸なデザインを表現するためにはセルシェーディング技法が必須です。
そこで今回はMegaPOVによるセルシェーディング技法についておさらいします。

![d-man.png](https://qiita-image-store.s3.amazonaws.com/0/98084/41bbb639-1630-cbbb-57a5-977615181c95.png)

## ダウンロード

POV-RayとMegaPOVを公式サイトからダウンロードします。
MegaPOVがPOV-Ray 3.7に対応していないので、3.6を使います。

* http://www.povray.org/download/index-3.6.php
* http://megapov.inetart.net/download.html

## インストール

### Linux

`--no-arch-check`を加えてインストールします。

```bash
tar zxvf povlinux-3.6.tgz
cd pov-ray3.6
sudo ./install --no-arch-check
```

```bash
tar megapov-1.2.1-linux.tgz
cd megapov-1.2.1
sudo ./install --no-arch-check
```
### Windows

POV-RayのインストールディレクトリにMegaPOVのファイルをコピーします。
iniファイルを編集して諸々のパスを通さないとレンダリングできないので注意。

# セルシェーディング

MegaPOVでセルシェーディングを実現するために必要な設定を行います。

## テクスチャの設定

セルシェーディングっぽい見た目にするために`finish`を調整します。
`phong`, `phong_size`, `specular`でハイライトを調節します。指定しないとマットな仕上がりになります。

```pov
#declare Finish = finish {
  diffuse 1
  ambient 0.5
  brilliance 0.2
  phong 1
  phong_size 40
  specular 1.0
}
```

## ポストプロセスによるエッジ抽出

マニュアルのFinding edgesを参考に、値を調整します。

* http://megapov.inetart.net/manual-1.2.1/inc_pprocess.inc.html

> `PP_Find_Edges( 1.0, 0.3, 0.15, 2, 1.0, rgb 0 )`
> Finds edges wherever there is a depth difference greater than 1.0, a normal difference greater than 0.3 (about 60 degrees), or a color difference of 0.15. It uses a line radius of 2.0, with black (rgb 0) antialiased (sharpness 1.0) lines. 

> （深度が1.0、もしくは面の角度が0.3（約60度）、もしくは色の差が0.15より大きいとき、太さ2.0、シャープネス1.0、黒色の線を描画する）

線の太さとシャープネスはレンダリングする画像サイズに合わせて調整する必要があります。
基本的に色の差は使わないので、大き目な値にしておきます。

## レンダリング

```bash
megapov cell-shading.pov -w256 -h256 +a0.3 
```

```pov:cell-shading.pov
#version unofficial megapov 1.21;
#include "pprocess.inc"

global_settings {
  post_process{
    PP_Find_Edges( 1.0, 0.3, 4.0, 2, 1.0, rgb 0 )
    save_file "cell-shading_pp.png"
  }
}

camera {
  location <-8, 10, -12>
  look_at  <0, 0, 0>
  up       <0, 1, 0>
  right    <-1, 0, 0>
  angle    39.5
}

light_source {
  <6, 12, -9>
  color <1,1,1>
}

#declare Finish = finish {
  diffuse 1
  ambient 0.5
  brilliance 0.2
  phong 1
  phong_size 40
  specular 1.0
}

#declare White=
texture{
  pigment{rgb<1, 1, 1>}
  finish{Finish}
}

#declare Red=
texture{
  pigment{rgb<1, 0, 0>}
  finish{Finish}
}

plane{
  y, -2
  texture {White}
}

sphere {
  <0,1,0> 2
  texture {Red}
}

box{
  <-2,-2,-2><2,0,2>
  texture {Red}
}
```

右と下に黒線が出るのは仕様です。後で消しておきましょう。

![cell-shading_pp.png](https://qiita-image-store.s3.amazonaws.com/0/98084/18dcc4fa-10d7-5798-9b72-4ee9ed7344a1.png)

# おわりに

MegaPOVのポストプロセスを使ったセルシェーディング技法についておさらいしました。
これでD言語くんのキュートなエッジも表現できますね。

![d-man_640x640.png](https://qiita-image-store.s3.amazonaws.com/0/98084/1997667f-25c0-d48d-5e84-a1f181aaa9f0.png)
PEPPER qicliコマンド


# naoqi qicliコマンドメモ

## 概要

開発中の動作確認などをする際にqicliコマンドを使用すると便利です。

## 前提

pepperにsshでログインすること。

## 使用法

### ・Pepperのサービス一覧を取得

```sh
$ qicli info
```

### ・PepperのサービスのAPI一覧を取得

```sh
$ qicli info [サービス名]
```

例：

```sh
$ qicli info ALMemory
```

### ・PepperのサービスのAPIをコールする

```sh
$ qicli call [サービス名].[API名] [引数]
```

例：

```sh
$ qicli call ALMemory.raiseEvent Hoge/Event TestValue
```

```sh
$ qicli call ALTextToSpeech.say "Test Pepper."
```


以上。
Entry pointの追加の仕方、変更の仕方

#Entry pointとは
Entry point とはiPhoneアプリで最初に表示される画面を表す矢印のことです

<img width="603" alt="Main_storyboard_—_Edited_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/75302/1fc419e0-c106-3927-2286-8beed8a980b1.png">

これが表すViewControllerから表示されます
これがないとエラーが表示されますので、ご注意ください

#Entry pointの変更の仕方
Entry pointがストーリボードにある場合、ドラッグアンドドロップで変更可能です。

#Entry pointの追加の仕方
is Initial ViewControllerにチェックを入れれば追加できます

<img width="1023" alt="Main_storyboard_—_Edited.png" src="https://qiita-image-store.s3.amazonaws.com/0/75302/095a2621-9202-3234-ce3c-c2fe47a8ec3e.png">
Rigidbody2Dで迎撃

前回の[LOS追跡](http://qiita.com/wataru420/items/8f0d7b83f6db8e7c8f1e)では常にターゲットをまっすぐ追いかけていましたが、それは最短距離にはなりません。
ミサイルなどでは当然飛行機の飛ぶ軌道を予測して迎撃するのですが、今回はそれを実装してみました。

簡単に言うとお互いの今いる位置とスピードから出会うであろう時間までに相手が進むであろう距離を計算するという感じです。

``` c#
using UnityEngine;
using System.Collections; 

public class LosEnemyControlScript : MonoBehaviour {
    //追跡対象
    public GameObject objTarget;
    //今までいた位置を保持
    public Vector2 prev; 
    public Vector2 speed = new Vector2(0.1f, 0.1f);
    
    //初期化処理
    void Start () {
        prev = transform.position;
    }

    void Update () {
        Move(); 
    }

    void Move(){
        //ターゲットの位置と速度の取得
        Vector2 targetPosision = objTarget.transform.position;
        Vector2 targetVelocity = objTarget.GetComponent<Rigidbody2D> ().velocity;

        //自分の位置と速度の取得
        Vector2 myPosision = transform.position;
        Vector2 myVelocity = GetComponent<Rigidbody2D> ().velocity;

        //ターゲットと自分の速度の差、接近速度
        Vector2 Vr = targetVelocity - myVelocity;
        //ターゲットと自分のベクトル差、接近範囲
        Vector2 Sr = targetPosision - myPosision;

        float tc = 0 ;
        if (Vr.magnitude != 0) {
            //それぞれの絶対値で割ると接近時間が出る
            tc = Sr.magnitude / Vr.magnitude;
        }

        //ターゲットが接近時間後にどこにいるかを算出
        Vector2 St = targetPosision + (targetVelocity * tc);

        //その位置へ自分を指定されたスピードで動かす
        float rad = Mathf.Atan2 (St.y - myPosision.y, St.x - myPosision.x);
        myPosision.x += speed.x * Mathf.Cos(rad);
        myPosision.y += speed.y * Mathf.Sin(rad);

        //ロケットの向き修正
        Vector2 diff = myPosision - prev;
        if (diff.magnitude > 0.01) {
            float angle = Mathf.Atan2 (diff.y, diff.x) * Mathf.Rad2Deg - 90;
            transform.rotation = Quaternion.AngleAxis (angle, Vector3.forward);
        } 
        transform.position = myPosision;
        prev = myPosision;
    }
}
```

実際に動かすとこんな感じです。

![](https://i.gyazo.com/0c3532915d049d3454d594d33332b343.gif)

まっすぐ交差するポイントに向かっているのがわかると思います。

こんな風にミサイルにロックオンされたら怖いな〜
Vimの基本的なキーバインド（まとめメモ）


[h, j, k, l]	[左, 下, 上, 右]へ移動
gj	表示行単位で移動（↓）
gk	表示行単位で移動（↑）

##モード切替	
i	挿入モード（カーソル位置から）
a	挿入モード（カーソルの後から）
:	コマンドラインモード
v	ビジュアルモード
C-[	ノーマルモード
ESC	ノーマルモード

##コピー＆ペースト	
[数値]dd	行をカット
[数値]yy	行をコピー
P	ペースト（カレント行）
p	ペースト（カーソルの下）


##保存＆終了	
:e	ファイルを開く。新規作成もコレ（:editと同じ）
:w	保存（:w!で強制的に保存）
:q	終了（:q!で編集結果を破棄して終了）
:f	ファイル名を変更して編集を続ける（:fileと同じ）
ZZ	保存して終了（:wqと微妙に同じ）
ZQ	保存せずに終了
C-z	中断（fgで復帰。:suspendと同じ）
ReactiveXを説明できるようになるシリーズその1 - ObserverとObservable

RxJavaを使ってみて、便利だということは分かったし、何となくぼやーっと頭の中でどういうものなのかは理解できたけど、人に説明するとなると、どう説明すればいいのかイマイチ分からない...

そんなきっかけで、自分がReactiveXを人に説明できるようにするために、メモ書きを残すことにしました。

今回はその第1弾として、"Observer"と"Observable"をどう説明すればいいのか考えてみます。

# Observer
Observerって何？ってことですが、その前にまずはReactiveXのページを見てみます。
http://reactivex.io/
2015/12/14時点で、ページ内には以下のように書かれています。
> ReactiveX is a combination of the best ideas from
the Observer pattern, the Iterator pattern, and functional programming

つまり、「ReactiveXはObserverパターン、Iteratorパターン、ファンクショナルプログラミングの最高のアイディアを組み合わせたモノだよ」って言ってますね。

このうち、ちょっとObserverパターンがどういったモノか見てみると...
https://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
> Observer パターン（オブザーバ・パターン）とは、プログラム内のオブジェクトの状態を観察（英: observe）するようなプログラムで使われるデザインパターンの一種。

と書かれています。
また、上記のWikipediaにもありますが、Observerは
> Subject からの更新通知を受け取る更新（英: update)インタフェースを定義するクラス。

と書かれています。
それを踏まえた上で、RxJavaのObserverを見てみると...
https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/Observer.java

この中で定義されているインターフェースは、onCompleted、onError、onNextの3つです。
これらは、Observableをsubscribeするときに実装するメソッドで、それぞれObservableの中のロジックが終了したとき、処理中にエラーイベントが発生したとき、Observableからデータが引き渡されるときにそれぞれObservableから呼び出されます。

ここまで来ると、なんとなく上のObserverパターンと繋がってきたような気がします。
つまり、ReactiveXにおけるObserverは「Observableからのイベント通知を受け取るインターフェース」と言えそうです。

# Observable
じゃあ今度はそのObservableって何だよって話ですが、これはReactiveXにページがあるのでそこを見てみます。
http://reactivex.io/documentation/observable.html

冒頭に
> In ReactiveX an observer subscribes to an Observable.

「ReactiveXでは、observerはObservableを購読するよ」って書いてあるので、Observerについてはさっきの認識で良さそうです。

で、Observableについてはその次に
> Then that observer reacts to whatever item or sequence of items the Observable emits.

「そして、observerはObservableが発行するどんなアイテムやシーケンスのアイテムにも反応します」と書いてあります。

つまり、Observableはザックリと「イベントを発行する元ネタを持ってるクラス」みたいな感じで言えそうですね。

# つまり
ObserverとObservableは、それぞれ「Observableからイベント通知を受け取るインターフェース」と、「イベントを通知するクラス、とそのイベント通知に必要なロジック」という感じに説明できそうです。

また一つ賢くなった。
コルーチンを呼び出し元とは別のオブジェクトで動作させる方法

***Unityのコルーチンを使用したことがある前提です。***

非アクティブなオブジェクト(仮にCallCoroutineObjectとする)にアタッチされたスクリプトから、
StartCoroutineを開始すると、以下のエラーが出ます。

*Coroutine couldn't be started because the the game object 'CallCoroutineObject' is inactive!*

また、StartCoroutineを開始しても、あとで非アクティブになるとコルーチンは実行されなくなります。
通常は上記の挙動で困るのであれば、設計を見直すべきですが、そんな事をしている時間が無いときもありますよね。

そこで以下のようにします。

```GlobalCoroutine
using UnityEngine;
using System;
using System.Collections;

public class GlobalCoroutine : MonoBehaviour {

	public static void Go (IEnumerator coroutine) {
		GameObject obj = new GameObject ();		// コルーチン実行用オブジェクト作成
		obj.name = "GlobalCoroutine";

		GlobalCoroutine component = obj.AddComponent <GlobalCoroutine> ();
		if (component != null) {
			component.StartCoroutine (component.Do (coroutine));
		}
	}

	IEnumerator Do (IEnumerator src) {
		while (src.MoveNext ()) {				// コルーチンの終了を待つ
			yield return null;
		}

		Destroy (this.gameObject);				// コルーチン実行用オブジェクトを破棄
	}
}

```
呼び出し方
`GlobalCoroutine.Go (MyCoroutine ());`

これで親や自身のアクティブ状態に影響を受けずにコルーチンを動作させられます。

以上です。
Ansible実行環境をWindows上に作る

この記事は[TIS Engineer Advent Calendar 2015](http://qiita.com/advent-calendar/2015/tis)の15日目の記事です。
* * *
# 1. はじめに
エンタープライズ分野でもAnsibleを使う機会がちらほら出てきたので、簡単にセットアップする方法を試してみました。
利用シーンは以下を想定しています。

- 社内にある持ち出し用ノートPC（Windows）にAnsible実行環境を構築　⇒　以降、このPCをAnsiblePCと呼びます。
- AnsiblePCをデータセンタに持って行き、構築対象サーバのあるネットワークへ接続

## 1.1. AnsiblePC構成情報
- Windows 7 SP1 (32bit)
- Chocolatey v0.9.9.11
- Vagrant 1.7.4
- VirtualBox 5.0.10 r104061
- CentOS 6.7

# 2. Chocolateyをインストール
ChocolateyとはWindows用のパッケージ管理システムです。
各種ツールのインストールをラクにするために導入します。
（`yum`、`apt-get`、`brew`コマンドをイメージするとわかりやすいでしょう。）
[公式サイト](https://chocolatey.org/)にあるコマンドをコピーして、コマンドプロンプトで実行します。

`@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin`

# 3. VirtualBoxをインストール
仮想マシンを動かすためにVirtualBoxをインストールします。
AnsibleはWindowsへ直接インストールできないので、ゲストOS（CentOS）にインストールして使います。

以下のコマンドを実行し、VirtualBoxをインストールします。
`cinst virtualbox`


# 4. Vagrantをインストール
Vagrantは仮想マシンをお手軽に作成するツールです。
今回はVirtualBox用に使いますが、追加プラグイン（vagrant-aws、vagrant-vsphere）を導入すると、エンタープライズ分野でも利用可能です。

以下のコマンドを実行し、Vagrantをインストールします。
`cinst vagrant`

# 5. Vagrant Boxの作成
Vagrant Boxとは仮想マシンテンプレートのことです。
[Vagrantbox.es](http://www.vagrantbox.es/) または [Vagrant Cloud](https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1) から、有志が作成したVagrant Boxをダウンロードできますが、えんぷら的にまずいので自作します。

## 5.1. CentOSのisoファイルを[ダウンロード](http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/6.7/isos/i386/)
手元に64bit Windows PCがないので、32bit版をダウンロードします。`CentOS-6.7-i386-minimal.iso`
（ちなみに、筆者の環境では Intel VT を有効化しても、CentOS 64bitは動きませんでした。）

## 5.2. Vagrant Box作成
以下のサイトを参考に、最小構成のVagrant Boxを作成します。

- http://www.task-notes.com/entry/20150611/1433991600
- http://te2u.hatenablog.jp/entry/2015/05/11/012225

作成したBoxファイルは、以下に配置します。
`C:\vagrant\package.box`

# 6. Vagrantで仮想マシンを作成
5.2で作成したBoxファイルから仮想マシンを作成します。

```
C:\vagrant> vagrant box add centos6.7 package.box
C:\vagrant> vagrant init centos6.7
C:\vagrant> vagrant up
```

# 7. Ansibleインストール
（後日追記予定）
fabricで「paramiko.SSHException: Incompatible ssh peer (no acceptable kex algorithm) 」と表示された問題の解消

Ubuntu14.04にインストールしたfabricで複数のサーバーにリモートログインし、コマンドを実行した際にいくつかのサーバーでは **paramiko.SSHException: Incompatible ssh peer (no acceptable kex algorithm)** と表示され、うまく接続ができなかった問題を解消した時のメモ。

# 状態

+ OSはUbuntu14.04
+ リモートログインする全てのサーバーでエラーになる訳ではなく、幾つかのサーバーへの接続時のみ発生
+ fabric経由での実行にエラーとなったサーバーへsshコマンドで接続を行ってみると可能だった

# 参考

[paramiko.SSHException: Incompatible ssh peer (no acceptable kex algorithm) ubuntu 14.04](http://www.randomhacks.co.uk/paramiko-sshexception-incompatible-ssh-peer-no-acceptable-kex-algorithm-ubuntu-14-04/)

# 解消方法

参考のリンクの通りなのですが、**paramiko** というfabricが依存しているパッケージ?が古いバージョンなので発生していましたようです。そのため、こちらをアップグレードすることで問題解消しました。

```bash
# paramikoパッケージのバージョン確認
$pip freeze |grep paramiko
paramiko==1.10.1

# 古いのでアップグレード
$pip install paramiko --upgrade
```

これでfabricを再度実行してみたら特に問題が発生せず、できるようになりました。
Webpay の Entity 型を Dict 型に変換する (Python で再帰的に)

[Webpay](https://webpay.jp/)、あんまり流行ってる気がしないんですが少し使ってみてます。

ドキュメントがわかりやすいように見えて、もやっとしているため結局理解するのに少し時間がかかっちゃいますね。

Python バインディングが用意されていて(pipでインストールできる)、比較的簡単にリクエストができます。

```python
import webpay

client = webpay.WebPay(settings.WEBPAY_SECRET)
response = client.customer.create(card=token)
```

こんな感じで。

この、`response` 変数に入ってるのが webpay の `Entity` 型 (`webpay.data_types.Entity`) というやつで、内容は辞書に似ているんですが、各値がクラス変数に展開されています。JavaScript のオブジェクトみたいな感じです。

それが入れ子になっているので、ログに書こうとすると非常にめんどくさい。
一応、`__str__` が実装されていて、yaml に似たそれなりに構造化された文字列が返ってくるのですが、改行なども含まれるため少し扱いに緊張します。パーサも書かかない限り、再利用性は低そうです。

そこで。再帰的に辞書型に変換してしまえば、扱いが楽になると思います。

```python
from webpay.data_types import Entity


def webpay_entity_to_dict(webpay_entity):
    """
    webpay の Entity 型を再帰的に Dict に変換
    """
    if isinstance(webpay_entity, list):
        return [webpay_entity_to_dict(e) for e in webpay_entity]
    if not isinstance(webpay_entity, Entity):
        return webpay_entity
    return {key: webpay_entity_to_dict(value) for key, value
            in webpay_entity.__dict__.items()}

```

これを通せば辞書型にできますので、json.dumps() してからログに出したりとか、シリアライズしやすくなるかと。
c++ builder XE4 > Forms > 8個の子フォームを親フォームの下に4行 x 2列で配置する

```txt:動作確認
C++ Builder XE4
```

以下のフォームがあるとする。

1. 親フォーム (H140 x W1000) : 1個
2. 子フォーム (H150 x W400) : 8個

整列処理を実行した時に、子フォームを 4行 x 2列にして親フォームの直下に並べたい。

### 前準備
1. Form1を作成
2. Form2を作成 > 「自動生成フォーム」をやめて「使用可能フォーム」にする。

Form2側のコードはなし。

### コード

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>

#include "Unit2.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *B_createChild;
	TButton *B_matrix;
	void __fastcall B_createChildClick(TObject *Sender);
	void __fastcall B_matrixClick(TObject *Sender);
private:	// ユーザー宣言
	static const int kNumChild = 8;
	TForm2 *m_childForms[kNumChild];
	void __fastcall putChildrenInMatrix();
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_createChildClick(TObject *Sender)
{
	for(int idx=0; idx < kNumChild; idx++) {
		m_childForms[idx] = new TForm2(this);
		m_childForms[idx]->Show();
	}
}
//---------------------------------------------------------------------------

static void calcLeftTopOfChildren(int parentTop, int parentHeight, int childIdx, int childWidth, int childHeight, int *dstTop, int *dstLeft)
{
	int topSize, leftSize;

	if (childIdx < 4) {
		topSize = childIdx * childHeight;
		leftSize = 0;
	} else {
		topSize = (childIdx - 4) * childHeight;
		leftSize = childWidth;
	}

	int marginTop = parentTop + parentHeight;

	*dstTop = marginTop + topSize;
	*dstLeft = leftSize;
}

void __fastcall TForm1::putChildrenInMatrix()
{
	TForm2 *formPtr;
	int topPos, leftPos;

	for(int chlIdx=0; chlIdx < kNumChild; chlIdx++) {
		formPtr = m_childForms[chlIdx];

		calcLeftTopOfChildren(this->Top, this->Height, chlIdx, formPtr->Width, formPtr->Height, &topPos, &leftPos);
		formPtr->Top = topPos;
		formPtr->Left = leftPos;
	}
}
void __fastcall TForm1::B_matrixClick(TObject *Sender)
{
	putChildrenInMatrix();
}
//---------------------------------------------------------------------------
```


### 動作

B_createボタンで子フォームを作成後、B_matrixボタンで子フォームが親フォームの下に整列される。

整列の用語をmatrixとしたのはいまいち。他の名前含めてリファクタリングが必要。

引数が多いので横長のコードになった。省略名や構造体を使えばもう少し見通しはよくなる。
JavaScriptで配列をfor-inした時のインデックスの型は文字列、という話


## 1. 概要
for-in構文。通常のforよりも文量が減るため、使える言語ではハッシュにも配列にも積極的に使っています。先日JavaScriptで配列を回した際にちょっと困ったことがあったので、説明してみます。

## 2. 問題点
HTML上のリストを動的に構築する上で、各行の行番号にオフセットをつけて表示することになりました。1000から始まって1001, 1002, 1003...といった具合に。
配列のインデックスに1000を足せばいいので、こんな感じで書いてみたわけです:

```js:for-in.js
var list = ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot','golf'];
var offset = 1000;
for(var i in list){
    var code = i + offset;
    console.log(code + ' : ' + list[i]);
}

// 結果
// 01000:alpha
// 11000:bravo
// 21000:charlie
// 31000:delta
// 41000:echo
// 51000:foxtlot
// 61000:golf
```

予想と異なる結果になりました。インデックスiが文字列だったため、 `'0' + 1000` で文字列として結合されてしまったということですね。


## 3. 再現性
Safari, Chrome, Firefox, IE11で試しましたが、以上の全てで再現しました。


## 4. 対応方法
変数の結合順序を変えたり(`offset+i`)、単項+を使ったり(`+i`)、キャストしてしまえば(`parseInt(i)`)、一応正しく動きます。

が、[MDNのJavaScriptリファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in)を見てみると、配列利用時の注意事項があります。
まとめると:

- 配列のプロトタイプにプロパティが追加されていたら、それも列挙されるぞ
- インデックス順でのアクセスは保証されていないぞ

...恐ろしい。ということで、__配列をfor-inすること自体が推奨されていません__でしたので、普通のforに書き直して対応しました。
RubyからJavaScriptを呼び出す〜ExecJS〜

Rubyから他言語を呼び出す記事が話題となっていますが、今回は「速さ」目的ではなくJavaScriptを呼び出す、`ExecJS` gemについて取り上げてみます。

# RubyからJavaScriptを呼ぶ場面
Webのフロントエンド側で使える唯一の言語ということで、JavaScriptのポジションに代わるような言語は存在しないのですが、さらにはNode.jsのようなローカル側で実行する環境が整ったこともあって、Web向けのビルドプロセスも多くがJavaScriptで構成されるようになっています。

Railsを使っていても、CoffeeScriptやLESSのコンパイルなど、JavaScriptを使った処理が必要になる場面がちょくちょく発生します。

# ExecJSとは？
以上のように、RubyからJavaScriptを実行する必要が生じる場面がいくつかありますが、Ruby自体にJavaScriptの実行機能はもちろんありません。そして、JavaScript環境を作る方法も複数あって、それぞれを組み合わせていては組み合わせ爆発を起こしてしまいます。

ということで、各種のJavaScript環境を抽象化して、同じインターフェースで扱えるようにしているのが`ExecJS`です。他にも、`MultiJSON`のように、「ランタイム抽象化」のためのGemはいろいろ存在しています。

# 使えるランタイム
`ExecJS`で使えるランタイムは、以下のようになっています。

* `therubyracer`
 * GoogleのV8をラッピングしたGemです。別プロセスを呼ぶ必要がないので高速で動きます。ただ、JavaScriptの処理系ごと含まれたGemなので、Windowsに入れることが極めて困難なほか、Linux系でもインストールに手間取ることがよくあります。なお、CRubyでLESSを使う場合、依存関係上`therubyracer`が必要となります（LESSでは`ExecJS`を経由しません）。
* `therubyrhino`
 * Javaで書かれたRhinoをラップするGemです。JRuby専用です（逆に、JRubyの場合はほぼこれ一択でいいでしょう）。
* Node.js
 * コンピューターにインストールされたNode.jsを呼び出します。
* JavaScriptCore
 * Mac OS Xに標準で含まれるJavaScriptCoreを呼び出します。
* WSH
 * Windows Scripting Host経由でJScriptを実行します。

# 問題点
上に書いたように、`ExecJS`は各種の環境からJavaScriptの実行環境を選ぶので、どんな環境で実行されるかは状況依存となります。とりわけ、WSHのJScriptについてはES5相当の機能すらないために、[CoffeeScriptコンパイラが動かない](http://qiita.com/scivola/items/ec7625118fcf6de5203a)ということになっています。

WindowsでもNode.jsを入れてあればそっちが使われるのでこの問題は回避できますが、「Nodeを入れたらRailsのトラブルが解消する」というのも妙なことに思えました。

# 外部リンク
* [ExecJS @ GitHub](https://github.com/sstephenson/execjs)
addEventListener type一覧と各ブラウザ対応

Javascriptで良く使うtype一覧（発火条件）と各ブラウザの時の注意点を記載します。

#ブラウザでの注意点#
```
// このような要素があった時
<div id="hoge">擬似ボタンだよ</div>
```

.

**注意１：関数名testに　( )　をつけない**

```
document.addEventListener("click", test);
```

.

**注意２：実際の関数には引数をつける**

```
function test(event){
　　console.log(event);
}
```
ここで重要なのが、こちらもしtest()にしても、chrome, safariなどではしっかり発火します。それは自動でeventと言う名前で引数を用意してくれるから。しかしfirefoxなどでは引数を特定できず通らない。

.

**chrome, safariなどは通るが、firefoxは通らない**

```
function test(){
　　console.log(event)
}
```

つまりは、しっかり上のように引数名event（デフォルト）、もしくは任意の値（今回はevt）を設定しよう

```
function test(evt){
　　console.log(evt);
}
```

またここからは実際のタイプ発火条件一覧です。

#マウス関連#
click：ボタンをクリックしたときに発火
mousemove：カーソルがターゲット内に移動したときに発火
mouseover：カーソルがターゲット内に侵入してきたときに発火
mousedown：ボタンを押下したときに発火
mouseup：ボタンを離したときに発火
mouseout：カーソルがターゲット外に出たときに発火

#キーボード関連#
keypress：キーを押して離したときに発火
keydown：キー押下時に発火
keyup：キーを離したときに発火

#DOM関連#
DOMFocusIn：ターゲットがフォーカスを受け取ったとき発火
DOMFocusOut：ターゲットがフォーカスを失ったとき発火
DOMActivate：ターゲットがアクティブになったとき発火

#INPUT関連#
select：テキストフィールドで文字が選択されたときに発火
change：コントロールの値が変化した後に発火
submit：submitボタンが押されたときに発火
reset：resetボタンが押されたときに発火
focus：コントロールがフォーカスを受け取ったときに発火
blur：コントロールがフォーカスを失ったときに発火

#その他#
load：読み込みが完了したときに発火
scroll：コントロール付属のスクロールバー位置が変更されたときに発火
resize：コントロールのサイズが変更されたときに発火
JavaFX8で表示したイメージをファイルに保存する

マルチプラットフォームで動作可能な，データ可視化アプリを作る必要に迫られたのでJavaFXを使ってみようかなとか．で，2012年くらいに使ってみた以来，久しぶりにJavaFXを使ってみたら，いろいろと嬉しい驚きが．

「データ可視化アプリ作るならPython + matplotlibでいいじゃん」
って言う人がまわりにたくさんいるので，少しでも対抗できるように，まずは，そこそこ奇麗なグラフの描画と各種フォーマットでの保存方法を調査．

コードは https://github.com/miyo/javafx_test/tree/master/SimpleCalc に．
SimpleCalcという名前に反して，電卓機能はもっていません．数字キーをクリックすると適当にチャートやらCanvasやらにデータが挿入されます．コード片は[Working with JavaFX Chart](http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/charts.htm#JFXUI577)から拝借．適当に描画した後で，Saveをクリックすると，全チャートとCanvasのデータがpng，jpeg，PDFで保存される，実験のためのコードです．

# GUIの枠組み
SceneBuilderで作れば楽ちん．いろいろ考えるとややこしいのでしょうけど．
肝は，
　(1)Javaコードで操作対象にしたいオブジェクトにはIDをつけておく
　(2)GUIコンポーネントへの操作をJavaプログラムに通知したければハンドラなメソッド名を定義しておく，
の二つ．

# グラフとかイメージの描画
グラフはデータをつっこめばいい．XYChartのペアが文字だったり数字だったりするのはSceneBuilder側で決められるのかな？コードで生成するときは指定できるみたいだけど...とりあえず怒られないように設定．

# 表示イメージを取得
チャートやCanvasなどの親クラスなNodeに定義されたsnapshotで，WritableImageというデータが取得できる．
以上．
従来の画像操作ライブラリで操作するときにBufferedImageに変換したければ，SwingFXUtils.fromFXImageを使えばいいみたい．ちなみに逆のtoFXImageも用意されている．

# イメージをファイルに保存
JavaFXというかImageIOすばらしい，という話．[JavaFX 2 Snapshot as PNG Image](http://code.makery.ch/blog/javafx-2-snapshot-as-png-image/)にズバリ書いてありました．

```
private boolean saveImage(WritableImage img, String base, String fmt) throws IOException{
    File f = new File(base + "." + fmt);
    return ImageIO.write(SwingFXUtils.fromFXImage(img, null), fmt, f);
}
```

fmtには，文字列でpngとかjpgとかを指定．指定できないフォーマット，たとえばpdfとか指定すると返戻値としてfalseが帰ってくる．

# PDFに保存
[PDFBox](https://pdfbox.apache.org)を使うのが簡単みたい．2.0.0-RC2を試してみました．ちなみに，実行時に[Apache Commons Logging](https://commons.apache.org/proper/commons-logging/)へのパスが通ってないとエラーになるので注意が必要（Loggingがなくてもコンパイルはとおる）．
コードはこんな感じ．

```
private void saveAsPDF(WritableImage img, String base) throws IOException{
    PDDocument doc = null;
    PDPage page = null;
    PDImageXObject ximage = null;
    try {
        doc = new PDDocument();
        page = new PDPage();
        doc.addPage(page);
        PDPageContentStream content = new PDPageContentStream(doc, page);
        ximage = LosslessFactory.createFromImage(doc, SwingFXUtils.fromFXImage(img, null));
        content.drawImage(ximage, 20, 20);
        content.close();
    } catch(IOException ie) {
    }
    doc.save(new File(base + ".pdf"));
    doc.close();		
}
```

Webで検索してでてくる，PDFBox2.0.0以前のサンプルではPDImageXObjectじゃなくてPDXObjectImageになっているので注意．たとえば[Add BufferedImage to PDFBox document](http://stackoverflow.com/questions/7055485/add-bufferedimage-to-pdfbox-document)のコードとか．
移行方法については[Migration to PDFBox 2.0.0](https://pdfbox.apache.org/2.0/migration.html)に書いてある．
とりあえず保存できたけど，サイズを考慮してなくて端が欠けるのは，どうにかしないとね．

# ちなみに，こんな感じ
![javafx_test.PNG](https://qiita-image-store.s3.amazonaws.com/0/25342/bca2def1-631f-cb71-c314-eb6f2c081008.png)
冒頭にも書いた通り，実験のためのプログラムなので意味はありません．
UIRefreshControlの動きがガクッとする現象

記事の内容はこちらを参照してください。
https://mishimay.github.io/77f911ab7c5b83272ee2/
<!--



UIRefreshControlを使ってtableViewを引っ張って更新するときに、スクロールが一瞬一番上まで戻って動きがガクッとする現象にときどき悩まされていたのですが、解決方法がわかりました。

---

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/23679/c986af77-a915-f174-6c1f-349d113d5467.gif "Untitled.gif")

---

# 解決方法

`refreshControl?.endRefreshing()` した後に0.3秒ほど遅延させて `tableView.reloadData()` させます。

tableViewの更新がrefreshControlの更新と競合するのが原因のようです。

# コード例

```swift
    func refresh(sender: UIRefreshControl) {

        // ~~~
        // データリフレッシュ 
        
        self.refreshControl?.endRefreshing()

        delay(0.3) { // reloadData()の実行を遅延させる
            self.tableView.reloadData()
        }
    }
```

ちなみにdelay()関数の実装はこちら
    
```swift
    func delay(delay: NSTimeInterval, mainThread: Bool = true, block: () -> ()) {
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
        dispatch_after(time, dispatch_get_main_queue(), block)
    }
```

# 環境

iOS 9
Swift 2.1

# 参考

http://stackoverflow.com/questions/27280544/uirefreshcontroller-ending-animation-issue?answertab=votes#tab-top


-->
システムエンジニアがやるべき顧客の期待マネジメント


システムエンジニアが顧客に提供するものは、システムではなく、お客さまに満足してもらえるサービスだと私は思います。
http://www.slideshare.net/kawasima/kawasima

さて、サービス業に学ぶと、CSのために重要なのは、事前期待マネジメントです。
http://www.insightnow.jp/article/6506
簡単にいうと、顧客の期待を少しだけ上回るように成果をもっていく。そのために、事前の期待値もコントロールしよう。というお話です。

- 期待が過小にならないようにマネジメントする。
  - 言われたことだけに答えない。
     - 特に提案案件でありがちなのは、言われたことにとりあえず答えを用意するだけで、あっぷあっぷになって、何のエッジも立たないものになりがちです。
     - 何が一番達成したいことかをハッキリさせ、リアリティの高い解決策を考えます。
  - 言われたことには全部答えを用意する
     - 逆に言われたことを蔑ろにするようでは、うわぁ理解力がないなー、と思われて終わりです。力の入れ具合の大小はあれど、言われたことには全部応えるまではいかなくとも、答えを用意しておくようにします。
     - 答えは何も紙で用意する必要はなく、聞かれたときに一貫性をもって回答/説明できることが重要です。
     - 誰に質問が飛ぶかも分からないので、チームで認識を合わせておく必要があります。
  - 牽制球を投げすぎない
     - ベテランになるほど、守りに入った発言が多くなるのは仕方がないことですが、これからイイものを作るんだっていうときに水をさしすぎるのでは、信頼関係を築くことは難しくなります。
     - これは危ないってときだけ、牽制発言するようにしましょう。その方が発言の重みも増して一石二鳥かと考えています。
  - ポカンとしない
     - お客さんのテクニカルワードについていけないことは、よくあることです。そのとき、「ヤベッ、わかんねー」というのが顔に出てしまいがちですが、これは全部相手にバレてしまいます。
     - 例えば、「AWS lambdaを使って…」などと言われたときに、「lambdaって何だ?」と。「どういう風に使うんですか?」などと切り出しておけば、詳しく話してくれます。[「なるほどですね〜」](http://and-plus.net/sales-12/)テクニックでその場をしのぎ、後日調べるようにすれば、何とか間に合います。
     - できれば、触ってみるところまでやって、「先日のアレ、ちょっと試してみたんですが…」と言えるのがよいですね。
- 期待が過大にならないようにマネジメントする。
  - できることだけを言わない
     - 特に提案の場では、いいことばかり言いがちです。やり過ぎはどんどんうさん臭くなるので注意します。
     - 失敗事例ややらない方がいいこと、普通ははそうは設計しないことなどをちゃんと伝えることが、誠実な態度でお客さんの信頼をえるためには必要です。
  - できる範囲をいう
     - どこまでなら、予算の範囲内でできるのか?
     - 技術的なリスクはどれくらいか?
  - 実現難しそうなところは、何で障害物であるかを明言する
     - 難しそうだとみんなが思っても、「障害物が何か」の認識がズレていることは、意外とよくあります。
     -「現行機能踏襲」が障害物であればハッキリ伝え、それがなければ費用がどれくらい変わるのか伝えましょう。
  - 流行りに付き合い過ぎない
     - お客さんの中には、技術的イケイケドンドンのひともいます。
     - 流行りを取り入れなくても、安全でエッジが立つアーキテクチャを作ることは可能なので、そっちに導きましょう。
     - ただし、お客さんの社内プレゼンスのために、流行りのキーワードが必要な場合があることは、暗に汲んで、キーワードが残る程度にはしておきましょう。

これらを、うまいこと配合しながら事前期待を、成果がちょっとだけ上回る位置にもってくるようにしてみましょう。