OmniAICreator/Qiita-1.07M huggingface dataset:
RADIUS

# RADIUSとは？

> RADIUS : Remote Autentication Dial In User Service

AAA(Authentication, Authorization Accounting)を一元化して管理するためのプロトコル。

VPN、無線AP、RDBMSなど多くのアプリケーションはRADIUS認証方式を支援しています。

一般的Linuxにては`/etc/passwd`を基にしてユーザーのデータベースを管理します。

このポストで使用する認証モデルも`/etc/passwd`のIDを基にしてユーザーが入力したパスワードがRADIUSサーバにセーブされているパスワードと同じなのか比較して認証する方式です。

---

# 使われている形（無線LAN）

PC -->無線LANカード -->無線AP --> インターネット --> RADIUSサーバ

```
	1. PCは無線APに接続（ハンドシェーク実施）
	2. APの応答後、PCは認証データを無線APに伝送
	3. 無線APはRADIUSサーバに認証確認の要請
	4. RADIUSサーバからの認証応答を無線APはPCに転送
	5. 無線APはPCをネットワークに連結
```

---

# FreeRadiusを使用してSSHユーザー認証

__環境__

``` sh
RADIUSサーバ：192.168.111.111
ユーザ：192.168.111.0/24
```

### 1. FreeRadiusのインストール

``` sh
# apt-get install freeradius
```

### 2. FreeRadiusの設定の修正

RADIUS認証が必要なプライアントのネットワークアドレスと共有キーをしてする必要があります。

`/etc/freeradius/`フォルダーの`clients.conf`ファイルを開けて設定を追加します。

``` sh
client 192.168.111.0/24 {
	secret			= radius_auth
    shortname	= private-network
}
```

上の共有キーは覚えておく必要があります。

サーバとクライアントの共有キーが一致しない場合、認証の失敗になります。

### 3. クライアントの設定

##### 3-1. pam-radius-authのライブラリーをインストール

リナックスではユーザー認証のために`PAM(Pluggable Authentication Modules)`を使用します。

RADIUSの設定によってリナックスはユーザーIDは`/etc/passwd`で抽出し、パスワードは認証サーバで受け取って比較した後にローグインします。

その時に必要なライブラリーは`libpam-radius-auth`で、RADIUS認証機能を使用したい全てのクライアントにインストルする必要があります。

``` sh
# apt-get install libpam-radius-auth
```

`/etc/pam_radius_auth.conf`ファイルを修正してPAMにRADIUSサーバの情報を伝送する必要があります。

その時、共有キーは`clients.conf`ファイルに指定したキーと同じものを書く必要があります。

``` sh
# server[:port]　shared_secret　timeout　(s)
　192.168.111.111　radius_atuh　1
```

##### 3-2. SSHの設定の変更

先に言った通りにSSHはPAMを利用して認証します。

RADIUSを利用してユーザー認証するために`/etc/pam.d/sshd`にしたの設定を追加します。

追加する時に`@include common-auth`の上の方にしないといけないです。

下の方に追加したら`common-auth`の設定が先に適用されるので、ローカルのユーザー情報を利用するようになります。

``` sh
auth sufficient pam_radius_auth.so
```

##### 3-3. ユーザー追加

クライアント機器で使用するアカウントを追加します。

その時にはパスワードの指定は必要ありません。

``` sh
# adduser -home /home/iprize iprize
```

### 4. Troubleshooting

ーXオプションを使ったら、FreeRadiusを使用した時に発生した問題がどこから発生したか確認出来るデバッグモードに実行されます。

FreeRadiusサーバが実行していたら止まった後にーXオプションで実行します。

`/usr/sbin/`に移動してーXオプションで実行します。
GAS(google app scritp)で日付を扱うライブラリを作成しました

## なぜ作ったか
最近業務でGoogleAppScritpを書くことが多くなってきました。
GoogleAppScritpを使用してGoogleSpreadSheetから情報を取得や加工してslack、チャットワークに投稿するというようなことをしています。
その中で日付情報を扱うことが多くいっそライブラリにして公開すれば、もしかしたら他の人も使えるのではないかと思ったので、
簡単な実用例、プロジェクトキー、ソースコードなどをQiitaにまとめていきます。

## プロジェクトキー
```
M07BPTtQGkQNczN0EX3cSD6M0nmmJvv15
```
プロジェクトキーの使用方法に関しては
[Google Apps Scriptで作った関数類をライブラリ化しよう](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjw7dOC6bXMAhUHJaYKHX7EAP8QFggjMAE&url=http%3A%2F%2Feye4brain.sakura.ne.jp%2Fwp%2Fblog%2F2015%2F02%2F25%2Fgoogle-apps-script%25E3%2581%25A7%25E4%25BD%259C%25E3%2581%25A3%25E3%2581%259F%25E9%2596%25A2%25E6%2595%25B0%25E9%25A1%259E%25E3%2582%2592%25E3%2583%25A9%25E3%2582%25A4%25E3%2583%2596%25E3%2583%25A9%25E3%2583%25AA%25E5%258C%2596%25E3%2581%2597%25E3%2582%2588%25E3%2581%2586%2F&usg=AFQjCNHzLFgdcj2gxN-tax2RyDB4NbosgA&sig2=fVuOhRaVWfY80tnZgmDxWQ&bvm=bv.121070826,d.dGY)の
「ライブラリを参照する方法」の部分を参照して下さい。

