OmniAICreator/Qiita-1.07M huggingface dataset:
ConoHa APIをRubyから呼ぶ


前回[Safari用機能拡張](http://qiita.com/bellx2/items/09c6a17157127f2e120a)を作ったのですが、ふと思い立って今回はRubyで書いてみることにしました。

今回は細かい部分は省略してコードだけ。

## Tokenを取得する

ポイントとしてはhttpで通信することですかね。

```ruby:
require 'net/https'
require 'uri'
require 'json'

....

    def GetToken(username, password, region)
      tenantId = username.gsub("gncu","gnct")
      url = "https://identity." + region + ".conoha.io/v2.0/tokens"
      uri = URI.parse(url)
      https = Net::HTTP.new(uri.host, uri.port)
      https.use_ssl = true
      #https.set_debug_output $stderr
      req = Net::HTTP::Post.new(uri.request_uri)
      req["Content-Type"] = "application/json"
      req.body = '{ "auth": { "passwordCredentials": { "username": "'+ username +'", "password": "'+ password + '"}, "tenantName": "'+ tenantId +'" } }'
      res = https.request(req)
      if res.code == "200"
        json = JSON.parse(res.body)
        json["access"]["token"]
      else
        nil
      end
    end
```

真ん中あたりの「#https.set_debug_output $stderr」はコメントを解除すると通信状態の詳細が表示されます。デバッグに非常に便利です。

参考：[ConoHa API トークン発行](https://www.conoha.jp/docs/identity-post_tokens.html)

## サーバー状態を取得する

取得したAPIトークンをreq[X-Auth-Token]にて引き渡します。

```ruby:
require 'net/https'
require 'uri'
require 'json'

....

    def GetServers(region, token)
      url = "https://compute." + region + ".conoha.io/v2/" + token["tenant"]["id"] + "/servers/detail"
      uri = URI.parse(url)
      https = Net::HTTP.new(uri.host, uri.port)
      https.use_ssl = true
      #https.set_debug_output $stderr
      req = Net::HTTP::Get.new(uri.request_uri)
      req["Accept"] = "application/json"
      req["X-Auth-Token"] = token["id"]
      res = https.request(req)
      if res.code == "200"
	      json = JSON.parse(res.body)
	      json
      else
      	  nil
      end
    end
```

参考：[ConoHa API VM一覧詳細取得](https://www.conoha.jp/docs/compute-get_vms_detail.html)


## 応用編

一回コツがわかってしまえばAPIをいじって何ができるかを考えるのは楽しいですね。

ということで、自分以外に使う人がいるか疑問ですがこのコードを応用してAlfred2用のWorkflowを作ってみました。Conohaとコマンドを打つとサーバー一覧が表示されます。選択するとコントロールパネルが開きます。

https://github.com/bellx2/alfred2-conoha

![スクリーンショット 2015-07-17 23.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/14768/c9e0209a-37e6-945d-0aa5-82f0782c9670.png "スクリーンショット 2015-07-17 23.52.34.png")


まだざっくり作っただけのテスト段階ですが、興味のある人はどうぞ。
Ansibleでfirewalldを使うとSSHコネクションが切れてしまう

# はまったこと

Ansibleを使ってfirewalldの設定を行うと、次のコマンド実行時にsshコネクションが切れてしまうことがあります。

```
GATHERING FACTS *************************************************************** 
TASK: [centos7 | Setting Firewalld] ************************************ 
ok: [centos7] => (item={'state': 'disabled', 'service': 'http'})
ok: [centos7] => (item={'state': 'enabled', 'service': 'https'})

TASK: [centos7 | Restart service] ************************************** 
changed: [centos7]

TASK: [centos7 | yum clean] ******************************************** 
fatal: [centos7] => SSH Error: ssh: connect to host 192.168.33.20 port 22: No route to host
    while connecting to 192.168.33.20:22
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.

FATAL: all hosts have already failed -- aborting
```
```lang:yaml
- name: Setting Firewalld
  firewalld: zone=public permanent=true service={{ item.service }} state={{ item.state }}
  with_items:
    - { service: http, state: disabled }
    - { service: https, state: enabled }
  sudo: yes

- name: Restart service
  service: name=firewalld state=restarted enabled=yes
  sudo: yes

- name: yum clean
  command: yum clean all
```
# 動作環境

* CentOS7
* Ansible 1.9.2

# 対処方法

firewalldの再起動のタイミングで、sshポートで接続できるまで wait_for を使って待ち受けます。

```lang:yaml
- name: Restart service
  service: name=firewalld state=restarted enabled=yes
  sudo: yes

- name: wait for the server to come up
  local_action: wait_for host={{ inventory_hostname }} port=22 delay=10
```
地理座標点集合を孤立点／非孤立点へ二分

こんにちは。
多数の地理座標点からなる集合に対して、点間距離を規準に判定して孤立点／非孤立点の部分集合へ二分することを考えました。
下記では、Point の geojson データ（points.json）に対して、フィルター操作的に孤立点だけを集めて出力しています。[ArangoDB](https://www.arangodb.com/key-features/) [^1] [^2] および [jq](https://stedolan.github.io/jq/) を利用しました。演算部分はサーバサイドで実行されます。

```console
$ cat points.json | jq -c '.features[]' | arangoimp --file - --type json --collection "points" --create-collection true
$ arangosh --javascript.execute filter_aql.js | jq '{"type":"FeatureCollection", "features":.}' > points_single.json

$ cat filter_aql.js
// 判定する点間距離は 100 m
var aql = `
LET radius = 100.0
FOR p IN points
  LET coord = p.geometry.coordinates
  LET lst = WITHIN(points, coord[1], coord[0], radius)
  FILTER LENGTH(lst) == 1
  RETURN KEEP(p, ATTRIBUTES(p, True))
`;
db.points.ensureIndex({type:"geo", fields:["geometry.coordinates"], geoJson:true});
print(db._query(aql).toArray());
```

フィルターされた出力結果は

```console
$ cat points_single.json
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [141.000000, 43.000000]
      },
      "properties": {}
    },
    :
    :
  ]
}
```
----------
[^1]: arangoimp のデフォルトはデータベース "_system" へ取り込まれます。
[^2]: ```KEEP(p, ATTRIBUTES(p, True)) ```は、 ```UNSET(p, ['_id', '_key', '_rev']) ```と書いても同じ結果となります。
SASでSortを使って並び替え

[自分のブログより転載](http://puppet-life.com/post-426/)  
  
並び替えというと地味な作業ベスト3くらいに入るだろう作業なイメージです。  
そんなことないですか？エクセルでグラフよく使う人は並び替えにはお世話になってるのでしっくりくるかもしれません  
  
  


#並び替えは重要
SASに並び替えは重要です。むしろ一番最初にとりあえず並び替えをしてもいいと思うくらい重要です。  
なぜそんなに重要というのか、それは他の統計処理を行う際に並び順がおかしいとエラーになってしまうからです。  
例えば、平均を求めようとします。となると使うプロシジャーは`proc means`です。  
そして求めたい平均値を`var`で指定します。  
と、ここでそうだ！男女比で分けよう！と思います。すると`by`で分けようとします。  
なにも考えずにbyで分けるとエラーになります。  
##男女別身長体重の平均を求めるSASプログラム(並び替えなし=エラーになります)
  
```
data sort;
input id $ sex $ height weight;
cards;
001 m 180 70
002 f 165 60
003 m 175 67
004 f 162 58
;

/*男女別身長の平均 */
proc means data=sort;
var height;
by sex;
run;

/*男女別体重の平均 */
proc means data=sort;
var weight;
by sex;
run;

```
  
##男女別身長体重の平均を求めるSASプログラム(並び替えあり)
  
```
data sort;
input id $ sex $ height weight;
cards;
001 m 180 70
002 f 165 60
003 m 175 67
004 f 162 58
;

/* 並び替え */
proc sort data=sort;
by sex;
run;

/*男女別身長の平均 */
proc means data=sort;
var height;
by sex;
run;

/*男女別体重の平均 */
proc means data=sort;
var weight;
by sex;
run;

```
  
##このほかにも
`proc sort`を使わなくてはいけない場面でよく忘れがちなのは配列変換の時とデータをマージする時です。  
行と列を入れ替える(`proc transpose`)時に自分はよく忘れてたのは良い思い出です。  
  
###ちなみに
忘れるのが怖いという場合`by`を`class`に変えるという逃げ道もありますが使えないプロシジャーもありますので気をつけて！！
日本語LaTeXドキュメントへのIPAフォントの埋め込み

# 概要
ビューワでプレビューすると全文がゴシック体で出てしまった，みたいなあるある話を解決できます．TeXLiveが入っていればLinuxでもWindowsでもMacでもいけるはずです．

1番めの参考URLにあるように

```sh
$ dvipdfmx -f ptex-ipa.map
```

としてもよいのですが，この手の重要な設定がtexファイル本体に紐付いていないのはなんとも不便です．というわけで調べてみました．

# 方法
texファイルの先頭に

```tex
\AtBeginDvi{\special{pdf:mapfile ptex-ipa.map}}
```

を記述するだけでOKです．`ptex-ipa.map` の部分を別のマップファイルに変更すれば，他のフォントを割り当てることもできます．

私はlatexmkを使ってコンパイルしているのですが，ファイルごと(書類とプレゼンとか)で埋め込みたいフォントが異なるため，設定ファイルにオプションを記述するのは嫌だったのですが，これならtexファイルに直書きできるので重宝しています．

# 参考
- [TeXLive2011(Windows)でIPAフォントを使う(ソフトウェア) - 迷途覚路夢中行](http://blogs.yahoo.co.jp/igproj_fusion/14239904.html)
- [PDF の作り方 - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?PDF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9)
archlinux raspberrypi kernel rebuild


kernel moduleをリビルドする必要があったけど、[流儀](http://archlinuxarm.org/forum/viewtopic.php?f=46&t=7890#p42913)があったのでメモ。

オリジナルのarchlinuxは`abs`を使ってパッケージをビルドしている。このコマンドを通常通り`pacman`でインストールする。`abs`はPCの設定ベッタリなので、arm版では、これで取得できるPKGCONFIGファイルは使わない。

代わりに`git`でarchlinuxarm用のPKGCONFIGキットを直接取得する。

```bash
git clone https://github.com/archlinuxarm/PKGBUILDs
```

raspberrypi であれば、`core/linux-raspberrypi`のディレクトリになるので、そこに移動する。パッケージのビルド。

```bash
makepkg
```
さくらVPS（CentOS6）にJekyllデプロイ。

ローカルMacのjekyll -> さくらVPS(CentOS6)へデプロイ。
ローカルMacのrubyはrbenvで2.2.2をインストールして設定。

### さくらVPS(CentOS6)にrbenvインストール

```
# cd /opt
# git clone git://github.com/sstephenson/rbenv.git
```

```
# mkdir /opt/rbenv/plugins
# cd /opt/rbenv/plugins
# git clone git://github.com/sstephenson/ruby-build.git
```

``` text:/etc/profile
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

# さくらVPS(CentOS6)にRuby 2.2.2インストール

rbenvでRuby2.2.2を入れる。

```
# rbenv install 2.2.2
# rbenv global 2.2.2
# rbenv rehash
# rbenv version
2.2.2 (set by /opt/rbenv/version)
```

# gitリポジトリ作成

プッシュ先のリポジトリ作成してプシュした時の

```
# cd /home/mysite
# mkdir myblog.git
# cd myblog.git
# git --bare init
# cp hooks/post-receive.sample hooks/post-receive
# cd /home/mysite
# mkdir tmp
```

# git hook設定

```
copy /home/mysite/myblog.git/hooks/post-receive.sample
/home/mysite/myblog.git/hooks/post-receive
vi /home/mysite/myblog.git/hooks/post-receive
```

プッシュしたらBundle installしてJekyllサーバーして公開ディレクトリに静的ファイルを吐き出します。

``` /home/mysite/myblog.git/hooks/post-receive
pwd
echo 'post-receive'
ruby -v
rbenv version

git clone /home/mysite/myblog.git /home/mysite/tmp/repo

cd /home/mysite/tmp/repo
bundle install --path vendor/bundle
bundle exec jekyll build -s /home/mysite/tmp/repo -d /home/mysite/public

cd /home/mysite/tmp
rm -rf repo
exit
~  
```

プッシュした時にrbenvが効いていないのでエラーになる。

/etc/profileに書いたやつをプッシュするユーザーの.bashrcに書いたら動いた。

``` /home/mysite/.bashrc
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```
取得裝置的時區


通常在伺服器上存的 timestamp 傳到裝置上之後， NSDateFormatter 都需要要用裝置本身的時區把時間呈現出來

# System Time Zone

systemTimeZone 是 `NSTimeZone` 的 class methods 之一，可以取得當前裝置 **系統設定** 中所設定的時區

## Swift

``` swift
let timeZone = NSTimeZone.systemTimeZone()
```


## Objective-C

``` objc
NSTimeZone timeZone = [NSTimeZone systemTimeZone];
```

# More Information

- [NSTimeZone Class Reference - systemTimeZone](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/index.html#//apple_ref/occ/clm/NSTimeZone/systemTimeZone)
16 進数→2進数変換の覚え方

Inspired by http://yohshiy.blog.fc2.com/blog-entry-296.html

16パターンくらい全部暗記すればいいじゃんと言われても、脳内記憶域が足りネーヨって場合の覚え方＋導出方法。最終的には個人のお好みで。

# 2のべき乗
2進数の基本。ビット和(`|`)で特定ビットを立てる(set)ビットマスク。

|16進数|2進数|備考|
|:-:|-----:|:---|
|`1`|`0001`|1番目のビット(LSB)|
|`2`|`0010`|2番目のビット(`1<<1`)|
|`4`|`0100`|3番目のビット(`1<<2`)|
|`8`|`1000`|4番目のビット(`1<<3`)|

# (2のべき乗)-1
ビット積(`&`)で下位ビット(LSB側)を抽出するビットマスク。

|16進数|2進数|備考|
|:-:|-----:|:---|
|`1`|`0001`|下位1ビット(`(1<<1)-1`)|
|`3`|`0011`|下位2ビット(`(1<<2)-1`)|
|`7`|`0111`|下位3ビット(`(1<<3)-1`)|
|`F`|`1111`|下位4ビット(`(1<<4)-1`)|

# ビットパターン模様
ビットパターンの見た目をイメージ記憶。

|16進数|2進数|備考|
|:-:|-----:|:---|
|`3`|`0011`|`C`のビット反転(`~C`)|
|`C`|`1100`|`3`のビット反転(`~3`)|
|`5`|`0101`|`A`のビット反転(`~5`)|
|`A`|`1010`|`5`のビット反転(`~A`)|

# その他
`0`は自明。+1/-1くらいは暗算しましょう。

|16進数|2進数|備考|
|:-:|-----:|:---|
|`0`|`0000`|自明（でしょ？）|
|`6`|`0110`|`7`(`0111`)の前(-1)|
|`9`|`1001`|`8`(`1000`)の次(+1)|
|`B`|`1011`|`A`(`1010`)の次(+1)|
|`D`|`1101`|`C`(`1100`)の次(+1)|
|`E`|`1110`|`F`(`1111`)の前(-1)|

# おまけ
- [Hacker's Delight (2nd Edition)](http://www.amazon.co.jp/dp/B009GMUMTM/)
- [ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか](http://www.amazon.co.jp/dp/4434046683)
cv2.VideCapture(aviname) でうまく読めないとき

cv2.VideCapture(aviname) でうまく読めないとき

C++からVideoCapture(aviname)でうまく読めているか確認します。
しかし、Pythonからcv2.VideCapture(aviname) でうまく読めないときは
以下に示す内容もチェックしてみてください。

以下のサイトから目的の組み合わせのOpenCVとpythonのバージョンでのwhlファイルをダウンロードします。

http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

次に、そのwhlファイルをインストールします。

`> pip install opencv_python-2.4.11-cp27-none-win32.whl


この例ではOpenCV2.4.11 Python2.7 win32 buildの例です。

私の場合、このやり方で問題を解決しました。

参考URL
http://stackoverflow.com/questions/11699298/opencv-2-4-videocapture-not-working-on-windows

### 追記(2022.08.18) 記事が古くなっています。
IntelとAMDのCPU(x86_64)の場合だとUbutu Windowsについては
PyPiで
opencv-python 
opencv-contrib-python
opencv-python-headless
opencv-contrib-python-headless
のどれかを選んでインストールすればたいがいの場合うまくいくと思います。

自分でやむなくビルドする場合には
CMakeの設定で、
ffmpeg
を有効化したビルドになっているか確認してください。

GStreamerを有効化したビルドでは ffmpegを無効化したビルドになっていることが多く、その場合には動画を読み書きできなくなります。
Struts2.5-BETA1の公開とその移行手順

# Struts2.5-BETA1が公開されました。

メインロジックは2.3.24からあまり変更はしていませんが、依存する他フレームワークのバージョンアップや、対象ランタイムの変更などをしています。

## 主要な変更点

以下のプラグインがリリースから外れ、 **今後一切対応しない** とのことです。

* Dojo Plugin
* Codebehind Plugin
* JSF Plugin
* Struts1 Plugin

新しく次のプラグインが追加されました

* BeanValidation (JSR-303準拠)

一部のプラグインで利用しているフレームワークのバージョンがアップデートされました

* Spring 4.1.6-RELEASE
* Log4J2-2.3

ビルドJDKのバージョンが修正されました

* 現在はJDK7 (or later)です

## 移行手順

非推奨のプラグインを使っていなければ、以下の2箇所を修正するだけで動作するようです。

* 一部のインタフェースのパッケージを **統合** しています。
* Struts2用フィルタのパッケージ名が **一部省略** されました。

以下、変更点です。 **web.xmlの修正は必須です**

|機能名|概要|2.3.24|2.5-BETA1|
|:---|:---|:---|:---|
|StrutsPrepareAndExecuteFilter|web.xmlに登録するStruts2用フィルタ名|org.apache.struts2.dispatcher. **ng** .filter.StrutsPrepareAndExecuteFilter|org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter|
|ValidationAware|Validationエラー制御のインタフェース|com.opensymphony.xwork2.ValidationAware|com.opensymphony.xwork2. **interceptor** .ValidationAware|

微妙な修正ですが、今後BETA2がでた場合にはもうちょっと変更あるやも知れません。

## pom.xmlの修正

BETA版を公開しているリポジトリを追加します。変更後はclean からの package などを実施してください。

```xml:pom.xml(抜粋)
<project .....>
	<repositories>
		<repository>
			<id>apache.staging</id>
			<name>ASF Struts2.5 Snapshots</name>
			<url>https://repository.apache.org/content/groups/staging/</url>
		</repository>
	</repositories>
</project>
```
AutoLayoutのうるさい警告をもみ消す

iOS開発でAutoLayoutをつかって開発していると、実行時のログに

```
Unable to simultaneously satisfy constraints.
	Probably at least one of the constraints in the following list is one you don't want.
(以下略)
```

みたいな警告が出ることがあります。
本来は警告が出ないようにするのがベストですが、「うるせぇ、動いてるからいいんじゃ！」とか「そんなのを修正する暇があったらもっとやることがある」とかで無視したい場合もあるでしょう。

しかしこの警告はとても長く、複数回出たりするのでログが一瞬で流れていって不便です。(しかも例外を投げているのでデバッガでデバッグ中にいちいち止められることも)

この警告はUIViewの```engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:``` で出る警告なので、このメソッドを差し替えて、警告がでないようにできます。

```objc:UIView+Layout.h
#import <UIKit/UIKit.h>

@interface UIView (Layout)
@end
```

```objc:UIView+Layout.m
#import "UIView+Layout.h"
#import <objc/runtime.h>

@interface UIView (LayoutHidden)
-(void)engine:(id)engine willBreakConstraint:(id)constraint dueToMutuallyExclusiveConstraints:(id)mutuallyExclusiveConstraints;
@end

@implementation UIView (Layout)
-(void)engineDummy:(id)engine willBreakConstraint:(id)constraint dueToMutuallyExclusiveConstraints:(id)mutuallyExclusiveConstraints{
}

+ (void)load{
    method_exchangeImplementations(class_getInstanceMethod(self, @selector(engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:)),
                                   class_getInstanceMethod(self, @selector(engineDummy:willBreakConstraint:dueToMutuallyExclusiveConstraints:)));
}
@end
```
MacにOpenCVをインストールする方法


MacにOpenCVをインストールする方法で詰まったが、以下のサイトで解決したので忘備録のために書いておきます

http://www.daveperrett.com/articles/2010/12/14/face-detection-with-osx-and-python/

このサイトを参考にしました。

まずはHomeBrewをインストールする必要あり。

http://brew.sh/index_ja.html

このサイトを参考にすること

HomeBrewをアップデートすること

```
brew update
brew install -v cmake
```

Tapもする必要がある

```
brew tap homebrew/science
```

OpenCVをHomebrewにてインストールする

```
brew install opencv
```

次に、パスを通す
以下のパスの通し方は古いやり方である

```
export PYTHONPATH="/usr/local/lib/python2.6/site-packages/:$PYTHONPATH"
```

今使っているのはpython2.7なので、こう書き換える

```
export PYTHONPATH="/usr/local/lib/python2.7/site-packages/:$PYTHONPATH"
```

そうして、pythonを起動して、テストすれば動くはずである

```
> python
Python 2.7.10 (v2.7.10:15c95b7d81dc, May 23 2015, 09:33:12) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
>>> 
```

間違っていたらコメント下さい
PhpStormでSilexのコード補完

[silex-idea-plugin](https://github.com/Sorien/silex-idea-plugin)を入れると、silexの`$app['orm.em']`とか、配列のキーでもコード補完が効くようになります。

# 環境
PhpStorm ver 9.0 を使ってます。

# silex-idea-pluginのインストール
Settings＞Plugins＞「Browse repositories」で、「silex plugin」で検索するとでてきます。
選択してインストールしましょう。

もし出てこない場合は、以下からダウンロードすることもできます。
https://plugins.jetbrains.com/plugin/7809?pr=idea

その場合は、Settings＞Plugins＞「Install Plugin from disk」で、ダウンロードしたzipファイルを選択します。

# Silex Pimple Dumperのインストール
silex-idea-pluginは、[silex-pimple-dumper](https://github.com/Sorien/silex-pimple-dumper)で生成するpimple.jsonを利用してコード補完を行います。

`composer require sorien/silex-pimple-dumper:1.0.* --dev`

とかでインストールして、

`$app->register(new \Sorien\Provider\PimpleDumpProvider());`

で、Containerに登録すればOK。

`['debug'] = true`であれば、projectのルートにpimple.jsonを吐き出してくれます。

もしくは、`http://your_project/_dump`にアクセスしてもOKです。

# 参考
https://youtrack.jetbrains.com/issue/WI-17116
https://github.com/Sorien/silex-idea-plugin
https://github.com/Sorien/silex-pimple-dumper
スリムなCentOSでDockerコンテナを立てる


![atomichost.png](https://qiita-image-store.s3.amazonaws.com/0/37411/349db6a5-186f-6609-6313-03154ec7a934.png "atomichost.png")

## はじめに
DockerのホストOSとして軽量なCoreOSというものがあります。
他のOSでもDockerのホストにはなれますが、Dockerコンテナを立てるだけにしては色々無駄ですよね。
普段使ってるfedoraとかCentOSとかでそんな感じのがあればなー。


とまあ、前置きはおいといて、
特に深く考えずにサクッとCentOS7ベースの軽量OSであるAtomicHostをインストールしてDockerを触ってみようということで。
ちなみにfedora版もあるのでどちらでもお好きにどうぞ。

## インストール

1. [ここ](http://cloud.centos.org/centos/7/atomic/images/)からOSイメージをインストール
2. マシンに直でもVMでもお好きな環境でどうぞ。今回はVirtualBoxで。
3. VirtualBoxを立ち上げてマシンを作成。
4. とりあえずこんな構成にしました
 - CPU: 2
 - メモリ: 2GB
 - ネットワーク:ブリッジとホストオンリー

5. VMを立ち上げてさっきDLしたISOを突っ込む
6. 普通にCentOS7のインストール画面が出るのでよしなに進める
7. 再起動時にISOを抜いてログイン

## 起動したら
普通にCentOS7だと思った？残念、AtomicHostでした！
ということで、使えるコマンドが違います。

**まずyumはありません。**


もともとAtomicHostの目的としてDockerのホストOSなので基本的にはシステムはReadOnlyになっています。

OS自体をアップグレードするときは"rpm-ostree"とかいう謎のコマンドがあるのでヘルプでも眺めてみてください。

あとは"atomic"コマンドが追加されていて、"docker"コマンドの代わりとして使ったり構成管理ができる、らしいのですが、普通に"docker"コマンドが使えるのでそこまで使う気になれません。

~~そして時間がずれまくっている。~~
もう一回入れ直したらそんなことなかった。
最初に入れた時はホストのタイムゾーンいじりまくってたから、その時にやらかしたんでしょう。たぶん。

CentOS7では"ntpd"ではなく"chronyd"で時刻を管理しているので時刻サーバを日本のものに変えましょう。

```bash:/etc/chrony.conf   

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# ↓
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

```

あとはお好きに"docker"コマンドでコンテナ立てまくりライフを送りましょう！！
rakeをもう1段グレードアップしよう


rakeに登録しているタスクなど、処理の実行中・処理の結果を視覚化することで実行する人がより分かりやすく、またミスも防げるようになったりします。
ということで、視覚化するための手法をまとめてみました。別のを思いついたら随時更新していこうと思います。

## 進行状況をプログレスバー形式で表示

@riocamposさんの[進行状況をプログレスバーで表示](http://qiita.com/riocampos/items/cf71862bf975e13bdb4a)を使えば簡単に実装できます。べんり。

## エラーメッセージを赤で表示

エラーメッセージを赤く表示することで、視覚的にもエラーだと分かりやすくなります。
bashを使っているのであれば、`\e[31m`と`\e[0m`で囲むと文字が赤くすることができます（コマンドプロンプトは違うみたいです）。

```ruby
printf "\e[31mここにメッセージを書く\e[0m\n"
```

ちなみに下記のコードを使えば他の文字色も可能です。

```shell
# 文字色を変える
"\e[30m" # Black
"\e[31m" # Red
"\e[32m" # Green
"\e[33m" # Yellow
"\e[34m" # Blue
"\e[35m" # Purple
"\e[36m" # Cyan
"\e[37m" # White

# 太字にする
"\e[1;30m" # Black
"\e[1;31m" # Red
"\e[1;32m" # Green
"\e[1;33m" # Yellow
"\e[1;34m" # Blue
"\e[1;35m" # Purple
"\e[1;36m" # Cyan
"\e[1;37m" # White

# アンダーラインを付ける
"\e[4;30m" # Black
"\e[4;31m" # Red
"\e[4;32m" # Green
"\e[4;33m" # Yellow
"\e[4;34m" # Blue
"\e[4;35m" # Purple
"\e[4;36m" # Cyan
"\e[4;37m" # White

# 背景色を付ける
"\e[40m"   # Black
"\e[41m"   # Red
"\e[42m"   # Green
"\e[43m"   # Yellow
"\e[44m"   # Blue
"\e[45m"   # Purple
"\e[46m"   # Cyan
"\e[47m"   # White

# 元の色に戻す
"\e[0m"
```

色のサンプルです。背景が黒なので黒文字が見えないですが。。。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/f06fe4c3-3bdd-ebf0-cc22-ba52434c7480.png" width="250px" />

## アクセス中を bundle install形式で表示

`bundle install`するときに表示されるFetchingのような、サイトにアクセスしてデータを取得中という表示をするにはこんな感じです。

```ruby
t = Thread.new do
  print "Fetching gem metadata from https://rubygems.org"
  loop do
    sleep 0.2
    print "."
  end
end

sleep 3 # たとえばアクセスとかの重い処理
t.kill
puts "", "access done!"

```

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/b5b8c144-d949-ea0c-a863-b18b132c3c55.gif" width="600px" />

これは完全に自己満足ですが、まあなんか動いてるんだなくらいに思ってもらえれば。

## ローディング中を npm install形式で表示

`npm install`するときに表示されるローディングのような表示をするにはこんな感じです。

```ruby
t = Thread.new do
  load = ["-", "\\", "|", "/"]
  (1..Float::INFINITY).lazy.map { |n|
    sleep 0.06
    "#{load[n % 4]}\r"
  }.each{ |str| print str }
end

sleep 3 # たとえばアクセスとかの重い処理
t.kill
puts "finish loading!"
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/07c5b05f-994d-3abb-90b4-12954808ac8b.gif" width="600px" />

これも賑やかし程度に使うと吉ですかね。
PhpStormでVagrant上のCLIのPHPをXdebugする

基本は http://www.1x1.jp/blog/2014/08/how-to-setup-php-remote-debug-with-vagrant-vm.html こちらからどうぞ。

大事なポイント = CLI で PHP を実行するとき `XDEBUG_CONFIG` 環境変数が存在しないと Xdebug が動きはじめないことがあります。

VM の `php.ini` には `xdebug.remote_enable` や `xdebug.remote_host` が書いてあって、Webアプリケーションならデバッグできるという状況で、なぜか CLI だとうまくいかないことがあります。`xdebug.remote_autostart=Off` にしておいてブックマークレットでXdebugをON/OFFしながら Web をデバッグしているんじゃないですか? そんなときは `XDEBUG_CONFIG="" php debug.php` と叩いてみましょう。これでデバッグセッションが開始します。

また、うまくデバッグセッションが開始されても、こんどは `PHP_IDE_CONFIG` 環境変数がないと、ホストOSにあるソースとの対応付けができなかったりします。環境変数には `PHP_IDE_CONFIG="serverName=なにか仮想マシンを表す名前"` も必要です。

というわけで、PhpStorm で受話器を上げて、こんな感じで。

```sh
$ export PHP_IDE_CONFIG="serverName=test.vagrant"
$ XDEBUG_CONFIG="" php debug.php
```

もし `php.ini` でいけてる設定とは違うのにしたい、なんだかうまくいかないって感じなら `XDEBUG_CONFIG` をもっと詳細に。

```sh
$ XDEBUG_CONFIG="remote_host=192.168.33.1 remote_enable=1 remote_connect_back=1" php debug.php
```
sinon.jsのstubを使ったajaxテスト

# はじめに
jQueryのajaxを使う関数のUnit testでsinon.jsを使う場合、fakeServerを使うことが多いと思いますが、Stubを使って書く方法をメモ程度に残しておく。

# 書き方
## テスト対象のコード
こんな感じのWeb APIの実行コードを想定する

```javascript
var ajaxTest = {
    getHoge : function() {
        return $.ajax({
            type : 'GET',
            url : 'hoge',
            dataType : 'json',
            contentType : 'application/json; charset=UTF-8'
        });
    }
};
```

## stubを使ってテスト
```javascript
// JsTestDriver + sinon.js
TestCase('ajax test', {
    'testGetHoge' : function() {
        sinon.stub($, 'ajax').returns({
            done : function(cb) {
                cb('hoge');
            }
        });

        ajaxTest.getHoge().done(function(data) {
            assertEquals('hoge', data);
            $.ajax.restore();
        });
    }
});
```

ポイントは `$.ajax` を丸ごとStubで置き換えているところ。
ajaxが返すdone関数をMockしてやります。
一応これでカバレッジは100%になるので、わざわざfakeServerを作る必要はありません。

注意点としては、sinonで作ったstubは他のTest Suiteにも引き継がれてしまうので、ちゃんと `restore()` しておく必要があります。

## ちなみにfakeServerを使うとこんな感じ
```javascript
// JsTestDriver + sinon.js
TestCase('ajax test', sinon.testCase({
    'testGetHoge' : function(server) {
        this.server = sinon.fakeServer.create();

        ajaxTest.getHoge().done(function(data) {
            assertEquals('hoge', data);
        });

        this.server.requests[0].respond(200, {
            'content-type' : 'application/json'
        }, 'hoge');
    }
}));
```

あれ？ fakeServerの方が簡単…？
Pepper開発に向けて、Pythonを理解する。-Pythonボックス自作関数編-


#前書き
PepperやNAOの開発をするにあたって、Pythonの知識は必須といえるでしょう。
そこで、前回に引き続きPythonボックス、特に関数を自作して使うことができるようになることを目標にします。
また、Choreographeを扱う方でpythonをもともと使っていた方とあまり会ったこと無いので、そのような方でもpythonボックスを改良できるように説明を書きたいです。

#開発環境
機種名 : MacBook Pro
OS : Yosemite 10.10.3
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB
Choreographe : 2.3.1

python2.7

#本題
サクッと本題に行きましょう。

##前提
基本的に、プロジェクトは以下のとおりです。

![スクリーンショット 2015-07-17 16.37.53.png](https://qiita-image-store.s3.amazonaws.com/0/35860/7c103dcf-661e-c43d-8098-0fb4b9ba21d9.png "スクリーンショット 2015-07-17 16.37.53.png")

```
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def onInput_onStart(self):
        #アウトプットが必要なので、self.onStopped()を有効にする
        self.onStopped() #activate the output of the box
        #pass #必要ないのでコメントアウト

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box
```

ここからいじり始めていきます。

##関数
###引数なし関数作成
まずは簡単な関数を作ってみます。

```
def testFunc(self):
	pass
```

このような感じでいいかと思います。

>def testFunc(self):

これは、僕の中では引数なし関数と呼んでいます。
self変数はどの関数でも渡される変数なので必ず書きましょう。

>pass

これは空っぽの関数を示すものです。

###引数なし関数呼び出し

```
def onInput_onStart(self):
	self.testFunc() #このように自クラスの◯◯というメソッドという指定の仕方をします。
	self.onStopped() #activate the output of the box
```

###引数あり関数作成
まずは簡単な関数を作ってみます。

```
def testFunc2(self,a,b):
	c=a*b
	self.logger.info(c)
```

このような感じでいいかと思います。

>def testFunc(self):

これは、僕の中では引数なし関数と呼んでいます。
self変数はどの関数でも渡される変数なので必ず書きましょう。

###引数あり関数呼び出し

```
def onInput_onStart(self):
	self.testFunc2(10,20) #このように自クラスの◯◯というメソッドという指定の仕方をします。
	self.onStopped() #activate the output of the box
```

出力結果
>200

#感想
ひとまず、この辺りで終了します。
VirtualBox 上のUbuntuでCythonを試してみた

VirtualBox 上のUbuntuでCythonを試してみた。

$ sudo apt-get install cython

$ cython -V
でバージョンの表示を確認する。

「Cython　Cとの融合によるPythonの高速化」p3にあるCython版のフィボナッチ関数を
fib.pyxとして保存する。

```py:fib.pyx
# -*- coding: utf-8 -*-
def fib(n):
    cdef int i
    cdef double a=0.0, b = 1.0
    for i in range(n):
        a, b = a + b, a
    return a
```

「Cython　Cとの融合によるPythonの高速化」p15にあるsetup.pyをfib.pyxと同じディレクトリに置く。

```py:setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize('fib.pyx'))
```

$ python setup.py build_ext --inplace
を実行する。

Spyder統合環境でIPythonのコンソールを起動する。


in [1]: import fib

in [2]: fib.fib(1)
Out[2]: 1.0

in [3]:fib.fib(90)
Out[3]: 2.880067194370816e+18

in [4]: %timeit fib.fib(90)
10000000 loops, best of 3: 137 ns per loop

in [5]: import fib0

in [6]: %timeit fib0.fib(90)
100000 loops, best of 3: 4.78 µs per loop


この例では、CPU バウンドになっていることが、処理速度の大幅な向上につながっている。
各人の抱えている課題の中で、何がボトルネックになるかを調べて、Cythonを使う・使わない、別の手法を使うことを考えてみるのがよさそうである。

参考資料：
[「Cython　Cとの融合によるPythonの高速化」](https://www.oreilly.co.jp/books/9784873117270/)オライリー・ジャパン


追記：
以下のサイトにはRaspberryPiでCythonを動作させた手順が書いてあります。
「電子工作チュートリアル」1　Cythonをダウンロード
http://lumenbolk.com/?p=1054



付記：
scikit-learnやscikit-imageをソースコードからビルドしなくてはならないときもCythonを自覚することなくビルドの一部として実行することになるでしょう。まあ、そのような必要に迫られことはふつうないでしょう。たいがいの場合、pip installですむはずですから。
TerminalからqicliコマンドでPepperのDialogボックスの認識のしきい値を変更する

PepperのDialogボックスのしきい値の変更方法の備忘録です。
ダイアログが中々認識してくれないとき、しきい値を下げたい場合に有効です。

アプリとは独立してTerminalから、qicliコマンドを実行してダイアログのしきい値を変更する方法を紹介します。

## PepperへSSHで接続

以下でPepper本体にSSHで接続します。ユーザー/デフォルトパスワードは両方`nao`です。

```bash
% ssh nao@192.168.x.xxx
pass: nao
```

## Pepper内でqicliコマンドを実行

`qicli call [apiメソッド]` でAPIを直接実行できます。

[ALDialog API — Aldebaran 2.1.3.3 documentation](http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog-api.html?highlight=aldialog)

* しきい値の値を確認します。

```bash
pepper [0] ~ $ qicli call ALDialog.getASRConfidenceThreshold
ALDialog.getASRConfidenceThreshold: 0.5
```

* しきい値の値を変更します。一説によると0.42くらいがちょうどよいらしいです。

```bash
pepper [0] ~ $ qicli call ALDialog.setASRConfidenceThreshold 0.42
ALDialog.setASRConfidenceThreshold: null
```

* 再度、しきい値の値を確認します。

```bash
pepper [0] ~ $ qicli call ALDialog.getASRConfidenceThreshold
ALDialog.getASRConfidenceThreshold: 0.42
```

ちゃんと設定されていますね。
この方法だと、Pepperアプリを起動中でも、アプリと独立して実行できるので便利ですね。
PowerShellでタスクスケジューラのオプションをセットする

Windowsでタスクスケジューラのタスクを生成するschtasksコマンドだと一部のオプションがセットできなかったので既存タスクのオプションをPowerShell経由でセットするメモです。

ちなみにやりたかったことは「次のネットワーク接続が使用可能な場合のみタスクを開始する」と「スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する」のオプションをONにするというやつです。


```ps1
# タスク設定の取得
$taskSettings = (Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "mytask").Settings

# 条件＞次のネットワーク接続が使用可能な場合のみタスクを開始する
$taskSettings.RunOnlyIfNetworkAvailable = "True"
# 設定＞スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する
$taskSettings.StartWhenAvailable = "True"

# タスク設定を更新
Set-ScheduledTask -TaskName "mytask" -Settings $taskSettings

# 設定値を表示
 (Get-ScheduledTask | where taskpath -eq \ | where TaskName -eq "mytask").Settings | select RunOnlyIfNetworkAvailable, StartWhenAvailable
Write-Host "タスクスケジュラーオプションを設定しました"
```

Get-ScheduledTask/Set-ScheduledTaskはPowerShell3.0(Windows8)以降で使えます。
バージョンチェックを入れたい場合は、こんなかんじのをスクリプトの先頭に入れておけばよいかと。

```ps1
if ($PSVersionTable.PSVersion.Major -lt 3) {
    $PSVersionTable.PSVersion
    Write-Host "PowerShellのバージョンが古いためタスクスケジュラーオプションが設定できません"
    Write-Host "Windows7の場合はタスクスケジュラーオプションを手動で設定して下さい"
    exit 1
}
```

ちなみにWindows7でもやりたい場合はPSK Moduleというのを使えばできるらしい（？）のですが、試してません。

参考
* http://tech.guitarrapc.com/entry/2013/09/03/200909
UIImagePickerController の allowsEditing で正方形クロップする時に画像がズレてしまう問題の原因


`UIImagePickerController`の`allowsEditing`で正方形クロップするときに、クロップ位置がズレて表示されてしまい困っていたら、[こちら](http://rootslash.net/160010/i-want-to-know-why-uiimagepickercontrollers-crop-square-has-a-slight-offset-and-how-to-fix-it)に答えがありました。

![kobito.1437124497.988162.png](https://qiita-image-store.s3.amazonaws.com/0/18569/0a36f923-14bd-a776-e4fb-1455db07b938.png "kobito.1437124497.988162.png")

# UIViewControllerBasedStatusBarAppearance を確認しよう

info.plistなどで `UIViewControllerBasedStatusBarAppearance` を設定しているとこの不具合が発生するようです。

![kobito.1437125114.248594.png](https://qiita-image-store.s3.amazonaws.com/0/18569/1e4c9113-779c-0e6f-8bb7-9fd1d3cc589c.png "kobito.1437125114.248594.png")

この項目を削除したら解決しました。

![kobito.1437125644.082662.png](https://qiita-image-store.s3.amazonaws.com/0/18569/b2f18c94-50af-c856-50e3-4821ba03abe7.png "kobito.1437125644.082662.png")

当然ステータスバー周りの挙動も変化するので、そこは別途修正しましょう。
Unity5からSceneファイルのなかにPrefab情報置かなくなったので

Unity5からSceneファイルのなかにPrefab情報置かなくなったので

1. SceneにPrefab置く
2. Prefabを編集してApply
3. Sceneを保存
4. gitで.prefabをcheckout
5. 再度Scene開きなおす

したらScene内のPrefabの編集内容が吹っ飛ぶという罠にはまりました。
GhostscriptでPDFのカラーモードをCMYKからRGBへ変換する（ただし、不完全）

# GhostscriptでPDFのカラーモードをCMYKからRGBへ変換する

PDFのカラーモードをCMYKからRGBに変更したい。
Acrobatを使えばいいけど、Linuxでやりたい。
そんな時はPDFのインタプリタであるGhostscriptを使う。

- インストール方法

http://ghostscript.com/doc/current/Install.htm

gsコマンドが打てる環境になったら、以下のコマンドで変換ができる。

```
gs -sDEVICE=pdfwrite -sProcessColorModel=DeviceRGB -sColorConversionStrategy=sRGB -sColorConversionStrategyForImages=sRGB -sProcessColorModel=DeviceRGB -o {変換後}.pdf {変換前}.pdf
```

ドキュメントについては以下のリンク参照

http://www.ghostscript.com/doc/9.16/Ps2pdf.htm


このページでは「ps2pdf」というPostscriptファイルからPDFへの変換スクリプトを紹介しているが、gsコマンドでも同様のことができる模様。


## 変換できていないケースも
カラーモードを確認するために、ImageMagickを使う。`identify`コマンドで以下のように調べられる

```
$ identify -verbose 'xxx.pdf[0]'
Base filename: xxx.pdf
Format: PDF (Portable Document Format)
Class: DirectClass
Geometry: 595x842+0+0
Resolution: 72x72
Print size: 8.26389x11.6944
Units: Undefined
Type: TrueColorAlpha
Base type: ColorSeparation
Endianess: Undefined
Colorspace: sRGB <- カラーモード記述
...
```
Colorspaceが sRGBになっていれば変換成功だが、ファイルによってはここがCMYKのままだったりする。日本語の情報が少ないので的を得る情報がなく、トライアンドエラーで色々いじっていたところ、先ほどのgsコマンドに `-dPDFA` というオプションを付けると成功した。
しかし、元々6MB程度のファイル容量だったものが、変換後に30MB近くまで肥大化してしまった。この`-dPDFA`は、PDF/Aという形式に変換するというオプションだが肥大化は避けたい。

形式は変換させず、単純にカラーモードだけ変換させることはGhostscriptでは難しいのかもしれない。
watchOS 2 beta3 + Xcode 7 beta3 でアプリが実機で起動しない件

# 現象

シミュレータではちゃんと動く。
Apple Watchの実機で動かそうとすると、ローディングのぐるぐるが回り続けて立ち上がらない。

# 解決

アプリを削除して入れなおしたり、iPhoneとのペアリングをやり直したりしたけど、うまくいかず。

下記ページで紹介されていたやり方で、とりあえず起動はできるようになりました。
https://forums.developer.apple.com/thread/10332

手順：

1. Xcodeから実機でアプリを実行。Watch上でぐるぐるが出るのを待つ。
2. Watchのアプリを強制終了（本体右の長いボタン長押しして、電源ボタンとか出たら再度長押し）。
3. Xcodeの実行をストップ。
4. Xcode終了。
5. Watch上でアプリをタップしたら、うまくいくはず！
6. ダメなら最初のステップからもう一回。


# おまけ

参考記事ではぐるぐるのことを "loading daisy" って呼んでて少しほっこりした。
ミニマムリリースに関して思うこと

久々に読書の時間が取れてリーンソフトウェア開発の本を読んだので思ったことをたらたらと書きます。

どんなリリースしたって批判的な意見はくるんですよ。
60点やミニマムでリリースすると何がいいかっていうと、批判に「知ってるよそれは後から作るつもりなんだ」で対応できます。
また、指摘分を実際にリリースすれば発言者も「ああ、言えばつけてくれるんだ」っていう信頼になります。

さらにいえば後出しジャンケンが可能なので、リリースの反応の大きさを見て、対応の優先順位を変えることができます。
また、予想外の「ここが足りない」「別にここは使わない」というgoogleアナリティクスやKPIの反応を見て、「見落としていたことに気づかなかったこと」も後日対応タスクに積むことができます。

知らないことを知らないことについては事前に手を打つことができません。
どんなに重厚な計画にも盛り込めないからです。綿密な調査をすればわかるかもしれませんが、粒度がある程度以下になるならリリースしてしまって直接調べたほうが早いです。
そこで後出しジャンケンで対応できることは効いてくるわけです。

逆に９０点で、大きなリリースをすると開発する中の人的には「完璧に作った」という自負があるので大きな批判や振るわない数字を見て心が折れます。
改善しても改善しても追いつかない、あるいは仮説が市場と大きく乖離していたりすると「負け戦」感の強さに心が折れそうになります。

60点リリースやミニマムなリリースの利点は「後出しジャンケン」が可能な点にあります。
ドリルダウンもロールアップもピボットも後出しジャンケンの手の出し方にすぎません。
信頼を失わないのであれば、後出しジャンケンできたほうが圧倒的にプレッシャーも敗北率も小さくなります。
AzureMLで作成したモデルをnode.jsでwebサービス化する

すこぶる簡単。

```js:server.js

var request = require('request');
var apiKey='APIKey';

exports.post = function(req, res){  
  
  /* AzureMLの形式に従う */
  var data =  {
      "Inputs": {
            "input1": {
                  "ColumnNames": [
                                  "hoge",
                                  "hoge",
                                  "hoge",
                                  "hoge",
                                  "hoge"
                  ],
                  "Values": [[
                              req.body.hoge,
                              req.body.hoge,
                              req.body.hoge,
                              req.body.hoge,
                              req.body.hoge,
                  ]],
                  
            }
      },
      "GlobalParameters": {}
  }
  
  var bodyJson = JSON.stringify(data);
  var send = {
      uri: 'URLを入力',
      headers: {
            'Content-Length':bodyJson.length,
            'Content-Type':'application/json',
            'Authorization': ('Bearer ' + apiKey) ,
            'Accept':'application/json'
      },
      body: bodyJson,
  };
    
  request.post(send, function(err,response,body){
      if ( !err && response.statusCode == 200 ) {
            setTimeout(res.render('index', { result: body }),5000);  // 非同期処理で実行されてしまうので、setTimeoutで待ち時間を作っている。(bad parts)
      } else {
            console.log("statusCode: " + response.statusCode);
            return;
      }
  });
};

```

あとは好きなようにする。
センサ入力+オンライン学習なんかもやってみたい。
以上
google/code-prettify で<pre>の中身を動的に変更する


# 概要

REST APIのテストフォームをつくるときなどに、コードをいい感じに色づけしてくれる[google/code-prettify](https://github.com/google/code-prettify)を使うととても見やすくなります。
本記事は、google/code-prettifyのコードスニペットと、つまづいた点のメモです。

# 例
[google/code-prettify](https://github.com/google/code-prettify)のsrcから

* prettify.js
* run_prettify.js
* prettify.css

を取得してください。下記のhtmlをブラウザで開くと動きます。
（jQueryはボタンのクリックイベントに使っています。必須ではありません。）

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Sample</title>
  <script src="lib/jquery-2.1.4.min.js"></script>
  <script src="lib/prettify.js"></script>
  <script src="lib/run_prettify.js"></script>
  <link type="text/css" rel="stylesheet" href="lib/prettify.css">
</head>
<body>

  XML:
  <pre id="code" class="prettyprint lang-xml">&lt;test attr=&quot;hello&quot; /&gt;</pre>
  <button id="get-script">Get</button>

  <script>
  $(document).ready(function() {
    prettyPrint();
    
    // ボタンが押されたら<pre>の中身を変更する
    $('#get-script').on('click', function() {
      $('#code').removeClass('prettyprinted');   // これが必要!!
      $('#code').text('<test attr="world" />');
      prettyPrint();
    });
    
  });
  </script>
</body>
</html>
```

このライブラリは`prettyPrint()`の呼び出しで`<pre class="prettyprint>"`要素のテキストにクラスを付加して色付けしています。したがって、テキストが変更された際には再度`prettyPrint()`の呼び出しが必要になります。

重要なのは、いったん色付けされた`class="prettyprint"`の要素には`prettyprinted`クラスが追加されているという点です。**再度の`prettyPrint()`呼び出しを行う前に、この`prettyprinted`をクラスから削除しておかなければなりません。**

これを行っているのが、コード中の`//これが必要!!`の行となります。
Date, DateTime, Timeで特定の要素を変更する場合


時刻系のオブジェクトで特定の要素の変更、例えば「dayだけ変更したい」となった場合の指定方法が地味にわからなかったので調べた

結論としては、Railsでは`change`メソッドを使えばオッケー

```ruby:example
Date.new(2007, 5, 12).change(day: 1)               # => Date.new(2007, 5, 1)
Date.new(2007, 5, 12).change(year: 2005, month: 1) # => Date.new(2005, 1, 12)
```

メソッドの処理は以下の通り
単純に指定されたオプション利用して新しいオブジェクト返してるだけですね

```ruby:activesupport/lib/active_support/core_ext/date/calculations.rb
def change(options)
  ::Date.new(
    options.fetch(:year, year),
    options.fetch(:month, month),
    options.fetch(:day, day)
  )
end
```
Chef-Serverの環境をKnife-Zeroに移した時のメモ


古くなってきたあるサービスの環境を縮小することにしたので、Chef-Server11配下にあった環境を適当にKnife-Zeroに移した。

[knife-zero](http://higanworks.com/knife-zero/)。


## 準備段階

- 定期実行のChef-Clientを止めた。
    - Cronのやつをリソースのdeleteで。
    - Monit配下のデーモンにしてあるやつは`knife ssh`などで。
- Chef-Clientを最新に更新した。
    - `knife ssh`などで。
    - ※あとの`zero bootstrap`の時点でもやろうと思えばできます。


## リソースオブジェクトのダウンロード

`knife download`でChef-Serverから色々ダウンロード。

- environments, roles, data_bagsとnodesが対象

要はcookbooks以外は全部downloadしただけで使い回しできる。vaultを使ってないところだったので、clients, usersも省きました。


### knife.rbに追記その1

Knife-Zero用に`chef_repo_path`を追記した。

```.chef/knife.rb
chef_repo_path File.expand_path("../../", __FILE__)
```

この状態でもう、knifeに`-z`をつけたり外したりでServerとローカルChef-Repoの切り替えが効きます。


## Cookbookの集約

ファイルベースでChef-Zeroを使うと、Cookbook Versionを複数同時には扱えません。
この環境ではBerkshelfだったので、`berks vendor`で'./berks-cookbooks'に一旦集めました。

Chef-ServerにしかCookbookがない場合などは、一回それをバックエンド指定したBerksAPIを上げるといいかも。


### knife.rbに追記その2

集約したのでcookbook_pathを変更。もうChef-Serverにアップロードしないしね。

```
cookbook_path [ './berks-cookbooks' ]
```

幸いCookbookバージョン指定に関しては、更新前のチェックくらいにしか使ってなかったのと、混在させないように分岐で吸収しておいたので、機能が無くても大丈夫でした。
もし複数バージョンのCookbookを切り替えるならば、専用のBerksfileを用意してcookbook_pathを都度変更しかないかな。

## zero bootstrap (with `--no-converge`) でclient.rbだけ更新

まだノード側のclient.rbは次の状態

- まだChef-Serverを向いている。
- git管理向けのattributeホワイトリストを持ってない。


それらを解消するため、`knife zero bootstrap`を`--no-converge`オプションで実行し、client.rbだけを更新しました。


### knife.rbに追記その3

chef-clientを最新にしたのはホワイトリストのため。bootstrap再実行時には次のような設定を入れました。

```
knife[:automatic_attribute_whitelist] = %w[
fqdn
network
platform_build
virtualization
dmi
domain
ip6address
platform_version
platform
recipes
os
macaddress
chef_packages
hostname
roles
os_version
languages
ipaddress
platform_family
]
```

時間経過とともに変更があるファイルシステムなどのリソースを排除しました。そういうメトリクスはDatadogとかマカレルとかに上げりゃいいしね。

## zero convergeでローカルのnodeオブジェクトを更新

ホワイトリストが適用された状態のnodeオブジェクトにするため、一回convergeしておいた。roleやrun_listも保持されているのでサーバ側には変更もない。
さすがに`-W`のWhy-runで影響を事前に確認したけども、Search依存のレシピもちゃんと反映できて問題なかった。



### knife.rbに追記その4

仕上げにローカルモードをデフォルトへ。

```
local_mode true
```


最後にgitにコミットしておしまい。
GCE 上の docker コンテナ内部から gsutil を使う

概要
====
GoogleComputeEngine (GCE) インスタンスから gsutil などのツールを使うと，metadata サーバから適切に情報を取得してサービスアカウントを用いた認証を自動で行ってくれる．しかし，インスタンス内で走っている docker コンテナから同じことをする場合，boto の設定が必要となる．

設定方法
========
`/etc/boto.cfg` に

```
[GoogleCompute]
service_account = default
```

を追加する．下記は，Dockerfile に記述する場合の例．

```
FROM ubuntu

RUN apt-get update && \
    apt-get install -y libssl-dev python-pip python-dev \
                       libffi-dev python-crypto python-openssl
RUN pip install -U gsutil
RUN echo "[GoogleCompute]\nservice_account = default" >> /etc/boto.cfg
```

参考
====
* [boto - gsutil not working in GCE - Stack Overflow](http://stackoverflow.xluat.com/questions/17620517/gsutil-not-working-in-gce)
GCE スタートアップスクリプトで gsutil を使う

問題
=====
GoogleComputeEngine(GCE) CoreOS では，gsutil などのツールは，google/cloud-sdk という docker イメージ内にあるものを利用している．しかし，これらが使えるようになるのはスタートアップスクリプト終了後になっているため，スタートアップスクリプト内で gsutil などを使うと `command not found` となる．

解決策
======

スタートアップスクリプト内で google/cloud-sdk を pull し，そこに含まれているコマンドを利用する．また，なぜか `gcloud components update` しろと警告が出るので，予めアップデートしておく．

```shell-session
$ docker pull google/cloud-sdk
$ docker run -t --name updating google/cloud-sdk /google-cloud-sdk/bin/gcloud components update -q
$ docker commit updating google/cloud-sdk:latest
```

その後，gsutil コマンドを利用する，

```shell-session
$ docker run -t --rm google/cloud-sdk /google-cloud-sdk/bin/gsutil cat <url> 
```
SalesCubeでフォームから入力した値をDBにインサートする方法

inputPOrderを例に説明する。
まず、View側に、下記のようなフォームを追加する。

inputPOrder.jsp

    <input type="text" name="yamato">

つぎに、InputPOrderForm.java に下記を追加する。

    @Maxlength(maxlength = 120)
    public String yamato;

sqlファイルは下記の内容で作成しておく。 yamato.sql

    insert into yamato (name) values (/*yamato*/NULL)

InputPOrderSlipService.java には、insertRecord メソッドに下記処理を追加する。

	String name = dto.getYamatoName();
	Map<String, Object> prm = super.createSqlParam();
	prm.put("yamato", name);
	this.updateBySqlFile("porder/yamato.sql",prm).execute();

InputPOrderSlipDto.java に下記を定義する。

    public String yamato;

    @Override
    public String getYamatoName() {
        return this.yamato;
    }

POrderSlipDto.java

	public yamato;

AbstractSlipDto.java

    public abstract String getYamatoName();

あとは、発注入力を実施すれば、yamatoテーブルにインサートされる。
HomebrewでRのインストール7/17/2015

brewをインストール後から始めます。
$ brew install gfortran
と打ったらエラーが出たから
Error: No available formula for gfortran 
GNU Fortran is now provided as part of GCC, and can be installed with:
  brew install gcc
フォーミュラを追加します
$  brew tap homebrew/science
それから上に書いてあるようにgccのインストール
$  brew install gcc
このままinstall r としたら
Error: No available formula for r 
とエラーが出たので
$  brew install Caskroom/cask/xquartz
$  brew install r

最後に必要であればRstudioを
$  brew cask install rsudio
プログラマのためのDocker超入門 02.構成管理

![ansible_logo.png](https://qiita-image-store.s3.amazonaws.com/0/66457/a963b2ad-e4ec-2340-d328-a164c5575ddc.png)

まだDockerの話にはなりません・・

## 前提

`インフラ？そんなの仕事じゃないよ？`な方へ向けた記事です。
正確な説明や絶妙な比喩よりも、わかりやすさを優先します。

## 構成管理って

Dockerが注目されている理由やメリットを理解するためには
ここでいったん、仮想化とはちょっと違った視点で
`構成管理`にも触れなければなりません。

構成管理とは、簡潔すぎて微妙な言い方をすれば
`ソフトウェアのインストールと設定を管理すること`
です。

## インストール・設定問題、山積

「ホームページ作って :stuck_out_tongue_closed_eyes: ！」と言われたら `Apache`か`Nginx`あたりをググりましょう。
でも「Ruby使いたい :kissing_smiling_eyes: 」とか「Pythonで書いてね :relaxed: 」と続いたら
そのプログラミング言語やWebフレームワーク[^1]の用意が必要です。

これ、いざやろうとすると悩ましいことばかり。
たとえば

* PHPはどのバージョンを使おう
* そのPHPと相性のいいApacheのバージョンはどれだろう
* データベースには何を使おう、MySQLだとしてバージョンはどれがいいのだろう
* タイムゾーン[^2]や文字セット[^3]はどうやって管理すればいいのだろう

そして、悩んで決めて、インストールがうまくいっても、
将来誰かに引き継いだり、新人さんの環境を作ろうとすると

* インストーラをどこからダウンロードしてきたのかわからない[^4]
* 設定、どれが初期値で何を変更したのかがわからない
* そもそもどうやってインストールしたのか思い出せない
* というか、手順書がない[^5] :cry: 

...。
こんな悲劇を未然に防ぐのが`構成管理ツール`です。

## 構成管理ツール

有名どころは3つ [`Chef`](https://www.chef.io/)、[`Puppet`](https://puppetlabs.com/)、[`Ansible`](http://www.ansible.com/)です[^6]。

いずれも、`あらかじめ定義した`
「いつの」「何を」「どこから」「どうやって」設定するかという`手順に従い`
`ソフトウェアを`いい感じにコンピュータに`インストールしてくれる`優れものです。

もしソフトウェアをどこかにインストールすることになったら
どれかを使ってみるのお勧めします。
なぜなら

* プロジェクトに必要なソフトウェアとそのバージョン、取得先を明示できる
* 設定の何をどう変えたかも含め、すべての定義や作業が`履歴管理`[^7]できる！
* [冪等](http://www.weblio.jp/content/%E5%86%AA%E7%AD%89)という素晴らしい状態が得られる！！・・かもしれない[^8]
* 一度定義が完成すれば、`環境のコピーがワンクリック`並みの手軽さでできる
* 何より人間が作業しないので、人為的なミスが確実にゼロになる！！

からです。

## 一方で、構成管理の難しさ

これすごい！よさげ！！なわけですが
一方で

* インストールしたいコンピュータの`OSによっては動かない`。Windowsとかね
* 同じ定義書を利用しても、隣の人とまったく同じ環境になる保証がない[^9]
* ひとつのプロジェクトで、複数バージョンのソフトウェア[^10]を同時に使うのは依然困難
* そもそもプロジェクトごとに定義書作るのはやっぱり大変[^11]

だったりはします。

難しいところはあり、万能ではないと把握しつつも
やはり強力なツールであることは間違いありません。
そこで、前回お話しした仮想化を組み合わせてみましょう。

## 構成管理を知った上で仮想化再び

さて前回の[01.仮想化](/pottava/items/7086f9d63487aa3d7d08)では、仮想化いいよねー :laughing: が結論でした。

しかし実は、開発環境を仮想化するにあたっては
この構成管理ツールを併用することで、もっと便利なことが起こります。

構成管理ツールを使って、アプリ開発に必要な環境を作ることを
`プロビジョニング`と言いますが、Vagrantは Chefや Puppetなどを
プロビジョニングツールとしてサポートしています。

ターミナルから

```bash
$ vagrant up
```

と仮想環境を起動するように命令するだけで
内部で構成管理ツールが動き、Macでも Windowsでも
誰がやっても同じような環境を作ることができるのです。

## 本番サーバのセットアップ

同様に
あなたの作ったサービスを稼働させる本番用のサーバでも
（Vagrantは使いませんが）構成管理ツールでプロビジョニングすれば
期待通りのソフトウェアがインストールされ、設定されるのです。
これは画期的ですね！！

インフラ業界でいう `Infrastructure as Code` の始まりです :chicken: :baby_chick: 

プロビジョニングに冪等性があり、
環境が正しくセットアップされたことたしかめるテストも
ソースコードで自動化[^12]されたのなら時代は 2014年。かなり今っぽい！

## 今回のまとめ

開発環境のセットアップを Wikiや Excelに手順書としてまとめるのは止め、
仮想環境＋構成管理ツールの手法に変えてみませんか？
Windowsでももちろん可能です。

しかも今や、インフラもプログラマブルな時代です。
スキルを生かして便利な仕事環境を作りましょう！

Docker入門なのに、Dockerに今回も至らずすいません・・

[03.クラウド](/pottava/items/3d75477b467d93de8784)へ
　
[^1]: Webサーバをかんたんに作るためのライブラリ・ソースコード集
[^2]: 日本で動かすサービスならAsia/Tokyo一択ですけどね
[^3]: 文字セットはUnicodeとしても、エンコーディングはDBまわりが意外とアレ
[^4]: どこのリポジトリを使ったのかわからない、とも
[^5]: もしくは「どのExcelが最新ですか？」問題
[^6]: 私はAnsibleに落ち着きました
[^7]: バージョン管理。GitやSubversionがない世界にはもうもどれませんね
[^8]: 冪等になれば幸せですが、ちゃんと作るのはけっこう大変
[^9]: 実行前のコンピュータの状態やインストールされる細かいバージョン差異など・・
[^10]: 異なるバージョンの依存ライブラリ、というケースの方が多いか
[^11]: git管理上横展開されたファイル・・コピペ職人とメンテナの戦い・・
[^12]: [Serverspec](http://serverspec.org/)などを使います
プログラマのためのDocker超入門 01.仮想化

![vagrant_logo.png](https://qiita-image-store.s3.amazonaws.com/0/66457/cd1e4b83-e75d-5c71-687e-ae58f5254011.png)

今回はVagrantのメリットまでですが・・

## この連載のゴール

連載の最後まで読んでいただくと Dockerとは何か、どんなメリットがあるのか
より理想的な開発環境とはどんなものか、テスト環境や本番環境への影響は？
といったことがわかるようになります。おそらく。


## 前提

サーバーを自分でセットアップしたことのない方、ようこそ！
そして黒い画面[^1]に不慣れな方、ようこそ！
以下、`インフラ？そんなの仕事じゃないよ？`な方に向けた記事です。
正確な説明や絶妙な比喩よりも、わかりやすさを優先します。


## ケース: 開発環境セットアップ

突然ですが、
「会社のホームページ作ってよ :wink: 」と頼まれたらどうしますか？

もちろん HTMLを書けばいいんですが、同時にブラウザで確認もしたい。
Windowsなら XAMPP、Macなら MAMPをインストールするかもしれません。
ですが

「新製品のホームページは会員ページもほしいから Node.jsで！
　あ、ついでに前任者が Rubyで作ったこのサイトも引き継いで :two_hearts: ！！
　でも速いらしいし、Go言語で作り直したサイトも見てみたいなあ :stuck_out_tongue_closed_eyes: 」

となってくると・・つらい・・。

それぞれが依存するプログラミング言語やライブラリが氾濫、
`唯一の設定ファイル`に書き込まれる複数プロジェクトの設定値・・
そしてプロジェクトごとに使いたい Javaや MySQLのバージョンが違う・・・


## 仮想化

そんな折、`開発環境を仮想化する`という魔法が生み出されました。
プロジェクトごとに、`お互い隔離された開発環境`を作ればいいじゃん！という。

以前から
Macの中で Windowsを起動したり、Windows上に Android端末を再現したり
時代を遡れば Windows上でスーパーファミコンを(ry
という天才たちがいましたが、その思想を受け継いだ[^2]のが仮想化・・

仮想化とは、英語ならバーチャライゼーション、バーチャルにすること。

つまり`実態を隠して見かけを変えること`ですが、上の例でいえば
物理的には Macだけれど、使ってみると Macでも Windowsでもある状態のこと。
この仮想化を`開発環境にも適用してみよう`というのが`一般的になった`のが数年前です。


## Docker前夜: Vagrant + VirtualBox

火付け役は `Vagrant`と`VirtualBox`というソフトウェアたちでした。

これらについては
Qiitaにたくさんの導入記事があるので
仮想化未経験で興味がある方はぜひ、チャレンジしてみてください。

実際、Dockerじゃなくても、開発環境を仮想化すれば大きなメリットがあります。

* 各プロジェクトが使う言語、バージョン、ライブラリが明確になる
* それぞれのプロジェクトが隔離され、影響範囲が限定的になる
* [HTTPサーバ]のように同じ[ポート]を使うプロジェクトでも複数同時に起動できる
* ホスト[^3]に複数バージョン入れにくいミドルウェア[^4]でも複数バージョン同時起動ができる
* 「俺の環境では動く」がかなり軽減される[^5]


## 今回のまとめ

Webサイトやアプリを作る開発者としても
仮想化技術やその周辺ツールをうまく使えば
より便利で柔軟な開発環境を手にすることができます。

ぜひ今後のためにも
Vagrantと VirtualBoxはインストールしておきましょう！

[02.構成管理](/pottava/items/5b386a952bf1d26ea387)へ
　
[^1]: ターミナル。最近の背景色はデフォルトだと白いかも？
[^2]: かどうかはわかりませんが、たぶん受け継いでいません。
[^3]: Macや Windowsなど、物理的にあなたの目の前にあるコンピュータのこと。
[^4]: MySQLなど、自分が作るアプリケーションの動作に必要となるソフトウェア。
[^5]: Vagrantと Chefなどを併用すれば、誰でも`ほぼ`同じ環境が作れます
【C,C++】printf書式指定子メモ

printfの時、%d %s 以外ほぼ忘れてる
こちらのページを参考にメモ
http://itsd210.s24.xrea.com/ja/ansi-c/#printf
http://wisdom.sakura.ne.jp/programming/c/c57.html
http://www.c-tipsref.com/reference/stdio/printf.html

```
%c 文字　　　　　 char
%s 文字列　　　　 char*
%i 符号つき8進数  int
%d 符号つき10進数 int
%h 符号つき10進数 short
%u 符号なし10進数 unsigned int unsigned short
%o 符号なし8進数  unsigned int
%ld 符号つき10進数 long
%lu 符号なし10進数 unsigned long
%f  倍精度浮動小数点　  double
%L  ４倍精度浮動小数点  Long double
```
URLの作り方


swiftでURLを作る方法は色々方法あるけど、GetQueryの追記が楽なのと、長いメソッド打たなくていい感じで、これはいいなぁと思った方法。

```swift
func url () -> NSURL? {
  if let components = NSURLComponents(string:"http://example.com/") {
    components.queryItems = [
    	NSURLQueryItem(name:"test", value:"日本語"),
    	NSURLQueryItem(name:"abc", value:"def")
    ]
    return components.URL
  }
  return nil
}

...

NSLog( url() )
// => "Optional(http://example.com/?test=%E6%97%A5%E6%9C%AC%E8%AA%9E&abc=def)"
```

see: http://stackoverflow.com/questions/28775765/error-exc-bad-instruction-while-running-swift-code-with-nsurl
mongooseでSchema定義してないpropertyに値をセットする

mongooseを利用していると通常Schema定義外の値をSchemaのDocumentオブジェクトにセットすることはできないが、 `{ strict: false }` すればできるよう


```javascript
var somethingSchema = new Schema({
  field: String
});
var Something = mongoose.model('Something', somethingSchema);

var something = new Something();

something.not_defined_field = 'Not defined field value';
something('not_defined_field'); // -> undefined
something.not_defined_field; // -> undefined


something.set('not_defined_field', 'Not defined field value', { strict: false });
something('not_defined_field'); // -> 'Not defined field value'
something.not_defined_field; // -> undefined

```

でドキュメントみてたらSchemaに `{ strict: false }` すればDocument全体に適用できるっぽい
http://mongoosejs.com/docs/guide.html#strict
[C++] Some useful method or tips in c++ (updating)

* Initialize a two dimension vector with some value

```cpp
vector<vector<int>> dp(n, vector<int>(m, 2));
```

* Get next iterator

```cpp
//std::set<int>::iterator it;
std::next(it, 1)
```

* Initialize any value for array/vector

```cpp
//Fill a array with value
//int a[10]
fill(a, a + 10, 10);
//vector<int> b;
fill(b.begin(), b.end(), 10);
```
* Get the max/min element

```cpp
//Find the min/max value in array
*min_element(a, a + 7);
*max_element(a, a + 7);
```
* Lower bound in set

```cpp
//Find the value not less/greater than x in set(Ologn)
//std::set s;
s.lower_bound(x);
s.upper_bound(x);
```
* Sum

```cpp
//Sum values between i and j
accumulate(a, a+10, 0)
```
* Lower bound in vector/array

```cpp
//Find the value not less/greater than x in array/vector
upper_bound(a, a + 10, 5)
lower_bound(a, a + 10, 7)
```
* Array copy

```cpp
//Copy an array to another array
//int a[10], b[10]
copy(a, a + 10, b)
```

* Substring

```cpp
//sub string
s.substr(0, 10) // start position, length
```

* Reverse string

```cpp
//reverse string or vector
//string s;
reverse(s.begin(), s.end());
```

* Sort in descending order

```cpp
//sort in descending order of vector
//vector<int> a;
sort(a.begin(), a.end(), greater<int>());

//priority queue in increasing order.
priority_queue<int, vector<int>, greater<int> > q;
```
HAProxy - reloadコマンド  

HAProxyの設定を変更したあとreloadするコマンドのメモ
新しいプロセスが生成されて、新規コネクションは新しいプロセスで受け付ける
古いプロセスはそれまでのコネクションがすべて切断されたタイミングで終了する
### HAProxyのreloadコマンド
```
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
```
※設定ファイル・PIDファイルは適宜変更