OmniAICreator/Qiita-1.07M huggingface dataset:
2015年のAzureのSaaSにみるクラウド技術動向

概要: Microsoft Azureのラインナップ展開を通じて、2015年の技術動向を調査する。ガートナー2014の報告通り、ビッグデータは死にゆくワードとなり、IoTは期待値が高まってきている。それに伴い、機械を用いた「知能もどき」の利活用が進んでいくと思われる。

# まとめ

  - 巨大企業からの技術公開により、近年の大量データの集計、統合、利用のプラットフォームがオープンになりつつある
  - 人間の「知能」に相当するものを機械に置き換えることで高い付加価値を提供している（e.g., Prediction API, Azure ML, Pepper, Watson）

以下、Azureコミュニティイベント(GoAzure 2015)での発表のメモ（全23セッション中2セッション）。

# IoT大量データをStream Analyticsでリアルタイムデータ分析

- IoT大量データをStream Analyticsでリアルタイムデータ分析
- Hidemasa Togashi (Capy Inc.)

# Capy

- puzzle captcha

# IoTのマーケット規模

- market size: 15T USD in 2034 ~ GDP of USA 2013

# 手法

- Batch
- Interactive/MPP
  - Amazon Redshift
  - Apache Spark
  - Big Query
- Realtime
  - Storm
  - Norikra
  - EsperTech
  - Amazon Kinesis
  - Azure Stream Analytics


# 膨大な入力

- 受信
- 送信
- 処理

## 類似製品

- Storm
- EsperTech
- Apache Kafka

## リアルタイム
- Norikra
- fluentd

## 独自プロトコル

- Kinesis applications
- Amazon Kinesis

## Event Hubs (Azure)
- Azure Event Hubs

Azure Event HubsはKafkaみたいなもの。

- HTTP(S) (supported)
- MQTT
- CoAP
- AMQP(S) (supported)

- SQL

## Windowing

3種類対応

- tumbling
- hopping
- sliding

## ユースケース
- 不正アクセスの検出

# はまった点
- Event Hubsのイベントをsubscribeできない
  - Qpid-Protonを使用した
  - ConsumerGroupとPartitionの指定が必要だった
  - AMQPのDirect Connectを使うとPartitionの考慮が必要だったので、使うの止めて、WindowsでEventProcessorHostを使うことにした
- Stream AnalyticsからのJSONデータがデコードできない
  - JSON出力がmalformなので、手元で修正して利用している

# 課題
- 以下の設定を変更するにはStream Analyticsの再起動が必要
  - Inputs (Blob)
  - Output
  - Query
  - Scale

- キャパシティのメトリックスが分かりにくい
  - in/out events, data conversion errors, out of order eventsしか取れない

- event subは事実上EventProcessorHost以外で使えない（使いにくい）

# 展望
- IoTのトレンドは伸びていく
  - 20年前のInternetのよう


----

# Azure MLでマシンラーニング

- Azure MLで機械学習をやってみよう
- Ryuichi Tokugami (aucfan)

# ビッグデータ活用

- Organize (何が起こった)
- Analysis (何で起こった)
- Monitoring (何が起きている)
- Prediction (何が起こる？)

# Predicitonには複雑な作業が必要
- predictionは過去のデータが必要
- 時間の差以上に価値の差が広がる

# 2014年以降出荷された製品

- IBM Watson
- Azure ML
- Google
- SB Pepper


# 機械学習!=人工知能


# 人工知能
- 強いAI (strong AI)
  - 知能そのもの
- 弱いAI (weak AI)
  - 知能の代替ができるもの

# Azure ML

- ブラウザでできる
- D&Dで簡単に
- HW/SW不要
- 世界で一番簡単

# できること
- 2値の分類
- 複数値の分類
- 回帰を使った予測
- 複数の基準を持った、並び替え（レコメンドエンジン）
- クラスタリング

# 概念
- もっとも大きな論理単位はWORKSPACE
- EXPERIMENTというモデル
- WORKSPACEごとにDATASETというデータを追加
- DATASET共有可
- ML Studioでモデルを作成

# Module
- 上からinput、下からoutput


# デモ
- スキー用品の価格予測
- 取引件数
- 流通総額
- 平均価格


# 価格
- 8 JPY/h for preview (安い)
四捨五入とその仲間たち

3.45Dを0.1で四捨五入したら3.4Dという人がいるのでメモ。

最近接丸め（偶数）
Pattern0:CType((3.45D * 10), Integer) / 10
3.4
Pattern1:Math.Round(3.45D, 1)
3.4
Pattern2:Math.Round(3.45D, 1, MidpointRounding.ToEven)
3.4
最近接丸め（0から遠いほうへ）
Pattern3:Math.Round(3.45D, 1, MidpointRounding.AwayFromZero)
3.5
0方向への丸め
Pattern4:Math.Truncate(3.45D * 10) / 10
3.4
負の無限大への丸め
Pattern5:Math.Floor(3.45D * 10) / 10
3.4
正の無限大への丸め
Pattern6:Math.Ceiling(3.45D * 10) / 10
3.5
CIからdocker registryにプッシュするときのメモ


# CIでビルドしたイメージはregistoryにプッシュしておきたい

テストに失敗したときは原因をさぐるのに使えそうだし、
テストに成功した時に、push済みなのですばやくデプロイできそう。

CIで`docker build`したらその時点でgitのブランチ名とコミットIDのタグをつけてpushすることにした。
テストを実行する前に以下のようなシェルスクリプトを走らせている。

```docker_push.sh
#!/bin/sh

IMAGE_NAME="eiel/hoge"

IMAGE_NAME_SHA=$IMAGE_NAME:COMMIT_$(git rev-parse HEAD)
IMAGE_NAME_BRANCH=$IMAGE_NAME:$(git rev-parse --abbrev-ref HEAD)

docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
docker tag $IMAGE_NAME $IMAGE_NAME_SHA
docker tag $IMAGE_NAME $IMAGE_NAME_BRANCH
docker push $IMAGE_NAME_SHA $IMAGE_NAME_BRANCH
```

* eiel/hoge:COMMIT_f90bbb0135d12994de5f7a98a3dada52e2a5b639
* eiel/hoge:master

みたいなタグができる。

circle.ymlも抜粋しておく。

```circle.yml
dependencies:
  override:
    - docker info
    - docker build -t eiel/hoge .
    - bin/docker_push
```

しかし、なんでもかんでも push するとゴミがたまるので、消しやすくする工夫をしたい。
gitでタグをうったときも自動でなんとかしたいところ。
【iOS】新しくなったCrashlyticsの使い方 Fabric版（SDK導入編）

※本投稿は，iOS開発をある程度行っている方向けです。