## 実用例
[このような感じ](https://docs.google.com/spreadsheets/d/1yMMEqFgqLAJj51t2xFPDkTa1AD_ml9EhM4rEQRrAUpc/edit#gid=0)でスプレットシートで開発状況を管理していたとします。
![スクリーンショット 2016-04-30 16.36.12.png](https://qiita-image-store.s3.amazonaws.com/0/44144/8509ead3-7ea8-faec-54ad-5085ac935845.png)
今回作成したライブラリは、リリース情報を取得してリリース日当日やリリース日の前日などに変換するライブラリです。

- 実用例①(リリース日当日取得)

``` javascript
// スプレットシート情報取得
var ss = SpreadsheetApp.openById('スプレットシートのキー');
// シート情報取得
var s = ss.getSheetByName('シート名');
// 日付情報取得(A1 ~ A10までに日付情報が入っている想定)
// スプレットシートから情報取得した段階ではオブジェクト型
var dateObj = s.getRange('B2:B7');
// 日付情報をArrayに変換
var dateArray_v1 = this.convertDate(dateObj,0);

//dateArray_v1の中に [06/15, 06/26, 07/01, 07/05, 07/14, 07/27]が入っている状態
```

- 実用例②(リリース日の3日前を取得)

``` javascript
// スプレットシート情報取得
var ss = SpreadsheetApp.openById('スプレットシートのキー');
// シート情報取得
var s = ss.getSheetByName('シート名');
// 日付情報取得(A1 ~ A10までに日付情報が入っている想定)
// スプレットシートから情報取得した段階ではオブジェクト型
var dateObj = s.getRange('B2:B7');
// 日付情報をArrayに変換(リリース日の3日前に変換して取得)
var dateArray_v2 = this.convertDate(dateObj,3);

//dateArray_v2の中に [06/12, 06/23, 07/-2, 07/02, 07/11, 07/24]が入っている状態
```

- 実用例③(今日がリリース日か判定)

``` javascript
// スプレットシート情報取得
var ss = SpreadsheetApp.openById('スプレットシートのキー');
// シート情報取得
var s = ss.getSheetByName('シート名');
// 日付情報取得(A1 ~ A10までに日付情報が入っている想定)
// スプレットシートから情報取得した段階ではオブジェクト型
var dateObj = s.getRange('B2:B7');
// 日付情報をArrayに変換
var dateArray_v1 = this.convertDate(dateObj,0);

// dateArray_v1に入っている配列と今日の日付を比較
// リリース日が今日であればtrueを返す
if(isCompareDate(dateArray_v1)){
// リリース日だけに実行する処理を書く
}

```
## ソースコード
- https://github.com/TsujiTakuya55/dateUtils_gas

## 最後に
- もしプルリクやissueなどあればジャンジャン下さい！
- Twitter : [@Tsuji_Taku50](https://twitter.com/Tsuji_Taku50)

## おまけ
- ライブラリを作成した後に気がついたのですがGoogle提供のGAS用ライブラリに`moment.js`というものがありました。
- `moment.js`
    - Project Key : MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48
    - 主に日付や時刻操作系のライブラリが詰まっています。
    - http://momentjs.com/
Couchbaseにコマンドラインからバケットの中身をset, getする方法。性能試験ツール付き。

Couchbaseでは、`couchbase-cli`やRESTを通してバケットの中身をget, setすることはできません。
telnetなら可能ですが避けたいところ。
このままだと不便なのですが、Couchbase C SDKを導入すると`cbc`というコマンドラインツールもインストールされ、
このツールからバケットに値を入れたり取り出したりすることができます。

[公式ドキュメントのコマンドラインツールインストール方法](http://developer.couchbase.com/documentation/server/current/developer-guide/cli-overview.html)より

```bash:インストール、値登録、値取得
# brew install libcouchbase # Macはこれだけでインストールできる。
wget http://packages.couchbase.com/clients/c/couchbase-csdk-setup
perl couchbase-csdk-setup # 適宜sudo
cbc-create document_id -V '{"json":"value"}' -U couchbase://10.0.0.31 # set/update
cbc-cat document_id -U couchbase://10.0.0.31 # get
```

また、`cbc`を導入すると、`cbc-pillowfight`という性能試験ツールも使えるようになります。
詳細は[`cbc-pillowfight`のマニュアル](http://docs.couchbase.com/sdk-api/couchbase-c-client-2.4.8/md_doc_cbc-pillowfight.html)を参照してください。

```bash:例
# 同時接続数20で負荷をかける
cbc-pillowfight -U couchbase://192.168.33.101/a_bucket -t 20
```
好きなものを見つけてそれを馴染ませる

# 好きなものをみつけよう
開発するなら自分の手に馴染んだもの、お気に入りのものを使おう。
開発者が使用するアプリは多岐にわたる。

OS、ブラウザ、エディタ、ターミナル、IDE、開発言語……

それこそ分野によってもいろいろあるだろう。
何を選ぶにしても試すことを躊躇ってはいけない。


# 試して試して試す
例えば、エディタ。

自分は専門学校の頃にエディタというものを知ってからというもの、常に自分に馴染むものを探し求めていた。
そこから10年くらいメインでEmEditorを使用していた。

しかし、ある日出会ってしまった、Sublime Textに。
Sublime Textのデザインといい動作といい、それは本当に一目で恋に落ちたと言ってもいい程の速度で10年使ったEmEditorを過去のものへと変えた。

実は10年間ただEmEditorを使い続けていたわけじゃない。
その間も暇を見つけて、そして新しいアプリが公開されればそのエディタを使っていた。もちろん有名どころな秀丸、Notepad++、さくらエディタ、最近だとAtom、VS Codeあたりも試したけど自分にフィットするものは他に無かった。


# 何がフィットする？
これは個人によって何が自分の優先度にくるのかでいい。
UIデザイン？
使い勝手？
軽さ？
自分が気に入ったものを使えばいいんだ。

自分がPythonを使いたい理由なんて"The Zen of Python"の思考が自分の性に合ってる。名前の響きがいい。
そんなもんだ。
だいたい他の開発者にこう言うと呆れられる。「ああ、この人ロジカルじゃない。メリットとか考えないんだ」って。

でも、メリットがあるなら自分が扱いづらい言語を使いたいか？
やだやだ。
使いたくない。
仕事ならそこは譲るしかない。けど、そこに縛られる必要がないなら別に好きなものを好きなように使えばいいじゃん。


# そして気に入ったらとことん使う
とことんカスタマイズする。キーボードショートカット、テーマ、フォント……。
片っ端から自分が好きなように変えていこう。

膨大な時間がかかる？
いいじゃない。
一生使っていくかもしれないものを自分に馴染ませないでどうする？
そこを惜しんでどうするんだ？

気に入ったものを使えば、何もかもが楽しくなってくる。
手に馴染ませれば、思考が何にも邪魔されずに画面上で動き始める。


# 気に入ったものを使うってのは最高だ
そこにかけた労力も時間も全てが自分にそれ以上のものを返してくれる。
その瞬間はいつだって最高に楽しく開発してるはずだ。

でも、馴染みすぎてて"邪魔されてない"なんてことには気づかないと思うけどね。
goでjson形式のrequestを受ける


json形式でpostされたhttp requestを処理するサンプル。
今回はpostするjsonのデータ構造を特に決めていないのでパース結果をmap[string]interface{}に保存。

```go:srv.go
package main

import (
  "net/http"
  "io"
  "encoding/json"
  "fmt"
  "strconv"
)

func dumpJsonRequestHandlerFunc(w http.ResponseWriter, req *http.Request){
  //Validate request
  if req.Method != "POST" {
    w.WriteHeader(http.StatusBadRequest)
    return
  }

  if req.Header.Get("Content-Type") != "application/json" {
    w.WriteHeader(http.StatusBadRequest)
    return
  }

  //To allocate slice for request body
  length, err := strconv.Atoi(req.Header.Get("Content-Length"))
  if err != nil {
    w.WriteHeader(http.StatusInternalServerError)
    return
  }
  
  //Read body data to parse json
  body := make([]byte, length)
  length, err = req.Body.Read(body)
  if err != nil && err != io.EOF {
    w.WriteHeader(http.StatusInternalServerError)
    return
  }
  
  //parse json
  var jsonBody map[string]interface{}
  err = json.Unmarshal(body[:length], &jsonBody)
  if err != nil {
    w.WriteHeader(http.StatusInternalServerError)
    return
  }
  fmt.Printf("%v\n", jsonBody)
  
  w.WriteHeader(http.StatusOK)  
}

func main(){
  http.HandleFunc("/json", dumpJsonRequestHandlerFunc)
  http.ListenAndServe(":8080", nil)
}
```

json形式のリクエストを受けるサーバを立ち上げる

```
$go run srv.go
```

json形式のリクエストをcurlで叩く

```bash
$curl -v -H "Content-Type: application/json" -X POST -d '{"integer":1,"string":"xyz", "object": { "element": 1 } , "array": [1, 2, 3]}' http://localhost:8080/json
```
Couchbase:バケットを指定した作業は管理者権限なしでできる

Couchbaseの公式ドキュメント上でAdministrator権限が必要となっている作業でも、
バケットを指定したものについては、
SASLありならユーザー(バケット名)とパスワードを指定、
SASLなしなら何も指定なしで、例えば以下の作業ができます。

* バックアップ(cbbackup)
* REST API
* XDCR

など。

```bash:cbbackupの例
cbbackup http://localhost:8091 /tmp/backup -u yourbacketname -p yoursaslpassword -b yourbacketname
```

```bash:RESTでView情報取得の例
curl -u yourbucketname:yoursaslpassword -X GET http://localhost:8092/yourbucketname/_design/yourview
```
複数バージョンのXcodeを入れる方法と各Xcodeに対応するSwiftのバージョン一覧

#概要
動作検証の際に、最新バージョンのXcodeではなく、昔のバージョンのXcodeで検証が必要になってくる場合があるので、その方法と、各Xcodeに対応するSwiftのバージョンをまとめておく。

#動作確認環境
OS X El Capitan 10.11.4

#dmg版をダウンロード
https://developer.apple.com/downloads/
<img width="866" alt="スクリーンショット 2016-04-30 20.45.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/121962/ca06c3a0-d411-0f6f-4b82-de71789270e8.png">

#リネームする
<img width="806" alt="スクリーンショット 2016-04-30 20.49.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/121962/be26bfad-334f-299a-b01a-7769e0721d49.png">

#各Xcodeに対応するSwiftのバージョン一覧
1. Xcode7.3（Swift2.2）
2. Xcode7.2.1(Swift2.1.1)
3. Xcode7.0.1(Swift2.0)
4. Xcode6.4(Swift1.2)
5. Xcode6.3.2(Swift1.1)

#注意点
以下の**App Store版**ではなく、上記で説明した**dmg版**をインストールする。
<img width="695" alt="スクリーンショット 2016-04-30 20.40.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/121962/0a7c0ac5-83b8-c45e-c6b8-344ac15a516b.png">
Logback等の日付ローテーションの基準は、ファイル名ではなくファイルの最終更新日で決まる

Logback等のJavaのロギングツールでは、日付を元にログファイルをローテーションし、
保存期間外の日付のログファイルを削除することができます。
このとき、何を元に削除しているかというと、日付を含んだファイル名ではなく、ファイルの最終更新日です。
削除のテストをするときは気をつけましょう。
該当ソースコード: [TimeBasedArchiveRemover.java](https://github.com/qos-ch/logback/blob/master/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java)
リスニング > ラスボス > Part 2

http://qiita.com/7of9/items/7e76ec3db33dbe268e08
の続き

Kids hack their Dad's computer on her Raspberry Pi
https://www.youtube.com/watch?v=W76o_iG7Y7g&list=WL&index=20

赤文字ははっきり聞き取れない部分。(Red part is what I couldn't listen correctly).
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。(Blue part is what I listened, but the grammar does not sit well).

(01:05-)
What all you want to do is get to back to your raspberry pi to start plotting. 

(01:11-)
I am goint to ssh to my dad's computer. SSH stands for Secure Shell. So Let's <font color=red>xxx1</font> type in. `ssh alex@192.168.1.27`. "alex" is user name. And all the complicated numbers is IP address <font color=red>xxx2</font> his computer's. Now that asks me the password, which I already have. 

(01:51-)
Now the password is something to do with this, LEGO brick towards <font color=red>xxx3</font>. And when he was home. We are in his computer! Wowh. In his computer! Actually inside his computer. It worked! The password is well done. If <font color=red>xxx4</font> name over <font color=red>xxx5</font> got IP address and password, I'll tell him [never] in the video.

(2:14-)
Isn't amazing that I got my shell on my computer - well, raspberry pi -, and my dad's got his shell opened on his Macintosh computer. And I can connect only miles <font color=red>xxx6</font> pi to his Macintosh computer. When it isn't <font color=red>xxx7</font> <font color=red>xxx8</font> I got my raspberry Pi. Crazy. But we did it.

(2:39-)
Now if we type in `who`. That's the <font color=red>xxx9</font> words. <font color=red>xxx10</font>. And show you obviously who <font color=red>xxx11</font> computer. Now you can see my dad's got logged in, alex  and he's got some of the shell opened. Let's <font color=red>xxx12</font> <font color=red>xxx13</font>. Hah. That's good <font color=red>xxx14</font>. <font color=red>xxx15</font> as logged <font color=red>xxx16</font>. Alex. Hahahahaha.
UIImageViewで一部を角丸する

僕はPinterestが好き。
Pinterestみたいな、画像上部と下部が角丸なUIViewを作りたい。



# 上部角丸-サンプル実装(抜粋)

```SampleUIView.swift

        self.itemImageView.image = UIImage(data:data)
        let maskPath = UIBezierPath(roundedRect: self.bounds,
                                        byRoundingCorners: [.TopLeft, .TopRight],
                                        cornerRadii: CGSize(width: 5.0, height: 5.0))
        let maskLayer = CAShapeLayer()
        maskLayer.path = maskPath.CGPath
        self.layer.mask = maskLayer;

        self.itemImageView.layer.masksToBounds = true
        self.itemImageView.layer.mask = maskLayer
```

# 下部角丸-サンプル実装(抜粋)

下部の角丸については四隅全てを角丸にする形で実装している。

```SampleUIView.swift

    self.layer.cornerRadius = 5.0

```


# 結果

上部と下部の角丸が素敵。

![sca2.png](https://qiita-image-store.s3.amazonaws.com/0/93918/c333d391-d666-1d3a-36d3-0ed196e2bd68.png)
Jupyter Notebook でMultiprocessingエラー

### Jupyter Notebook使ってますか？
---
python使ってて使わないのは損ってくらい使いやすくて素晴らしいツールだと思います
可視化結果をそのままスクリプト上に保存したり、ワークステーション上で起動しておけば外部からもアクセス可能ですし、非常に研究に活用させていただいてます。
ただ、Jupyter notebookで少し詰まった事がありました。

### multiprocessingエラーでフリーズ...
---
それはmultiprocessingです。
普段使いであれば全然問題ないのですが、たまにエラーを吐いて止まったりすると、ノートブックを再起動しないとプロセスが止まらないっていう...
理由を探してやっとわかったことが。

### %runコマンドには注意
---
ある程度スクリプトを書いておいて、``%run hogehoge.py``と実行した後にいろいろ処理することは少なくないのではないでしょうか。
並列化対象は、最初の``%run hogehoge.py``でよびだせる関数もしくはjupyterに直接書いた関数でないといけないという制約があるっぽい。
つまり、``%run hogehoge.py``の後に``%run fugafuga.py``としても``fugafuga.py``の関数が``hoghoge.py``で呼び出せないと並列化したときにAttributeErrorが出るみたいだ（__main__がうんたらかんたらって怒られる。そしてフリーズ）。
全部をJupyterのスクリプトでやる人は全く問題ないが、大きなプロジェクトになってきて、テストコード代わりにいろいろ別スクリプトを試すときには注意が必要ですね。（こんな説明で伝わりますかね......）
SVGのパスに沿ってDOMを動かす


デモはこちら↓↓。
[svgのパスに沿ってdomを動かす](http://jsdo.it/takumifukasawa/4dKr)
<img width="463" alt="スクリーンショット 2016-04-30 20.48.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/6873/6aca8733-67bc-c958-5639-cba95ad34d8c.png">

svgのpathの全長は path.getTotalLength(); で、
そのpathのとある地点(position)の座標は path.getPointAtLength(position); で取得できることを利用し、ループ関数内で以下のようにして動かします。

**1. positionの値を増加させ、path.getPointAtLength(position);で座標を取得**
**2. 取得した座標を元に、absoluteさせているDOMのtopとleftを指定**
**3. positionの値がgetTotalLength();の値を越していたらpositionの値を初期化**

```lang:main.js
var circle = document.getElementById("circle");

var path = document.getElementById("my-path");
var pathLength = path.getTotalLength(); // pathの全長を取得
    
var nowPos = 0;

anime(); // ループを実行

function anime() {
        
    if(nowPos > pathLength) {
        nowPos = 0; // 現在の座標がpathの全長を越していたら0に初期化
    }
        
    var point = path.getPointAtLength(nowPos); // path上のとある地点の座標を取得
    circle.style.left = point.x-15 + "px";
    circle.style.top = point.y-15 + "px";
    nowPos++;
   
    setTimeout(function() { anime(); }, 1000/120);
}

```
Play 2.5に入門　 ⑦httpieを使いながらPlay'Rの例題を手直し

#例題の手直しに挑戦

[前回](http://qiita.com/kmry2045/items/3aa09eec99277b5b14e7)見たPlay Scalaの簡単RESTフレームワークPlay'R、良さ気だったのだけれど、例題の更新系(PUT/POST)が動かなかった。ぱっと見、何らかの理由で、Json周りの処理が書かれていなかったぽいっので、データを更新できるようにしておこう。

# PUTメソッドの手直し

はじめは、Personの書き換え(PUT)に関するメソッドを手直しする:

```controller/PersonController.scala
  def write(person: Person) = Action { request =>
    request.body.asText match {
      case Some(name) if (name.length > 0) => Ok(personContainer.update(person.copy(name=name)).name)
      case _                               => BadRequest("Invalid name")
    }
  }
```

前回同様、httpieを使ってPUTの挙動を見ておこう。

![jane.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/71b47dc0-d30d-ab34-8ba1-104a4fa44261.png)

PUTメソッドで、JaneがJIROに変わってくれないことが問題。

これは、メソッド中での[AnyContentAsJsonクラス](https://www.playframework.com/documentation/2.0/api/scala/play/api/mvc/AnyContentAsJson.html)の扱いが不適切なことによる。

何が起きているのかを、print文デバックで試しておこう。

```controller/PersonController.scala
  def write(person: Person) = Action { request =>
    println("!!!!!!!!!AnyContentAsJsonの挙動だよ!!!!!!!!!")
    println("request.body ="+request.body)
    println("request.body.asJson ="+request.body.asJson)
    println("request.body.asText ="+request.body.asText)
    println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    request.body.asText match {
      case Some(name) if (name.length > 0) => Ok(personContainer.update(person.copy(name=name)).name)
      case _                               => BadRequest("Invalid name")
    }
  }
```

play側のログを見てみると、request.body.asTextの変換が無意味であることが分かる:

![some.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/881e1f20-99bc-eb9f-556d-1c2bfe5c2b70.png)

そこで、以下のようにasJsonを用いる形に書き換えてみる:

```controller/PersonController改.scala

//jsonの扱いに必要なライブラリをインポートしておく
import play.api.libs.json._
import play.api.libs.functional.syntax._
...
  def write(person: Person) = Action { request =>
    request.body.asJson match {
      case Some(jsObj) =>
        val name = (jsObj \\ "name").head.toString
        Ok(personContainer.update(person.copy(name=name)).name)
      case _    => BadRequest("Invalid name")
    }
  }
```

![jiro.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/e4c7c9a6-5c7d-1d3d-4bad-0bc3ebd78493.png)

動作した。

# POSTメソッドの手直し

同様に、新規登録に関するcreateメソッドを手直ししておく(元コードは省略)。

```controller/PersonController改.scala
  def create = Action { request =>
    request.body.asJson match {
      case Some(jsObj) =>
        val name = (jsObj \\ "name").head.toString
        Created(personContainer.add(name).name)
      case _                       => BadRequest("Invalid name")
    }
  }
```

![genji.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/bc61e47d-63df-22ee-224a-e613e3a4a50e.png)

...IDが一つ飛んで6番になってしまったが、、動作した。

#感想と、次回の取組み

Httpie(もしくはcurl)と、playの動的コンパイル機能とを組み合わせることで、例題を容易に修正できた。取り急ぎの少し無理やりな修正だったので、次回は、PlayFrameworkのplay-jsonの演習を兼ねて、もう少し丁寧な手直しに取り組んでみたい。
SlackのAPIを最低限かつ簡単に使いたいから simple_slack というgemを作った

## 概要

* SlackのAPIが使えるgemがたくさんある。
* けど多機能過ぎて逆に簡単なことをする方法が分からなかった。
* あとSlackからのレスポンスが ID　だからよく分かんない。

**だから必要最低限の機能を名前ベースで使えるようなgemを作ろう**

ということで作りました。

* [simple_slack](https://github.com/toririn/simple_slack)

## 使い方

### 1.SLACK API TOKEN を取得する

 * https://api.slack.com/docs/oauth-test-tokens とかで `create token` ボタンを押してAPIのトークンを取得する。

### 2.gem をインストールする

```rb:
gem install simple_slack
```

### 3.gemを使う

下記の**token**は上記で取得したトークンを入れる。

```rb:sample.rb
require 'simple_slack'

client = SimpleSlack::Client.new(token)

client.get.users
#=>チームに参加しているユーザの slack id と ハンドルネーム を取得する。
#=>[ { :id => "U0PPPPP", :name => "oyaji" }, { :id => "U0AAAAA", :name => "kodomo" }, ... ]
```


### 4.出来ること

下記の方法で作成した　client オブジェクトがあることを前提に書いていきます。

```rb:
require 'simple_slack'

client = SimpleSlack::Client.new(token)
```


#### 4-1.get系

* 全ユーザのidとハンドルネームを取得する

```rb:
client.get.users
#=>[ { :id => "U0PPPPP", :name => "oyaji" }, { :id => "U0AAAAA", :name => "kodomo" }, ... ]
```

* 指定したユーザのidとハンドルネームを取得する

```rb:
# ハンドルネームから取得
client.get.user("oyaji")
#=>{ :id => "U0PPPPP", :name => "oyaji" }

# idから取得
client.get.user("U0PPPPP")
#=>{ :id => "U0PPPPP", :name => "oyaji" }
```

* 全チャンネルのidとチャンネルネームを取得する

```rb:
client.get.channels
#=>[ { :id => "C0PPPPP", :name => "general" }, { :id => "C0AAAAA", :name => "random" }, ... ]
```

* 指定したチャンネルのidとチャンネルネームを取得する

```rb:
# チャンネルネームから取得
client.get.channel("general")
#=>{ :id => "C0PPPPP", :name => "general" }

# idから取得
client.get.channel("C0PPPPP")
#=>{ :id => "C0PPPPP", :name => "general" }
```

* 全員のダイレクトメッセージ宛のidと該当するユーザの情報を取得する

```rb:
client.get.ims
#=>[ { :id => "D0PPPPP", :user => { :id => "U0PPPPP", :name => "oyaji"} }, { :id => "D0AAAAA", :user => { :id => "U0AAAAA", :name => "kodomo" } }, ... ]
```

* 指定したユーザのダイレクトメッセージ宛を取得する

```rb:
client.get.im("oyaji")
#=>{ :id => "D0PPPPP", :user => { :id => "U0PPPPP", :name => "oyaji"}
```

#### 4-2.post系

* 指定したチャンネルに投稿する

```rb:
# randomチャンネルに「こんにちは」という文字を「とりりん」という名前で投稿する
client.post.channel(to: "random", text: "こんにちは", name: "とりりん")
#=> true
```

* 指定した相手にダイレクトメッセージを送る

```rb
# ダイレクトメッセージでoyajiユーザに「こんにちは」という文字を「とりりん」という名前で投稿する
client.post.im(to: "oyaji", text: "こんにちは", name: "とりりん")
#=> true
```

#### 4-3.bot系

* 簡単なbotを作る

```rb:
bot = client.bot

# oyajiユーザがrandomチャンネルに「こんにちは」を最初に含む文字を投稿したら反応するよう設定
bot.set_condition(chennel: "random", user: "oyaji", text: /\Aこんにちは/)

# 上記の条件にひっかかったときに、generalチャンネルにお報せ君という名前で「親父さんが挨拶をされました」というチャットを投稿
bot.set_responce(channel: "general", user: "お報せ君", text: "親父さんが挨拶をされました")

# botを起動する
bot.start
```

* 条件を複数設定したいときは配列で渡せばいい。

```rb:
bot.set_condition(chennel: ["random", "general"], user: ["oyaji", "kodomo"], text: [/\Aこんにちは/, "こんばんは"])
```

### その他

バグがまだ多いのもあって最低限の利用。既存の何かに簡単に通知機能作るとかならこれでいけるはず。
~~でもこんなの使わなくてもSlackが用意してくれているhubotとかを使った方がいいかもしれない…~~
Apacheのmod_proxy_uwsgiを使う

moinmoinをApache2.4で動かしたくて少し躓いたのでメモ。

# Apacheの準備

Apacheでmod_proxy_uwsgiを使うには、mod_proxyとmod_proxy_uwsgiをLoadする必要がある。
mod_proxy_uwsgiは標準では入ってない場合が多いと思うので適当にインストールする。
ArchLinuxとかならパッケージ管理システムで入る。

Apacheの設定ファイルに必要なモジュールを書いておく。  

```httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
```

# アプリケーション側の準備  

uwsgiで動かすアプリケーションをダウンロードするなりパッケージ管理システムで入れるなりして準備をする。そしてuwsgiの設定をuwsgi.iniファイルで行う。

今回moinmoinを動かしてみたので、その時の例をあげる。moinmoinの必要なファイルを/var/lib/moin以下に配置して、以下のようなuwsgi.iniファイルを作成した。

```uwsgi.ini
[uwsgi]
uid = http
gid = http
socket = 127.0.0.1:50000
# mod_proxy_uwsgiでunix domain socketがうまく使えなかったのでTCPを使う
#socket = /run/uwsgi/moin.sock
#chmod-socket = 660
plugin = python2

chdir = /var/lib/moin/
wsgi-file = /var/lib/moin/server/moin.wsgi

master = True
workers = 2
max-requests = 200
#harakiri = 60
daemonize=/var/log/httpd/uwsgi-moin.log
```

とりあえず現在動いただけの段階なので細かいチューニングなどはしていない。パフォーマンスを求めるならもっとチューニングをしたほうがいいと思う。他の環境であれば当然chdirやwsgi-fileは適切に書き換える必要がある。  

以上の準備ができたら、uwsgiを起動する。  

```
$ /usr/bin/uwsgi --ini /var/lib/moin/uwsgi.ini
```

このように先ほど設定したuwsgi.iniを指定して起動させる。

# httpd.confの設定

設定ファイル中の適当な場所に以下のように書く。

```httpd.conf
ProxyPass /hogehoge uwsgi://127.0.0.1:50000/
```

/hogehogeのところは任意で、/でも良いがサブドメインとして利用したい場合はこのようにする。
もちろんアプリケーションによってはサブディレクトリを指定すると別途設定が必要な場合もある(moinmoinでは必要)。

unixドメインソケットも使えるらしいが、使おうとするとうまくuwsgiにアクセスできなかった。もしかしたら引数をダブルクォートで囲めばよかったのかもしれないと今になって思うが、今更確認する気も起きないのでわからない。

それと、最近のApacheはhttp/2に対応しているが、このProxyPassが有効なところでhttp/2を有効にすると、uwsgiがhttp/2に対応してないのでIOErrorとなりうまく通信できない様子。
【AWS】concrete5のインストールとRDSの連携

JAWSUGでconcrete5のお話があったので、
EC2で実装してみようと思いました。

# 利用環境
### AWS
|サービス名|詳細|
|---|---|
|EC2|Amazon Linux|
|RDS|MariaDB|
|S3|-|

### EC2インストールソフトウェア
|環境|詳細|
|---|---|
|Webサーバ|Apache|
|DBクライアント|mysql5.5|
|PHP|ver 5.6.19|
|CMS|concrete5|

# インストール作業
EC2にconcrete5に必要なソフトをインストールします。
### EC2更新
```bash
$ sudo yum -y update
```
### Apache2
```bash
$ sudo yum -y install httpd24
$ sudo /sbin/chkconfig httpd on #自動起動ON
$ sudo /etc/init.d/httpd start  #サービスの起動
```

### モジュール確認
```bash
$ yum list | grep php56
```

### PHP
```bash
$ sudo yum -y install php56
```
### PHP.ini設定
```bash
$ sudo vi /etc/php.ini
```
■設定値
default_charset = UTF-8
mbstring.language = neutral
mbstring.internal_encoding = UTF-8

### PHP モジュール
```bash
$ sudo yum -y install php56-gd php56-mcrypt php56-mbstring php56-mysqlnd php56-xml
```
### MariaDB
```bash
$ sudo yum -y install mysql55 #接続はMySQLクライアントで可能
```
### concrete5
```bash
$ wget http://www.concrete5.org/download_file/-/view/85780/concrete5.7.5.6.zip #ダウンロード
$ unzip concrete5.7.5.6.zip #homeディレクトリに解凍
$ sudo cp -r ./concrete5.7.5.6 /var/www/html/sample #解凍したconcrete5を/var/www/htmlにコピー
$ sudo chown apache:apache -R /var/www/html/sample #concrete5フォルダの権限変更
```
### Apache再起動
```bash
$ sudo /etc/init.d/httpd restart
```

# concrete5セットアップ
1. (EC2パブリックDNS)/sampleに接続
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/52ea5938-b40e-a3ff-71f2-4d8e91423b1a.png)

2.インストールを続けるをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/4cffe087-adf3-17a3-78b2-6bb5ac74aee1.png)

3.RDSで設定したDB情報を入力。今回RDS側はMariaDBです。
　入力したら次に進みます。
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/3e884aa7-5ec1-4232-d65d-2bfa58363abb.png)

4.インストール完了
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/3511b7a7-a266-743d-17d8-5f8cb633ce79.png)


# まとめ
今回はEC２にconcrete5をインストールして、
DBはRDSを使うように設定するまでを行いました。

手順があれば、15分もかからずインストール可能です。
XウィンドウシステムでAlt_LをControl_Lに割りあてる

## 参考

* [xmodmap - ArchWiki](https://wiki.archlinux.org/index.php/xmodmap)

## 方法

```~/.Xmodmap 
clear Mod1
keycode 64 = Control_L NoSymbol Control_L
add control = Control_L
```

```bash:適用
xmodmap ~/.Xmodmap
```
Railsでキャンペーンコードを生成する

RailsでApp storeやgoogle playのような英数字のコードを発行したくなったので、その時のメモ。

#ユーザーストーリー
運営が発行した英数字のコードをユーザーが受け取り、アプリに入力して何かしらの特典をうけとる。

#使用する英数字を決める

今回は大文字アルファベットと数字を使うことにします。
そこで重要なのは、0とOや、1とIなどの紛らわしい文字を使用しないようにすることです。
「英語　数字　間違えやすい」などでググるといろいろ出てきます。
下記にまとめてくれている方がいました。
http://miniminiadmin.jugem.jp/?eid=389

今回は下記を除くことにします。

- 0/O
- 1/I

#ランダムな英数字を発行する

下記の記事を参考にしました。
http://www.xmisao.com/2014/02/15/how-to-generate-a-random-string-in-ruby.html

下記のようにすると大文字アルファベットのランダムな12桁の文字列が得られます。

```
(0...12).map { ('A'..'Z').to_a[rand(('A'..'Z').length)] }.join
```

#最終的な実装

```

UNAVAILABLE_ALPHABETS= ['O','I']
UNAVAILABLE_NUMBERS = ['0','1']

alphabets = ('A'..'Z').to_a.select{ |a| !UNAVAILABLE_ALPHABETS.include?(a) }
numbers = ('0'..'9').to_a.select{ |n|  !UNAVAILABLE_NUMBERS.include?(n)}
o = alphabets+numbers
code = (0...12).map { o[rand(o.length)] }.join

```

#さいごに

```
o.sample(12).join
```

のようにするとよりカッコいいかもしれません。
windowsユーザだがtensorflowを動かしたい

初めてですがさささっと適当に書いてみます。

windows10ユーザなのですがtensorflowを動かしたくて、いろいろやってみています。まだ動いてないです。
UdacityのDeep Learningの講座(https://www.udacity.com/course/deep-learning--ud730 )を受けていて、その課題ができるようになるのが目標です。そこに重きを置いて書きます。

##一応動く、というところまでにやったこと
以下のサイトの通り進めて、iPythonで一応動くようにはなりました。docker使います。
(ページ下部に追記あり。手順を変更しました。)
https://medium.com/@Rapchik/running-google-s-deep-learning-course-material-under-windows-82d468b6d5be#.6pk8esr9i

ただし、vagrantの仕様が変わったらしく、このサイトで出てくるinsecure_private_keyが見当たりませんでした。これは、このサイトでVagrantfileに追加せよと言われている一文に、さらに以下の記述を加えて解決しました。
  `config.ssh.insert_key = false`

これにより、以下の手順で動かすことができるようになりました。
1. Vagrantfileのあるフォルダでコマンドプロンプトを開き、`vagrant up`を実行。
2. PuTTYでサイトの通り入力して(Saveしておくと楽)、Open。なんか出るけどいいえを選択。
3. ユーザ名を聞かれるのでcoreと入力。
4. PuTTY上で`cd tensorflow/tensorflow/examples/udacity/`
5. `docker run -p 8888:8888 -it google_udacity`
6. ブラウザでhttp://127.0.0.1:8888/tree を開く

##課題
なんとか開けるしtensorflowも動作するようなのでとりあえずよかったのですが、
python notebookの保存ができません。以下のサイトを見て試すも、エラーこそ出ないものの保存はされていない。。。うまくいったときってどこかのフォルダと同期するのでしょうか？
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/README.md
--pullオプションは反応しなかったので省きました。ダメなのか？dockerよくわかりません。。。

あと、Udacityの課題１で用意されているソースコードを実行すると、
`the kernel appears to have died. It will restart automatically. `
と出して死ぬのでnotMNISTのデータセットが読み込めません。うまくいかないなぁ。

どなたかうまくいった方がいらっしゃいましたら教えていただきたいです。


----追記----
もがいてたらなんかうまくいきました。/c/Users以下じゃないと共有できないという噂を見かけてびっくり。以下のサイトを参考にさせていただき、方法を色々変えました。docker知らないので何が起こってるのかわからないですが。。。
http://qiita.com/Algebra_nobu/items/6c2b05e2a9a4a5ee456d

1. Docker Quickstart Terminalを開き`docker-machine env default`、その後画面に表示されるコマンド`eval $(docker-machineへのパス env default)`を打つ。
2. `docker run -p 8888:8888 -p 6006:6006 --name tekitou -v //c/Users/共有したいフォルダ:/notebooks -it b.gcr.io/tensorflow/tensorflow`　共有したいフォルダは私は`~/tensorflow/examples/udacity`にしました。
3. Ctrl + c 後、yを入力
4. `docker start tekitou`
5. `docker exec -it tekitou bash`

また、ファイルが共有できるようになったことで、ファイルが大きすぎてiPython上で解凍できなかったのが、自分で解凍してからiPython側に送ることができるようになりました。これでできるんじゃなかろうか。期待。


----追記----(2016/12/29)
tensorflowがwindowsに対応しましたね！
spyderのコマンドラインで　`pip install tensorflow` とするだけだった気がします。
Atom便利パッケージ autoclose-html 設定メモ

開始タグの '>' を入力すると閉じタグも入れてくれるパッケージの autoclose-html を使っているが、自動で改行を入れてくれる機能の編集をしたのでメモ。

1. セッティング画面を開く
2. packages画面を開く
3. installed packages で autoclose-html を検索
4. 選択して Settings の Force Inline に改行したくないタグを追加

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/34733/25dd38c8-8cbc-aaec-2c6b-8d80628a9519.png)

これでOK!

これが、

![Screen Shot 2016-04-30 at 18.53.05.png](https://qiita-image-store.s3.amazonaws.com/0/34733/ed56a3e3-6460-14eb-96e1-31d9e55d4122.png)

こうなる！

![Screen Shot 2016-04-30 at 18.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/34733/88918684-68fe-3bfd-41fb-1c119a8e281b.png)
会計パッケージ「SuperStreamCORE」＋ORACLE Database 11R2の環境でORA-00904エラーが発生した時の話

仕事でお客様の会計システムのハードをリプレースする際、SuperStreamCOREと言う会計パッケージでエラーが出て焦ったので、備忘録ついでに事象と解決方法を記載します。



# ORACLE Database 11R2の環境にてORA-00904エラー発生

それまでOracle 10gで動いていたSUperStreamの環境をOracle 11R2に移行した途端に、下記のようなエラーが発生しました。

```
データウィンドエラー エラー発生：0 SQLCODE=[904]
SELECTエラー ORA-00904:"COREDBA","COREDBA"."CMSOKMST"
"SOK_CODE" 無効な識別子です。
```

# 問題はORACLE 11R2の問題

どうやらORACLE 11R2のバグらしい。サポートページにも掲載されていました。
Oracleの修正パッチを当てるか、下記のSQLにて対応可能。

```
alter system set "_connect_by_use_union_all"='OLD_PLAN_MODE' scope=both;
```
yarn run watchでwatchifyして素早くjsをビルドできるようにする

## やりたいこと

- browserifyでjsをモジュール化できるよういしたい
- babelを使ってES2015で書きたい
- Reactも使いたい
- gulpはめんどい
- 変更を監視してビルドしたい
- 時間のかかるビルドは嫌だ

## 手順

- nodeの6系以上をインストールしておいて `npm i -g yarn` でyarnも入れておく
- プロジェクトフォルダを作成する `mkdir sample-folder && cd sample-folder`
- `yarn init` (適当にEnter連打)
- `yarn add browserify babelify watchify babel-preset-es2015 babel-preset-react react react-dom babel-plugin-transform-inline-environment-variables babel-polyfill prop-types`
- package.jsonのscriptsに以下を追加  
  `"watch": "NODE_ENV=development watchify js/all.js -o js/bundle.js --extension=.jsx -v -t [ babelify --presets [ es2015 react ] --plugins [ transform-inline-environment-variables ] ]"`
- コードを書く前に `npm run watch` しておく
- 本番用にビルドするscript  
  `"build": "NODE_ENV=production browserify js/all.js -o js/bundle.js --extension=.jsx -v -t [ babelify --presets [ es2015 react ] --plugins [ transform-inline-environment-variables ] ]"`

__サンプルのpackage.json__

```json:package.json
{
  "name": "sample-folder",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "babel-plugin-transform-inline-environment-variables": "^0.0.2",
    "babel-polyfill": "^6.23.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babelify": "^7.3.0",
    "browserify": "^14.3.0",
    "prop-types": "^15.5.8",
    "react": "^15.5.4",
    "react-dom": "^15.5.4",
    "watchify": "^3.9.0"
  },
  "scripts": {
    "watch": "NODE_ENV=development watchify js/all.js -o js/bundle.js --extension=.jsx -v -t [ babelify --presets [ es2015 react ] --plugins [ transform-inline-environment-variables ] ]",
    "build": "NODE_ENV=production browserify js/all.js --extension=.jsx -o js/bundle.js -v -t [ babelify --presets [ es2015 react ] --plugins [ transform-inline-environment-variables ] ]"
  }
}
```
Goで文字列中で変数展開する

# やり方

```go
data := "hogehoge"
text := "moge" + data + "moge"
```

# 経緯

rubyみたいに

```rb
text = "moge#{data}moge"
```

って書き方ができると思って色々調べていたけどそんな方法もなく普通に+だけでよかったという話。
なんか悔しかったのでメモっておきます。
BotFramework で条件によって FormFlow を実行する方法

BotFramework の公式ドキュメント [FormFlow の例](http://docs.botframework.com/sdkreference/csharp/forms.html) は FormFlow のみの Bot ですが、作成する Bot はそう単純なものばかりではありません。
私の場合は Unix のコマンドのイメージで、特定のコマンドのみ FormFlow を実行する挙動を実現したかったのですが、思ったより手間取ったので備忘録としてコード例を置いておきます。  

```csharp
public async Task<Message> Post([FromBody]Message message)
{
    if (message.Text == "command" ||
        message.GetBotPerUserInConversationData<bool>(COMMAND_TAG))
    {
        message.SetBotPerUserInConversationData(COMMAND_TAG, true);
        return await Conversation.SendAsync(message, MakeDialog);
    }
    else
        return message.CreateReplyMessage("hi");
}

private IDialog<State> MakeDialog()
{
    return Chain.From(() => FormDialog.FromForm(BuildForm))
        .Do(async (context, task) =>
        {
            try
            {
                await task;
            }
            catch (FormCanceledException<State>)
            {
context.PerUserInConversationData.SetValue<bool>(COMMAND_TAG, false);
                await context.PostAsync("command is canceled");
            }
        });
}

private IForm<State> BuildForm()
{
    return new FormBuilder<State>()
            .Message("start command")
            .OnCompletionAsync(async (context, state) => {
context.PerUserInConversationData.SetValue<bool>(COMMAND_TAG, false);
                await context.PostAsync("command is completed");
            })
            .Build();
}

```

本来はフレームワーク側で対応したいところです。
[iOS Tweaks Dev]タッチ動作をエミュレート出来るライブラリ「SimulateTouch」を使ってみた話

## 「AutoTouch」的な何かを作りたかった
かなり前から「AutoTouch」的なTweakを作りたく、いろいろ調べた所IOKitあたりで出来ることがわかり、IOKitのヘッダーを読んだもののﾜｹﾜｶﾒ！ってことで諦めていましたが、@Adolfoi氏から「SimulateTouch」というライブラリを教えてもらったので使ってみました。

## 導入方法
詳しい導入方法は公式リポジトリのレドメを読めばわかります。（雑
https://github.com/iolate/SimulateTouch
rocketboostrapが別途必要だったりします。

## API
APIもご丁寧にリファレンスを見ればわかりますね。
画面が横になっている時用に座標変換のAPIまで用意してあってよさ気です。
http://api.iolate.kr/simulatetouch/

## 気になったこと
かなりの速度でタッチダウン、タッチアップを呼び出すと
連打状態になり、しかもその状態が永遠につづくというかなり致命的なバグが起きることがあるので注意。

ユーザーからの入力で操作するときはタイマーなどで制限をかければ回避可能。

また、backboarddをフックしているせいなのか、SpringBoardをkillしまくると稀にブートループに陥ることがある。(iOS9特有の可能性あり)
ブートループになった時はNon Substrate Modeに入れ、一度dylibを無効化すると解決する（詳細不明）

backboarddフックしててbackboarddがクラッシュするとSubstrate Safemodeに入れないから辛い(´・ω・｀)
↑rocketbootstrapが逝く時もあるしちょっと怖い

## 作例
標準機能と組み合わせるなり何なりでいろいろ遊べますが。
個人的にはまってたのはBluetoothキーボードとつなげて遊んでましたｗ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なんか面白い <a href="https://t.co/vCYJhkh81m">pic.twitter.com/vCYJhkh81m</a></p>&mdash; すり身焼き㌠ (@ChikuwaJB_blog) <a href="https://twitter.com/ChikuwaJB_blog/status/725857153781628929">2016年4月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

結構、Bluetoothキーボードの遅延が少ないのでゲームコントローラー的なものも出来そうです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ムズい <a href="https://t.co/NbTz5kuWA9">pic.twitter.com/NbTz5kuWA9</a></p>&mdash; すり身焼き㌠ (@ChikuwaJB_blog) <a href="https://twitter.com/ChikuwaJB_blog/status/725866381661470721">2016年4月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

UIKeyCommandだと長押しとかが検知できないのでBluetoothのライブラリとかを使ったほうが実用性が高いです。

## まとめ
前からタッチのエミュレートはやってみたかったので個人的には満足です(^^)
教えていただいた@Adolfoi氏に感謝 :)
半角 border パッチがあたった tmux 2.2 を MacPorts で入れて使う

**2016年05月03日追記：半角borderパッチをあてても，[いくつかの問題](#既知の問題)があります．**

**2016年05月03日さらに追記：[既知の問題](#既知の問題)がどうにも困るので，結局[古いバージョンに戻しました](http://qiita.com/river24/items/426292eb8cc3480c491f)．**

**2016年11月19日追記：[その場凌ぎ的な対応も残っていますが，tmux 2.3に移行しました](http://qiita.com/river24/items/4f6b96bece2dbea67ef7)．**

***

# インストール

先日リリースされたtmux 2.2が，MacPortsにもやってきたので，インストール．

[1.9aをインストールしたとき](http://qiita.com/river24/items/3130a23abc05fc722457)と同様にインストールしようとしたら，patchがあたらなかったり，起動しなかったりで，四苦八苦．

まずは，[tmuxのコミット履歴](https://github.com/tmux/tmux/commits/master/utf8.c)を見ていたら，2.2リリース前にwcwidth()を見るようになったみたいなコミットが．
ということで，ambiguous widthなpatchをあてないことに．

次に，borderをasciiにするpatchは，[こちら](https://raw.githubusercontent.com/silenvx/PKGBUILD/master/tmux/borders.patch)のに変更した．

では，インストールします．tmuxのセッションは一度全て終了してから作業しましょう．

```shell-session
sudo port uninstall tmux-pasteboard
sudo port uninstall tmux
sudo port clean tmux
sudo port -s patch tmux
cd /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_tmux/tmux/work/tmux-2.2
curl -kL "https://raw.githubusercontent.com/silenvx/PKGBUILD/master/tmux/borders.patch" | sudo patch -p1
cd -
sudo port -s install tmux
sudo port install tmux-pasteboard
```

あと，~/.tmux.confに以下の行があったら削除（あるいはコメントアウト）．1行目はtmux 2.2でなくなったオプション，2行目は半角borderパッチを変更したことによる．

```
# set-window-option -g utf8 on
# set -g pane-border-ascii on
```

その上で，[wcwidth-cjk](https://github.com/fumiyas/wcwidth-cjk)をインストール．

```shell-session
git clone https://github.com/fumiyas/wcwidth-cjk.git
cd wcwidth-cjk
sudo port install libtool autoconf automake
glibtoolize
aclocal
autoheader
automake --add-missing
autoconf -v -f -i
./configure --prefix=/usr/local
make
sudo make install
```

では，wcwidth-cjkを使ってtmuxを起動します．

```shell-session
/usr/local/bin/wcwidth-cjk /opt/local/bin/tmux
```

無事，tmux 2.2に移行できました．

***

# 既知の問題

## goのプログラムが動かなくなる

wcwidth-cjk経由でtmuxを呼ぶようにしたためか，DYLD_INSERT_LIBRARIESがsetされ，そのせいでgoのプログラムが動かなくなりました・・・orz

参考：[build: hang on OS X Lion (unset DYLD_INSERT_LIBRARIES) #2992](https://github.com/golang/go/issues/2992)

DYLD_INSERT_LIBRARIESをunsetするしかないとのことで，tmuxから呼ぶシェル（私の場合はzsh）側でunsetして，とりあえず凌いでおります．

```shell-session
unset DYLD_INSERT_LIBRARIES
```

シェルの設定ファイルに上記の設定を追加しました．

## NFDの扱いがおかしい

OSXのUTF-8-MACのNFDの問題で，濁点・半濁点の表示がおかしくなります．

```shell-session
$ mkdir は
$ mkdir ば
$ mkdir ぱ
$ ls -al
total 0
drwxr-xr-x   5 river24  staff  170 May  3 18:18 .
drwxrwxr-x  23 river24  staff  850 May  3 18:18 ..
drwxr-xr-x   2 river24  staff   68 May  3 18:18 は
drwxr-xr-x   2 river24  staff   68 May  3 18:18 は
drwxr-xr-x   2 river24  staff   68 May  3 18:18 は
```

wcwidth-cjkを使わなくても発生し，またtmux 2.1 (2.1_3)に戻すと発生しないことから，tmux 2.2の問題ではないかと考えています．

## 半角円マークの文字幅が2文字になる

半角の円マークの文字幅が，1になって欲しいのに，2になります．

半角のバックスラッシュの文字幅は1，全角の円マークの文字幅は2，となっています．

Windowsのファイルパスをメールでやり取りするときなどに，表示が乱れてしまいます．
Python3からMeCabを使う


日本語の形態素解析エンジン"MeCab"をMacにインストールしてPython3から利用する方法をまとめました。

##MeCabと辞書をインストール
まずHomebrewでMeCabと辞書をインストールします。

```
$ brew install mecab
$ brew install mecab-ipadic
```

##mecab-ipadic-NEologdをインストール
mecab-ipadic-NEologdをインストールします。
これはWeb上の新語をデフォルトの辞書に追加したものです。
必須ではありませんが便利なので入れておきます。
以下のコマンドでインストールできます。
詳しくは[GitHubページ](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)をみてください。

```
$ brew install git curl xz
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
```

##mecab-python3をインストール
次にpipでmecab-python3をインストールします。

```
$ brew install swig
$ pip install mecab-python3
```

> 追記(2018/11/27)
> コメントで『「unable to execute 'swig': No such file or directory」となりエラー終了する』との指摘をいただいたので修正しました

これで、Python3からMeCabが使えるようになりました。
以下に、サンプルコードを載せておきます。
MeCab.Taggerで指定するパスは

```
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
```

で調べられます。

```python
import MeCab

mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

text = '解析したいテキスト'
mecab.parse('')#文字列がGCされるのを防ぐ
node = mecab.parseToNode(text)
while node:
	#単語を取得
    word = node.surface
    #品詞を取得
    pos = node.feature.split(",")[1]
    print('{0} , {1}'.format(word, pos))
    #次の単語に進める
    node = node.next
```

出力結果

```
 , *
解析 , サ変接続
し , 自立
たい , *
テキスト , 一般
 , *
```

##参考
[https://github.com/neologd/mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)
[http://shogo82148.github.io/blog/2015/12/20/mecab-in-python3-final/](http://shogo82148.github.io/blog/2015/12/20/mecab-in-python3-final/)
DBにこれから触れる人への応援録　～序～

「DBってデータベースの略ですよね？」
これくらいの知識から始めた自分のDB学習を、これからDBについて
勉強するだろう人達を応援する気持ちで共有いたします。

# DBを学ぶための環境
はじめに自分がDB学習した環境を記します。

- Windows10 Home 64bit
- MySQL　5.7.11
- コマンドプロンプト（書くまでもないか…）

Windows OSでMySQLのインストールを行うには、以下のページが
大変参考になります。

http://webkaru.net/mysql/install-windows/

DBの学習といっても、SQL文法を学ぶのが大半となります。

MySQLの設定を含め、SQL文の学習で下記のサイトを参考にしました。
やることが明確に記載されているので分かりやすく有り難いです。

http://www.dbonline.jp/mysql/

# DBの概念
一口にDB（データベース）と言っても、DB＝コレ！という単一的な
意味合いで指せるものではありません。
データベースは情報の集合体ですが、集合体制がいろいろあります。

・階層型データベース
　一つの情報には必ず1つの親を持つ関係でツリー構造化されるモデルのこと。
　子となる情報同士で関係をもてないため、異なる親の下に同じ子の情報がある
　という重複が発生する。よくある例としては、会社の組織図を用いられる。
　配属部署を兼任している人は、同じデータが存在してしまう。
　
　![階層型例.png](https://qiita-image-store.s3.amazonaws.com/0/113090/d9cbe077-4c34-e562-88e7-dd4e1f12f935.png)


・ネットワーク型データベース
　一つの情報は複数の親をもてるよう網目のように繋がりあうモデルのこと。
　階層型の例で同じ人のデータをそれぞれの親の下に作らなければいけなかった
　状態から、一つの情報へ複数のルートからアクセスできるようになった。
　
　![ネットワーク型例.png](https://qiita-image-store.s3.amazonaws.com/0/113090/cbc284f1-586e-07ed-be49-e407dc185c6e.png)

## 一般的にデータベースといえば…リレーショナル型（関係データベース）
階層型とネットワーク型のデータベースは、データベースの構造を理解して
プログラミングをする必要があります。
つまり、ほしい情報への道のりをしっかりとプログラムしておかなければ、
情報が取得できなくなります。
これはデータベースの構造が変わるたびにプログラムの修正も必要となるため、
データの整理やシステムでの対応工数が必要になってきます。

これを解消するような構造が、一般的にデータベースと指されるリレーショナル型です。

1つの情報に複数の属性を付加させ、その纏まりを列挙させることでデータベースを構成します。
エクセルをお使いならば、親しみのある構造でしょう。
属性を列に、１つの纏まりを行で列挙するテーブル（表）で示されます。

![リレーショナル型例.png](https://qiita-image-store.s3.amazonaws.com/0/113090/a5e12fd9-835a-b39c-9701-aaa3ef90d907.png)


属性や1つの纏まりにはそれぞれ呼び方があります。
属性：　field（表でいうところのrow）
1つの纏まり：　record（表でいうところのcolumn）

例3の図で当てはめると、
field：　ID、社員名、所属、兼任
record：　IDが104の人物情報、IDが105の人物情報、IDが128の人物情報
データベース商事（株）という会社（テーブル）の社員情報のデータベースです。

## リレーショナル型データベースの管理
リレーショナル型データベースはRDBと略表記されます。
このRDBのデータを参照したり、追加したり、削除したりという管理をするための
システムのことをRDBMSと略記されています。正式名称は、
「リレーショナル型データベース管理システム」
（**R**elational **D**ata **B**ase **M**anagement **S**ystem）

データベースの学習では、このRDBMSにMySQLを使用します。
ほかにもMicrosoft社のSQLServerやOracle社のOracle Database、IBM社のDB2といった
RDBMSがあります。

普及率が高くオープンソースで利用できるMySQLでの学習録を掲載していきます。

～序～はここまで。
Windows7SP1-64bit　WindowsUpdate (エラーコード 80072ee2)

Windows7-64bitのWindowsUpdateでエラーコード 80072ee2が発生し、実行出来ない場合、
以下を実行することで解消される。

Windows6.1-KB3112343-x64.exe

参考URL
https://support.microsoft.com/ja-jp/kb/3112343
https://www.microsoft.com/ja-jp/download/details.aspx?id=50023
Djangoでorder byの降順のやり方がわからんから調べた

Modelで定義しているオブジェックトの日付が一番新しいものを取ってきたかったが、単にorder_byしただけでは昇順でしか取り出せないので降順でやるにはどうしたらいいかわからんくなったので調べてみた。

StackOverFlowにすぐ答えが書いてあった

[django order_by query set, ascending and descending](http://stackoverflow.com/questions/9834038/django-order-by-query-set-ascending-and-descending)

やり方としては２種類あるらしい

１：order_by（）の引数の前に-をつける　　
嘘だろ！！！そんなんで動くわけないだろ


```python:order_by_desc1.py
Data.objects.order_by('-date').first()
```

確かに上記の表現でも動いた！！！まじか！！

2:ordery_by()の後にreverse()をつける

```python:order_by_des2.py
Data.objects.order_by('date').reverse().first()
```

これでもOK。というか、こっちの方が解釈の余地が少なくていい感じ


おしまい
Hyperloopモジュールを試す（2）動かしてみよう

[前回のセットアップ編](http://qiita.com/yagi_/items/00f2a4a0ab52aa9bb7ce)に続き、今回は簡単な機能を追加してHyperloopモジュールを動かしてみます。

## UIView

プロジェクトを作成した時点の雛形から`app/controllers/index.js`を編集します。

```js
var UIView = require('UIKit/UIView');
var UIColor = require('UIKit/UIColor');

function addHyperLoopView(){
  var view = new UIView();
  view.backgroundColor = UIColor.redColor();
  $.index.add(view);
}

function doClick(e) {
  addHyperLoopView();
}

$.index.open();
```

ビルドしてボタンをクリックすると見事に画面が真っ赤っかになって何もできなくなります。成功です。ビルド時間もさほど変わりません。

## View(Android)

左隅に赤い四角を表示。

```js
function doClick(e){
  var View = require('android.view.View');
  var Color = require('android.graphics.Color');
  var Activity = require('android.app.Activity');
  var Gravity = require('android.view.Gravity');
  var FrameLayout = require('android.widget.FrameLayout');
  var LayoutParams = require('android.widget.FrameLayout.LayoutParams');
  var activity = new Activity(Ti.Android.currentActivity);
  var view = new View(activity);
  view.backgroundColor = "Red";
  view.width = 100;
  view.height = 100;
  var layoutParams = new LayoutParams(50, 50, Gravity.TOP);
  layoutParams.setMargins(10, 10, 0, 0);
  var main = new FrameLayout(activity);
  main.setLayoutParams(new LayoutParams(600, 600, Gravity.TOP));
  view.setLayoutParams(layoutParams);
  view.setBackgroundColor(Color.RED);
  main.addView(view);
  $.index.add(main);
}
```

Titaniumでそのままやった方がずっとマシでしたね。

## ViewController

次にSocial.frameworkを使ってViewControllerを試してみます。Objective-Cであれば

```objc
[self presentViewController:vc animated:YES completion:nil];
```

みたいになるわけですが、よく考えたらTitaniumの場合はselfを触ることができません。ViewControllerを扱う時はviewを取り出してあげるといいでしょう。

```js
var SLComposeViewController = require('Social/SLComposeViewController');
var SLServiceTypeTwitter = require('Social').SLServiceTypeTwitter;

function doClick(e) {
  if(SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter)){
    var slc = SLComposeViewController.composeViewControllerForServiceType(SLServiceTypeTwitter);
    slc.setInitialText("Hyperloopで呟くよ！");
    $.index.add(slc.view); // <- ココ
  }else{
    alert("Twitterの設定がないよ");
  }
}

$.index.open();
```

![tw.png](https://qiita-image-store.s3.amazonaws.com/0/1782/fdd3e6c7-b1ab-0467-4d90-241d3e7413b0.png)


試しに投稿してみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Hyperloopで呟くよ！</p>&mdash; 八木の野郎 (@yagi_) <a href="https://twitter.com/yagi_/status/726307569380151296">2016年4月30日</a></blockquote>

こんな風に、SDKの更新を待たずに新しい機能を使うことが容易になるのがお分かりいただけるかと思います。まあ、きっと場合によりますけど。

Hyperloopのサンプルプロジェクトには他にもListViewの実装なんかもあるので、スクロールする一覧の動作が遅いと悩んで（それをTitaniumのせいにして）いる人なんかは試してみるといいんじゃないでしょうか。
Chromeで簡単にアメリカ(USA)版のGoogle(Google.com)を利用する方法

英語の記事や情報が欲しい時Google.com(USA版)で検索するが、co.jpにリダイレクトされてしまう。今回簡単に検索できるように設定したのでメモ。

**参考記事**
[日本から米Googleにアクセスする方法！日本Googleへリダイレクトされる問題を解決](http://netacore.jp/how-to-access-to-the-us-google/)
[既定の検索エンジンを設定する](https://support.google.com/chrome/answer/95426?p=settings_omnibox&rd=1)

>通常、アメリカのGoogleにアクセスするには、www.google.comというURLを利用しますが、日本からこのURLにアクセスすると、日本のGoogleにリダイレクトされてしまうのです。

>これを自国のGoogleにアクセスできるには、URLにGoogleのパラメータを利用します。

>■使用するGoogleのパラメータ
>gl=ja
glは国の指定になります。jaは日本を意味します。このパラメータをアメリカの場合、usに変更します。
国を示すja等の２文字は、以下のコードになるかと思います。従って、以下の表から国を指定することで、その国のGoogleが表示されます。（されない国もあります）

>hl=ja
hlは言語の指定になります。jaは日本語を意味します。このパラメータをアメリカの場合、en（英語）に変更します。
言語を示すja等の２文字は、以下のコードになるかと思います。

>gws_rd=cr
gws_rdはGoogleウェブサーバのリダイレクトのパラメータです。暗号化通信(SSL通信）をするときは「gws_rd=sll」となり、GoogleURLの先頭が「http://」でなく「https://」になります。crの指定によって、リダイレクトせずにその国のGoogleサイトへアクセスするようになります。
GWS = Googleウェブサーバー
RD = リダイレクト
CR = 国

>中略

>■アメリカGoogleのURL
http://www.google.com/webhp?gl=us&hl=en&gws_rd=cr

とりあえずこのアメリカGoogleのURLを使ってアクセスすると、リダイレクトせずにGoogle.comにアクセスできる。でもURLバーからすぐに検索できるようにしたいから、このアドレスを検索エンジンに登録する。

![Screen Shot 2016-04-30 at 16.01.30.png](https://qiita-image-store.s3.amazonaws.com/0/34733/c6c521c0-e9c0-e2aa-243e-4875c066191d.png)

こーいうやつ。Twitter.comでTabを押すとこうなって、ここからのキーワードはTwitter内で検索してくれる。Twitter.comが履歴で残ると、Tw + tabキーで検索できて便利。

こうなって。。。
![Screen Shot 2016-04-30 at 16.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/34733/bc635c84-0ff4-aa55-98a7-f675348d093c.png)

こうしたい！
![Screen Shot 2016-04-30 at 16.03.57.png](https://qiita-image-store.s3.amazonaws.com/0/34733/a21c9107-9343-0329-fc88-cd285084b122.png)

やり方はこれ。[既定の検索エンジンを設定する](https://support.google.com/chrome/answer/95426?p=settings_omnibox&rd=1)

>**検索エンジンを追加、編集、削除する**
右上のメニュー![Screen Shot 2016-04-30 at 16.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/34733/ebfd5a4b-9a2e-c582-2e15-3052bad0229c.png)をクリックします。
[設定] を選択します。
[検索] セクションに移動します。
[検索エンジンの管理] をクリックします。
[その他の検索エンジン] で、次の操作を行うことができます。
検索エンジンを追加する: フィールドに入力して検索エンジンを設定します。
検索エンジンを編集する: 検索エンジンが表示されている場合は、選択してフィールドを編集します。
検索エンジンを削除する: 検索エンジンを選択し、行の端に表示される [X] をクリックします。
既定の検索エンジンを設定する: 検索エンジンにカーソルを合わせて [デフォルトに設定] をクリックします（このボタンが表示されない場合は、URL を編集する必要があります）。
[完了] をクリックします。

この時注意することはこれ。

>URL の中の検索キーワードを「%s」に置き換えます。
たとえば、Google の検索結果 URL を使用した場合、最終的な検索エンジンの URL は http://www.google.com/search?q=%s となります。アドレスバーに検索キーワードを入力すると、 %s は自動的にそのキーワードに置き換えられます。
注: URL には必ず %s を含めてください。含めない場合、その検索エンジンを既定の検索エンジンとして設定することはできません。

まず、さっきのこれ

http://www.google.com/webhp?gl=us&hl=en&gws_rd=cr

にアクセスする。

 
で、このこれを、

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/34733/f899db97-b300-c36e-23a5-2c1b92e5005e.png)

こうする。

![skitch copy.png](https://qiita-image-store.s3.amazonaws.com/0/34733/9da4a0f1-74bf-414b-d3e8-afe2988c70ad.png)

でさっきのセッティング画面でこんな感じで登録する。

![Screen Shot 2016-04-30 at 16.13.47.png](https://qiita-image-store.s3.amazonaws.com/0/34733/0221e477-d71b-6ff4-b839-99df1e777400.png)

これで次からURLバーからすぐに検索できるー。
個人的にハッカソンとかでよく使う簡易DBクラス


ハッカソンに限らず、メンテナンスとかを考えずに、ちゃちゃっと実装したいような場合に、いつも似たようなのを書いてる気がしたので、共通部分を抜き出してみた。

ポイントは
- 環境依存性の少ないSQLite
- 最初のうちはDBごと作りなおすことが多いので、リセット込み
- 再利用することもあるのでクラスぐらい作っておく


```php
<?php

class DB{

    function initDb(){
        date_default_timezone_set('Asia/Tokyo');
        $pdo = new PDO('sqlite:db');
        return $pdo;
    }

    function createDb(){
        $pdo = $this->initDb();
        $pdo->query("DROP TABLE db"); // 最初の１回だけコメントアウト
        $pdo->query("CREATE TABLE db(id,name)");
        $stmt = $pdo->prepare("INSERT INTO db VALUES(?,?)");
        $stmt->execute([1,"test"]);
    }

    function getResults(){
        $pdo = $this->initDb();
        $sql = "SELECT * FROM db";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $results = [];
        while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
            array_push($results,$result);
        }
        return $results;
    }

    function show(){
        $results = $this->getResults();
        foreach($results as $result){
            var_dump($result);
            echo "<br>".PHP_EOL;
        }
    }

}

$db = new DB();
if( isset($_GET["create"]) ){
    $db->createDb();
}
$db->show();

```