OmniAICreator/Qiita-1.07M huggingface dataset:
Docker compose初见


一个工具, 用来定义和跑多容器的 Docker 程序.
通过` compose`, 定义一个 `compose 文件`,然后简单通过一个命令就能够创建并执行所有的你想要的. 那些你已经在 compose 文件里定义的. 对于开发测试 staging 环境 CI 集成等步骤里超级方便.

使用 compose 一概就有3步:

1. 定义 Dockerfile
2. 定义 docker-compose.yml
3. 执行` docker-compose up`

一个简单的` docker-compose.yml` 例子:

```
version: '2'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
```

有下面一些命令来管理它 的生命周期:

1. start stop 和 rebuild services
2. 查看 status
3. 输出跑的 service log
4. 一次性命令?


下面来通过一个简单的例子来看看到底怎么玩这个 compose

我们使用 Python的简单的 web 框架` flaskr` 来创建一个简单数据的 app, 存储使用` redis`.

1. 先决条件
	2. 安装了 docker engine 和 docker compose

### 初始化

- 创建工程

```
mkdir composetest
cd composetest
```

- 初始化 flaskr 小 app

```

from flaskr import Flaskr
fro redis import Redis

app = Flaskr(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello(): 
  redis.incr('hits')
  return 'hello, world! I have been seen %s times.' % redis.get('hits')
  
if __name__ = "__main__": 
  app.run(host='0.0.0.0', debug=True)
  
- 通过` requirements.txt`完成依赖设置

```
flask
redis
```  

### 创建一个 docker 镜像

这里我们创建一个镜像,它完整包含所有依赖包括 python 本身.

- 创建一个 Dockerfile


```

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py
```

上面的代码干什么了呢?
首选创建一个 Python 2.7的镜像, 然后把当前的目录追加到镜像里的`/ code` 目录
然后设置`/ code` 为工作目录, 然后通过` requirements.txt`来安装依赖. 然后通过` python app.py`来启动程序.

下面就是开始创建这个镜像

```
docker build -t web .

```

### 定义 service

通过` docker-compose.yml` 来定义所谓的`service`

1. 创建` docker-compose.yml`, 并且敲入下面内容:

```

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis
    
```

上面的内容里定义了2个服务:

1. web
2. redis

然后具体做什么呢:

1. 通过当前目录的 Dockerfile 来 build 镜像
2. 把镜像的`5000`端口映射到 host 的`5000`上.
3. 把当前 host 上的当前目录的代码映射到镜像里的`/ code` 目录
4. 把两个服务连接


### 通过 compose 来创建这个 app

1. 在当前目录, 使用下面的命令:

```

docker-compose up

```

然后访问` http://0.0.0.0:5000`试试.
ケツカンマ問題について思うこと

なぜか強い嫌悪感を抱くので、昨日エンジニアの飲み会があったので、そこにいたメンバーと考えてみました。

# ケツカンマとは

```js
var obj = {
  num: 1,
  name: 'name1', // ←これ
};
var array = [111,222,333,]; // ←これ
```

# ダメな理由（JavaScriptの場合）
* 古いIEだとエラーになる。
* 正式なJSON形式だとエラーになる。

システムとしては、動かなくなるのが最悪だと思うので、それに繋がる書き方はダメだと思います。

# それ以外も考えてみた
ダメな理由だけで十分使いたくないが、それを超えた嫌な気分があり、
どうしてだろうなぁと、昨日エンジニア同士の飲み会で話していた。

## 僕の思うところ

Javaのオートボクシングとか、シンタックスシュガーとかもそうですが、予期しない動作をすることがある書き方や設定で、痛い目を見た経験があるので、嫌な気分になっているのだと思います。

DBとかもゆるふわで設定していて、変な値が入って痛い目を見るとか。結局、振れ幅のある書き方をすると、予期しない動作をする可能性があり、結果障害に繋がることがあるのが、嫌なのだと思いました。

余談ですが、MongoDBなどは2系で許していたゆるふわクエリを、3系でエラースローするように変更して、DBのバージョンアップしたらエラーが出まくるという、後から取り締まり強化的な事例もありました。。。動くからといって、手を抜いてクエリ書いたのが悪いのだと思います。。。（ゆるふわクエリは、僕は書いてないです）

## 飲み会に参加していたAさんのコメント

ケツカンマだと、コードを見ていて続きを書き忘れたのかも？とか思ったり、意図が不明瞭になることがあるのが良くない。と言ってました。

なるほどです。意図が明確で無いコードは不安になりますからね。。。

## 頭のコンテキストスイッチ

```js
var array = [111,222,333,]; // OK
console.log(111,222,333,);  // NG
```

書いている時に、どっちだっけ？と考えるのが面倒です。

# まとめ

僕がケツカンマに抱く嫌悪感は、システムが動かなくなって障害対応した経験があるからというのがファイナルアンサーだと思います。ケツカンマに限らず、意図が不明瞭になる書き方などは、後で障害になったりすることがあるので、出来るだけ明確にコードを書いていきたいです。
CentOS7のサービス管理(systemd)

# はじめに

CentOS-7系を触ったら、サービス管理が"System V系のinit"から"Systemd"へと変わっていました。いろんな論争があったので知っているつもりでしたが、実際に使ってみると戸惑うことも多いので、自分が使う範囲でまとめてみました。

# サービスの起動・終了

CentOS-6系で慣れている、/etc/rc.d/init.d/ 以下のスクリプトではなく、systemctl コマンドを使う。

```
systemctl start httpd.service   # httpd の起動
systemctl stop httpd.service     # httpd の停止
systemctl restart httpd.service  # httpd の再起動
systemctl reload httpd.service   # httpd の設定変更の反映
```

上の reload は、従来の /etc/init.d/httpd graceful に相当。

# サービスの状態確認

```
$ systemctl status httpd.service
   httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-08-05 18:11:26 JST; 1 weeks 5 days ago
```

"Loaded:"行のサービスン名 /usr/lib/systemd/system/httpd.service; の後ろの enabled は自動起動の設定、"Active:" 行が現時点の実行状態をします。

# 自動起動設定

CeontOS6以前は chkconfig を使っていたブート時の自動起動設定も、systemctl で設定する。

```
systemctl enable sshd.service
systemctl disable sshd.service
```

# 自動起動設定の確認

```
systemctl list-unit-files 
systemctl list-unit-files -t service  　   # サービスリスト表示
systemctl list-unit-files --state=enabled  # 自動起動設定のリスト
```

STATE が enabled にならば自動起動が有効、disabledは自動起動が無効になっている。また、staticは単体で自動起動ができないサービスである。

# Logの確認

 systemd のログはバイナリで保存されるので、journalctl を使う。

```
journalctl -u httpd.service   # httpdサービスのログ表示
journalctl -b                 # ブート後のログ表示
journalctl -f                 # リアルタイム表示
journalctl --help　　　　　　　# ヘルプの表示
```
ログは、/var/run/log/journal に保存されており、保存容量などは、設定ファイル /etc/systemd/journald.conf で行う。

なお、CentOS7では、syslogd も動作しているので、/var/log/messages でもログを確認できる。

```
systemctl status rsyslog.service  # syslogd の動作確認
```

# その他

困ったらまずヘルプやマニュアルを参照。それでだめなら検索。

```
systemctl --help
man systemctl
```

蛇足：以下のように、systemdのログを fluentd に流し込むことができるようです。

```
journalctl -f -o json | nc localhost <FLUENTD_PORT>
```
memory leak > 複数台との通信 | 処理停止時 > 処理を抜ける

```txt:動作環境
C++ Builder XE4
```

以下のような模擬コードがあるとする。

```
void func() {
   TUdpThread *work = new TUdpThread();

   for(int idx=0; idx < 7; idx++) {
      // 300msecタイムアウトの通信
   }
   work->Terminate();
}
```

上記の実装をしているクラスなりスレッドにて停止処理が発行されたとき、for()文の処理が途中の時、最大300msec * 7の待ちが発生する。その待ちを待たない場合にソフトが終了すると、workが開放されないことによるメモリリークが発生してしまう。FastMMにてその兆候を捉えた。


以下にすることで、待ち時間は最大300msecに減らすことができる。

```
void func() {
   TUdpThread *work = new TUdpThread();

   for(int idx=0; idx < 7; idx++) {
      if (m_bfStop) {
         break;
      }
      // 300msecタイムアウトの通信
   }
   work->Terminate();
}
```

「300msecタイムアウトの通信」の内部処理においてもm_bfStopが立った時点ですぐに抜けることで、さらに待ち時間を減らすことができる。

別途、短い時間しか処理をしないスレッドを立てる設計は要改善事項かもしれない。

現状取り組んでいるコードにおいて上記の変更をしたところ、関連するメモリリークを取り除けた。
イラレでWEB用パーツをドラックだけで書き出す（アセットの書き出し）

#表示の確認

