OmniAICreator/Qiita-1.07M huggingface dataset:
ROS Tutorialを追いながらのまとめメモ【ROS Filesystem】

※IndigoをUbuntu上にインストールし、catkinを利用している前提のメモ ROSは初心者なので、認識が間違っていたらご容赦を
　とりあえず英語で再度読まなくてもよいくらいの情報量のメモを残す
##Tutorialの対象ページとその他の参照ページ
* 1.Navigating the ROS Filesystem http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem
* rosbash http://wiki.ros.org/rosbash

##ファイルシステムの基本的な構成単位
* **Packages**: ROS上で動作するソフトウェアを構成するために必要なライブラリ、実行可能ファイル、スクリプト、その他必要なファイルなどをまとめたもの。
* **Manifest（package.xml）**: パッケージの定義ファイルでパッケージ間の依存関係やバージョン、作者、ライセンスなどのメタ情報を記載したもの。

##ファイルシステムで利用できるツール/コマンド
UnixライクなOSで利用できるshellコマンドと操作上同等ないくつかのコマンドがある。

* *rospack*: パッケージの情報を取得するためのコマンド。findオプションをつけるとパッケージのパスを知ることができる。その他、多数のオプションあり。チュートリアルではfindオプションまでしか使っていないが、rospack -hでその他のオプションも見ることができる。チュートリアルの実行例ではroscppのパスを検索している。

* *roscd*: bashシェルコマンドをROSで便利に利用できるようにしているrosbashのコマンドでcdにあたるもの。ROSの環境変数である**ROS_PACKAGE_PATH**に指定したパス上にあるものであれば、パッケージ名指定でダイレクトにパッケージのディレクトリまで移動できる。

* *roscd log*: 上のroscdにlogオプションを付けたもので、ROSのログフォルダに移動する。一度もROSでプログラムを実行したことがない場合はログ自体が存在しないので、ログがない旨のエラー通知が返される。

* *rosls*: roscdと同様rosbashのコマンドの一つでlsにあたるもの。roscdと同様で、ROSの環境変数が設定されていれば、そのパス上にあるものは名前指定でリスト表示できる。

#### **Tab補完**
rospack findも含め上記のrosbashのコマンドは通常のshellコマンド実行時と同様に、パスが通っているものであれば、全てTabによる入力補完ができる。

##その他のrosbashコマンド
* *rospd*: pushdコマンドと同等でディレクトリ間の移動をスタックとして保持し、一度スタックにつまれたディレクトリにはスタック番号指定で移動できる。
* *rosd*: rospdと対で利用されるもので、rospdで移動したディレクトリスタックをリスト表示する。
* *rosed*: パッケージ内のファイルを編集するコマンド。パッケージ名とファイル名を引数で指定して実行する。環境変数のEDITORに指定されたエディタが起動する。
* *roscp*: cpコマンドと同等。
* *rosrun*: 任意のパッケージの実行ファイルを実行するコマンド。
Homebrewの環境構築


[homebrew_hp]:http://brew.sh/index_ja.html
[homebrew-cask_hp]:http://caskroom.io/
[Brew-file_hp]:https://github.com/rcmdnk/homebrew-file

## Xcode Command Line Tools
Homebrewをインストールするために必要となるツール類をまずはインストールします。

### Xcode Command Line Toolsのインストール

* __Mac App Store__ から __Xcode__ をインストールする。
* 以下のコマンドを __Terminal__ から実行する。

```bash:
$ xcode-select --install
```

## Homebrew
Homebrewはいわゆるパッケージ管理ツールになります。
Debian系の __apt-get__ や Redhat系の __rpm__ の OS X版といったところ。

### Homebrewのインストール
公式HP：[Homebrew][homebrew_hp]
__Terminal__ で公式HPで記載されている以下のコマンドを実行する。

```ruby:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以下のコマンドを実行し、インストールされた __Homebrew__ に問題がないかチェックする。

```bash:
$ brew doctor
```

問題があった場合は出力されるメッセージに合わせて問題を修正する。

## Homebrew Cask
__Homebrew__ だけでは、通常 ```/Applications``` に配置されるようなツール類をインストールすることができません。これを可能にするために __Homebrew Cask__ をインストールします。
__Homebrew Cask__ を導入することで __Homebrew__ で管理可能なパッケージが大幅に増加します。

### Homebrew caskのインストール
公式HP：[Homebrew Cask][homebrew-cask_hp]
__Terminal__ で公式HPで記載されている以下のコマンドを実行する。

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

## Brew-file
__Brew-file__ は __Homebrew__ および __Homebrew cask__ でインストールしたパッケージ群を管理する設定ファイルを生成し、 __git__ で管理するためのソフトウェアです。複数環境や環境の再構築が楽になります。

### Brew-fileのインストール
github：[Brew-file][Brew-file_hp]
__Terminal__ で __github__　で記載されている以下のコマンドを実行する。

```bash:
$ brew install rcmdnk/file/brew-file
```

### Brew-file用レポジトリを設定
__Brew-file__ で生成された __Brewfile__ を管理するための __git repository__ を設定します。設定に際しては、予め __github__ や __Bitbucket__ に __repository__ を作成しておいてください。

```bash:
$ brew file set_repo -r <repository>
```

### Brewfileの初期設定
__Brewfile__ を初めて生成する場合は以下のコマンドを実行し、 __Homebrew__ で既にインストールしたパッケージで初期化する。

```bash:
$ brew file init
```

### Brewfileの更新
__Brewfile__ の内容を更新した際などは以下のコマンドを使って更新する。

```bash:
$ brew file update && brew file cask_upgrade
```

また、 __Homebrew__ や __Homebrew Cask__ でインストールした際に同時に __Brewfile__ の内容を更新する場合は以下。

```bash:
$ brew file brew install <package>
$ brew file brew cask install <package>
```

```$ brew uninstall <package>``` などにより削除したパッケージの情報は __Brewfile__ に自動的に反映されないため、以下のコマンドにより編集する。

```bash:
$ brew file edit
```
【メモ】Python3 list sort

## Python3でのリストのソートについて

### 単純なリストのソート

```py3
list = [1,3,2,4]
list.sort()
print(list)
# [1, 2, 3, 4]
```
もしくはsorted()関数を使用 
*sorted関数は元のリストに影響を与えない

```py3
list = [1,3,2,4]
print(sorted(list))
# [1, 2, 3, 4]
```

##### 降順

```py3
list = [1,3,2,4]
list.sort(reverse=True)
print(list)
# [4, 3, 2, 1]
```

### 辞書型のソート

```py3
dict = {"a","c","d","b"}
print(sorted(dict))
# ['a', 'b', 'c', 'd']
```
### リスト内辞書のソート(Key指定)

```py3
list_dict = [{"no":1,"name":"Devit"},{"no":4,"name":"Josh"},{"no":2,"name":"Sam"},{"no":3,"name":"Tom"}]
print(sorted(list_dict,key=lambda x:x["no"]))
# [{'name': 'Devit', 'no': 1}, {'name': 'Sam', 'no': 2}, {'name': 'Tom', 'no': 3}, {'name': 'Josh', 'no': 4}]
# 降順
print(sorted(list_dict,key=lambda x:x["no"],reverse=True))
# [{'name': 'Josh', 'no': 4}, {'name': 'Tom', 'no': 3}, {'name': 'Sam', 'no': 2}, {'name': 'Devit', 'no': 1}]
ShinobiLayer: SoftLayerにおけるWindows Serverのハードニング(1)

# はじめに
私はどちらかというとLinuxをよく利用しているのですが、SoftLayer上でWindowsを利用されている方に、どうやってWindowsを保護すればよいのかを聞かれることもよくあります。
ググれば一杯出てきそうなものですが、典型的なものをまとめておくのは有用であろうと考えたため、今回自分がWindows環境を利用している際のセキュリティー設定を幾つかまとめて行きたいと思います。

あと、ハードニング以前の問題ですが、**パスワードを簡易なものとかに変更するなんて論外ですからね！？**　インターネット上に晒されているということを常に意識して運用しましょう。


# 1. SoftLayerのHardware firewallを購入する。

SoftLayerには、Standard Hardware firewall（１台のサーバーだけ保護。ただし、Portable IPは保護不可）と、Dedicated Hardware firewall（VLANレベルで保護）の２つがあります。もし可能であれば、このHardware firewallの配下にサーバーを配置しましょう。特にRemote Desktopは既知のポートなので、攻撃の的になります。できたらPrivate側からのみ通信を許可するようにして、Public側からは通信しないように防御した方が良いと思います。他にもVyattaやFortigate Security Applianceを利用する方法もありますが、どちらも有料です。予算があまりない環境でちょっとした環境を作りたいだけであれば、OSレベルでのfirewall設定をしっかり実施しましょう（この後紹介）



