OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのログをrsyslogでデスクトップに転送する


開発マシン側にPHPがあり、PHPを実行するサーバがCentOSなどrsyslogが入っている環境を想定します。
開発時のみです。

# 1. デスクトップ側でログ受信サーバを立てる

514/UDPで受け取った文字列をそのまま吐き出せばいいので
こんな感じのスクリプトを用意してコンソールなりコマンドプロンプトなりで呼び出すだけです。

```php:receive.php
<?php
$socket = stream_socket_server("udp://0.0.0.0:514", $errno, $errstr, STREAM_SERVER_BIND);
while(1) echo stream_socket_recvfrom($socket, 2048, 0, $peer), "\n";
```

ログ中の改行コードが「#012」などにエスケープされたりするため細々整形する余地はあります。

# 2. rsyslogからデスクトップ側のサーバに送る設定

こんな感じで作業しているデスクトップ側のIPアドレスを指定したファイルを作ります。

```:/etc/rsyslog.d/php.conf
user.info @192.168.1.100
user.info ~
```

Docker Desktopでホスト側を指定したい時はIPアドレスでなく `@host.docker.internal` が使えます。
`/var/log/messages` にも同じ内容が出てしまわないよう2行目で出さないようにしています。
`rsyslog.d`ディレクトリが無ければ `/etc/rsyslog.conf` で `/var/log/messages` に出力してる設定より前に書きます。

そして `service rsyslog restart`

# 3. テスト

```
$ php -derror_log=syslog -r 'syntaxerror'
```