「表示＞ピクセルプレビュー」

これでベクターではなくpxで表示してくれる

#書き出し方法
スライスで…という方法があったが、2016/6のアップデートで便利な機能が追加された
##アセットの書き出し
「ウィンドウ＞アセットの書き出し」から表示、もしくは
ショートカットキー：Alt + Ctrl + E（Windows）／Cmd + Opt + E（Mac）を押します。
<img width="273" alt="スクリーンショット 2016-08-18 10.49.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/13952/2b0e28f9-b3d1-c35f-77e6-5f03badbbdeb.png">


表示された窓に、書き出したい部分を選択して、そのままドラッグ

すると、窓に要素が追加されます。
<img width="277" alt="スクリーンショット 2016-08-18 10.49.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/13952/00775cab-2dd6-29f9-76b5-926bfe662f0c.png">

一通り追加された後、
全ての要素を選択して右下の書き出しをクリック。
<img width="274" alt="スクリーンショット 2016-08-18 10.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/13952/f285e9fe-a8b7-58d5-4819-0aaff30c4ff2.png">

書き出したい場所のフォルダを選んで、無事書き出し完了！

斜め線がある画像はギザギザになって汚い場合もあるので、
一応一通り表示して確認した方が良い。

もし、ギザギザになってしまった場合は、
書き出しの大きさを変更できるので大きめにして後から画像を縮小した方が綺麗になる。
…他にいい方法があれば、そうしたいけど。

参考：adobe illustrator ヘルプ
https://helpx.adobe.com/jp/illustrator/using/collect-assets-export-for-screens.html
WCFの接続制限の調査

# WCFの接続制限に関する設定を調査してみた

作成したアプリケーションのパフォーマンスに問題があって、WCFの接続制限になにがあるのか調査してみた。

# WCFのプロセスモデル

WCFサービスを作成するときは、アクティブ化と同時実行のモデルを決める必要があります。このモデルは ServiceBehavior属性のInstanceContextModeとConcurrencyModeで制御します。

ConcurrencyModeをSingleまたはReentrantに設定するときは、InstanceContextModeをSingleに設定しないようにします。ConcurrencyModeをMultipleにし、粒度の細かいロックを使用すると同時実行のパフォーマンスが向上します。

|InstanceContextMode|意味|
|:----|:----|
|PerCall|呼び出すたびにサービスオブジェクトのインスタンスを作成する。|
|PerSession(規定値)|セッションごとにサービスオブジェクトのインスタンスを作成する。チャンネルが複数のセッションをサポートしなければPerCallと同じ。|
|Single|すべての呼び出しに一つのサービスオブジェクトのインスタンスを再利用する。|

|ConcurrencyMode|意味|
|:----|:----|
|Single(規定値)|サービスオブジェクトはシングルスレッド処理になり、再入可能はサポートしない。新たな要求は待機状態になる。|
|Reentrant|サービスオブジェクトはシングルスレッド処理になるが、再入可能。再入が行われるので、別のサービスを呼び出す前にオブジェクトを一貫した状態に保つ必要がある。|
|Multiple|同期は保証されないため、サービスは独自に同期を処理し、状態の一貫性を確保する必要がある。|

OperationBehavior.ReleaseInstanceModeにReleaseInstanceMode.None以外の値を設定することで、インスタンスの生存期間をコントロールできます。ServiceBehavior.ContextModeがPerSessionのときに組み合わせて使用すると効果があります。

|ReleaseInstanceMode|意味|
|:----|:----|
|AfterCall|サービスメソッド呼び出し後にインスタンスを破棄する。|
|BeforeCall|サービスメソッド呼び出し前に既存のインスタンスを破棄し、新しいインスタンスを作成する。|
|BeforeAndAfterCall|サービスメソッド呼び出し前に新しいインスタンスを作成し、呼び出し後にインスタンスを破棄する。|
|None(規定値)|インスタンスの破棄はServiceBehavior.InstanceContextModeにより決定される。|


# WCFの接続制限に関する設定

ServiceThrottlingには同時実行の制限があります。

* maxConcurrentSessions : 同時に処理されるメッセージ数。
制限数を超える呼出しはキューに登録される。
規定値は.NET 3.5では10、.NET 4では論理プロセッサ数の100倍。

* maxConcurrentCalls : 同時に実行されるInstanceContextオブジェクト数。
制限数を超えるインスタンス作成要求はキューに登録され、制限数を下回りスロットが利用可能になると作成が完了する。
規定値は.NET 3.5では16、.NET 4では論理プロセッサ数の16倍。

* maxConcurrentInstances : オブジェクトが許容できるセッション数。
制限数を超える接続を受け入れるが、制限数以下のチャネルしかアクティブにならない。
規定値は.NET 3.5では26、.NET 4では論理プロセッサ数の116倍。

```:app.config
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceThrottling>
        <serviceThrottling 
          maxConcurrentCalls="16" 
          maxConcurrentSessions="10" 
          maxConcurrentInstances="26"
        />
      </serviceThrottling>
    </behaviors>
  </system.serviceModel>
</configuration>
```

# TCPレベルの接続制限

アプリケーションがホストごとに許可される同時接続数の規定値は２つです。
外部WCFサービスを呼び出す場合に、この制限がボトルネックになります。
他にもOSの接続制限があります。

```:app.config
<configuration>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "2" />
    </connectionManagement>
  </system.net>
</configuration>
```

# スレッドプールの制限

WCFはスレッドプールのI/O完了スレッドからサービスオブジェクトを呼出します。
ASP.NETではsystem.Webセクションを編集します。デスクトップアプリではThreadPool.SetMinThreadsとThreadPool.SetMaxThreadsを呼び出します。
規定値は、Minの方のスレッドプール数が4、非同期I/Oが4で、Maxの方のスレッドプール数が1023、非同期I/Oが1000です。

```
<system.Web>
  <processModel 
    maxWorkerThreads="num"
    maxIoThreads="num"
    minWorkerThreads="num"
    minIoThreads="num"
  />
</system.Web>
```

```
ThreadPool.SetMinThreads(ワーカスレッドの下限, 非同期I/Oスレッドの下限);
ThreadPool.SetMaxThreads(ワーカスレッドの上限, 非同期I/Oスレッドの上限);
```


## 参考

https://www.amazon.co.jp/dp/4798131792
http://www.pine4.net/Memo/Article/Archives/17
PNGファイルのデータ容量を圧縮できる無料ツール「Pngyu」

# 透過PNGはデータ容量が大きくなりがちなので圧縮しよう

透過PNGはフルカラーで透明度も表現できるぶん、データ容量が大きくなりがち。パソコン用のコンテンツであればそこまで気にすることはありませんが、データ通信量にシビアなスマホ用のコンテンツはそのままの状態で使用するのは危険です。それを解決するために、**PNGファイルを圧縮することをおすすめします。**

# PNGファイルのデータ容量を圧縮できる無料ツール「Pngyu」