# 2. IISのRoleを外す or 停止する
SoftLayerのWindowsでは、IISが自動起動されて80番でWebサーバーが公開されているようです。使う予定がないのであれば、IISのRoleを削除するか停止（自動起動も停止）しましょう。
ちなみに、ログインする度にServer Managerが自動起動してくると鬱陶しいので、私はこのタイミングでServer Managerを自動起動しないようにしています。

##(a) IISを削除する（Roleを外す）
![IIS00.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/b7b1b8b4-a0a9-4414-8f0d-d27fe4a6f9f1.jpeg)
![IIS00_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7ff3122d-b33c-0a74-812f-0d677622508f.jpeg)


##(b) Server Managerを自動起動しないようにする
![ServerMgr00.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e780651a-4621-cdc4-25b5-744771fcc428.jpeg)
![ServerMgr01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/2689b112-1db3-0428-c0ed-b4c9b501bf25.jpeg)

（参考）
Windows Serverへのログオン時にサーバーマネージャーを自動起動させないようにする
http://www.atmarkit.co.jp/ait/articles/1501/16/news085.html

# 3. ライセンス認証を確認しWindows Updateを実施する

ライセンスが正しく登録されて、Windows Updateが利用可能な状況であることを確認します。 

* Control Panel -> System and Security -> System
![WindowsIsActivated.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/98fbc89e-cdfd-e80c-b190-c4fde2025488.jpeg)


ライセンス認証が登録されていなかったり、Windows Updateに失敗する他によくあるケースは以下のとおりです。

* private側のインターフェースが落ちていた（WSUSはPrivate側にあります）。
* Vyatta gateway applianceと組み合わせており、vyattaでPrivate側の通信が遮断されていた。
* OSの時間が正確な時刻と大きくずれていた。
* McAfeeがWindows Updateをブロックしてしまっていた。
McAfeeを一時的に停止するためには、Start画面から**VirusScan Console**を開き、**Access Protection**を一時的にDisabledに変更します。

![VirusScanConsole01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9253e7f8-bdd3-7ec5-824a-5de190006d91.jpeg)
![VirusScanConsole02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/cc54f27f-717d-fff3-8b15-fd4731830cca.jpeg)

（参考）https://support.microsoft.com/ja-jp/kb/968003/ja
エラー 0x80070005 が Windows Update で更新プログラムをインストールしようとすると表示される 

# 続きはこちら
http://qiita.com/testnin2/items/50e1ea0281c21b8cc4e4
AWSを利用したありがちなCMS

ちょっとしたCMSを思いついた。既にありそうだけど、あくまで草案レベル。

コンテンツ編集はMarkdown等を用いた手動編集。編集はローカルもしくはオンデマンドEC2インスタンス上で行う。
(ICEcoderやMarkdownプレビュー機能のあるWebエディタ等で編集することを想定)

編集したソースをソースリポジトリに git push/svn commit。
(Jenkins,Gitlab,GitBucket,GHE,SCM-Manager等、WebフックやIssueが使えるものを利用)

リポジトリのフック処理でコンテンツをコンパイルしてプレビューインスタンスを起動、インスタンスのEBS上にコンテンツ配置。
(コンパイルはJenkinsでやってもいいし、Lamdaでやってもいい)

プレビューURLをコンテンツ承認者に対してSNS等で通知。
(これもJenkinsかLamda)

承認者がプレビューを承認したらコンテンツをS3公開バケットに配置してCDNキャッシュ制御、コンテンツをmasterにマージ。差し戻す場合はIssueのAPI等でコメントを付記。
(プレビューコンテンツのヘッダには承認ボタンや差戻しボタンを配置)

プレビューインスタンスは承認・差戻しに関わらず破棄。

メリットはコンテンツ編集インスタンス、プレビューインスタンスを常時起動しない点。コンテンツ編集インスタンスとプレビューインスタンスは同一でも可。

うわ、ありそう。。。
ArrayList#subListを生成後に元のlistをsortしてはいけない

## 概要
Jdkのバージョンを新しいの(1.8.0_11 -> 1.8.0_25)に上げたらArrayList#subList絡みの処理でConcurrentModificationExceptionが発生するようになってしまいました。
以下エラーが出るようなサンプルコード

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListSortTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("bbb");
        list.add("ccc");
        list.add("aaa");

        List<String> subList = list.subList(0, 2);
        // [bbb, ccc]
        System.out.println(subList);    

        Collections.sort(list);

        // jdk1.8.0_11 -> [aaa, bbb]
        // jdk1.8.0_25 -> ConcurrentModificationException
        System.out.println(subList);    
        
    }
}
```

## 原因
### 1. Collections#sortの実装内容が変わっていた
Collections#sortでやっていた実装がList#sortのデフォルト実装に移行され、Collections#sortはList#sortに処理を委譲するようになった。

```java:1.8.0_11
// Collections#sort
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(List<T> list) {
	Object[] a = list.toArray();
	Arrays.sort(a);
	ListIterator<T> i = list.listIterator();
	for (int j=0; j<a.length; j++) {
		i.next();
		i.set((T)a[j]);
	}
}

// List#sort
default void sort(Comparator<? super E> c) {
    Collections.sort(this, c);
}
```

```java:1.8.0_25
// Collections#sort
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(List<T> list) {
	list.sort(null);
}

// List#sort
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
	Object[] a = this.toArray();
	Arrays.sort(a, (Comparator) c);
	ListIterator<E> i = this.listIterator();
	for (Object e : a) {
		i.next();
		i.set((E) e);
	}
}
```

### 2. 1の結果Collections#sortがArrayList#sortを呼ぶようになり、ArrayList#sortが呼ばれるようになった
ここで、ArrayList#modcount(正確に言うとAbstractListのメンバ)がインクリメントされるという副作用が新たに発生する事になる。

```java:ArrayList#sort
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
	final int expectedModCount = modCount;
	Arrays.sort((E[]) elementData, 0, size, c);
	if (modCount != expectedModCount) {
		throw new ConcurrentModificationException();
	}
	modCount++;
}
```

### 3. 2の結果sort後にsubListをiteratorでイテレーションする場合、ConcurrentModificationExceptionが発生するようになった

```java:ArrayList\$SubList\$ListIterator
public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= SubList.this.size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (offset + i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[offset + (lastRet = i)];
}

final void checkForComodification() {
    if (expectedModCount != ArrayList.this.modCount)  // ここのチェックに引っかかる
        throw new ConcurrentModificationException();
}
```

## その他
* LinkedListはsortメソッドの独自実装は無く、List#sort(デフォルトメソッド)を使うようになっているので、例外は発生しない
* CopyOnWriteArrayListの場合は例外が発生した
* この辺の挙動はListの実装者に委ねられている…？？

## 結論
subListをsortするためにもとのlistをsortするのは危険なのでやめよう！
Amazon S3へアップロードされたファイルの完全性の検証


## サマリ

S3へのファイルアップロードをしたあとに、そのファイルの正当性を確認したいというケースはよくあるのだろう。恥ずかしながらちゃんとやったことなかったけど。

ということでどうやって実現するのがいいかと調べてみたところ、 **S3へのPUT系のAPIには、リクエストのヘッダの中に、ファイルのMD5値を入れて送ると、PUT完了時にS3側でアップロードされたファイルのMD5値を取って検証をしてくれる** 機能があった。超便利。

こんな感じにリクエストヘッダにファイルのMD5値を埋め込む。

`Content-MD5: YOUR_FILE_MD5`

MD5の検証に失敗すると[以下のようなエラー](http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)が返ってくる。

Error Code | Description | HTTP Status Code 
-----------|-------------|-----------------
InvalidDigest | 	The Content-MD5 you specified is not valid. |	400 Bad Request

下記のように、PubObjectにもUploadPart(MultiPartUpload時の個々のパートのアップロード用API)にもその機能があることは下記のようにドキュメントで確認できる。

PubObject
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html

UploadPart
http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html

> To ensure that data is not corrupted traversing the network, use the Content-MD5 header. When you use this header, Amazon S3 checks the object against the provided MD5 value and, if they do not match, returns an error. Additionally, you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to the calculated MD5 value.

## どう使うのか

REST APIを生で使っているのであれば自分でContent-MD5を生成してヘッダに含めてやればよいと思うが、AWSが提供するツールを使う分には、ローカルでのMD5計算からヘッダに含めるところまでの実装がある程度カバーされている。すべての言語のSDKでカバーされているかは確認していないので注意。

### AWS SDK for Java
ここで実装されているのが確認できる。
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/AmazonS3Client.java

### boto

コードは見てないけどアップロード中の動作をdebugしてみて、確かにContent-MD5がPutObject時にもUploadPart時にも付与されるのを確認した。指定したディレクトリ内のファイルをS3にまるまるSyncするツールを書いてみた。[DynamoDBをロックマネージャーとして使う](http://qiita.com/imaifactory/items/05d73fd4915716f86179)で書いたものにMultiPartの機能を付けただけ、だけれども。
https://gist.github.com/imaifactory/6132f8a60461584b4613

### s3put

botoに同梱されているs3putでもContent-MD5を付与してくれるのを確認した。

### awscli

`aws s3api put-object`ではContent-MD5が付くのを確認。`aws s3 (cp|sync)`では残念ながらContent-MD5は、デフォルトではつかないようだ。

## Disclaimer

この投稿は私個人のメモであり、所属する組織や会社を代表するものではありません。
ちょっとだけアセンブラを触ってみる


とりあえず、Cからアセンブラで書いた関数を呼び出してみるテスト。

```c:main.c
#include <stdio.h>

