OmniAICreator/Qiita-1.07M huggingface dataset:
Typescriptのinterfaceの使い方

##はじめに
インターフェース自体をあまり理解できていない為使い所がわからなかった。
そのこで、調べたことをまとめてみました。


##インターフェースとは
中身の実装を持たず、メンバーや型の定義だけ持つ。
（よくわからない説明になってしまいました）

##使い方

###◎基本的な使い方
**implements**キーワードを使用して、インターフェースを実装します。
classの継承の時にextendsを使用するのと似てます。


インターフェースを実装している場合、インターフェースに存在するメンバーと同じ名前のメンバーが
必ず存在している必要があります。

```Typescript
interface MyInterface{
	name:string
}

class MyClass implements MyInterface{
	name:string;//このメンバーがない場合コンパイルエラーとなる。
}
```
インターフェースのメンバー全てがpublicとなる為、
アクセス修飾子がprivateの場合もコンパイルエラーとなる。


```Typescript
interface MyInterface{
	name:string
}

class MyClass implements MyInterface{
	private name:string;//コンパイルエラー
}
```

関数を指定する場合

```Typescript
interface MyInterface{
	getName():void;
	getDetail():{address:string};
}

class MyClass implements MyInterface{
	getName(){
	}
	getDetail(){
		return {
			address:'TOKYO'
		}
	}
}
```

###◎関数のパラメーターをまとめて定義する

関数引数として、オブジェクトを渡す際にインターフェースを使用する。
インターフェースで設定したメンバーが、引数の値に存在しない場合はコンパイルエラーとなる。	

```typescript
interface MyParams{
	param1:string;
	param2:number;
	param3:{key:string}
}

function myFunc(params:MyParams){
}

myFunc({param1:'A',param2:123,param3:{key:'KEY'}});
myFunc({param1:'A',param2:123});//コンパイルエラーとなる
```

###◎オブジェクトの型にinterfaceを利用する
オブジェクトの型定義としてインターフェースを利用することもできる。

```Typescript
interface MyIterface {
	name:string
}

var myObj:MyIterface = {name:'A'};
var myObj2:MyIterface;
var myObj3:MyIterface = 'A';//コンパイルエラーとなる。
```

###◎配列の型にインターフェースを利用する
同じインターフェースを実装していれば、違うクラスでもまとめて扱うことができる。

```typescript
interface MyIterface {
	name:string
}

class A implements MyIterface{
	name = "A";
}

class B implements MyIterface{
	name = "B";
}

class C implements MyIterface{
	name = "C";
}

var myArray:MyIterface[] = [new A(),new B(), new C()];
```

##インターフェースの継承
インターフェースはクラス同様に**extends**キーワードを使用して継承することができる。

```Typescript
interface MyIterface {
	name:string
}

interface SubInterface extends MyIterface{
	sex:string
}

class Myclass implements SubInterface {
	name = 'A';
	sex = 'B';
}
```

##複数のインターフェースを実装する
インターフェースを実装する際に、インターフェース名をカンマで区切ると複数のインターフェースを実装できる。

```Typescript
interface MyIterface {
	name:string
}

interface SubInterface {
	sex:string
}

class Myclass implements MyIterface,SubInterface {
	name = 'A';
	sex = 'B';
}
```	

##interfaceのメリット
・同じinterfaceを実装しているクラスは、同じメンバーが必ず存在することが保証される。
・関数の引数がオブジェクトの際に型を定義するのに便利。
・コンパイルの支援の為に存在する為、コンパイル後のソースには影響しない。
Day OneでDropboxでSyncしてるときにおかしくなってゴミファイルが大量にできたときの対処

## Day Oneでゴミファイルが大量にできたときの対処
DayOneを、Dropboxを使ってSyncしているのですが、何かのタイミングでiPhoneで保存したデータがうまく同期されず、Macの方で同期した際にゴミファイルを大量に作り続ける状態になってしまいました。
その状況がこんな感じ。

```sh
cd path/to/entries
ls -a | head -n 20 | pbcopy
.
..
00A55795349B490AB48423D7F7A24B25 (1).doentry
00A55795349B490AB48423D7F7A24B25 (2).doentry
00A55795349B490AB48423D7F7A24B25 (3).doentry
00A55795349B490AB48423D7F7A24B25 (4).doentry
00A55795349B490AB48423D7F7A24B25 (5).doentry
00A55795349B490AB48423D7F7A24B25 (6).doentry
00A55795349B490AB48423D7F7A24B25 (7).doentry
00A55795349B490AB48423D7F7A24B25.doentry
00D165F88B834490BD7EBE31263D08E0 (1).doentry
00D165F88B834490BD7EBE31263D08E0 (2).doentry
00D165F88B834490BD7EBE31263D08E0 (3).doentry
00D165F88B834490BD7EBE31263D08E0 (4).doentry
00D165F88B834490BD7EBE31263D08E0 (5).doentry
00D165F88B834490BD7EBE31263D08E0 (6).doentry
00D165F88B834490BD7EBE31263D08E0 (7).doentry
00D165F88B834490BD7EBE31263D08E0.doentry
01501B8156094CE68E1FDAEB8CEA3867 (1).doentry
01501B8156094CE68E1FDAEB8CEA3867 (2).doentry
```

同じエントリーがたくさんあってかなり残念なので重複したファイルを削除しました。
`find . -name "*(*" -exec rm "{}" \;`

DayOneを起動すると削除された分のエントリーが消えてスッキリ。
Sync先を他のもの（Day One Syncとか) に変更した方がよいのかなー
WPF ListBoxのSeletedItemsにデータバインディングする。

久しぶりにWPFのListBoxを使ったのですよ。
そうしたら、複数選択しているアイテムをデータバインディングできない。
単数の選択したものは、できるのですが、複数がない。

MVVM的に作れないじゃないですかー。

