OmniAICreator/Qiita-1.07M huggingface dataset:
【しずおかアプリ部】活動ログ　第27回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２７回


##■開催日##
２０１６年１０月２２日（土）　１６：００～１８：００


##■参加者##
１４名


##■活動内容（概要）##
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム 〜物理演算Chipmunk Physics editor編2〜」
・部員さんプレゼン「１５パズルを作ってみた」 
・部員さん提供「PSVRとOculusRiftでのVR体験」


##■活動内容（詳細）##

【実演・プレゼン】


**・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム 〜物理演算Chipmunk Physics editor編2〜」**

　PhysicsEditor（以下PE）で設定した剛体を、cocos studio2（以下cs2）で配置する。
　　PEで作成した剛体をコードで配置するのはスマートではない。
　　そこで配置をcs2上で行い、コードで剛体と配置データを紐づけて使う方法を試してみた。

![IMG_7331.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/8391cbc6-ec24-b53a-ed29-0e59a45b0f1d.jpeg)

　　以下手順
　　１．PEで対象物の剛体作成し出力
　　２．cs2で対象物の配置し出力
　　３．上記２つの出力データをXcodeに登録
　　４．ソースコードで紐づけを行う

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/88105/456dcf3f-f067-c4b2-c88e-a43a491fbcd3.png)

　　■まとめ
　　　Physics editorで個々の剛体を作成し、
　　　配置はcocos studio2を使うことによってステージ作成が簡単にできるようになる！