int add(int a, int b);

int main() {
    int ret = add(3, 5);
    printf("%d\n", ret);
    return 0;
}
```

この`add`関数をアセンブラで書いてみます。（x64系想定）

```asm:add.s
section .text

global _add

_add:
    mov rax, rdi
    add rax, rsi
    ret
```

こんな感じでそれぞれコンパイル。

ちなみに `rax`, `rdi`, `rsi` の意味は以下になります。

- `rax` ... 関数の戻り値を格納する
- `rdi` ... 関数の第一引数の引数を格納する
- `rsi` ... 関数の第二引数を格納する

つまり言語化すると、
「`rax` に `rdi`（第一引数）を `mov`（移動）し、それに `rsi`（第二引数）を `add` する。そしてそれを関数の戻り値とする」
という意味になります。

```console
$ nasm -f macho64 add.s
$ gcc -c main.c
$ gcc -o main main.o add.o
```

実行すると結果が出力される。

```console
$ ./main
8
```

まだまだ分からないことだらけだけど、とりあえずアセンブラがどういうルールでなにをしているかはなんとなく分かってきた。

ちなみに `rax` とか最初は謎だったけど、それらを調べてつらつらとメモったやつは[こちらで公開](http://qiita.com/edo_m18/items/83c63cd69f119d0b9831)してます。
MacOSX Mavericksのターミナルでjavascriptを実行する

MacOSX mavericksには、jscというコマンドがあります。

```
/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc
```

## ソースコード

```
(function() {
  print("hello world!")
}());

```

## コードの実行結果

```
$ jsc test.js
hello world!
$
```
Redmine wiki で定義されているマクロの一覧を表示する

Redmine の wiki で

```
{{macro_list}}
```

とすると，定義されているマクロの一覧が表示される．

![7eb9692496ec932683551bc55d4d2c32.png](https://qiita-image-store.s3.amazonaws.com/0/8597/357ca93f-9a8d-3d9c-d310-4ac12cc2913a.png)


自分の場合 `include` とか `collapse` とか，使いたいのに頻度が少なくてすぐ忘れる．
`{{macro_list}}` 書いたページを作って `sidebar` あたりに置いておくと便利．
xpdfをインストールする


#これは
PDF操作ツールであるxpdfのインストール方法．
いくつかのサイトで`brew install xpdf`でインストールできるって書いてありますが`Error: No available formula for xpdf`って怒られる．

#どうするのか
##コマンド２つ
```
brew install Caskroom/cask/xquartz
brew install homebrew/x11/xpdf
```

##日本語対応
Language Support Packagesの xpdf-japanese.tar.gzをダウンロードして，解凍した中身を`/usr/local/share/xpdf/japanese`に置く．
あと，`/usr/local/etc/xpdfrc`を以下のように編集．

```
# コメントアウト解除
textEncoding UTF-8

# 追記
cidToUnicode    Adobe-Japan1    /usr/local/share/xpdf/japanese/Adobe-Japan1.cidToUnicode
unicodeMap  ISO-2022-JP /usr/local/share/xpdf/japanese/ISO-2022-JP.unicodeMap
unicodeMap  EUC-JP      /usr/local/share/xpdf/japanese/EUC-JP.unicodeMap
unicodeMap  Shift-JIS   /usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap
cMapDir     Adobe-Japan1    /usr/local/share/xpdf/japanese/CMap
toUnicodeDir            /usr/local/share/xpdf/japanese/CMap
```

#参考
http://akkunchoi.github.io/xpdf-japanese.html
AWS EC2をNameタグ一致で起動するためのツーライナー


ツーライナーなんて言葉があるかどうかはともかく…。

AWS CLIを利用してNameタグからインスタンスIDのみを抽出する場合は以下のようにします。TAG_NAMEという環境変数にNameタグで抽出したい内容を入れましょう。配列であることを必要としてないので、outputはtextにしています。

```
export TAG_NAME=FOOBAR
aws ec2 describe-instances \
  --filters \
  Name=tag-key,Values=Name,\
  Name=tag-value,Values=$TAG_NAME \
  --query \
  'Reservations[].Instances[].InstanceId' \
  --output text
```

上記のタグからのインスタンスID取得を用い、以下のようなコマンドを発行することでタグ名からのインスタンス起動・停止が出来ます。

```
export TAG_NAME=FOOBAR
aws ec2 start-instances \
  --instance-id \
  $(aws ec2 describe-instances \
    --filters \
    Name=tag-key,Values=Name,
    Name=tag-value,Values=$TAG_NAME \
    --query \
    'Reservations[].Instances[].InstanceId' --output text)
```
```
export TAG_NAME=FOOBAR
aws ec2 stop-instances \
  --instance-id \
  $(aws ec2 describe-instances \
    --filters \
    Name=tag-key,Values=Name,
    Name=tag-value,Values=$TAG_NAME \
    --query \
    'Reservations[].Instances[].InstanceId' --output text)
```
GS Collections

Java Day Tokyo関連で流れてきた情報。
Stream APIを越えると言われているコレクションフレームワーク。使ってみたい。

https://github.com/goldmansachs/gs-collections

http://www.goldmansachs.com/gs-collections/presentations/2015-04-08_JavaDayTokyo.pdf

http://www.infoq.com/jp/articles/GS-Collections-by-Example-1
ServerMan VPSでVLAN設定しようとしてみた

## 手順

### リポジトリ追加

\# yum install epel-release
～～省略～～
Installed:
  epel-release.noarch 0:7-5

Complete!

### vconfigパッケージ導入
\# yum install vconfig
～～省略～～
Installed:
  vconfig.x86_64 0:1.9-16.el7

Complete!

### /etc/sysconfig/networkを編集

\# vi /etc/sysconfig/network
NETWORKING="yes"
GATEWAYDEV="venet0"
NETWORKING_IPV6="yes"
IPV6_DEFAULTDEV="venet0"
VLAN="yes"　←追加
VLAN_NAME_TYPE="DEV_PLUS_VID_NO_PAD"　←追加


### 反映して、確認

\# service network restart
Restarting network (via systemctl):                        [  OK  ]

\# lsmod | grep 8021q
なぜか8021qがロードされない。。。

\# modprobe 8021q
\# lsmod | grep 8021q
これでもダメ。。。

ServerMan VPSだとVLAN設定が許可されていないのかも。。
もう少し調べてみます。。。
数値積分 > ガウス積分 / gaussian quadrature > 5点の積分例

ガウス積分という積分方法について。

#概要

積分のポイントは以下のテーブルとして用意されている。
[Gaussian Quadrature Weights and Abscissae](http://pomax.github.io/bezierinfo/legendre-gauss.html)

計算でもWeights and Abscissaeを求めることができるはず。
[sunil](http://www.physics.iitm.ac.in/~sunil/differentiate-integrate.html)さんのページにgaus_leg.cとしてweightsとabscissaeを計算するコードがある。
但し、gaus_leg.c内の関数gauleg()で得られるweight w[]とabscissa x[]はインデックスが1から使う点に注意。


#サンプルコード
例として5点のガウス積分を実装してみた。
積分式は以下のものとした。

```math
\int_{-1}^{1}{\pi}dr = [\pi r]^{1}_{-1} = 2\pi
```

```c:sample-gauss.c
#include <stdio.h>
#include <math.h>