Windows、OS Xともにサポートされている無料のツール「[Pngyu](https://nukesaq88.github.io/Pngyu/)」を使用して画像を圧縮する方法を紹介します。

## 1. Pngyuのダウンロード

記事更新時点(2016年8月18日)での最新バージョンは1.0.1なので、公式サイトからZIPファイルをダウンロードします。ダウンロードしたZIPファイルは任意の場所で展開ください。

## 2. 画像を読み込む

ダウンロードしたZIPファイルを展開すると、アプリケーションが入っています。そのファイルをダブルクリックで起動し、画像単体または画像が入ったフォルダーをドラッグ＆ドロップします。

## 3. 連番画像の圧縮

画像が読み込めたら[Compress Start]ボタンをクリックして圧縮します。

![160603_line_stamp_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/083eb411-c0c0-d46d-39ab-465ef81c704b.jpeg)

# 圧縮結果

圧縮前後では見た目の変化は特に見られませんが、データ容量は39KBから14KBへと約61％ほど圧縮できました。

![frame0001-before.png](https://qiita-image-store.s3.amazonaws.com/0/55103/d335e9ad-ec27-2638-face-6fe6827e3584.png)

▲圧縮前(39KB)

![frame0001-after.png](https://qiita-image-store.s3.amazonaws.com/0/55103/760a4f92-d7c6-3962-20b5-62464f98d32b.png)

▲圧縮後(14KB)
GitHubのソースコードをWebページとして公開する手順（GitHub Pages）

GitHubでは、サーバーを自前で準備しなくてもWebページを公開できる「GitHub Pages」という機能があります。これまでは、gh-pagesという別ブランチを作成して、そこにソースコードをプッシュする必要がありました。しかし、**本日(2016/08/18)実装された新機能により、masterブランチのみでWebページを公開できるようになりました**。

本エントリーでは、具体的な設定手順を紹介します。

# 手順
masterブランチにて、「docs」フォルダーを作成します。このフォルダーに公開したいWebページのソースコードを入れます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/362b5680-9676-0fb9-094c-251ea33ba495.png)

masterブランチをプッシュします。

GitHubのリポジトリページ上で、[Setting]→[Pages]に移動します。

[Source]の箇所から、「Branch: main」、「/docs」フォルダーを指定します。

![CleanShot 2022-02-20 at 17.53.15@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67884/68260a37-8cb6-5bfa-1e55-87274a20a7d5.png)

[Save]を押すと、下図の赤枠部分に公開されたWebページのURLが表示されます。URLは`https://(ユーザー名).github.io/(リポジトリ名)/`となります。


![CleanShot 2022-02-20 at 17.53.44@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67884/fa7c5e9c-862f-0415-6d58-b5b703c3c71f.png)


URLにアクセスすると、docsフォルダー以下にWebページが閲覧できます。サンプルページを公開しました。

■ リポジトリ
https://github.com/tonkotsuboy/16018_myProject

■ 公開Webページ
https://tonkotsuboy.github.io/16018_myProject/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67884/917ef1b5-bf41-a885-838d-2701ed14c1cf.png)


▲ 公開Webページのキャプチャー 


HTML、CSS、画像ファイル、JavaScript(コンソールログを出力しています)が正しく反映されているのがわかります。

# mainブランチで作業できるのは非常に便利
サーバーを別途準備せずにWebページを公開できるGitHub Pages機能は重宝していましたが、これまで別ブランチgh-pagesで作業する必要があり、masterブランチとの差分をマージするのが手間でした。今回の新機能により、**最新ファイルをmainブランチで管理できるようになり、利便性が高まりました**。

是非ご利用ください。
Pythonにおけるlistのfind的なやつ


イテレータを走査して条件にマッチする最初の値を返す関数
(JavascriptやRubyのfindにあたるもの)

Python公式のitertoolsレシピに載っている
http://docs.python.jp/3/library/itertools.html

```py3:
def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)
```
HCP上のSAPUI5アプリケーションからOAuth2.0認証が必要な外部APIサービスを呼び出す

少し前ですがSAP Community Networkに下記の記事を投稿しました
[HCP上のSAPUI5アプリケーションからOAuth2.0認証が必要な外部APIサービスを呼び出す](http://scn.sap.com/community/japanese/blog/2016/07/15/hcp%E4%B8%8A%E3%81%AEsapui5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8B%E3%82%89%E5%A4%96%E9SAP HCPネタなど誰が読むのだろうという懸念を持ちつつ、業務系PaaSとしての普及を願っています。%83%A8api%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99)

FitBitのデータをSAP Fiori上で表示する際の手順を解説していますが、SAP HANAN Cloud Pltfrom(HCP)というPaaSから外部のRESTサービスを呼び出したい場合
JSONデータをFioriにセットしたい場合
などの参考になるかと思います。

JavaScriptにはかなり久しぶりに取り組んだので、まずい書き方はいろいろあるかと思いますが、ご指摘頂ければ幸いです。
CentOS7へのAnsible導入


## インストール要件の確認
AnsibleはPython 2.6+なので要件を確認。

```
$ python --version
Python 2.7.5
```

## インストール

AnsibleはEPELリポジトリからインストールするので、EPELリポジトリが未インストールの場合はEPELリポジトリをインストールする。

```
$ sudo yum -y install epel-release
```

Ansibleをインストールする。

```
$ sudo yum -y install ansible
```

Ansibleのバージョン確認する。

```
$ ansible --version
ansible 2.1.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
```

あっさりインストールが完了。

## Ansibleを構成する主な３要素
* インベントリ（inventory）

インベントリは構成管理をする対象ノードへの接続情報を記載したもの。
デフォルトでは `/etc/ansible/hosts` だが、環境変数 `ANSIBLE_HOSTS` を設定したり、`-i` オプションで`hosts`ファイルへのパスを指定可能です。

* モジュール（module）

モジュールはユーザーを作成したり、ファイルをコピーしたりするもので、多くは冪等性が保たれたものとなります。基本モジュールをそのまま利用するだけで大抵の事ができます。自分でモジュールを作ることもできます。モジュールは`-m`オプションで個別に実行することも可能です。

* プレイブック（playbook）

プレイブックは複数のモジュールを組み合わせて、WEBサーバを構築するとか、DBサーバを構築するとか、の手順を記述したものです。こちらも冪等性を保つように作ります。

## Hello World

`-m`オプションで`ping`モジュールを`localhost`ノードに対して実行します。

```
$ ansible -m ping localhost
```

```:実行結果
 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

```

## インベントリの定義

インベントリが空だと警告が出てウザいので、ノード`localhost`を定義しておきます。

```
$ echo "localhost ansible_host=127.0.0.1 ansible_connection=local" > hosts
```

Ansibleは通常SSHで接続をします。
インベントリに`ansible_connection=local`と記述するか、`--connection local`オプションをするとSSHを使わずにローカルで実行します。

`-i`オプションでインベントリファイル`hosts`を指定し、`-m`オプションで`ping`モジュールを`localhost`ノードに対して実行します。

```
$ ansible -i hosts -m ping localhost
```

```:実行結果
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

はい、警告が出なくなりました。

## 全てのノードにpingモジュールを実行

`-i`オプションでインベントリとして`hosts`を指定し、`-m`オプションで`ping`モジュールを、インベントリに記載の全てのノードに実行します。

```
$ ansible -i hosts -m ping all
```

```:実行結果
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

インベントリには1つしか記載がないので結果は変わりません。
[SCN投稿]FioriアプリケーションにGoogle Analytics機能を埋込む

SAP Community Networkに記事を投稿しました。
[FioriアプリケーションにGoogle Analytics機能を埋込む](http://scn.sap.com/community/japanese/blog/2016/08/16/fiori%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%ABgoogle-analytics%E6%A9%9F%E8%83%BD%E3%82%92%E5%9F%8B%E8%BE%BC%E3%82%80)

SAP Fioriは業務系のUIセットで、知名度は低いのですが、業務系アプリケーションをWeb化する際のノウハウが詰まっているのでもっと普及するといいなと思っています。

そんな思いからいろいろなTipsを検証しています。

今回はFioriにGoogle Analytics機能を埋め込むためのTipsを投稿しました。
SAP Fiori開発ではHTMLファイルを書かないので（画面定義のXMLと、振る舞いを定義するJavaScriptファイルで基本的に記述）、Google Analyticsの利用にはちょっとした工夫が必要となります。その手始めとして下記記事を投稿しました。

これまでWeb系の開発をされていた会社が、主に大企業で採用されているSAPアプリケーションの分野に進出される際に、参考にしていただければと思います。
コルーチンをUpdate内で呼んだ場合の挙動

なんとなく理解しにくいので嫌だったコルーチンを調べてみた。

`yield return null;`
↑で，次のフレームで続きから処理が始まる。
それならUpdateで連続で呼ぶとどうなるんだ？と思って以下のサンプルを作成。

```sample.cs
	void Update () {
		Debug.Log("Update:" );
		StartCoroutine("Sample");
		//アップデートの中で呼ぶと危険
	}

	private IEnumerator Sample(){
		int i = 0;

		Debug.Log("yield:"+ i + ":" + 1);
		yield return null;
		i++;

		Debug.Log("yield:"+ i + ":" + 2);
		yield return null;
		i++;

		Debug.Log("yield:"+ i + ":" + 3);
		yield return null;
		i++;

		Debug.Log("yield:"+ i + ":" + 4);
		yield return null;
		i++;

		Debug.Log("yield:"+ i + ":" + 5);
		yield return null;
		i++;

	}
```

## 結果

<img width="213" alt="Main2_unity_-_update_lateupdate_timing_-_PC__Mac___Linux_Standalone__Personal___OpenGL_4_1_.png" src="https://qiita-image-store.s3.amazonaws.com/0/55446/972e08f9-75e0-176f-91a3-4534a0414bdd.png">

結果を見ると，まぁそっか(他の人が書いている通りだよね）となった。

+ １フレーム目
Updateが実行されて，その中で
コルーチン(００１と命名)が実行されて， yield:0:1 を出力

+ 2フレーム目
Updateが実行されて，その中で
新しいコルーチン(００2と命名)が実行されて， yield:0:1 を出力
次に，001のコルーチンの続きが実行されて　yield:1:2 を出力

以降これのループになる。

### 気づいたこと
+ 新しいコルーチン処理ほど先に実行される
    + だからきれいな順番で値が出力されている
Salesforceにランディングページに直アクセス


##Salesforceにブラウザからランディングページを直で表示させる方法
---
[https://developer.salesforce.com/forums/?id=906F00000008jcWIAQ](https://developer.salesforce.com/forums/?id=906F00000008jcWIAQ)
より。

URLはズバリ

```
https://login.salesforce.com?un=[ユーザーの名前]%40[@以降]&pw=[パスワード]&startURL=[ランディングページのURL]
```

%40が＠（アットマーク）の代わりとなりますので例えばランディングページがhoge@example.com　で パスワードが yourpassword ランディングページのURLが　http://hogehoge.com
ならば・・・

```
https://login.salesforce.com?un=hoge%40example.com&pw=yourpassword&startURL=http://hogehoge.com
```
でアクセス出来ると思います。

以上。
文字コード違うファイル間で2バイト文字条件分岐

ホントは使いたくないけど使わざるを得なかったVBS備忘録。
この無駄な苦労を繰り返さないために。

#####2つライブラリ導入＆初期設定  
BASP21は適当に放り込んでおく

```VBScript
Set oUtf8BinaryConverter = CreateObject("basp21")
Set oUtf8ShiftjisConverter = CreateObject("Microsoft.XMLDOM").createElement("tmp")  
oUtf8ShiftjisConverter.DataType = "bin.hex"   
```
#####2バイト文字は文字コードを16進数で直打ちしてバイナリ化  
文字コードを自動算出する気力は無かった

```VBScript
oUtf8ShiftjisConverter.Text = "819b"	'これは"○"
bitAppropriate1 = oUtf8ShiftjisConverter.NodeTypedValue  
```
#####1バイト文字ならMicrosoft.XMLDOMライブラリでバイナリ化

```VBScript
bitAppropriate2 = oUtf8BinaryConverter.ByteArray(strTwoBiteText,0) 
```
#####MidB関数で再度文字列化して比較  
中身はカオスな文字化け状態

```VBScript
IF MidB(bitAppropriate1,1) = MidB(bitAppropriate2,1) THEN
  ...
END IF
```
LaravelのバリデーションでDBのテーブルの値を条件に使用する方法

Laravelのバリデーションルールはさまざまなものが用意されていて、非常に便利です。
バリデーションルールにDBのテーブルの値を見てチェックするようなルールを追加したかったため調べてみたところ、そこもカバーされていました。

> exists:テーブル、カラム
：フィールドの値が、指定されたデータベーステーブルに存在することをバリデートします。

例えば、categoriesテーブルのIDにその値が格納されているかどうかをバリデートしたいときは、以下の様な設定になります。

```php
$rules = ['category' => 'required|exists:categories,id'];
```

しかし、このままだとSoftDeletesしたレコードも対象となってしまいます。そこはLaravelがよしなにしてくれるわけじゃないんですね…。
ということなので、以下のように`deleted_at=NULL`を条件に追加しましょう。

```php
$rules = ['category' => 'required|exists:categories,id,deleted_at,NULL'];
```

これでSoftDeletesされたレコードは対象外となります。
ちなみに注意するべきところとしては、`NULL`または`NOT_NULL`を大文字で指定しないと動作しません。`null`でもなく、`Null`でもないです。小文字で指定すると文字列として指定されてしまうため、気をつけましょう。


参考記事
http://readouble.com/laravel/5/1/ja/validation.html
自動補完 AutoCompleteTextView

## AutoCompleteTextViewとは
自動補完を備えもったEditTextのことです。
自動補完とはキーボードによるインプットに対して、自動で文字を補完してくれる機能です。(そのまま..)
[AutoCompleteTextView](https://developer.android.com/reference/android/widget/AutoCompleteTextView.html)

これがauto complete
![image](https://qiita-image-store.s3.amazonaws.com/0/43762/265b3602-ea70-3cd1-62b0-7ffe875915e2.png)


## 実装
普通に実装すると、大体以下の3クラスを使うかと思います。
1. EditText
2. ArrayAdapter
3. Filter

1. EditTextは普段通りに使ってあげてください。
2. ArrayAdapterには、EditTextに文字を入力した際に、その下にドロップダウンメニューとして表示させてあげたいデータを渡してください。

3. ArrayAdapterのgetFilterというメソッドをオーバーライドしてあげて、文字をフィルタリングするFilterを返してあげます。(ここをカスタムFilterにします。)

```ArrayAdapter
@Override
public Filter getFilter() {
　　　　return new CustomFilter();
}
```

```Filter

// 上のメソッドから順番に呼ばれる

@Override
protected FilterResults performFiltering(@Nullable CharSequence constraint) {
　　　　// ごにょごにょ自分でfilteringの条件を実装する。
　　　　filterResults.values = items;
　　　　filterResults.count = items.size();
　　　　return filterResults;
}

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
　　　　if (results != null && results.count > 0) {
　　　　　　　　notifyDataSetChanged();
　　　　} else {
　　　　　　　　notifyDataSetInvalidated();
　　　　}
}
```

AdapterでFilterを取得して、そのFilterはテキストを編集する度に呼ばれる(厳密にはデフォルト2文字以上)performFiltering()を実装していて、そのメソッド内で具体的なフィルタリングの条件を実装する。
そこで返した、FilterResultsがpublishResults()の引数として流れてくる。
それをpublishResults()で更新してあげる。

ここまでは普通の実装なんですが、ドロップダウンメニューのアイテムをカスタムビューにしたかったので、それを実装しようとトライしたがうまくいかず。

このカスタムビューを作りたい。
![image](https://qiita-image-store.s3.amazonaws.com/0/43762/265b3602-ea70-3cd1-62b0-7ffe875915e2.png)

`IllegalStateException: ArrayAdapter requires the resource ID to be a TextView`

が出てました。

問題はgetView()をオーバーライドすることで解決されました。
ArrayAdapterのgetDropDownView()をオーバーライドしてその中身をカスタムビューで実装していたんですが、getDropDownView()ではなく、getView()を実装しなければいけなかったみたいです。(ややこしい。。。)

正しくはこちら。

```
@Override
public View getView(int position, View convertView, ViewGroup parent) {
　　　　DropDownViewHolder holder;
　　　　if (convertView == null) {
　　　　　　　　convertView =　inflater.inflate(R.layout.view_dropdown_item_hashtag, parent, false);
　　　　　　　　holder = new DropDownViewHolder(convertView);
　　　　　　　　convertView.setTag(holder);
　　　　} else {
　　　　　　　　holder = (DropDownViewHolder) convertView.getTag();
　　　　}
　　　　// データをviewにセット。　　　
}
```

ListViewのいつものやつです。
getView()じゃなくて、getDropDownView()なのは、直感的にすごい違和感があったんですが、DropDownViewとしてではなく、あそこに表示されるのは、ListViewってことなんですね。

ちなみにデータの取得は、APIとかContentProviderとか、色々あると思うので仕様によって実装変えましょう。[SearchManager](http://y-anz-m.blogspot.jp/2010/03/android-searchmanager.html)


## 最後に
EditTextに入力した文字の候補をリアルタイムでAdapterとFilter(文字表示条件を絞る)を使って表示する。
ドロップダウンメニューにカスタムビューを利用する際には気をつけて下さい。という話でした。
複数のUpdateとLateUpdateはどういう順番で起こるのかを調べた

すごく基礎的な内容だけど，

Aオブジェクトが一つだけある場合，update →　LateUpdateの順番で起こることは分かる。

じゃあ，Aオブジェクト，Bオブジェクト,,,,と複数オブジェクトがあった場合，AのUpdateとBのLateUpdateはどっちが先に処理されるのかが分からなかったので調べてみた。

### 結果
<img width="244" alt="Main_unity_-_update_lateupdate_timing_-_PC__Mac___Linux_Standalone__Personal___OpenGL_4_1_.png" src="https://qiita-image-store.s3.amazonaws.com/0/55446/7690094d-813a-0e45-97c5-7f5be7f52a49.png">

+ 全部のオブジェクトのStartがまず実行される
+ 次に全部のオブジェクトのUpdateが実行される
+ 次に全部のオブジェクトのLateUpdateが実行される

### ここから考えたこと

+ 複数オブジェクトの中で１つでも重いUpdateがあると，全部のオブジェクトのLateUpdateに影響する
+ AオブジェクトのUpdateで計算する値は，BオブジェクトのUpdateから参照した場合まだ計算が済んでいない場合がある(各オブジェクトのUpdateの順番はランダムだから)が，BオブジェクトのLateUpdateから参照すれば必ず計算後の値が取得できる。
c++ builder > 2進数リテラル (0b11) > XE4では未対応のようだ

```txt:動作環境
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/eae06dfd76e15ee2ca7c

0b11という表記でエラーが出ている。

[stackoverflow](http://stackoverflow.com/questions/38993346/cbuilder-binary-number-0b1-causes-error-e2141/38994815#38994815)で質問したところ、以下のような回答をいただいた。

> by Kerem D
> If you want to compile this, you will need a newer version of the C++ Builder with a C++11 compiler.

「0b c++11」などで検索して以下を見つけた。

http://faithandbrave.hateblo.jp/entry/20130502/1367481106
> C++14から、2進数リテラルが言語組み込みで導入されることが決まりました。
0bもしくは0Bというプレフィックスを付けたあとに、0か1のシーケンスを記述します。

https://cpplover.blogspot.jp/2014/09/c14-2.html
> 2進数リテラルとは、C++14に追加された新しい整数リテラルである。その文法と意味は、文章で解説するよりも、コードを読んだほうが理解が早いだろう。

XE4では対応してないようだ。

[stackoverflow](http://stackoverflow.com/questions/38993346/cbuilder-binary-number-0b1-causes-error-e2141/38994815#38994815)にてRemy Lebeauさんの回答もついた。その一部。
> The current C++Builder compilers support only decimal, octal, and hex. See Embarcadero's documentation for details: [Integer Constants](http://docwiki.embarcadero.com/RADStudio/XE4/en/Integer_Constants)

「Integer constants」というキーワードで検索すればよかったようだ。
[Visual Studioのページ](https://msdn.microsoft.com/en-us/library/00a1awxf.aspx)
【5秒で使える小ネタ】Unicodeエスケープされた文字列をデコードする

### これは何？
エスケープされた文字列

```
\u65e5\u672c\u8a9e
```

を

```
日本語
```

こんな感じに戻す小ネタです。
結果だけ知りたい人は、最後の「使い方」だけどうぞ。

### なにが良いのか

何かとcurlしたりして、JSONのレスポンスみたいときunicodeエスケープされててなんじゃこりゃーとなるとき、ありますよね？

そんな時にさっと見れて便利。

### 事前知識・必要スキル
1. コンソール上からコマンドを使って標準入出力ができる
1. nkfを使うのでインストールしてあること

### 使い方

```
sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w
```

#### 実行例

```
echo "\u65e5\u672c\u8a9e" | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w
日本語
```
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？　その４（開発環境の構築）

開発環境の構築記事を追加しました。

http://gwt-japan.dix.asia/GWT_JAPAN

ＧＷＴの最初の難関は開発環境の構築です。
日本語での記事があっても、古いバージョンの為、手順が異なったり、
ファイルがなかったり、プラグインが対応していない場合もあるので、
現時点でインストールが可能な手順となっております。
Javaで関数型言語のreduceを実装してみる part2

※この文章はまだ書きかけです
#始めに
前回の投稿のコメントでの指摘を修正したソースをアップしています。
また、reduceを実装して感じたことをまとめます。
#前回の投稿の修正
[Javaで関数型言語のreduceを実装してみる](http://qiita.com/triple4649/items/cbb7b1451ca97149f8e1)のコメント欄で指摘のあった点を踏まえてソースを修正しました
#reduceを実装して感じたこと
以下の観点でまとめます
- 末尾再帰と最適化
- ループは直感的ではない（個人的な主観です。異論はたくさんあると思います。）
- データ構造を探索する人と探索した人が見つけたものを使う人


#修正後のソース

``` FuncTest.java
package test;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.List;

public class FuncTest {
	static public class Reduce<T>{
		//外部に公開するメソッドはpublicにする
		public T reduce(Collection<T> b,Function<T> f){
			return reduce(b,f,null);
		}
		//内部のロジックを処理するの使うメソッドはprivateにする
		private  T reduce(Collection<T> b,Function<T> f,T t){
			Deque<T> a = new ArrayDeque<T>(b);
			//スタックの要素がなくなったら再帰処理を終了する
			if(a.size()==0){
				return t;
			}
			//要素数1のリストが渡された場合
			else if (a.size() == 1){
				//最初に再帰処理が呼び出された時の処理
				if(t==null)return a.pop();
				//2回目以降に再帰処理が呼び出された場合は引数で渡された合計値と
				//スタックの先頭を引数で渡されたインナークラスのメソッドに渡す
				else{ t = f.aply(t,a.pop());}
			}
			//要素数2以上のリストが渡された場合
			else
			{
				//最初に再帰処理が呼び出された時の処理
				//Stackの一番目と2番目を引数にセットする
				if(t==null){t = f.aply(a.pop(),a.pop());}
				//2回目以降に再帰処理が呼び出された場合は引数で渡された合計値と
				//スタックの先頭を引数で渡されたインナークラスのメソッドに渡す
				else{t = f.aply(t,a.pop());}
			}
			return reduce(a,f,t) ;
		}
	}

	//Functionクラスのインターフェイス　abstractクラスで定義する
	static  abstract class Function<T>{
		public abstract T aply(T a, T b);
	}
	//配列の中身をすべて足し算します
	static class  FunctionAsAdd<T> extends Function<Integer>{
		public Integer aply(Integer a, Integer b){return a+b;};
	}
	//配列の中身をすべて掛け算します
	static class FunctionAsMultiplication<T> extends Function<Integer>{
		public Integer aply(Integer a, Integer b){return a*b;};
	}
	//配列の文字列をすべて連結します
	static class FunctionAsString<T> extends Function<String>{
		public String aply(String a, String b){return a+b;};
	}
	
	public static void main(String args[]){
		List<Integer>list = new ArrayList<Integer>();
		Collections.addAll(list, 1,2,3,4,5,6,7,8,9,10);
		System.out.println(
				(new Reduce<Integer>())
				.reduce(list,new FunctionAsAdd<Integer>())
				);//55が表示される
		System.out.println((new Reduce<Integer>())
				.reduce(list,new FunctionAsMultiplication<Integer>())
				);//3628800が表示される
		List<String> stringList= Arrays.asList( 
				new String[]{"1","2","3","4","5","6","7","8","9"});
		System.out.println((new Reduce<String>())
				.reduce(stringList,new FunctionAsString<String>())
				);//123456789が表示される
	}
}
```
pipsi: システムのpipを汚さずにパッケージを利用する


## はじめに

Pythonスクリプトの文法チェックのためにflake8を使いたかったものの
アプリケーションの動作に必要のない	パッケージを`pip install`したくなかった。
ちょっと探すと良さそうなものがあったので導入。

## pipsiとは

[mitsuhiko/pipsi](https://github.com/mitsuhiko/pipsi)

> pipsi = pip script installer
> 
> What does it do? pipsi is a wrapper around virtualenv and pip which installs scripts provided by python packages into separate virtualenvs to shield them from your system and each other.
> 
> In other words: you can use pipsi to install things like pygmentize without making your system painful.

（ざっくり要約すると）
pipsiはvirtualenvとpipのラッパで、仮想環境とシステムを分離することにより
システムを汚さずにパッケージをインストールできます。

> pipsi installs each package into ~/.local/venvs/PKGNAME and then symlinks all new scripts into ~/.local/bin.

pipsiはパッケージを`~/.local/venvs`以下にインストールし
スクリプトへのシンボリックリンクを`~/.local/bin`に生成します。

## 導入

### 環境

ローカルに[Pythonが動くDebianの環境](https://github.com/docker-library/python/blob/9a9021f2134d953165b31d98cacb95aa34076f90/3.5/Dockerfile)を用意しました。

```bash:Dockerの操作
# Pythonイメージのダウンロード
$ docker pull python:3.5.2

# コンテナを起動してbashを実行
$ docker run -it {IMAGE ID} /bin/bash
```

説明のためにsudo権限を持ったユーザを作成しておきます。
（`sudo`自体の導入などが必要でしたが、割愛します）

```bash:hogeユーザの追加
$ adduser hoge
$ gpasswd -a hoge sudo	
```

### 手順

READMEに従って、`curl`と`python`のコマンドを実行します。

```bash:pipsiのインストール
$ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2805  100  2805    0     0   6466      0 --:--:-- --:--:-- --:--:--  6463
Installing pipsi
You need to have virtualenv installed to bootstrap pipsi.
```

virtualenvがなかったためにエラーが出ました。
やむなし、pipでvirtualenvのみインストールします。
（[virtualenvのドキュメント](https://virtualenv.pypa.io/en/stable/installation/)曰く、ローカルインストールも可能そうですが面倒でした）

```base:virtualenvのインストール
$ sudo pip install virtualenv
$ pip list
pip (8.1.2)
setuptools (20.10.1)
virtualenv (15.0.3)
```

完了したら、再度pipsiのインストールコマンドを実行します。

```bash:pipsiのインストール
$ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python
```

インストールは成功しますが、Warningが表示されます。

```bash:Warning
Warning:
  It looks like /home/hoge/.local/bin is not on your PATH so pipsi will
  not work out of the box.  To fix this problem make sure to
  add this to your .bashrc / .profile file:

  export PATH=/home/hoge/.local/bin:$PATH
```

動かすためにはPATHに`~/.local/bin`を追加しなさいとのこと。
ここではシェル上で実行しますが、ログインのたびに反映させるのであれば
指示通りに設定ファイル内への記述が必要です。

```bash:PATHの追加
$ export PATH=/home/hoge/.local/bin:$PATH
$ echo $PATH
/home/hoge/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
```

これで準備は完了しました。
pipsiを使って管理したいパッケージをインストールします。

```bash:パッケージのインストール
$ pipsi install flake8
$ which flake8
/home/hoge/.local/bin/flake8
```

システムのpipには含まれていないことがわかります。

```bash:pipの確認
$ pip list
pip (8.1.2)
setuptools (20.10.1)
virtualenv (15.0.3)
```

## むすび

サーバを使い捨てることが増えて、少々パッケージ管理は荒くなったものの
共用の環境で開発するようなときには重宝しそうです。
Pythonを書かない方でも、[httpie](https://github.com/jkbrzt/httpie)や[mycli](http://mycli.net/)などのツール管理に使えそうです。
AD2 > I2C > コード一覧表示 > View Events / 1ms/div

```txt:環境
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
Analog Discovery 2 (以下AD2)
```

MSC-MOD20のソフト開発のため、I2Cのコード読取りをしている。

AD2を用いてのコード確認は、波形の画像の中に表示されるコードを目視してきたが、送受信コードの一覧表示機能がAD2には用意されていた。

### 表示方法

[View]-[Events]にて右側にコード一覧が表示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d4d58a5e-2cc7-e026-a647-f62e67eccf21.png)

Time(s)の分解能の設定は分からないが、1ms/divという設定が効いているのかもしれない。

「Filter」という項目に指定のコードを入力することで、その受信時刻を見ることができる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8773880a-b08a-89c4-f727-79c123bb9b56.png)

この一覧で表示される数値は、[File]-[Export]にてDataタブでファイル出力もできる。Imageタブだと波形画像をファイル出力できる。

また、一覧の中でクリックしたコードの位置が波形画像内にて赤色の縦線で表示されるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dd737c3e-767a-4cb4-4f27-0ba7ae1deb30.png)

この機能を使って、例えばh21(!マーク)の位置を波形画像内で見つけて、そのあとの数値(MSC-MOD20のエラーコード)の確認がしやすそう。

Eventsに表示される数値の一覧は各Sourceページのデータに対応するようだ。Sourceページ数を変更すると連動して一覧も変更される。
技術英語 > the Principle of Proximity

@ Code Complete (No. 8142 / 36077)

> This is an example of <font color=red>the Principle of Proximity</font>: keep related actions together.

http://ejje.weblio.jp/content/proximity
> 近接

<hr>
関連記事

[技術英語 / 電子工作 > リスニング > What is a Capacitive Proximity Sensor?](http://qiita.com/7of9/items/e77ba2192a6e090144e8)

[ui > 類同の法則 > 同じ形、同じ色、同じ向きなど、共通の特徴をもつ図形同士は、グループとして認知されやすい](http://qiita.com/7of9/items/9eb0d428c3b12494ed93)
「組合せ最適化でグループ分け」Haskellでやってみた 2


元記事:[組合せ最適化でグループ分け](http://qiita.com/Tsutomu-KKE@github/items/9218e39a6604b2e0be14)
元々記事:[【日常に潜む最適化問題】受験者をなるべく均等に試験会場に割り振るアルゴリズム](https://codeiq.jp/magazine/2014/06/10973/)
が勉強になったので、Haskellでやってみたメモ。

[「組合せ最適化でグループ分け」Haskellでやってみた](http://qiita.com/ttatsf/items/3789159bc4e880cc07bc)の補足です。

#アルゴリズム
アルゴリズムについては、元々記事:[【日常に潜む最適化問題】受験者をなるべく均等に試験会場に割り振るアルゴリズム](https://codeiq.jp/magazine/2014/06/10973/)の中で、5グループ、3部屋の例で詳しく説明されています。

元々記事より引用：
![マトリックス](https://codeiq.jp/magazine/wp-content/uploads/2014/06/img6.jpg )

Haskellでやってみる際にも、この通り踏襲させていただくことにしました。
ただし、配列でforループでなく、リストで畳み込みでやるので当然違ってくるはず。
「Pythonによる実装」では、どうも組み合わせとかの便利なライブラリを使っているようなのですが、その辺の知識もまったくありません。

何度か試行錯誤して、これだったら畳み込めんじゃね?と思いついた時の手計算のメモです。

![無題 3.png](https://qiita-image-store.s3.amazonaws.com/0/61597/d3da6ea5-c02b-a0b7-3274-c9c868cdf743.png "無題 3.png")


やってることは同じですが、元々の部屋の配列とかは脇に置いといて、値の流れだけをグラフ化してみました。
僕にとっては十分絶望的な複雑さですが、しばらく眺めていたら

+ リストの先頭値で初期値を作って
+ リストの残りで畳み込み

という流れが、部分部分に、やがて全体に見えてきました。
また、

+ 部屋の値は、それまでの履歴で確定している値と、現在の部屋でまだ確定していない値と、わけておくと操作が簡単。
+ 値と履歴をまとめておくと良さげ。
+ 部屋のマトリックスは考えなくてよい。
+ 履歴を組み合わせで計算する必要はない。
+ あらかじめ、各部屋に有効なグループの数のリスト ```[ [6, 5, 4], [5, 4, 7], [4, 7, 5] ]``` を作っておくと良さげ。


うん、これだったらforループやら配列への再代入やらなくてもできそう...
#環境
##[Haskell for Mac](haskellformac.com)
何か助けてくれそうなのが欲しかったので、有料ですけど使ってみました。
Playgroundで直ぐ試せるし、コードを修正するとPlaygroundに直ぐ反映されるので、何か駄目なことをしたときにすぐ分るというのが便利です。
[Haskell for Mac でちょっと Haskell をさわってみる](http://qiita.com/usamik26/items/d99bf694150a549b5078)
##[Atom](https://atom.io)
AtomでHaskellが使えるようにして、Haskell for Macから外部エディタとして立ち上げています。
型を教えてくれたり、もっと賢そうな書き方を教えてくれます。

関数合成とかさっぱりでしたが、いわれるがまま書き換えているうちに何となく```" . "```の使いどころがわかってきました。なるほど。```" $ "```とは違うのね、という今日このごろです。

Qiitaでたくさんのかたがやりかたを教えてくださっています。この辺りを参考にさせていただきました。
[ATOMのide-haskell導入手順（MacOS X）](http://qiita.com/nakamurau1@github/items/7feaeb643cb48842b613)
[Atom EditorでHaskell](http://qiita.com/eielh/items/b2e85f8ea4c6cdb8012d)
[Tips]Unityで、標準スプライトマテリアルを使う際の注意点

初投稿です、よろしくお願いいたしす。

ここでは、Unityで標準で付いているマテリアル（標準マテリアル）を適応するときに見落としがちな点を書いてみます。

よく、以下のコードを見かけるのですが、Unityエディタ上で実行すると、

```csharp
        private SpriteRenderer srenderer;

        :

        srenderer.material = Resources.GetBuiltinResource<Material>("Sprites-Default.mat");
```

何故かマテリアルが見つからないというエラーが出ます（下図参照）
![img_001_001.png](https://qiita-image-store.s3.amazonaws.com/0/101034/23dc2f2e-6f42-4509-20d7-9c356009e51c.png)

実は、Unityエディタ上と、実行環境生成後では、標準マテリアルを参照する方法が違う。そのため、実際には#ifを使ってエディタ上で実行してるかどうかで切り分ける必要があります。

```csharp:hoge.cs
        private SpriteRenderer srenderer;

        :

#if UNITY_EDITOR
            srenderer.material = UnityEditor.AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Default.mat");
#else
            srenderer.material = Resources.GetBuiltinResource<Material>("Sprites-Default.mat");
#endif
```

これで、エディタ上でも実機でも標準マテリアルを当てはめられます（Unity5.4.0p1上のエディタで動作確認）のでご活用ください。

なお、この対処はUnityのフォーラムを参考にいいたしました。
http://forum.unity3d.com/threads/released-super-tilemap-editor.387330/page-5
GitHub Pages にドキュメントを配置する  Wercker step

# 概要
[Hugo](https://gohugo.io/) の[マニュアル](https://gohugo.io/tutorials/automated-deployments/)によれば，[GitHub Pages](https://pages.github.com/) にドキュメントをプッシュする[Wercker](http://wercker.com/) step には，
[lukevivier/gh-pages](https://github.com/lvivier/step-gh-pages) がある．しかし，この step は過去のコミットを上書きしてしまうため，
コミットログを残す別の step [jkawamoto/ghp-import](https://github.com/jkawamoto/wercker-ghp-import-step) を作った．

# 使い方
`jkawamoto/ghp-import` step の実行には，`pip` が必要です．
`wercker.yml` の `steps` に

```yaml
- install-packages:
    packages: python-pip
```

を追加するか，box に [`jkawamoto/ghp-box`](https://github.com/jkawamoto/dockerfiles/tree/master/wercker-ghp-box) を使ってください．

`jkawamoto/ghp-import` step には，次のオプションがあります．

- token: Github の[アクセストークン](https://github.com/settings/tokens)．
- basedie: ドキュメントのルートパス．
- msg: 省略化のコミットメッセージ.
- branch: ブランチ名．デフォルトは `gh-pages`.

公開リポジトリには `public_repo` 権限付きのアクセストークン必要です．プライベートリポジトリの場合は，`repo` 権限が必要になると思います．また，`wercker.yml` に直接値を書くのではなく環境変数経由で渡してください．環境変数は下記の画面から登録できます．

<img width="1314" alt="wercker-env.png" src="https://qiita-image-store.s3.amazonaws.com/0/62253/5cb97db8-6436-3438-e4ad-a8065a185706.png">


## 例
[roadie](https://github.com/jkawamoto/roadie) で実際に使用している例は次の通り．

```wercker.yml
box: jkawamoto/ghp-box
build:
  steps:
    - script:
        name: Prepare submodules
        code: |-
          git submodule update --init
    - arjen/hugo-build:
        version: "0.15"
        basedir: docs
deploy:
  steps:
    - jkawamoto/ghp-import:
        token: $GIT_TOKEN
        basedir: docs/public
```
自分が購読したい企業ブログまとめ

後でちゃんと購読する環境を整えたいという覚え書き。
本当は私心からゲーム企業に限りたかったけどあんまり思い当たらなかったのでそれ以外も書く。

## ゲーム企業(と思ってるほう)のブログ
### KLabGames Tech Blog
http://klabgames.tech.blog.jp.klab.com/
ソーシャルゲームの開発ノウハウなどがある。
更新はそこそこ。

### バンダイナムコスタジオ エンジニアブログ
http://www.bandainamcostudios.com/engineer_blog/
CEDEC2015の発表などがある。
更新は少ない。

### Mobage Developers — Mobage Developers Blog
http://developers.mobage.jp/blog/
ゲーム開発における、ゲームだけの技術以外も多く記事があるように見える。

## ゲーム企業以外のブログ
### さくらのナレッジ
http://knowledge.sakura.ad.jp/
サーバーのマネジメントなどの情報が多い。初心者向け記事もある。
更新はそこそこ多い。

### paiza開発日誌
http://paiza.hatenablog.com/
プログラミング言語ごとの勉強に使えるコンテンツなどが多い。
更新は多い。

### アニメイトラボ開発者ブログ
http://developer.animatelab.com/
ちらっとみたらKotlinの記事だった。
更新はそこそこ多い。

### Yahoo! JAPAN Tech Blog
http://techblog.yahoo.co.jp/
幅広いカテゴリの記事がありそう。
更新は多い。

### ICS MEDIA
https://ics.media/
Webの技術に関する記事が多い。

### 株式会社バニーホップ | Bunnyhop Inc.
https://archive.bunnyhop.jp/
IoTプラットフォームの記事が多い。

### POSTD | プログラミングの話題を翻訳して届けるエンジニアのためのニュースメディア
http://postd.cc/
幅広いテクノロジに関する記事がある。かなり専門的な話が多い印象。

### バンブロ！　ソフトウェア品質特集
http://www.techvan.co.jp/media/quality/
品質に関するノウハウなど。

### Books&Apps
http://blog.tinect.jp/
仕事を主軸においた記事が多い。
テクノロジに関する記事は多くない。

----

覚えていたらまた追記します。
Selenium WebDriverをデータ移行処理に使ってみた

# 要件

QiitaTeamから掃き出した数百件のMarkdown記事データを、Redmineの[ナレッジベース](http://qiita.com/y_hokkey/items/7c02a3af319b353136d5#knowledgebase)記事としてインポートしたい。

* 記事データはJSON形式
* RedmineナレッジベースにはWebAPIが用意されていない
* 手動は嫌

JSONからSQL文を作ろうかとも思ったが、最近[あるSeleniumの記事](http://qiita.com/cognitom/items/27b7375bea653b414c8f)が面白そうだった為、WebのGUIをそのまま利用してバッチ処理を作ってみようと思った。

# 一応できた

![redmine-batch](https://qiita-image-store.s3.amazonaws.com/0/48238/adb5699f-58f2-dda3-4490-573d3d59abae.gif)

## はまったところ

* Chromeだと対応していない文字があった
  * Firefoxだと正常に処理できても、Chrome版のWebドライバではエラーが発生してしまう場合があった
* Firefoxの最新版(47)にそのままでは対応してない
  * FirefoxのWebDriverが新しいバージョン([geckodriver](https://github.com/mozilla/geckodriver))への移行期にあり、デフォルトのfirefoxドライバが最新版に対応していない。
* JSON内のタブ文字が本当にタブとして再現されてしまう
  * コンテンツに含まれるタブ文字が、ブラウザのフォーカスを勝手に移動させてしまうバグを起こしていた。一括置換でスペースに置き換えた
* よく止まる
  * 内容が非常に長い記事の場合、ブラウザ側が処理の終了を待ちきれずにエラーを出して止まってしまうことが何回もあった

## 感想

* 自分の書き方が悪い可能性もあるが、手放しで使うにはもう一息といった感じで惜しい
* jQueryのようなノリで処理が書けるので、構文自体は簡単で分かりやすい
* なんかもっと色々な用途に使えそうな気がする。~~タイムカード押したりとか~~

# コード

```rb
require "json"
require "selenium-webdriver"

# Firefox用のドライバを使う
driver = Selenium::WebDriver.for :firefox

# 新規ナレッジ記事作成画面に遷移
driver.navigate.to "http://**********/projects/**********/knowledgebase/articles/new"
# Redmineにログイン
driver.find_element(:id, 'username').send_keys("user")
driver.find_element(:id, 'password').send_keys("password")
driver.find_element(:name, 'login').submit

# QiitaTeamのJSONを取得
json_data = open("src.json") do |io|
  JSON.load(io)
end

# ループが途中でこけたら0の部分をカウントアップしてもう一回走らせる
articles = json_data["articles"][0..-1]
articles.each{|article|

  # データの準備
  title = article["title"]
  body = article["body"]
  tags = article["tags"]
  # タグを文字列として結合
  tag_join = ""
  tags.each{|tag|
    tag_join = tag_join + tag["name"] + ","
  }  

  # プルダウンメニューから記事カテゴリを選択
  select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, 'category_id'))
  select.select_by(:value, "2")

  # データをフォームに入力
  input_title = driver.find_element(:id, 'article_title')
  input_title.send_keys  title

  input_body = driver.find_element(:id, 'article_content')
  input_body.send_keys body

  input_tag = driver.find_element(:id, 'article_tag_list')
  input_tag.send_keys tag_join
  
  # 入力内容を送信
  input_tag.submit

  # 新規ナレッジ記事作成画面に遷移
  driver.navigate.to "http://**********/projects/**********/knowledgebase/articles/new"
}
```
Sinatraのi18n対応でのInvalidLocale例外に対応する方法

Rubyの軽量ウェブアプリケーションフレームワーク[Sinatra](http://www.sinatrarb.com/)において、表示を日本語、英語などに切り替えられるように国際化対応を行う場合は以下のページが参考になる。

* http://recipes.sinatrarb.com/p/development/i18n

ただし、上記のページに載っている設定だけだとエラーで落ちる現象に悩まされることになったので、解決法をメモしておく。

特に、ブラウザの言語設定をもとに表示言語を決めるRack::Localeを用いる場合、日本語を示す言語設定は ja だけでなく、 ja-JP だったりして、これらの両者を ja とみなすような設定が必要となる。

このための設定は実は上記公式サイトに載っている設定の `I18n::Backend::Fallbacks` が自動的に対応してくれる（ja-JPでのリクエストは自動的にja設定とみなしてくれる）はずなのだが…。

このFallbacks設定が有効であるにも関わらず、実際にアプリケーションをブラウザで開いてみると、以下のようなエラーが出力されてしまう。

```
I18n::InvalidLocale at / 
"ja-JP" is not a valid locale
```

これは i18n ライブラリの設定オプション enforce_available_locales のデフォルト値が true に変更されたことによる（[diff](https://github.com/svenfuchs/i18n/commit/b5703d7431ecfc1b99409e16c6590448570718ac#diff-14d9864ac07456d554843dc2a3b174a4)）。

ひとまずFallbackが動くようにするには、以下のいずれかを行えばよい。

### a) enforce_available_localesをfalseにする:
```ruby
I18n.enforce_available_locales = false
``` 
### b) available_localesへ言語設定を追加登録する:
```rb
I18n.available_locales = [ :ja, :en, :"ja-JP" ]
```
Sphinxドキュメントをコンパイルする Wercker step

# 概要
ちょろっと調べた限り良さそうなものが無かったので，
[Sphinx](http://www.sphinx-doc.org/)ドキュメントをコンパイルする[Wercker](http://wercker.com/) step [`jkawamoto/sphinx`](https://github.com/jkawamoto/wercker-sphinx-step)を作った．

# 使い方
`jkawamoto/sphinx` step の実行には，`pip` が必要です．`wercker.yml` の `steps` に

```yaml
- install-packages:
    packages: python-pip
```

を追加するか，box に [`jkawamoto/ghp-box`](https://github.com/jkawamoto/dockerfiles/tree/master/wercker-ghp-box) を使ってください．

`jkawamoto/sphinx` step には，次のオプションがあります．

- target: make コマンドのターゲット (デフォルトは `html`)．
- basedir: Makefile があるディレクトリのパス．
- packages: 空白区切の Sphinx の実行に必要な  PyPi パッケージリスト．使用するテーマなどを渡す．
- options: make コマンドに渡すオプション引数．

なお，リポジトリに `requirements.txt` が含まれている場合，
自動で `pip install -r requirements.txt` するので，
依存ライブラリを `packages` に含める必要はありません．

## 例
[dsargparse](https://github.com/jkawamoto/dsargparse) で実際に使用している例は次の通り．

```wercker.yml
box: jkawamoto/ghp-box
build:
  steps:
    - jkawamoto/sphinx:
        basedir: docs
        packages: sphinx_rtd_theme
deploy:
  steps:
    - jkawamoto/ghp-import:
        token: $GIT_TOKEN
        basedir: docs/build/html
```
GoでUnix timeフォーマットのtimestampをstringとして扱う方法

[FormatInt](https://golang.org/pkg/strconv/#FormatInt)を利用する

`func FormatInt(i int64, base int) string`で`base int`に変換したい進数を入れる。
2進数にも変換できて面白い。

```main.go
package main

import (
	"fmt"
	"strconv"
	"time"
)

func main() {
	now := time.Now().Unix()
	n := strconv.FormatInt(now, 10)

	fmt.Println(n)
}
```
CentOS7.2でruby2.2.2をインストールする

唐突ですが、全く触ったことがなかったので、railsってどんな感じか触ってみようと思いました。
~~友人とWeb系の勉強会に申し込んだら、うっかり自分だけ当選して焦っているとかでは断じてない~~

おググりしたところ、小学生でもわかるhogehogeというタイトルを見つけたので、早速頭からやっていこうと思ったのですが。。。

```
$ gem install rails                                                            
ERROR:  Error installing rails:                                                                  
        activesupport requires Ruby version >= 2.2.2.
```

確認したところCentOS7.2では、デフォルトのリポジトリではruby2.0.0までしか入れられないようです。

```
# yum list | grep ruby                                                         
ruby.x86_64                                2.0.0.598-25.el7_1          @base
（以下略）
```

**ダメやん。**

記事をよく読むと、最初にubuntuの環境作ってね。って書いてある。。。うーん。。
ubuntuを入れるのもいいけど、一旦CentOSでできるか試しすことにします。

というわけでここから本題です。

# 1. Software Collections（SCL）のリポジトリを追加する

SCLの詳細は[こちら](http://qiita.com/murachi1208/items/202bff84964188619f57)に説明がありました。
最新パッケージをインストールするためのリポジトリみたいです。

```
# yum install centos-release-scl-rh centos-release-scl
```

追加されたリポジトリを必要な時以外は使わないようにします。

```
# vi /etc/yum.repos.d/CentOS-SCLo-scl.repo 
[centos-sclo-rh]
・・・
enabled=1
↓
enabled=0
```

```
# vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
[centos-sclo-rh]
・・・
enabled=1
↓
enabled=0
```

# 2．ruby 2.2.2のインストール

追加したリポジトリを有効にすると出てきました。

```
# yum --enablerepo=centos-sclo-rh list | grep ruby
・・・
rh-ruby22-ruby.x86_64                     2.2.2-12.el7            centos-sclo-rh
・・・
```

というわけで「rh-ruby22-ruby」, 「rh-ruby22-ruby-devel」をインストールします。

```
# yum --enablerepo=centos-sclo-rh install rh-ruby22-ruby rh-ruby22-ruby-devel
```

# 3．環境変数を設定

```
$ ruby --version
ruby 2.0.0p598 (2014-11-13) [x86_64-linux]
```

ぶきや「rubyは インストールしただけじゃ 意味がないぞ！
　　　ちゃんと 設定しないとな！」

というわけで以下の設定をします。

```
$ vi ~/.bashrc
以下の内容を追記します。
source /opt/rh/rh-ruby22/enable
export X_SCLS="`scl enable rh-ruby22 'echo $X_SCLS'`"
export PATH=/opt/rh/rh-ruby22/root/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/opt/rh/rh-ruby22/root/usr/lib64:$LD_LIBRARY_PATH
```

```
$ source ~/.bashrc
$ ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
```

ちゃんと2.2.2に上がりました。

# さいごに

railsをインストールできました。

```
$ gem install rails
・・・
rails after 107 seconds
31 gems installed
```

本記事はここまでです。
ようやくこれで勉強を進めることができます。
さて、railsってどんな感じなんだろうか？物語は加速する！！！
AWSのLambdaでS3にアップロードされたファイルをhookで受け取ってファイルの中身を取得する(apex利用)

## 参照URL

s3: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3.html
apex: https://github.com/apex/go-apex

### コード(ほぼapexに記載されているのでその写経)

```config.go
// Ref: https://github.com/apex/go-apex/blob/master/s3/s3.go

// Event represents a S3 event with one or more records.
type Event struct {
	Records []*Record `json:"Records"`
}

// Record represents a single S3 record.
type Record struct {
	EventVersion string    `json:"eventVersion"`
	EventSource  string    `json:"eventSource"`
	AWSRegion    string    `json:"awsRegion"`
	EventTime    time.Time `json:"eventTime"`
	EventName    string    `json:"eventName"`
	UserIdentity struct {
		PrincipalID string `json:"principalId"`
	} `json:"userIdentity"`
	RequestParameters struct {
		SourceIPAddress string `json:"sourceIPAddress"`
	} `json:"requestParameters"`
	S3 struct {
		SchemaVersion   string  `json:"s3SchemaVersion"`
		ConfigurationID string  `json:"configurationId"`
		Bucket          *Bucket `json:"bucket"`
		Object          *Object `json:"object"`
	}
}
```

```s3.go
// ReadS3Object is Load json file uploaded
func ReadS3Object(event Event) []byte {
	bucket := event.Records[0].S3.Bucket.Name
	object := event.Records[0].S3.Object.Key

	svc := s3.New(session.New())

	params := &s3.GetObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(object),
	}

	resp, err := svc.GetObject(params)
	if err != nil {
		log.Fatal(err)
	}

	b, _ := ioutil.ReadAll(resp.Body)

	return b
}
```


```main.go
package main

import (
	"encoding/json"
	"log"

	apex "github.com/apex/go-apex"
)

func main() {

	apex.HandleFunc(func(data json.RawMessage, ctx *apex.Context) (interface{}, error) {

		var e Event

		// Reccieved "data" convert the "e" object which is build by Event structure
		err := json.Unmarshal(data, &e)
		if err != nil {
			log.Fatal(err)
		}

		d := ReadS3Object(e)

		log.Println(string(d))

		return nil, nil
	})
}
```
[C#]数値の桁数を調べる

# 数値の桁数を調べる
負数、浮動小数点は扱いません。

## 対数(log10)
対数(log10)を取って調べる方法です。

```csharp
public int Digit(int num)
{
    // Mathf.Log10(0)はNegativeInfinityを返すため、別途処理する。
    return (num == 0) ? 1 : ((int)Mathf.Log10(num) + 1);
}
Digit(12345);    // => 5
```

## String.Length
String型のLengthから調べる方法です。

```csharp
public int Digit(int num)
{
    return (num.ToString().Length);
}
Digit(12345);    // => 5
```

## 10で除算した回数
10で除算した回数で調べる方法です。

```csharp
public int Digit(int num)
{
    int digit = 1;
    for (int i = num; i >= 10; i /= 10) {
        digit++
    }
    return digit;
}
Digit(12345);    // => 5
```

## まとめ
考え方はどの言語でも共通です。
int.ToStringメソッドは遅いので、対数（log10）か10で除算した回数から調べるのが良さそうです。

## 追記（2016/08/18）
- 各処理の速度をwasabi_daisukiさんが測定してくました。コメントをご覧ください。
- 一部ソースコードでshiracamusさんからアドバイスをいただきまして、一部修正しました。
Bash on Ubuntu on Windowsに新しいGitをインストールする

# はじめに

Bash on Ubuntu on Windowsで喜び勇んでapt-get install gitするとバージョン1.9.1でちょっと悲しくなりました。
せっかくなので新し目のバージョンを簡単にインストールできないか探してみると何て事はない、名前こそ仰々しいもののユーザー視点ではUbuntu 14.04.4 LTSなのでppaを利用すればよかったのです。

# 新しいGitをインストールする

```
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git
```

これだけ
2016-08-17現在でバージョン2.9.3をインストールできました。

# 参考リンク

* [How to Install Git 2.8.1 on Ubuntu & LinuxMint](http://tecadmin.net/install-git-on-ubuntu/)