　　資料：[第27回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム～physicsEditor編2～).pdf](http://monolizm.com/sab/pdf/第27回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム～physicsEditor編2～).pdf)
　　プロジェクト一式：[AngryChicken26.zip](http://monolizm.com/sab/src/AngryChicken26.zip)



<hr>
　

**・部員さんプレゼン「１５パズルを作ってみた」 **

　　Scratch、CUI環境、GUI環境と3つの環境で15パズルを作成した。
　　　GUI版にはDxLibを利用。

![IMG_7333.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/367bd9e3-c037-d31e-3a64-158576752195.jpeg)

　　　開発中に直面した問題。
　　　・最初の盤面を作成する際、ランダムに配置すればよいと思っていた。
　　　　しかしランダムに配置するとクリアできない盤面が生まれてしまうことが判明。
　　　　解決策として、完成状態からシャッフルする方法で盤面を作成する方法を考えた。

![IMG_5216.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/6a93f981-48df-1d90-0aa3-20cc20756b77.jpeg)


　　資料：[第27回_プレゼン資料(15パズルを作ってみた).pdf](http://monolizm.com/sab/pdf/第27回_プレゼン資料(15パズルを作ってみた).pdf)
　
　　プログラムだけではなく、資料もプレゼンもしっかりしていて、
　　とても中学生とは思えない、将来有望な部員さんでした。
　　更なる進化を期待しています！


<hr>
　　　　


**・部員さん提供「PSVRとOculusRiftでのVR体験」**

　発売直後のPSVRを持ってきて頂きました！
　開封の儀から、セットアップ、そして体験まで。
　360度見れるだけでなく、前後上下左右の動きも追従するため、
　違和感なくVRの世界に入れました。
![IMG_7334.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/fc618ed0-7dd7-1e0c-e82e-8603ceea2825.jpeg)

　また、製品版OculusRift(CV1)もお持ちいただきました！
　VRの世界でTPS視点のアクションゲーム、Unrealエンジンのサンプル、動画コンテンツなどなど。
![IMG_7335.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/3b7ae4f0-6d14-3df5-cccb-afcb8c5c046f.jpeg)

　やはりVRはゲームへの没入度が違います。体験した人にしかわからない、あの「世界の中に入っちゃった」感。
　PS4というコンシューマ向けのプラットフォームで楽しめるPSVR。
　PC向けもコンシューマ向けもスマホ向けも、今後のコンテンツ拡充が楽しみです。

<hr>
AudioUnit Pluginを作りたい


えー、AudioUnitですが、まぁ情報が少ない。

あってもiOSの話が多いのですが、Logicで使えるプラグインが作りたいわけですよ。

ソフトシンセとかサチュレーションエフェクトとかMIDIエフェクトのアルペジエーターとか。

まぁ本当はチャンネルストリップみたいなの作りたいんですよね。

分かりやすい3バンドぐらいのEQとCompで微妙に歪んで倍音が出る感じの作りたいなー。

真空管とテープのシミュレータも作りたいんだけど、どういう挙動なのか実はあまり良くわかってないです。

真空管って非対称に歪むらしいんだけど、どう非対称なんだ？っていうね。

テープはEQで上下ゆるくカットしてコンプ掛かる感じですかね。

# Xcode

まずはXcodeが必要です。

昔はプラグイン用のテンプレートがあったみたいなんだけどなくなったらしいのでサンプルコードをいじってみようと。

https://developer.apple.com/library/content/samplecode/sc2195/Introduction/Intro.html

オーディオの入力信号処理するのがかったるいので、まずはシンセを作ってみようということで、AudioUnitInstrumentExampleをコピー。

AUPublic, PublicUtilityというディレクトリにAUを使うためのコードが入ってるので、同じ階層にコピーしないと参照解決のために面倒なことになります。

そして、名前を変えるのだけど、まずファイル名は右側のペインで変えるっていうのがXcodeのUIの直観的じゃないところです。

Command+Shift+Fでファイル横断検索ができるっぽいので、これでSinSynthという文字を片っ端から置き換えました。

プロジェクトファイルをクリックすると出て来るinfoタブ(info.plistの内容を編集できるっぽい。ちょっとUIがバグってる)のnameってところが軽くミソです。

hoge:fuga

とやると、プラグイン選択のところでhogeが親ディレクトリ的な感じでまとまります。

製作者名:プラグイン名

みたいにするとクールですね。

左上の再生ボタンっぽいのを押すとbuildが走ってエラーがなければコンポーネントファイル(実体はディレクトリ)が出来ます。

左ペインの一番左のアイコン、Project navigatorからProductsっていうディレクトリを開けると入ってます。

実体はわけわからないところに入ってるので気にしないことにします。

# プラグインをインストール

で、一回これをデスクトップ辺りにコピって来て、~/Library/Audio/Plug-Ins/Components/ にコピーしました。

自分のホームじゃなくて、 /Library/Audio/Plug-Ins/Components/ に入れても良いっぽいです。

これでインストールされたはず。

# AU lab

AU labっつーツールが比較的手軽にプラグインの挙動を確認できるので良かったです。

http://www.apple.com/jp/itunes/mastered-for-itunes/

なんですが、上記リンクのを入れ直したら認識しなくなったんですよね。

どうもバージョンが2.3系から2.2系に落ちてるっぽい。

https://developer.apple.com/download/

からDLしても2.2系です。

このタイミングでゴミ箱が上書きされて復帰できない。

詰んだか……？

# GUI

とりあえず置いておいてここからは記憶で書きます。

GUIはCocoaで書く方法もありますが、オーディオ処理するだけならデフォルトのUIが勝手に？出来ます。

サンプルだとコンストラクタの中でやってる Globals()->UseIndexedParameters() が読み書きするパラメータの数を表しています。

Globals()->SetParameter() がindex, valueという構造みたいですね。

で、サンプルを読む限り GetParameterInfo() ってのがUI側から呼ばれてくるのでここにいろいろ突っ込んで返してあげる感じになります。

ここで値の型とか限界値とか表示名とかを決めるみたいです。

ってここまで動いてたんですけどね、認識しなくなってしまったので終了です。

サンプルのSinSynthも認識しない（GarageBandでも……Logicは別のマシンに入ってるので試してない）ので何か根本的におかしいのかもしれません。

つづく(願望)……というかHelp Me!
LINE Bug Bounty Programに報告して認定されなかった脆弱性（2）／先を越されていた脆弱性

[LINE Bug Bounty Program](https://linecorp.com/ja/security/bugbounty/)

他の記事

- [LINE Bug Bounty Programに報告して認定されなかった脆弱性（1） - Qiita](http://qiita.com/kusano_k/items/d8a5b40317c35c7719fa)

結果が公表されたので、報告したけど既に他の人が報告済みで報奨金をもらえなかった脆弱性と、すでにLINEが把握しているからと認定されなかった脆弱性を紹介する。
[【コーポレート】脆弱性報告による報奨金支払い制度「LINE Bug Bounty Program」の結果について | LINE Corporation | ニュース](http://linecorp.com/ja/pr/news/ja/2015/1138)

### アクセストークンを平文で送信する

すでにLINEが把握しているからということで認定されなかった。

LINEの認証は`X-Line-Access`という独自HTTPヘッダを付与することで行われている。ユーザー検索などで他人のプロフィール画像を表示するときは、`http://obs-jp.line-apps.com/os/p/uユーザーID/preview`から取得していた。このとき、HTTPなのに`X-Line-Access`が付与されていた。うろ覚えだけど、この`X-Line-Access`を使っても、他のLINEの操作はできなかった気がする。だから後回しだったのかも。今はプロフィール画像の取得がHTTPSになっている。

### *.line-apps.comの重要なCookieにセキュア属性が付与されていない

9月9日に報告。すでに他の人が報告済みとのことでダメだった。

LINEバイトなどがこのドメイン上でウェブサイトとして実装されている。[利用規約](https://static.line.naver.jp/_1/LINE-bug-bounty/pdf/LINE_Bug_Bounty_2015.pdf)によると、「(15) 重要ではないCookieのセキュアフラグ属性の不在」は対象外らしいが、セッションIDという重要なCookieにもセキュアフラグが付与されていなかった。

普通のウェブサイトならば、ターゲットにHTTPのページを踏ませれば奪取できるけれど、LINEの場合はアプリ内のWebViewで動いているので、ブラウザで開かせても意味が無い。LINEに送ったリンクはアプリ内のWebViewではなく、ブラウザで開かれてしまう。幸い、画像等の静的リソースはHTTPで取得しているので、この通信を書き換えて、`http://hogehoge.line-app.com`にリダイレクトさせるとCookieが取得できる。

### LCSLoaderのXSS

同じく、9月9日に報告。

LINEバイトなどが読み込む[LCSLoader_20150326.js](https://scdn.line-apps.com/channel/sdk/js/LCSLoader_20150326.js)には下記のような部分がある。

```js
sVer=getValueFromCookie("cordovaVersion");
  ：
document.write('<script type="text/javascript" src="https://scdn.line-apps.com/channel/sdk/js/android/' + sVer + '/cordova_20150326.js"></script>');
```

一見、Cookieに値を書き込めるのはLINEのサイトからだけなので、Cookieの値をエスケープせずに書き出しても問題は無いと思える。このスクリプトが読み込まれるのがHTTPのサイトだけならば確かにそうだが、HTTPSの場合は、HTTPでCookieを改竄することでHTTPSのページにスクリプトを注入できるので問題になる。

このサイトも静的リソースはHTTPで読み込んでいるので、上記のセキュア属性無しCookieと同様にリダイレクトして、その通信を改竄してCookieを書き換えることができる。ただし、このスクリプトが実行されるのはページが読み込まれるときのみで、以降の操作はAjaxで処理されている。一旦LINEに戻り、LINEバイトを開いてもLINEバイトを開く直前にアプリでCookieが上書きされてしまう。`parttime-channel.line-apps.com`ではなく`line-apps.com`に対してCookieを発行することで、スクリプトが動いた。Cookieはドメインが短い方が優先されるらしい。

Cookieを経由するというちょっと変わったXSSだし、攻撃するには違うドメインにCookieを発行するという一工夫が必要なので、これはいけるかなと思ったものの、他の人が先に報告していたとのこと。残念。もっと早くに探していれば……。
AWS Lambdaを使ってEC2を起動・停止する

EC2を立てるまではいいのだけど、使ってもないのに起動しぱなっし。いつの間にか結構な金額になっちゃう....
`t2.nano`, `t2.micro`でもチリも積もれば山。でも、節約のためにわざわざ止める作業もくっそ面倒('A`)
んで、意外に見つからなかったので、EC2を自動起動・停止するAWS Lambda Functionを作ってみた。

## 設置方法

AWS LambdaのScheduled Eventを使っています。詳しい設置方法については省かせて頂きます。

ソース:
https://github.com/OopsMouse/scheduled-power

## 使い方

以下のようにEC2インスタンスにタグを追加して下さい。

![tag.png](https://qiita-image-store.s3.amazonaws.com/0/5046/1163285e-79f5-b208-ad81-f7131e13cbb7.png)

#### 使えるタグ :

| タグ | 説明 |
|:----:|:----:|
| `PowerOn` | インスタンスを起動する時間 (JST) |
| `PowerOff` | インスタンスを停止する時間 (JST) |

#### 使える時間フォーマット :

以下のフォーマットで記載することができます。
現在、JSTのみ対応しています。

- `1:00 pm`
- `1:00 p.m.`
- `1:00 p`
- `1:00pm`
- `1:00p.m.`
- `1:00p`
- `1 pm`
- `1 p.m.`
- `1 p`
- `1pm`
- `1p.m.`
- `1p`
- `13:00`
- `13`
ライブラリのInfo.plistが原因で遭遇したiTunesConnectアップロードエラー


[LGTM](https://toshi0383.github.io/LGTM/)のiOS版のストア申請でハマったので共有しておきます。

# ITMS-90060 (RxSwift)
```
ERROR ITMS-90060: "This bundle is invalid.  The value
for key CFBundleShortVersionString '3.0.0-beta.1' in
the Info.plist file must be a period-separated list of
at most three non-negative integers."
```

# ITMS-90056 (Async)
```
ERROR ITMS-90056: "This bundle Payload/LGTM.app/Frameworks
/Async.framework is invalid. The Info.plist file is missing
the required key: CFBundleVersion."
```

# workaround
```
$ cat scripts/fix-lib-version-strings-if-needed.sh
#!/bin/bash
major=${1:?}
minor=${2:?}
name=${3:?}
for i in `find Carthage/Checkouts/${name} -name "*.plist"`; do
    plutil -replace 'CFBundleShortVersionString' -string ${major} "$i"
    plutil -replace 'CFBundleVersion' -string ${minor} "$i"
done;
$ ./scripts/fix-lib-version-strings-if-needed.sh 3.0.0 1 RxSwift
```

# Solutions
- RxSwift => "Do not submit the beta version." [ReactiveX/RxSwift/issues/878#issuecomment-247425466](https://github.com/ReactiveX/RxSwift/issues/878#issuecomment-247425466)
- Async   => [duemunk/Async/pull/108](https://github.com/duemunk/Async/pull/108)

# 解説
Info.plistのバージョン設定がおかしいライブラリがあったせいで、エラーになりました。
Info.plistをplutilコマンドでいじって申請は通しました。
RxSwiftに関してはbeta版なんだからストアに申請すんなというスタンスのようで、AsyncはCarthageでビルドした場合だけおかしくなる状態だったため、PRを出しました。
各ライブラリがSwift3.0対応などを進めている過程で、色々不安定になっているようです。

こういう場合、CocoaPodsはPodfileにスクリプトを書く形で回避できるようですが、Carthageは今の所別途上のようなスクリプトを実行する必要がありそうです。
RStanで混合分布の推定

混合分布のパラメタをRstanで推定する。

####1. 正規分布が二つの場合

```r
library(rstan)

src <- "
data {
  int N;
  int M;
  real x[N];
}

parameters {
  real mu[M];
  real sigma[M];
  simplex[M] pi;
}

model {
  real ps[M];
  for(n in 1:N){
    ps[1] <- log(pi[1]) + normal_log(x[n], mu[1], sigma[1]);
    ps[2] <- log(pi[2]) + normal_log(x[n], mu[2], sigma[2]);
    increment_log_prob(log_sum_exp(ps));
  }
}
"

x <- c(rnorm(150, 1, 1), rnorm(850, 10, 3))
dat <- list(N=length(x), M=2, x=x)

out <- stan(
  model_code = src,
  data = dat,
  iter = 4000,
  warmup = 2000,
  thin = 1,
  chains = 2,
)

summary(out)
```

####2. ポアソン分布が二つの場合

```r
library(rstan)

src <- "
  data {
    int N;
    int M;
    int x[N];
  }

  parameters {
    real kappa[M];
    simplex[M] pi;
  }

  model {
    real ps[M];
    for(n in 1:N){
      ps[1] <- log(pi[1]) + poisson_log(x[n], kappa[1]);
      ps[2] <- log(pi[2]) + poisson_log(x[n], kappa[2]);
      increment_log_prob(log_sum_exp(ps));
    }
  }
"

x <- c(rpois(150, 1), rpois(850, 5))
dat <- list(N=length(x), M=2, x=x)

out <- stan(
  model_code = src,
  data = dat,
  iter = 4000,
  warmup = 2000,
  thin = 1,
  chains = 2
)

summary(out)
```

####3. 一様分布の上限を推定

```r
library(rstan) 

src <- " 
  data { 
    int<lower=1> N; 
    real<lower=0> x[N]; 
  } 

  parameters { 
    real<lower=0, upper=1000> high; 
  } 

  model { 
    high ~ uniform(0,1000); 
    x ~ uniform(0, high); 
  } 
" 

x <- c(sample(0:10, 1000, replace=T)) 
dat <- list(N=1000, x=x) 

out <- stan( 
  model_code = src, 
  data = dat, 
  iter = 4000, 
  warmup = 2000, 
  thin = 1, 
  chains = 2, 
) 

summary(out)
```
Font Awesome でリンクにアイコンをつける

## 前提

- Font Awesome が読み込まれている状態
    - CDN, ローカルは問いません
    - インストールしていない方は [こちら](http://fontawesome.io/get-started/) をどうぞ

## こんなことをします

![Screenshot from 2016-10-22 20-26-00.png](https://qiita-image-store.s3.amazonaws.com/0/95900/33d6b441-1b84-a5d1-0a76-7d418df2de69.png)



## リンクにアイコンをつける

[Font Awesome Cheatsheet](http://fontawesome.io/cheatsheet/) から使いたいアイコンの__クラス名__を調べる．

CSS に以下のクラスを作成する．

```css:CSS
.icon::before {
  display: inline-block;
  margin-right: .5em;
  font-family: fontawesome;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
```

アイコンを付けたい a 要素で次のようにクラスを指定する．

```html:HTML
<a class="icon fa-github" href="#">GitHub</a>
<a class="icon fa-twitter" href="#">Twitter</a>
<a class="icon fa-facebook-official" href="#">Facebook</a>
```

## リンクに色付きアイコンをつける

[Font Awesome Cheatsheet](http://fontawesome.io/cheatsheet/) から使いたいアイコンの __unicode__ を調べる．

CSS に以下のクラスを作成する．

```css:CSS
.github-icon::before {
  color: #333;
  font-family: fontawesome;
  content: "\f09b";
  margin-right: .5em;
  display: inline-block;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.twitter-icon::before {
  color: #00aced;
  font-family: fontawesome;
  content: "\f099";
  margin-right: .5em;
  display: inline-block;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.facebook-icon::before {
  color: #305097;
  font-family: fontawesome;
  content: "\f082";
  margin-right: .5em;
  display: inline-block;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
```

アイコンを付けたい a 要素で次のようにクラスを指定する．

```html:HTML
<a class="github-icon" href="#">GitHub</a>
<a class="twitter-icon" href="#">Twitter</a>
<a class="facebook-icon" href="#">Facebook</a>
```


## 参考

- https://dusted.codes/making-font-awesome-awesome-using-icons-without-i-tags
GitHubのreleasesダウンロード数をSlackに投げるシェルスクリプト

# 概要
Slack APIをシェルスクリプトから叩きます。
基本的にはGitHub APIから取得したデータを，SlackのWebhook URLにPOSTするだけです。

# 具体的にやったこと
自分の作ったBootstrapのForkテーマ[Rin](http://rinhoshizo.la)のダウンロード数を定期的にSlackに投げるスクリプトです。

# ソースコード(修正版)
関数が含まれていると適切にcronで動作しないため，修正しています。

```sh
#!/bin/sh

# Global Params
HONOKA=0
RIN=0
text="HonokaのDL数は *`curl -s https://api.github.com/repos/windyakin/Honoka/releases | jq '[.[] | .assets[].download_count] | add'`*, RinのDL数は *`curl -s https://api.github.com/repos/raryosu/Rin/releases | jq '[.[] | .assets[].download_count] | add'`* にゃ＞ω＜／ <https://docs.google.com/spreadsheets/d/hoge|集計シート>"
username="Rin"
icon_emoji=":rin:"
channel="#general"
curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${text}\", \"icon_emoji\": \"${icon_emoji}\"}" https://hooks.slack.com/services/T0D0GURC7/hoge/hogehoge
```

# ソースコード(旧版)
```sh
#!/bin/sh

# Global Params
RIN=0  #Rinのダウンロード数

# Get download count from Github
# @param $1 userID
# @param $2 repoName
# @return all_download_count (https://api.github.com/repos/$1/$2/releases)
getResponse() {
  curl -s https://api.github.com/repos/$1/$2/releases | jq '[.[] | .assets[].download_count] | add'
}

# Get Rin's download count
getDownloadCount() {
  RIN=`getResponse "raryosu" "Rin"`
}

# Send message to slack
sendMessage() {
  getDownloadCount
  text="RinのDL数は *${RIN}* にゃ＞ω＜／"
  username="Rin"
  icon_emoji=":rin:"
  channel="#general"
  curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${text}\", \"icon_emoji\": \"${icon_emoji}\"}" https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXX
  eval $curl
}

sendMessage
```


## 解説
### getResponse()
GitHubのAPIからダウンロード数を取得します。
本当はこの関数ではAPIからのレスポンスだけを取得しようと思っていたのですが，面倒だったので`jq`でダウンロード数の総和を出しています。
引数1: GitHubユーザ名
引数2: リポジトリ名

### getDownloadCount()
前述の理由から， `getResponse()` 関数にレスポンスを投げるだけの関数になりました…。

### sendMessage()
Slack APIに投げるリクエストの生成及び実行を行っています。
`username`変数には，メッセージを投げるユーザ名を指定します（Botなのでどんな名前でも構いません。もちろん日本語でも。）
`icon_emoji`はそのユーザ名のemojiを指定します(任意)。
`channel`にはメッセージを投げる先のチャンネルを指定します。
`text`にはメッセージ本文を指定します。

# その他
初シェルスクリプトなので，これでいいのか悪いのか…
あまりきれいなソースではないし，シェルスクリプトである必要ではないので，後日Rubyのスクリプトにでも書き直します。
cronとかで定期的に回せばとりあえずbotとして動作します。

# 改訂
* 2016.10.22 `function` キーワードは ksh/bash/zsh 特有なため削除 & Github -> GitHub (Thanks @akinomyoga!)
* 2016.10.23 `sendMessage` 関数の可読性を高める変更
* 2017.01.17 関数が含まれるとcrontabで適切に動作しないため，修正版を公開
[小ネタ] セッションの一括無効化

パスワード漏洩やブルートフォース攻撃などに対処するため、あるアカウントでログインしている全てのデバイスのセッションを無効化できなければいけない。多くの Web フレームワークはリクエストのあったセッションの無効化は対応しているが関連するセッションまでは関知しない。以下のような実装を行うことでフレームワークのソースを改修しなくても対処することが出来る。

1. セッション発行時に日時情報を付加しておく。
2. アカウントにセッション有効日時を付加する。
3. パスワードが変更されたタイミングなどでセッション有効日時に現在時刻を設定。
4. リクエストのあったセッションがその有効日時より前に生成されたものなら無効なセッション。
テーブルの途中のN行を取得するいくつかのSQL文


ページネーションの実装など、テーブルのN行目から(N + M)行目を取得したい場合、どのようなSQL文を発行すべきでしょうか。まず一番手っ取り早いのは、`LIMIT-OFFSET`が実装されている場合はそれを使うことです。

```sql
SELECT *
FROM table
ORDER BY sort_cond
LIMIT 20 OFFSET 10
```

あるいは次のような構文(`LIMIT 開始位置, 取得行数`)も許容されていたような気がします(記憶があいまい)。

```sql
SELECT *
FROM table
ORDER BY sort_cond
LIMIT 10, 20
```

`LIMIT`が実装されていない場合は、次のように`FETCH`で代用します。

```sql
SELECT *
FROM table
ORDER BY sort_cond
OFFSET 10 ROWS 
FETCH FIRST 20 ROWS ONLY
```

`LIMIT`も`OFFSET`も利用できない場合はまず`ROWNUM`疑似列の使用を検討します。これは確かOracleで有効だったような……(記憶があいまい)

```sql
SELECT *
FROM table
WHERE ROWNUM BETWEEN 10 AND 30
ORDER BY sort_cond
```

これもだめなら最終手段。ウィンドウ関数の`ROW_NUMBER()`を利用して、無理やり疑似的な行番号を振ってやることになります。

```sql
SELECT * 
FROM 
    (SELECT
        col1,
        col2,
        ROW_NUMBER() OVER(ORDER BY sort_cond) AS rownum
    FROM table)
WHERE rownum BETWEEN 10 AND 30
ORDER BY sor_cond
```

~~パフォーマンス? 知ったこっちゃねえや~~
Tips

　一時的なメモ置き場です．内容はころころ変更されるのでお気を付けください．移動した場合は極力リンクを貼るようにします．

# 一次的なキーボードマップの変更

```shell-session: CentOS 6.8
日本語キーボード
$ setxkbmap jp

英語キーボード
$ setxkbmap us
```
Rails5.0 基本事項まとめ 〜①よく使うコマンド編〜

# 概要

ターミナルでRailsを操作する時によく使うコマンド一覧です。

# Rails-Command

## 新規アプリケーションの作成

```
$ rails new <appName>
```

### MySQL Ver.

```
$ rails new <appName> -d mysql
```

## サーバ起動

```
$ rails s(erver)
```

## マイグレーションスクリプトを実行

```
$ rails db:migrate
```

## 雛型ファイルの作成

### Migration

```
$ rails g migration AddAuthorToBooks author:string
```

カラム名と型の間にはスペースを開けない事。

### Model + Migration

```
$ rails g model book title:stirng memo:text
```

### Routes + Controller + View

```
$ rails g controller books index
```

### Scaffold = Model + Migration + Routes + Controller + View

```
$ rails g scaffold book title:string memo:text
```

## railsリソースの削除

  ```
$ rails d(estroy) <Resource>
```

## 1行ずつコードを実行

```
$ rails c(onsole)
```
縦書きのvertical rhythmを実装するcompassのmixin

compassを使って縦書きのvertical rhythmデザインを実装しようと思ったが、mixinを自作する必要があったのでメモ。

# 横書きvertical rhythmに使用するmixin

compassでvertical rhythmを実装するには以下の三つのmixinを使う。

```scss:vertical.scss
$font-size: 20px;
@include adjust-font-size-to($font-size, 1);
@include leader(1, $font-size);
@include trailer(1, $font-size);
```
これをコンパイルすると

```css:vertical.css
font-size: 1em;
line-height: 1.5em;
margin-top: 1.5em;
margin-bottom: 1.5em;
```
となり、`margin-top`と`margin-bottom`がつく。
しかしこれでは、横書きでしか使用できない。


# 縦書きvertical rhythmに使用するmixin
縦書きで必要なのは`margin-right`と`margin-left`である。
それの実装のために、`leader-rl`と`trailer-rl`というmixinを作る。
margin(もしくはpadding)のrightとleftを付けたいので、

```scss:vertical.scss
@mixin leader-rl($lines, $font-size, $property) {
    @if $property==padding {
        padding-right: $base-line-height * $lines;
    }
    @else {
        margin-right: $base-line-height * $lines;
    }
}

@mixin trailer-rl($lines, $font-size, $property) {
    @if $property==padding {
        padding-left: $base-line-height * $lines;
    }
    @else {
        margin-left: $base-line-height * $lines;
    }
}
```

と書く。
引数は通常の`leader`,`trailer`と同じ`(行数,font-size,margin or padding)`である。
mixin内で使用していない`font-size`は引数統一のためである。

以下のように書き

```scss:vertical.scss
$font-size: 20px;
@include adjust-font-size-to($font-size, 1);
@include leader-rl(1, $font-size);
@include trailer-rl(1, $font-size);
```

コンパイルすると

```css:vertical.css
font-size: 1em;
line-height: 1.5em;
margin-right: 21px;
margin-left: 21px;
```

となる。
marginの単位をemにする方法は分からないので、今の所はpxのままでやるしかない。
Node.js v7 で async/awaitを試してみる

# 背景

Node.js v7が `Nightly build` で使えるようになり、 `async/await` も使えるようになっていたのでメモ

※ `Nightly build`とは...
http://www.sophia-it.com/content/%E3%83%8A%E3%82%A4%E3%83%88%E3%83%AA%E3%83%BC%E3%83%93%E3%83%AB%E3%83%89

# Node.js v7 の nvm インストール

```
nvm install 7
```

もしかすると、下記のようなエラーが出るかも。
その場合、`nvm use --delete-prefix v7.0.0-nightly20161020d62e7bd1f9`を実行してください。

```
nvm is not compatible with the npm config "prefix" option: currently set to "/usr/local/Cellar/nvm/0.31.2/versions/node/v7.0.0-nightly20161020d62e7bd1f9"
Run `npm config delete prefix` or `nvm use --delete-prefix v7.0.0-nightly20161020d62e7bd1f9` to unset it.
```

# async/awaitを含んだコードの実行

下記のコードを保存し、
`node --harmony-async-await app.js` で実行すると、

- `スタート` と出力
- 約1秒待つ
- `途中` と出力
- 約1秒待つ
- `終わり` と出力

といった挙動を見せてくれます。

※ 今のところ `--harmony-async-await` というオプションを付けないと動きません

```js:app.js
const wait = (delay) => {
  return new Promise(resolve => setTimeout(resolve, delay));
}

async function tryWaitFunction () {
  console.log('スタート')
  await wait(1000);
  console.log('途中')
  await wait(1000);
  console.log('終わり')
}

tryWaitFunction();
```
Octave Simple Tutorial

Courseraの機械学習コースなどで使われることの多いOctaveについて、基本的なチュートリアルを紹介します。

## Install

こちらからダウンロードしてインストールを行います。なお、Windows10ではまだ動作確認がすんでない模様。

[Download GNU Octave](https://www.gnu.org/software/octave/download.html)


## 変数の保存とロード

*  `save`で現在の変数を保存する。拡張子はmatだとバイナリになるがtxtでも保存できる。変数名を指定することで特定の変数のみ保存可能。
*  `load`でファイルをロード。データファイルや`save`で保存したファイルなどをロードする。`load('filename')`というように関数的に使用することも可能
*  `clear`で初期化が可能。
*  `who`で現在利用している変数を一覧表示。`whos`で詳細な情報を参照可能
* `source`で`.m`ファイルをロードできる(同じフォルダにあれば自動で読み込んでくれるが)
* `fieldnames`で、構造やオブジェクトの項目名を取得することができる

## 行列/ベクトルの宣言

*  `size`で行列のサイズを表示する(2, 3などと表示される)。
*  `length`でベクトルの長さを取得する。行列の場合は次元の長い方となる。
*  `A = [1 2 ; 3 4 ; 5 6]` これで3*2の行列となる。要素は空白、行は`;`で区切る。
*  `A(1,2)`は行列内の1行2列目の要素(2)を取得。
* `A(2,:)`で1行目を取り出す(3 ,4)。`A(:,2)`は2列目となる。`A([1 3], :)`で1行目と3行目を取得。
* `A = [ A, [10 ; 11; 12]]`とすることで列を追加
* `A(:)`で、行列要素を一列にまとめることができる
* `C = [A B]`とすることで、列方向に行列を合成できる
* `C = [A　; B]`とすることで、行方向に行列を合成できる
* `A .* B`はAのx,yとBのx,y同士を掛け合わせる。`.`は行列内の各要素に対する操作を意味し、`A .+ 1`なら全要素に+1となる。
* `ones(x,y)`でx*yの、要素の値がすべて1の行列を作成できる。`zeros`、`rand`も同等に使用可能。
* `eye(x)`でx*xの単位行列。
* `A'`と`'`を付与することで転置行列となる。
* `find( v < 3)`でv内の3未満の要素を列挙する。行列の場合、`[r , c]= find(A >= 7)`とすることで条件を満たす要素の行、列番号がそれぞれr,cに入る。
* `flipup`は行列を左右反転する
* `pinv`で逆行列(`inv`でもよいが逆行列が求められないケースに対応できる)


## 比較演算子

* `~=`がnot equalとなる

## 文字列

* `sprintf`が利用可能。`(sprintf('answer = %0.2f', a))`など。

## グラフ表示

* `hist(data)`でdataのヒストグラムを出力。`hist(data,x)`でx個の区分で表示する。
* `plot`で折れ線グラフを表示可能。
* `hold on`で消さずに上書き可能。
* `xlabel`,`ylabel`でx軸/y軸にラベルをつける
* `legend`で系列のラベルを設定
* `title`でタイトル表示
* `print`で画像として保存可能(オプションで画像の形式を指定`-dpng`ならpng)。
* `figure(1); plot(..`とすることで複数画面を立ち上げられる。
* `subplot(x,y,z)`で、x,yで区切った区画のz番目にグラフを表示可能。
* `axis`で軸の値を設定可能
* `clf`でクリア
* `imagesc(A)`で行列をヒートマップ的に表示可能。

## 制御構造

**for**

```
for i = 1:10,
  xxx
end;
```
`break`, `continue`を利用可

**while**

```
while i <=5 ,
  xxx
end;
```

**if**

```
if 1 == 6,
  xxx
end;

if v(1) == 1,
  xxx;
elseif v(1) == 2,
  yyy;
else
  zzz;
end;
```

## 関数定義

```
function y = yourfunction(x)
  y = x^2;
end;

function [y1,y2] = yourfunction(x)
  y1 = x^2;
  y2 = x^3;
end;
```

関数を保存する場合は、拡張子を`.m`とする(ファイルから読み込むときは`end;`がいらない模様)。
`addpath`でパスの追加(`classpath`のようなもの)。


## Other Tips

* `%`はコメントとして扱われる
* `help` でコマンドのドキュメントを参照可能
*  `pwd` でカレントパス
*  `cd/ls`などのLinuxコマンドを利用可能
* `PS1(">>")`で左側のコマンド出力内容を変えられる
* `magic(x)`でx*xの魔方陣行列を作成可能(行・列・対角の和がすべて等しくなる行列)
* 起動時に実行しておきたい内容(カレントディレクトリからスタートするなど)を登録可能。詳細は[こちら](http://www.gnu.org/software/octave/doc/interpreter/Startup-Files.html)。
Node.js(ES6)でみるObserverパターン

# 概念説明

以下の記事に任せます

https://liginc.co.jp/web/programming/php/149799

# ストーリー

ユーザーが会員登録した時点で

- ユーザーに確認メールを送信
- 管理者に通知メールを送信

を行いたい

# デモ

## コード

※ `extends`される`Subject`クラス・`Observer`クラスの作成や、`Value Object`の使用はサボってます。

```js
// クラスの定義

class User {
    constructor(name, email) {
        this.name = name;
        this.email = email;
    }

    save() {
        console.log('DBにユーザー情報を保存してPromiseを返す、ていで。');
        return new Promise(resolve => resolve(this));
    }
}

class UserRegistrationSubject {
    constructor() {
        this.observers = [];
    }

    registerObserver(observer) {
        this.observers.push(observer);
    }

    notifyObservers(user) {
        return Promise.all(this.observers.map(o => o.getNotified(user)));
    }
}

class UserConfirmationObserver {
    constructor(subject) {
        subject.registerObserver(this);
    }

    getNotified(user) {
        console.log('user.email宛に確認メールを送信する、ていで。');
        return new Promise(resolve => resolve('ユーザー確認メール送信完了'));
    }
}

class AdministratorNotificationObserver {
    constructor(subject) {
        subject.registerObserver(this);
    }

    getNotified(user) {
        console.log('管理者のメールアドレス宛にuserの情報を含んだメールを送信する、ていで。');
        return new Promise(resolve => resolve('管理者通知メール送信完了'));
    }
}

// Observerパターンのデモ

const subject = new UserRegistrationSubject();

const UCObserver = new UserConfirmationObserver(subject);
const ANObserver = new AdministratorNotificationObserver(subject);

const user = new User('山田太郎', 'hoge@example.com');

user.save()
    .then(user => subject.notifyObservers(user))
    .then(console.log);
```

## 結果

※ `console.log` で出力されたもの

```
DBにユーザー情報を保存してPromiseを返す、ていで。
user.email宛に確認メールを送信する、ていで。
管理者のメールアドレス宛にuserの情報を含んだメールを送信する、ていで。
[ 'ユーザー確認メール送信完了', '管理者通知メール送信完了' ]
```
SEOにおける質の高いページをつくる [翻訳]

この記事は、具体的な実践でなく大まかな方針についてです。まずは方針を知ることで実践の意味を理解するために役立つと考えています。
以下のコンテンツはGoogleのドキュメント[
Create High Quality Pages](https://developers.google.com/search/docs/guides/quality-pages)の翻訳です。訳が間違っている等は編集リクエストいただけると嬉しいです。


# SEOにおける質の高いページをつくる
Googleの検索体験を良いものにするためには、検索する人の意図やクエリに基づく優れた結果を提供することが重要になります。検索する人にとって適切なコンテンツを提供するため、コンテンツを考えるときには次の要素に気を付けましょう。

- **コンテンツ自体のクオリティが高いこと。**ユーザの検索興味に則したコンテンツだろうか？スパムはないだろうか？もっと知るためにはブログ記事[how to build high-quality sites](https://webmasters.googleblog.com/2011/05/more-guidance-on-building-high-quality.html)を読んでみてください。また[quality guidelines](https://support.google.com/webmasters/answer/35769#quality_guidelines)もぜひお読みください。
- **コンテンツがモバイルフレンドリーであること。**多くのユーザはデスクトップよりモバイルから検索をしています。そのため、モバイルユーザがデバイス上で適切に表示されているコンテンツを見つけるためにはモバイルエコシステムに対応することは重要になります。
- **読み込み時間が早いこと。**もし読み込み速度が遅い場合、ユーザは我慢できず離脱してしまうかもしれません。さらに、ページ読み込み時間はページランキングの要因の一つとなっています。
- **誰でも使えること。**あなたのページの情報はスクリーンリーダや読み上げデバイスが読み込み可能なように構成されていますか？詳しくはブログ記事[tips for making content universally accessible](https://webmasters.googleblog.com/2008/03/tips-for-making-information-universally.html)をお読みください。

# モバイル環境への対応
コンテツを作成、変更する際にはモバイル最適化を最優先で考えてください。コンテンツが多様なデバイスや回線速度で綺麗かつ早く表示されるようにする方法は幾つかあります。


## モバイルでの読み込み最適化のためのAMP HTML
モバイル読み込みに最適化されたAMP HTMLを使用しましょう。AMPはモバイルウェブを高速化するためのオープンソースプロジェクトです。主に読み込み速度のため、AMPは発行者にどこでもすぐに読み込み可能なモバイル最適化されたコンテンツを作成するように促します。詳しくは[Ampproject.org](Ampproject.org)を参照してください。

## 機能的なウェブのためのモバイルフレンドリーガイドライン
Eコマースサイトや現状AMP HTMLに変更することができない機能性のあるサイトはモバイルフレンドリーを実践するべきです。モバイルフレンドリーでないサイトは検索からのモバイルユーザに対して苛立ちを感じさせ、タップした後すぐにサイトを離脱する傾向にあります。それに対して、モバイルフレンドリーなサイトはユーザにすぐに興味に持たせることができると同時に有用です。モバイルフレンドリーなサイトを作成する方法については、[Mobile Friendly Websites](https://developers.google.com/webmasters/mobile-sites/)ガイドをお読みください。


## モバイルAppのためのApp Indexing
App Indexingによって、Google検索へのシームレスな統合を通し、ユーザを再度エンゲージさえることができます。ユーザがあなたのAppをすでにインストール済みで、関連コンテンツを検索したとき、検索結果から直接アプリを起動するオプションが提供されます。App Indexing APIを用いると、Appでのアクティビティにより検索でのコンテンツのランキングを改善することができ、Google App上でもクエリ補完によってユーザがAppを見つけやすくすることができます。詳しくは[App Indexing on Firebase](https://firebase.google.com/docs/app-indexing/)をお読みください。


Except as otherwise noted, the content of this page is licensed under the [Creative Commons Attribution 3.0 License](https://creativecommons.org/licenses/by/3.0/), and code samples are licensed under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0). For details, see our [Site Policies](https://developers.google.com/site-policies). Java is a registered trademark of Oracle and/or its affiliates.
README.md を find して fzf でインクリメンタルサーチするしプレビューもする

fzf が **プレビュー機能に対応**[^1] していたので、使ってみた話です。

![readus.gif](https://qiita-image-store.s3.amazonaws.com/0/3189/997c7130-058a-b6e5-1886-10d9d3eaa35f.gif)


## TL;DR

```sh

alias readus='find . -regex "./node_modules/[^/]*/README.*" -type f | fzf --preview="less {}" --preview-window=right:60% --ansi --bind "enter:execute(open -a \"Marked 2\" {})" --delimiter=/ --with-nth=3 --header="open README"'

```

## やってること

* `./node_modules` 以下の `README.*` を find して fzf に渡す
* Enter キーを押すと Markd 2.app で開く

## ネタ元

[Quramy](http://qiita.com/Quramy) さんの [ReadUs という Electron 製 アプリの記事](http://qiita.com/Quramy/items/a4be32769366cfe55778)があり、 このアプリは node_modules ディレクトリ以下の README.md を閲覧できます。

fzf のプレビュー機能を使うと似たようなことをターミナル上でできるのではと思ったのでやってみました。

## 改善案

* markdown のプレビューをシンタックスハイライトしたい
  * ターミナル上で md をシンタックスハイライトしてくれる軽量なコマンドが意外とすぐみつからないので保留中
  * ハイライトして見たければどうせ markd とかで開くんでしょというのもある
* Enter を押したら `hub browse` みたいなことしても便利かもしれない
* 頻繁に利用するなら zsh の widget などにして任意のキーにバインドしても良さそう

## 感想

node_modules 以下の依存パッケージの数が可視化されて不安にかられる。


[^1]: [Option to preview focused item with an external command · Issue #587 · junegunn/fzf](https://github.com/junegunn/fzf/issues/587)
R factor（因子型）のsummary(基礎統計量)を一行に出力する。データフレームに追加したいなど。

#summaryの出力を一行にまとめたいときに活用できる。

以下のようなデータフレーム

```R
 id  <- c(  1,  2,  3,  4,  5) 
 gender <- c("F","F","M","M","M")               # 性別(F:女，M:男)
 h   <- c(158,162,177,173,166)               # 身長
 w   <- c( 51, 55, 72, 57, 64)               # 体重
 df  <- data.frame(ID=id, GENDER=gender, H=h, W=w)
```

一行でまとめられるが、わかりやすいように。

```R
val.summary <- summary(df$GENDER)
str.val <- paste(names(val.summary), val.summary, sep=":")
cal.summary<- paste(str.val, collapse=", ")
```

output
```R
>cal.summary
F:2, M:3
```

以上。

何に使いたかったというと、
factorのsummaryをデータフレームのとある一行に埋め込みたかったから。
pry-byebugをコマンドラインから使う

byebugはシェルから単体で使えるが、pry-byebugには同様のものがない模様。
次のような簡単な実行ファイルで欲しいものができた。

```ruby:pry-byebug
#!/usr/bin/env ruby

require 'byebug'
require 'byebug/runner'
require 'pry-byebug'

Byebug::Context.processor = Byebug::PryProcessor
Byebug::Runner.new.run
```
サイボウズAPIを使ってPHPで施設の予約内容を取得する

APIの概要は
「Garoon（ガルーン） API」
https://cybozudev.zendesk.com/hc/ja/categories/200157760-Garoon-API
として公開されているが、具体的なコードが少ないのでメモ。


今回は施設IDが1の設備について、2016年1月1日の予約内容を取得する。



※取りあえず動くことを目的としているので「ここがおかしい」「こうしたほうがよい」などあればお知らせください。



```php:sample.php(前半)
// 施設ID
$id='1';

// 送信先
$url='http://(インストール先)/ag.cgi?page=PApiSchedule';

// ヘッダ
$headers = array(
'Content-Type: application/soap+xml; charset=UTF-8; action="ScheduleGetEventsByTarget"',
);

// リクエスト内容
$postdata =<<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<Action xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">
ScheduleGetEventsByTarget</Action>
<Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
<UsernameToken>
<Username>xxxxxx</Username>
<Password>xxxxxx</Password>
</UsernameToken>
</Security>
<Timestamp xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">
<Created>2013-06-01T00:00:00Z</Created>
<Expires>2037-12-31T00:00:00Z</Expires>
</Timestamp>
</soapenv:Header>
<soapenv:Body>
<tns:ScheduleGetEventsByTarget xmlns:tns="http://wsdl.cybozu.co.jp/base/2008">
<parameters start="2016-01-01T00:00:00" end="2016-01-01T23:59:00">
<facility id="{$id}"></facility>
</parameters>
</tns:ScheduleGetEventsByTarget>
</soapenv:Body>
</soapenv:Envelope>
EOF;
```
UsernameとPasswordには、予約内容を閲覧できる権限のユーザーと、そのパスワードを指定しておく。

ミソは

```php:sample.php(前半・抜粋)
<parameters start="2016-01-01T00:00:00" end="2016-01-01T23:59:00">
<facility id="{$id}"></facility>
</parameters>
```
の部分で、APIマニュアルの「リクエスト」の内容がこれに当る。


続けて、POSTで送るデータを生成して実行する。


```php:sample.php(後半)
// 送信内容生成
$options=array('http' => array(
'method'=>'POST',
'content'=>$postdata,
'header'=>implode("\n",$headers),
));

// 送信して、結果を格納
$contents = file_get_contents($url,false,stream_context_create($options));
$reader = new XMLReader();
$reader->XML($contents);

// 結果出力
while($reader->read()) {
	if($reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE || $reader->nodeType == XMLReader::END_ELEMENT){
		continue;
	}else{	
		// 予約のタイトルを表示する
		if ($reader->name=="schedule_event") {
			echo $reader->getAttribute("detail")."<br />";
		}
		// ほかにも表示するならここに追加する

	}
}
$reader->close();

```

結果のXMLが$contentsに代入されるので、XMLReaderで読み出して表示している。


$reader->getAttribute("start")に予約開始時刻が格納されているが、環境によってはタイムゾーンを調整する必要があるかもしれない。

そのほかに表示できる内容は
https://cybozudev.zendesk.com/hc/ja/articles/202463250#step1
に掲載されている。

例えば参加者も表示するには

```php:sample.php(追加)
if ($reader->name=="user") {
	echo $reader->getAttribute("name")."<br />";
}

```
などとする。
初めてのWatson APIの用例と実践プログラミング

<a href="https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEWatson-API%E3%81%AE%E7%94%A8%E4%BE%8B%E3%81%A8%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E4%BA%95%E4%B8%8A%E7%A0%94%E4%B8%80/dp/4865940529/" target="_blank">初めてのWatson APIの用例と実践プログラミング</a>

目次
第1章　Watsonを知るための6つの質問
第2章　人工知能とは何か？
第3章　とにかくWatsonを体験してみよう
第4章　Watsonでできること
第5章　Node-REDでTwitter Botを作ろう
第6章　画像認識アプリを作ろう
第7章　Watsonの可能性

Chapter 4 Watson でできること
4.1 Watson API の概要
4.2 Watson サービスを使うための環境の準備
4.3 Natural Language Classifier
4.4 Retrieve and Rank
4.5 Document Conversion
4.6 Conversation
4.7 Speech to Text と Text to Speech
4.8 Visual Recognition
4.9 その他の Watson API
4.10 もっとある Watson

■サンプルコードのダウンロードはこちら
http://www.ric.co.jp/book/techpub/data/index.html#1052
JavaScript で日時 (Date) を自前で整形

JavaScript の ```Date``` 標準の ```toString()``` とか ```toLocaleString()``` とかでも良いんだけど、明示的に形式を指定したい場合は何かしらのライブラリを使うか自前でなんとかするしかないっぽい。今回は自前でやる。

今回は ```YYYY/MM/DD hh:mm:ss``` のような形式の文字列を返す関数を作る。

## 作成する関数
```js
// "YYYY/MM/DD hh:mm:ss" のような形式の文字列を返す
function getDateTimeString(t){
  function pad(n, width, z){
    z = z || '0';
    n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
  }
  if(!t){
    t = new Date();
  }
  var date = t.getFullYear() + '/' + pad(t.getMonth() + 1, 2) + '/' + pad(t.getDate(), 2);
  var time = pad(t.getHours(), 2) + ':' + pad(t.getMinutes(), 2) + ':' + pad(t.getSeconds(), 2);
  var datetime = date + ' ' + time;
  return datetime;
}
```

## 使い方
```js
// 現在日時を出力
console.log(getDateTimeString());

// 10時間後の日時を出力
var t = new Date();
t.setHours(t.getHours() + 10);
console.log(getDateTimeString(t));
```
CentOS への Node.js インストールメモ

CentOS (Bash) にて。

## nvm 導入
```bash
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ echo "source ~/.nvm/nvm.sh" >> ~/.bashrc
$ source ~/.bashrc
$ nvm --version
0.32.1
```

## node バージョンリスト確認
```bash
$ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        ....
         v4.6.0   (LTS: Argon)
         v4.6.1   (Latest LTS: Argon)
         v5.0.0
        ....
         v6.8.1
         v6.9.0   (LTS: Boron)
         v6.9.1   (Latest LTS: Boron)
```

## node インストール (stable なバージョン)
```bash
$ nvm install stable
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v6.9.1 (npm v3.10.8)
Creating default alias: default -> stable (-> v6.9.1)

$ node -v
v6.9.1
```
rails runnerの使い方

##rails runnerとは
任意のrubyコードが実行できるコマンドです。Active Recordも使えるのでbatch処理のときに使えます。
##ネームスペースの設定
ファイルを指定して実行もできますが、名前空間を設定しましょう。

```ruby:config/application.rb
config.autoload_paths += %W(#{config.root}/lib)

```
##実行スクリプトを作る
lib/tasks以下にスクリプトを置く。

```ruby:test.rb
class Tasks:Test
	def self.execute
		print 'test'
	end
end
```
##スクリプトの実行をする
```
$ rails runnner Tasks::Test.execute
```
-eオプションで環境が設定できます。

##参考
<http://qiita.com/3yatsu/items/416411c0a8f696dbf99e>
<http://qiita.com/necojackarc/items/fb76352dbea5bdd83366#fn1>
PHPStorm で CamelCase と snake_case の切り替え

CamelCase と snake_case を切り替えたいときって結構ありますよね。

そんな時に便利なのは、CamelCase というプラグインです。

https://plugins.jetbrains.com/plugin/7160?pr=idea

### インストール

- Preferences > Plugin > Browse repositories...
- camel で検索
- CamelCase をインストール

### 使う

- 単語を選択して、option + shift + u で切り替え

```
CamelCase
camelCase
camel_case
camel-case
CAMEL_CASE
```

という感じで切り替えてくれます。
IISサーバーでUnity Web Playerを公開するとき

#シリーズ目次

- [silverlight と Unity3D の連携](http://qiita.com/sasaco/items/0fac32829cfaf25f3999)
- IISサーバーでUnity Web Playerを公開するとき
- [Unity Web Player をブラウザの画面に合わせて起動する](http://qiita.com/sasaco/private/c9fbcf1c81372918455e)

# 参考URL

[IISサーバーでUnity Web Playerを公開するとき](http://halfdome.biz/iis%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A7unity-web-player%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D/)

IISサーバーでUnity Web Playerを公開しても動作しないときは、MIMEタイプの設定漏れが原因の可能性が高いです。

デフォルトでは、unityファイルの拡張子（.unity3d）が設定されていないため、IISサーバーはUnity Web Playerが要求する本体のファイル.unity3dを404エラーで返すからです。

動作してないときの進捗バー（このまま止まっています） 
![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/88a15714-6925-43f3-29cd-b68b6a252e93.png)
ですので、web.configに.unity3dを登録することで動作するはずです。 

# 設定例

```text:Web.config
<configuration>
  
  <system.webServer>
    <staticContent>
      <!-- Web Player を使用する場合 -->
      <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" />
      <!-- Web GL を使用する場合 -->
      <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".jsgz" mimeType="application/x-javascript; charset=UTF-8" />
      <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" />
    </staticContent>
  </system.webServer>
  
...

</configuration>
```

IISサーバー（ExpressWebレンタルサーバー）は、そのままWeb Playerを公開しても動作しませんが、サイトのルートに上の設定を追加したweb.configを設置することで、Web Playerが動作するようになります。
DisplayPortの切断を回避するアダプター

# はじめに
4K液晶が普及しだしているともあり、DisplayPortは広く使われるようになってきました。
HDMI2.0を搭載している液晶ディスプレイが少ないということもあり、特に4K環境下では多くの方が使われているのではないでしょうか。
ところが、DisplayPortには液晶電源断時の仕様が他の規格とは異なるため、いくつかの問題を生じさせます。

# 問題
実際の問題として次のようなケースが起きています。

- スリープ復帰時にすべてのウィンドウが左上に集合する。
- スリープ復帰時にデスクトップのアイコンが想定外の場所に移動する。
- スリープ復帰時にDirect Xを使用しているアプリが落ちる。
- などなど...

すでに周知の事実ですが、これの原因はDisplayPortのPlug and Playの仕様にあるとされています。
仕様として、ディスプレイの電源がオフにされた場合、ホットプラグ信号をオフにすることが規定されているようです。
したがって、OSはディスプレイが切断されたと認識し、上に挙げたような所定の動作を行います。

# 対策
この問題を回避するためには、2つの方法があります。

- OS側のディスプレイ切断時の動作を変更する。
- DisplayPortのホットプラグ信号を常時オンにする。

OS側のディスプレイ切断時の動作を変更する手法は、手軽に実践できるということで広く利用されていますが、マルチディスプレイや4K環境下ではうまくいかなかったり、ディスプレイが切断することにより生じる他の問題は解決できなかったりするため、完全な解決策とはなりません。
一方で、DisplayPortのホットプラグ信号を常時オンにする方法では、切断自体が発生しないため、上記の問題をすべて解決できます。
したがって、今回はホットプラグ信号を常時オンにすることで、切断を回避するアダプターの作り方を記述したいと思います。

# 作成方法
作り方というと大仰に見えますが、実際には非常に簡単です。
必要な部品は以下の2点となります。

- DisplayPortのオスメスアダプタ
    - ebayで入手できます。
    - 国内で入手したい場合は、殻割の仕方が変わってきますが、以下の商品等が使えると思います。
        - [<img src="https://qiita-image-store.s3.amazonaws.com/0/78693/4f0f728a-286d-6f62-31d5-5f74cb5a9e7e.png" height="100px">Ugreen DisplayPort 延長ケーブル ディスプレイポート延長 オス-メス](http://amzn.to/2qF6aYr)
        - [<img src="https://qiita-image-store.s3.amazonaws.com/0/78693/83817bd8-c4ab-13e5-5c48-9e32b33d0ed8.png" height="100px">変換名人 Display Port → mini Display Port 変換アダプタ DPA-DPMB/CA20](http://amzn.to/2ni8fLk)
        - [<img src="https://qiita-image-store.s3.amazonaws.com/0/78693/4f403e01-eecd-4205-ffa2-5da3e8279e3d.png" height="100px">カモン ディスプレイポート変換アダプタ(オス←→メス)【DP-MF】](http://amzn.to/2qFg6kR)
- 1kΩの1/8W抵抗器(ケースの中に納まれば何Wでも可)
    - どこでも入手できます。

その他に、半田と半田ごて、マイナスドライバー、カッターナイフがあれば十分です。

今回調達したオスメスアダプターは次のようなものです。
![DSC_0008.JPG](https://qiita-image-store.s3.amazonaws.com/0/78693/19186519-9ef3-2719-c928-653d8323c93d.jpeg)

分解するとこのような中身になっています。
コネクタ側からマイナスドライバーを差し込み、指でパチパチと爪を外していくときれいに分解できます。
爪だけでなく接着剤で固定されているため、基板に少し残りが付着しています。
![DSC_0003.JPG](https://qiita-image-store.s3.amazonaws.com/0/78693/954d6317-7b57-baa5-e062-f6cd597dd599.jpeg)

分解できたら、18pinの銅箔をカッターナイフで切断します。
![DSC_0006.JPG](https://qiita-image-store.s3.amazonaws.com/0/78693/87c4d796-aeec-553d-078e-6f64b38c5af7.jpeg)

そして、18pinと20pinの間に1kΩの抵抗器を半田付けします。
この時、18pinは18pinでも、オス側の18pinに半田するようにしてください。
ディスプレイの繋がるメス側に接続すると、ホットプラグ信号をオンにできません。
![DSC_0007.JPG](https://qiita-image-store.s3.amazonaws.com/0/78693/cd7aef2b-1bb8-7b5c-5b2f-2731bd68d765.jpeg)

最後に再度ふたを閉めれば完成です。
ストレスフリーなDisplayPort環境が楽しめます。

# 仕組み
このアダプターの行っていることは非常に簡単です。
ディスプレイからのホットプラグ信号を切断し、DisplayPortの3.3Vを使用してホットプラグ信号をプルアップしているだけです。
短絡時の対策として1kΩを入れていますが、18pinと20pinをショートさせても動作すると思います。

# 使い方
DisplayPortケーブルとグラボの間にこのアダプターを挟むだけで使用できます。
ホットプラグ信号をカットしているため、先にディスプレイ側と接続してからグラボに接続してください。
ホットプラグ信号がオンになったタイミングでEDIDを取得するため、接続されていない場合に、ディスプレイを認識しない可能性があります。

# さいごに
このアダプターを用いて、特に問題は生じておりませんが、使用された場合の動作に関して、一切の責任を取りかねますのでご了承ください。
また、同様のアダプターをオークションにて販売しております。
作るのは面倒だけど、使ってみたいという方は、ぜひご購入いただければ幸いです。
http://sellinglist.auctions.yahoo.co.jp/user/leak4mk0
出品していないこともありますが、Twitter ([@leak4mk0](https://twitter.com/leak4mk0))までDMいただければ随時制作し販売できると思いますので、その際はよろしくお願いします。
OctoberCMS自作プラグインを個別gitレポジトリで管理し、composerでインストールさせる

OctoberCMSのサイトで自作プラグインを登録すれば、OctoberCMSのバックエンド（管理画面）からGUIでプラグインをインストールできるが、これだと、サーバに自動デプロイすることができない。
そこで、composerでインストールできるようにしておくと便利だ。更にgithubなどから持ってきてもらえればpackagistにも登録する必要ないし、プライベートのレポジトリを使用できる。

### 手順
1. 自作プラグインのルートにcomposer.jsonを作成する。
2. プラグインを使用する側のcomposer.jsonで、依存関係に登録し、レポジトリを指定する。

### プラグインのcomposer.json
```json
{
    "name": "pikanji/utilitycollection-plugin",
    "type": "october-plugin",
    "require": {
        "php": ">=5.5.9",
        "composer/installers": "~1.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Kanji Furuhashi",
            "email": "pikanji@gmail.com"
        }
    ]
}
```
* `name`はレポジトリ名とは関係ない。
* `type`に`october-plugin`とすることで、OctoberCMSの`plugins`ディレクトリの下に`name`の構造でインストールされる。`name`に`-plugin`サフィックスがついている場合はそれを除いた部分がディレクトリ名になる。
* 上記の場合、`plugins/pikanji/utilitycollection`となる。
* 非公開パッケージの場合、`license`は`proprietary `で。[こちら](https://qiita.com/pikanji/items/e00fa1c76acc0bbff6ce)参考。

### 依存する側のcomposer.json
```json
{
    ...
    "require": {
        ...
        "pikanji/utilitycollection-plugin": "dev-master",
        ...
    },
    ...
    "repositories": [
        {                                                           
            "url": "git@bitbucket.org:pikanjidevteam/utilitycollection-plugin.git",             
            "type": "git"                                              
        }                                                           
    ]
}
```
* `require`にプラグイン側のcomposer.jsonの`name`の値を指定する。
* `dev-master`はバージョン・エイリアス。`dev-hoge`とすると`hoge`ブランチから取ってきてくれる。
* このプラグインのレポジトリを`repositories`で指定する。
* 注意：composer.jsonは最後の項目の後に","がついているとエラーになる。

これで、`composer update`することで、このレポジトリから指定したプロジェクトがプラグインディレクトリにインストールされる。

デプロイする時は、`composer.lock`を含めていれば`composer install`で同じバージョンがインストールされる。

プライベートレポジトリを指定する場合は、`composer install`を実行するユーザがレポジトリにアクセスできる様にSSHキーの設定をしてある必要がある。
それはまた別の話なので割愛する。
【Cordova】cordova-sqlite-storageのlocationオプションと読み込み先のパスとの対応

# まとめ
cordova-sqlite-storageプラグインで

```js:
 db = window.sqlitePlugin.openDatabase({name: 'demo.db', location: 'default', });
```

のようにdbを開いたときのDBの読み込みパスは

Androidの場合は```
"file:///data/data/{パッケージ名}/databases/demo.db"
```
です。
→cordovaのfilepluginを入れている場合は```
cordova.file.applicationStorageDirectory + "databases/demo.db"
```のように記述できます。

iOSの場合はiosDatabaseLocationというオプションを設定することが可能です。
読み込みパスとの対応は下記を参照してください。
https://github.com/litehelpers/Cordova-sqlite-storage#opening-a-database


# 背景とか
以下、上記の「まとめ」の内容を探すのが意外と大変だったという話なので、読み飛ばしても良いです。
サーバからダウンロードしたSQLiteのDBファイルをローカルに保存して読み込むという処理を実装する必要があったため、以下の流れで実装しました。
(cordova-plugin-file, cordova-plugin-file-transfer, cordova-sqlite-storageのプラグインを使用）

1 サーバからダウンロードしたDBファイルをローカルに保存する。
→cordova-plugin-file-transferのFileTransfer#downloadメソッドを使用
2 上記のファイルをcordova-sqlite-storageで読み込む。
→cordova-sqlite-storageのSqlitePlugin#openDatabaseメソッドを使用

このとき、1のdownloadメソッドでは保存パスとしてファイルのURLを指定することができます。

```js:1の処理
function download(fileEntry, serverUri) {
    var fileTransfer = new FileTransfer();
    var fileURL = fileEntry.toURL();

    fileTransfer.download(
        serverUri,
        fileURL,
        function (entry) {
            console.log("Successful download...");
        },
        function (error) {
        },
        null,
        {
            headers: {
            }
        }

    );
}
```

しかし、2のopenDatabaseでは読み込場所としてlocationオプションを指定することはできるのですが、URLを直接指定することができないようです。
（locationにはdefault, Library, Documentなどのオプションを設定）

```js:２の処理
  db = window.sqlitePlugin.openDatabase(
  {
      name: 'hoge.db',
      location: 'default' // 読み込み場所を設定。URL等を設定することはできない。
  });
```

というわけで、1の処理の保存先として「location="default"のときの読み込みパス」を設定することにしました。
が、Readmeを探してもlocation=defaultの時にどのパスを読みに行くのか、説明が載っていません。（探し方が悪いだけかもですが。。）
（ちなみにiOSの場合はiosDatabaseLocationというオプションを設定することが可能で、どのパスを読みに行くかの対応もReadmeの中に書いてありました。）

結局Githubのissuesから目的の情報を見つけることができました。

Setting path of DB
https://github.com/litehelpers/Cordova-sqlite-storage/issues/292

```
cordova fileplugin can copy over your files
Android default location: cordova.file.applicationStorageDirectory+"databases/your_database_name"
IOS location (with location:1 parameter) cordova.file.documentsDirectory+"your_database_name"
```

ということだそうです。

#参考にしたサイト
litehelpers/Cordova-sqlite-storage
https://github.com/litehelpers/Cordova-sqlite-storage

apache/cordova-plugin-file-transfer
https://github.com/apache/cordova-plugin-file-transfer

Setting path of DB
https://github.com/litehelpers/Cordova-sqlite-storage/issues/292
引数の渡し方を理解しよう（Python編）

Pythonにおいて、関数や、オブジェクトのメソッドに引数を渡す際の取り扱(Evaluation strategy）についてまとめておきます。
[Pythonの変数とオブジェクトについて](http://qiita.com/makotoo2/items/35f8c2abf3248816f0e4)で説明したように、Pythonではすべての値はオブジェクトであり、変数にはオブジェクトのリファレンス（参照）が格納されています。
関数が呼び出されると、実引数（呼び出し側の引数）のリファレンスが仮引数（関数側の引数）に"コピー"されて渡されと考えるとよいでしょう。この方式を「共有渡し」（call by sharing）あるいは「参照の値渡し」（call by value where value is the reference copy）などと呼びます。

# ■ イミュータブルな値を引数として渡す場合
Pythonでは、関数内部で引数に別の値を再代入して、変数の参照先つまりリファレンスを変更した場合には呼び出し側に反映されません。まず、数値や文字列のようなイミュータブルな値の変数を引数にして渡す場合を考えてみましょう。次の例では、関数test1()の内部で引数argの値に10を加えています。これは、実際には、引数の値に10を加えた新たな整数オブジェクトを生成し、そのリファレンスを変数argに再代入しています。

```
def test1(arg):
    arg += 10 # ① argの値に10を足して再代入

num = 3
test1(num)
print(num) # ② numの値を表示
```

関数test1()を呼び出し後に、関数の外部②で変数numの値を表示してみると、①の関数の内部での引数の値の変更は反映されていません。

```
$ python3 arg_test1.py 
3	←②変数numの値は「3」のまま
```
これは①で引数argに再代入することにより、引数argの参照先が変更されてしまったからです。①が実行する前は、関数外部のグローバル変数numと、引数argは同じ値を参照していますが、①の後では別の値を参照しているわけです。
参照先が変化したことは、次のようにオブジェクトのID番号を表示するid()関数で調べることができます。

```
def test1(arg):
    # 関数の内部で引数を変更
    print("arg: {}".format(id(arg))) 
    arg += 10 # ①
    print("arg: {}".format(id(arg)))
    
num = 3
test1(num)
print(num) # numの値を表示
```

実行結果は次のようになります

```
$ python3 arg_test1.py 
arg: 4297537952	←①の前
arg: 4297538272	←①の後 IDが変化した
3	←関数の外側では変数numの値はそのまま
```

# ■ ミュータブルな値を引数として渡す場合（その1）
リストや辞書のようなミュータブルな値を引数として渡す場合も同様です、リファレンスが変化した場合には呼び出し側には反映されません。次の例では、リストを引数に渡し、関数の内部で「arg + [4, 5]」により要素を追加し、argに再代入しています。

```
def test2(arg):
    # 関数の内部で引数を変更
    print("arg: {}".format(id(arg)))
    arg = arg + [4, 5] # ①要素を追加
    print("arg: {}".format(id(arg)))

myLst = [1, 2, 3]
test2(myLst)
print(myLst) # myLstの値を表示
```

この場合①では「+」演算子で「[4, 5]」が結合された新たなリストオブジェクトが生成されるため、リファレンスが変化します。したがって呼び出しもとには反映されません。

```
$ python3 arg_test2.py 
arg: 4329564104
arg: 4329566024	←IDが変化した
[1, 2, 3]	←関数の外側では値が変化しない
```

# ■ ミュータブルな値を引数として渡す場合（その2）
ミュータブルな値を引数として渡す場合に、関数内で参照先が変更されなければ、関数内での変更は呼び出し側に反映されます。たとえば、オブジェクトの値を直接変更するメソッドを実行した場合などです。
次の例では関数内部の①で前の例の「+」演算子の代わりにextend()メソッドによりリストに要素を追加しています。また②で「arg[1] = 10 」によりリストの2番目の要素を「10」に変更しています。

```
def test3(arg):
    # 関数の内部で引数を変更
    print("arg: {}".format(id(arg)))
    arg.extend([4, 5]) # ① [4, 5]を追加
    arg[1] = 10 # ② 2番目の要素を変更
    print("arg: {}".format(id(arg)))

myLst = [1, 2, 3]
test3(myLst)
print(myLst) # myLstの値を表示
```

この場合、①②で新たなオブジェクトは生成されないため、リファレンスは変化しません。したがって、関数内部での引数の値の変更は呼び出しもとに反映されます。

```
$ python3 arg_test3.py 
arg: 4321175496
arg: 4321175496	←IDは変化しない
[1, 10, 3, 4, 5]
```
天まで届けmergeはしご

```bash
$ mkdir ladder

$ cd ladder/

$ git init
Initialized empty Git repository in ~/ladder/.git/

$ git commit --allow-empty -m 0
[master (root-commit) 899c146] 0

$ git checkout -b branch
Switched to a new branch 'branch'

$ git commit --allow-empty -m 1
[branch 5646b01] 1

$ for i in {2..10}; do
>   if [ `expr $i % 2` -eq 0 ]; then
>     git checkout master
>     git merge --no-ff -m `[ $i -eq 10 ] && echo ten || echo $i` branch
>   else
>     git checkout branch
>     git merge --no-ff -m $i master
>   fi
> done
Switched to branch 'master'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'branch'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'master'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'branch'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'master'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'branch'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'master'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'branch'
Already up-to-date!
Merge made by the 'recursive' strategy.
Switched to branch 'master'
Already up-to-date!
Merge made by the 'recursive' strategy.
```

## 結果

![ten](https://qiita-image-store.s3.amazonaws.com/0/42867/b395d063-71cc-ecdd-d96d-7fefd1f08c77.png)

届いた。