#define IDX_WEI (0)
#define IDX_ABS (1)
#define NUM_ITEMS (5)

double cf[NUM_ITEMS][2] =
{
// weight, abscissa
{0.5688888888888889,	0.0000000000000000},
{0.4786286704993665,	-0.5384693101056831},
{0.4786286704993665,	0.5384693101056831},
{0.2369268850561891,	-0.9061798459386640},
{0.2369268850561891,	0.9061798459386640	}
};

static double myFunc(double x_)
{
	const double pi=acos(-1.0);
	return pi;
}

int main(void)
{
	double d0, xx, yy, weight;
	int idx;

	d0 = 0.0;
	for(idx=0; idx<NUM_ITEMS; idx++) {
		xx = cf[idx][IDX_ABS];
		weight = cf[idx][IDX_WEI];
		yy = myFunc(xx);
		d0 += (weight * yy);
	}

	printf("%lf\n", d0); // 2pi
}
```

```txt:実行結果
$ gcc sample-gauss.c -lm
$ ./a.out
6.283185
```
MacBook Pro RetinaでVirtualBoxを使ったときのにじみを解消する方法


MacBook Pro RetinaでVirtualBoxを起動すると疑似解像度を認識しているらしく、それより大きな解像度を設定できない上に疑似解像度に引き伸ばされるため画面がぼやけてしまいます。

そこで一旦QuickResなどのアプリでリアル解像度に設定します。
13インチモデルなら2560x1600
15インチモデルなら2880x1800

この状態でVirtualBoxを起動するとピクセルの大きさが1:1になるので、仮想OS側で1920x1440等の大きな解像度が選べるようになります。Windows7以降等HiDPIに対応したOSでは

　　コントロールパネル＞ディスプレイの設定＞テキストやその他の項目の大きさの変更

の設定で調整するとにじみなく見やすい大きさにすることができます。

Macでの作業に戻るときは、リアル解像度では文字が小さすぎるので元の疑似解像度に戻すことになると思います。QuickResを使っている場合はプロフィールを作っておくとメニューバーのアイコンからリアル解像度と疑似解像度の切り替えができます。
【Android】画面回転した場合にActivityを再生成されないようにする

AndroidManifest.xmlのActivityにconfigChangesの設定をすると、画面回転時onCreate()の代わりにonConfigChanged()が呼ばれ、Activityの再生成を回避できる。

```
<activity android:name="com.test.HogeActivity"
          android:configChanges="orientation|screenSize" >
```
指定したURLを形態素解析するスクリプト

指定したURLごと形態素解析をしてみようと実験。
正規表現でHTMLタグを除去しようとしたけど除去しきれない。

```python:urlmecab.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
import urllib
import sys
import MeCab
import re


while True:
	search_url = raw_input(u"input URL: ")
	

	def Mecab_file():	
		req = urllib.urlopen(search_url)
		dlText = req.read()

		mt = MeCab.Tagger("mecabrc")
		data = []
		p = re.compile(r"<[^>]*?>")
		sus = p.sub("", dlText)
		data.append(sus)


		node = mt.parseToNode("\n".join(data))
		words = {}
		
		while node:
			word = node.surface
			if word and node.posid >=36 and node.posid <=67:
				if not words.has_key(word):
					words[word] = 0
				words[word] += 1
			node = node.next
		word_items = words.items()
		word_items.sort()
		word_items.reverse()
		for word, count in word_items:
			print word, count
			
	if search_url:
		Mecab_file()
	else:
		break
```

MeCabの品詞IDで名詞だけを抽出。

```
if word and node.posid >=36 and node.posid <=67:
```

この部分を変更すれば色々遊べるかもしれない。
URL入力をし続ける限りループ。空白エンターでループbreak。
http://〜入力する必要あり。
データが無い場合だけSELECTの結果を保存するSQL

SELECTの実行結果を、条件に応じて別のテーブルに保存する方法を解説します。SELECTの結果を他のテーブルに保存する場合は、下記のようなINSERT分とSELECT文を合体すれば実現できます。

```sql:insert
INSERT INTO "保存先テーブル名"
(SELECT * FROM hoge );
```
今回は、保存先のテーブルに該当の結果が無い場合だけ、実行するようなSQLを考えてみます。主キーの設定等で別の実現方法もあるかと思いますが、ワーニングを出したくない場合には今回の方法が有効かもしれません。

#実行環境
##テーブル
今回は集計対象のテーブル（base)と、集計結果を保存するテーブル（ans）の２つがあると考えて下さい。
###集計対象テーブル：base
![スクリーンショット 2015-04-12 23.15.55 (1).png](https://qiita-image-store.s3.amazonaws.com/0/53918/ec9c9f05-0400-1cee-61df-64d7a4846034.png)

```sql:CREATE_TABLE_BASE
/**
 * ダミーデータ1000行を作成しbaseテーブルで保存
 **/
CREATE TABLE base AS 
SELECT 
  (RANDOM()*100)::smallint AS "年齢" 
, CASE WHEN (RANDOM()*100)::smallint %2  = 1 THEN '男性' ELSE '女性' END AS "性別"
FROM generate_series( 1, 1000); 
```
年齢と性別の２列の構成のテーブルです。
行数は12行が表示されていますが、数万行あっても構いません。
###集計結果保存テーブル：ans
![スクリーンショット 2015-04-12 23.31.19 (1).png](https://qiita-image-store.s3.amazonaws.com/0/53918/14fda78e-788b-d2e9-e5c3-4d9592889863.png)
ansテーブルには、年代、男性合計、女性合計の3列があります。年代には、集計した年齢の階級を、男女それぞれの合計人数を投入します。
今回は、年代のカラムを主キーとし、同じ年代の集計結果が投入されないようになっています。

```sql:CREATE_TABLE_ANS
CREATE TABLE ans
(
  "年代" smallint NOT NULL,
  "男性合計" bigint,
  "女性合計" bigint,
  CONSTRAINT ans_pkey PRIMARY KEY ("年代")
)
WITH (
  OIDS=FALSE
);
```
##検証環境
PostgreSQL 9.3の環境で開発・検証をしました。
#SQL
```sql:filename
INSERT INTO ans 
SELECT 
 TRUNC("年齢", -1) AS "年代" ,
 COUNT( CASE WHEN "性別"='男性' THEN 1 ELSE null END  ) AS "男性合計" ,
 COUNT( CASE WHEN "性別"='女性' THEN 1 ELSE null END  ) AS "女性合計" 
FROM base 
WHERE 
 TRUNC("年齢", -1) = 30 --30代の
GROUP BY 1 
LIMIT 1 - (SELECT COUNT(*) FROM ans WHERE "年代" = 30 );

SELECT * FROM ans WHERE "年代" = 30 ;
```
##SQLのポイント
ポイントはLIMIT句にあります。
LIMIT句の内部のサブクエリで、挿入先のansテーブルのデータの有無を確認し、レコードが存在する場合はINSERT文がLIMIT 0 の何も返却しないSQLになります。

挿入する対象のテーブルに条件に合致するレコードが存在しない時にだけ、集計が実行されます。
git > commit message / signoff > Signed-off-by:を付ける > git commit --signoff

githubのプロジェクトをいくつか見ている中で、commit messageに以下の記載があることに気付いた。

```
Signed-off-by: XXXX XXXX <xxx@xxx.com>
Acked-by: XXXX XXX <xxx@xxx.com>
Tested-by: XXX XXX <xxx@xxx.com>
```

この中で「Signed-off-by」は「誰が作業したか」わかるような署名のようだ。

[SO > What is the Sign Off feature in Git for?](http://stackoverflow.com/questions/1962094/what-is-the-sign-off-feature-in-git-for)

コミットする時に--signoffをつければ自動的に「Signed-off-by:」の行が追加されるとのこと。
```
$git commit --signoff
```

コミットする人と作業者が違う時や、複数人がsign-offした時などに有効なのだろうか?

[Gerrit2 > Signed-off-byなどの説明](http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html)

patchなどに関係してcommit messageに誰が作業したか残しておきたい時に使うようだ。
Macbook Pro の設定


## トラックパッドの設定
`システム環境設定` > `トラックパッド`

- クリックの代わりにタップ
- 右下クリックで副ボタンクリック

## 画面の明るさ
F2キーで明るくなります。

## App Storeからxcodeをインストール
1. `アプリケーション` > `ユーティリティ` > `ターミナルを起動`

```sh
xcode-select —-install 
```

Macbook Proの管理者パスワードを聞かれるので入力します。

## [Homebrew](http://brew.sh/)インストール

```sh
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