##あらすじ
先に，[アカウント取得編](http://qiita.com/tomoki-n/items/1bc57054b5f9a2b24459)を読んでから，見てください。


##SDK導入編
1.Fabricをインストールすると，こんな画面が出てきます。

![スクリーンショット 2015-02-05 9.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/60055/131a0b1f-09b7-c777-b264-d751d0dad04c.png)

2.ログインすると，.xcodeprojや.xcworkspaceファイルが出てきます。crashlyticsを導入したい.xcodeprojを選択します。.xcworkspaceの場合は，中に導入したい.xcodeprojを選択して下さい。
※cocoapodsを利用している方は，pods.xcodeprojに導入しない様に！！

###![スクリーンショット 2015-02-05 9.27.51.png](https://qiita-image-store.s3.amazonaws.com/0/60055/e215fff6-82f1-8876-1550-f9f8a8283095.png)

3.選択した後は，Crashlyticsをインストールします。規約とかは，適当に同意してくださいｗｗ
![スクリーンショット 2015-02-05 9.28.43.png](https://qiita-image-store.s3.amazonaws.com/0/60055/61657b1e-c094-b02f-bd47-52b405607c48.png)

4.次にこんな画面が出て来ます。ここからが面倒くさいwww 表示されているコマンドをコピーした上で [選択したプロジェクト]->[TARGETS]->[Build Phases]と開きます。
![スクリーンショット 2015-02-05 9.29.05.png](https://qiita-image-store.s3.amazonaws.com/0/60055/dea30aa1-9436-f45d-36d3-442d24297f2b.png)

5.左上の＋マークをクリックして，[New Run Script Phase]を押します。すると，一番下に［Run Script］が生成されます。その中に先ほどコピーしたコマンドをペーストします。その後，一度ビルドします。（⌘＋B）
![スクリーンショット 2015-02-05 9.29.50.png](https://qiita-image-store.s3.amazonaws.com/0/60055/fbf19446-0f34-c30e-c0a3-a4151978327b.png)

6.すると，アタッシュケースの絵が出てきます。それをドラッグ・アンド・ドロップでプロジェクトに入れます。中に，Crashlytics.frameworkとFabric.frameworkが生成されます。
![スクリーンショット 2015-02-05 9.30.33.png](https://qiita-image-store.s3.amazonaws.com/0/60055/8bcb9012-4c7d-5478-0cfb-f41bd068a106.png)

7.AppDelegate.mの中に次のコードを追加します。これで実行すると，導入完了です！！

```AppDelegate.m
#import "AppDelegate.h"
#import <Fabric/Fabric.h>
#import <Crashlytics/Crashlytics.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    [Fabric with:@[CrashlyticsKit]];
    return YES;
}
```

次回は，[テスター配信編](http://qiita.com/tomoki-n/items/ec34373a3e792fe6b6b9)です。
PECLライブラリ(pecl_http)をソースからコンパイル(PHP5.6)


PHPのバージョンを5.6にアップグレードする際に、peclライブラリのインストールで少しハマったのでメモ。これまでは、yumに頼り過ぎていたため、PHPもソースからコンパイルして入れなおしてみた。PHPをソースからコンパイルする手順は別途。

PHPのバージョンを5.6にアップグレードして、古いPHPを利用していた際に`pecl install` で入れてPeclパッケージを読み込もうとすると上手くいかなかった。そもそも無理やり古いのを利用したのが良くないのだが、、、

```bash
PHP Warning:  PHP Startup: http: Unable to initialize module
```

古いPHPのバージョンでコンパイルしたパッケージなので、バージョンが合わずにWarningが出ている模様。この問題を解決するために、今回は[pecl_http](http://pecl.php.net/package/pecl_http)をソースからインストールし直した時の手順をまとめた。

[pecl_http2.2.0](http://pecl.php.net/package/pecl_http/2.2.0)に関しては、`propro`と`raphf`が依存しているため、事前に準備する必要がある。

* [raphf](http://pecl.php.net/package/raphf)
* [propro](http://pecl.php.net/package/propro)

###依存パッケージの準備
各パッケージのソースから今回はする方法関しては、[ドキュメント](http://php.net/manual/ja/install.pecl.phpize.php)を参照。
今回は、特定のバージョンのPHPでコンパイルしたいため、`--with-php-config`を利用。

####propro.so

```bash
cd /usr/local/src/php-5.6.0/ext
wget -O propro-1.0.0.tgz  http://pecl.php.net/get/propro-1.0.0.tgz
tar xvzf propro-1.0.0.tgz
cd propro-1.0.0
phpize
./configure --with-php-config=/your/path/php-5.6.0/bin/php-config
make
make install
cat << EOF > /your/path/propro.ini
extension= propro.so
EOF
```

####raphf.so

```bash
cd /usr/local/src/php-5.6.0/ext
wget -O raphf-1.0.4.tgz http://pecl.php.net/get/raphf-1.0.4.tgz
tar xvzf raphf-1.0.4.tgz
cd raphf-1.0.4
phpize
./configure --with-php-config=/your/path/php-5.6.0/bin/php-config
make
make install
cat << EOF > /your/path/raphf.ini
extension=raphf.so
EOF
```

この後、`pecl_http`をコンパイルする際に、`propro.so`と`raphf.so`が必要となるため、`.ini`ファイルに記述しておく。

###httpパッケージのインストール
####http.so

```bash
cd /usr/local/src/php-5.6.0/ext
wget -O pecl_http-2.2.0.tgz  http://pecl.php.net/get/
tar xvzf pecl_http-2.2.0.tgz
cd pecl_http-2.2.0
phpize
./configure --with-php-config=/your/path/php-5.6.0/bin/php-config
make
make install
cat << EOF > /your/path/http.ini
extension=http.so
EOF
```

この段階でパッケージが読み込まれているか確認したところ、下記のようなエラーが出てうまく読み込みまれない。

```bash
$ php -v
#output
PHP Warning:  PHP Startup: Unable to load dynamic library
...
/http.so: undefined symbol: php_persistent_handle_abandon in Unknown on line 0
```

`propro.so`と`raphf.so`をそれぞれの`.ini`ファイルで読み込もうとしていたのが良くなったようなので、結局以下のように`http.ini`にまとめた。

```bash
# http.ini
extension=propro.so
extension=raphf.so
extension=http.so
```

```bash
$ php -m
http
propro
raphf
```

これで上手く行った。PHPはあまり詳しくないのだが、`.so`ファイルが読み込まれる順番が影響しているのだろうか。
MySQLまとめ　その１

MySQL起動
mysql -u root -p

#テーブル参照
desc test;

結果

| Field | Type    | Null | Key | Default | Extra |
-------+---------+------+-----+---------+-------
| id    | int(11) | NO   |     | NULL    |       |
| num   | int(11) | YES  |     | NULL    |       |



#データベース変更
use php_test

#Apache起動
apache2 start

#sql
##ソート
SELECT * from test3 order by id desc;

##Select
SELECT * FROM php_test.test;

結果

| id  | column1            | column2 |
-----|--------------------|---------
|  20 | りんご             |      60 |
|  30 | バナナ             |      80 |
|  40 | 梨                 |      90 |
|  50 | ブドウ             |      40 |
|  60 | パイナップル       |      80 |
|  70 | みかん             |      80 |
|  80 | 桃                 |      50 |
|  90 | メロン             |      10 |
| 100 | オレンジ           |      40 |
| 110 | ブルーベリー       |      20 |
| 120 | いちご             |      80 |
| 130 | スイカ             |      30 |
| 140 | キュウイ           |      70 |
| 150 | すもも             |      30 |

##Insert
insert into test(item1,item2,item3)
values (0,0,0);

##Delete
delete From test where id = 60; 

﻿##Update
update test set item2=10 where item1 =20;

##検索
SELECT ﻿* FROM test where id = 1;

##条件指定検索
SELECT * FROM test where item1 like "%10";

##同じものを探す
SELECT * FROM test GROUP BY item1;

##重複
SELECT distinct num FROM test;

##件数確認
SELECT * FROM test;

##数件確認
SELECT * FROM test LIMIT 4;

結果

| id | column1   | column2 |
----+-----------+---------
| 20 | りんご    |      60 |
| 30 | バナナ    |      80 |
| 40 | 梨        |      90 |
| 50 | ブドウ    |      40 |
##Data_Format
SELECT id, DATE_FORMAT(time,'%Y年%m月%d日') as time3 FROM table1 GROUP BY time3

##小数点切り捨て
select floor(id/3) id, count(*) from test3 group by id;

##ヘルプ
mysqldump -uroot phppro2

STATUS             : サーババージョンやキャラセット設定などを表示。mysqlクライアントのコマンド  
SHOW STATUS        : サーバの設定値などを表示                                                   
SHOW VARIABLES     : 現在のサーバ変数を表示                                                     
SHOW TABLE STATUS  : 現在のデフォルトデータベース(useで使っているもの)の各テーブル詳細情報を表示
SHOW PROCESSLIST   : 現在接続中のクライアント情報を一覧表示                                     
SHOW INNODB STATUS : InnoDBストレージエンジンの状態を表示                

#URL
http://www.phppro.jp/school/mysql/
Code:1 "Choregraphe"でNAOくんを動かしてみた

[ロボットスタート](http://robotstart.co.jp/index.html)のMAKITOです。
これから徐々に記事を投稿していきたいと思います。

---
<h4>■小型ロボットNAO</h4>
NAOくんはAldebaran社が開発している小型ロボットです。
センサー、モーター、Aldebaran社専用オペレーティング・システムNaoqiで
制御されるソフトウェア群で構成されています。


<h4>■どんなことができる？</h4>
プログラミングやアニメーションツールによるロボットのコントロールです。
Aldebaran社の記事を引用すると、<b>"「生命」を吹き込むのです。”</b>
詳しくは、[Aldebaran社-NAOの魅力](https://www.aldebaran.com/ja/naonomei-li)

<h4>■実際に戯れてみた</h4>
【正面】
![nao-visu.JPG](https://qiita-image-store.s3.amazonaws.com/0/66608/b167449d-2b64-229f-1590-8f04c373ae58.jpeg "nao-visu.JPG")
立っている時も細かく左右に動きバランスをとります。

【顔】
![nao-face.JPG](https://qiita-image-store.s3.amazonaws.com/0/66608/3039b281-0b2b-1ff8-99a3-b45241151e44.jpeg "nao-face.JPG")
目の点滅や細かく動く首で感情表現をします。

【頭】
![nao-head.JPG](https://qiita-image-store.s3.amazonaws.com/0/66608/f4a90dad-f15c-ebfc-9662-145a0bdfc813.jpeg "nao-head.JPG")
赤い部分全てタッチセンサーになっておりプログラム側で、
タッチイベントを組み込むことができます。
例)頭部をタッチすると喋り出したり、効果音が鳴ったりetc...


【太極拳】
![nao-taikyokuken.JPG](https://qiita-image-store.s3.amazonaws.com/0/66608/febc6548-d3d5-ca4a-959e-a7a26c455c38.jpeg "nao-taikyokuken.JPG")
「なんということでしょう。片足で立ちバランスをとっているではありませんか。」
匠でなくてもこのようにNaoくんに色々な動きを行えます。


<h4>■動かしてみた感想</h4>
動作や音声の他にもバーチャルモデルでリアルタイムでNAOくんの動きをみれたり操作できたりとすごく夢中でいじり倒していました（笑）

音声などはテキスト部分にピッチの変更など細かいことが可能なのでいじりがいがあります。

次回は、NAOくんを活用したコレグラフプログラミング記事を今後は書いていこうかなと思っています。(APIで拾ってきてNAOくんに読ませたり etc.....)

[PepperやNAOqiやRomeoなどの記事がまとめられている記事はこちら](http://pc.watch.impress.co.jp/docs/column/kyokai/20140609_652355.html)

---
[robotstart inc](http://robotstart.co.jp/)
[robotstart / For Developers](http://robotstart.co.jp/dev.html)
[robotstart / Tech.Links](http://robotstart.co.jp/linkdev.html)

Address	: Shibuya-ku, Tokyo, Japan
E-mail	: info@robotstart.co.jp
IntelliJ の Goプラグイン 1.0αを試す


**2015年2月初頭での状況です**

IntelliJ は主に Java 開発に使われるIDEですが、有志の方が作成した Go プラグインがあります。
このプラグインは完成度が高く、Github では1000以上のスターがついています。
しかし、開発途上であるため、バグがあったり期待したような動作をしなかったりという状況でした。

そんななか、[Github にあるリリースページ](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases)に Ver1.0 のαリリースがアップロードされました。
今回はそれを使用した感想を書いてみます。

## 導入
Goプラグインは IntelliJ 内部にある Plugin ウィンドウからインストール可能ですが、バージョンが古いため1.0はローカルから直接インストールする必要があります。

1. プラグインのダウンロード
1. `Preference → Plugins →  Install plugin from disk` から ダウンロードしたzipファイルを選択し再起動する

### 導入時メモ

もしプラグインが `net/http` などの標準パッケージを見つけることができず、インポートエラーとしてご認識される場合
`Proference →  Langueage & Frameworks` にある `Go Libraries` に `$GOROOT/src` を追加すると解決するかもしれません。

![スクリーンショット_2015-02-05_2_09_18.png](https://qiita-image-store.s3.amazonaws.com/0/4428/0183e66d-3f29-f674-ebf5-e625d9364811.png "スクリーンショット_2015-02-05_2_09_18.png")

また、既に0.9x 等の前バージョンを使用している人が 1.0αにアップデートした場合、`File → Project structure` にある SDK の設定を新たに作り直すことをお勧めします。
それでもおかしかったら、とりあえず `File → Invalid Cache & Restart` してみる。

![スクリーンショット 2015-02-04 1.30.18.png](https://qiita-image-store.s3.amazonaws.com/0/4428/8254f227-5e17-be03-1997-3a928cdbfcb2.png "スクリーンショット 2015-02-04 1.30.18.png")

### 追記
- 初期導入時に必要な他の設定は、こちらの記事が参考になります。
   - [setup go-lang-idea-plugin for gae/go](http://qiita.com/sinmetal/items/0073a5cf9e613e05786f)

## 改善点
前バージョンである 0.96 からの改善点をざっくりとまとめてみます

- GOPATH の設定をプラグイン側が自動で設定してくれるようになった
   - 前バージョンのプラグインでのハマリポイントが解消された
- 動作が早くなった
   - 前バージョンではコードハイライトやコミット前の `code analysys` に時間がかかった
- 補完が賢くなった
   - `import` でパッケージインポート時の補完動作が変わった
   - 前バージョンではメソッド名の補完が出たり出なかったりと不安定だった
- パラメータ情報が出るようになった
   - 前バージョンでは IntelliJ の `Parameter info` アクションが効かない場合があった

## イマイチな点
- 0.96 にあったファイル保存時に自動で `go fmt` や `goimports` を起動する設定がなくなった
- コードハイライトが効かなくなった箇所がある
   - 開発版では修正された模様
   - https://github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/1211

## まとめ
どうやら最近このプラグインの開発に IntelliJの中の人こと JetBrains の方が[かなりコミットしています](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/commits/v1.0.0-alpha0)(しかも2人!)。
なので、IntelliJ の Goプラグインは今後もかなり期待できそうです。

まだα版ではありますが、今回の1.0αでは 0.96 にあった不具合や不満点がかなり改善されたように思えます。
前のバージョンと違い、IDEとして期待される動作を期待したとおりに動作してくれる、という印象です。
すでに0.9.x 版を使われている方は、特に大きなデメリットもないと思いますので、1.0αにアップデートして使用することをお勧めします。
ドット(.)を含むS3バケットへgsutilからアクセスする

ドット(.)を含むS3バケットへgsutilからアクセスすると、エラーが生じることがあるので、その原因と対応策を説明するとともに、根本的な問題解消の方法を提案する。

## 発生しうる問題

```
$ gsutil ls s3://dot.example.com

Failure: Host dot.example.com.s3.amazonaws.com returned an invalid certificate (remote hostname "dot.example.com.s3.amazonaws.com" does not match certificate): {'notAfter': 'Apr  9 23:59:59 2015 GMT', 'subjectAltName': (('DNS', '*.s3.amazonaws.com'), ('DNS', 's3.amazonaws.com')), 'subject': ((('countryName', u'US'),), (('stateOrProvinceName', u'Washington'),), (('localityName', u'Seattle'),), (('organizationName', u'Amazon.com Inc.'),), (('commonName', u'*.s3.amazonaws.com'),))}.
```


## この問題が発生する原因

Amazon S3が提供しているワイルドカード証明書のSANが``*.s3.amazonaws.com``なので、``dot.example.com.s3.amazonaws.com``とホスト名ミスマッチが生じる。


## この問題に対するワークアラウンド
https://github.com/GoogleCloudPlatform/gsutil/blob/master/gslib/commands/config.py
にも説明がある通り、

```
    [Boto]

[...]

      https_validate_certificates

[...]

# Set 'https_validate_certificates' to False to disable server certificate
# checking. The default for this option in the boto library is currently
# 'False' (to avoid breaking apps that depend on invalid certificates); it is
# therefore strongly recommended to always set this option explicitly to True
# in configuration files, to protect against "man-in-the-middle" attacks.
https_validate_certificates = True
```

BotoのConfig (e.g., ``~/.boto``)のここの

```
https_validate_certificates = True
```

を

```
https_validate_certificates = False
```

とすればよい。

## まとめ

S3 Static Website Hosting機能を使わないバケットに対して、ドット(.)を含む名前を使わない。**（重要）**

S3のバケットを作成する際、**そのバケットでStatic Website Hosting機能を使うかどうか判断してから**、バケット名を決める。**（重要）**
【PHP】歯抜けになった配列の添え字を連番にする

##array_mergeを使う方法

```php
$a = array(0=>'aaa',5=>'bbb',9=>'ccc');
$a = array_merge($a);
//=>array(0=>'aaa',1=>'bbb',2=>'ccc');
```

参考：[PHPで歯抜け、バラバラになった配列のキーを連番にする方法](http://www.key-p.com/blog/staff/archives/882)


##array_valuesを使う方法

```php
$a = array(0=>'aaa',5=>'bbb',9=>'ccc');
$a = array_values($a);
//=>array(0=>'aaa',1=>'bbb',2=>'ccc');
```

コメントにあった通りarray_valuesの方が意図がわかりやすいかもしれない。
SSL証明書を申請する時のTips

## ワンライナーで秘密鍵(パスフレーズ無し)・CSR(SHA-2)を作成する。

```
$ openssl req -new -sha256 -subj "/C=XXXXX/ST=XXXXX/L=XXXXX/O=XXXXX/OU=XXXXX/CN=XXXXX" -out XXXXX.csr -newkey rsa:2048 -nodes -keyout XXXXX.key 
```

XXXXX は、必要な情報に置き換えてください。

コマンドの詳細は以下のコマンドで確認すると良いです。
```
$ openssl req -help
```

コマンドを読み解いていくと-

```
openssl req -new -sha256
```
新規にCSRをSHA-2で作成する。
SHA-1で作成する場合は、-sha1 とすれば良い。
SHA-1証明書の発行は2015年一杯で終了ですが念のため。

```
-subj "/C=XXXXX/ST=XXXXX/L=XXXXX/O=XXXXX/OU=XXXXX/CN=XXXXX"
```
国やら会社名とか入れるところ。
説明は、いろいろなところにあるから省きます。

```
-out XXXXX.csr
```
CSRを XXXXX.csr で作成する

```
-newkey rsa:2048 -nodes
```
新規に秘密鍵をパスフレーズなし(-nodes)の2048bitで生成する。

```
-keyout XXXXX.key
```
秘密鍵を XXXXX.key で作成する。

これで、CSRと秘密鍵が同時に作成できます。

## 秘密鍵とCSRがペアであることを確認する。

CSRと秘密鍵の modules を比較し同じであればペア。

・CSRから modules だけ抜き出すコマンド
```
$ openssl req -in XXXXX.csr -noout -modulus
```
・秘密鍵から modules だけ抜き出すコマンド
```
$ openssl rsa -in XXXXX.key -noout -modulus
```
これらの結果を diff で比較すれば簡単に確認できる。
```
$ diff <(openssl rsa -in XXXXX.key -noout -modulus) <(openssl req -in XXXXX.csr -noout -modulus)
```


## SSL証明書申請時の Organization Name と ドメイン の Organization(whoisで確認できる)を乖離させない。

申請が通らないことがあるので注意する。
CarrierWaveでUPDATE時に前回アップロードした画像を消さないようにする。

例えばユーザーのプロフィール画像で使用している際、

```ruby:models/user.rb
class User < ActiveRecord::Base
  ...
  mount_uploader :image, ImageUploader
end

```

`/users/:id/edit`にアクセスすると`form`の`ファイル選択ボックス(file_field)`には前回アップロードした画像は設定されていないので、この状態で`update(PATCH/PUT /users/:id)`を行うと前回アップロードした画像が消えてしまう。


## image_cacheを追加する
 
既に画像が存在する場合はキャシュを作成する

```ruby:controllers/users_controller.rb
  # GET /users/1/edit
  def edit
    @user.image.cache! unless @user.image.blank?
  end
```

画像をアップロードするViewでhiddenタグにキャッシュを追加する

```erb:views/users/edit.html.erb
 <%= f.label :image, "画像" %>
 <%= f.file_field :image %>
 <%= f.hidden_field :image_cache %>
```

Strong Parametersへ`:image_cache`を追加後updateすると
画像を変更していない場合は、前回アップロードした画像は消えない。
linux > 複数ファイルのdiffを取る > diff -r フォルダ1 フォルダ2

ある２つのフォルダにある複数のファイルのdiffを取りたい。

ファイルごとにdiffを取るのが面倒くさい時、以下を実行する。

    $ diff -r . work1

上記の例では、カレントフォルダ(.)とその下にあるwork1のフォルダ内のファイルのdiffを取る。

実行結果例は

    Only_in .: Makefile
    diff -r ./main.c work1/main.c
    124c124
    < #include "sd2.h"
    ---
    > #inlcude "sd.h"
    Only in .: sub_init.c
    Only in .: sub_init.h
のようになる。

`Only in`というのは、そのフォルダにのみあり、もう片方にはないファイル (Makefile, sub_init.c, sub_init.h)。

`diff -r ./main.c work1/main.c`から`> #include "sd.h"`までがmain.cのdiffを表す。
Atomエディタのスタイルシート


Atomエディタの標準設定だと文字が中華フォントちっくなので、私の設定です。Mac用。

## 設定方法

メニュー：Atom > Preferences...を選ぶとSettingsタブがでます。
そこから Themes を選んで、Choose a Themeの下にある、
「You can also style Atom by editing **your stylesheet**」
のyour stylesheetをクリックしてください。

style.lessというスタイルシートが開きます。

私はこのように書いてます。

```:style.less

/*
 * Your Stylesheet
 *
 * This stylesheet is loaded when Atom starts up and is reloaded automatically
 * when it is changed.
 *
 * If you are unfamiliar with LESS, you can read more about it here:
 * http://www.lesscss.org
 */

.tree-view {

}

// style the background and foreground colors on the atom-text-editor-element
// itself
atom-text-editor {

}

// To style other content in the text editor's shadow DOM, use the ::shadow
// expression
atom-text-editor::shadow .cursor {

}

//ここから追加
@font-family-p: "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN";
@font-family-m: Consolas, 'Courier New', Courier, Monaco, monospace;

.tree-view {
  font-family: @font-family-p;
}
.tree-view ol {
	font-size:18px;
	padding:0;
}
.tree-view li {
  padding:0.1em;
}

.editor {
  font-family: @font-family-m;
}

.vertical {
  font-family: @font-family-p;
}

.markdown-preview {
  font-family: @font-family-p;

  h1, h2, h3, h4, h5, h6 {
	font-family: @font-family-p;
  }

  h1 {
	  padding:0.1em;
	  line-height:140%;
	  background-color:#eaeaea;
	  border:1px solid #3333aa;
  }
  h2 {
	  padding:0.0em;
	  line-height:130%;
	  text-indent: 0.1em;
	  border:1px solid #3333aa;
	  border-left:5px solid #3333aa;
  }
  h3 {
	  padding:0.0em;
	  line-height:120%;
	  text-indent: 0.2em;
	  border-bottom:1px solid #3333aa;
  }
  h4 {
	  padding:0.1em;
	  line-height:110%;
	  text-indent: 0.2em;
	  border-bottom:1px dashed #3333aa;
  }

  pre, code, tt {
	font-family: @font-family-m;
  }
}


```

追記：markdown-preview のスタイルも反映させました。
JSONのテンプレートエンジンとしてnode.jsを使う

JSONって人類が手動で書く形式じゃないと思うんですよね。。
末尾カンマは許されないし、ダブルクォーテーションでくくらないといけないし、コメントも書けない。つらい。

正直なところ、普通のJavaScriptの方が構文がシンプルです。
なので、node.jsのプログラムで書いておいて、プリプロセスすれば便利なのではないか、と思いました。

```js:foo.json.js
var data = {
  foo: "あいうえお",

  // 途中にコメント書ける
  baa: [1,2,3,],

  moo: [1,2,3,4].reduce(function(a,b){
    return a + b;
  }),
  // ちょっとした処理も書けるし
  // node.jsのJavaScriptだから安心してカンマつけられる
};

console.log(JSON.stringify(data, null, 2));
```

JSON化も一発ポン。

```bash
$ node foo.json.js > foo.json
$ cat foo.json

{
  "foo": "あいうえお",
  "baa": [
    1,
    2,
    3
  ],
  "moo": 10
}
```

まあ、バージョン管理システム上どうしたらいいんだろうとか、JSON側をいじってしまいjs側が古いままで上書きしちゃったーとか、色々考えることが増えるのでしょうけど。

言いたかったのは、YAML/JSON5/CSON/その他...で書いてプリプロセスしてもいいのでしょうが、node.jsだけで変換できる手軽さを考えると、ちょっとしたJSONならJSで書いちゃえばいいんじゃないの？というところでした。

npmなどのように、コマンド側にJSONをよしなに扱ってくれる機能があれば、そんなにつらく感じないのですけどね。
PUTTYで自動接続/ログインする方法

Windows用SSHクライアントとして定番の「putty」ですが、普通に起動すると、毎回ユーザーID/パスワードを入力してログインする必要があり、一手間かかります。

自動ログインの方法を調べたところ、puttyのコマンドラインにユーザIDとパスワードを渡して接続することで、ユーザID/Passwordを入力せずに自動ログインが可能です。



####1.PUTTYのショートカットを作成する。

####2.作成したショートカットを右クリックし、プロパティウィンドウの「ショートカット」タブの「リンク先」の内容を修正し、exeの後ろに以下の内容を入力し、。
 

```
 -load 「セッション名」 -l 「ユーザ名」 -pw 「パスワード」
 ```

例）セッション名「test_ssh」ユーザー名「root」パスワード「password」の場合

```
"C:\Program Files (x86)\PuTTY\putty.exe" -load test_ssh -l root -pw password
```

####3.ショートカットをダブルクリックする。


**これで自動でログインまでできるようになります。**
RailsでファイルをAjaxで送信する

# 現象
Railsで次のようにしてもajaxできない。

```haml:submit.html.haml
= form_tag file_submit_path, multipart: true, remote: true
  = file_field :submit, :file
  = submit_tag
```
正確に言うと、ajaxにならずに通常のページ遷移をしてしまう。
ファイルのデータは送られている模様。

# 対処
remotipartっていうgemを使う。
https://github.com/JangoSteve/remotipart

```text:Gemfile
gem 'remotipart'
```

```shell-session
bundle install
```

```js:application.js
//= require jquery.remotipart
```

haml側は特に変えなくてもこれだけで送れるようになる。

### Rails 5のとき
コメントでRails 5だとうまく動かないという報告あり。現在調査中。

# 原因
http://guides.rubyonrails.org/form_helpers.html#dealing-with-ajax
詳しくは上記URLを参照のこと。

要は、Javascriptからはローカルのファイルを読み取れないので、通常のフォームとしてデータを送らないといけないが、フォームでデータを送るとページ遷移となってしまうということ。
【iOS】新しくなったCrashlyticsの使い方 Fabric版（アカウント取得編）


※本投稿は，iOS開発をある程度行っている方向けです。
##Fabricとは
 Fabricは，Crashlytics（クラッシュリティクス）、MoPub（モーパブ）、Twitterより構成され，アプリの安定性・利用者の増加・収益化等の問題を解決するためのプラットフォームであり，アプリ開発者にとってより良いサービスです。
 
 
##Crashlyticsとは
アプリのクラッシュログの報告，βテスト配信・管理等を行うことのできるサービスです。

##Xcode導入編
Fabric：http://get.fabric.io
###アカウント取得
![kobito.1423094214.865506.png](https://qiita-image-store.s3.amazonaws.com/0/57507/9fd5c7b2-6d65-293c-0b98-7d3e6f98d8fb.png "kobito.1423094214.865506.png")

1.”Get Stared With Frbric” を押して，名前・メールアドレスを入力します。


![kobito.1423094309.110028.png](https://qiita-image-store.s3.amazonaws.com/0/57507/0dfb522e-6d3a-942e-6b74-debdf05c22c0.png "kobito.1423094309.110028.png")

2.すると，こんなページに飛びます。FrbricSDKのダウンロードは，順番待ちです。しばらくすると，メールが届きます。リンククリックして，アカウントを作成します。


![スクリーンショット 2015-02-05 9.03.00.png](https://qiita-image-store.s3.amazonaws.com/0/57507/14146100-b421-73d7-b95c-b6e062b08fe2.png "スクリーンショット 2015-02-05 9.03.00.png")

3.今回は，iOS向けなのでXcodeをクリックして，Fabricアプリをダウンロードし，インストールして下さい。

![スクリーンショット 2015-02-05 9.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/57507/eb6c146b-8c67-f0e5-719a-0decf1b5a7ca.png "スクリーンショット 2015-02-05 9.19.34.png")

次は，いよいよ[SDK導入](http://qiita.com/tomoki-n/items/29e435507a1879a95bd1)です。
jupyter notebookをLaTeXに変換

# 基本コマンド

これは英語版．

```bash:TeXへ変換
jupyter-nbconvert --to latex foo.ipynb
```
```bash:画像のbb作成
extractbb foo_files/*.png
```

# テンプレート使う

テンプレート `bar.tplx` があれば次のようにする．

```bash:TeXへ変換
jupyter-nbconvert --to latex foo.ipynb --template bar.tplx
```

## テンプレートの書き方

Jupyter notebookがインストールしてあれば，
`PYTHONDIR/site-packages/nbconvert/templates/latex/`
あたりにデフォルトテンプレートがあるはず． 
今回は `article.tplx` を参考にして，日本語pLaTeX用テンプレート `jsarticle.tplx` を作る．

```python:jsarticle.tplx
% Default to the notebook output style
((* if not cell_style is defined *))
    ((* set cell_style = 'style_ipython.tplx' *))
((* endif *))

% Inherit from the specified cell style.
((* extends cell_style *))

%===============================================================================
% Latex Article
%===============================================================================

((* block docclass *))
\documentclass[a4paper,dvipdfmx]{jsarticle}
((* endblock docclass *))
```

この `jsarticle.tplx` を `foo.tex` とおなじディレクトリに置けばOK．

```bash:日本語pLaTeXコンパイル手順
jupyter-nbconvert --to latex foo.ipynb --template bar.tplx
extractbb foo_files/*.png
platex foo.tex
dvipdfmx foo.dvi
```
これで `foo.pdf` の出来上がり．


## かっこいいテンプレートの使い方


テンプレート集から以下のテンプレートを利用する．
https://github.com/ipython/nbconvert-examples/blob/master/notebook_cell_style/style_notebook.tplx

- [style_notebook.tplxを使ったスクリーンショット](https://camo.githubusercontent.com/bb627b5f335f647d0c1dd091667fbeb61c8891c7/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f333239323837342f313038333832322f32623737313365612d313561312d313165332d393966342d3738323939653664326639342e706e67)


冒頭部を以下のように書き換える．

```diff:style_notebook.tplx
--- style_notebook.tplx	2015-02-04 09:31:00.000000000 +0900
+++ style_notebook.tplx	2015-02-04 11:13:14.000000000 +0900
@@ -1,6 +1,6 @@
 ((= Notebook input/output style =))
 
-((* extends 'latex_base.tplx' *))
+((* extends 'jsarticle.tplx' *))
 
 % Custom packages
 ((* block packages *))    
```

で，このテンプレートを使うなら以下でOK．

```bash:日本語pLaTeXコンパイル手順
jupyter-nbconvert --to latex foo.ipynb --template style_notebook.tplx
extractbb foo_files/*.png
platex foo.tex
dvipdfmx foo.dvi
```

### 呼び出し構造

1. `style_notebook.tplx` で `((* extends 'jsarticle.tplx' *))`
2. `jsarticle.tplx` で `((* set cell_style = 'style_ipython.tplx' *))`
3. `style_ipython.tplx` で `((*- extends 'base.tplx' -*))`

`style_ipython.tplx` も `base.tplx` も `PYTHONDIR/site-packages/IPython/nbconvert/templates/latex/` にある．
いろいろ手を加えたければ，上位のテンプレートを見て，その中で必要な部分を抜き出して修正して
`jsarticle.tplx` の最後の方に付け加えればOK．

例えばfigure環境の部分を変えたければ，`base.tplx` から以下の部分を抜き出して
`jsarticle.tplx` の最後の方に付け加える．

```python:figure環境の生成部分．ここではmaxsizeを変更している．
% Draw a figure using the graphicx package.
((* macro draw_figure(filename) -*))
((* set filename = filename | posix_path *))
((*- block figure scoped -*))
    \begin{center}
    \adjustimage{max size={0.3\linewidth}{0.2\paperheight}}{((( filename )))}
    \end{center}
    { \hspace*{\fill} \\}
((*- endblock figure -*))
((*- endmacro *))
```
linux > pthreadのスタックサイズ > 10MB @ CentOS6.5

POSIXスレッドに関する本や資料を読んでいる中で、「1スレッドあたり8MBのスタック領域を使う」という記載があった。

CentOS6.5で確認したところ、8MBではなく10MBになっていた。

確認方法は

    ulimit -s
として表示される値。

また、[こちら](http://www.megadriver.info/~fumi/2010/11/linux-%E3%81%AE-pthread-%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/) に掲載されているpmapを使った確認方法でも10MB(10240KB)であった。

自分で設定を変更した覚えがないが、CentOS(またはLinuxカーネル)のバージョンアップにともないスタックサイズは変更になったのだろうか。
JavascriptのユニットテストをJasmine+Karmaでやってみる




Javascriptのテストフレームワークの一つであるJasmineを使うにあたって、以下の要望を満たせる方法が無いか模索した結果、なんとか動作するところまで行き着いたので整理します。

#### 要望
・テスト用のHTMLを書きたくない
・テストコードに余計なコードを書きたくない
・コマンドラインで実行したい


#### やったこと

---

##### インストール

###### Jasmineのインストール

    npm install -g jasmine
    

###### Karmaおよび関連モジュールのインストール

当初、Karmaは-gオプションで入れようとしていましたが、すでに使っているnodeのバージョンと合わなかったせいかうまく入らなかったのと、Karmaのサイトではローカルインストールを推奨していたので--save-devでインストールしました。


    npm install karma --save-dev
    
    npm install karma-jasmine --save-dev
    
    npm install karma-chrome-launcher --save-dev

		
##### Karmaの設定


###### 設定ファイルの生成

コンソールで以下を実行し、コンソールの指示に従っていくと最終的に設定ファイルが生成されます。

	karma init	
	
	
###### 設定ファイルの編集

同ファイル内のfilesプロパティにテストで使用するファイル名を追加します。


    files: [
        'js/test1.js',
        'js/test2.js'
    ],
    
---
##### 実行

実行方法は、以下のようにkarmaに設定ファイルを渡します。

    ./node_modules/karma/bin/karma start ./karma.conf.js

---
	
#### 関連リンク

[npm karma](https://www.npmjs.com/package/karma)
[KARMA](http://karma-runner.github.io/0.12/index.html)
[KARMA installation](
http://karma-runner.github.io/0.12/intro/installation.html)
ハッシュキーにハイフンが入る場合

Rubyのハッシュでキーにハイフンが含まれるとき

```rb
{ hoge-puyo: 1 }
```

とかするとSyntax Errorになるので

```rb
{ :'hoge-puyo' => 1 }
```

みたいなかんじにする。

## 追記

ruby2.2では

```
{ 'hoge-puyo': 1 }
```

がOKだそうです。
キャストとas

C#の型変換はキャストかasの２つの方法がある

キャスト
データクラスから別のデータクラス等への明示的な変換の場合に使う

```csharp
public class Minute
{
	public int value;
	public Minute(){}
	public Minute(int minute){ value = minute; }
}
public class Hour{
	public int value;
	public Hour(){}
	public Hour(int hour){ value = hour; }
	public static explicit operator Minute(Hour hour){
		return new Minute (hour.value * 60);
	}
}
public class Hoge{
	public void Test(){
		Hour hour = new Hour(2);
		Minute minute = (Minute)hour;
		Console.WriteLine(hour.value);    //2
		Console.WriteLine(minute.value);  //120
	}
}
```

as
継承元のクラスで継承先のクラス等への暗黙的な変換の場合に使う

```csharp
public class Second{
	public int sec;
	public Second(){}
	public Second(int second){sec = second;}
}
public class Minute : Second
{
	public Minute(){}
	public Minute(int minute){sec = minute*60;}
	public int GetMinute(){return sec/60;}
}
public class Hoge{
	public void Test(){
		List<Second> list = new List<Second> ();
		list.Add(new Second(60));
		list.Add(new Minute(10));
		foreach(var hoge in list)
		{
			Minute minute = hoge as Minute; 
			if(minute != null)
				Console.WriteLine(minute.GetMinute());// Minuteでnewしたものだけ呼ばれる
	}
}
```
Android StudioでJava not foundが出る場合の対処法

- `Info.plist`いじるの嫌だよ。
- `STUDIO_JDK`を`export`してターミナルから`open`するの面倒だよ。
- `/etc/launchd.conf`で`setenv`すれば良いらしいけどなんか動かないよ。
- だったら`~/Library/LaunchAgents/`に`plist`を置けば良いじゃない。

というわけでこういうのを置いて再起動するのでも良いかと思います。ファイル名と`Label`の値は何でも良いと思います。

```~/Library/LaunchAgents/com.google.android.studio.setenv.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.google.android.studio.setenv.plist</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>setenv</string>
    <string>STUDIO_JDK</string>
    <string>/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
```
chef で最後の最後にリソースを実行する

chef には Compile フェーズ -> Convergence フェーズ -> Notification フェーズ、というものがあって、Notification フェーズよりも後、最後の最後にリソースを実行したい、と思ってもなかなか難しい。

そんななか、１つ方法を見つけたのでメモ。黒魔術

## 1. Chef::Handler を使う

Chef::Handler という仕組みがあって、chef 実行が終わったらレポートを出力するのに使える機能がある。これを悪用する。

レシピをこんなかんじに書く

```ruby:recipes/default.rb
require 'chef/handler'
class Chef::Handler::Finalizer < Chef::Handler
  def initialize(recipe)
    @recipe = recipe
  end
  def report
    @recipe.log "final log" do
      message "This message is shown in last!!"
    end.run_action(:write)
  end
end
Chef::Config[:report_handlers] << Chef::Handler::Finalizer.new(self)

# あとはなにか普通のを書く
directory "/tmp/foo" do
end
```

report メソッドの中でリソースを直実行している。

## おわりに

良い子の皆は真似しないでね
いまさら聞けない、ビルドターゲットの分け方

ビルドターゲットを使い分けると「有料版/無料版」「デバッグとリリースで違うBundleIdentifierを使いたい」等、コードはほとんど同じでちょっとだけ違うビルドをしたいものを、一つのプロジェクトにまとめておくことができます。

LCD Clockの有料版と無料版もこの方法で作り分けています。（ステマ）

![icon-40@2x.png](https://qiita-image-store.s3.amazonaws.com/0/19676/ce30f4bf-5c48-503a-3840-28affe9261eb.png)

【LCD Clock】
https://itunes.apple.com/jp/app/lcd-clock/id295737235?mt=8
【LCD Clock Lite】
https://itunes.apple.com/jp/app/lcd-clock-lite-clock-calendar/id567652828?mt=8

ここではビルドターゲットを分ける具体的な手順を説明します。

### ビルドターゲットを分ける方法
---

1. 元になるターゲットを選択して右クリック→Duplicate。
![スクリーンショット 2015-02-05 1.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/19676/cd759485-f064-a3fb-00c8-f0a44d232ca1.png)

1. iPad用に変換するか聞かれます。今回は「Duplicate Only」で。
![スクリーンショット 2015-02-05 1.19.38.png](https://qiita-image-store.s3.amazonaws.com/0/19676/efe741da-58ca-4b50-0cee-b14e0c7dd168.png)

1. MyProjectがコピーされて新しいターゲットができました。
![スクリーンショット 2015-02-05 1.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/19676/67b2686c-acda-c89b-2d49-1700f1c18b01.png)

これで当初のビルドターゲットを分けるというところまではできました。

この時点でビルド設定とInfo.plistも分かれているので、ターゲットに応じたBundleIdentifierなどを使い分けることができます。

ですがここまででは「違うビルドの設定ができた」というだけで、コードで分岐させることはまだできません。コードで分岐が書けるようになるにはもう一手間必要です。

正確には、別々な設定をしたInfo.plistの値などをつかって分岐させることはできますが、普通の状況だとターゲットで異なる処理を動的に（実行時に）分岐させる必要は無く、はじめからどちらかだけで良い場合がほとんどです。

そこで、下記のビルド設定で定義する値を使いプリプロセスの段階で分岐させます。
プリプロセスはコンパイルの前に行われ対象外の部分は無いのと同じです。ですので実行時に分岐判定などが行われることもなくターゲットが増えたからと言って実行時の処理が増えることもありません。

### ターゲットに応じて分岐する方法
---
ターゲットを選択してBuildSettings、PreprocessorMacrosを開きます。
今回は、それぞれに「MYTARGET_A」「MYTARGET_B」という定義を追加しました。

![スクリーンショット 2015-02-05 1.39.40.png](https://qiita-image-store.s3.amazonaws.com/0/19676/e3cc98b9-2520-e255-911f-7599b556bb6c.png)
![スクリーンショット 2015-02-05 1.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/19676/562f8110-1f5d-7d9a-5766-494a7070934c.png)

これで準備は完了です。

ターゲットを選択してビルドすれば、それぞれに応じた定義が有効になります。
　　![スクリーンショット 2015-02-05 1.44.12.png](https://qiita-image-store.s3.amazonaws.com/0/19676/cdef60be-cd5e-5c33-b04a-de4f959cb58b.png)

あとは下記の用に、必要な箇所で分岐させます。

```
#ifdef MYTARGET_A
	NSLog(@"MYTARGET_A");
#endif
	
#ifdef MYTARGET_B
	NSLog(@"MYTARGET_B");
#endif
```

ちなみにターゲットが2つしかなければelseを使って

```
#ifdef MYTARGET_A
	NSLog(@"MYTARGET_A");
#else
	NSLog(@"MYTARGET_B");
#endif
```

のようにも書けます。

---
ちなみにLCD Clockでは、有料版には

　　![スクリーンショット 2015-02-05 2.27.05.png](https://qiita-image-store.s3.amazonaws.com/0/19676/93df29bc-5915-c9b4-bd3b-cf4370e1bfee.png)

このようにウィジェット（TodayExtension）が2つ含まれていますが、無料版にはウィジェットは含まれていません。
ビルドターゲットでこのような使い分けも可能です。
boot2docker 上で動く mosquitto との通信を wireshark で覗く

## バージョン

- Mac OS X: 10.10.2
- WireShark(Qt): 1.12.3
- VirtualBox: 4.3.20

## 目的

Mac (boot2docker) の docker コンテナ上で動く mosquitto (MQTT ブローカー) との通信を wireshark (tcpdump) したい。

意外と手間取ったので、メモとして残す。

## そもそもパケットが見えない

ネットワークは

```
Mac(VirtualBox Host) ------- boot2docker(Virtualbox Guest)
                vboxnet0
```

のようになっている。vboxnet0 はホストオンリーアダプタ。
Mac で vboxnet0 を wireshark すると、例えば ping だと ECHO Reply だけ見える。

- `Mac -> boot2docker` 方向は見えない
- `Mac <- boot2docker` 方向は見える

アダプタータイプをいじってみても改善しなかった。

仮想ドライバをいじるのはつらいので、NAT しているインターフェースで port forward することにした。こうすると `lo0` で両方向、ちゃんと見える。
port forward はいちいち設定を入れる必要があってめんどくさいから、なるべくホストオンリーアダプタでやりたかったけど、しかたない。

## MQTT plugin を有効化する

wireshark 標準では MQTT パケットをデコードしてくれない。MQTT はバイナリプロトコルなので、そのままだとちょっとつらい。

https://raw.githubusercontent.com/menudoproblema/Wireshark-MQTT/master/mqtt.lua を wget とかする。そのままだと動かなかったので、次のように変更した。

```diff
--- mqtt.lua	2015-02-05 02:02:54.000000000 +0900
+++ /usr/local/lib/wireshark/plugins/1.12.3/mqtt.lua	2015-02-05 01:15:01.000000000 +0900
@@ -18,14 +18,13 @@

 do
 	-- Create a new dissector
-	MQTTPROTO = Proto("MQTT", "MQ Telemetry Transport")
-	local bitw = require("bit")
+	MQTTPROTO = Proto("MQTT3", "MQ Telemetry Transport")
 	local f = MQTTPROTO.fields
 	-- Fix header: byte 1
 	f.message_type = ProtoField.uint8("mqtt.message_type", "Message Type", base.HEX, nil, 0xF0)
 	f.dup = ProtoField.uint8("mqtt.dup", "DUP Flag", base.DEC, nil, 0x08)
 	f.qos = ProtoField.uint8("mqtt.qos", "QoS Level", base.DEC, nil, 0x06)
-	f.retain = ProtoField.uint8("mqtt.retain", "Retain", base.DEC, nil, 0x01)
+	f.retain = ProtoField.uint8("mqtt.retain1", "Retain", base.DEC, nil, 0x01)
 	-- Fix header: byte 2
 	f.remain_length = ProtoField.uint8("mqtt.remain_length", "Remain Length")

@@ -71,9 +70,9 @@
 		repeat
 			 digit = buffer(offset, 1):uint()
 			 offset = offset + 1
-			 value = value + bitw.band(digit,127) * multiplier
+			 value = value + bit32.band(digit,127) * multiplier
 			 multiplier = multiplier * 128
-		until (bitw.band(digit,128) == 0)
+		until (bit32.band(digit,128) == 0)
 		return offset, value
 	end
```

これを ~/.wireshark/plugins/mqtt.lua にコピーする。

wireshark は Homebrew からインストールし、`--with-lua` を有効にしてある。

## まとめ

wireshark を起動しなおして、lo0 をダンプしつつ `tcp.port == 1883` でフィルタし、Mac で MQTT クライアントを動かすと、MQTT パケットが見える。

![スクリーンショット 2015-02-05 2.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/9549/302e4d34-5135-a4af-d8b2-6629c24d61d7.png)

これで MQTT の解析が捗るね。
HTML5Test.com でブラウザを評価する際の注意点

ブラウザの HTML5 対応レベルを手軽に評価するのに「[HTML5Test.com](http://html5test.com/)」が便利です。

ただし点数評価がテストプログラムのバージョンによって変動するようなので注意が必要です。

以下は、現時点（2015年2月）の IE11 最新版（11.0.9600.17498）をテストした結果になります。

### HTML5Test.com November 2013 - version 5.0
![IE11_001.png](https://qiita-image-store.s3.amazonaws.com/0/26094/5a364c58-7db3-41e1-7705-f0392665e897.png)
![IE11_002.png](https://qiita-image-store.s3.amazonaws.com/0/26094/07b9d9f2-09d0-d519-b173-636e479b009f.png)

### HTML5Test.com January 2015 - version 6.0
![IE11_001.png](https://qiita-image-store.s3.amazonaws.com/0/26094/4f52f708-2cae-7f11-d3c4-b4b111364f77.png)
![IE11_002.png](https://qiita-image-store.s3.amazonaws.com/0/26094/f2654ca7-a0db-9ded-ac1b-68971beda324.png)

以前よりも点数が下がったかも？というときは、テストプログラムのバージョンを確認してみてください。サイトのページ最下部に記載があります。

### HTML5Test.com の過去バージョンの入手方法

気になるようでしたら、Github の [NielsLeenheer/html5test](https://github.com/NielsLeenheer/html5test) より過去バージョンをダウンロードして確認することが可能です。
スコープのパフォーマンスを手軽に測定


昨今ではxcodeみたいに、標準で
パフォーマンス測定用の環境があったりしますが、
ある程度負荷のかかっている箇所が想定できる場合なんかは
サクッとコードを仕込んでログ出力により調査できると
気軽だったりする時があります。

C++では変数のライフタイムの仕組みを活用すれば、
簡単に実現できるかもしれません。

例えば、こんな風に

```cpp
class ScopedProfile
{
public:
    ScopedProfile( const char* name, uint32_t line )
    : _startClock( clock() )
    , _name( name )
    , _line( line )
    {}
    ~ScopedProfile(){
        printf( "[%s:%u] %f sec.\n", _name, _line, (double)( clock() - _startClock ) / CLOCKS_PER_SEC );
    }
private:
    clock_t _startClock;
    uint32_t _line;
    const char* _name;
};
```

マクロ化もしちゃいます。
マクロは毛嫌いする人もいますが、
用途が明確でコード解析を乱雑化しないものであれば
有用かと思います。

```cpp
#if 1
#define ScopedProfile_ ScopedProfile ScopedProfile##__LINE__(__PRETTY_FUNCTION__, __LINE__);
#else
#define ScopedProfile_
#endif
```

テストしてみます。

```cpp
static void TestScopedProfile(){
    auto var = new uint32_t[10000000];
    {
        ScopedProfile_
        for( int i = 0; i < 10000000; ++i ){
            var[i] = 0;
        }
    }
    {
        ScopedProfile_
        memset(var, 0, sizeof(uint32_t)*10000000);
    }
    delete[] var;
}
```

手持ちのiPhone5Sでdebugビルドを実行した結果です。

```
[void TestScopedProfile():39] 0.080048 sec.
[void TestScopedProfile():45] 0.004837 sec.
```


64bit環境でのmemsetの速度を調べたいわけではなかったのですが、
随分と差が出てました。

それは今回の目的ではないので置いておいて、
負荷の気になる「頻繁に呼ばれない程度のロジック」があれば、
こんな感じのプチ・プロファイラを仕込んでおくのも素敵かと思います。
intel edison用にmrubyをWindowsでクロスコンパイル

はじめに
=======
mrubyは[ドキュメントにもあるように](https://github.com/mruby/mruby/tree/master/doc/compile#cross-compilation)クロスコンパイルが簡単にできるようになっているので、
[intel edison用にWindowsでクロスコンパイル](http://qiita.com/nocd5/items/22446c5db1bd756e2c30)で書いたように`--sysroot`を指定することさえ分かっていれば簡単にedison用のバイナリをビルドできます。

クロスコンパイルの設定と実行
========================
mrubyのドキュメントにあるように、クロスコンパイルするには
`build_config.rb`に設定を追加します。
以下を`build_config.rb`の最後に追記してください(`--sysroot`に指定するパスは適宜修正のこと)。

```ruby:build_config.rb
MRuby::CrossBuild.new('edison') do |conf|
  toolchain :gcc

  conf.cc.command = ENV['CC'] || 'i586-poky-linux-gcc'
  conf.cc.flags << "--sysroot=C:/Tools/edison/sysroots/core2-32-poky-linux"
  conf.linker.command = ENV['LD'] || 'i586-poky-linux-gcc'
  conf.linker.flags << "--sysroot=C:/Tools/edison/sysroots/core2-32-poky-linux"

  conf.exts.executable = ''

  enable_debug

  conf.gembox 'default'

  # if you need mrdb
  conf.cc.defines = %w(ENABLE_DEBUG)
  conf.gem :core => "mruby-bin-debugger"

end
```
編集が終わったらいつも通り`make`[^1]を実行すれば
`build/edison`以下にファイルがビルドされます。

[^1]: まずhost用mrbcをビルドし、そのあとedison用バイナリをビルドするので
 windowsがターゲットのGCC(mingwなど)と、edisonのSDK、両方にpathを通しておく必要があります。

あとは`build/edison/bin/mruby`や`build/edison/bin/mrdb`など必要なファイルを転送すれば
intel edisonでmrubyが使えます！

###あとは、**mruby-mraa**とかあればなぁ～色々できるんだろうなぁ～
Homebrew Caskを入れてみる。

個人でしか使わないMacBook Proなので適当にアプリなど入れても良いのだが、どうしてもある程度のルールの下で管理出来るのが理想だと思う。

その筆頭がHomebrewな訳ですが．．．
いろいろ見ていると、Homebrew Caskなるものがある。

Homebrew CaskはHomebrewを拡張し、*.app、*.pkg、*.dmgなどで配布されているアプリケーションをインストール出来るようにします。

Homebrew Caskのインストールも簡単です。

```
$ brew install caskroom/cask/brew-cask
```

インストールログは下記の通り。

```
mbp2014mid:~ hokari$ brew install caskroom/cask/brew-cask
==> Installing brew-cask from caskroom/homebrew-cask
==> Cloning https://github.com/caskroom/homebrew-cask.git
Updating /Library/Caches/Homebrew/brew-cask--git
==> Checking out tag v0.53.0
?  /usr/local/Cellar/brew-cask/0.53.0: 2379 files, 9.4M, built in 43 seconds
mbp2014mid:~ hokari$ 
```

簡単ですね。
GridViewの固定列対応

WPFのListViewやDataGridには列を固定する機能が用意されていないらしい。
Excelでいうところの「ウインドウ枠の固定」、WinFormsなら `DataGridViewColumn.Frozen = True` にあたる機能。

StackOverflowにも質問が上がってるけど、回答としては「ListView２つ並べればいいんじゃねーの」とのこと。
それもちょっとなあという感じ。

必要になりそうなので、ItemsControlの勉強をかねて作ってみた。
https://github.com/wonderful-panda/playground.wpf


### サンプル

こんな感じのアレとアレで、

```csharp:MainViewModel.cs
public class File
{
    public string Name { get; private set; }
    public string Path { get; private set; }
    public long Size { get; private set; }
    public DateTime LastWriteTime { get; private set; }
    public File(FileInfo fi)
    {
        this.Name = fi.Name;
        this.Path = System.IO.Path.GetDirectoryName(fi.FullName);
        this.Size = fi.Length;
        this.LastWriteTime = fi.LastWriteTime;
    }
}

public class MainWindowViewModel
{
    public ObservableCollection<File> Files { get; private set; }
    public MainWindowViewModel()
    {
        var directory = new DirectoryInfo(Environment.CurrentDirectory);
        this.Files = new ObservableCollection<File>(directory.GetFiles().Select(fi => new File(fi)));
    }
}
```

```xml:MainWindow.xaml
<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:Test"
        xmlns:c="clr-namespace:Playground.Controls;assembly=Playground.Controls"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <l:MainWindowViewModel x:Key="viewmodel" />
    </Window.Resources>
    <Window.DataContext>
        <Binding Source="{StaticResource viewmodel}" />
    </Window.DataContext>
    <Grid>
        <c:GridViewEx ItemsSource="{Binding Files}">
            <c:GridViewEx.FrozenColumns>
                <GridViewColumnCollection>
                    <GridViewColumn Header="ファイル名"
                                    DisplayMemberBinding="{Binding Name}" />
                </GridViewColumnCollection>
            </c:GridViewEx.FrozenColumns>
            <c:GridViewEx.NormalColumns>
                <GridViewColumnCollection>
                    <GridViewColumn Header="サイズ"
                                    DisplayMemberBinding="{Binding Size}" />
                    <GridViewColumn Header="更新日時"
                                    DisplayMemberBinding="{Binding LastWriteTime, StringFormat='yyyy/MM/dd HH:mm:ss'}"/>
                    <GridViewColumn Header="フォルダ"
                                    DisplayMemberBinding="{Binding Path}" />
                </GridViewColumnCollection>
            </c:GridViewEx.NormalColumns>
        </c:GridViewEx>
    </Grid>
</Window> 
```

こんな感じになる。
![gridviewex-1.png](https://qiita-image-store.s3.amazonaws.com/0/11109/08a355d0-b299-d0ea-de95-1cb42abc8e97.png)

![gridviewex-2.png](https://qiita-image-store.s3.amazonaws.com/0/11109/48c120d8-991a-fe65-b6f5-02e7b569d543.png)

### 説明
やってることは単純で、行ごとに `GridViewRowPresenter` を２つずつ(固定列用とそれ以外用)配置して、スクロールバーの`HorizontalOffset` にあわせて左Marginを調節してるだけです。
細かい作りこみはまだ全然甘いですが。

でも `GridViewRowPresenterEx` みたいなクラスを作ってその中で頑張る方が筋がいい気もする。
関係ないけど～Exみたいな命名ちょっとアレですね。
pip install で SVN のリビジョンを指定する場合

# 経緯

少し前、 CaboCha が Python3 ではインストールできなかったので、パッチを作ってマージして頂いた。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/kitsuyui">@kitsuyui</a> trunk に反映しました。ありがとうございます。</p>&mdash; Taku Kudo (@taku910) <a href="https://twitter.com/taku910/status/556466893280645120">2015, 1月 17</a></blockquote>

この時点 (2015/01/17) では trunk のみ反映済みだったため、
pip で SVN のリビジョンを指定してインストールする方法を調べた。
備忘録として書き留めておく。

# やり方

```shell-session
$ pip install 'svn+http://cabocha.googlecode.com/svn/trunk/python@r99'
```

@ につづいてリビジョンをつけるだけで OK 。

requirements.txt に書く際も

```text:requirements.txt
svn+http://cabocha.googlecode.com/svn/trunk/python@r99
```

のようにそのまま書いて問題ない。

```shell-session
$ python
Python 3.4.2 (default, Dec  9 2014, 22:10:32)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import CaboCha
>>>
```

ちゃんと import できている。

# その他

なお 2015/01/22 に
 https://drive.google.com/folderview?id=0B4y35FiV1wh7cGRCUUJHVTNJRnM&usp=sharing#list
の配布物にも既に全て反映済みになっている。
なので現在は SVN のバージョンを指定してインストールする必要はない。最新版を使おう。

また、 CaboCha 本体のバージョンは r104 まで進んでる。
PPLを使った簡単並列プログラミング（Visual Studio 2013, C++, OpenCV, 3D点群処理, Kinect）

# PPL
Microsoft [PPL](https://msdn.microsoft.com/ja-jp/library/dd492418.aspx)（Parallel Patterns Library）で簡単にプログラムを並列化＆高速化できます。KinectFusionの[サンプルコード](http://qiita.com/SatoshiRobatoFujimoto/items/bddefc89456c0716b00a)を見ていて、気づきました。

使用するには、ppl.hをインクルードします。Visual Studio 2010以降から、標準搭載されているようです。

~~~
#include <ppl.h>
~~~

# 使用例
たとえば、画像や点群を扱うときの2重ループ（for文）では、普段なら、

~~~
for(int y = 0; y < image.rows; y++)
{
   for(int x = 0; x < image.cols; x++)
   {
      //処理
   }
}
~~~

と、こう書くところを、最初の1行を変えて、最後に**);**を付け加えるだけで、

~~~
Concurrency::parallel_for(0, image.rows, [&](int y)
{
   for (int x = 0; x < image.cols; x++)
   {
      //処理
   }
});
~~~

並列処理が実現できてしまいます。

# 処理時間の計測
やってみて、うまく計算できてたら、処理時間を比較してみましょう！
OpenCVには処理時間を測るための、TickMeterクラスがあります。

~~~
using namespace cv;

TickMeter tm;
tm.start();
　//この間に記述されたプログラムの処理時間を測る
tm.stop();
//秒で表示
cout << "Time = " << tm.getTimeSec() << " sec." << endl;
//ミリ秒で表示
cout << "Time = " << tm.getTimeMilli() << " ms." << endl;
~~~

# まとめ

画素値アクセスや3D点群処理は、forループだけで結構時間かかるので、助かる。か・も・し・れ・な・い
[実は、2重ループくらいじゃ処理速度はあんまり変わらない。笑](http://qiita.com/SatoshiRobatoFujimoto/items/68dc5640f2ca862ea0d3)

＊Common Language RunTime Support (/clr)でビルドするとエラーが出るので、No Common Language RunTime Supportに変更してください。