そういえば、[Mouse Event Commands for MVVM](http://www.codeproject.com/Tips/478643/Mouse-Event-Commands-for-MVVM)
で、どのコントロールのマウスイベントもデータバインディングさせるというとても便利技があったので、これの応用でやってみた。

```csharp:filename

public class ListBoxBehaviour
    {  
        public static readonly DependencyProperty SeletedItemsProperty =
            DependencyProperty.RegisterAttached("SeletedItems", typeof(IList), typeof(ListBoxBehaviour), new PropertyMetadata(new PropertyChangedCallback(SeletedItemsChanged)));
        static void SeletedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ListBox element = (ListBox)d;
            element.SelectionChanged += Element_SelectionChanged;
        }

        static void Element_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBox element = (ListBox)sender;
            element.SetValue(SeletedItemsProperty, element.SelectedItems);            
        }

        public static void SetSeletedItems(UIElement element, IList value)
        {
            element.SetValue(SeletedItemsProperty, value);
        }

        public static IList GetSeletedItems(UIElement element)
        {
            return (IList)element.GetValue(SeletedItemsProperty);
        }
    }

```

これをWPFで参照するようにして。

```csharp:filename
 <ListBox MyControl:ListBoxBehaviour.SeletedItems="{Binding SelectedQuestion,Mode=TwoWay}" >

```

こういう感じに書くて、VM側は、IListで受けるようにすると、VM側で選択されているアイテムの取得ができる。

はじめから用意していてよ・・・。

ネタ元のマウスイベントをデータバインディングさせる技もそうですが、こういう感じにやれば、標準ではできない、イベントなりプロパティを強引にデータバインディングできますね。
Microsoft Word 文書において、非表示データ/個人情報を削除する方法


## はじめに

ドキュメントを共有する際、プロパティー（メタデータ）として
個人情報を残しておきたくない場合がある。

誰が書いたものかバレたら困る！等の場合に、活用出来そうなので削除方法をメモする。

## 削除方法

 * 1. 検査対象の Word 文書を開く。
 * 2. [ファイル] タブをクリックし、[情報]をクリックする。
 * 3. [共有準備] の [問題のチェック] をクリックし、[ドキュメント検査] をクリックする。
 * 4. 検査対象のデータの種類に対応するチェックボックスをオンにする。
 * 5. [検査] をクリックする。
 * 6. プレゼンテーションから削除する項目の検査対象の隣にある [すべて削除] をクリックする。

## 非表示のデータと個人情報の種類

 * コメント、変更履歴、バージョン、インク注釈
 * 文書のプロパティと個人情報
 * ヘッダー、フッター、透かし
 * 隠し文字
 * ドキュメントサーバーのプロパティ
 * カスタム XML データ

### 備考

https://support.office.com/ja-jp/article/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E6%A4%9C%E6%9F%BB%E3%81%97%E3%81%A6%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-356b7b5d-77af-44fe-a07f-9aa4d085966f?ui=ja-JP&rs=ja-JP&ad=JP
IntelliJ IDEA に設定した項目

# とりあえず設定した内容

- Appearance & Behavior
    - Appearance
        - Theme
            - Darcula
        - Override default fonts by
            - Name
                - Meiryo UI
            - Size
                - 14
    - System Settings
        - HTTP Proxy
- Keymap
    - Keymaps
        - Emacs
- Editor
    - General
        - Appearance
            - Show line numbers
                - checked
            - Show method separators
                - checked
            - Show whitespaces
                - Trailing
                    - checked
    - Colors & Fonts
        - Font
            - Scheme
                - Save As
                    - My Darcula
            - Editor Font
                - Show only monospaced fonts
                    - checked
                - Primary font
                    - Source Code Pro
                - Size
                    - 16
                - Line spacing
                    - 1.1
    - Code Style
        - Python
            - Tabs and Indents
                - Use tab character
                    - no checked
                - Tab size
                    - 8
                - Indent
                    - 4
                - Continuation indent
                    - 8
    - File Encodings
        - IDE Encoding
            - ShiftJIS
        - Project Encoding
            - ?
- Tools
    - Terminal
        - Shell path
            - "C:\Program Files (x86)\Git\bin\sh.exe" --login -i
        - Tab name
            - Git bash
RailsでのNamespace付きの定数を参照する順番


少しイレギュラーとも思えるような参照の仕方をしていたので、メモ

### 現象
`Image`を定義する。
そのあと、`Post::Image`を定義していない状態で、`Post::Image`を呼び出すと下記のような警告がでるものの`Image`を参照しにいく。

```
warning: toplevel constant Image referenced by Post::Image
```

もちろん、`Image`が定義されていない場合は例外が発生する。

`require`がされておらず、定数を定義できていなかった場合などのケアレスミスでも、参照されてしまう。
紛らわしいの例外を発生させて欲しい。
RxSwiftで双方向データバインディング

　FunctionalReactiveProgramming(FRP)の勉強中です。
まだ正直なところ**『なるほど，分からん』**という状態ですが
RxSwiftをおっかなびっくり触ってみた結果を整理しようと思います。
(触ってみたら動いたレベルなので他に良い使い方があるかも......です)

#1. RxSwiftとは？
　ReactiveX(Reactive Extension)という，FRPを実現するためのライブラリのSwift実装です。
Swift実装以外にもJavaScriptやJava，C#など様々な言語で実装されたライブラリがあるようです。
(AndroidだとRxAndroidとかあるみたいですね)

[RxSwift](https://github.com/ReactiveX/RxSwift)

#2. どんなことが出来るの？
　分かりやすいポイント(というか自分が現状で理解できた範囲では)
**「データバインド」**と**「Promiseパターン」**を簡単に実現できるようになります。
アプリの実装レベルで言うと，画面描画処理が楽になる(データの変更がViewに伝搬する)ことと
コールバック地獄になりがちな非同期処理をスッキリ書けるようになることが恩恵ですね。
※今回はデータバインドだけについて書いてみます。

#3. 導入するには？
　CocoaPods先生に頼りましょう。

```console:Podfile
# Podfile
use_frameworks!
pod 'RxSwift', '~> 2.0.0-beta'
pod 'RxCocoa', '~> 2.0.0-beta'
pod 'RxBlocking', '~> 2.0.0-beta'
```
　pod installで上記3つのライブラリが導入されます。

#4. 単方向バインディングをやってみる
　UITextField→ViewModelにバインドしてみます。

```swift:ViewController
import UIKit
import RxSwift
import RxCocoa
import RxBlocking

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    let viewModel = ViewModel()
    let bag       = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        bindViewAndModel()
    }

    /**
     データバインド設定
     */
    private func bindViewAndModel() {
        textField.rx_text.subscribeNext { [unowned self] text in
            self.viewModel.text = text
        }.addDisposableTo(bag)
    }   
} 
```

　UITextFieldが変わる度に，subscriveNextで渡したClosureが作動します。
結果，ViewModelの変数textが同期して更新される...といった形になります。

# 5. 双方向バインディングをやってみる
　今度は、UITextField←→ViewModelの双方向バインディングです。
ちょっと調べてみるとRxSwiftの中の人がこんなことを仰ってました。

[two-way binding](https://github.com/ReactiveX/RxSwift/issues/152)

>Two way binding are just two unidirectional bindings :).

　ただの単方向バインディング2つを合わせりゃ双方向バインディングだよ，と。
一発で双方向バインドする方法はないから，交互にバインドするしかない……？
というわけで試してみました。

　今度はViewModel側からもBindするので，ちょっとViewModelを書き換えます。

```swift:ViewModel
import Foundation
import RxSwift

class ViewModel {
    
    var text:Variable<String> = Variable<String>("森伊蔵とキッコロ")

    init() {
        // 初期化
    }
}
```

　String型ではなく，RxSwiftが提供するVariable型で定義します。
Variable型を使うことで，バインド用の関数が使えるようになります。
で，ViewController側にもViewModel→ViewControllerのバインド設定を追加。

```swift:ViewController
    /**
     データバインド
     */
    private func bindViewAndModel() {
        textField.rx_text.subscribeNext { [unowned self] text in
            self.viewModel.text.value = text
        }.addDisposableTo(bag)
        viewModel.text.bindTo(textField.rx_text).addDisposableTo(bag)
    }
}
```

　ViewModel→UITextFieldへのバインドは，bindTo関数だと上手くいくようです。
コードからViewModelの値を変えてあげると連動してUITextFieldの値も更新されます。
tvOS用CマクロとSwift API Availability

# はじめに
Xcode 7.1（iOS 9.1 / OS X 10.11 / watchOS 2.0 / tvOS 9.0, Apple LLVM version 7.0.0 / Apple Swift version 2.1 / clang-700.1.76 / swiftlang-700.1.101.6）から、追加されたtvOS用CマクロとSwift API Availabilityを紹介する。

# tvOS用Cマクロ

## TARGET_OS_TV

`TargetConditionals.h`

```c
#define TARGET_OS_IPHONE            1
#define TARGET_OS_IOS               0
#define TARGET_OS_WATCH             0
#define TARGET_OS_TV                1
```

Apple TVで実行するコードを生成するときに定義される（`TARGET_OS_IPHONE`も1）。
なお、iOSの場合は以下のように定義される。

```c
#define TARGET_OS_IPHONE            1
#define TARGET_OS_IOS               1
#define TARGET_OS_WATCH             0
#define TARGET_OS_TV                0
```

## \_\_TVOS_9_0

`Availability.h`

```c
#define __TVOS_9_0       90000
```

tvOSのバージョン番号を定義する。

## \_\_TVOS_UNAVAILABLE, \_\_TVOS_PROHIBITED

`Availability.h`

```c
#define __TVOS_UNAVAILABLE __OS_AVAILABILITY(tvos,unavailable)
#define __TVOS_PROHIBITED  __OS_AVAILABILITY(tvos,unavailable)
```

両者ともtvOSで利用不可を定義する。

## \_\_TVOS_AVAILABLE

`Availability.h`

```c
#define __TVOS_AVAILABLE(_vers) __OS_AVAILABILITY(tvos,introduced=_vers)
```

指定したバージョンのtvOSから利用であることを定義する。

## \_\_TVOS_DEPRECATED(_start, _dep, _msg)

`Availability.h`

```c
#define __TVOS_DEPRECATED(_start, _dep, _msg) __TVOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(tvos,deprecated=_dep,_msg)
```

`_start`で指定したバージョンのtvOSから利用可能で、`_dep`で指定したバージョンのtvOSから非推奨であることを定義する。`_msg`で代案を指示するメッセージを指定する。

## \_\_TV_OS_VERSION_MIN_REQUIRED, \_\_TV_OS_VERSION_MAX_ALLOWED

`AvailabilityInternal.h`

```c
#ifndef __TV_OS_VERSION_MIN_REQUIRED
    #ifdef __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
        /* compiler sets __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ when -mtvos-version-min is used */
        #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
        #define __TV_OS_VERSION_MAX_ALLOWED __IPHONE_9_0
        /* for compatibility with existing code.  New code should use platform specific checks */
        #define __IPHONE_OS_VERSION_MIN_REQUIRED 90000
    #endif
#endif
```

アプリケーションによってサポートされる最小／最大のtvOSのバージョンを定義する。
`-mtvos-version-min`を指定すると、コンパイラがその値を`__TV_OS_VERSION_MIN_REQUIRED`に設定する。

# Swift API Availability

`#available`のプラットフォーム名に`tvOS`を指定する。

```swift
if #available(tvOS 9.1, ..., *) {
    ...
```
[matlab] 隠れちゃった線を手前に持ってくる

疲れてしまったのでqiitaへmatlabに関する記事を投稿して徳を積もうと思います。


# objective

グラフオブジェクトを操って隠れちゃった線を手前に持ってくる

# graphical abstract (Before/After)

Before: 青線見えない
![samplecurves.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/1f7f6825-c483-2aa0-5144-97f03463ac0b.jpeg)

After: 青線見える
![samplecurvesmodified.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/6db39d34-3654-b8f8-28d7-69e584caa8b2.jpeg)

# what is important

`g = get(gca);` とやると、matlabではgにグラフオブジェクトが取得できます。
ここが今日のコツです。

よくわからないと思うのでサンプルコードを示していきます。

# sample code

Before の方の図を下記コードから作成。

```matlabsession
figure;

range = 0:0.01:2*pi;
hold on;
linewidth = 'LineWidth';
linewidthval = 4; % Line Width

plot(range(1:100), sin(range(1:100)), '-b', linewidth, linewidthval);
plot(range, sin(range), '-r', linewidth, linewidthval);
plot(range, ones(1, length(range)), '-k', linewidth, linewidthval);
```

![samplecurves.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/cc658eec-913f-c944-8b83-1400894a0f98.jpeg)

青い線が、赤い線の奥に隠れてしまいました。

そこで、グラフオブジェクトを取得して、プロットの順番を変えてセットし直す、ということをします。
てめぇ何言ってんだッて感じだと思うのでまたサンプルコードです。

```
>> g = get(gca);% グラフオブジェクトを取得。
>> g.Children% g.Childrenには、plot objectとでも呼ぶべきものが詰まっています。

ans = 

  3x1 Line 配列:

  Line    (data3)
  Line    (data2)
  Line    (data1)

>> set(gca, 'Children', [g.Children(3) g.Children(2) g.Children(1)])% ひっくり返してセットし直す
```

このコードはgetter/setterでgcaからグラフ情報を引っ張りだしてるんですね。

で、その子要素(ここだとg.Children)のプロットオブジェクトの順番を入れ替えた配列を作って
setterで再度代入すると、プロットの重なる順序が代わるんですね。

わっかりやすぅ～！

で、結果ドン！

![samplecurvesmodified.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/a707d30e-69f6-1577-c454-b18b3b6b8c42.jpeg)

無事に青い線が手前に来ました。

# reference

下記のも参考にしました。ちゃんちゃん。

```matlabsession
% オブジェクトのハンドル番号を検出
h = get(gca,'Children'); % 軸オブジェクトの子オブジェクトを取得(複数の場合はベクトル)
hg = findobj(h,'type','line','Color','b'); % 青色のlineオブジェクトを検出

% オブジェクトの順番の入れ替え
% 青色ラインの要素を取得
ind = (h == hg); % h において hg であるかどうかを論理値で出力

% 青色ラインのハンドルを一番上に設定
newh = [h(ind); h(~ind)]; % h(ind)：青色ラインのハンドル、h(~ind)：それ以外のハンドル

set(gca,'children',newh) % Childrenプロパティ値の再設定(順番の入れ替え)
```

via [プロット表示されたグラフにおいて、任意のラインを一番上に表示させる方法はありますか？ - MATLAB Answers - MATLAB Central](http://jp.mathworks.com/matlabcentral/answers/103931-)

ちなみにこんな記事も書きました。

[[matlab] 複数系列のうち1つだけに名前を付けて表示する方法](http://loudspeaker.sakura.ne.jp/devblog/?p=2908)
Flycheck で使う実行ファイルに node_modules/.bin のものを自動で使うようにするヤツ

今開いているファイルの親ディレクトリをどんどん辿っていって `node_modules` ディレクトリを探して、その中の `node_modules/.bin/eslint` や `node_modules/.bin/jshint` が存在するなら、それを flycheck の時に使うようにする。

```el
(defun kui/traverse-parents-for (filename &optional dirname)
  "Find FILENAME from parent directories of the current buffer file or DIRNAME"
  (if dirname
      (let ((path (concat (file-name-as-directory dirname) filename)))
        (if (file-exists-p path)
            path
          (if (string= "/" dirname)
              nil
            (kui/traverse-parents-for filename
                                      (file-name-directory
                                       (directory-file-name dirname))))))
    (kui/traverse-parents-for filename
                              (file-name-directory buffer-file-name))))

(defun kui/find-node-modules-bin (binname)
  "Find executable file named BINNAME from the node_modules directory"
  (let* ((moddir (kui/traverse-parents-for "node_modules"))
         (bin (if moddir (format "%s/.bin/%s" moddir binname))))
    (if (file-executable-p bin) bin)))

(defun kui/flycheck-set-node-modules-bin (checker binname)
  (let ((bin (kui/find-node-modules-bin binname)))
    (when bin
      (message "auto-detect %s: %s" binname bin)
      (flycheck-set-checker-executable checker bin))))

(defun kui/flycheck-set-checker-executable-from-node-modules ()
  (kui/flycheck-set-node-modules-bin 'javascript-jshint "jshint")
  (kui/flycheck-set-node-modules-bin 'javascript-eslint "eslint"))

(add-hook 'js-mode-hook
          'kui/flycheck-set-checker-executable-from-node-modules))
```
atheros carl9170 register


carl9170 はデバイスが起動している時に、外からレジスタを設定できる。すぐ忘れてしまいそうなのでメモ。

Linux debugfs を使う。Linuxのコンパイルフラグで有効にしていないと使えないので、必要に応じてリビルドしておく。Drivers > Network > Wireless > Atheros > Community AR9170 > DebugFS みたいな感じでたどる。

`/sys/kernel/debug/ieee80211/phy0/carl9170` という場所が debugfs の場所になる。レジスタのアドレスは Linux ソースコードを眺めて、`drivers/net/wireless/ath/carl9170/hw.h` のファイルを見る。

例えば `AR9170_MAC_REG_RX_CONTROL` で `AR9170_MAC_RX_CTRL_ACK_IN_SNIFFER` を追加で有効にしたいとする。

まず現在の値を確認する。`AR9170_MAC_REG_RX_CONTROL = AR9170_MAC_REG_BASE + 0xc40 = 0x1c3c40` となるので、root 権限で次のようにする。

```bash
# echo 0x1c3c40 > hw_ioread32
# cat hw_ioread32
001c3c40 = 10000003
```

値は `AR9170_MAC_RX_CTRL_PASS_TO_HOST`, `AR9170_MAC_RX_CTRL_DEAGG`, `AR9170_MAC_RX_CTRL_SHORT_FILTER` になっているようだ。`AR9170_MAC_RX_CTRL_ACK_IN_SNIFFER` は `BIT(30) = hex(1<<30) = 0x40000000` なので、次のように値を更新する。

```bash
# echo "0x1c3c40 0x50000003" > hw_iowrite32
```

先ほどと同じように値を確認する。

```bash
# echo 0x1c3c40 > hw_ioread32
# cat hw_ioread32
001c3c40 = 50000003
```

ちなみに `# echo "0x1c3c40 1" > hw_ioread32` としてもよい。1は個数。32bit 幅で何個読み出すか、を指定する。

Reference: http://permalink.gmane.org/gmane.linux.kernel.wireless.general/89579
JavaScriptでprivateっぽいことやってみた

## JavaScriptにはprivateみたいな機能がない

1. インスタンスごとに生成される、外からアクセスできない変数を作りたいとする
2. その変数にアクセスするメソッドをインスタンスが生成されるたびに定義するのはメモリの無駄なので`prototype`に突っ込みたいとする
3. 1.をやるためには、変数宣言を`function Class(){ 〜 }`の中でやらなきゃいけない
4. 2.をやるためには、メソッドを`function Class(){ 〜 }`の外でやらなきゃいけない
5. クロージャ的に届かない

→プライベートメンバは無理！

参考：[Javascriptでプライベートメンバを使うなら、prototypeは諦める - 部屋とボードゲームと私と酒と泪と男と女](https://sites.google.com/site/jun1sboardgames/programming/javascript-private-members)

##違った方法で実現してみる

数をインクリメントするオブジェクトを例にとってみます。英語がおかしいかもしれないですが。

```js:
var Counter = (function() {

  // プライベートメンバを保存する場所
  var privates = [];

  // プライベートメンバを取得する関数
  function privateOf(instance) {
    // インスタンスをキーにして取得して返す
    for (var i = 0; i < privates.length; i++) {
      if (privates[i].key === instance) {
        return privates[i].value;
      }
    }
    // 無かったら生成して返す
    var value = {};
    privates.push({
      key: instance,
      value: value
    });
    return value;
  }

  // コンストラクタ
  function Counter() {
    privateOf(this).count = 0;
  }

  // ちゃんとprototypeから使える
  Counter.prototype.increment = function() {
    return ++privateOf(this).count;
  };

  return Counter;

})();

var c1 = new Counter();
var c2 = new Counter();

// ちゃんとバラバラに動く
c1.increment(); // 1
c1.increment(); // 2
c2.increment(); // 1

// アクセスしようがない
c1.count; // undefined

```

##メリット

- ちゃんとインスタンスごとに生成される
- 外からアクセスできない
- `prototype`にメソッドを突っ込んでもそこから使える

##デメリット？

- 上記の`privateOf`みたいなくだりをいちいち書くのが面倒臭い。この辺うまく関数化してまとめた方がいいかも。
- 関数で取得する形なので機能的な実現はできたが構文的な再現はできていない。プライベート変数というよりオブジェクト。
- 即時関数の外からメソッドを新しく定義したい場合はアクセスできない。まあそれは当たり前か。

##所感

既出だったらすみません。
何よりJavaScriptでprivateは無理だと散々言われているので、この方法が大丈夫か不安。
そもそも構文として存在しないなら、無理に実現しなくてもいいのかなーとも思う。
何か間違っているところがあればご教授願います。
omniauth-twitter で 400 Bad Request がでたときの解決方法

twitterログインで400 Bad Requestが出て困りました。

# /auth/twitter へアクセスしたらエラー 
http://localhost:8888/auth/twitter をアクセスしたら以下のエラーがでました。

```text:ログインでエラー
OAuth::Unauthorized 400 Bad Request
```

![スクリーンショット 2015-10-22 20.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/1624/92d22183-033b-c391-851a-572d234dbe64.png)

オワタ＼(^o^)／

# api_key と api_secretを記述
config/secrets.ymlの設定がおかしかったです。

```rb:secrets.yml
default_twitter: &default_twitter
  twitter_api_key: 'vc41puZxkIMCR4Z1b0qN2Jcgi'
  twitter_api_secret: 'W3lEwssDxwlESlcGPuhIpG9d49zZuK0VCN60s53B0OmYkImYGI'
```
twitter_api_keyとtwitter_api_secretを設定しました。一応上記は記事用の適当な文字列を入れています。

# 再度アクセス
今度は直りました(☝ ՞ਊ ՞)

# 参考
http://qiita.com/hirokishirai/items/5a43977a38ecd922bfb9
[Ruby on Rails]ネストされたモデルをBuildし、空文字がきたら無視する方法

## 概要
関連モデルを一緒にCreateしたい状況でBuildした子モデルの
パラメータが空文字で渡ってきた場合のメモです。

* まず普通に一緒にCreateする状況を作成


Model(親)

```
class Hoge01 < ActiveRecord::Base
  has_many   :hoge02s
  accepts_nested_attributes_for :plan_images
end
```

Model(子)

```
class Hoge02 < ActiveRecord::Base
   belongs_to :hoge
end

```

View

```slim
  = form_for @hoge01 do |f|
    = f.text_fild :text_hoge01
    = f.fields_for :hoge02s do |q|
      = q.text_fild :text_hoge02
```

Controller

```
  def new
    @plan = Plan.new
    # 2回buildしてみる
    2.times do
      @plan.hoge02s.build
    end
  end
```


そうすると、下記の感じでパラメータがわたってくる

```
"hoge01"=>
  {"text_hoge01"=>"入力しました",
   "text_hoge02_attributes"=>{"0"=>{"text_hoge02"=>""}, "1"=>{"text_hoge02"=>""}},

 "controller"=>"client/plans",
 "action"=>"create",
 }
 
```

ここで`text_hoge02_attributes`でネストされた子モデルが
作成しようとしてきます。

## 解決法

それを回避するために親モデルの設定を変更する

```
  has_many   :hoge02s
  accepts_nested_attributes_for :hoge02s, reject_if: proc { |obj| obj[: text_hoge02].blank? }
```

`reject_if`に渡す条件は他にも色々できます！

## 参考
ActiveRecord::NestedAttributes::ClassMethods
http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
JSON.stringify 時のキーの並びを指定する

# JSON.stringify 時のキーの並びを指定する

第二引数に配列を渡す。

(第二引数は関数を渡すと replacer として、置換処理が行われるが、配列の場合は挙動が変わる。ちなみに、第三引数は space で、変換時にインデントされる。)

```js
let o = {
  d: 3,
  c: 2,
  b: 1,
  a: 0,
}

let normal = JSON.stringify(o);
console.log(normal); // {'d':3,'c':2,'b':1,'a':0}

let sorted = JSON.stringify(o, ['a', 'b', 'c', 'd', 'e', 'f', 'g']);
console.log(sorted); // {'a':0,'b':1,'c':2,'d':3}
```


ネストしてたら上から。

```js
let o = {
  d: {
    f: {
      h: 5,
      g: 4,
    },
    e: 3,
  },
  c:2,
  b:1,
  a:0,
}

let normal = JSON.stringify(o);
console.log(normal); // {"d":{"f":{"h":5,"g":4},"e":3},"c":2,"b":1,"a":0}

let sorted = JSON.stringify(o, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']);
console.log(sorted); // {"a":0,"b":1,"c":2,"d":{"e":3,"f":{"g":4,"h":5}}}
```


- http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3
- http://msdn.microsoft.com/ja-jp/library/cc836459
【Docker】 Volumeに関する話（Dockerでマウント）

# 前置き

Dockerでテスト環境を構築することになったんですが、ひとまずログとコンテンツ（画像）をどうするか迷い、
Volume用コンテナで運用するように対応しました。

# Docker Volume
今回は

 - ログはリアルタイムで見たい
 - 画像は登録されていれば良い

ということで、

- ログは明示的にディレクトリを指定してマウント
- 画像はDocker内部でのみマウント

という感じでVolumeを作成しました。

以下コマンドです。

```docker_volume.sh
docker run \
  --name docker-volume \
  -v /home/logs/apl:/var/log \
  -v /usr/local/image \
  busybox
```

上記Volumeを利用する方法はDockerコンテナ起動時に以下のようにVolumeを指定して起動します。

```docker_run.sh
docker run \
  --volumes-from docker-volume \
  --name name \
  usr/dockerimage
```

# コマンド説明
コマンドの説明をします。

まず、はdocker_volume.shの説明。

```docker_volume.sh
docker run \                    #Dockerコンテナ起動
  --name docker-volume \        #コンテナ名
  -v /home/logs/apl:/var/log \  #Volume指定 Dockerを起動しているサーバのディレクトリ:Docker内のマウントしたいディレクトリ
  -v /usr/local/image \         #Docker内のマウントしたいディレクトリ
  busybox                       #Dockerイメージ
```

今回はbusyboxを利用しています。とても軽量でおすすめです。
３行目がログ用のVolumeで、:の前に設定したコンテナを起動しているサーバのディレクトリでログファイルがリアルタイムで確認できます。
４行目のVolumeは画像用で、アプリケーションで利用できれば良いのでマウントするディレクトリのみ指定しています。
※Volume起動時に自動作成されるディレクトリが有りますので、気になる人は調べてみて下さい。


次はdocker_run.shです。

```docker_run.sh
docker run \                      #Dockerコンテナ起動
  --volumes-from docker-volume \  #利用するDockerVolumeコンテナ名
  --name name \                   #起動コンテナ名
  usr/dockerimage                 #Dockerイメージ
```

これは２行目で利用するVolume名を指定しています。
Volume起動時に指定したマウントしたいディレクトリが、自動でマウントされます。

# 注意点
Volumeコンテナ起動時に指定したディレクトリと、アプリケーションコンテナ内のディレクトリを合わせて下さい。
存在しない場合はエラーになります。
輪読4-4

## ロジスティック回帰 or 線形判別解析(LDA) 1

```math 
\label{}
log\frac{Pr(G=k|X=x)}{Pr(G = K|X = x)}
= log \frac{\pi_k}{\pi_K} - \frac{1}{2}(\mu_k + \mu_K)^T \Sigma^{-1} (\mu_k - \mu_K) + x^T \Sigma^{-1}(\mu_k - \mu_K) \\
= a_{k0} + a_{k}^T x
```

```math
log\frac{Pr(G=k|X=x)}{Pr(G = K|X = x)} = \beta_{k0} + \beta^T_k x
```
これらはおなじ形をしている。相違点は係数の推測方法である。
ロジスティック回帰の方がより一般的であり、より推測が少ない。

## ロジスティック回帰 or 線形判別解析(LDA) 2
密度$X$と$G$を結合することができて

```math
Pr(X, G=X) = Pr(X)Pr(G=k|X)
```
とかける。
Pr(X)は入力$X$の周辺密度関数を表している。

## ロジスティック回帰 or 線形判別解析(LDA) 3
ロジスティック回帰と線形判別解析の両方で右辺はロジット線形(謎)の形をしている。

```math
Pr(G=k|X=x) = \frac{e^{\beta_{k0}} + \beta_k^T x}{1 + \Sigma^{K-1}_{l=1} e^{\beta_{l0} + \beta^T_l x}}
```
再び任意の参考である最後のクラス(謎)を選択する。

## ロジスティック回帰 or 線形判別解析(LDA) 4
### ロジスティック回帰の最適化
ロジスティック回帰モデルは Pr(X)の任意の密度関数における $X$の周辺密度関数であり、
条件付き尤度(Pr(G=k|X)の多項尤度)を最大化させることによってPr(G|X)のパラメーターを最適化する。

しかし、Pr(X)は完全に無視され、各観測点で質量$\frac{1}{N}$である経験的分布関数を利用して
周辺密度は完全にノンパラメトリックの非制限な状態で推定される。
(謎)

## ロジスティック回帰 or 線形判別解析(LDA) 5
### 線形回帰解析の最適化
結合密度に基づいたログ尤度を最大化することで線形回帰解析を最適化できる。

```math
Pr(X, G=k) = \phi(X;\mu_k, \Sigma)\pi_k 
```
$\phi$はガウス密度関数である。

## ロジスティック回帰 or 線形判別解析(LDA) 5
条件付きの状態とは異なり、周辺密度Pr(X)は混合密度として働く。

```math
Pr(X) = \Sigma^{K}_{k=1} \pi_k  \phi(X;\mu_k, \Sigma)
```


## ロジスティック回帰 or 線形判別解析(LDA) 6

外れ値があるとき
ロジスティック回帰:強い $because$ 重みを下げる
LDA:弱い 

超平面が完璧に引くことができるとき
ロジスティック回帰:最大尤度は不定となる → 最適化できない
LDA:よく定義される。 $\because$ 周辺尤度関数は退化を許さない

## 超平面分離 1
本章では超平面分離識別器を取り扱う。
その手順において データを出来る限り異なるクラスに分ける線形決定境界 をつくる。

これらは１２章で議論するサポートベクター識別器の基礎となる。このセクションの数学的レベルは少し高いかもしれない。

## 超平面分離 2
![スクリーンショット 2015-10-22 19.21.59.png](https://qiita-image-store.s3.amazonaws.com/0/72865/1b416663-f629-a331-4c9a-9f5956a718e1.png)
図１．超平面によって分離された例。オレンジの線は最小二乗の解であり、１つ誤識別している。
２つの青い線で示した超平面はパーセプトロンの異なる初期値によって見つけられた。

図1は$R^2$空間において2クラスに分類された20の点を示している。
オレンジの線は最小二乗法で求められており
{x : βˆ0 + βˆ1x1 + βˆ2x2 = 0}
と表される。
最小二乗法は１つの誤識別をしたので点の分離は完璧にできていない。
この境界面はLDAでも同様に見つけられた。

この式のような識別器はパーセプトロン(入力特徴の線形組み合わせを計算し、符号を返す)と呼ばれる。

## 超平面分離 3
![スクリーンショット 2015-10-22 19.36.20.png](https://qiita-image-store.s3.amazonaws.com/0/72865/b9d2ec20-2393-340e-155a-28c6dc0a6d2a.png)
図2.超平面の線形代数(アフィン集合)

話を進める前にベクトル代数に関して少し見ておきましょう。
図2は超平面または $f(x)=β_0+β_Tx=0$によって定められる アフィン集合$L$ を表す。
$R^2$なので線である。(超平面ではない)

いくつか条件を与える
１．いずれの$x_1, x_2$ も$L$(β^T(x_1−x_2)=0)上にある。
２．いずれの$x_0$ も $L$ ($β^Tx_0 =−β_0$) 上にある。 
３．いずれの
Python(boto)からサービスアカウントとキーファイル(p12)を使ってGoogle Cloud Storageにアクセスする


botoからGoogle Cloud Storageにアクセスする場合、s3との互換運用アクセスを有効にすることでアクセスキーとシークレットキーでアクセスすることが可能です。
http://qiita.com/itkr/items/d990e87a2540332ee0e5

ただしこの方法にはひとつ問題があります。互換運用アクセスで発行できるアクセスキーはGoogleユーザーアカウントにリンクされるため、複数人で行うプロジェクトでは不便です。そこでサービスアカウントとキーファイル(p12)でアクセスするという選択肢が出てきます。

## 依存ライブラリのインストール

ここではgcs-oauth2-boto-pluginというライブラリを使用します。

```
pip install gcs-oauth2-boto-plugin
```

## 設定ファイルの準備

サービスアカウントとキーファイルのパスを記述する設定ファイルを準備します。

### ファイルの場所

デフォルトでは`~/.boto`を見ますが、環境変数で以下のどちらかを用意すると任意のパスを指定できます。ちなみにこれはgsutilと同じです。

- BOTO_CONFIG (単一ファイルを指定する)
- BOTO_PATH (`:`区切りで複数ファイルを指定する)

pythonで環境変数を書く場合は下のように書きます。

```python
import os
os.environ['BOTO_CONFIG'] = '/path.to/boto_config'
```

### 必要な記述

いろいろ設定を書くことが出来ますが、今回重要なのは次の設定です

```
[Credentials]
gs_service_key_file = /path.to/sample-KEYFILE.p12
gs_service_client_id = sample-service-account@developer.gserviceaccount.com

[GSUtil]
default_project_id = sampleproject-994
```

参考：https://cloud.google.com/storage/docs/gsutil/commands/config#additional-configuration-controllable-features

## 実装

### 基本コード
```python
import boto

bucket_name = 'bucket_name'
uri = boto.storage_uri(bucket_name, 'gs')
print uri.get_bucket()
```

基本的にはgcs-oauth2-boto-pluginをインストールしていればこれだけです。

## 解説

### なぜこれだけで良いのか
botoはAuthConnectionを貼る際にPluginを導入できる仕組みを用意しています。詳細に書くとbotoの実装の多くを転載することになってしまうので省きますが、botoのauth関連のコードを見ると`get_plugin`という関数の呼び出しを見つけることが出来ます。

```boto/plugin.py
def get_plugin(cls, requested_capability=None):
    if not requested_capability:
        requested_capability = []
    result = []
    for handler in cls.__subclasses__():
        if handler.is_capable(requested_capability):
            result.append(handler)
    return result
```

`__subclasses__`はサブクラスの一覧を表示しますが、この場合は`AuthHandler`クラスを継承しているクラスの一覧になります。gcs-oauth2-boto-pluginの中の`OAuth2ServiceAccountAuth`というクラスが`AuthHandler`を継承しているためプラグインとして認識されます。その中で設定ファイルから`gs_service_key_file`など必要な情報を取得しています。

### ちなみに

自分で`AuthHandler`を継承したクラスを実装し、中でconfigファイルのパスを無理矢理上書きして動的に変更することもできます。が、たぶんもっとスマートにできると思います。

```python
from boto.auth_handler import AuthHandler
from boto.pyami.config import Config

boto_path = ''

class SpamAuth(AuthHandler):
    def __init__(self, path, config, provider):
        config = Config(path=boto_path)
        # ... 略 ...

def spam(path='/path.to/boto_config'):
    global boto_path
    boto_path = path
    bucket_name = 'bucket_name'
    uri = boto.storage_uri(bucket_name, 'gs')
    print uri.get_bucket()
```

なお、この際にURIクラス（この場合`BucketStorageUri`）は一度connectionを張ると`provider_pool`というdictの中にconnectionを保持するので、connectionを切り替える場合は`del BucketStorageUri.provider_pool['gs']`や`BucketStorageUri.provider_pool = {}`のようにクリアしてあげないとダメみたいですね。
Raspberry Piに焦電型赤外線（人感）センサーを接続してみた

Raspberry Piで焦電型赤外線（人感）センサーを使うときの手順メモ

# 用意するもの
1. Raspberry Pi 2 Model B(セットアップ済みのもの、OSはRaspbian)
2. 焦電型赤外線（人感）センサーモジュール
3. ブレッドボード
4. ブレッドボード用ジャンパーワイヤ(オス-メス) 3本

# 接続した人感センサー

秋月電子通商で[焦電型赤外線（人感）センサーモジュール　ＳＢ４１２Ａ](http://akizukidenshi.com/catalog/g/gM-09002/)を購入した。

![スクリーンショット 2015-10-22 18.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/97314/3ed4199f-539f-457e-8901-a5c1a18376ab.png)

秋月電子通商の[データシート](http://akizukidenshi.com/download/ds/senba/SB412A.pdf)で、各端子の意味を確認した。

![スクリーンショット 2015-10-22 18.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/97314/47fb0e4b-25a0-e607-a357-44390069fb4e.png)

# 人感センサーとRaspberryPiとの接続


人感センサーの各端子とブレッドボードとの接続

![スクリーンショット 2015-10-22 18.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/97314/ec5fa62a-a084-49fc-b040-260ff031d387.png)
※画像の"b"は"d"の間違い。人感センサーは、ブレッドボードのd9, d10, d11に接続する。

ブレッドボードとRaspberry Piとの接続

* b9と6番ピン(Ground)
* b10と12番ピン(GPIO18)
* b11と4番ピン(5v)

Raspberry Piのピン配置は、[Raspberry PiでLEDの点灯](http://qiita.com/aryoa/items/3f6d82b8c63761cef087)を参照

接続後のイメージは以下の通り。
![image-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/97314/99103e2a-8403-3be1-9113-0c58a63a35f0.jpeg)

# Raspberry Piで人感センサーから情報取得

Pythonでコードを書いてみる。

※setmode, setupの説明に関しては、[Raspberry PiでLEDの点灯](http://qiita.com/aryoa/items/3f6d82b8c63761cef087)を参照

```py:motion_sensor.py
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN)

try:
        while True:        
                print GPIO.input(18)
                sleep(1)

except KeyboardInterrupt:
        pass

GPIO.cleanup()
```
実行結果
人を検知した場合は1と表示される。

```sh:ターミナル
$ sudo python ./motion_sensor.py 
1
0
0
0
0
0
0
1
1
1
1
1
0
```


ついでに、ターミナルからセンサーの情報を取得する方法は以下の通り。

１. GPIO 18を有効にする

```sh:ターミナル
sudo echo 18 > /sys/class/gpio/export
```

上記コマンドを実行すると、 /sys/class/gpio/gpio18ディレクトリが作成される。

２. GPIO 18を入力として使用する

```sh:ターミナル
$ sudo echo in > /sys/class/gpio/gpio18/direction 
````

３. センサーの出力を取得する

```sh:ターミナル
$ sudo cat /sys/class/gpio/gpio18/value 
````

人を検知した場合は1、検知しない場合は0を出力する。

４. 後処理（Pin を無効にする）

```sh:ターミナル
sudo echo 18 > /sys/class/gpio/unexport
```
[CMake] ソースファイルプロパティは同じディレクトリのターゲットにしか見えない

https://cmake.org/cmake/help/v2.8.12/cmake.html#command%3aset_source_files_properties

> Source file properties are visible only to targets added in the same directory (CMakeLists.txt).

なので、`add_custom_command`で指定した`OUTPUT`を他のディレクトリの`add_custom_target`の`SOURCES`に指定する事は出来ない。

例えば、次の様な構成のCMakeシステムがあったとする。

```
project
+-- CMakeLists.txt
|
+-- foo
| +-- CMakeLists.txt
|
+-- bar
  +-- CMakeLists.txt
```

```cmake:project/CMakeLists.txt
add_subdirectory (foo)
add_subdirectory (bar)
```

```cmake:project/foo/CMakeLists.txt
add_custom_command (OUTPUT a.txt COMMAND ...)
```

```cmake:project/bar/CMakeLists.txt
add_custom_target (BAR_TARGET SOURCES ${PROJECT_BINARY_DIR}/foo/a.txt ...)
```

`foo`の中でなんらかのファイルを生成して、`bar`でそのファイルを利用するという良くある構成だ。
`add_custom_command`を用いる事で、`a.txt`を何度も生成しようとするのを防ぐ事ができる。
ところが、`cmake`してみると、

```text
Cannot find source file:

    /project/build/foo/a.txt

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx
```

等と怒られる。

`cmake`は`add_custom_command`によって生成されるまだ存在しないファイルを認識するが、これは`add_custom_command`を実行したディレクトリ内でしか有効では無い。
なので、`bar`からは`foo/a.txt`が`add_custom_command`によって将来的に生成されるファイルだとは認識できず、また、"foo/a.txt"がまだ存在しないので、エラーを吐く。

対処方は簡単で、`foo`の中に、`a.txt`に依存するターゲットを作ってやれば良い。

```cmake:project/foo/CMakeLists.txt
add_custom_command (OUTPUT a.txt COMMAND ...)
add_custom_target (FOO_GENERATE_ATXT SOURCES a.txt)
```

```cmake:project/bar/CMakeLists.txt
add_custom_target (BAR_TARGET DEPENDS FOO_GENERATE_ATXT ...)
```
HTTPSでembulk-output-s3するには

HTTPSで[embulk-output-s3](https://github.com/llibra/embulk-output-s3)するための記事です。

# やりかた
httpsで始まるAmazon S3のエンドポイントURLを、endpoint項目で指定します。かんたん。

```yaml:out設定部分の抜粋
out:
  type: s3
  path_prefix: logs/
  file_ext: .json
  bucket: S3 bucket name
  endpoint: https://s3*********** ← これ
  access_key_id: 秘密
  secret_access_key: 秘密
  formatter:
    type: csv
```
エンドポイントURLやサポートプロトコルは[Amazon Simple Storage Service（S3）](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region)で確認できます。

# こんな人に

* HTTPSでS3にアップロードしたいんだけど、どう設定書いたらいいのだろうか
* [embulk-output-s3](https://github.com/llibra/embulk-output-s3)のConfigurationを見てもイマイチわからない。endpoint項目を使えばいいの？
* [embulk-input-s3](https://github.com/embulk/embulk-input-s3)も[embulk-output-s3](https://github.com/llibra/embulk-output-s3)もendpoint項目の説明が`endpoint: S3 endpoint login user name`でよくわからない。login user nameってなんだ?

# ちなみに-その１

[Amazon S3のよくある質問](https://aws.amazon.com/jp/s3/faqs/#security_anchor)によると、
> HTTPS プロトコルを使用して SSL エンドポイント経由で、Amazon S3 にデータを安全にアップロード/ダウンロードすることができます。

とのことで、S3はHTTPSもOKです。

# 本当にHTTPSで通信しているのか確認

lsofコマンドでウォッチしてみます。
まずはembulk実行前の状態です。
![waiting.png](https://qiita-image-store.s3.amazonaws.com/0/22432/3777208d-74b9-6779-f239-b27ef1fb864e.png)
静かなもんです。

次に、実際にembulkを動かしてみます。
![established.png](https://qiita-image-store.s3.amazonaws.com/0/22432/1e938c8c-ecfd-7d41-4215-fa50ce96efb3.png)
httpsなESTABLISHEDが出てきました。

# ちなみに-その２

* [embulk-input-s3](https://github.com/embulk/embulk-input-s3)も[embulk-output-s3](https://github.com/llibra/embulk-output-s3)も内部では`com.amazonaws.services.s3.AmazonS3Client`を利用しています
 * `AmazonS3Client#setEndpoint`をコールしています
  * 安定の救世主：[ヒシダマ様のサイト](http://www.ne.jp/asahi/hishidama/home/tech/aws/s3/api.html#h_outline)でヒントを発見

```java
AmazonS3Client s3 = new AmazonS3Client(awsCredentials);
	s3.setEndpoint("https://s3-ap-northeast-1.amazonaws.com");
```
 * なるほど、setEndpointメソッドでhttpsなURLをセットしています
  * それならendpoint項目を使うということで多分間違いなさそう

以上です。
Unityでシーンファイルからエディタを開こうとした時にクラッシュして立ち上がらない時の対処法

若干はまってしまったのでメモ

#環境
OSX Yosemite 
Unity4.6.8

# 症状

gitで新規で落としてきたUnityのプロジェクトを
*.unityから開こうとした際に、Unityがクラッシュしてエディタが立ち上がらない


#原因

今回の場合はプレファブが壊れていたのが原因の模様
なんとかエディタを立ち上げてみると
**「Automatic import for 'Assets/*.prefab' was disabled because the asset importer crashed on it last time.
You can use 'Assets -> Reimport' to enable automatic importing again.
」**
というメッセージがコンソールに出力された

#対応策

最初にまずなんとかUnityエディタが動作するように試してみる
自分の場合は、スクリプトファイルを全て削除し、わざとビルドエラーを出したら
立ち上がった。
5回ほど諦めずに繰り返し*.unityから開こうとした所、こちらでも立ち上がった。
壊れているprefabの数に依存するのかもしれない。
あとは上記のメッセージが表示されるので、対象のprefabをReimportすれば良い

クラッシュする原因は様々な要因が考えられるが、自分の場合はprefabでした。

以上
PowerShellでレジストリをいじる

## はじめに
自宅でUSキーボードを使っているのに会社支給のPCがJISキーボードだったりすると記号類の位置が違っていて混乱しますね。デスクトップならUSキーボード持ち込みとか荒技が使えるんですが、ノートだとそうもいかない。

というわけでレジストリを書き換えてWindowsを騙してしまいましょう。ただ、レジストリのキーや値を覚えるのも面倒ですし、急遽PCを返却しなきゃいけないなど不測の事態に備えてコマンド一発で書き換わると便利です。

## 106キーボードと101キーボードの設定
以下のレジストリエントリ中のキーの値がキーボードの種別を決定しています。（と、いろんなところに書かれています）

エントリ：HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters

| キー | USキーボード | JISキーボード |
| --- |:---:|:---:|
| LayerDriver JPN | kbd101.dll | kbd106.dll |
| OverrideKeyboardIdentifier | PCAT_101KEY | PCAT_106KEY |
| OverrideKeyboardSubtype | 0 | 2 |

## レジストリエントリを編集するコマンドレット
レジストリエントリは`Set-ItemProperty`で編集することができますが、PowerShellを管理者権限で実行しないとエラーになります。レジストリエントリに対して-nameでキー名を、-valueで値を指定します。

Set-ItemProperty "レジストリエントリ名" -name "キー名" -value "値"

したがってレジストリ書き換えスクリプトは各々以下のようになります。

``` set_us.ps1
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "LayerDriver JPN" -value "kbd101.dll"
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "OverrideKeyboardIdentifier" -value "PCAT_101KEY"
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "OverridekeyboardSubtype" -value "0"
```

``` set_jp.ps1
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "LayerDriver JPN" -value "kbd106.dll"
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "OverrideKeyboardIdentifier" -value "PCAT_106KEY"
Set-ItemProperty HKLM:\System\CurrentControlSet\Services\i8042prt\Parameters -name "OverridekeyboardSubtype" -value "2"
```

これを少し整えたものをGithubに置いておきますね。
<a href="https://github.com/Takeru-chan/chgkbd" target="_blank">Takeru-chan/chgkbd</a>
有償版「ADX2」とLE版の違いや、アプリ配布時の使用料について

<i class="fa fa-check-square-o" style="font-size:1em;"></i> **ADX2についてはこちら** → [<i class="fa fa-external-link" style="font-size:1em;"></i> 勝手にADX2情報まとめ](http://qiita.com/ksilogic/items/eb12af856b1ffc88a276)

#### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> LE公式FAQより引用
> 「ADX2」は法人企業向けで、ほぼ全てのゲームプラットフォームでのゲーム開発に対応しており、ライセンスにはサポートが含まれています。
「ADX2 LE」はUnityを使用したPC、Mac、iPhone、Androidアプリ開発に対応しており、どなたでもお使いいただけますが、サポートは対象外です。また、「ADX2 LE」で開発したコンテンツやアプリの配布/販売には制限があります。
参考：[「ADX2 LE」を使ったゲームやアプリは配信できますか？](http://www.adx2le.com/faq/sec01/8k4uh900000003jp.html)

----

##  <i class="fa fa-check-square-o" style="font-size:1em;"></i> 相違点まとめ

|| 有償版 ADX2 | ADX2LE |
|:-----------|:------------|:------------|
| 対応プラットフォーム |PC、PS4、PS3、XboxOne、Xbox360、PS VITA、WiiU、3DS、iPhone、Android|PC、iPhone、Android|
|サポート|テクニカルサポートページ|なし|
|データの暗号化|可能|不可能|
|更新頻度|年に数回|不定期|
|PCの対応オーディオAPI|XAudio (Win10以前)、WASAPI (Win8以降)|XAudioのみ|

補足
> XAudio (Win10以前)と書いた件ですが、Win10環境下でのXAudio2_7.dllのクラッシュレポートがちらほらあるようです。WASAPIを使えば回避できそうな気もするのですが、LE版は今のところXAudioのみの対応となっているので次回の更新に期待したいところ。

##  <i class="fa fa-jpy" style="font-size:1em;"></i> 使用料とか
アプリを配布、販売する際の話
#### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 有償版
> <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 公式webへリンク
<i class="fa fa-external-link" style="font-size:1em;"></i> **スマートフォン向け [「CRI ADX2」 for Smartphone](http://www.cri-mw.co.jp/product/smartphone/adx2/index.html)**
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> F2P(基本無料・アイテム課金）タイトル向け料金体系（PDF・245KB）](http://www.cri-mw.co.jp/product/smartphone/adx2/qn39gm0000007rf8-att/f2p_price.pdf)
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> 売り切りアプリ向け料金体系（シミュレーターアプリ等）（PDF・558KB）](http://www.cri-mw.co.jp/product/smartphone/adx2/qn39gm0000007rf8-att/smartphone_price.pdf)
<i class="fa fa-external-link" style="font-size:1em;"></i> **コンシューマー向け [「CRI ADX2」 for Consolegame](http://www.cri-mw.co.jp/product/cs/adx2/index.html)**
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> パッケージ販売タイトル向け料金体系（PDF・609KB）](http://www.cri-mw.co.jp/product/cs/adx2/qn39gm0000007ycy-att/package_price.pdf)
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> ニンテンドー3DS パッケージソフト向け料⾦体系（PDF・175KB）](http://www.cri-mw.co.jp/product/cs/adx2/qn39gm0000007ycy-att/3ds_price.pdf)
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> F2P(基本無料・アイテム課金）タイトル向け料金体系（PDF・69KB）](http://www.cri-mw.co.jp/product/cs/adx2/qn39gm0000007ycy-att/f2p_price.pdf)
　[ <i class="fa fa-file-pdf-o" style="font-size:1em;"></i> ダウンロード販売専用タイトル向け料金体系（PDF・248KB）](http://www.cri-mw.co.jp/product/cs/adx2/qn39gm0000007ycy-att/DL_price.pdf)

幾つかプランがあるようです。

#### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> LE版
　もちろん**無料**　ただし、以下に当てはまる場合は有償契約が必要
> <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 公式FAQ　[「ADX2 LE」を使ったゲームやアプリは配信できますか？](http://www.adx2le.com/faq/sec01/8k4uh900000003jp.html)　より引用
　・個人またはインディーズで、前年の年商が1,000万円を超えていないこと
　・対象のゲームまたはアプリの累計売上額が1,000万円を超えないこと

もし超えちゃった場合は後から契約するんでしょう。たぶん。

以上です。LEに更新があればまた更新予定。
Node/Electronアプリ開発/ビルド用Windows環境セットアップメモ


現在、[Sync](https://www.wantedly.com/sync) というメッセージングアプリのWindowsデスクトップ版を、Electronを使って開発している。(同じくElectronを使ったMacデスクトップ版はすでに公開済み!)

普段はMacのみでNode/Electronを開発しているのだが、今回WindowsでのElectron開発・ビルド環境構築の知見がいくらか手に入ったので、この記事でまとめてみた。

あらかじめ [Kobito for Windows](http://kobito.qiita.com/win) の開発方法について @mizchi さんに詳しく話を聞かせていただいておりそれがとても参考になった (ありがとうございました)。


## OS

* Windows 10 Home 64bit

をMac上のVM (VMWare Fusion) にインストールした。
ライセンスはWindows版開発のために新しく購入した。

## マルウェア対策

アプリのバイナリの汚染や誤判定を防ぐため、開発環境ではマルウェアに気をつけたい。

以前[Electronアプリがマルウェアに誤判定される事件](https://github.com/atom/atom/issues/3927) があり、Kobito for Windowsも影響を受けたらしい…

ひとまずAvastをインストールした。

## 環境構築

基本的にはGitとnodeがインストールされていれば問題なく開発できると思う。

* ~~Git for Windows~~
	* GitHubのプライベートリポジトリのcloneがうまくいかず諦めた (解決策はあるかも)
* GitHub Desktop for Windows
	* GitHubを使うならこっちのほうが楽っぽい
* [nodist](https://github.com/marcelklehr/nodist)
	* Windows用Nodeバージョンマネージャ
	* Readmeの手順にそって手で入れる

これらが入ったらリポジトリをcloneして、あとは普通のNode開発ができる。
シェルはGitHub Desktopから開けるGit Shellを使った。(PowerShell/コマンドプロンプト/bash/カスタム が選べる)

## 実行

[electron-prebuilt](https://github.com/mafintosh/electron-prebuilt) がそのままWindowsでも使える。

## アプリのパッケージング

[electron-packager](https://github.com/maxogden/electron-packager) もWindowsでそのまま使える。
(electron-packagerはWindows版をMacやLinuxでクロスビルドすることも可能らしい)

Mac版は64bitビルドを使ったが、Windows版では32bitビルドを使うことにした。
(Kobito/Atom/Slackなども32bit)

### アイコンが設定されない問題

electron-packager でWindowsアプリをビルドするとき、アイコンを指定しても設定されない不具合があるらしい。(https://github.com/maxogden/electron-packager/issues/53#issuecomment-119194848)

アイコンを設定するのに使っている[`rcedit.exe`](https://github.com/atom/node-rcedit) というツールが動かないのが原因らしく、
[Microsoft Visual C++ 2010 Redistributable Package (x86)](https://www.microsoft.com/en-us/download/details.aspx?id=5555) を入れると解決する。

## その他つまづいた所

### `npm run ...` や [gulp-shell](https://github.com/sun-zheng-an/gulp-shell) などのタスクでコマンドが動かない

WindowsのコマンドプロンプトはMacのシェルと大きく違うせいで色々なシェルコマンドが動かなくなる。

クロスプラットフォームで動くタスクを書くにはコマンドは避けたほうがいい (代わりにNodeツールで行うべき) ことを再実感した。

### 自動アップデートシステムの構築

これはまだ未解決。(Mac版では、Electronの`auto-updater` APIを使って構築済み)
https://github.com/GitbookIO/nuts という、Windows/MacのElectronアプリに使えるアップデートのリリースサーバ実装があり、参考になりそう。
GLFW3 サウンド再生 簡易プログラム公開

# GLFWとは？
* http://www.glfw.org/download.html
* OpenGLを簡易的に扱えるようにしたライブラリーです。
* ウィンドウを作成し, OpenGL のコンテキストを作って, 入力 (デバイス) を管理する、無料のオープンソースのマルチプラットフォームのライブラリだと書いてあります。
* ライセンスは unmodified zlib/libpng license を採用しています。
* GLFW3は、GLFWの最新バージョンになっています。

## 特徴
* 非常にコンパクトである
* マルチプラットホームである
* OpenGL のバージョンやプロファイルが指定できる
* 最初からダブルバッファリングになっている
* イベントループを自分で書ける。
* ポーリング方式とコールバック方式のどちらにも対応している
* マルチウィンドウやマルチモニタに対応している
* 入力デバイスの取り扱い方法が異なる
* etc...


# 使用したライブラリー
* OpenAL
    * http://www.openal.org/ 
* alut
    * https://github.com/rpavlik/openal-svn-mirror/tree/master/alut

# プログラム
* 今回は、GLFWの内容は省略しています。
* メインは、オーディオです。


```cpp:Audio.h

#pragma once
#include <string>
#include <OpenAL/al.h>

class Audio
{
public:
	explicit Audio(const std::string& filePath);

	// ループ設定
	void Loop(const bool isLoop);

	// 再生
	void Play();

	// 一時停止
	void Pause();

	// 停止
	void Stop();

	// 再生中かどうか
	const bool IsPlaying()const;
	
	// 音声データの尺を秒単位で取得する
	const float GetDuration()const;

	// 現在の再生位置を秒単位で取得する
	const float GetOffset()const;

private:
	ALuint buffer;
	ALuint source;

};


```

```cpp:Audio.cpp

#include "Audio.h"
#include <OpenAL\alut.h>
#include <assert.h>

Audio::Audio(const std::string& filePath) :
buffer(alutCreateBufferFromFile(filePath.c_str())),
source(0)
{
	assert(buffer != 0);

	alGenSources(1, &source);
	alSourcei(source, AL_BUFFER, buffer); // 音データのバッファを指定

	Loop(false);
}


void Audio::Loop(const bool isLoop)
{
	alSourcei(source, AL_LOOPING, isLoop ? AL_TRUE : AL_FALSE); // ループの設定
}

void Audio::Play()
{
	alSourcePlay(source);
}


void Audio::Stop()
{
	alSourceStop(source);
}

void Audio::Pause()
{
	alSourcePause(source);
}

const bool Audio::IsPlaying()const
{
	return GetOffset() != 0;
}

const float Audio::GetDuration()const
{
	ALint size, frequency, channels, bits;

	alGetBufferi(buffer, AL_SIZE, &size);
	alGetBufferi(buffer, AL_FREQUENCY, &frequency);
	alGetBufferi(buffer, AL_CHANNELS, &channels);
	alGetBufferi(buffer, AL_BITS, &bits);

	return static_cast<float>(size) / static_cast<float>(frequency*channels*(bits / 8));

}

const float Audio::GetOffset()const
{
	float offset;

	alGetSourcef(source, AL_SEC_OFFSET, &offset);

	return offset;

}

```

```cpp:main.cpp
#include <GLFW\glfw3.h>
#include <OpenAL\al.h>
#include <OpenAL\alut.h>
#include "Audio\Audio.h"

#pragma	comment(lib,"glfw3.lib")
#pragma	comment(lib,"opengl32.lib")
#pragma comment(lib,"OpenAL32.lib")
#pragma comment(lib,"alut.lib")

int main()
{
	// glfwを初期化
	if (!glfwInit()) return 0;

	// alutを初期化
	if (!alutInit(nullptr, nullptr)) return 0;

	const int width = 500;
	const int height = 500;

	// ウィンドウを生成
	GLFWwindow *window = glfwCreateWindow(width, height, "Title", NULL, NULL);
	
	if (window == nullptr) return 0;

	// Audioの初期化
	Audio audio("Resources/Sound.wav");

	audio.Play();

	while (!glfwWindowShouldClose(window))
	{
		// 省略
	}

	alutExit();

	glfwTerminate();
	glfwDestroyWindow(window);


	return 0;
}
```

# 対応している形式
* .wav
* 残念ながら、1つしか対応していませんが、他のライブラリーを組み合わせれば、様々な形式が対応することが可能です。
Linux(CentOS7)でWebサーバーを構築する。 -Apache導入編-

# 概要
Linux(CentOS7)上でWebサーバーを構築する手順を綴りたいと思います。
まずはApacheの導入とそれに付随する設定を最短(?)で。

# 導入するもの
- Apache

# 手順
## 1. Apacheの導入
`# yum -y install httpd`
コマンドはこれだけ。

ずらずらーってログが流れて、
`Complete!`
って表示されたら完了。

とっても簡単ね！

## 2. ファイアウォールの設定
ファイアウォールが動いているか確認
`# firewall-cmd --state`
"running"と表示されればOK!

起動していなかったら下記コマンドで起動
`# systemctl start firewalld`

今のファイアウォール設定の確認
`# firewall-cmd --list-all`

httpサービスの追加
`# firewall-cmd --permanent --add-service=http`
"--permanent"を付けるとサービスを再起動した場合にもこの設定を維持するよ

ファイアウォール設定の更新
`# firewall-cmd --reload`

もう一度ファイアウォール設定を確認
`# firewall-cmd --list-all`
servicesの欄にhttpが追加されていればOK!

これでhttp用のポートが空いたハズ…！


## 3. 動作確認
ここまでOKかな？

ブラウザにサーバーのアドレスを入力してみよう！

`http://127.0.0.1` (適宜)

うまくできていれば、Apacheのテストページ「APACHE HTTP SERVER」が表示されるよ！

あとは、
`/var/www/html/`
に、任意の.htmlファイルを置いて楽しもう！


## 0. トラブルシューティング
「なんかようわからんが動かん！」という場合は読んでみてね。

### SELinuxの状態確認
どういう症状が出るか忘れましたが…
`# getenforce`
の結果が、"Enforcing"だとうまく動かなかった気がします。

ので、
`# setenforce Permissive`
または
`# setenforce Disabled`
で、SELinuxの動作を停止させます。

※SELinuxってのはLinuxのセキュリティを強化してくれる何からしいです。
※私も詳しくないので自己責任でお願いします！

### iptablesの停止
手順通りfirewalldの設定をしたけど繋がらない…！

iptablesが動いているとfirewalldと競合してしまうので、
`# iptables -F`
で止めとくと良いかも。

### firewall-cmdコマンド実行時に何やら難しそうなエラーメッセージが出る
`ERROR:dbus.proxies:Introspect error on :1.4:/org/fedoraproject/FirewallD1:...`(略)
スーパーユーザーになっていないかも。

`$ sudo firewall-cmd --state`
こんな感じでsudoに続けてコマンドを入れるか、
`$ su -`
でスーパーユーザーになってから実行してみると解決するかも。
[Go] Using mysql in go language

#### Before
Install the [go-mysql-driver](https://github.com/go-sql-driver/mysql)

```
go get github.com/go-sql-driver/mysql
```

#### How to use in go language

```go
package main;

import (
        "fmt"
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
)

func main() {
        // Open the database
        db, err := sql.Open("mysql", "user:password@/database_name")
        if err != nil {
                panic(err.Error())
        }
        // Close the database when this method finished
        defer db.Close()

        // Select data from some table
        rows, err := db.Query("SELECT id, name FROM my_table")
        if err != nil {
                panic(err.Error())
        }

        // For each selected rows, get the value of each selected column
        for rows.Next() {
                var id int
                var name string
                err = rows.Scan(&id, &name)
                if err != nil {
                        panic(err.Error())
                }
                fmt.Println(id, name)
        }
}
```