正常にインストールできたか確認します。

```sh
brew doctor 
```

エラーが表示されないことを確認すること。

## アプリケーションをインストール

```sh
brew install caskroom/cask/brew-cask
brew cask install atom
brew cask install google-chrome
brew cask install firefox
brew cask install sourcetree
brew cask install vagrant
brew cask install virtualbox
brew cask install openoffice
brew install fish
brew install git
brew install node
```

## shellの設定
### 設定ファイルのダウンロード
```sh
mkdir -p .config/fish
curl -fsSL https://raw.githubusercontent.com/ledsun/dotfiles/master/.config/fish/config.fish -o .config/fish/config.fish
```

### /etc/shellsを編集

```sh
sudo vi /etc/shells
```

`/usr/local/bin/fish`を一番下に追加します。

### 起動shellを変更
```
chsh -s /usr/local/bin/fish
```

## atomのパッケージをインストール
- atom-beautify
- autocomplete-plus
- autocomplete-snippets
- trailing-spaces

## Homebrewパッケージの更新


本体とパッケージ情報を更新します。

```
brew update
```

インストールされているパッケージを全部最新版に更新します。

```
brew upgrade
```

古いバージョンのパッケージを削除します。

```
brew cleanup
```
jQueryUI Sortableを使ってソート後の値をDBに保存するには

jQuery UIのSortableを使って、リストの並びを動的に変更し、その情報をDBに登録するアプリを作成しています。環境はSeasar2(SAStruts/S2JDBC),Java,jsp,jQuery,javascriptです。

<br>
質問があるのですが、
結論から言うと、
<br>
**ソート後の配列情報をActionクラスのメソッドに受け渡すにはどうしたらいいでしょうか？**
<br>

やりたいことと致しましては、
表題にあるとおり、jQueryUI Sortableを使ってソート後の値をDBに保存したい。と思っていて
以下の流れで行おうと思っています。

(1)ソート後の配列を取得する。
(2)その配列情報をActionクラスのupdateメソッドに受け渡す。
(3)updateしてDB情報を更新する。

今(1)はある程度わかっていて、(2)のところで悩んでいます。

状況としては、
ソート後の配列情報をログに出すことができているというところです。

```html:index.jsp
<ul class="jquery-ui-sortable">
		<h3>やることリスト(順番)</h3>
		<c:forEach var="tasks" items="${taskList}">
			<li id="item_${tasks.id}" class="ui-state-default border-color-red">
				<c:out value="${tasks.task}" />
			</li>
		</c:forEach>
	</ul>

	<script>
		$(function() {
			$('.jquery-ui-sortable').sortable({
				connectWith : '.jquery-ui-sortable'
			});
			$('.jquery-ui-sortable').disableSelection();
		});
	</script>
	<script>
		$(function() {
			$('.jquery-ui-sortable').sortable({
				update : function(ev, ui) {
					console.log($(this).sortable("serialize"));
				}
			});
		});
	</script>
</body>
</html>
```

↓画面
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/715afc4f-21a8-9a13-023d-7555ab1bb84c.jpeg)


```java:TaskForm
package jp.co.tk.form;


public class TaskForm
{
	public Long id;
	public String task;
	public String userName;
}
```

(2)のところで何がわからないかというと、
**・そもそも配列はどこに格納されているのか。**
**・どうやってその配列をActionクラスのメソッドに受け渡すのか。**ActionForm？


すいません。自分の中でも情報量が多く整理できていない文章になってしまいましたが、
もしアドバイスいただける方がいればよろしくお願いします。
Remember-Me認証とSpringSecurity

# Remember-Me認証とは

Remember-Me認証とは、ログインしたアプリケーションを閉じて、再度ブラウザを開いてアプリケーションを利用するときに、ユーザIDとパスワードを再入力することなく認証を行い、ログイン完了とする仕組みです。

ログイン画面で「ログイン情報を記憶する」などのメッセージとともに並んでいるチェックボックスを見かけます。このチェックボックスを含めた認証機構をRemember-Me認証と呼びます。

## Remember-Me認証は、Cookieを発行して行う

Remember-Me認証を利用した認証をすると、認証用のCookieをブラウザへ発行します。このCookieにはたいてい有効期限がついており、アプリケーションの利用頻度や利用ユーザ数から決定します。

当然セキュリティレベルは低くなりますので、PCを使う環境や条件を考えた上で検討するとよいでしょう。

## SpringSecurity4での設定方法

SpringSecurity4でRemember-ME認証を有効にするには、以下の手順だけです。

* SpringSecurityの設定にて、&lt;http&gt;要素の子要素に &lt;remember-me&gt; 要素を記述する
* ログイン画面にRemember-Me認証用のパラメータを設定する

1. SpringSecurityの設定

&lt;remember-me&gt;要素を追加します。

```xml:applicationContext-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
  xmlns:sec="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/security
  http://www.springframework.org/schema/security/spring-security.xsd">
  <sec:http auto-config='true'>
    <sec:remember-me 
        remember-me-cookie="sample-rememberme-token"
        remember-me-parameter="_spring_security_remember_me"
        token-validity-seconds="#{7*24*60*60}"
        use-secure-cookie="true"
        authentication-success-handler-ref="successHandler" />
  </sec:http>
</beans:beans>
```

&lt;remember-me&gt;要素の属性については次の通り。いずれも必須ではありませんが、remember-me-cookieとremember-me-parameterは設定しておきましょう。

|属性名|設定内容|
|:---|:---|
|remember-me-cookie|発行するCookie名|
|remember-me-parameter|ログイン画面でRemember-Me認証を有効にするリクエストパラメータ名|
|token-validity-seconds|Remember-Me認証で発行したCookieの有効時間(秒)|
|use-secure-cookie|HTTPSのみRemember-Me認証を有効にする場合にtrueを設定|
|authentication-success-handler-ref|認証完了後の処理を実装するSpringBeans名|

2. ログイン画面の設定

次の例は、一番よくあるチェックボックスの例です。

```html:login.html
<input type="checkbox" name="_spring_security_remember_me" id="_spring_security_remember_me" /> ログイン情報を記憶する
```

name属性、id属性は同じにしていますが必須ではありません。 **パラメータ名であるname属性をSpringSecurityのremember-me-parameterに合わせます。**
MacでbrewでPHP5.6.7にすると、opcache.soが見つからなくてエラーになる


brew upgrade したphp5.6(5.6.6->5.6.7)が、以下の様にopcache.soがねーよバーカと言われた。


```ShellScript
$ php -a
Failed loading /usr/local/Cellar/php56/5.6.7/lib/php/extensions/no-debug-non-zts-20131226/opcache.so:  dlopen(/usr/local/Cellar/php56/5.6.7/lib/php/extensions/no-debug-non-zts-20131226/opcache.so, 9): image not found
```
つらい。
ちなみに、以下の5.6.6のパスにはある。

```ShellScript
/usr/local/Cellar/php56/5.6.6/lib/php/extensions/no-debug-non-zts-20131226/opcache.so
```

以下を参考にして対応。
https://github.com/Homebrew/homebrew-php/issues/1620
opcacheを別途インストールして、設定ファイルから記述を削除すればいいっぽい。

```ShellScript
# opcache インストール
brew install php56-opcache
# 設定ファイルから記述を削除
# opcache.so を読み込まないようにするため、ext-opcache.ini をなかったことにし、php.ini からも記述を削除。
mv /usr/local/etc/php/5.6/conf.d/{ext-opcache.ini,ext-opcache.ini.bak}
vi /usr/local/etc/php/5.6/php.ini
# [opcache]
# ; Load the opcache extension
# ;zend_extension=opcache.so

```

```ShellScript
php -a
```

動いたー
NumberPickerバグの対処法

# 現象
* Android上に、NumberPickerクラスで、時間を選択できるpickerを実装した
* 18秒から、30分までの時間を設定するために、NumberPickerで実装するダイアログ
 * 18秒の表現： 0分18秒
 * 25分の表現： 25分0秒