これでParse errorが飛んでくれば上手く動いています。
![receiver.png](https://qiita-image-store.s3.amazonaws.com/0/67857/b1bcd2ff-c8a8-51c9-eaa1-f3265ea2a135.png)
実際の `error_log` の設定は `php.d/`、`.htaccess`、`.user.ini`、`ini_set()` など都合の良い場所で行います。

# 使い所

* エラーログだけでも使えますがprintデバッグ的に `error_log(var_export($var,1))` なども便利です。  
（例えばjsonなどを返しておりvar_dump()できない状況など）
* `error_log()`を介しているため大抵のフレームワークや既存コードに干渉されず使えると思います。
* サーバにログインしてシェルで `tail -f /var/log/php/error.log` でも大体一緒ですが、一旦ログに書きだされたりログインするのが気に食わない場合に。
* ログ送信側サーバは複数あっても大丈夫なはずです。
* PHPに限らずLog4JのUDPAppenderの受信用にも使えるかも知れません。
* rの付かないsyslogでもそこそこ動きました。
TransmitMailの件名に入力内容を埋め込む

# Transmit Mail の 非公式な編集です

　TransmitMailがすごくいいので個人のWEBサイトの制作でよく使わせていただくんですが、今回**件名に入力内容を埋め込む**必要があったのでメモしてみました(色々ハマってみました)。

※ 非公式な修正です。フォームなので注意して下さい。
※ 私はPHPは全くわかりません。

## TransmitMailとは

dounokounoさん作成のCopyright表示不要のPHP製汎用メールフォームシステムです。
github: https://github.com/dounokouno/TransmitMail

## 編集するファイル

input.htmlとconf/config.phpの2ファイルになります。
今回は、ラジオボタンで選択した問い合わせ内容がメールの件名に入るという内容で記載します。

### input.html

フォームパーツの部分を該当箇所のみ抜粋します。

```input.html
<tr class="form">
  <th class="form">お問い合せの種類<span class="notice">*<span></th>
  <td>
    <input class="form" type="radio" name="お問い合わせの種類" value="項目1" id="radio1" {$checked.お問い合わせの種類.項目1} {$checked.default} />
    <label for="radio1">項目1</label><br >
    <input class="form" type="radio" name="お問い合わせの種類" value="項目2" id="radio2" {$checked.お問い合わせの種類.項目2} />
    <label for="radio2">項目2</label><br >
    <input class="form" type="radio" name="お問い合わせの種類" value="項目3" id="radio3" {$checked.お問い合わせの種類.項目3} />
    <label for="radio3">項目3</label><br >
  </td>
</tr>
```

このような感じ。

### config.php

25行目くらいの件名の設定のところを以下の様子で編集します。

```config.php
require_once('lib/common.php');
$_POST = delete_nullbyte($_POST);
$_POST = safe_strip_slashes($_POST);
define('TO_SUBJECT', '［テスト株式会社］お問い合わせ - ' . $_POST['お問い合わせの種類']);
```

## 説明

$_POST がフォームで記入された文字列を抱え込んでいるようなので、おそらくこの連想配列と思われるデータ群の中から欲しい文字列のキーを指定してあげると取得できるご様子です。

キーはinput.htmlにある一連にパーツのなかで、inputタグのname属性となっています。

あとはconfig.phpのdefineでTO_SUBJECTという定数が指定されているところに、作成したい件名と文字列を 連結してあげれば完了です。

## 最後に

Transmit Mailの作者さんであるdounokounoさんありがとうございます。
いつも便利に使わせて頂いております。
Objective-Cで書かれたソースをSwiftで使うための手順


SDImageを使いたかったので軽く調べました。
これから何回も使うかもしれないので自分用にメモ

##手順1：Bridge用のHeaderFileを作る##
普通にSwiftのProjectにObjective-Cのファイルを突っ込めば勝手に作ってくれます。この時に以下の画像でいうSampleとSampleTest両方をTargetにするとHeaderファイルが2個できて邪魔なのでTargetは片方で後述のBuildSettingsのところでいじればいいと思います。
![Bridging-HeaderSample1.png](https://qiita-image-store.s3.amazonaws.com/0/46913/a5c93cbb-7471-c2b0-be1c-53ee47168e33.png "Sample1")

##手順2：BuildSettingsをいじる##

###__手順1で自動でファイルを作ってもらった場合は手順2はスキップできます__###

HeaderFileができたら次はBuildSettingsでBridge用のHeaderのパスを指定します。
場所は
__Build Settings>Swift Compiler - Code Generating>Objective-C Bridging Header__
です。
そこに作成したHeaderFileのパスを入力します。
![Bridging-HeaderSample2.png](https://qiita-image-store.s3.amazonaws.com/0/46913/0f3d71f6-f718-8a7b-4506-cc43300df38b.png "Sample2")

##手順3：Bridging-Headerに使いたいObjective-Cのソースをインポートする##

最後にHeaderFileにSwiftで使いたいObjective-Cのソースが書かれたファイルのHeaderを以下のような感じでimportすれば完成です。

```objective-C:Sample-Bridging-Header.h
#ifndef Twitter_Twitter_Bridging_Header_h
#define Twitter_Twitter_Bridging_Header_h

#import "Sample.h"

#endif
```

##疑問##

参考にしたサイトでは
__Packaging > Defines Module > Yes__に設定
とあったが、別にYesにしなくても動きました。
どちらにするのがより正しいのでしょうか？


##参考##
SwiftにObjective-Cのコードをimportする(http://takerpg.hatenablog.jp/entry/2014/12/02/223702)
SwiftでNSDateから文字列に変換（曜日あり）する

SwiftでNSDateから文字列に変換してみました。
最初は、StringからNSDateを用意してみました。

* StringからNSDate
* NSDateからString

という流れになります。
ついでに、曜日を出すようにしてみました

# 実行環境

* Xcode6

# 実際のSwiftでNSDateから文字列に変換するソース

```swift
import UIKit


// 文字列 から NSDate
var date_string: String  = "1996-3-15 10:11:00"
var date_formatter: NSDateFormatter = NSDateFormatter()
date_formatter.locale     = NSLocale(localeIdentifier: "ja")
date_formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
var change_date:NSDate = date_formatter.dateFromString(date_string)!

date_formatter.stringFromDate(change_date)   // NSDateに変換される

// NSDateから文字列に変換（曜日あり）

let weekdays: Array  = [nil, "日", "月", "火", "水", "木", "金", "土"]
let calender: NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
let comps: NSDateComponents = calender.components(NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit|NSCalendarUnit.SecondCalendarUnit|NSCalendarUnit.WeekdayCalendarUnit, fromDate: change_date)

println("年 \(comps.year)")
println("月 \(comps.month)")
println("日 \(comps.day)")
println("時 \(comps.hour)")
println("分 \(comps.minute)")
println("秒 \(comps.second)")
println("曜 \(weekdays[comps.weekday])")

date_formatter.dateFormat = "yyyy年MM月dd日（\(weekdays[comps.weekday])） HH時mm分ss秒"
println(date_formatter.stringFromDate(change_date))

```
[iOS] UIWebViewでロードしたHTMLについて、iframeのsrcにパラメータを追加する

# どういう時に使う？
* ローカルに置いた HTMLファイルなどをUIWebViewで表示する際に、そのHTML中のiframeバナーを、言語やアプリのステータスによって変えたい

# 方法
* ロードするURLにパラメータを付ける

```Objective-C:Sample.m
// この例では、アプリ内のmain.htmlをロードする
NSString* _path = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"html"];
_path	= [_path stringByAppendingString:@"?lang=ja"];
NSURLRequest* _request = [NSURLRequest requestWithURL:[NSURL URLWithString:_path]];
[self._webView loadRequest:_request];
```

* HTML側で、URLのパラメータを、iframeのsrcに追加する

```main.html
<script type="text/javascript">
document.addEventListener( 'DOMContentLoaded', function() {
	var search = window.location.search;
	[].forEach.call(document.getElementsByTagName("iframe"),function(x){ x.src = x.src+search; });
});
</script>
```
SpringのDIとAOPの簡潔な説明


# 前提
- 本記事は「Spring3 入門」（通称：緑本）を参考にしました
- Spring：Java言語のフレームワーク
- Springの肝はDIとAOP

# 【DI】（Dependency Injection）
## 〜概要〜
日本語訳すると「依存性の注入」です。
SpringのDIコンテナの利点は大きく2つあります。それは、

- クラスからnew演算子を消せる
- インスタンス化を1回で済ませられる（Singleton）

です。

## 〜実装〜
実現する方法は2通りあります。

- アノテーションを使う
- Bean定義ファイルを使う

です。

アノテーションベースの方のみ説明書きます。

インスタンス変数（注入先の変数）の前に@Autowiredをつけると、@Componentアノテーションのついたクラスの中から該当するものを探し、newしてインスタンスを突っ込んでくれます！

▼（実装例）

```ProductController.java
（パッケージ名やimport文は省略）
@Controller
public class ProductController {
    @Autowired
    private ProductService productService;

    （メソッドなど）
}
```

```ProductService.java
@Service
public class ProductService {
    （略）
}
```

- @Componentアノテーションは、そのまま使うことはほとんどなく、レイヤに応じて@Controller or @Service or @Repositoryを使います。
- productServiceというインスタンスには、@Component（Controller, Service, Repository）が付いているクラスの中からProductServiceクラスを探し出し、newしてインスタンスを突っ込んでくれます。

# 【AOP】（Aspect Oriented Programming）
## 〜概要〜
日本語訳すると「アスペクト指向プログラミング」です。
これは、オブジェクト指向に代わるものではなく、併用されるものです。

クラスには「本質的な処理」のみ記述し、「本質的ではない余計な処理（共通化出来る処理）」をアスペクトに記述します。
アスペクトには

- Advice（振る舞い）
- Pointcut（振る舞いを適用する条件）

があります。
Pointcut（条件）を満たすメソッドに対し、Advice（共通処理）を走らせることで、各クラスには本質的な処理だけを記述することが可能となるわけです。

## 〜実装〜
アスペクトを記述するクラスには@Aspectアノテーションを付けます。
アスペクトの条件と処理を書くメソッドには@Aroundなどのアノテーションを付けます。
（@Before、@After、@Around、@AfterThrowingがあるが、全て@Aroundのみで表現可能です）

▼（実装例）

```ControllerAspect.java
@Aspect
public class ControllerAspect {
    @Around("execution(* findProduct(**))")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        （前処理）
        Object obj = point.proceed();
        （後処理）
        return obj;
    }
}
```
```ProductController.java
@Controller
public class ProductController {
    @Autowired
    private ProductService productService;

    public Product findProduct() {
        （処理）
    }
}
```

- @Around("execution(* findProduct(**))")のexecutionの中のカッコに、アスペクト処理を走らせる条件（Pointcut）を記述します。
- @Aroundアノテーションを付けたメソッドには、
  - 「ProceedingJoinPoint」クラスの引数を必ず入れる
  - 必ずproceedメソッドを記述する
- proceedメソッドを実行した時に、AOPの対象となっているメソッドが呼び出されます。
CentOS 6.6にlinuxbrewでnginxをインストールしようとして立ちはだかった壁

まずは手始めに
`brew install nginx`

```lang:shell
[vagrant@localhost ~]$ brew install nginx
==> Installing dependencies for nginx: pcre, makedepend, openssl
==> Installing nginx dependency: pcre
==> Downloading https://downloads.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.bz2
Already downloaded: /home/vagrant/.cache/Homebrew/pcre-8.36.tar.bz2
==> Patching
==> ./configure --prefix=/home/vagrant/.linuxbrew/Cellar/pcre/8.36 --enable-utf8 --enable-pcre8 --enab
checking whether pthreads work with -pthread... yes
checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE
checking if more special flags are required for pthreads... no
checking for PTHREAD_PRIO_INHERIT... no
** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found

READ THIS: https://github.com/Homebrew/linuxbrew/blob/master/share/doc/homebrew/Troubleshooting.md#troubleshooting
```

やれやれ。`** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found`か。

僕は`yum -y install bzip2-devel`をした。

```lang:shell
[vagrant@localhost ~]$ brew install nginx
==> Installing dependencies for nginx: pcre, makedepend, openssl
==> Installing nginx dependency: pcre
==> Downloading https://downloads.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.bz2
Already downloaded: /home/vagrant/.cache/Homebrew/pcre-8.36.tar.bz2
==> Patching
==> ./configure --prefix=/home/vagrant/.linuxbrew/Cellar/pcre/8.36 --enable-utf8 --enable-pcre8 --enab
==> make
==> make test
==> make install
/home/vagrant/.linuxbrew/Cellar/pcre/8.36: 146 files, 5.6M, built in 61 seconds
==> Installing nginx dependency: makedepend
Error: /home/vagrant/.linuxbrew/opt/pkg-config not present or broken
Please reinstall pkg-config. Sorry :(
```
やれやれ。`Error: /home/vagrant/.linuxbrew/opt/pkg-config not present or broken`か。

僕は `brew install pkg-config`をした。
次に`brew install nginx`を繰り返したとき、僕は目を疑った。インストールが完了していたのだ。
boot2dockerで初心者がつまずいたこと（マウント関係とか）

Windowsでもお手軽にdockerするならboot2dockerということで（Macもそうだけど）、開発環境整えるのにハマったポイントを書くという、ありふれたごくつまらない話です。

# ホスト⇔ゲスト の共有ディレクトリのこと

boot2docker 初回起動 up すると、だいたい共有ディレクトリがWindowsなら`/c/Users/`、Macなら`/User/`がホスト⇔ゲストでマウントされるんですが、マウントしているということそのものを頭においておかないといけなかった。

ちなみにboot2docker-vmのルート直下に、`/c/Users/`, `/User/`があり、初回起動時にすでにあると思う。

# boot2docker-vm内でホスト側とマウントしたディレクトリは権限が変えられない

これはそういうものだというしかないです（マウントしたら当たり前だとか言われそうだけど、知らなかった）。それはコンテナのマウントオプション（これは（ホスト＝）ゲストのホストとの共有ディレクトリ＝コンテナのマウント！）を指定してコンテナを起動したコンテナ内での権限も同様です。

```bash
$ docker run -d -p 80:80 \
  -v /c/Users/yourname/projects/repo/html:/var/www/html \ # マウントオプションでホストとの共有ディレクトリを指定
  --name apache darekano/apache
$ docker exec -it apache bash # コンテナの中に入る
root@7eaf997110d8:/# cd /var/www/html # くどいけど、コンテナの中のここはホスト＝ゲストの共有ディレクトリ
root@7eaf997110d8:/var/www/html# ls -al
total 2
drwxrwxrwx 1 1000 staff   4096 Feb  1 13:29 .
drwxr-xr-x 4 root root    4096 Feb  1 13:28 ..
-rwxrwxrwx 1 1000 staff   5667 Nov  5 09:08 .htaccess
-rwxrwxrwx 1 1000 staff   2642 Nov  5 09:06 index.html # ownerがこのようになってる
root@7eaf997110d8:/var/www/html# chown -R www-data /var/www/html # としたところで
root@7eaf997110d8:/var/www/html#  ls -al
drwxrwxrwx 1 1000 staff   4096 Feb  1 13:29 .
drwxr-xr-x 4 root root    4096 Feb  1 13:28 ..
-rwxrwxrwx 1 1000 staff   5667 Nov  5 09:08 .htaccess # 変わらない
```

なので、 boot2docker でホスト側で共有ディレクトリにしたところにdockerでマウントさせる時は、`chown`, `chmod` の類の権限は諦めましょう。（ということなのだろうか）

例えば、Dockerfile内に、

```
RUN chmod -R www-data /var/www/html
```

と書いてあったとしても結果的にはそうならない。docker logs にどう残るかまでは見てないんだけど。

## docker run -v のマウントするディレクトリは存在してはいけない

さっきと同じのコピペです

```
$ docker run -d -p 80:80 \
  -v /c/Users/yourname/projects/repo/html:/var/www/html \ # マウントオプションでホストとの共有ディレクトリを指定
  --name apache darekano/apache
```

この時、/c/Users/yourname/projects/repo/html/ は存在してはいけない。これ、基本的なことなんだろうけど、小1時間それではまってたので。

https://docs.docker.com/userguide/dockervolumes/

---

本日は以上です。
MySQL 日時ごとの集計まとめ

## 月別、日別、時間別にレコード数を集計
#### 一月毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m') AS time, COUNT(*) AS count FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m');`

#### 一日毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m-%d') AS time, COUNT(*) AS count FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m%d');`

#### 一時間毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m-%d %H:00:00') AS time, COUNT(*) AS count FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m%d%H');`

#### 30分毎
`mysql> SELECT FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800, 0) * 1800) AS time, COUNT(*) AS count FROM テーブル名 GROUP BY TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800, 0);`


## 月別、日別、時間別にカラムの値の合計値を集計
#### 一月毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m') AS time, SUM(合計値を求めるカラム) AS sum FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m');`

#### 一日毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m-%d') AS time, SUM(合計値を求めるカラム) AS sum FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m%d');`

#### 一時間毎
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m-%d %H:00:00') AS time, SUM(合計値を求めるカラム) AS sum FROM テーブル名 GROUP BY DATE_FORMAT(カラム１, '%Y%m%d%H');`

#### 30分毎
`mysql> SELECT FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800, 0) * 1800) AS time, SUM(合計値を求めるカラム) FROM テーブル名 GROUP BY TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800, 0);`


## 日付範囲指定でデータ集計
#### 現在日時の現在の日付～1週間前までの集計（1日ごとのデータ集計）
`mysql> SELECT DATE_FORMAT(カラム１, '%Y-%m-%d') AS time, SUM(合計値を求めるカラム) AS sum FROM テーブル名 WHERE カラム１ BETWEEN DATE_SUB(curdate(), interval 7 day) AND DATE_ADD(curdate(), interval 0 day) GROUP BY DATE_FORMAT(カラム１, '%Y%m%d');`

#### 現在日時の現在の日付～1週間前までの集計（30分ごとのデータ集計）
`mysql> SELECT FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800, 0) * 1800) AS time, SUM(合計値を求めるカラム) AS sum FROM テーブル名 WHERE カラム１ BETWEEN DATE_SUB(curdate(), interval 7 day) AND DATE_ADD(curdate(), interval 0 day) GROUP BY TRUNCATE(UNIX_TIMESTAMP(カラム１) / 1800,0);`
OSX: Terminalを新規に開いてssh_config のサーバーにssh接続する


Ansibleというよりoascriptコマンドの話

# Ansible 設定
wzyというVirtualBoxにhkdnrで接続する環境。
Ansibleにssh_configを参照するように設定。
ssh_configは vagrant ssh-configで作って編集するとか。

- ansible.cfg

~~~
[ssh_connection]
ssh_args = -F ssh.conf

[defaults]
hostfile = hosts
~~~

- ssh.conf

~~~
Host default 
  HostName wzy
  User hdknr
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/id_rsa 
  IdentitiesOnly yes
  LogLevel FATAL
~~~

- hosts

~~~
[server]
default
~~~

# Termnalを開いてssh

-  oascript で AppleScript 経由でTerminalを開くbashの関数

~~~
function ANSIBLE_OPEN_SSH()
{
  PARAMS="$@"; [ -n "$PARAMS" ] || PARAMS="default";
  if [ -f ssh.conf ]; then
    SCRIPT="cd $PWD;ssh -F ssh.conf $PARAMS"; 
    AS="osascript -e 'tell application \"Terminal\" to do script \"$SCRIPT\"'";
    eval $AS;
  fi
}
~~~
bindkey -v でも(ある程度) emacs したい!


.zshrcに追記する設定

```zsh:.zshrc

bindkey -v
# vim bind normalmode extends emacskey
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
bindkey "^U" backward-kill-line
bindkey "^F" forward-char
bindkey "^B" backward-char
bindkey "^A" beginning-of-line
bindkey "^E" end-of-line
```

とりあえず基本的によく使うものだけ

少し使ってみて,
補完時のフォーカス移動にfbnpが使えなくなるのがすごい不便であることに気づいたのでアドバイスがほしいです
enum を使わず列挙モドキを実現する

以下のような変数定義をスマートにできないものかと、少し考えたのでメモまで。
「もっといい方法があるぜ」という方いたらコメントください。

```py
STYLE_RED = 1
STYLE_BLUE = 2
STYLE_GREEN = 3
STYLE_YELLOW = 4
 :
```

「enum 使えよ」って話なんだけど、Python2.7系では標準ではenumは使えないので、なんとか小技を効かせて実現したい。
(Python2.7系向けに、enum34なるenum機能のバックポートも提供されている)

### ポイント

こうした変数定義は、開発中に追加や削除を繰り返すことが多く、特に定義済みの変数の間に新しい定義を追加する場合に、後段の値もすべてずらさなければならないことが多々ある。

```py
STYLE_RED = 1
SYTLE_BLACK = 2  # どうしてもここに 2 として追加したい
STYLE_BLUE = 3   # 後段の値をずらす
STYLE_GREEN = 4  # これも..
STYLE_YELLOW = 5 # これも...
 :
```

こうした追加/削除をサクッと行えるかどうかがポイント。


### タプルを使う方法

こんな感じ。

```py
(
    RED,
    BLUE,
    GREEN,
    YELLOW,
) = range(0, 4)

print 'Color RED: %d' % RED

```

個々に値を指定していないので、変数の追加でいちいちずらす必要はないが、`range()` 関数の第二引数も同時に変更する必要がある。

```py
(
    RED,
    BLACK,  # 追加
    BLUE,
    GREEN,
    YELLOW,
) = range(0, 5)  # 4->5 に変更
```

タプルを使うことで、不変変数にもなるので、用途によっては非常に有用。
見た目もenum風だし、名前付きにすることで逐次処理を行うこともできる。

```py
COLORS = (
    RED,
    BLUE,
      :
) = range(0, ...)
```

### 変数を使って値をインクリメントしながら代入

Pythonでは `++` 演算が使えないので、以下のような実装はできない。

```java
int colorVal = 0
int RED = colorVal++;
int BLUE = colorVal++;
  :
```

これをPythonでやる場合、(おそらく) 以下のような形になる。

```py
_cv = 0
RED = _cv = (_cv + 1)
BLUE = _cv = (_cv + 1)
GREEN = _cv = (_cv + 1)
YELLOW = _cv = (_cv + 1)
```

右辺が同じ表現なので、変数の追加は簡単に行える。
ただし、コードがどうにもスマートに見えないので、個人的にはタプルを使う方法がPythonらしくてよいと思う。(素直にenumを使うのが一番よい)
Youtubeの360°動画を見るChrome拡張機能を作りました。

Youtubeが360°動画に対応するというニュースが１週間ほど前にありました。
なので、この拡張機能はほんの数週間しか役に立たないでしょうｗ。
まあ、こういう実装になってくれたらなというコンセプトプログラムだと思ってください。

##インストール
[こちら](https://chrome.google.com/webstore/detail/youtube-360%E5%8B%95%E7%94%BB%E3%83%93%E3%83%A5%E3%83%BC%E3%83%AF%E3%83%BC/cbjplakjmcnjcfihhleikimbdolobfgl?hl=ja)にアクセスしてインストールしてください。

##特徴
・Oculus Rift(DK1,DK2)に対応
・サイドバイサイド、トップアンドボトムの立体視動画に対応
・THETAのステッチ前の生の動画に簡易対応(境界は目立ちます)
・埋め込みプレイヤーにも対応

##操作説明
インストールすると、プレイヤーに２つのアイコンが追加されます。
![ic_panorama_horizontal_48px-32.png](https://qiita-image-store.s3.amazonaws.com/0/17554/550586ae-5eff-8ead-4394-7f3fa2461287.png)![ic_crop_landscape_48px-32.png](https://qiita-image-store.s3.amazonaws.com/0/17554/f604b748-ce6f-0a09-d598-40ddc81ea099.png)360ビューワー⇔Youtubeプレイヤー切替アイコン。
>360ビューワーに切り替えると、マウスで視点を変更することができます。

![ic_panorama_wide_angle_48px-32.png](https://qiita-image-store.s3.amazonaws.com/0/17554/4d65c0ea-654e-d6e6-0f7a-fda2060533ef.png)Oculusu RIftで見るアイコン。
>Oculus Riftに動画が表示されます。Oculus Riftのアイコンは、Oculus Riftが接続されておりかつSharpOVRBridgeを実行している状態でないと表示されません。


##ブラウザーでのキー説明
* Mキー:モード切替。キーを押すごとにノーマル→サイドバイサイド→トップアンドボトムをループして切り替えます。
* Rキー:リセンター。Oculus Riftセンサーのポジションをリセットします。
* Tキー:THETAの生動画視聴モードに切り替えます。
* Zキー:360ビューワーで拡大縮小した場合、デフォルトに戻します。


##Oculus Riftで見る場合
[SharpOVRBridge]
(https://www.dropbox.com/s/uli7thxhz1q1q5d/SharpOVRBridge.zip?dl=0)
をダウンロードします。Windowsのみ対応です。
Oculus RiftをPCに接続してからSharpOVRBridge.exeを実行してください。
Directモードには対応していません。拡張モードにし、Oculus Riftのモニターがメインモニターの右真横に位置するように(上辺が揃うように)配置してください。

##半自動判定機能
動画のタイトルに"【】"をつけ、その中に以下の文字列を追加すると自動的に360ビューワーに切り替わるようになります。
* "360":360°動画であることを示します。
* "sbs":サイドバイサイドであることを示します。
* "tab":トップアンドボトムであること示します。
* "rawθ":THETAの生動画であることを示します。
例）360°動画でサイドバイサイドの場合、
"全天球テスト動画【360sbs】"

##既知の問題点
* 複数のプレイヤーから、Oculus Riftで見るアイコンを押すとOculus Riftで見る機能が動作しなくなってしまいます。
* 環境にもよりますが、Oculus Riftでは30fps行きません。
* 埋め込みプレイヤーでもキー機能を有効にしてますが、もしかすると親ページでのキー操作に影響を及ぼすかもしれません。
* 360ビューワーでマウスで視点操作の際に、映像の外でマウスボタンをアップすると操作できなくなる場合があります。(特に上下操作)
* DK1ではそうでもないのですが、DK2だとIPDというのですか、左右の映像がちょっと離れてしまってます。
* SharpOVRBridge.exeがたまに落ちてしまいます。
Gitでよく使う設定

```language:git-config

git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"

# git diff で日本語を表示する
git config --global core.pager "LESSCHARSET=utf-8 less"

# gitのcommitメッセージにvimを利用する
git config --global core.editor 'vim -c "set fenc=utf-8"'

# gitでの認証情報を保存する
git config --global credential.helper store

# gitのpushでブランチ名省略時に安全に処理する(現在のブランチで同名の場合)
git config --global push.default simple

# デフォルトのignore設定
git config --global core.excludesfile $HOME/.gitignore_global

# 自動で改行コードの変更をしない
git config --global core.autoCRLF false

# globalなgitignoreを設定
git config --global core.excludesfile ~/.gitignore_global

```
wx.ProgressDialog の AUTO_HIDE では明示的な Destroy() が必要

wxPython (Python2.7系) を使ってWindowsアプリを作っています。
wx.ProgressDialog を使った実装で、Frameのキー聞かず (Freeze) に遭遇したので、一応メモまで。

wx.ProgressDialog は以下のように呼び出せる。

```py
dialog = wx.ProgressDialog(
    parent=self,
    title="Progress Dialog",
    message="Waiting completion...",
    maximum=100,
    style=wx.PD_APP_MODAL
          | wx.PD_ELAPSED_TIME
          | wx.PD_SMOOTH
          | wx.PD_AUTO_HIDE)
dialog.Show()
```

ポイントは`style`の `wx.PD_AUTO_HIDE`。
`Update()` メソッドでダイアログに進捗を通知できるが、進捗値が最大値 (`maximum` で指定した値)に達すると、ダイアログは特別な操作なしで非表示となる。

```py
dialog.Update(0)
dialog.Update(1)
  :
dialog.Update(100)  # これによりダイアログは自動で非表示となる
```

「便利だなー」と喜んでいたが、これだと親となるFrameに処理が戻らずキー効かず (Freeze) 状態になる。
どうも自動で非表示になる (`Hide()`が呼ばれる) が、ダイアログ自体は生きているようで、MODAL状態が解除されず、親Frameが操作不要になっている模様。

進捗が完了を示す値になった場合に、明示的に`Destroy()`を呼ぶことで解消できた。(`Close()` というメソッドもあるので注意)

```py
dialog.Update(100) 
dialog.Destroy()
```

一応、最低限動作するサンプルコードを掲載しておく。

```py
# -*- coding: utf-8 -*-

import wx


class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Sample Frame")

        self.btn = wx.Button(self, wx.ID_ANY, 'Start')
        self.btn.Bind(wx.EVT_BUTTON, self.click_button)

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_timer)
        self.progress = 0

        self.dialog = None

    def click_button(self, event):
        self.timer.Start(100)  # msec
        self.open_progress_dialog()

    def on_timer(self, event):
        self.progress += 1
        self.dialog.Update(self.progress)
        if self.progress == 100:
            self.dialog.Destroy()  # Must be called !!!!
            self.timer.Stop()
            self.progress = 0  # reset

    def open_progress_dialog(self):
        self.dialog = wx.ProgressDialog(
            parent=self,
            title="Progress Dialog",
            message="Waiting completion...",
            maximum=100,
            style=wx.PD_APP_MODAL
                  | wx.PD_ELAPSED_TIME
                  | wx.PD_SMOOTH
                  | wx.PD_AUTO_HIDE)
        self.dialog.Show()


def main():
    application = wx.App()
    frame = MyFrame()
    frame.Show()
    application.MainLoop()

if __name__ == "__main__":
    main()
```
わかりやすいコードを書こう！


# わかりやすいコードを書くために必要なこと
* コメントを必要な限り書く。
* 関数をこまめに分ける。
* 名前を適切につける。
* 関数の名前は時間をかけて考える。
* 空白、改行もしっかり行う。
* 誰でもわかるコード(ある意味バカなコード)を書く。

# コメントについて
* コメントは、コードと設計に関する技術的な注意書きのために用いるべきです。
* コメントは、「コードで表現できないこと」に対して使用すべきです。
* 十分に時間をかけて最善のコメントを残すように心がけましょう。

## 退化したコメント
* 発見したら、最新化するか、必要性が薄ければ取り除いてしまいます。

## 冗長なコメント
* 削除します。
* 関数に対してコメントを書くだけで大丈夫です。
* 関数の中にコメントが描けるということはそれは複雑かそれとも関数化ができるはずです。

## コメントアウトされたコード
* コメントアウトされたコードは、そこに居座り続け、腐敗していきます。
* コメントアウトされたコードを見つけたら、削除しましょう。


# 関数について

## 多すぎる引数
* 関数引数の理想は0です。
* 1~2までは許されます。
* 3以上になってしまったら、構造体などを利用してラップしましょう。

## フラグ引数
* プログラムを汚くし、わかりにくくするので、避けるべき習慣をつけましょう。
* 適切な命名をして、２つの関数に分割します。

## 死んだ関数
* どこからも呼び出されないメソッドは、デッドコードです。
* 見つけたら、直ちに削除します。
* あると、読み手に迷惑をかける場合があります。

## セレクタ引数
* セレクタ引数とは、処理を選択するための引数のことです。
* セレクタ引数は、大きな関数を小さな関数に分割することを怠けた結果です。
* １つの関数に振る舞いを選択するコードを入れるのはやめ、別々の関数に分けるようにしましょう。

## 多目的関数
* 多目的関数とは、1つの関数で様々な処理を行う事です。
* 関数の中にif文とfor文が2つ以上ある場合は関数を分けましょう。  

```cpp:hoge.cpp

// 多目的関数
void Hoge()
{
    for(auto i : bullets)
    {
        if(i->IsDeath())
        {
            // 何かしらの処理
        }
    }
}

// 分割します
void HogeA()
{
    for(auto i : bullets)
    {
        HogeB(i);
    }
}

void HogeB(Bullet bullet)
{
    if(bullet->IsDeath())
    {
        // 何かしらの処理
    }
}
```

このように組んでいくとわかりやすくなっていきます。
コードを書いている限りリファクタリングを行いましょう。

上記の内容ができればある程度見やすいコードにはなると思います。


以上です。
load-themeをトグルする

前提
----

Emacsの配色を変更したいときは、`M-x load-theme`してみるといいですよ。Emacs 24なら、特別なものをインストールする必要はない。

* [Emacs24に最初から同梱されているテーマ - AOEの日記](http://aoe-tk.hatenablog.com/entry/20130210/1360506829)

なにしたいの
------------

筆者は黒い画面が好きなのでmanoj-darkテーマを愛用してるんですけど、別のカラーテーマに一時的に変更したいこともよくあります。[アスキーアートを見るとき](http://qiita.com/tadsan/items/4ed132f5d4372447090f)とかね！

なので、黒い画面と明るめの画面をくるくる変更できると、とても捗ります。

`toggle-load-theme`を定義
-------------------------

適当に書いたので、各自`.emacs.d/init.el`とかにコピペすると便利です。

https://github.com/zonuexe/dotfiles/commit/88e071aa09d77ac42b69386f7c19fc89f4b0aacd

```el
(defvar my/load-themes '(manoj-dark tango))
(defun toggle-load-theme ()
  "Toggle `load-theme'."
  (interactive)
  (let ((current-theme (car custom-enabled-themes)))
    (load-theme
     (car (or (cdr (member current-theme my/load-themes))
              my/load-themes)))))
```

`my/load-themes`は、お好みで設定してください。

```el
(defvar my/load-themes '(A B C))
```

このように設定した場合、`M-x toggle-load-theme`を実行するたびに `A → B → C → A → …` のように変更(トグル)されます。現在の設定が`X`のときは、`my/load-themes`の先頭にある`A`になります。

まとめ
------

[やる夫スレを読む](http://qiita.com/tadsan/items/4ed132f5d4372447090f)には `(load-theme 'tango)` がおすすめ。

![](https://qiita-image-store.s3.amazonaws.com/0/4121/53a90840-b128-b14b-76ed-0d7c0a65a019.png)

> 宣伝: [やる夫達は鳥人戦隊のようです](http://yaruo.wikia.com/wiki/%E3%82%84%E3%82%8B%E5%A4%AB%E9%81%94%E3%81%AF%E9%B3%A5%E4%BA%BA%E6%88%A6%E9%9A%8A%E3%81%AE%E3%82%88%E3%81%86%E3%81%A7%E3%81%99) おもしろいよ！
HoloGraphLibraryをmavenレポジトリからインストールする

# mavenレポジトリからのライブラリ
## はじめに
Androidでグラフを描画するのにHoloGraphLibraryが便利ですが、ライブラリを利用するのにプロジェクトをgit cloneしてimportする手順が必要です。

今回の記事は、HoloGraphLibraryをgit cloneで取り込むのではなく、mavenレポジトリからライブラリを取得する方法です。
これによって簡単にHoloGraphLibraryが使用できます。

## HoloGraphLibrarayのmavenレポジトリ
[こちら](https://github.com/powerje/mvn-repo)でHoloGraphLibraryをmavenレポジトリの形式で公開してくれているものがあります。
これを利用させてもらいます。

## build.gradleへの設定の追加
設定の追加は、[ここ](https://github.com/powerje/mvn-repo)にある説明のとおりです。

```groovy:build.gradle(projectのディレクトリ直下のもの)
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        // 1. GitHubに公開されているレポジトリを追加する
        maven {
            url 'https://github.com/powerje/mvn-repo/raw/master/'
        }
        mavenCentral()
    }
}
```

```groovy:build.gradle(appディレクトリの直下)
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.2"

    defaultConfig {
        applicationId "hm.orz.key0note.compoundinterestviewer"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.2'
    // 2. support-v4ライブラリの追加
    compile 'com.android.support:support-v4:13.0.0'
    // 3. holographlibraryライブラリの追加
    compile 'com.echo:holographlibrary:1.0'
}
```
設定は以上です。
あとは、HoloGraphLibraryを呼び出すコードを記述するだけでライブラリを使用することができます。

#参考
HoloGraphLibraryの使い方などはこちらを参考にしてください。
http://qiita.com/ueno-yuhei/items/2f967db198d085ec8c1a
http://dev.classmethod.jp/smartphone/android/android-tips-holographlibrary/[こちら](https://github.com/powerje/mvn-repo)
WordPressのテンプレートタグで生成したＨＴＭＬに、クラスをつける方法

はじめまして。
現在WordPressの勉強をしています。
WordPressのwp_nav_menu()で生成したナビの右から二番目の項目にだけclassをつけるといった方法はとれるのでしょうか？

初歩的な質問かもしれませんが、ご回答の方よろしくお願いします。
icomplete-modeで入力を完了するためのコマンドをまとめる

Emacsのバージョンを24.4に上げたところ、愛用していた `iswitchb` がobsoleteと言われました。移行先として `icomplete` を採用。`helm` と `ido` は、インターフェイスの大幅な変化にどうしても慣れませんでした。

`icompele-mode` を使っていると、補完、入力を完了して、制御を返すためのコマンドが複数選べます。

-   `exit-minibuffer`
-   `minibuffer-complete-and-exit`
-   `minibuffer-force-complete-and-exit`

の三つがそうです。
この三つの動作を、空気を読んで使い分けてくれるコマンドが欲しかったので書いてみました。

# コード

```el:.emacs
(icomplete-mode 1)

;; ミニバッファで補完を行いたくないコマンドのリスト
(defvar icomplete-exceptional-command-list
  '(dired-create-directory
    dired-do-copy
    dired-do-rename))

;; 起動時のカーソル位置を保持するための変数
(defvar icomplete-initial-point-max nil)
;; 起動時の補完候補リストを保持するための変数
(defvar icomplete-initial-completions nil)
;; 起動時に呼び出し元のコマンド名を保持するための変数
(defvar icomplete-this-command nil)

;; 起動時に上記の変数に値を代入するフックをかける
(add-hook 'icomplete-minibuffer-setup-hook
          (lambda ()
            (setq icomplete-initial-point-max (point-max))
            (setq icomplete-initial-completions
                  (completion-all-sorted-completions
                   (icomplete--field-beg) (icomplete--field-end)))
            (setq icomplete-this-command this-command)))

;; 入力完了のコマンド定義
(defun minibuffer-force-complete-and-exit-dwim ()
  "Complete the minibuffer with first of the matches and exit."
  (interactive)
  (cond ((member icomplete-this-command icomplete-exceptional-command-list)
         (exit-minibuffer))
        ((and (eq (point-max) icomplete-initial-point-max)
              (equal (car (completion-all-sorted-completions
                           (icomplete--field-beg) (icomplete--field-end)))
                     (car icomplete-initial-completions))
              minibuffer-default)
         ;; Use the provided default if there's one (bug#17545).
         (minibuffer-complete-and-exit))
        (t (minibuffer-force-complete)
           (completion--complete-and-exit
            (minibuffer-prompt-end) (point-max) #'exit-minibuffer
            ;; If the previous completion completed to an element which fails
            ;; test-completion, then we shouldn't exit, but that should be rare.
            (lambda () (minibuffer-message "Incomplete"))))))

;; 入力完了をリターンキーにバインド
(define-key icomplete-minibuffer-map [return]
  'minibuffer-force-complete-and-exit-dwim)
```

# 説明

`icomplete-mode` では、`minibuffer-force-complete-and-exit` ( `C-j` )を使うことで、補完候補の先頭を選んで補完し、入力を完了することが出来ます。また、デフォルト値が設定されていて、かつ、ユーザーからの入力がなかった場合は、デフォルト値が選択されます。

しかしながらこの `minibuffer-force-complete-and-exit` 、時々空気を読んでくれません。例えば、Rubyスクリプトの編集中、`ruby-load-file` ( `C-c C-l` )で実行を試みた時、デフォルト値には編集中のファイル名が設定されていて、かつ、入力はしていなかったにも関わらず、デフォルト値ではなく、補完候補の先頭(大抵の場合"./")が採用されてしまいます。他にも、 `dired-mode` でディレクトリの作成( `+` )を試みると、「補完できない」と言われて入力が完了できません。

もちろん、そういった時は、 `exit-minibuffer` ( `C-m` )を使うことで、所望の動作が得られます。でも、できたら、自分が使うコマンドは一つだけで、後は良きに計らって欲しい。ということで対症療法的に書いた代物が上記のコードです。

変更点は二つです。
第一に、 `ruby-load-file` のように、ミニバッファにプロンプト以外の文字列が最初から入っているタイプのコマンドでも、正しくデフォルト値が採用されるようになりました。第二に、 `dired-create-directory` のように、`exit-minibuffer` で入力を完了したいコマンドは、`icomplete-exceptional-command-list` に登録しておくことで、`exit-minibuffer` が呼ばれるようになりました。
Pythonで機械学習するための環境を構築してみた(MacOS X)

先日のCROSS2015のpythonセッションにて機械学習って面白そうじゃんと思い、とりあえず環境周りを整えてみたので、めもです。

先日のCROSS2015の記事は[コチラ](http://rfp.hatenablog.com/entry/2015/01/29/231312)です。

#### :black_square_button: 概要
- pythonで機械学習ができる環境を構築すること
- 大したことやってないのでQiitaにあげる必要ないかなと思いつつ、個人的に色々ハマったので、一応あげます。

#### :black_square_button: 前提
- MacOS X

#### :black_square_button: もろもろのインストール
- Python
<pre>
$ brew update
$ brew upgrade
$ brew install python
</pre>

一応、バージョン確認
<pre>
$ python -V 
Python 2.7.5
</pre>

pip
<pre>
$ pip install --upgrade setuptools
$ pip install --upgrade pip
</pre>

.bash_profileにパスを設定。忘れてた。。
これをやらないと、scikit-learnをインポートする際に下記のエラーが出る。

```python
ImportError: No module named sklearn
```

っていうことで.bash_profileにパスを追加。
<pre>
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/share/python:$PATH
</pre>

上記を.bash_profileに追加したら、更新。
<pre>
source ~/.bash_profile
</pre>

- もろもろの数学系ライブラリをインストール
<pre>
$ pip install numpy
$ pip install scipy
$ pip install matplotlib
$ pip install scikit-learn
$ pip install pandas
$ pip install pydot
$ pip install rpy2
$ pip install ipython
$ pip install pyzmq
$ pip install tornado
$ pip install jinja2
</pre>

rpy2をインストールする際に下記のエラーに出くわした。

<pre>
$ pip install rpy2
Collecting rpy2
  Using cached rpy2-2.5.5.tar.gz
    Error: Tried to guess R's HOME but no R command in the PATH.
    Complete output from command python setup.py egg_info:
    Error: Tried to guess R's HOME but no R command in the PATH.

    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/jl/h7wk98516f1_tj7zg87r08b00000gn/T/pip-build-Cs7fDa/rpy2
</pre>

Rをインストールしていないからですね。。そりゃそうや。。</br>
MacOSXにRをインストールする方法は下記を参考にしました。ありがたや。ありがたや。</br>
[MacOSX に homebrew で R をインストール](http://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)
けっこうハマった。。</br>

#### :black_square_button: 雑感
- pythonが機械学習で注目されている理由がなんとなくわかった気がする
    - 数学・工学・統計学系のライブラリが豊富だから？
    - Rubyとかはこんなにあるのかな？ちゃんと調べていないからなんとも言えないが。。
    - rpy2やpandasでR絡みのライブラリを呼べるのは大きい
    - Scipyやscikit-learnがあるのもPythonの特徴なのかな？
- これで箱ひげとかヒストグラム、回帰分析、クラスタ分析etcができる環境が整った
- そういえば学生時代、統計学的なことをやってたなと思い出し、少しノスタルジックな気分になった。。。
- 上記以外にも、よさげなライブラリがあれば、教えて欲しい次第です。
- やっぱり、Qiitaにあげるほどの内容でもなかったかな。。

#### :black_square_button: 参考
- [ipythonをMavericksに入れてみた](http://qiita.com/mountcedar/items/fbf57bbc21a7fb820f06)
- [MacOSX に homebrew で R をインストール](http://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)
Raspberry-PiをMacからSSH（モニタ・キーボードなし）でセットアップする


# 概要
Raspberry-PiのOSイメージを準備し、同一ネットワークのMacから操作しセットアップするまでのメモ

# イメージ準備~SSHログインまで
公式ページからRASPBIANのイメージをダウンロード
http://www.raspberrypi.org/downloads/

Apple-Pi-Bakerを使うとGUI上でイメージの書き込み/バックアップ/リストができて簡単っぽい。
以下からダウンロードし、RASPBIANのイメージをMicroSDへ焼く
http://www.tweaking4all.com/hardware/raspberry-pi/macosx-apple-pi-baker/

SDカードをRaspberry-Piに入れて、電源をつないで、操作するPCとLANケーブルで同一ネットワークに接続する。電源を入れた時点で起動が始まり、SSHを受け付けるようになる。

MacからSSHするには、Raspberry-piのIPアドレス調べる必要があるが、
ネットワークにブロードキャストを投げても、デフォルト設定だと反応しないため、
ルーターに接続するなどして、接続したRaspberry-piのIPアドレスを調べる。

この場合は 192.168.0.3 だった。

調べたRasberry-PiのIPアドレスに対して、SSHで接続する。
RASPBIANのデフォルトユーザーは、以下のようになっているため

```
user: pi
pass: raspberry
```

このようにSSHで接続する。

```
ssh pi@192.168.0.3 -p raspberry
```

# その他設定

piユーザでは操作に制限があるため、rootのパスワードを設定し、rootユーザを使えるようにしておく。

```
sudo passwd root
```

初めから入っているVIは互換モードとなっており使いにくいため、とりあえずVIMをインストール。

その前に、リポジトリの更新を忘れずに。

```
sudo apt-get update
```

```
sudo apt-get install vim
```
参考 : [Vimで方向キーを押すとABCDが出る問題を直す](http://marupeke296.com/)

# ブロードキャストからIPアドレスを引けるようにする

また、IPアドレスが変化した場合に備えて、ブロードキャストからIPアドレスを調べられるようにしておく。

```
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
```

永続化するには /etc/sysctl.conf に以下の1行の追記も必要

```
net.ipv4.icmp_echo_ignore_broadcasts=0
```
これで同一セグメントのネットワークからであれば、
ブロードキャストを投げて、IPアドレスを調べられるようになる。

```
> ping 255.255.255.255
64 bytes from 192.168.0.6: icmp_seq=0 ttl=64 time=0.233 ms
64 bytes from 192.168.0.1: icmp_seq=0 ttl=255 time=0.678 ms
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=0.922 ms

> arp -a
? (192.168.0.1) at 1c:b1:7f:xx:xx:xx on en0 ifscope [ethernet]
? (192.168.0.3) at b8:27:eb:xx:xx:xx on en0 ifscope [ethernet] // ←これ"b8:27:eb"はRaspberry FaundationのVenderID
? (192.168.0.6) at c:4d:e9:xx:xx:xx on en0 ifscope permanent [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
```
OSXのlibcはlibSystem.B.dylibなのかも

# 背景

pythonのcyptesを試しているが、C側からPythonを呼び出せないのか
調べていたら、libcのqsortの例が

- [16.16. ctypes — Pythonのための外部関数ライブラリ — Python 3.4.2 ドキュメント](http://docs.python.jp/3/library/ctypes.html)

に出ていた。

そこで、OSXではlibcに該当するdylibはどれなんだろ？

# Where is the standard C library on Mac OS X?

ありました。

- [osx - Where is the standard C library on Mac OS X? - Stack Overflow](http://stackoverflow.com/questions/6240639/where-is-the-standard-c-library-on-mac-os-x)

libSystem.B.dylibが手元のYosemiteなMacには転がっていました。

# やってみた

```py3
from ctypes import *
cdll.LoadLibrary("libSystem.B.dylib") 
libc=CDLL("libSystem.B.dylib")
IntArray5=c_int * 5
ia = IntArray5(5,1,7,33,99)
qsort=libc.qsort
qsort.restype=None
CMPFUNC=CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int))
def py_cmp_func(a,b):
  print("py_cmp_func",a[0],b[0])
  return 0

cmp_func=CMPFUNC(py_cmp_func)
qsort(ia,len(ia),sizeof(c_int),cmp_func)
```

C言語側からpy_cmp_funcが呼ばれた。

# まとめ

ということで、OSXはGHOSTとは無縁なことが分かった(違
Google Cloud StorageのAccessKey


[プロジェクトダッシュボード](https://code.google.com/apis/console/b/0/#project:722638473762:storage:legacy)でInteroperable Accessへ。


![スクリーンショット_2015-02-01_19_59_10.png](https://qiita-image-store.s3.amazonaws.com/0/5840/06924bd1-2a2f-8d87-246b-608395415269.png "スクリーンショット_2015-02-01_19_59_10.png")

レガシーな画面でなかなかよくわからなかったのでメモしておいた。
Ransack(Rails)で複雑なAND条件やOR条件を組み合わせる方法

Ransackで

```sql
(col1 LIKE "%hogehoge%" OR col2 LIKE "%hogehoge%") AND (col1 LIKE "%hogehoge%" OR col2 LIKE "%hogehoge%")
```

のようにcondition同士をANDでつなげる方法を調べていて、日本語ネタが見つからなかったのでメモ書き。

Ransackは関連テーブルをouter joinしてくれたり、エスケープしてくれたりして便利。

```rb
{
  combinator: 'and',
  groupings: {
    '0' => {'col1_or_col2_cont' => 'hogehoge'},
    '1' => {'col1_or_col2_cont' => 'hogehoge'}
  }
}
```

ActiveRecordってORが入ると文字列かArelでcondition組まないといけないの大変だなぁ

ActiveRecordでORメソッドチェインはやく実装されないかな〜

https://github.com/rails/rails/pull/16052
https://github.com/olivierlacan/ask/issues/4

# 参考
https://github.com/activerecord-hackery/ransack/issues/169
https://github.com/activerecord-hackery/ransack#grouping-queries-by-or-instead-of-and
Macでキーロガー



[addGlobalMonitorForEventsMatchingMask:handler:](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/index.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:)を使えばできる。


コールバックされるブロックの引数に[NSEvent](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/)のインスタンスがやってくるので、そこから情報を取得できる。

ただし、アクセシビリティが有効で、アプリケーションがアクセシビリティを利用できる信頼されたアプリケーションでないとイベントは飛んでこない。

信頼されたアプリケーションにするには

`システム環境設定 > セキュリティとプライバシー > アクセシビリティ`

で設定できる。

参考: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

Xcodeでデバッグしているアプリで、これを有効にする方法がわからない。
アーカイブビルドしたものをアプリケーションフォルダにおいておくと動いていることが確認できている。

ランチャー系の起動はどうやってキー入力をハンドルしているのか気にになる。
JPAエンティティのライフサイクルをテキストで書いてみた

自由にコピペしてください。

```
                    ○      ◎
                new |      ^ GC
                    v      |
                   +---------+
                   | メモリ   | <--------------+
                   +---------+                |
   find/JPQL             |                    |
○----------------------+ |                    |
                       | | persist            |
                       v v                    |
+---------+  merge   +---------+  remove   +---------+
|         | -------> |         | --------> |         |
| 分離状態 | <------- | 管理状態 |           | 削除済み |
|         |  clear   |         | <-+       |         |
+---------+  detach  +---------+   |       +---------+
                       ^    |      |
                       |    +------+
                       |      refresh
                       |      setter
                       v
                    +-------------+
                    +-------------+
                    | データベース |
                    +-------------+

```
Kinect v2のKinectFusionから色付きの3次元点群と自己位置を得る方法（Visual Studio 2013, OpenCV, C++, Kinect v2）

# Kinect for Windows v2
[Kinect v2](http://www.microsoftstore.com/store/msjp/ja_JP/pdp/Kinect-for-Windows-v2-%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC/productID.298959900)は、2014年07月15日に発売されたTOF方式のRGB-Dセンサです。今回、[Kinect v1](http://qiita.com/SatoshiRobatoFujimoto/items/bddefc89456c0716b00a)と同様にKinectFusionを試してみました。

# KinectFusion
KinectFusionとは、Kinectを用いてSLAM（Simultaneous Localization and Mapping）：自己位置推定と地図作成を同時に行う技術である。
SDK Browser (Kinect for Windows) v2.0でも体験できるが、実際にソースコードをいじって、3D点群と自己位置を得てみた。

# ソースコードのダウンロード
UnaNancyOwenさんがKinect v2のサンプルプログラムを公開していらっしゃいます。ありがとうございます。
（参照コード）https://github.com/UnaNancyOwen/Kinect2Sample
- KinectFusion.cpp　・・・メイン
- KinectFusionHelper.cpp　・・・関数
- KinectFusionHelper.h　・・・関数の定義

引用、一部改変しました。
（参照コード) https://github.com/SatoshiRobatoFujimoto/KinectFusionV2

- Colorを追加
- 点群ファイルの保存(.ply, .stl, .obj)
- カメラ位置を保存するプログラムを追加(.ply)

# 実行の手順
1. Releaseモードで実行して、's'キーで保存、'r'キーでリセット、'esc'キーで終了します。※Debugモードでウィンドウ名が文字化けするバグ有り
2. 保存されたCameraPose.ply(カメラ位置の点群)ファイルとmesh.ply(再構築した点群)ファイルをMeshLab等で開いてください。

# 動作環境
- PC (Windows8.1, RAM 8GB, 2 cores @ 2.1GHz)
- Visual Studio 2013
- OpenCV2.4.9
- Kinect for WIndows SDK v2.0_1409

# 結果
障子を撮影しました。3D点群ファイルと自己位置（赤い点群）を示します。

- PLYファイル（MeshLab）
![snapshot00.png](https://qiita-image-store.s3.amazonaws.com/0/63863/65ac71c8-ca85-52bb-180a-bff1f0fd28eb.png)

STLファイルやOBJファイルにも対応しています。(自己位置は保存してません。色もついてません。)

- STLファイル（MeshLab）
![snapshot01.png](https://qiita-image-store.s3.amazonaws.com/0/63863/7d28e366-31e9-1c85-1ef8-4fffadfeb5c2.png)

- OBJファイル（3D Builder）
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/e721d181-246a-72a4-6984-08457ea1b0a7.png)


Kinect v1によるKinectFusionは[こちら](http://qiita.com/SatoshiRobatoFujimoto/items/bddefc89456c0716b00a)
Boot2Docker with Fig on Windows

##目標
複数のDockerコンテナをfig.yml設定ファイルでまとめて管理するため、WindowsにインストールしたBoot2Dockerで[fig](http://www.fig.sh/)を使えるようにしたい。だが、figの公式サイトにはLinux/Mac用のインストールだけ説明されていて、Windowsの場合はどうすればいいか書かれておらず、Windowsの公式サポートはまだないよう。

##解決策
[figの入ったDockerコンテナイメージ](https://registry.hub.docker.com/u/dduportal/fig/)をダウンロードして起動するスクリプトを、Boot2Dockerの仮想OSの永続フォルダ内に作る。

##前提
* Boot2DockerをすでにWindowsにインストール済み。
* UNIXではなくあえてWindowsでDockerをどうしても使いたいというひねくれ精神

##手順
1) Boot2DockerをWindowsにインストールするとデスクトップに作成される「Boot2Docker Start」ショートカットをダブルクリックし、仮想OS内のターミナルにログイン。
2) 下記スクリプトを`/var/lib/boot2docker/bootlocal.sh `として作成。
`$ sudo vi /var/lib/boot2docker/bootlocal.sh`

```sh:/var/lib/boot2docker/bootlocal.sh
echo 'alias fig='"'"'docker run --rm -it \
        -v $(pwd):/app \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -e FIG_PROJECT_NAME=$(basename $(pwd)) \
        dduportal/fig'"'" >> /home/docker/.ashrc
```
`$ sudo chmod +x /var/lib/boot2docker/bootlocal.sh`

3) これで`source ~/.ashrc`と打てば、`fig`コマンドが打てるようになる。`fig --version`が動けば完了。

これで下記のBoot2Docker+figのチュートリアルをWindowsでも実行できるようになった。/home/docker/直下とか適当なディレクトリに`Dockerfile`や`fig.yml`ファイルを作成して`fig run ...`するだけで複数のDockerコンテナを一括で起動できる。

[Docker1.3版 boot2docker+fig入門](http://qiita.com/toritori0318/items/190fd2dad2bf3ce38b88)
[Getting started with Fig and Rails](http://www.fig.sh/rails.html)
[figを使ってDockerのクラスタを作り出す](http://qiita.com/numa08/items/2f9349eac2f256808c47)

/var/lib/boot2docker/ディレクトリ内であれば、Boot2Dockerの仮想OSを再起動してもファイルは削除されない。再起動したら

```sh
$ sudo /var/lib/boot2docker/bootlocal.sh
$ source ~/.ashrc
```
でfigのaliasを再作成すればよい。

###参考
Windows 7 with boot2docker support for fig #598
https://github.com/docker/fig/issues/598#issuecomment-67762456
LocalBroadcastManagerによるサービスとの同期通信


同プロセス内でのActivityとService間のローカル通信に便利な
LocalBroadcastManagerというクラスがサポートライブラリにあります。
このクラスを使うとAIDLを利用せずにActivityとServiceの同期通信が簡単に行えます。
AIDLを使うまでもないような連携をしたい場合に便利だと思います。

## LocalBroadcastManager#sendBroadcastSync(Intent)

同期通信するには **LocalBroadcastManager#sendBroadcastSync(Intent)** メソッドを使います。
sendBroadcast(Intent)と基本的には同じですが、このメソッドを使うと呼び出し元のスレッドをブロックし
直ちにレシーバーにIntentを投げます。
このメソッドを使い、受け取り側のレシーバーでも同じように sendBroadcastSync を使ってIntentを投げれば
呼び出し元に同期的に値を返すことができます。

※ 以下プログラムは色々省いてます。

## Activity側

``` MainActivity.java

public class MainActivity extends Activity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("", "receive : " + intent.getAction());
        }
    };


    private void sendSyncBroadcast() {

        Intent i = new Intent();
        i.setAction("action1");

        IntentFilter filter = new IntentFilter();
        filter.addAction("action2");

        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(receiver, filter);
        Log.d("", "Start Activity");
        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcastSync(i);
        Log.d("", "End Activity");
        LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(receiver);

    }
}

```

## Service側

```TestService.java
public class TestService extends Service {

    private BroadcastReceiver receiver;

    @Override
    public void onCreate() {
        super.onCreate();

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("action1")) {
                    Intent i = new Intent();
                    i.setAction("action2");

                    Log.d("", "Start Service");
                    LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcastSync(i);
                    Log.d("", "End Service");
                }
            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction("action1");
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(receiver, filter);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(receiver);
    }
}

```

## 実行結果

何かしらのタイミングでActivityの sendSyncBroadcast() メソッドを実行すると
以下のような結果となり、Serviceと同期的に通信できていることがわかります。

```
Start Activity
Start Service
receive : action2
End Service
End Activity

```
Android Auto Designing


> 本ページは[Android Developers](http://developer.android.com/design/auto/)の和訳となります。

Android Autoは車において統一されたデザインプラットフォームを提供してくれます。
デザイナーは車特有のハードの差異に悩まされる事はありません。
本ページではAndroid Autoのキーとなるいくつかの画面について説明します。
更に深い理解を得る為には，以下のAuto UI guidelineを読んでください。

##### UI Guidelines

- [Auto Media Apps (PDF)](http://commondatastorage.googleapis.com/androiddevelopers/shareables/auto/AndroidAuto-media-apps.pdf)
- [Auto Messaging Apps (PDF)](http://commondatastorage.googleapis.com/androiddevelopers/shareables/auto/AndroidAuto-messaging-apps.pdf)
- [Auto Color Customization (PDF)](http://commondatastorage.googleapis.com/androiddevelopers/shareables/auto/AndroidAuto-custom-colors.pdf)

> **重要** Googleはドライバーの気を散らさない事を重要視しています。Android Autoのアプリには，満たすべき明確なデザイン要求が存在します。これらの原則を順守する事で，開発とテストの手間を省く事ができます。詳細は[Auto App Quality](http://developer.android.com/distribute/essentials/quality/auto.html)を御覧ください。

### Overview Screen

ユーザーが初めてAndroidデバイスを車に繋いだ際、最初に向かい合う事になるこの画面(オーバービュースクリーン)は，ユーザーの位置や日時等に基づいたコンテキストカードを表示します。
また，メッセージアプリからのNotificationを確認でき，音声入力で返信をする事ができます。

![image](http://developer.android.com/auto/images/ui/gearhead_overview.png)

> Figure 1. オーバービュースクリーンはコンテキストカードと新着メッセージを表示する

### Audio App Launcher

アクティビティバーの中のヘッドフォンのアイコンをクリックすると，デバイスにインストールされているオーディオアプリの一覧がスクロールリストに並びます。

![image](http://developer.android.com/auto/images/ui/gearhead_lens_switching.png)

> Figure 2. オーディオアプリランチャーは利用可能なオーディオアプリを表示する

### Primary App UI

オーディオアプリを選択後，プライマリなアプリのUIが出現する。Android Autoは標準化されたUIを出すが，このUIはアイコンやアプリ名を出したり，背景を変更するなどカスタマイズが可能です。

![image](http://developer.android.com/auto/images/ui/gearhead_generic_UI.png)

> Figure 3. 一般的なオーディオアプリのUI

![image](http://developer.android.com/auto/images/ui/gearhead_custom_UI.png)

> Figure 4 . Google Play MusicのアプリのUI

### User Actions

プライマリUIのメディアコントロールカードは，4つのメインのアクションと，オーバーフローバーに載っている4つの補助的なアクションと，Return(戻る)アクションをサポートしています。開発者は標準的な制御を利用できるし，アクションやアイコンをカスタマイズする事もできます。

![image](http://developer.android.com/auto/images/ui/gearhead_custom_user_actions.png)

> Figure 5. Google Play Musicのユーザーアクション

### Drawer List

アクションをブラウズする為に，ドロワーの遷移というものがあります。プライマリなアプリUIからリストUIへの遷移後，ドロワーは画面中央に出現します。カスタマイズされたリストUIはMediaServiceによって提供されるメディアコンテナやオーディオフアイルを表示します。ドロわーのアイテムは同様に改造できます。

![image](http://developer.android.com/auto/images/ui/gearhead_drawer_generic.png)

> Figure 6. 汎用的なリストアイテムを含むドロワーレイアウトｎ例

![image](http://developer.android.com/auto/images/ui/gearhead_drawers_customized.png)

> Google Play Musicのドロワーレイアウトの例

### Day and Night Transitions

全てのUIは日中と夜の異なったカラースキームをサポートしています。プラットフォームが昼夜を判定し自動的にアプリの色味を調整してくれます。

![image](http://developer.android.com/auto/images/ui/gearhead_day.png)

> Figure 8. Google Play Musicの日中モード

![image](http://developer.android.com/auto/images/ui/gearhead_night.png)

> Figure 9. Google Play Musicの夜モード

#### Related resources

- [Building Apps for Auto | Android Developers](http://developer.android.com/training/auto/index.html)