OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL で JOIN を含む INSERT, UPDATE, DELETE 文


なかなか覚えられない。MySQL 5.6。

👇下記の例で使うスキーマ。

```sql
CREATE TABLE authors (
  id        INT           NOT NULL AUTO_INCREMENT,
  name      VARCHAR(255)  NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE entries (
  id        INT           NOT NULL AUTO_INCREMENT,
  author_id INT           NOT NULL,
  title     VARCHAR(255)  NOT NULL,
  body      TEXT,
  available TINYINT(1)    NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE tags (
  entry_id  INT           NOT NULL,
  name      VARCHAR(255)  NOT NULL,
  PRIMARY KEY (entry_id, name)
);

```


# INSERT 文

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.1 INSERT ... SELECT 構文](http://dev.mysql.com/doc/refman/5.6/ja/insert-select.html)

```sql
-- JOIN 使わない場合
INSERT INTO tags (entry_id, name)
  VALUES (1, 'rails');

-- VALUES の代わりに JOIN を含む SELECT の結果を使う
INSERT INTO tags (entry_id, name)
  SELECT entries.id, LOWER(authors.name)
    FROM entries JOIN authors ON entries.author_id = authors.id;
```

# UPDATE 文

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.11 UPDATE 構文](http://dev.mysql.com/doc/refman/5.6/ja/update.html)

```sql
-- JOIN 使わない場合
UPDATE entries
  SET title = 'My 1st entry', body = 'Title only'
  WHERE id = 1;

-- テーブル名を指定するところで JOIN
UPDATE entries JOIN authors ON entries.author_id = authors.id
  SET available = TRUE
  WHERE authors.name = 'labocho';
```

# DELETE 文

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.2 DELETE 構文](http://dev.mysql.com/doc/refman/5.6/ja/delete.html#idm140513790680208)

```sql
-- JOIN 使わない場合
DELETE FROM entries
  WHERE entry_id = 1;

-- DELETE table_name FROM table_references ...
DELETE entries FROM entries JOIN authors ON entries.author_id = authors.id
  WHERE authors.name = 'labocho';
```
ラムダ式や無名クラスのメソッドから、外部に値を渡す方法


```java
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceSample {
	public static void main(String[] args) {
		Optional<String> opt = Optional.of("test");
		
		final AtomicReference<String> upperCase = new AtomicReference<>();
		final AtomicInteger length = new AtomicInteger();
		opt.ifPresent(s -> {
			upperCase.set(s.toUpperCase());
			length.set(s.length());
		});
		
		System.out.println("upper case: " + upperCase.get());
		System.out.println("length: " + length.get());
		
	}
}
```

ラムダ式に値を渡すにはfinalで宣言する必要があるため、ラムダ式内で生成した値をラムダ式外で取得するには、通常は戻り値を利用する。しかし複数の値を取得したい場合や戻り値の型に制約がある場合は別の方法で値を受け渡す必要がある。

ラムダ式外で値を入れるための箱(AtomicReferenceなど)を用意し、ラムダ式内でその箱に値を入れることで解決できた。
AtomエディタでPHP(＋HTML)がシンタックスハイライトされないのを解消

Atomエディタで、拡張子 `.php` でもHTMLが混ざっている場合、シンタックスハイライトがHTMLになってしまってPHP部分がハイライトされない場合があるので、それを解消。

## file-types プラグインを入れる

まず [「file-types」プラグイン](https://atom.io/packages/file-types) が必要。

## config.cson を編集

設定画面から <kbd>Open Config Folder</kbd> を開き、`config.cson` を編集する。
![2015-06-25_115425.png](https://qiita-image-store.s3.amazonaws.com/0/37122/3221059b-5b11-3fdc-e81a-bf2706c2e884.png)

末尾に以下の2行を追記。

```coffeescript:config.cson
  ...
  "file-types":
    php: "text.html.php"
```

これで拡張子「.php」のファイルはPHPとして扱われると思う。
（公式対応してほしい・・・）
PowerShellでプリンターを作成

プリンターポートの作成とプリンタードライバーのインストールは終了している。
プリンターポートとプリンタードライバーを組み合わせて
プリンターを作成して印刷できるようにする。

前回のおさらいで、
下記のドライバーがインストールされていて、
下記のポート名のポートが作成されているものとする。

- プリンタードライバー名
    - "Canon LBP8710/8720 LIPSLX"
- ポート名
    - 192.168.0.200

もう一度最初の図を思い出して欲しい。

![PrinterInstallImage.png](https://qiita-image-store.s3.amazonaws.com/0/24550/334a4411-1211-b1da-9e83-f0a935c673ad.png)


## ソースコード
下記のようなスクリプトを書いて実行する。
これについては管理者権限で実行しなくとも実行できる。

予め作成した下記のドライバーとポートで、
プリンターを作成している。

- プリンタードライバー名
    - "Canon LBP8710/8720 LIPSLX"
- ポート名
    - 192.168.0.200

```ps1:create-printer.ps1
$PrinterList=New-Object System.Management.ManagementClass("Win32_Printer")
$Printer=$PrinterList.CreateInstance()

# プリンタードライバー
$Printer.drivername="Canon LBP8710/8720 LIPSLX"
# ポート名
$Printer.PortName="192.168.0.200"
# 場所の記述
$Printer.Location="営業所"
# コメント
$Printer.Comment="営業所"
# ディバイス名
$Printer.DeviceID="Canon LBP8710/8720 LIPSLX(僕の営業所)"﻿
# プリンター登録
$printer.Put()
```

1. [PowerShellでプリンターをインストール(概要)](http://qiita.com/arachan@github/items/801d8ef7b41edc452978) 
2. [PowerShellでプリンタードライバーをインストール](http://qiita.com/arachan@github/items/e5f72b2b4f2e44b0bd9f)
3. [PowerShellでプリンターポートの作成](http://qiita.com/arachan@github/items/c2f4f4f10bcd4b80f84e) 
4. PowerShellでプリンターの作成 <- イマココ
5. [Powershellでプリンタードライバーをインストール x86_x64共用版](http://qiita.com/arachan@github/items/966bdde2f686a8fabc33)

次は32bit OSと64bit OSが混在する環境でプリンタードライバーをインストールするスクリプトを説明しようと思う。
PowerShellでプリンターポートを作成

プリンターポートを作成する。
プリンターポートはプリンターとパソコンを接続するための決まりごとなので、
プリンターと通信するために設定する必要がある。

今回は下記の条件のポートを作成することにする

- Port名    192.168.0.200
- RAW mode
- IPアドレス  192.168.0.200
- Port番号   9100

最近のレーザープリンターは大抵、RAWモードでPort番号は9100が使える。
このモードで統一したほうが無難だろう。
Canon LBPシリーズの場合、3910から後のバージョンは全てRAWモードの9100番ポートである。

[LPRプロトコルと標準TCP/IPポート・モニタの違い](http://www.atmarkit.co.jp/fwin2k/win2ktips/809stdprnprt/stdprnprt.html)

## ソース
下記のPowershellを実行するとポートを作成できる。


```ps1:Add-port.ps1
$PortList=New-Object System.Management.ManagementClass("Win32_TcpIpPrinterPort")
$Port=$PortList.CreateInstance()
# Port名
$Port.name='192.168.0.200'
# RAWモード: 1 LPR: 2
$Port.Protocol=1
# PortのIPアドレス
$Port.HostAddress='192.168.0.200'
# Port番号 RAWモードなので9100   
$Port.PortNumber='9100'
# SNMPをonにするかしないか  
$Port.SnmpEnabled=$true
# PrinterPort追加
$Port.Put()
```

1. [PowerShellでプリンターをインストール(概要)](http://qiita.com/arachan@github/items/801d8ef7b41edc452978) 
2. [PowerShellでプリンタードライバーをインストール](http://qiita.com/arachan@github/items/e5f72b2b4f2e44b0bd9f)
3. PowerShellでプリンターポートの作成 <- イマココ
4. [PowerShellでプリンターの作成](http://qiita.com/arachan@github/items/d630b5d06f878ecd0efa)
5. [Powershellでプリンタードライバーをインストール x86_x64共用版](http://qiita.com/arachan@github/items/966bdde2f686a8fabc33)


プリンタードライバーもインストールできた。
プリンターポートも作成できた。
次はプリンターの作成を行う。
PowerShellでプリンタードライバーをインストール

Windowsを含めコンピューターでプリンターを使えるようにするには、
プリンタードライバーをインストールする必要がある。

勿論、予め入っている場合もあるのだが、
新しいプリンターの場合はすでに入っている事は皆無だろう。

[Powershellでプリンターをインストール (概要)](http://qiita.com/arachan@github/items/801d8ef7b41edc452978)で示したとおり、
プリンタードライバーがコンピューターに入っていなければ
そのドライバーを使ってプリンターを作成することはできない。
では、プリンタードライバーのインストールを始めよう。

## プリンタードライバーの取得

今回は、Canon LBP8710 をインストールすることを前提に進めていきます。
Recoh、HP、Xerox等の他のレーザープリンターでも手順は一緒です。

Canonのサイトから最新版をダウンロードしましょう。
[LIPS LX プリンタードライバー (64bit)](http://cweb.canon.jp/drv-upd/ir-adv/lslx-xpx64.html)

## 準備
ダウンロードしてきたドライバーを解凍しましょう。

### infファイルの絶対パスを覚えておく
そしてドライバフォルダの中からinfファイルを見つけ出します。

```
winlipslxver2145x6400 > winlipslxver2145x6400 > x64 > Drivers
```

Driversフォルダの中に CNLB0JA64.INF というinfファイルがあります。
ここにはプリンタードライバー名とそのドライバーに必要なファイル等が書かれています。

![infpath.png](https://qiita-image-store.s3.amazonaws.com/0/24550/6aa36747-0c0a-ae58-2f6a-4649999e2d91.png)

僕はデスクトップに展開したので
infファイルのフルパスは下記のようになります。

```ps1:InfName
C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver\CNLB0JA64.INF
```

### Infファイルに書かれているプリンタードライバー名
infファイルを開けましょう。
該当する "Canon LBP8720/8710 LIPSLX" をコピペしておきます。
一文字でも違うとドライバーを取得してくれません。

```ini:infファイルの中身(抜粋)
; Canon LIPSLX printer INF for Microsoft Windows (x64)
; Copyright CANON INC. 2003
; CNLB0JA64.INF

;64bit x64 Vista
[Canon.NTamd64.6.0]
;このプリンタードライバー名をコピーしておく
"Canon LBP8720/8710 LIPSLX"             = LBP8720,CanonLBP8720/8710_LI26FF
```

### ドライバーのフォルダーの場所
ドライバーのフォルダの場所も必要になります。
下記のパスになります。

```ps1:DriverPath
C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver
```

この3つが必要になるのでメモ。

## 実際のソースコード

- "Canon LBP8720/8710 LIPSLX"
- C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver\CNLB0JA64.INF
- C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver

上記３つのプロパティを該当する部分に代入しておきます。
これを管理者権限で実行するとプリンタードライバーがインストールされます。

```ps1:install_printerdriver.ps1
$PrinterDriverList=New-Object System.Management.ManagementClass("Win32_PrinterDriver")

$PrinterDriver=$PrinterDriverList.CreateInstance()
# プリンタードライバー名 infファイルに書かれている
$PrinterDriver.Name="Canon LBP8720/8710 LIPSLX"
# プラットフォーム Windows NT x86 or Windows x64
$PrinterDriver.SupportedPlatform="Windows x64"
# バージョン　通常は 3　意味は win2k
$PrinterDriver.Version="3"
# ドライバーのパス 通常はinfファイルが入っているフォルダ
$PrinterDriver.DriverPath="C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver"
# infファイル infファイルの場所
$PrinterDriver.InfName="C:\Users\yusuke\Desktop\winlipslxver2145x6400\winlipslxver2145x6400\x64\Driver\CNLB0JA64.INF"

$PrinterDriverList.AddPrinterDriver($PrinterDriver)
# Putするのに管理者権限が必要
$PrinterDriverList.Put()

```

1. [PowerShellでプリンターをインストール(概要)](http://qiita.com/arachan@github/items/801d8ef7b41edc452978) 
2. PowerShellでプリンタードライバーをインストール <- イマココ
3. [PowerShellでプリンターポートの作成](http://qiita.com/arachan@github/items/c2f4f4f10bcd4b80f84e)
4. [PowerShellでプリンターの作成](http://qiita.com/arachan@github/items/d630b5d06f878ecd0efa)
5. [Powershellでプリンタードライバーをインストール x86_x64共用版](http://qiita.com/arachan@github/items/966bdde2f686a8fabc33)

プリンタードライバーがインストールできたので、
次はプリンターポートの作成を行います。
Powershellでプリンターをインストール(概要) 

プリンターのインストールはバッチではなく、
Powershellでインストールすべきだ。

今まではprnport.vbs等のVBSファイルや、
PrintUIEntryをbatで書くようなことが行われていた。
あれは非常に読みにくい。

PowershellとWMIObjectを使えば分かり易くて、
WindowsXP から最新のWindows10まで動くプリンターを
インストールするスクリプトが書ける。

Windows8.1以上の端末を持っている人は、
Add-Printer等のCmdletを使ったほうがいいだろう。

Windows7をお守り続けなければならない我々の性だ。
お付き合いしていただけるとありがたい。

## プリンターのインストールで使うWMIObject
PowershellとWMIを使ってプリンターを追加するには以下の手順を
順番にやる必要があります。

1. プリンタードライバーの追加
2. プリンターポートの追加
3.  プリンターを追加


図解すると下図のようになる。
![PrinterInstallImage.png](https://qiita-image-store.s3.amazonaws.com/0/24550/334a4411-1211-b1da-9e83-f0a935c673ad.png)


WMIObjectではそれぞれ

1. Win32_PrinterDriver
2. Win32_TcpIpPrinterPort
3. Win32_Printer

となります。

## 今後の予定

下記の章立てで１つずつ順番に説明します。

1. PowerShellでプリンターをインストール(概要) <- イマココ
2. [PowerShellでプリンタードライバーをインストール](http://qiita.com/arachan@github/items/e5f72b2b4f2e44b0bd9f)
3. [PowerShellでプリンターポートの作成](http://qiita.com/arachan@github/items/c2f4f4f10bcd4b80f84e)
4. [PowerShellでプリンターの作成](http://qiita.com/arachan@github/items/d630b5d06f878ecd0efa)
5. [Powershellでプリンタードライバーをインストール x86_x64共用版](http://qiita.com/arachan@github/items/966bdde2f686a8fabc33)


1章から4章まで、
Canon LBP8710 LIPSLXをインストールすることを前提に、
実際にプリンターが使えるところまでをソースコードを交えて順番に
説明していこうと思います。

5章では、
その応用として64bitOS、32bitOSが混在している時に
どう対処すればいいかを説明します。

## 参考文献

[Powershell and Printer Servers](https://powershellbitsandbytes.wordpress.com/tag/win32_printerdriver/)
[New-ObjectでWMIObjectを使う方法](https://plus.google.com/+%E8%8D%92%E5%B7%9D%E9%9B%84%E4%BB%8B0/posts/csRmF9kRzN2)

[Win32_Printer class](https://msdn.microsoft.com/en-us/library/aa394363(v=vs.85).aspx)
[Win32_TcpIPPrinterPort class](https://msdn.microsoft.com/en-us/library/aa394492(v=vs.85).aspx)
[Win32_PrinterDriver class](https://msdn.microsoft.com/en-us/library/aa394366(v=vs.85).aspx)
QiChatを使ってPepperを自由に動かす。【チュートリアル】

##関連記事
僕の作成した記事ですが、紹介させてもらいます。

>QiChatを使ってPepperを自由に動かす。【チュートリアル】<-本記事
>http://qiita.com/DeveloperRyo87/items/83a7d0327116214892d4
>QiChatを使ってPepperを自由に動かす。【イベント】
>http://qiita.com/DeveloperRyo87/items/da5a73f15f0da3aea2a2
>QiChatを使ってPepperを自由に動かす。【コラボラティブ】
>http://qiita.com/DeveloperRyo87/items/d4b3f9ae411fc685239a
>QiChatを使ってPepperを自由に動かす。【まとめ】
>http://qiita.com/DeveloperRyo87/items/7a72c039efe2d2954c7b

##始めに
Qichatを使えば、Dialogボックスだけである程度の物事を管理できるようになるので、その辺をまとめた記事がなかったので、作成しようと思います。

今回も、先に記事を公開して、暇があるタイミングで更新していくスタンスで行きたいと思います。

##確認方法
###確認環境
MacBook Pro (Retina, 13-inch, Late 2013)
コレグラフ2.1.3
NAO 2.1.3(basic Channelインストール済み)
うちにはNAOしかいないのでとりあえず、NAOで。
Pepper欲しい。

##方針
~~とりあえず、チュートリアルとして、ルールの使い方や、コンセプトの使い方を簡単に説明して、そのあとは本題のイベントを使った話とか、コラボラティブな話とか書いていきたいです。~~

この記事はまずはチュートリアルとして、Qichat-cheatsheet-の紹介をします。

##チュートリアル

公式ドキュメントのQichat-cheatsheet-のページの日本語訳アレンジです。
僕が普段使うような例にいくつか置き換えております。

また、詳しくはQiita内にも記事を書いてらっしゃる方がいるのでそちらも参考にしてください。

>Qichat - cheatsheet
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_cheat_sheet.html?highlight=cheat

|ルール|構文|例|
|:--:|:--:|:--:|
|topicの作成|topic: ~name|topic: ~introduction|
|ロボットからの発話|	proposal:|	proposal: 一緒におしゃべりしましょう？|
|人の発話入力|u:(...)|u:(あなたの名前は) わたしはナオです。|
|認識可能ワードリスト(or)|[ ]で単語を囲む|	u:( わたしは、[肉 魚]が好きです) わたしもです。|
|回答|人の発話入力に続けて、回答を記述|	u:(こんにちは) こんにちは|
|文章の利用|" "で文を囲む|u:([“わたしはそれが好き” “わたしはそれを愛してる”]) わたしも！！|
|オプションの指定	|{}|u:({かなり}いいね) そうだね！|
|変数の適用|$変数=値|u:(わたしは太郎です) 名前を覚えました。 $name="太郎"　#変数名は英語じゃないと反応しない模様|
|変数の呼び出し|$変数|	u:(私の名前は) $name　です。#太郎です。|
|条件|$変数==比較値|	u:(私の名前は太郎です) [“\$name==太郎 そうです！” “\$name　ではない！”]|
|入力値を値とする|_xxx|u:(私の名前は _[太郎 花子]) あなたの名前は$1|
|補助ルール|	u1: u2: u3:|	u:(質問して) あなたは魚が好きですか？ u1:(はい) はい！美味しいです。 u1:(いいえ) 肉のほうが好きです。|
|イベント|	e:イベント|	u:([e:faceDetected “こんにちは”]) よう!人間！|
|コメント|#|#シャープのあとにコメントが書けます。|
|ワイルドカード|*|u:(わたしは　* が好きです)　そうですか。#わたしは肉が好きです。|
|コンセプト|	~	|u:(~I はあなたが好きだ) わたしも #concept:I [わたし, ぼく]|
|禁止ワード|!単語|u:(わたしは !みかんが 好きです。) わたしもよ！#わたしは好きです。|
|最後の回答を繰り返す|e:dialog/Answered|u:(なんて言ったの) e:dialog/Answered|
|ユーザー入力を繰り返す|$dialog/LastInput|u:(お前が好きだ！) $Dialog/LastInput|

##感想
~~まだまだ、ドキュメントを読み足りていないので、細かく目を通したい。
この記事も、まだまだ書き足りていないので、どんどん書き足していこうと思っています。
今後とも宜しくお願いします。~~

記事を分割しました。
現在はただ分割してあるだけなのでまだ見難いかもしれませんが、おいおい直していきます。


##参考URL

>Qichat - Syntax
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#dialog-rules

>Qichat - Cheatsheet
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_cheat_sheet.html?highlight=cheat
FontForge のインストール


#### brewでfontforgeをインストール
GUIバージョンが欲しいので、X Windowバージョンを指定する。もちろん、そのために[XQuartz](https://support.apple.com/ja-jp/HT201341)を先に入れておかなきゃいけない。

    $ brew install Caskroom/cask/xquartz
    $ brew install fontforge --with-x

インストール後に、

> Run `brew linkapps fontforge` to symlink these to /Applications.

と言われるので、実行すると FontForge.app が /Applications に出来上がる。でも、link -s と同じ動作っぽい。
自作ライブラリをrequreされてもそうでなくても使えるようにする


こないだは自作ライブラリを Browserify でモジュール管理する場合に、その自作ライブラリを書き換えるやり方を書いたけど、そのままだと Browserify を使わない場合にはそのモジュールを使うことが出来なくなる。

それはそれで辛いので、Browserify を使う場合でも、以前のやり方のようにhtmlのスクリプトタグで読み込む場合でもどちらでもライブラリ自体の書き換えなしに使えるようにしようと思う。使う時のことも考えて作るってのが男ってもんだよね。

# 基本方針

## Browserify
* 他で利用するオブジェクトを exports に入れる
* ライブラリが他ライブラリに依存する場合は require する

## ブラウザ
* 他で利用するオブジェクトをグローバル変数に入れる
* ライブラリが他ライブラリに依存する場合はグローバル変数に入ってるものを使う
 
この方針で色々な書き方を試していたんだけど、結局現在主流っぽい書き方がやっぱり秀逸で、もうこれで良いじゃんってなったのでそれにならうことにした。先人はマジ凄い。

代わりに、何故そういう書き方になったのかを解説していこうと思う。

## 大枠
```javascript
( function ( definition ) {
  // ここに使われ方別の定義を書く
} )( function ( root, $, _ ) {
  //ここにモジュールのコード本体を書く
} );
```

まずはこういう大枠を作る。これはよくある形の変形型だと思えば良い。

```javascript
( function () {
  // ここにコードを書く
} ) ( );
```

ここから軽く触れていくことにするけど、これは実際こういう意味。

```javascript
( function ( ) { } )
```

ここで定義した関数を

```javascript
( function ( ) { } ) ( );
```

実行する

なので、定義してすぐ実行するから即時関数とか呼ばれたりする。


そして、この関数はもちろん関数なのだから引数を使う事ができる。

```javasscript
( function ( w ) {} ) ( window );
```

これは、「この関数は w という引数を取る。そして、その引数に入ってる値は window オブジェクトだ」っていみになるよね。

そしてこの実行時に引数として渡す部分をモジュールの本体に置き換えてみる。

```javascript
( function ( mod ) {} ) ( function ( ) { } )
```

これでモジュール本体は mod に格納されていることになる。

##  モジュール本体の記述

そろそろ見やすいとは言い難くなってくるので改行を追加してみる。

```javascript
( function ( mod ) {

} ) ( function ( ) { 
  var modA = function () {
    // モジュールの本体
  };
  return  modA; // 巻数実行時にはモジュールを返す
} );
```

モジュール本体の関数は、返り値としてモジュール自体を返すようにすれば、1行目の mod の中身がモジュール自体になる。

あとは、最初の関数の中でモジュールを返す関数を実行してあげれば良い。

```javascript
( function ( mod ) {
  var modA = mod(); // これでモジュールが作られる
} ) ( function ( ) { 
  var modA = function () {
    // モジュールの本体
  };
  return  modA; // 巻数実行時にはモジュールを返す
} );
```

## モジュールの使用用途別の定義

そうやって作られたモジュールを、後は使用される用途にあわせてグローバルオブジェクトに突っ込むか module.expors に突っ込むかを書いてあげる。

```javascript
( function ( mod ) {

  // browserify ( commonJS )
  if ( typeof exports === "object" ) {
    module.exports = mod();
  } else {
    window.modA = mod();
  }

} ) ( function ( ) { 

  var modA = function () {
    // モジュールの本体
  };
  return  modA; // 巻数実行時にはモジュールを返す

} );
```


## そのモジュールが他モジュールに依存している場合
今までの記述で問題ないように思えるんだけど、実は問題が一つ残っている。それは、モジュール本体が別のモジュールに依存している場合の記述が抜けている。今回の例だったらjQuery。

解決法としては、モジュール本体にまた if文書いて Browserify だったら requireする、とかにしても良いんだけど、環境別の記述が2箇所になるのは避けたい。

なので、モジュールの環境別定義部分の if 文の中でそのモジュールが依存しているモジュールに関しても解決をしてしまうとスマートな記述になる。


```javascript
( function ( mod ) {

  // browserify ( commonJS )
  if ( typeof exports === "object" ) {
    var $ = require( 'jquery' );
    module.exports = mod( $ );
  } else {
    window.modA = mod( window.$ );
  }

} ) ( function ( $ ) {  // 引数に定義箇所で指定した依存モジュールを指定する

  var modA = function () {
    // モジュールの本体
  };
  return  modA; // 巻数実行時にはモジュールを返す

} );
```

実際にやることは、定義部分で呼び出している関数に引数を与えて上げれば良いだけ。 Browserfiy であれば require したものを引数に渡してあげれば良いし、そうじゃない場合は window オブジェクトに既に変数が入っているはず （ この場合であれば window.$ か window.jQuery ）ので、それを引数に渡してやる。


これで大体今まで作ってきたモジュール達がBrowserifyに対応したことになる。
既存 JS ファイルを Browserify 用に書き直す


以前書いた記事で Browserify の使い方とか Browserify でやりたい事が分かったと思う。

では実際に Browserify を使って今までに書いたコードを Browserify 用に書き直してみる。

といっても大したことはない。1つのオブジェクトなり関数にまとめるだけで良い。

例として、よくあるスムーススクロールのスクリプトを挙げる。

```javascript
$(function(){
	$(".anchorlink").on('click', function(e){
		e.preventDefault();

		var href = $(this).attr("href");
		var speed = 500;
		var easing = 'swing';
		var target = $(href == "#" || href == "" ? 'html' : href);
		var animateParam = {
			scrollTop: target.offset().top
		}

		$("html, body").animate(animateParam, speed, easing);
	});
});
```

凄くjQuery的ですね。ではこれを Browserify で呼び出せるコードにしていきます。

# 呼び出す側
まずはBrowserify（というかcommonJS）の仕様にそった記述にしてみる。Browserify は呼び出す側は require() 関数の戻り値を変数として確保する。

```javascript
var anchorLink = require('./anchorLink/anchorLink.js');
```

これは特に難しいことはない。素直にファイルを指定してあげれば良い。

ちなみにこの require 関数で呼び出す際、 node_modules 配下のライブラリはライブラリ名だけで呼び出せたりする。例えば、

```zsh
npm install jquery --dev-save
```

で jQuery を node_modules にインストールしていれば、これで jQuery を呼び出すことが出来る

```js
var $ = require('jquery');
```

bower のライブラリを同様の記述で呼び出すことも可能なんだけど今回は割愛。

# 呼び出される側
呼び出される側、すなわちライブラリ側は、そのファイルの何を外で使うかをそのライブラリ側に記述する必要がある。

```javascript
// hello.js
var mod = {};
var unRequire = {
  name: 'none require' 
};
mod.say = function(){
  console.log('hello');
};
module.exports = mod;
```

この hello.js を呼び出すと、helloメソッドを使えるようになる。unRequire はexportsに入ってないので外から使う事は出来ない。

```javascript
// app.js
var hello = require('./hello.js');
hello.say();
// 'hello'
```

# とりあえず関数に突っ込む
module.exports に突っ込めば良いわけで、スムーススクロールの機能全てを1つの関数にしてやればとりあえずOK。

```javascript
var anchorLink = function(){
	$(function(){
		$(".anchorlink").on('click', function(e){
			e.preventDefault();

			var href = $(this).attr("href");
			var speed = 500;
			var easing = 'swing';
			var target = $(href == "#" || href == "" ? 'html' : href);
			var animateParam = {
				scrollTop: target.offset().top
			}

			$("html, body").animate(animateParam, speed, easing);
		});
	});
}
module.exports = anchorLink;
```

これを呼び出し側で関数を呼び出してあげれば良い

```javascript
// app.js
var anchorLink = require('./anchorLink.js');
anchorLink();
```

これでも良いっちゃ良いんだけど、これだとアニメーションスピードとかオフセット値とかの変更が出来ない。

なので改良してみる



```javascript
var $ = require('jquery');

var anchorLink = function(opt){

	// option のデフォルト値を設定
	opt = opt || {};
	opt.speed = opt.speed || 500;
	opt.offset = opt.offset || 500;

	$(function(){
		$(".anchorlink").on('click', function(e){
			e.preventDefault();

			var href = $(this).attr("href");
			var speed = opt.speed;
			var easing = 'swing';
			var target = $(href == "#" || href == "" ? 'html' : href);
			var animateParam = {
				scrollTop: target.offset().top - opt.offset
			}

			$("html, body").animate(animateParam, speed, easing);
		});
	});
}
module.exports = anchorLink;
```

スピードとかを変更したい場合は呼び出し側でオプションを設定してあげれば良い

```javascript
// app.js
var anchorLink = require('./anchorLink.js');
anchorLink({
	speed: 1000,
	offset: 80
});
```


とりあえず require はこれくらいの知識で使える事は使える気はする。色々もっとやれることあるだろとか思う事も多いコードではあるんだけども、まずは「こういう作り方すれば良い」の雰囲気を掴むことが大事かなぁと思うのでこんな感じで。

次：[JavaScript - 自作ライブラリをrequreされてもそうでなくても使えるようにする - Qiita](http://qiita.com/muyuu/items/66d8055eba22c20c7e18)
NERDTreeがNeoBundleで動かず、pathogenを使う

##NeoBundleでNERDTreeが動かない(mac)
家のMacにNeoBundleを使ってNERDTreeをインストールしたけど、「エディタのコマンドではありません」といわれてしまい動かず。インストール自体は成功しているようでエラーは出ませんでした。

##pathogenを導入して解決
いろいろ調べても分からないので、NeoBundleはあきらめて[公式ページ](https://github.com/scrooloose/nerdtree)で紹介されている[pathogen](https://github.com/tpope/vim-pathogen)を使ってみたら無事うごきました。

###pathogenのインストール
```
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
```
###NERDTreeのインストール
```
cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git
```

以上で無事MacでNERDTreeを動かすことができるようになりました。NeoBundleで動かない原因は追々調べてみようと思います。
AngularJSの$httpや$resourceでのリクエストにAuthorizationヘッダーでの認証を付加する


個別のリクエストではなくインターセプターを使ってまとめて追加。
インターセプターを作って$httpProvider.interceptors配列に追加するだけ。
下記コードは、サーバからのtokenを取得済みなら、Authorizationヘッダーに追加してリクエストするようになる例。

```auth_interceptor.coffee
"use strict"

angular.module("myApp")
.factory("AuthInterceptor", (AuthToken)->
  "request": (config) ->
    config.headers ?=  {}
    if AuthToken.isToken()
      #Authorizationへの記述形式は、サーバの認証方式による。例:Token token="abcdefg...."
      config.headers.Authorization = AuthToken.getTokenString()
    config
).config ($httpProvider)->
  $httpProvider.interceptors.push("AuthInterceptor")

```
パスワードなしでmysqlのコマンドをshellスクリプトから実行する

localの開発などでパスワード無しでmysqlを利用している時に、
shellscriptでmysqlコマンド叩こうとしたらちょっとつまずいたのでメモ。

`mysql -u [user] -p`などと普通にやる(?)とパス入力用のプロンプトが出てしまうので以下のようにすると良い模様。

```shell-session
$ mysql -u [user] --password= [database] 
```

`--password=`がミソ。
OpsWorksでcookbookをEC2上でデバッグする方法

#はじめに
OpsWorksでsupermarketのcookbookを使いたい場合、cookbookの設定が複雑だと、
設定がうまくいかない場合があり、何度もレシピの再実行が必要で、
またその再実行にかなり時間がかかります。

このドキュメントで、EC2上でのcookbook/recipeのデバッグTipsをメモしていきます。

#環境
Chef 11.10
Amazon Linux 2015.03

#手順
## cookbookのデプロイ場所へ移動する
```
$ sudo su
# cd /ops/aws/opsworks/current
```

## デバッグ用のGemライブラリをインストールする
Gemfileに以下を追加する

```lang:/ops/aws/opsworks/current/Gemfile
gem 'pry'
gem 'pry-byebug'
gem 'pry-doc'
gem 'pry-stack_explorer'
```

インストールする

```
# /ops/aws/opsworks/local/bin/bundle install
```

## レシピを編集する
レシピは、site-cookbooksフォルダではなく、
merged-cookbooks下のレシピを編集します。

```
cd /ops/aws/opsworks/current/merged-cookbooks
```

### デバッグを開始したいコードに以下を挿入する

```
binding.pry
```

## chef-clientでレシピを実行する
jsonはご自身の環境のものに差し替えてください

```
/opt/aws/opsworks/current/bin/chef-client -j /var/lib/aws/opsworks/chef/2015-06-22-12-05-24-01.json -c /var/lib/aws/opsworks/client.stage2.rb -o cookbook_name::recipe_name
```

/var/lib/aws/opsworks/client.stage2.rb 内で、
環境変数がクリアされます。
私の場合、レシピの先頭に以下を追加しました。

```lang:default.rb
ENV['GEM_PATH'] = '/opt/aws/opsworks/current/vendor/bundle/ruby/2.0.0'
ENV['GEM_HOME'] = '/opt/aws/opsworks/current/vendor/bundle/ruby/2.0.0/gems'
ENV['BUNDLE_GEMFILE'] = '/opt/aws/opsworks/current/Gemfile'
```
Rの変数操作と型

# 変数への代入

```
x <- 5 # => 5
x = 5 # => 5
```

`ls()` : 変数一覧
`rm(x)` : 変数の消去

# 型

+ 数値
+ 文字列

---

+ ベクトル
+ 行列
+ リスト
+ データフレーム

---

+ NULL
+ TRUE/FALSE
+ NA(欠損値)
+ NaN(非数)
+ Inf(無限大)

# 数値と文字列
##数値

```
10 / 3		# => 3.3333
10 %/% 3	# => 3 (商) 
10 %% 3	# => 1 (余)

2 ^ 4 		# => 16
cos(1) 	# => 0.5403023
sqrt(2) 	# => 1.414214 (平方根)
round(2.55) # => 3
```

##文字列

```
"abcdefg"
paste("a","b","c") 			# => "a b c"
paste("a","b","c",sep="")	# => "abc"

as.charactor(x)				# => "5"
as.numeric(x)					# => 5
```

# ベクトル
##ベクトルの作成

```
v <- c(1,3,5)					# => 1 3 5
v[2]							# => 3
v <- c("abc", "bdef")
v <- c(TRUE, FALSE)
length(v) 					# => 2
v <- 1:10						# => 1 2 3 4 5 6 7 8 9 10
v <- 1:-10					# => 1 0 -1 -2 ..       -10
v <- seq(1, 10, by=2) 		# => 1 3 5 7 9
v <- seq(1, 10, length=5) 	# => 1.00 3.25 5.50 7.75 10.00
v <- rep(1:5, times=3) 		# => 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
v <- rep(1:5, length=5)		# => 1 2 3 4 5
```

##ベクトルの演算

```
x <- c(1, 3, 5)
y <- c(1, 2, 3)

x * 2 				# => 2 6 10
x - 1				# => 0 2 4

x + y 				# => 2 5 8
x > y 				# => FALSE TRUE TRUE
x %in% y 			# => TRUE FALSE FALSE

union(x,y) 		# => 1 2 3 5
intersect(x,y) 	# => 1 3
setdiff(x,y) 		# => 2 5
setequal(x,y) 	# => FALSE
```

#因子ベクトル
カテゴリー付きのベクトル
あとで因子分析ができる

`factor(x)` : xベクトルから因子ベクトルを作成
`levels(x.fc)` : レベルを表示
`odered` : 大小関係をつける

```
x <- c("S","M","M","L","S")
x.fc <- factor(x) 				# => Levels L M S

levels(x.fc)						# => L M S

x.fc <- factor(x, levels=c("S","M","L"))

levels(x.fc) 						# => S M L

x.or <- odered(x, levels=c("S","M","L"))

levels(x.or) 						# => S < M < L

```

参考

+ [ドットインストール R入門](http://dotinstall.com/lessons/basic_r)
Jenkins の git プラグインでコミットログが文字化けするのを回避する(Windows)

ググるとUTF-8にあわせるやり方が色々載ってるが、それをやるとバッチやMSBuildへ影響があって何かと不都合なことが多い。

それならいっそのことCP932にしてしまえ、とやってみたらうまくいった。

設定は手っ取り早くやるなら以下をジョブとして Jenkins に登録して実行すれば良い
```
git config --global i18n.logoutputencoding cp932
```
Amazon S3 Cross Region Replicationをやってみた。

# 試した経緯

会社の後輩が担当する案件で、オフショア(東南アジア某国)とのファイルのやり取りをAmazon S3でやるということで、相談を受けました。
最初はアカウントの管理どうするぐらいの話でしたが、S3のバケットを東京リージョンに作成すると、オフショア側でファイルをGet/Putするとき、時間がかかるのではないかと思って、シンガポールリージョンにS3バケットを構築するのを提案したものの、逆に、日本からのPutするときに時間がかかるのではないかと考え（実際はそこまで時間がかかるものではないと思いますが。）、そういえば、リージョン間レプリカ機能があったなぁ・・・と思って、提案した次第。

# やってみた
1. S3のbucketを東京とシンガポールに作成。
2. Versioningをそれぞれ有効可。
3. Cross-Region Replicationを有効化して、レプリケーションする元バケットと先バケットを指定。
4. IAMロールがなければ、その時に自動生成されるので、それを利用。作ってもいいかもしれない。

終わり。

ちょっとしたファイルなら、バケット切り替え段階では、コピーが終わってましたね。
数Mクラスでもすぐにコピーされているようですね。

# まとめ
設定簡単だし、DR/BCPに使えそうですね。
あと、調べていたら、まだ東京にはない（近々登場の予定ですが）Lambdaが使えるUSリージョンインとレプリケーション設定をして、東京リージョンにファイルを置いたら、USリージョンにコピーして、Lambdaを実行なんてこともできるようですね。
[Amazon S3のCross-Region Replicationを使ってAWS Lambdaを発火させる](http://dev.classmethod.jp/cloud/aws/lambda-execution-by-using-cross-region-replication/
)

# 反省
今さらなネタですし、もうちょっと画面キャプチャーとか入れないとダメですね。
Glassfishで、ドキュメントルート外のディレクトリを仮想的にマッピングする方法


## 本記事の概要
Webアプリケーションのドキュメントルート外にあるコンテンツを、アプリケーションのドキュメントルートにマッピングする方法について。
仮想ディレクトリマッピングと言われているものです。

## 経緯
某プロジェクトにて、下記の業務要件を満たすためにいくつかの方式を検討した。

**やりたいこと**
『外部から連携された画像イメージをサムネイル表示する』
下記のURLでファイル参照可能にすること。（WEBアプリケーションをデプロイした時点で、imageというディレクトリは存在しない）
http://～～/コンテキストルート/image/～～

* 方式1
　外部のファイルシステムをドキュメントルート内にマウントする
* 方式2
　外部のファイルシステムを既存の共有NAS（/data）にマウント、ドキュメントルートにシンボリックリンクを作成
* **方式3
　外部のファイルシステムを既存の共有NAS（/data）にマウントし、仮想ディレクトリを利用してアプリケーションから参照可能にする**
 

方式1と方式2が不採用となった理由
* 外部連携ファイルをドキュメントルート内に配置するのは、システム構成的にイケていない
* デプロイする度に再マウントやシンボリックリンクの張り直しが発生してしまう
* デプロイ・パッチリリースの仕組み上、はじめにバックアップを取得するが、取得したバックアップに外部連携ファイルが含まれるというのもイケていない

## どんな時に役立つか

* アプリケーションの資源（開発したもの）ではなく、ドキュメントルート外、つまりサーバのローカルディスク（または外部のディスクをマウントなど）に蓄積されるファイル群にアクセスしたい場合
 　例：バッチ処理で作成した画像ファイルを画面上に表示する
  
* アプリケーション資源だが、別ドメインのアプリケーションや、別サーバのアプリケーション等との共有ファイルとして扱いたい場合
　例：ヘルプ用PDFを共有NASに配置してアプリケーションから参照する

## 設定方法
（例）下記の要件を実現することを考える。
◆アクセスURL：
http://～～/コンテキストルート/image/～～

◆マッピング先ディレクトリ：
/data/image/
　
【glassfish-web.xml（またはsun-web.xml）の設定】

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
  ...
  <property name="alternatedocroot_1" value="from=/image/* dir=/data"/>
</glassfish-web-app>
```
　
glassfish-web-appタグの子要素としてpropertyタグを配置する。
◆name属性：alternatedocroot_1 (複数設定する場合は_2、_3）
◆value属性：
　　from：コンテキストルート以下のパス
　　dir：マッピングするドキュメントのルートパス

__※dir（/data） + from（/image） 配下を見に行くことになります。__


## 3種類の指定方法
```xml
<property name="alternatedocroot_1" value="from=/my.jpg dir=/srv/images/jpg"/>
<property name="alternatedocroot_2" value="from=*.jpg dir=/srv/images/jpg"/>
<property name="alternatedocroot_3" value="from=/jpg/* dir=/src/images"/>
```

（例）ではalternatedocroot_3の記述を紹介しました。

それぞれの使い分けは割愛します。
http://docs.oracle.com/cd/E19798-01/821-1752/geqpl/index.html

## まとめ
* Glassfishの仮想ディレクトリマッピングを利用することで、アプリケーション外部のファイルに容易にアクセスできるようになる
* 一方で、開発者や運用者からすると仕掛けが見えにくい部分があるので注意が必要
chibiosでLチカの練習　その２

## threadを使ってみた。

```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 	THD_WORKING_AREA_SIZE(4096)
#define cputs(msg) 				chMsgSend(cdtp, (msg_t) msg)
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
		chThdSleepMilliseconds(2000);
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
		chThdSleepMilliseconds(2000);
	}
}
int main(void)
{
	halInit();
	chSysInit();
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdSleepMilliseconds(1000);
	chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		chThdSleepMilliseconds(500);
	}
	return 0;
}

```
kubectlでサービスを動かしポート開放してみた

## 参考

* [Testing Kubernetes with an Atomic Host — Project Atomic](http://www.projectatomic.io/blog/2014/11/testing-kubernetes-with-an-atomic-host/)

## サービスの起動

```bash:
# for SERVICES in \
  etcd kube-apiserver kube-controller-manager  kube-scheduler docker kube-proxy.service  kubelet.service
do
  systemctl restart $SERVICES
  systemctl enable $SERVICES
done
```

```bash:
# kubectl get minions
NAME        LABELS        STATUS
127.0.0.1   Schedulable   <none>    Ready
```

### nginx.jsonの作成

```bash:~/nginx.json
{
  "id": "nginx1",
  "kind": "Pod",
  "apiVersion": "v1beta1",
  "desiredState": {
    "manifest": {
      "version": "v1beta1",
      "id": "nginx1",
      "containers": [{
        "name": "nginx1",
        "image": "nginx",
        "ports": [{
          "containerPort": 80,
          "hostPort": 8081
        }]
      }]
    }
  },
  "labels": {
    "name": "nginx"
  }
}
```

* hostPort でポート番号指定。

```bash:
kubectl create -f nginx.json
```

```bash:
# kubectl get pod nginx1
POD       IP           CONTAINER(S)   IMAGE(S)   HOST                  LABELS       STATUS    CREATED
nginx1    172.17.0.1   nginx1         nginx      127.0.0.1/127.0.0.1   name=nginx   Running   4 minutes
```

```bash:応答があることを確認
curl http://localhost:8081
```

# Atomic Host側をOS再起動

* Atomic Host側でethernetが有効になっていない場合、サービス起動に失敗する。

```diff:/etc/sysconfig/network-scripts/ifcfg-enp3s0
- ONBOOT=no
+ ONBOOT=yes
```

nginxのサービスが自動起動していることを確認。

```bash:応答があることを確認
curl http://localhost:8081
```
Swiftで部分文字列

Swiftで部分文字列を作る。substring的な何か。
Swift Standard Library Playgroundそのままだが

・そもそも人間が見る文字列とバイト列の間ではindexが違うので、intでrangeを指定するとエラーになる。
・したがってString.indexを使わなくてはならない。
・文字列はstartIndexとendIndexを持っている。String.indexを操作するのにはadvance（）を使う。

というわけで

例：先頭から140文字を取ってくる

let text = "ものすごく長い文字列のつもり。140文字以上あると思ってください"
let range = text.startIndex..<advance(text.startIndex, 140, text.endIndex)
let shortText = text[range]
Jenkisの起動・停止


停止

```
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
```

起動

```
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
```

起動したら`http://localhost:8080/`をブラウザで開いて確認

参考 http://damien.co/general/how-to-start-stop-restart-or-reload-jenkins-mac-osx-8022
AWS でのうるう秒対応



## うるう秒とは
地球の自転は、厳密に86400sec(=24hour) __ではない__。
時期や天候、地質学的な条件によっても不規則に変化するらしいです。
ですが、通常は1日を86400secとして生活してるので、どこかで帳尻を合わせたい。。
そこで、 __対応するのがうるう秒__というわけです。

来たる UTC 2015/06/30 23:59:60 が、うるう秒にあたり、
1日が1秒だけ長くなります。

### 余談
現在の「秒」の定義は、
> セシウム133の原子の基底状態の二つの超微細準位の間の遷移に対応する放射の周期の9,192,631,770倍に等しい時間。

であり、1日の長さ(Length of Day)とは無関係である、という認識らしい。

## AWS での2つの挙動
### - *A. UTC 2015/06/30 23:59:59 が2回表示*
### - *B. 24時間かけて、1秒をとかす*

### ■ EC2
#### __[対応]__
不要。
2012.09 以降のAmazon Linux AMI であれば、
デフォルトのNTP configuration 使っている限り、問題ありません。

※ 上記より古い場合、kernel のバグによって、
High CPU Utilization や System hang-up が起きるかもしれません。

#### __[挙動]__
A . UTC 2015/06/30 23:59:59 が2回表示

※ __B. 24時間かけて1秒をとかしたい場合__
UTC 2015/06/30 23:59:59 が2回表示されるのでは困る場合、
SLEW MODE を使って対応可能です。
(SLEW MODE には、`ntp-4.2.6p5-30.24.amzn1`以降である必要がある。)

```
# NTP daemon を Stop
$ sudo /etc/init.d/ntpd stop
# config を編集
$ sudo vim /etc/sysconfig/ntpd
# 下記のように編集
-OPTIONS="-g"
+OPTIONS="-g -x"
# daemon を Start
$ sudo /etc/init.d/ntpd start
```

### ■ AWS コンソール
#### __[対応]__
不要
#### __[挙動]__
B. 24時間かけて、1秒をとかす

なので、コンソール画面のメトリクス等に、
"** : ** : 60" といった秒数の表示は現れません。

### ■ その他
- CloudSearch
- EC2 Container Service
- EMR
- RDS
- Redshift

#### __[対応]__
不要
#### __[挙動]__
A . UTC 2015/06/30 23:59:59 が2回表示

## リンク
### AWS
https://aws.amazon.com/blogs/aws/look-before-you-leap-the-coming-leap-second-and-aws/
https://forums.aws.amazon.com/ann.jspa?annID=3064
### うるう秒
http://jjy.nict.go.jp/news/leap-info2015.html

## おまけ ~command~
### pkg情報確認
```
$ rpm -q kernel
$ rpm -q ntp
```

### kernel version 確認
```
$ uname -r
```

### 最新のntpをinstall
```
$ sudo yum --releasever=latest install ntp
```

## おまけ ~GCP~
Google Cloud Platform では、1秒を溶かしてくれるみたい。
http://googlecloudplatform.blogspot.jp/2015/05/Got-a-second-A-leap-second-that-is-Be-ready-for-June-30th.html

## おわりに
2015年7月1日は、1日が1秒長い ＼(^o^)／
Run Apache Spark on Mac


一見敷居が高そうなBig data frame work Apache Sparkを試してみました。とてもSparkの実行は簡単です。


# Spark version
1.4.0


# Download binary file
```
$ wget http://www.apache.org/dyn/closer.cgi/spark/spark-1.4.0/spark-1.4.0.tgz
$ tar zxvf spark-1.4.0-bin-hadoop2.6.tgz
```


# Run examples
## Scala
```
$ cd spark-1.4.0-bin-hadoop2.6
$ ./bin/run-example SparkPi
```


Sparkの例は[Github](https://github.com/apache/spark/tree/master/examples/src/main)にあり、なかにどうのように実行すればいいか書いてある場合があるので、なにか動かしたいひとはとりあえず例をみる。もしくは、パッケージと対応しているのでパッケージのパスを`run-example`に渡す。

例

```
$ ./bin/run-example org.apache.spark.examples.mllib.Correlations
```

## Python
```
$ ./bin/spark-submit examples/src/main/python/pi.py
```
Pythonの場合であれば、spark-submitを使う。同様コードはexmaplesの中にある。



# Compile from source

```
$ git clone git://github.com/apache/spark.git
$ cd spark
```


Export JAVA_HOME

```
$ export JAVA_HOME=$(/usr/libexec/java_home)
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home
```

build spark

```
$ ./build/mvn -DskipTests clean package
```

10分くらいかかる模様。

```
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:25 min
[INFO] Finished at: 2015-06-25T08:34:17+09:00
[INFO] Final Memory: 72M/612M
```
RailsでコントローラーのRSpecを書いている時にパラメータを見たい（デバッグの方法）

## RSpecでController spec

### Controller specをひな形生成

ファイル名やディレクトリ名、必要なrequireなど、間違えると変にハマる罠を避けるため、初心者はgeneratorを使う方が良いことに気づいた。

```
$ ./bin/rails g rspec:controller blogs
```

生成ファイル：spec/controllers/blogs_controller_spec.rb

生成されるファイルはこんな感じ。

```spec/controllers/blogs_controller_spec.rb
require 'rails_helper'

RSpec.describe BlogsController, type: :controller do
end
```

### post時のパラメータの渡し方がよくわからない・・

対象のコントローラーにpostリクエストを渡す。

post :create, パラメータの渡し方！！

パラメータの渡し方がイマイチよくわからない・・・

## 渡したパラメータの実際の値を確認したい

テスト用のログファイルを見ると確認出来る。

こんな感じ。下は失敗している時のログ
Parameters:が見たかったところ。

```log/test.log
Processing by BlogsController#create as HTML
  Parameters: {"id"=>"62", "title"=>"My Test Blog", "created_at"=>"2015-06-24 23:06:43 UTC", "updated_at"=>"2015-06-24 23:06:43 UTC"}
...
```

成功したときのログ

```log/test.log
Processing by BlogsController#create as HTML
  Parameters: {"blog"=>{"title"=>"My Test Blog"}}
...
```

## 特定のスペックだけ実行

ログが大量に出るので、見たかったスペックのパラメータがどれか迷子にならないように、RSpecで対象のテストだけを実行する方法

```
$ bundle exec rspec spec/controllers/blogs_controller_spec.rb:16
```

スペックのある行を:nで指定。

## ログファイルの監視

```
$ tail -f log/test.log
```

## パラメータの渡し方幾つかのやり方

#### attributes_for(:blog) を使う

```
post :create, blog: attributes_for(:blog)
```

ココで使われている ``` attributes_for ``` は FactoryGirlのメソッド
FactoryGirlを使っていない場合は使えない。
また、FactoryGirlの接頭辞を抜かすためには[FactoryGirlの設定](http://qiita.com/muran001/items/436fd07eba1db18ed622#2-2)が必要。

上述の設定無しで呼び出す場合は、フルネームで書く。

```
post :create, blog: FactoryGirl.attributes_for(:blog)
```

#### @blog.attributes を使う方法

```
@blog = FactoryGirl.build(:blog)
post :create, blog: @blog.attributes
```

あえて一度モデルを経由している状態。
この説明ではモデル生成に結局FactoryGirlを使っているので、説得力がないが、FactoryGirl無しの状態でモデルを作って渡す場合などはモデルの ```attributes``` を使うと良いみたい。

ちなみにFactoryGirl.createでモデルを生成&保存してしまうと次行の ``` post :create``` と2個モデルを作ってしまうことになるので注意。

## 完成したテスト。こんな感じになった

```spec/controllers/blogs_controller_spec.rb
  describe 'POST #create' do
    it "新規作成したらBlogが増えていること" do
      expect {
        post :create, blog: FactoryGirl.attributes_for(:blog)
      }.to change(Blog, :count).by(1)
    end
  end
```

## （補足：自分的な注意点）FactoryGirl でモデルを生成する時に知っておくべきこと

- FactoryGirl.create モデルを生成&保存する
- FactoryGirl.build モデルの生成のみ（保存しない）
- FactoryGirl.attributes_for モデルを生成してハッシュで返す（保存しない）

## 困ってること

ホントはguard使ってるので、guardで変更箇所だけ実行してくれたときに、log/test.logにログが出てくると嬉しいんだけど・・出てこないみたい・・・
実はやり方が悪いだけで出ますよ！とかあったら教えてください。。
CentOS Atomic host少し触ってみた

## 参考

* [Atomic: /usr/bin/atomic — Project Atomic](http://www.projectatomic.io/docs/usr-bin-atomic/)

## atomicコマンドの使い方

```bash:
atomic run ntpd
```

# index.docker.ioに接続できない場合は数分待てば解決した

* [can't reach index.docker.io · Issue #3203 · docker/docker](https://github.com/docker/docker/issues/3203)

```bash:できない？？
-bash-4.2# atomic run ntpd
Trying to pull repository docker.io/ntpd ... not found
FATA[0004] Error: image library/ntpd:latest not found
```

```bash:ネットには繋がってるよな・・・
-bash-4.2# ping google.co.jp
PING google.co.jp (173.194.126.247) 56(84) bytes of data.
64 bytes from nrt04s08-in-f23.1e100.net (173.194.126.247): icmp_seq=1 ttl=53 time=3.67 ms
^C
--- google.co.jp ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.673/3.673/3.673/0.000 ms
```

```bash:やはりダメか
-bash-4.2# docker pull ntpd
Trying to pull repository docker.io/ntpd ... not found
FATA[0003] Error: image library/ntpd:latest not found
```

環境変数の `MIRROR_SOURCE`, `MIRROR_SOURCE_INDEX`を変更すればよかったのかも。


## 5分待った結果

```bash:成功
-bash-4.2# docker pull nginx
latest: Pulling from docker.io/nginx

64e5325c0d9d: Extracting 29.88 MB/51.36 MB
bf84c1d84a8f: Download complete
aaa04ccb1cff: Download complete
c25a494fd450: Download complete
2b4392756878: Download complete
a58c6ba7d446: Download complete
64e5325c0d9d: Pull complete
bf84c1d84a8f: Pull complete
aaa04ccb1cff: Pull complete
c25a494fd450: Pull complete
2b4392756878: Pull complete
a58c6ba7d446: Pull complete
6391a6648407: Pull complete
0b6365661275: Pull complete
5c1f0ec6cd7b: Pull complete
36f0b0306c21: Pull complete
107c338c1d31: Pull complete
319d2015d149: Already exists
docker.io/nginx:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:0952acc92b56f936b5b5b93a6b7abb9205ec7ec64b920e113a6d9dae50f6f49d
Status: Downloaded newer image for docker.io/nginx:latest
```

# rancherとか起動してみる

```bash:
atomic run rancher/server
```

# cockpitは含まれていない

* 手で入れるか、rancherを使うか。
chibiosでLチカの練習

グリーン、イエロー、レッドの順に点滅。![chibios.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/57d49219-22b9-2f96-427e-017d303539de.png)

```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 	THD_WORKING_AREA_SIZE(4096)
#define cputs(msg) 				chMsgSend(cdtp, (msg_t) msg)
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
int main(void)
{
	halInit();
	chSysInit();
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	while (!chThdShouldTerminateX())
	{
		cputs("green on");
		chThdSleepMilliseconds(500);
		cputs("green off");
		cputs("yellow on");
		chThdSleepMilliseconds(500);
		cputs("yellow off");
		cputs("red on");
		chThdSleepMilliseconds(500);
		cputs("red off");
	}
	return 0;
}
```
c/c++ > 間接参照 > General Protection Fault (GPF) > オペレータオーバーロード時には短絡評価しない、ことを教えていただいた

引用: C++プログラミングの落とし穴 by Steve Oualline

```
while(
   (std::strcmp(cur_cmd->cmd, cmd) != 0) &&
   cur_cmd != NULL)
```

> ...いくつかのシステムではNULLを間接参照すると（リストの末尾で間接参照すればこのようになる)、コアダンプが発生する。



>MS-DOSマシンなどの低機能なシステムでは、メモリ保護がないためNULLの間接参照が許される。Microsoft Windowsはこの点を改善しており、NULLポインタの関節参照はGeneral Protection Fault(GPF)になる。

> ループは次のように記述されるべきだった。

```
while(
    (cur_cmd != NULL) &&
    (std::strcmp(cur_cmd->cmd, cmd) != 0))
```

> ...この文は、C++標準の現行の実装に依存している。...安全のため、この記述は次のように改めるほうがよい

```
while(1) {
   if (cur_cmd == NULL) 
      break;
   if (std::strcmp(cur_cmd->cmd, cmd) == 0)
      break;
```

<hr>
間接参照
http://www.wakhok.ac.jp/~kanayama/C/98/node88.html
lubuntuで画面キャプチャ

* PrintScreenキー
* Alt+PrintScreenキー

で$HOMEにpng保存されることがわかったが、もう少し柔軟な方法は以下

## 参考

* [[SOLVED] Screenshots with lubuntu?](http://ubuntuforums.org/showthread.php?t=1521606)

## scrot

```bash:5秒後
scrot -d 5
```

```bash:ウィンドウ指定
scrot -s
```
lubuntuメモ

## LXSession configuration

* lxsession-default-apps パッケージに含まれる様子

# vncserver + lxde

## 参考

* [[lubuntu] HOWTO: Lubuntu VNC server installation in Saucy 13.10](http://ubuntuforums.org/showthread.php?t=2193100)


## ~/.vnc/xstartup

```bash:
/usr/bin/lxsession -s Lubuntu -e LXDE &
```


# VPN設定はパッケージが入っていなくて設定できない件

## 参考

* [networking - VPN - "ADD" button is not active! - Ask Ubuntu](http://askubuntu.com/questions/218798/vpn-add-button-is-not-active)

## 対応

```bash:
sudo apt-get install network-manager-pptp
```

## 確認

* 追加 -> (一番下に)VPNの項目が増えていることを確認。
MovableTypeからHugoにブログ記事を移管するために下調べしたのでまとめ

# パーマリンクは維持できるの？

Hugoはパーマリンクをどう構成するかについて柔軟度が高いので、維持できそうです。

例えば私の場合はMTで `http://example.com/YYYY/MM/foobar.html` という形式のパーマリンクなので、Hugoに移管する場合は、ビルド後に`public/YYYY/MM/foobar.html` というファイルが生成されるように設計すればパーマリンクを維持することはできそうです。

# HTMLをmd形式にコンバートしないといけないの？

Hugoでは、`content/foo.html`のようにcontent以下にhtmlファイルが置いてある場合はmarkdown→HTML変換が行われなずにそのままHTMLとして解釈してくれるようです。
なのでMTの記事データ(がHTMLで書かれてる場合は)わざわざmd形式にコンバートする必要はなさそうです。

# カテゴリやタグは移管できるのか？

できます。
Hugoの個別記事ファイルのヘッダ部で"tags"と"categories"を記述すれば、タグ,
カテゴリとして認識してくれます。

```sample_article.md
+++
date = "2015-06-22T20:17:39+09:00"
title = "はろー"
tags = [  "Go", "fast", "Blogging" ]
categories = [ "Development" ]
+++

はろーはろー
```


# MovableTypeのDBデータのうち必要なもの

## mt_entry

|カラム|解説|
|---|----|
|entry_id|記事ID|
|entry_title|件名|
|entry_basename|ファイル名から拡張子を除いたもの|
|entry_authored_on|公開日 (これがパーマリンクになる)|
|entry_text|本文|
|entry_text_more|本文続き|

## mt_placement
|カラム|解説|
|---|----|
|placement_category_id|カテゴリID|
|placement_entry_id|記事ID|

## mt_category

|カラム|解説|
|---|----|
|category_id|カテゴリID|
|category_label|カテゴリ名|

# 参考
[Hugoにおける記事要約の仕組み](http://qiita.com/DQNEO/items/4cc651aa1c2d0ced9fae)
[MovableTypeにおけるパーマリンクは何を元に生成されているのか？](http://qiita.com/DQNEO/items/aae3ef73253de4831d84)
[MovableTypeで記事とカテゴリの関連付けはどこに保存されているのか？](http://qiita.com/DQNEO/items/cb75cd99baf058d3e51b)
命令形プログラミングと関数型プログラミング

*関数型プログラミングってなんだと思ったので自分なりに調べてメモしておきます。（個人的に調べてまとめたものなので間違いがあるかも。かなりざっくりしてます）
# 関数型プログラミング
+ 宣言型プログラミングの一種で「問題の性質を記述する」ことでプログラミングすること
+ 「まるで要件仕様を述べるようにロジックが流れていく」。入力と出力を関数によって記述し目的の値を求めるアプローチ
+ 永続データプログラミング（破壊できない、再代入できない）とも言う。永続データを駆使して行うプログラミング  

#### 宣言型プログラミングの例
+ SQLクエリ  
`SELECT * FROM userTable WHERE user_id = 1`  
上記のSQLクエリがuserTableからuser_id=1のものを探してきて！ということを意味しています。ただ「どのような手順で探すか」「どのように求めるか」などの情報は一切自分では書いていません。全てSQLクエリに任せています。  


# 命令型プログラミング
+ メソッドによるデータ構造の変更や副作用を伴い「まるで小説のような」ロジック
+ 再代入により破壊できるデータ(for文の変数iなどが典型例)
+ 個人的に真っ先に思いつく言語はJava

#### 命令形プログラミングの例
+ 宣言型プログラミングのSQLクエリの命令形プログラミングVer
<pre>for(int i=0;i < userTable.lenght;i++){
	if(userTable[i].user_id==1){
		sysout(userTable[i].user_id);
		}
	}</pre>
こんな感じですかね。（すみません。ものすっごくテキトウに書きました）変数iを代入しているところが命令形プログラミングの部分ですかね。


#　疑問
僕は1年くらいJavaをやってきた人間で、それ以外の言語はあんまり触ったことがありません。なので代入なしでどうやってfor文とかを実現するの？と真っ先に思いました。このあたりはこれから関数型プログラミングを勉強するしかありませんね。
MovableTypeで記事とカテゴリの関連付けはどこに保存されているのか？

# 記事とカテゴリの紐付け情報はmt_placementテーブルに保存されています。


```sql
select * from mt_placement  order by placement_entry_id;
```

自分のブログで見てみたらこんな結果でした。

| placement_id | placement_blog_id | placement_category_id | placement_entry_id | placement_is_primary |
|--------------+-------------------+-----------------------+--------------------+----------------------|
|            1 |                 1 |                     1 |                  6 |                    1 |
|            2 |                 1 |                     2 |                 10 |                    1 |
|            3 |                 1 |                     3 |                 11 |                    1 |
|            4 |                 1 |                     2 |                 13 |                    1 |
|            5 |                 1 |                     2 |                 14 |                    1 |
|            6 |                 1 |                     2 |                 17 |                    1 |
|            7 |                 1 |                     2 |                 18 |                    1 |
|           10 |                 1 |                     5 |                 18 |                    0 |
|

placement_is_primaryは名前から類推するに「主要カテゴリ」でしょうか。

# mt_entry.entry_category_id は嘘だ

mt_entryテーブルにentry_category_idというそれっぽい名前のカラムがあるのですが、
あれは空です。

歴史的事情というやつでしょう。
preprocessor symbolでOSを確認しとく

なんだかよく使うのでメモ。

```cpp:define.h
#if defined(_WIN32) || defined(_WIN64)
#
#  define OS_WINDOWS
#
#elif defined(__APPLE__)
#
#  include "TargetConditionals.h"
#  if TARGET_OS_IPHONE
#    define OS_IOS
#  else
#    define OS_OSX
#  endif
#
#elif defined(__ANDROID__)
#
#  define OS_ANDROID
#
#elif defined(__linux)
#
#  define OS_LINUX
#
#else
#
#  error unsupported platform
#
#endif
```
MongoDB覚書

[前回](http://qiita.com/toru2220/items/8f8a16f86db6876d4b7b)のインストールからの続き。
#####REST Interfaceを有効にする
```bash
echo rest = true >> /etc/mongodb.conf
/etc/init.d/mongodb restart
```
#####データベース作成
```bash
mongo
MongoDB shell version: 2.1.1
connecting to: test
> use rasp
switched to db rasp
> db.info.insert({"name":"debian","path":"/path/to/sample"})
> db.info.find();
{ "_id" : ObjectId("558ade97e3e39a6523b43fc6"), "name" : "debian", "path" : "/path/to/sample" }
```
#####REST経由で追加・参照してみる
```bash
curl -d '{ "name" : "redhat", "path" : "/path/to/sample/redhat"}' 'http://localhost:28017/rasp/info/'
{ "ok" : true }
curl 'http://localhost:28017/rasp/info/'         {
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "558ade97e3e39a6523b43fc6" }, "name" : "debian", "path" : "/path/to/sample" } ,
    { "_id" : { "$oid" : "558ae0499ae859637fa175d5" }, "name" : "redhat", "path" : "/path/to/sample/redhat" }
  ],

  "total_rows" : 2 ,
  "query" : {} ,
  "millis" : 0
}
```
細かいが、最後の"/"を忘れると取得に失敗する。

参考：[MongoDBとブラウザだけで旅の記録をつけてみるか](http://qiita.com/syokenz/items/00b06ac01adeeaebada4)
AngularJS の Directive のコールバック(isolate scope の &)でパラメータを受け取る方法

例えばディレクティブ内の非同期処理終了後に、処理結果を受け取って何かをしたい場合はこうする

```html:html
<directive callback="vm.callback(promise)"/>
```
```js:directive
scope.callback({promise: defer.promise})
defer.resolve(result)
```
directive 側で指定した JSON のキー名が呼び出し側では引数名になる。

例

```html:html
<div ng-controller="directiveParamCtrl as vm">
    <directive-param callback="vm.callback(promise)"/>
</div>
```
```js:directive
angular.module('demo', [])
    .controller('directiveParamCtrl', function(){
        this.callback = function(promise){
            promise.then(function(param){
                console.log(param.time, param.mes) // 3, 3秒経ちました
            })
        }        
    })
    .directive('directiveParam', function($timeout, $q){
        return {
            scope: {
                callback: '&'
            },
            template: '<div>directiveParam</div>',
            link: function(scope,el){
                var s = 3;
                var defer = $q.defer();
                $timeout(function(){
                    var mes = s + '秒経ちました';
                    el.text(mes)
                    defer.resolve({
                        time: s,
                        mes: mes
                    });
                },s * 1000)
                scope.callback({promise: defer.promise})
            }
        }
    });
```
Spring読書用リンク一覧

// テスト投稿を兼ねて

勉強用に読もうとしているもののリンク一覧です。


タツノオトシゴの日記
http://d.hatena.ne.jp/tatsu-no-toshigo/20121023

Spring Framework 入門
http://matome.naver.jp/odai/2134970698031018601

Spring3のSpring MVCでなるべく最小単位のHello world
http://qiita.com/siguremon/items/84c831391a6204079fd2

// お仕事で断片的には構造を知っていますが改めて勉強しようと思います。
// 設定漏れを何度も起こしてブルーになっています。。
// 良いところ知りたいです。