* ダイアログを開けて、25分から、時間を設定する
![error_start_normal.png](https://qiita-image-store.s3.amazonaws.com/0/13451/93bb4e75-5840-67fd-2097-5d519eabcfe6.png)

* 25分から、0分へ変更するときに、秒の方は、設定できる最小時間が、18秒に変更されるが、1秒が表示されてしまう
![error_doing_normal.png](https://qiita-image-store.s3.amazonaws.com/0/13451/9397d490-bdd9-8430-66ab-ad9eee5d4146.png)

* 秒のpickerをちょっと触って、正しい時間が表示された
![error_end_normal.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8b4f5051-cc06-b551-51c3-bb3bc06a3f6e.png)


# 分析

* Androidの開発者向けオプションの「レイアウト境界を表示」をチェックして、上の現象を再現して、以下のコードを分析して、原因が分かった
![correct_start_frame.png](https://qiita-image-store.s3.amazonaws.com/0/13451/679db171-1a45-6788-eea9-19f62c2d2232.png)
--
![error_doing_frame.png](https://qiita-image-store.s3.amazonaws.com/0/13451/6f2b05c5-d7d8-44b1-3ab6-1dfb71f2a6fc.png)
--
![error_end_frame.png](https://qiita-image-store.s3.amazonaws.com/0/13451/5b33f994-b859-73ea-684c-5a37751a5447.png)

* layout

```
    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="秒" />
```

* activity

```
		mPicker.setOnValueChangedListener(new OnValueChangeListener() {
			@Override
			public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
			    if (currentM == 25) {
			    	sPicker.setMaxValue(0);
				sPicker.setMinValue(0);
			    } else if (currentM == 0) {
				sPicker.setMaxValue(59);
				sPicker.setMinValue(18);
			    } else {
				sPicker.setMaxValue(59);
				sPicker.setMinValue(0);
			    }
			}
		});
```

# 原因

* 秒のpickerの幅は、wrap_contentに定義されたので、25分0秒に設定するときに、幅は、0の幅だけだった
* 0分18秒に変更すると、18秒が画面を触って変更することじゃなくて、自動的に変更されて、幅は、18の幅と合っていない


# 対応

* layout修正

```
    <NumberPicker
        android:layout_width="32dp"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="秒" />
```

# 確認
![correct_start_frame.png](https://qiita-image-store.s3.amazonaws.com/0/13451/38bb5765-707e-8086-38dc-242c3eb2222d.png)
--
![correct_end_frame.png](https://qiita-image-store.s3.amazonaws.com/0/13451/088635ff-cddc-a871-55f4-340752a4f951.png)
adb導入


adbがなかったので入れました。
まず、Android Studioをインストールしました。
そしたら
`~/Library/Android/sdk/platform-tools/`
にadbがいました。

```.bashrc
export ANDROID_HOME="$HOME/Library/Android/sdk/"
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
```

```
$ source ~/.bashrc
```

でadbにパスが通りました。
gitでtagを付ける

* タグを付けたいレポジトリを`git clone`してくる
* `git tag [タグ名]`
    * 例えば、`git tag v2.0.3`みたいな
* タグが付いてるかを確認`git tag`
    * これで、つけたタグが確認出来るはずです
* リモートに反映させる
    * `git push origin [タグ名]`
    * (例) `git push origin v2.0.3`
    * ※ masterブランチでタグつけてれば、マスターの現在のコミットに対してタグを付ける事になります
Aurelia翻訳ログ (docs.html 4/13 line1 to 242)


前回に引き続き、現行日本語版と最新のdocs.htmlの違いについて紹介します。なお、ソースコードはdocs.html からの引用です。

## docs.htmlの変更 (4/13)wi

### IE9対応

Aureliaは何もしなければIE11からの対応ですが、IE9以上で動かす方法がドキュメントに追加されました。MutationObserverとWeakMap(MutationObserverが依存している)をjspmでインストールし、system.js の前に読み込めばいいそうです。

```shell
> jspm install "github:webreflection/es6-collections"
> jspm install "github:github:polymer/mutationobservers"
```

index.htmlで、

```markup
<script src="jspm_packages/github/webreflection/es6-collections@master/es6-collections.js"></script>
<script src="jspm_packages/github/polymer/mutationobservers@0.4.2/MutationObserver.js"></script>
<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
  System.import('aurelia-bootstrapper');
</script>
```

### aurelia.use.es5()

今までES5を使う場合にはconfigureで `aurelia.use.es5()` を呼べと書いてありましたが、無くなっています。必要なくなったのかな。

### decoratorが使えないとき: Decoratorsヘルパ

CoffeeScriptなど、decoratorが使えない場合のために、Decoratorsヘルパが用意されています。これをdecoratorsスタティックプロパティ、もしくはスタティックメソッドで宣言するだけです。

```coffeescript
HttpClient = require('aurelia-http-client').HttpClient;
Decorators = require('aurelia-framework').Decorators;

class CustomerDetail
  constructor: (@http) ->
  @decorators:Decorators.transient().inject(HttpClient);
```

現行のTypeScriptで使う場合もこちらでいけそうですね。

### Attached Behavior から Custom Attributeへ

Aureliaにはカスタムタグの他に、属性を追加することも出来ますが、これを今までは "Attached Behavior" と呼んでいました。これが、いつのまにかCustom Attributeになったようです。挙動が変わったのか、経緯は後で調べてみようと思いますが、ビヘイビアって翻訳しづらかったので（字面から意味がわからないという意味で)、ありがたい変更でした。
Duet Displayを使っていてマウスの座標がうまく取得できない時の対処法

oF+[Duet Display](http://www.duetdisplay.com)で簡易キオスク的なアプリを作っていると、クリック関連イベント(mousePressed,mouseReleased)の座標がうまく取れないことがある。イベント自体は発行されるものの、座標が前の位置から更新されておらず、前の場所をクリックしたことになってしまう。
ドラッグした場合はちゃんとマウス座標を取得できるので、軽くドラッグしてからタップし直すとちゃんと動く。

なんとなく調べたところ、GLUTのマウス周りで問題が起きてるらしいので、直接Cocoaから取得する方法。


```C++(oF)
void mousePressed(int x, int y, int button){
	cout << "mousePressed : " << x << ", " << y << endl;
	CGEventRef event = CGEventCreate(NULL);
	CGPoint cursor = CGEventGetLocation(event);
	x = cursor.x-ofGetWindowPositionX();
	y = cursor.y-ofGetWindowPositionY();
	cout << "mousePressed(modify) : " << x << ", " << y << endl;
}
```
CGEventGetLocationで画面内でのマウス座標を取得して、ウィンドウの位置で補正する感じ。
Laravelにおけるリレーショナルモデルの削除

## 概要

特定のモデルを削除した際に、関連するモデルを同時に削除する方法について。

## 前提となる条件

Laravel学習目的で開発した [monelytics](http://monelytics.me) のソースコードをベースに説明を進める。ソースコードは [GitHub](https://github.com/naomichi-y/monelytics) を参照。

* PHP 5.5.21
* Laravel 4.2

## 実装

### テーブル構成

ActivityCategoryGroupモデルは複数のActivityモデルを所有する (※説明を簡略化するため、ここでは最小限のカラムのみ記載する)。

```sql:activity_category_groups
CREATE TABLE IF NOT EXISTS `monelytics`.`activity_category_groups` (
  `id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
```
```sql:activities
CREATE TABLE IF NOT EXISTS `monelytics`.`activities` (
  `id` MEDIUMINT NOT NULL AUTO_INCREMENT,
  `activity_category_group_id` MEDIUMINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
)
```

### モデル構成

ActivityCategoryを削除した際に紐付きのあるActivityレコードを削除するには、ActivityCategoryモデルにboot()メソッドを追加する。

```php:app/models/ActivityCategory.php
class ActivityCategory extends Model {
  public function activity()
  {
    return $this->hasMany('Activity');
  }

  public static function boot()
  {
    parent::boot();
 
    static::deleting(function($activity_category_group) {
      $activity_category_group->activity()->delete();
    });
  }
}
```

boot()メソッドはレコードの登録や削除の際にコールされるイベントリスナであるため、ここにdeleting()というメソッドを追加する。これによって、ActivityCategory::delete()がコールされたタイミングで関連するActivityモデルが削除されるという仕組みである。

尚、ここでは紹介していないが、A HasMany B HasMany Cといったモデル構成の場合も基本的に同様の流れとなる。サンプルコードは [User::boot()](https://github.com/naomichi-y/monelytics/blob/master/source/app/models/User.php) のソースコードを参照。
リダイレクトされたページで、SERVER変数ってどうなるのか？


スクリプトそれ自身を取得する`$_SERVER`、例えば、`$_SERVER['PHP_SELF']`などのアレです。これらはリダイレクトされたページではどのように値をもっているのか、実験しました。

ドキュメントルートに.htaccessを配置

```Apache:.htaccess
ErrorDocument 404 /404.php
```

同じく、ルートに 404.php

```php:404.php
<?php
http_response_code(404);
var_dump($_SERVER);
```

単なる実験コードなんで、これでいいでしょう。

では実際に、存在しないページにアクセスします。

`http://example.com/missing.php`

するとこのような結果になりました。

|変数名|表示された値|
|:-----------|:-----------|
|SCRIPT_FILENAME|/var/www/html/404.php|
|**REDIRECT_URL**|**/missing.php**|
|REQUEST_URI|/missing.php|
|SCRIPT_NAME|/404.php|
|PHP_SELF|/404.php|

REDIRECT_URL って初めて見ましたwww

クエリ文字列がついた時にどうなるかもあわせて実験。

`http://example.com/missing.php?id=100`

|変数名|表示された値|
|:-----------|:-----------|
|SCRIPT_FILENAME|/var/www/html/404.php|
|**REDIRECT_QUERY_STRING**|**id=100**|
|**REDIRECT_URL**|**/missing.php**|
|REQUEST_URI|/missing.php?id=100|
|SCRIPT_NAME|/404.php|
|PHP_SELF|/404.php|

おおっー。こちらも初めまして、ですね。REDIRECT_QUERY_STRING

これらはもちろん、PHPの仕様とかじゃなくて、WEBサーバーの仕様・設定次第なので、どの環境でもこうなるものではありませんが、当方、CentOS, Apache2.2.4の環境ではこのようになりました。
atom-shell でグローバルなキーボードショートカットを使う

# TL; DR

* `require('global-shortcut') を使う`
* イベントハンドラの登録は `app.on('ready')` イベントの中で行う

# やりたいこと

Mac でいう Alfred みたいな常駐型キーワードランチャー的な何かが作りたいので、キーボードショートカットで画面が現れたり隠れるようにしたい。

# やってみた

コードの全体は [こちら](https://github.com/yuya-takeyama/atom-shell-practice/tree/master/shortcut_keys) に置いてます。

```js:main.js
var app = require('app');
var BrowserWindow = require('browser-window');
var globalShortcut = require('global-shortcut');

require('crash-reporter').start();

var mainWindow = null;

app.on('window-all-closed', function() {
  app.quit();
});

app.on('ready', function() {
  mainWindow = new BrowserWindow({width: 800, height: 600});

  mainWindow.loadUrl('file://' + __dirname + '/index.html')

  mainWindow.on('closed', function() {
    mainWindow = null;
  });

  var displayWindow = true;

  var ret = globalShortcut.register('Ctrl + Shift + x', function() {
    if (displayWindow) {
      mainWindow.hide();
      displayWindow = false;
    } else {
      mainWindow.show();
      displayWindow = true;
    }
  });

  if (!ret) {
    console.log('registration fails');
  }
});
```

大事なのは `globalShortcut.register()` によるイベントハンドラの登録を `app.ready('on')` の中で行うことです。
その前に登録しようとすると、起動時に以下のようなエラーとともに異常終了します。

```
$ ~/Downloads/Atom.app/Contents/MacOS/Atom .
[24383:0413/032658:FATAL:global_shortcut_listener_mac.mm(64)] Check failed: BrowserThread::CurrentlyOn(BrowserThread::UI).
[1]    24383 trace trap  ~/Downloads/Atom.app/Contents/MacOS/Atom .
```

# 参考

* [global-shortcut](https://github.com/atom/atom-shell/blob/master/docs/api/global-shortcut.md)
Hyper-V上のLinuxのHDD容量拡張


Hyper-VでVineLinuxを動かしているのだが、ここんとこ容量不足に度々なりサービス停止したりしていたので、思い切って拡張してみた。
VineLinux上では64Gまでなのだが、Hyper-Vでは最大120Gまで割り当ててある。

```
/dev/sda1 /boot
/dev/sda2 /
```

今回はsda2を拡張する。
LVMはこんな感じ

```
/dev/VolGroup00/LogVol00
/dev/VolGroup00/LogVol01
```

基本的にやりかたは、ここを参考にした。
http://blog.livedoor.jp/stock_value/archives/51513774.html

途中、fdiskでパーティション削除、再作成を行うので、ビビるが問題はない。

1,fdiskで/dev/sda2を削除、再作成

```
# fdisk
d → [Partition number] 2
n → [Command action] p → [Partition number] 2
t → [Partition number] 2 → [Hex code] 8e
```

2,再起動
再起動直後のpvscanが↓のようだったので、焦ったが、

```
# pvscan
  PV /dev/sda2   VG VolGroup00   lvm2 [63.88 GiB / 32.00 MiB free]
  Total: 1 [63.88 GiB] / in use: 1 [63.88 GiB] / in no VG: 0 [0   ]
```

数分後に再度pvscanすると思った通りになった。56Gの空きができた。

```
# pvscan
  PV /dev/sda2   VG VolGroup00   lvm2 [119.88 GiB / 56.03 GiB free]
  Total: 1 [119.88 GiB] / in use: 1 [119.88 GiB] / in no VG: 0 [0   ]
```

3,リサイズ
ここで、以下のコマンドで無事拡張成功。

```
# lvresize -L +56G /dev/VolGroup00/LogVol00
  Extending logical volume LogVol00 to 117.88 GiB
  Logical volume LogVol00 successfully resized
# pvscan
  PV /dev/sda2   VG VolGroup00   lvm2 [119.88 GiB / 32.00 MiB free]
  Total: 1 [119.88 GiB] / in use: 1 [119.88 GiB] / in no VG: 0 [0   ]
# resize2fs /dev/VolGroup00/LogVol00
  resize2fs 1.41.14 (22-Dec-2010)
  Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
  old desc_blocks = 4, new_desc_blocks = 8
  Performing an on-line resize of /dev/VolGroup00/LogVol00 to 30900224 (4k) blocks.
  The filesystem on /dev/VolGroup00/LogVol00 is now 30900224 blocks long.
```

因みにHyper-VマシンでのVHDファイルを見ると、サイズは変わっていない。動的に増えるようなので、問題はないと思う。
Djangoでprefetch_relatedを便利に使う


社内でDjangoプロジェクト増えてきて、イケてないクエリも増えてきそうなので簡単にメモを残す。

ORMを使って何も考えずにforeign keyの逆参照を取ってきたりMany-to-Manyの参照先を取得する際に、ループの度にクエリを飛ばして悲惨なことになるので、prefetch_relatedを使っとけという話

普通のForeign Keyならselect_relatedで必要な階層分引っ張ることが出来る。


## 普通に使う

とりあえずこんなモデル

```python
from django.db import models

class Campaign(models.Model):
    name = models.CharField(max_length=255)
    created_at = models.DateTimeField()

class Creative(models.Model):
    name = models.CharField(max_length=255, default="")
    campaign = models.ForeignKey(Campaign)
    created_at = models.DateTimeField()
```

CreativeからCampaignを引く場合はselect_relatedを使ってあげればループの度にCampaignをselectせずにjoinしてまとめて取ってきてくれる。

```python
for creative in Creative.objects.all().select_related():
	print(creative.campaign)
```

CampaignからCreativeの一覧を引っ張る場合はprefetch_relatedを使うと良い

```python
for campaign in Campaign.objects.all().prefetch_related("creative_set"):
	print(campaign.creative_set.all())
```

joinではなく一度全部Campaignを引っ張ってきて、campaign.idのリストをwhere inして引っ張ってきている様子。まぁ毎回飛ぶより良いし大抵の場合において問題なさそう。

ちなみにcreativeでcampaignを絞るのは普通にクエリでかける

```python
Campaign.object.filter(creative_set__name="aaa")
```

## Prefetchオブジェクトを使う

単純にprefetch_relatedを使うだけだと、XXXX_set.all()の物しか取得できない。creative_setに対して絞込等を掛けるとループの度にqueryが飛んでとても悲しいことになる。

```python
for campaign in Campaign.objects.all().prefetch_related("creative_set"):
	print(campaign.creative_set.filter(name__startswith="hoge"))
```

そこで、逆参照やMany-to-Manyの先をfilter使って絞り込みたい場合や、並び順を指定したい場合は、Djangoの1.7から入ったPrefetchオブジェクトを利用する。こいつのお陰でだいぶDjangoのORMもマシになった気がする。

```python
from django.db import models
from django.db.models import Prefetch

for campaign in Campaign.objects.all().prefetch_related(Prefetch("creative_set", queryset=Creative.objects.filter(name__startswith="hoge").order_by("-created_at"), to_attr="creatives")):
	if len(campaign.creatives) > 0:
        print(campaign.id, creatives[0].id)
```

これだとCampaignが何個あってもクエリが2回しか飛ばなくてお得。


## クエリ見る

クエリのチューニングをする際は、Django Shellを使ってクエリの確認をすることになると思うので、shellでクエリをぶっ叩いた時にSQL文が表示されるようにloggerをいじると良い。普通にやっているとログの設定をいじっているとは思うが、クエリの調査の時だけはdjango.db.backendsのloglevelをDEBUGにしておくと幸せになる。

```python:settings.py
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        },
    }
}
```

view単位のチューニングの場合は、django-debug-toolbarを使ってクエリの確認をするのが基本
Apacheの起動

`service httpd start`
Apacheを起動する。

`service httpd stop`
Apacheを停止する。

`service httpd restart`
Apacheを再起動する。

`/etc/init.d/httpd status`
Apacheの状態確認をする。

※httpdとapachectrの違い
参考
http://okwave.jp/qa/q1237460.html
Red Hatがなんちゃらかんちゃら...。
Amazon Lambdaのチュートリアルをいじってみた　(1)


# Amazon Lambdaのチュートリアルをやってみた。

コード実行までの時間　5分

## Amazon Lambdaとは

Amazon Lambdaはいままでのようなインスタンスの管理がまったくいらない
コンピューティングプラットフォーム。  
Web Console上からソースコードを入力し実行するだけで、
処理を行うことができる。


## Resionの選択
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/7dfb602f-7516-0098-5cd4-b026c50ff8ad.jpeg)

Amazon Lambdaは、US.East,EU,US Westのみ
提供されている。


今回は、US Eastを選択する。

## Amazon Lambdaの開始

`Get Started Now`を選択


## New Function の作成


### Name , Descriptionの設定

- name : lambdasample
- Description(任意)
- role : basic execution roleを選択する。  
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/2adeee9d-1939-eb1a-f137-f4cde94338b7.jpeg)

![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/0f68601f-6b28-e1e3-b6e3-522067aa40f4.jpeg)

lambdaを実行するためのIAM roleが新規に作成される。
内容を確認し、`Allow`を選択する。

設定画面に戻るので、`create Lambda function`を押す 。
これで、functionの作成完了。

### 作成したfunctionを試す

Lambda : Function list　の画面のActions > Edit/Testを選択する  
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/dcd62d7d-a113-124b-499f-dbce5143337d.jpeg)

###　Invoke を押すと実行が試せる。

![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/f704fde2-f6d0-6961-dddc-d4f9ac554970.jpeg)

## ログの参照

Lambdaが実行されたときのlogは、Log GroupsとしてCloudwatchに作成され出力されている。

![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/3ef380c3-a6cd-a02e-6127-4d89bfa873c7.jpeg)

## 感想

開始から数分でコードの実行ができた。  
インスタンスを用意することなく、簡単なコードであれば、ファイルをアップロードするなどしなくても実施できるのでソースコードのみに集中できる。
細かい単位のfunctionを作るようにし、sample eventから試せるように設計すれば、単体でのテストも本番の環境と同じ場所でテストできる。
windows7でvagrantとxdebugとphpstormつかってリモートデバッグする際に気をつけること

悩んだのでメモ書き。

xdebug.remote_hostは192.168.33.1で指定したのですが、上手く通ってくれず。

Laravelを使ってたので、コマンドライン用にも設定をしてて、コマンドラインでのxdebugは何故かローカルネットワークであれば通ってphpstormも反応してくれていたので謎だった。

原因を判明させるため、Wiresharkで対象の192.168.33.xのネットワークを確認した所、こっちまでは来ていることが判明。

後に、Windowsのファイアウォールが悪さをしていることがわかり、受信ポートを開けました。

それでも通信が出来なかったので、詳しく調べてみるとVagrantのネットワークはパブリックネットワークになるらしい。

それで、色々見てたらPHPStormがパブリックネットワークでの受信を拒否していたことが判明。この設定を許可にすることで改善することが出来ました。

5時間くらい悩んでたけど、解決できてよかった・・・
AndroidでPDFファイルの表示

PDFの表示に関してはAndroid 5.0からはAPIが追加されていますが、
４系の端末で表示する方法を調べた時に、意外と情報が出てこなかったので残しておきます。

## 方法

自分が見つけた方法は以下の２つ。

* [JoanZapata / android-pdfview](https://github.com/JoanZapata/android-pdfview)
    * ローカルのpdfファイルを表示できるライブラリ
* [mozilla / pdf.js](http://mozilla.github.io/pdf.js/) 
    * Android標準のブラウザで表示できる

表示するpdfが沢山あったら[pdf.js](http://mozilla.github.io/pdf.js/)使ったほうが良さそうですが、
今回は1ファイルしか表示する必要が無かったので、[android-pdfview](https://github.com/JoanZapata/android-pdfview)の方を使用しました。

## android-pdfviewの使い方

gradleに記述

```build.gradle
dependencies {
    compile 'com.joanzapata.pdfview:android-pdfview:1.0.+@aar'
}
```

assetsにpdf追加

![pdf_assets.png](https://qiita-image-store.s3.amazonaws.com/0/64426/b76a4b81-1402-5dac-294a-e0cc35fb89e0.png)

レイアウトxmlに追加

```
    <com.joanzapata.pdfview.PDFView
        android:id="@+id/pdfview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
```

呼び出し方

```MainActivity.java
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PDFView pdfView = (PDFView) findViewById(R.id.pdfview);
        pdfView.fromAsset("sample.pdf")
                .defaultPage(1)
                .showMinimap(false)
                .enableSwipe(true)
                .load();
    }
}
```

今回は使わないので記述していませんが、他にListener付けたりとかもできるみたいです。
UE4.7でテキストファイルを読み込んでログに出力

ゲームディレクトリは`FPaths::GameDir()`で取得するようです。

ログを見るには、「ウィンドウ」→「デベロッパーツール」→「出力ログ」です。

```cpp
FString dir = FPaths::GameDir();
UE_LOG(LogTemp, Warning, TEXT("current directory: %s"), *dir);

FString filename = dir + "t.txt";
FString s;
FFileHelper::LoadFileToString(s, *filename);
UE_LOG(LogTemp, Warning, TEXT("transform: %s"), *s);
```
Fedora での vim の構築手順

Fedora 21 にて yum でインストール可能な vim (`vim-enhanced`) は (`2015/04/12` 時点) `7.4.475` と少し古いので、新し目の vim の構築手順を記します。

# 前提

- version は `v7.4.692` を利用します。
- `gui=gtk2` で構築します。
- インストール先は `/opt/vim/v7-4-692/` とします。

# 依存パッケージのインストール

以下のコマンドでインストールします。 (X関連のパッケージが足りないかも)

```console
$ sudo yum install gcc make autoconf ncurses-devel perl-devel perl-ExtUtils-Embed ruby-devel python-devel python3-devel lua-devel luajit-devel gtk2-devel libXt-devel
```

# ソースコードの clone

git をインストールします。

```console
$ sudo yum install git
```

ソースコードをクローンします。

```console
$ git clone git://github.com/vim/vim.git
```

# 対象のバージョンに切り替える。

ハイフン区切りで区切られたタグがあるので、指定します。

```console
$ cd vim
$ git checkout v7-4-692
```

他にどのようなタグがあるか知りたい場合は、 `git tag` コマンドでバージョンに対応したタグが出力されるので、適宜指定してください。

# vim のビルド

```console
$ cd src
$ make autoconf
$ ./configure \
>   --prefix=/opt/vim/v7-4-692 \
>   --with-features=huge \
>   --enable-gui=gtk2 \
>   --enable-multibyte \
>   --enable-perlinterp=dynamic \
>   --enable-pythoninterp=dynamic \
>   --enable-rubyinterp=dynamic \
>   --enable-luainterp=dynamic \
>   --with-lua-prefix=/usr \
>   --with-luajit \
>   --enable-gpm \
>   --enable-cscope \
>   --enable-fontset \
>   --enable-fail-if-missing
$ make
```

# vim のインストール

```console
$ sudo make -p /opt/vim/v7-4-692
$ sudo make install
```

# 最後に

上記手順で `/opt/vim/v7-4-692/` 配下に vim がインストールされます。

最後に適宜 `PATH` に追加し利用ください。

# 参照

- [Ubuntuでkaoriyaパッチとmigemoを有効にしてVimをビルド - Qiita](http://qiita.com/baboocon/items/bd8b4c7bdea038a6cb8e)
- [vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト](http://vim-jp.org/docs/build_linux.html)