OmniAICreator/Qiita-1.07M huggingface dataset:
koa@2でWebアプリケーションを作る

# koajs概要

Node.js用Webアプリケーションフレームワーク

- https://github.com/koajs/koa

以下ぐぐってざっくり把握


- Express開発陣によって開発されている、Expressの後継
- よりminimalist,modularな設計
- koaはgeneratorベースだったが、koa@2はasync/awaitベース

# ローカルで動かす

## Node.js導入

```
$ nvm install 6.9.1
$ node -v
v6.9.1
```


## package.json
作業ディレクトリを作って`package.json`を生成

```
$ mkdir APP_NAME
$ cd APP_NAME
$ npm init
$ npm install --save koa@2
$ npm install --save babel-cli babel-preset-es2015 babel-preset-stage-0 babel-polyfill
```

scriptsとenginesを修正

```package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "babel index.js -o app.js",
    "heroku-postbuild": "npm run build",
    "start": "node app.js"
  },
  "engines" : {
    "node" : "6.9.1"
  },
```


## Babelプリセット設定

```json:.babelrc 
{
    "presets": ["es2015", "stage-0"]
}
```

## koaミドルウェア導入
評価がまだ心細いが、適当に探して選んでみる。

- `koa-router@next`
	- ルーティング
	- https://github.com/alexmingoia/koa-router/tree/master/	
	- 1,358 stars(10/31)


- `koa-pug`
	- テンプレートエンジンpug(以前のjade)
	- https://www.npmjs.com/package/koa-pug
	- 772 downloads/week(10/31)
	

```
$ npm install --save koa-router@next
$ npm install --save pug koa-pug
```

## ビュー実装
```
$ mkdir views
```

```views/index.pug
html
  body
    p Hello #{name}!
```

##アプリケーション実装


```javascript:index.js
import 'babel-polyfill';
import Koa from 'koa';

const app = new Koa();

const Pug = require('koa-pug');
const pug = new Pug({
    app: app,
    viewPath: './views',
    basedir: './views'
});

const router = require('koa-router')();
app.use(router.routes());

router.get('/', async (ctx, next) => {
  ctx.render('index', {name: 'koa@2'});
})

app.listen(process.env.PORT || 5000);
```

koa@2におけるミドルウェアの使い方は個別に調べる。

- `koa-router`
	- 7.xでは`get`の引数がgeneratorからasync/awaitになっている(ただしこの例ではasyncつけてもつけなくても変わらない)
- `koa-pug`
	- https://www.npmjs.com/package/koa-pug#koa2
	- `render`は`this`でなく`ctx`に対して呼ぶ
	- `app.use`を使ったミドルウェアの追加はできない
	




## ビルド
```
$ npm run build
```
app.jsが出力される

## 動作確認

```
$ npm start
```

ローカルではlocalhost:5000で動作確認できる

# Herokuで動かす
```
$ git init
$ git add .babelrc index.js package.json views
$ git commit -m'initial commit'

$ heroku create
$ git push https://git.heroku.com/......git master
```


# 参考
- https://dinosaurscode.xyz/nodejs/2016/06/28/nodejs-koa2-tutorial/
- https://www.tutorialspoint.com/koajs/koajs_templating.htm
Digdagのtd>は複数タスクになる

http://qiita.com/pilot/items/69cbae56d85a443fb623#2%E5%8F%B0%E3%81%A8%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%AA%E3%81%97%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8 のagentが複数のDigdagサーバで動いている場合の話の続き

digdag 0.8.18にて

td>でTreasureDataに数秒かかるクエリを投げた際のタスクログ
=====================================================

td>を使った(TreasureDataにクエリを投げる)タスクをpush・実行してみた
当該クエリの実行には数秒を要する
すると、途中まで1号機、以降は2号機にタスク動作ログが出た
digファイルにはtask1(td>)とtask2(echo>)の2タスクしか定義していないがtask1の動作ログは5回出た

1号機にて

1. `2016-11-01 12:47:54.958 +0900 [INFO] (XNIO-1 task-8): Starting a new session project id=18 workflow name=xxx session_time=2016-11-01T12:47:54+09:00`
1. `2016-11-01 12:47:54.984 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=452 +xxx+task1`
1. task1実行ログ (TreasureData接続？)
1. `2016-11-01 12:47:55.939 +0900 [DEBUG] (0103@+xxx+task1): Retrying task io.digdag.spi.TaskExecutionException: Retrying this task after 0 seconds`
1. `2016-11-01 12:47:55.959 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=452 +xxx+task1`
1. task1実行ログ (SQL発行)
1. `2016-11-01 12:47:57.533 +0900 [DEBUG] (0103@+xxx+task1): Retrying task io.digdag.spi.TaskExecutionException: Retrying this task after 1 seconds`

2号機にて

1. `2016-11-01 12:47:58.639 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=452 +xxx+task1`
1. task1実行ログ (ジョブステータス問い合わせ)
1. `2016-11-01 12:48:00.379 +0900 [DEBUG] (0093@+xxx+task1): Retrying task io.digdag.spi.TaskExecutionException: Retrying this task after 1 seconds`
1. `2016-11-01 12:48:02.004 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=452 +xxx+task1`
1. task1実行ログ (ジョブステータス問い合わせ)
1. `2016-11-01 12:48:03.307 +0900 [DEBUG] (0093@+xxx+task1): Retrying task io.digdag.spi.TaskExecutionException: Retrying this task after 2 seconds`
1. `2016-11-01 12:48:06.552 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=452 +xxx+task1`
1. task1実行ログ (ジョブステータス問い合わせ)
1. `2016-11-01 12:48:07.902 +0900 [DEBUG] (workflow-executor-0): Queuing task of attempt_id=59: id=453 +xxx+task2`
1. task2実行ログ (td.last_job_idをecho>)

ログ内容の理解
=============

TreasureDataのクエリ実行は非同期実行なので、SQLを投げた後に「終わった？」との問い合わせを投げる必要があり、「まだだよ」との回答であれば数秒後にまた「終わった？」を投げる(「終わったよ」との回答を得るまで繰り返す)

その「数秒後の問い合わせ」もキューにそのためのタスクを入れることで実現している(idが452のまま変わらないので新しいタスクを入れるのではなく元のタスクをまた入れているだけか)

そしてどっちの号機のagentがそのタスクをキューから取り出すのかは不定なので、結果としてtd>オペレータは複数号機の間を行ったり来たりしながら実行されることになる
(もっと長時間かかるクエリの場合、1号機→2号機→また1号機、となることもあった)

また、キューに入っていた前タスクが完了するとworkflow executorがそれを検知して次のタスクをキューに入れる仕事をしていることも見て取れた
HerokuでSSH公開鍵(publickey)のpassphraseを求められたら

解決策を備忘録として。

#問題
いつものようにHerokuにデプロイしようとしたところ、突然パスフレーズの入力を求められて困惑

```
$ git push heroku master
Enter passphrase for key '/Users/SomeyaNaoki/.ssh/id_rsa':
```

#原因
どうやら過去にSSH公開鍵にパスフレーズを設定していたらしいが忘れてしまったみたい

適当に思いつくパスフレーズを入力したが、3回失敗した時点で以下のようなログが

```
$ git push heroku master
Enter passphrase for key '/Users/SomeyaNaoki/.ssh/id_rsa': #失敗
Enter passphrase for key '/Users/SomeyaNaoki/.ssh/id_rsa': #失敗
Enter passphrase for key '/Users/SomeyaNaoki/.ssh/id_rsa': #失敗
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights　and the repository exists.
```
#解決策
パスフレーズを忘れてしまった場合、既存の公開鍵に新しく設定し直すのは不可能なので、[HerokuでSSH公開鍵(public key)を登録する方法(と削除して再登録する方法)](http://blog.infinity-dimensions.com/2012/02/heroku-public-key-add.html)を参考に新しくSSH公開鍵を登録し、パスフレーズも再設定します！

1.まずはHerokuにログイン

```
$ heroku login
Enter your Heroku credentials.
Email: #メールアドレス入力
Password (typing will be hidden): #パスワード入力
Logged in as <メールアドレス>
```

2.Herokuに登録している鍵を解除

```
$ heroku keys:clear
Removing all SSH keys... done
```

3.鍵がなくなったか確認

```
$ heroku keys
 ▸    You have no SSH keys.
```

4.新しいSSH公開鍵を登録

```
$ heroku keys:add
Found an SSH public key at /Users/<username>/.ssh/id_rsa.pub
? Would you like to upload it to Heroku? #Yes
Uploading /Users/SomeyaNaoki/.ssh/id_rsa.pub SSH key... done
```

5.新しい鍵にパスフレーズを設定

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/<username>/.ssh/id_rsa): #デフォルトで指定された場所が使用されるので何も入力せずにenterでOK
/Users/<username>/.ssh/id_rsa already exists.
Overwrite (y/n)? #y
Enter passphrase (empty for no passphrase): #新しいパスフレーズを入力
Enter same passphrase again: #もう一度入力
Your identification has been saved in /Users/<username>/.ssh/id_rsa.
Your public key has been saved in /Users/<username>/.ssh/id_rsa.pub.
The key fingerprint is:
SHA2~~~~~ランダムな数字~~~~~ <username>@<username>-no-MacBook-Pro.local
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
| 　　　#ランダムな記号図 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
```

6.再度鍵をHerokuに登録

```
$ heroku keys:add
Found an SSH public key at /Users/<username>/.ssh/id_rsa.pub
? Would you like to upload it to Heroku? #Yes
Uploading /Users/<username>/.ssh/id_rsa.pub SSH key... done
```

7.完了！これでHerokuに無事pushできました！

```
$ git push heroku master
```

8.最後にマイグレーションを忘れずに！

```
$ heroku run rake db:migrate
```

#参考にしたサイト
[HerokuでSSH公開鍵(public key)を登録する方法(と削除して再登録する方法)](http://blog.infinity-dimensions.com/2012/02/heroku-public-key-add.html)
[ssh-keygen - 認証用の鍵を生成 - Linuxコマンド](http://webkaru.net/linux/ssh-keygen-command/)
dateコマンドのlast monthの罠

# 罠箇所
* 10月31日に前月を取得したい場合、手軽に下記のコマンドを使う

```
date -d '2016-10-31 1 months ago' '+%m'
```

だけど結果は

```
10
```
になる😰

## 解釈
* 10/31の一ヶ月前で9/31を取得するが9月は30日までの為、+1日して10/1という結果になった

```
date -d '2016-10-31 1 months ago' '+%F'
2016-10-01
```

# ではどうどうしようか
* 基準日を必ずN月1日を基準にしてから前月を取得するようにする

```
month = date +'%Y-%m-01'
date -d ${month}' 1 months ago' '+%m'
```
😃
GolangでGetWildの'89バージョンを演奏する

[Get Wild Advent Calendar 2016](http://qiita.com/advent-calendar/2016/getwild) の１日目です。

# 概要
* 89バージョンやライブの小室さんみたいにGetWildをサンプリングしたい
* でもシンセがない
* 君にはterminalがあるじゃないか

# サンプリングに必要な音源をゲットしよう
* 私はMacなのでGarageBandで元音源から必要な部分だけ抽出しました
* 全部で２個。
    * **/tmp/de-dende-den.mp3** : ﾃﾞｰﾃﾞﾝ!ﾃﾞｰﾃﾞﾝ!の部分（0:21~0:22）
    * **/tmp/get_wild_and_tough.mp3** : ｹﾞｯﾜｲｴﾝﾀｰﾌ!の部分（1:01〜1:04）

# itunesの簡易プレイリストを消去しよう
* 音源再生時、itunesが立ち上がる人もいるでしょう。
* その場合、簡易プレイリストがあると、<br>「再生を開始します。以前、次はこちらに追加した5曲を消去してもよろしいですか？」<br>とポップアップが出て、連続してｹﾞｯﾜｲｴﾝﾀｰﾌ!を流すことができません
* 画像の通り、一旦削除しましょう

![スクリーンショット 2016-11-01 14.41.02.png](https://qiita-image-store.s3.amazonaws.com/0/29405/07455930-919a-381a-bbb4-d3ff26a4dbba.png)

# golangのインストール
* 今回はgolangで実装します
* ネットで見てインストールしましょう

# コードを書く
* シグナルハンドリングを活用してみます。

```go:sampling.go
package main

import (
    "fmt"
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func main() {
    signal_chan := make(chan os.Signal, 1)
    signal.Notify(signal_chan,
        syscall.SIGINT,
        syscall.SIGQUIT,
        syscall.SIGTERM,
        syscall.SIGKILL)

    var exit_code int

loop:
    for {
        s := <-signal_chan
        switch s {
        case syscall.SIGINT:
            //　`$ open -g`でitunesを立ち上げるが、最前面に表示させないようにしてます
            exec.Command("open", "-g", "/tmp/de-dende-den.mp3").Start()

        case syscall.SIGQUIT:
            exec.Command("open", "-g", "/tmp/get_wild_and_tough.mp3").Start()

        case syscall.SIGTERM:
            fmt.Println("\n\n何も こわくはない")
            exit_code = 0
            break loop

        case syscall.SIGKILL:
            fmt.Println("\n\nきっと 強くなれる")
            exit_code = 0
            break loop

        default:
            fmt.Println("\n\nGet Wild And Tough...")
            exit_code = 1
            break loop
        }
    }
    os.Exit(exit_code)
}
```

# 実践

```bash
# buildしたほうが、TERM送った時のメッセージが表示されます
# せっかくなのでbuildしましょう
$ go build sampling.go

# 実行
$ ./sampling

ctrl + c = ﾃﾞｰﾃﾞﾝ!ﾃﾞｰﾃﾞﾝ!
ctrl + 4 = ｹﾞｯﾜｲｴﾝﾀｰﾌ!
閉じる時 = `psコマンド`でプロセスIDを調べ、kill -9でプロセスkillしちゃってください
```

# 最後に
* これで君もTKだ！
Visual StudioのdiffツールをWinMergeに変更する方法

# 対象
VSで標準のdiffツール(vsDiffMerge)が使いにくいと感じる方

# やること
VS標準のdiffツールからWinMergeに変更する

# 前提
必要なツールはインストールされているものとする

# 準備
configファイルをサクラエディタを使用して編集できるようにする
※Vim操作慣れていれば行わなくてよし

```:コマンド
git config --global core.editor "'C:\Program Files (x86)\sakura\sakura.exe'"
```
※各自のインストール先のパスを指定する

# 本題
diffツールを変更する

```:コマンド
git config --global --edit
```

```:.gitconfigの編集内容
[diff]
    tool = WinMerge
    guitool = WinMerge
[difftool "WinMerge"]
    path = C:/Program Files/WinMerge/WinMergeU.exe
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -ub -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = WinMerge
[mergetool "WinMerge"]
    path = C:/Program Files/WinMerge/WinMergeU.exe
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" \"$MERGED\"
```
※path, cmdは各自のインストール先のパスを指定する

# まとめ
configの修正でWinMergeにすることはできたものの、VS上の設定でできないものか、、、

# 参考
- [WindowsでgitのdiffとmergeのツールをWinMergeに設定するメモ (Git, GitHub for Windows, WinMerge, difftool, mergetool) - いろいろ備忘録日記](http://devlights.hatenablog.com/entry/20121114/p2)
- [Git - Git の設定](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)

# 補足
コマンドは全てコマンドプロンプトから実行しています。
グローバルで設定していますが、各リポジトリー毎に設定を行いたければ--globalオプションを外してください
GitHubのプライベートリポジトリのgemをbundle installする

# 結論
bundler 1.11以上で `export BUNDLE_GITHUB__COM=<username>:<personal access token>` する

# 補足

諸般の事情でプライベートリポジトリで管理したいgemがある場合、bundle installするにはどのようにすればよいのか。

ぐぐると、こんなかんじで、GitHubのuser/passwordやpersonal access tokenを環境変数で渡す例が見つかるんですが、

[How can I specify a gem to pull from a private github repository?](http://stackoverflow.com/questions/4840680/how-can-i-specify-a-gem-to-pull-from-a-private-github-repository)

```rb
gem 'my_gem', :git => 'https://my_username:my_password@github.com/my_github_account/my_repo.git', :ref => 'revision_no'
```

[Building a project with private gems](https://semaphoreci.com/docs/building-project-with-private-gems.html)

```rb
gem 'ventana', git: "https://#{ENV['GITHUB_TOKEN']}:x-oauth-basic@github.com/thoughtbot/ventana.git"
```

この方法は、Gemfile.lockにパスワードやトークンが残ってしまうので、セキュリティ的には片手落ちでよくありません。

もうちょっと調べてみると、bundler 1.11以上であれば、Gemfileに書かなくても環境変数から読んでくれるようになってました。

https://github.com/bundler/bundler/pull/3898

github.comにホストしている場合は、 `BUNDLE_GITHUB__COM` という環境変数でユーザ名とパーソナルアクセストークンをexportしておくと見てくれます。

```
export BUNDLE_GITHUB__COM=<username>:<personal access token>
```

試してないですが、github.com以外もドメインに対応した同じルールで環境変数を見てくれるみたい。
あとbundle configにセットする方法もある。bundlerの公式ドキュメントは以下をどうぞ。

http://bundler.io/man/bundle-config.1.html#CONFIGURATION-KEYS
Baculaで知っていると便利な小技をまとめみた。

Baculaで知っていると便利な小技をまとめてみました。
小技は随時追加予定です。

## コンフィグファイルが長すぎるのをどうにかしたい
Baculaの設定はファイルは主に以下の４つです。

/etc/bacula/bacula-dir.conf
/etc/bacula/bacula-sd.conf
/etc/bacula/bacula-fd.conf
/etc/bacula/bconsole.conf

主にbacula-dir.confに全てのJOBやクライアントの情報を記述しなければならずコンフィグファイルが長くなりわかりにくくなります。その際はbacula-dir.confの中に以下のように記載します。

@/etc/bacula/job.list
@/etc/bacula/client.list

job.list、client.listにはそれぞれJOBやクライアント情報を記載し、外部ファイルとしてbacula-dir.confから呼び出すことができます。これで1つのコンフィグファイルを短くして、分かりやすくすることができます。

## コンフィグファイルのチェック
コンフィグファイルが間違っているみたいだがどこに記述ミスがあるのかわからない時に使えます。
それぞれチェックしたい設定ファイルに対してコマンドを実行します。

```shell-session
# bacula-dir -t -c /etc/bacula/bacula-dir.conf
# bacula-fd -t -c /etc/bacula/bacula-fd.conf
# bacula-sd -t -c /etc/bacula/bacula-sd.conf
# bconsole -t -c /etc/bacula/bconsole.conf
```

間違っているところの行数が表示されます。何も表示されない場合はコンフィグファイルに間違いはありません。

## JOB失敗時にメールで通知させたい
メッセージリソースに以下のように設定します。

```shell-session
Messages {
  Name = Standard
  mail = <メールアドレス指定> = notsaved, warning, error
  operator = <メールアドレス指定> = mount
  console = all, !skipped, !saved
}
```

上記のように設定すると
・JOBの実行エラー
・JOBの実行時にwarningが発生
・バックアップ実行時にファイルが1つも保存されなかった

の時にメールで通知されます。

## バックアップ取得時に圧縮したい

FileSetリソースのオプションでcompressionオプションを使用することにより圧縮が可能です。

圧縮形式は「GZIP」と「LZO」の2種類が存在します。
GZIPはGZIP1～GZIP9まで9段階の圧縮率が指定できますが、通常はデフォルトのGZIP設定で問題ありません。
ちなみにデフォルトのGZIPはGZIP6と同じ圧縮率です。
LZOはBaculaのバージョン7.2以降で使用可能です。

FileSetの設定例は以下になります。

```shell-session
# List of files to be backed up
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }

    File = /
  }

  Exclude {
    File = /opt/bacula/working
    File = /tmp
    File = /proc
    File = /sys

  }
  }
}
```


## Baculaのログ出力
Baculaのログは以下に出力されます。
/var/log/bacula/bacula.log


## Poolって何？
以下をご参照ください。

StorageとPoolの関係について
https://www.bacula.jp/archives/1128
レゴ マインドストーム EV3 のブロックごとのID

EV3インテリジェントブロックの中からそれぞれのブロックごとのID（シリアルナンバーや製造者番号？）を確認できる。

1. EV3インテリジェントブロックの電源をつけ、一番右の設定画面に進む。（スパナのマーク）
2. 設定画面の一番下「Brick Info」の中にIDがある。
Swift でクラス名一括変換した際、うっかり小文字変数名も変わってしまった時の話

クラスの名前などを 一括 Rename する場合などに、油断していると タイプ名と変数名をまとめてに変換しまいしまったという経験のあるかたも少なくないかと思います。以下のようなコードで…

```.swift
class YourObject {
}

class TheirObject {
	var yourObject: YourObject?
}
```

`YourObject` を `MyObject` に一括変換した際、小文字で始まる変数名 `yourObject` もうっかり大文字で始まる `MyObject` に変換されてしまって、慌てて修正なんていう場合です。

```.swift
class MyObject {
}

class TheirObject {
	var MyObject: MyObject?
}
```

今回 Xcode 8.1 になっても懲りずにこれをやってしまいました。ところが、今回ビルドエラーにならいケースがあったので、あれっ！？と思い検証してみました。すると、Xcode 8.1 で以下のように書いても、エラーになるのは最後の行 `[4]` だけでした。`[1]`, `[2]`, `[3]` がエラーにならないのは不思議な感じがします。 

```.swift
// Xcode 8.1
// Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)

class MyObject {
	var MyObject: String? // [1] 👍
}

class YourObject {
	var MyObject: MyObject? // [2] 👍
}

class ThierObject {
	var YourObject: MyObject? // [3] 👍
}

var MyObject: MyObject? // [4] 🚫 error!!
```

そこで、Xcode 8.0 を引っ張り出してきて、試してみました。

```.swift
// Xcode 8.0
// Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)

class MyObject {
    var MyObject: String? // [1] 👍
}

class YourObject {
    var MyObject: MyObject? // [2] 👍
}

class ThierObject {
    var YourObject: MyObject? // [3] 👍
}

var MyObject: MyObject? // [4] 🚫 error!!
```

Xcode 8.1 と同じ挙動で、Xcode 8.0 の時から `[1]`, `[2]`, `[3]` の書き方は OK なようです。では、さらに Xcode 7.3 を召喚して、試してみました。

```.swift
// Xcode 7.3
// Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)

class MyObject {
	var MyObject: String? // [1] 👍
}

class YourObject {
	var MyObject: MyObject? // [2] 🚫 error!
}

class ThierObject {
	var YourObject: MyObject? // [3] 👍
}

var MyObject: MyObject? // [4] 🚫 error!
```

`[1]` と `[3]` も OK だったのですね。驚きです。
pyenv-virtualenv環境でインストールしたパッケージが他のディレクトリでもみれてしまう

pyenvはpythonのバージョンと環境をディレクトリごとに管理できる
それに名前をつけることができる

pyenv　環境設定編
pyenvを導入するにはトータルの環境設定が必要

pyenv を常にアクティベートするようにbashrcに記述しておく
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

MACの場合はデフォルトでは読み込まれないので、
.bash_profileに読み込み設定を記述する
HOMEに.bash_profileを作成して以下を記述。
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

これができていないと、起動時にはpyenv環境ではなくデフォルトになる

pyenvの導入については
http://blog.ieknir.com/blog/pyenv-with-virtualenv/
が参考になった。


環境がしっかりつくれてないと、、
pyenv-virtualenv環境でインストールしたパッケージが他のディレクトリでもみれてしまうように思える。

しっかりと環境をつくることが大切
Phantomjs 2.1.1 を Ubuntu14.04 にいれる

ReactJSで作られてページの取得が`phantomjs 1.9.7` ではうまくいかなかったのでバージョンを `2.1.1`に上げました。

### やり方

```.sh
sudo apt-get install nodejs
sudo apt-get install nodejs-legacy
sudo apt-get install npm
sudo npm -g install phantomjs-prebuilt
```

「`phantomjs`を入れるだけなのに何で`npm`とか入れなあかんねん。」というツッコミは最もですが、これが一番めんどくさいことが少なく済むそうです。

### 参考

http://stackoverflow.com/questions/36839635/how-to-update-phantomjs-1-9-8-to-phantomjs-2-1-1-on-ubuntu
MySQLで種別ごとに順位を決める

一つのテーブルで単純に順位を決めるだけなら色々ググってもでてきますが、
ある項目でグルーピングして順位を決めるものがなかなかなかったのでメモしておきます。
oracleならrank関数一択なんですがmysqlになかったので。。。
下記は3位までです。

```lang:
select
 *
from 対象テーブル a
, (
    select
     (select @R:=IF(@C=種別列名, @R+1 ,1) from (select @R:=0) as rank_dummy) as rank
    , (select @C:=`種別列名` 種別列名 from (select @C:=0) as cate_dummy) as cate
    , プライマリキー（結合用）
    , 種別列名
    from 対象テーブル
    order by 種別列名 asc
    ,ランキング対象列 asc) b
where b.rank <=3
and b.プライマリキー = a.プライマリキー


ascは昇順時　descに切り替えも可能
```
vSphare6.0 on VirtualBox (nested ESXi) やってみた。

＃マトリョーシカ仮想環境（勝手に命名w）

自宅の最高の検証環境「MacBookPRO 15inch 2015」にVMwareで勉強できれば最高なのにー。って仮想の中に仮想環境ってできるのか検証してみました。
VirtualBox上にvSphare環境を構築するネタってあんまり情報がないですね。まあできて当たり前なのかな。
さあ、評価ライセンスある間に弄り倒さねば。

興味のある方は以下のブログリンクへジャンプ！
http://amachan007.techblog.jp/archives/7756292.html

それではさよならさよなら。
ブラウザの高さが取得できない瞬間


特定の状況のときにブラウザの高さを適切に取得できない瞬間がある。
ちゃんとした原因は分からないが、下記の状態の時

```css
.foo {
	position: fixed;
	top: 0;	
	transition: all 0.2s ease;
}
```

.foo要素をモーダルでアニメーションさせて表示させる際に、transitionがallだとresizeやorientationchangeイベントでブラウザの高さを取得したらぜんぜん違う高さが返ってきた。

transitionをallではなく変形させたいプロパティのみにしたら問題なく取得できたので、fixedとtransitionがallの時の組み合わせで起きていた模様。

mobile safari以外で試してないので他ブラウザでも同様に起きるのかは分からない。

※訂正：chromeではなくmobile safariでした
SSHコマンドの警告メッセージを出さないためのオプション

プログラムに SSH を利用しリモートのサーバにコマンドを実行するのは便利ですが、もしその出力を分析したいとした時、下記のオプションが必要です。

## -o StrictHostKeyChecking=no

SSH で信用サーバのデータベースにとうろくされていないホストに対し、確認メッセージが聞かれます。

このオプションに３つの選択肢が選べます：

- ask(default) : 確認させる
- yes : 接続しない
- no : チャックしなくて、接続します


`no` に設定すると、無条件にそのサーバに接続され、コマンドはブロックなしで実行されます。

## -o UserKnownHostsFile=/dev/null


ホストデータベースは普通に `~/.ssh/known_hosts` を使われますが、 `UserKnownHostsFile` オプションで他の場所に指定することもできます。

`/dev/null` を指定すると、ホスト情報を書き込みしても何も起きないので、既存の `known_hosts` ファイルに影響を与えない。

## -o LogLevel=error/quiet

初めてに接続するサーバには、このようなメッセージが出されます：

```
Warning: Permanently added the RSA host key for IP address '10.10.0.2' to the list of known hosts.
```

このよけのメッセージは正常の処理に支障を与えます、 `-o LogLevel=error/quiet` オプションで、このメッセージを抑えられます。
PowershellでSQLDatabaseをAzureStorageにエクスポート

本番環境のDBをコピーしてデータのマスキング処理を行ったあとに別の環境にコピーして使うのをイメージしています。

[PowerShellでAzureSQLDatabaseのポイントインタイムリストアからのリストア](http://qiita.com/sat0tabe/items/85181feb0141367fb779)
で作成したDBをエクスポートするように作成しました。

こちらも残念ながらクラシック版です

```
function Start-CustomSqlDatabaseExport
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string] $serverAdmin,
        [string] $serverPassword,
        [string] $SourceServerName,
        
        [string] $StorageAccountName,
        [string] $StorageAccountKey,
        [string] $ContainerName = "コンテナ名",
        [string] $SourceDatabaseName = "リストア後DB"
    )

    if($SourceDatabaseName -eq "引数指定無しの場合")
    {
        $SourceDatabaseName = $SourceDatabaseName + (Get-Date -Format "_yyyyMMdd")
    }
    if($ContainerName -eq "引数指定なしの場合")
    {
        $ContainerName = $ContainerName + (Get-Date -Format "-yyyyMMdd")

        try
        {
            New-AzureStorageContainer -Name $ContainerName -ErrorAction Stop
        }
        catch
        {
            Write-Output "Skipped New-AzureStorageContainer"
        }
    }
    $TargetBlobName = $SourceDatabaseName + (Get-Date -Format "HHmmss") + ".bacpac"

    #SQLDBの資格情報作成
    $securePassword = ConvertTo-SecureString –String $serverPassword –AsPlainText -Force
    $credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $serverAdmin, $securePassword
    $SqlConnectionContext = New-AzureSqlDatabaseServerContext -ServerName $SourceServerName -Credential $credential

    #格納先Storageの情報
    $StorageContext = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
    $StorageContainer = Get-AzureStorageContainer -Name $ContainerName -Context $StorageContext

    $exportRequest = Start-AzureSqlDatabaseExport -SqlConnectionContext $SqlConnectionContext -StorageContainer $StorageContainer -DatabaseName $SourceDatabaseName -BlobName $TargetBlobName

    $Counter = 1
    while ($true)
    {
        #終了するまで待機
        $DbExportStatus = Get-AzureSqlDatabaseImportExportStatus -Request $exportRequest -ErrorAction SilentlyContinue
        if ($DbExportStatus.Status -eq 'Completed'){
            break
        }
        
        sleep -Seconds 10 -Verbose
        
    }
}
$serverAdmin="serverAdmin"
$serverPassword="serverPassword"
$SourceServerName="databaseservername"
$StorageAccountName="StorageAccountName"
$StorageAccountKey="StorageAccountKey"
Get-AzureSubscription -Current | Set-AzureSubscription -CurrentStorageAccountName $StorageAccountName
Start-CustomSqlDatabaseExport -serverAdmin $serverAdmin -serverPassword $serverPassword -SourceServerName $SourceServerName -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
```
GoogleCloudで汎用Database構築3 - Reデザイン -

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
チーム全員で色々いじって分かったが、Cloud Pub/Subはkafkaの様にメッセージの順序性を保証しない（Subscriber側で対応の必要がある）ので、グランドデザインに手を加えて大きく舵を取ろうと思う。
最近はタイムボックス1週間でスプリントを回しているため、細かい方向転換が容易になってきた気がする。

前回の設計はこちら
[GoogleCloudで汎用Database構築1 - グランドデザイン -](http://qiita.com/tstakano-yj/items/7e2ca3d5ad33aefa33aa)

# Redesign
![zeolitediagram.png](https://qiita-image-store.s3.amazonaws.com/0/114329/9b655c81-6805-a7db-0519-7b9a20a45a2e.png)


## Agent
新規に加えました。
CloudDetastoreにデータを放り込むアプリケーションを構築する。
SpringBoot + Apache Camel + kubernetes（Docker）で構築しようと思います。

## Dataflow

pub/sub のsubscriberとして機能させる。
以下のjobを作成

 - MetaStoreJob
    - CloudDataStoreからpullしたdata（meta）を永続化層（BigQuery）に保存する。
    - 様々な形式のデータが入ってくるので、DocumentDBに保存
 - LogExportJob
    - 購読したメッセージ（log）を永続化層（Datastore）に一時保存する。バッチモードで定期的にファイルにして、AzureMachineLearningに食わせる。
    - Metaデータも定期的にMachineLearningに食わせるべく、ファイル形式でExportする。

## Storage
永続化層として使用。BigQueryをマスターにする形に変更。

# 次回
Agentをハンズ・オンします！
Androidのwebview内でJSのconfirmを出す

* confirm("トップページに戻りますか？")と記述してもwebview内でconfirm画面が出なかった(常にfalse)
* WebChromeClientでonJsConfirmメソッドをオーバーライドする必要があるようだ。

* onCreate内で
  * ```
myWebView.setWebChromeClient(new MyWebChromeClient());
```

```
 final Context myApp = this;

    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
          new AlertDialog.Builder(myApp)
                    .setTitle("App Titler")
                    .setMessage(message)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    result.confirm();
                                }
                            })
                    .setNegativeButton(android.R.string.cancel,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    result.cancel();
                                }
                            })
                    .create()
                    .show();

            return true;
        }
    }
```
pandas クロス集計でユニーク値の総計を求める

###目的
pandasで２つのカテゴリ変数でvalue変数をクロス集計し、value変数のユニーク値の総計を求めたい。

###SQLで書くと以下のコード

```sql
SELECT date,carrier,count(DISTINCT host) as cnt
FROM apachelog
GROUP BY date,carrier;
```

### 集計イメージ
date とcarrier変数(カテゴリはAndroid,iOS,Otherの3種類）ごとに、変数hostのユニーク値をカウント

| date | Android | iOS | Other|
|:--|:-- |:-- |:--|
|2015/04/01 | 5000 | 1300 | 15|
|2015/04/02 | 5200 | 1230 | 16|
|2015/04/03 | 5300 | 1100 | 17|
|... | ... | ... | ...|


### python3でのコード(1) pivot_tableメソッドを使う

クロス集計(カラムB×カラムC）の各セルごとのカラムAの平均値

```py:
　pd.pivot_table(df,value='A',index='B',columns='C')
```

クロス集計(カラムB×カラムC）の各セルごとのカラムAの個数

```py:
 pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'count')
```

クロス集計(カラムB×カラムC）の各セルごとのカラムAの総計

```py:
　pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'sum')
```

では、各セルごとのカラムAのユニークな値の個数はどうするか？
lambda式を使います。
lambda式の書き方は、lambda 引数1,引数2　・・・　:処理


```py3:pivot_unique.py
import pandas as pd

#データはpandasのデータフレームにしておく
df = pd.DataFrame(apachlog)

#以下のやり方ではna値を含んだ値になります。
#あらかじめデータフレーム.info()でnaがないと分かっている時には使える手
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
 aggfunc = lambda x:len(x.unique()))

#以下のやり方は、na値を除いた値になります。
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
 aggfunc = lambda x:x.nunique())

```


### (おまけ）ファイルにエクスポート

pandasのデータフレームはto_csvメソッドでtsv形式でエクスポートできます。

```py3:output.py
fout = 'output.tsv'
f = open(fout,'w',encoding = 'utf-8')

pv.to_csv(fout,sep = '\t')
f.close()
```

### python3でのコード(2) groupbyメソッドを使う

```py3:use_groupby.py
#ｘ軸、y軸を指定してグループバイオブジェクトを作る
grouped = df.groupby(['date','carrier'])

#データフレームにgroupbyしても結果が出てくるのではなく、集約キーが付与されたデータフレームのGroupByオブジェクトが生成されるだけ

#groupedオブジェクトに対して、カラム「host」で集約する。
#集約する関数は、agg(この中身をラムダ式で指定)
#naもユニーク値に含まれるカウント
grouped.host.agg(lambda x: len(x.unique()))

#naを含まないカウント
grouped.host.agg(lambda x: x.nunique())

```


groupbyメソッドの集計結果は、「縦持ち」(=long型）テーブルになります。

| date | carrier |  | 
|:--|:-- |:-- |
|2015/04/01 | Android |5000 |
|2015/04/01 | iOS |1300 | 
|2015/04/01 | Other |15|
|2015/04/02 | Android |5200 |
|... | ... | ... | ...|

「縦持ち」（long型）をクロス型（？というのでしょうか？）(=wide型)に展開したい場合、以下のように***unstackメソッド***を使えば、上の集計イメージを得られます。

```py3
#g = grouped.host.agg(lambda x: len(x.unique()))
g = grouped.host.agg(lambda x: x.nunique()))

g.unstack()

```




### 実行環境
 - anaconda3-4.0.0
 - OS X El Capitan 10.11.3
 


###参考
- [<Python,pandas> pivot_tableの使い方とプロット](http://nekoyukimmm.hatenablog.com/entry/2015/04/10/094432)
- [オライリー「Pythonによるデータ分析入門」でのpivot_tableメソッドのエラー](http://progmemo114.hatenablog.com/entry/2015/12/28/200108)
- [stack_overflowでのどんぴしゃの質問](http://stackoverflow.com/questions/12860421/python-pandas-pivot-table-with-aggfunc-count-unique-distinct)
- [オライリー[Pythonによるデータ分析入門]　第9章データの集約とグループ演算]([https://www.oreilly.co.jp/books/9784873116556/)
all, any, filterの比較表

10年ほど前、配列操作や文字列操作の比較表というのが便利ということで流行ったのだが、最近見かけなくなってしまった。
誰かwikiにでもまとめてくれていないのだろうか。

[文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ](
http://0xcc.net/blog/archives/000137.html)
[配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ](
http://0xcc.net/blog/archives/000043.html)
[時刻操作の比較表 - Global Wiki](
http://www.betatechnology.jp/pp/index.php?%E6%99%82%E5%88%BB%E6%93%8D%E4%BD%9C%E3%81%AE%E6%AF%94%E8%BC%83%E8%A1%A8)


これはそのall, any, filter版。

| Ruby | JavaScript | Python | Scheme| Haskell | 
|-----|----|----|----|----|
| a.all? | a.every(f) | all(lis) | (every f lis) | all f xs | 
| a.any? | a.some(f) | any(lis) | (any f lis) | any f xs | 
| a.select | a.filter(f) | filter(f, lis) | (filter f lis) | filter f xs |
| a.reject | なし | なし | (remove f lis)  | filter (not . f) xs |
pandasのread_csvでUnicodeDecodeError

#エラー内容
pandasのread_csvを行ったところ、エラーで読み込みできませんでした。

```sample.py
import pandas as pd
df = pd.read_csv("hoge.csv")
```

エラーメッセージ

```
UnicodeDecodeError:'utf-8' codec can't decode byte 0x95 in position 0: invalid start byte
```

#対応方法
`encoding='cp932'`をつけたらうまくいきました。

```sample.py
import pandas as pd
df = pd.read_csv("hoge.csv",encoding='cp932')
```

# 参考ページ
[pandasでread_csv時にUnicodeDecodeErrorが起きた時の対処 (pd.read_table())](http://qiita.com/niwaringo/items/d2a30e04e08da8eaa643)
のコメントを参考にさせていただきました。

ありがとうございました。
for 文と while 文の違い

Java における for 文と while 文についてまとめました。

# for 文

``` java:forExample.java
for (int i = 0; i < 5; i++) {
    text += "The number is " + i + "<br>";
}
```

- 括弧の中には初期化式、条件式、変化式
- i のスコープは for 文の中だけ
- i をスコープ外にまたがって使用する場合、  
  スコープの外で宣言しておく必要がある
- 実は処理が一行だけなら中括弧はなくても動く
- 変化式が実行されるのは処理が行われたあと
- list 等の中身を全て参照する場合などには for-each 文が使える

```java:forEachExample.java
List<String> list = new ArrayList<String>();
list.add("test1");
list.add("test2");
list.add("test3");
// for 文 で書いた場合
for (int i=0; i<list.size(); i++) {
  System.out.println(list.get(i));
}
// for-each 文だと
for (String str : list) {
  System.out.println(str);
}
```

# while 文

``` java:whileExample.java
int i = 0;

while (i < 2){
  System.out.println("i = " + i);
  i++;
}
```
- 括弧の中に入るのは条件式のみ
- 条件式を判定する前に処理を行わせる do-while 文もある

### do-while 文
```java:doWhileExample.java
int count = 1;
do {
  System.out.println("Count is: " + count);
  count++
} while (count < 11);
```

# break 文

```java:breakExample.java
int num = 1;

while(true){
  System.out.println(num);
  num++;

  if (num > 100){
    break;
  }
}
```

- 今いる while 文及び for 文から抜け出し繰り返しを中断する際に使う
- 今いるところのさらに外側へ抜ける処理をする場合はラベルを使う

### ラベル

```java:breakLabelExample.java
loop1:  for (i = 0; i < 10; i++) {
            for (j = 0; j < 10; j++) {
                if ((i == 1) && (j == 5)) {
                    break loop1;
                }
            }
        }
```

- この break はラベルで指定されたところから抜け出す処理を行う

# continue 文
```java:continueExample
for (int i = 0; i < 10; i++){
  if (i == 3){
    continue;
  }

  System.out.println(i);
}
```

- break 文とは異なり、処理は中断しない
- continue 文に到達した地点から次の条件式判定まで処理をスキップさせる
- break 文のようにラベルを使うことも出来る

# for と while の使い分け
- 単純な前処理、単純な後処理が必要な反復処理においては for 文
    - 例えば: 繰り返す回数が分かっている処理など
- 複雑な前処理や後処理が必要な反復処理が必要な場合は while 文を使う
テキストを指定した文字数または行数でカットする

よくあるパターンまとめ。

# 文字数によるカット

HTMLエンディがちょうどカットしたい部分に来ると中途半端な文字列になるパターンがあるのでコード改良。
参照
https://blog.emwai.jp/wordpress/post-content_substr/

## WordPress
### the_excerpt()
`the_excerpt()` のデフォルトは55 **単語** 。 [「WP Multibyte Patch」](http://eastcoder.com/code/wp-multibyte-patch/) 利用時のデフォルトは110 **文字**。

日本語**以外**で `the_excerpt()` の抜粋の長さを変更する場合は `excerpt_length` フィルターを使う。

```php:custom_excerpt_length.php
function custom_excerpt_length( $length ) {
     return 20;	
}	
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
```

日本語の場合は「WP Multibyte Patch」」の設定を使う。

```php:wpmp_conf.php
$wpmp_conf['excerpt_mblength'] = 110;
```
参照：http://eastcoder.com/code/wp-multibyte-patch/

### wp_trim_words()

前述の `the_excerpt()` の文字数は一律での対応となるが、個別に対応したい場合やタイトルなどでも対応したい場合は `wp_trim_words()` 使う。
https://developer.wordpress.org/reference/functions/wp_trim_words/
ソース見るとわかるのですが、元になる文字列にHTMLタグや改行（\r\n）、タブ（\t）が含まれている場合削除された後に文字数カットします。

```php:wp_trim_words.php
<?php
$text      = get_the_title(); // 元になる文字列
$num_words = 40;              // 単語数（WP Multibyte Patch 有効時は文字数）
$more      = '&hellip;';      // カットした文字列の末尾につける文字列

// HTMLエンティティを文字列に変換
$text = html_entity_decode( $text );
// 指定の文字数で切り出す
$text = wp_trim_words( $text, $num_words, $more );
// HTMLエンティティを元に戻す
$text = htmlentities( $text );

echo $text;
```
## PHP
### mb_substr()
文字数かつマルチバイトにも対応なら `mb_substr()` でいいよねってことで。
http://php.net/manual/ja/function.mb-substr.php
### mb_strimwidth()
`mb_substr()` と違い、trimmarker がつく。丸める幅＝文字数は trimmarker も含まれる。
http://php.net/manual/ja/function.mb-strimwidth.php

`mb_substr()`, `mb_strimwidth()` 両者とも（というかPHPなので当たり前ですが）HTMLタグや改行とかタブなどの制御文字は考慮しないので、それらが含まれる場合はよしなに処理しておく必要がある。
# 行数によるカット
指定行数で収めたいとき、文字列によるカットだとレスポンシブデザインやリキッドレイアウトなどいわゆるブラウザ幅によって1行あたりに入る行数が変わる場合に面倒。
こういうときは css or jQueryで。
## 1行なら text-overflow
https://developer.mozilla.org/ja/docs/Web/CSS/text-overflow

```css:text-overflow.css
p {
  white-space: nowrap;
  width: 100%;                   /* IE6 では width の指定が必要 */
  overflow: hidden;              /* "overflow" の値は "visible" 以外のものを指定する */ 

  -o-text-overflow: ellipsis;    /* Opera 9-10 */
  text-overflow:    ellipsis;
}
```
ベンダープレフィックスはsassなりcompassなりでよしなに。

## 複数行
正直コレが一番めんどくさいんだけど需要はあるのよね。
なお、ブラウザを限定していいなら `webkit-line-clamp` があるがIE対応してないので割愛。

[trunk8](http://jrvis.com/trunk8/) はjQueryプラグインで指定した要素に対して複数行で文字列をカット可能。

```js:t8-default.js
$('#t8-default').trunk8();
```
1ページ内に2行だったり、3行だったりする場合は cssクラス分けたり、data属性指定したりなど工夫してみてください。

```js.trunk8-sample.js
var trunk8 = $('.trunk8');
var lines = 2;
if( trunk8.length > 0 ){
	trunk8.each(function(){
		if( $(this).attr("data-line") ){
			lines = $(this).attr("data-line");
		} else {
			lines = 2;
		}
		$(this).trunk8({
		  lines: lines
		});
	});
}
```

2016.11.8 追記
IE のみ `<a>` などのインライン要素に使った場合、trunk8 は正常に動作しません。
CSSなどで該当要素をブロックにしておきましょう。

2018.8.17 追記
Windows の Chrome（執筆時の最新版）でも再現。Mac版では正常に動作。解せぬ。

```css:ie-trunk8.css
.trunk8 {
	display: block;
}
```
高さ取得してるからそりゃインラインではねって気もするけど、すごくもにょった。
ubuntu16.04にcudaをインストールするときのエラーを回避する。

# cudaをダウンロードしてインストール
https://developer.nvidia.com/cuda-release-candidate-download
で登録してダウンロード。
.runファイルを
```
sh cuda_8.0.44_linux.run
```
みたいにして実行する。
installは他のいろんなサイトをみるのがよい
http://qiita.com/yukoba/items/3692f1cb677b2383c983
http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b
http://robotics4society.com/2016/06/15/ubuntu1604-caffe/

#症状1：cudaがインストールできない
license agreementをひたすら読んでからagree。
するとグラフィックドライバーをインストールするかどうかとかいろいろ聞かれる（drivergはインストールしないこと！後述）
すぐにx serverが〜〜でインストールできないと出る。
```
sudo service lightdm stop
```
と叩く。するといきなりブラックアウト:alien:する。
ここでctrl+alt+F1でターミナルを起動。
ここで先ほどのようにcudaのインストールを実行すれば良い

最後に
```
sudo service lightdm start
```
で元に戻る。

# 症状2：無限ログイン
ubuntuのログイン画面で、ログインしようと何度も戻ってしまう。
これはグラフィックドライバーが問題とのこと。
cudaインストールで同梱のドライバー（367.xx）をインストールしてしまったのが問題。
当方のGPUは**gtx1080**は375.xxが。apt-getでinstallできる（最新の？）ものはnvidia-370。これをインストールする。**自分のグラフィックボードにちゃんと合わせるのが重要**（自分は他の記事のコマンドをコピペして打ち込んたりしてしまって何度かこの症状になった）
ただしapt-get purgeで一旦古いドライバーは削除する必要があった。
見出しの両脇に線をつけるだけのCSS（Flexbox使用）

シンプルなやつ。（もちろん可変対応）

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/146133/a9fcd393-f09e-a1a8-04d1-ff8ce5e042d6.png)

左右に余白を入れたいので、`<span>` を中に入れてます。

```html
<h3><span>\ ジャーン /</span></h3>
```

可変時も含めて見てみると、 `background` のほうがキレイですかね？


## CodePen

http://codepen.io/doseiok/pen/ozpmYG
drush でDrupal8をインストールするとメモリ不足になる対処法

10月中旬より drush で CentOS7.2 上に Drupal8 をインストールしようとするとメモリ不足のエラーメッセージが表示されてインストールすることが出来なくなりました。
Ubuntu14.03 / Ubuntu 16.03では問題ありませんでした。
その後、別の問題も併発してしばらくインストール自体が手元のどのOSでも出来なくなりましたが、そちらのバグは報告して無事修正されています。

```
# /usr/local/bin/drush  -y si\
  --db-url=mysql://root@localhost/drupal\
  --locale=ja\
  --account-name='terao'\
  --account-pass='xxxxxxxx'\
  --account-mail='terao@********.info'\
  --site-name='drupal8 on CentOS7.2'
(略)
You are about to create a /var/www/html/sites/default/settings.php file and CREATE the 'drupal' database. Do you want to continue? (y/n): y
Starting Drupal installation. This takes a while. Consider using the        [ok]
--notify global option.
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 4104 bytes) in /var/www/html/core/lib/Drupal/Core/Config/TypedConfigManager.php on line 272
```

メモリ不足と言うことなので、/etc/php.iniのメモリ上限を調べてみると、128MBです。これだけ有れば十分だろうと思いますが、しょうが無く192MBまで上げてみると無事インストールできます。
とはいえ、192MBって食い過ぎじゃ無いか？

```
396c396
< memory_limit = 128M
---
> memory_limit = 192M
```
スマホの画面回転検知

## はじめに

スマホの横検知は今まで「できなくはないが動作が不安定」という認識でしたが、ちょうど横画面のときのアラートを実装する機会があったので、試行錯誤しました。


## 前提条件

- `orientationchange` イベントは少なくとも最新版Chrome、iOS8 Safari、Android 4.xでは動くようである
- `resize` イベントと画面の縦横比で振り分ける方法もあるが、URLバーやキーボードなどのUI要素との兼ね合いで不具合を起こす可能性がある
- iOS版SafariはScreen Orientation APIに未対応（ `screen.orientation` が `undefined` ） の代わりに、 `window.orientation` をもつ
- `screen.orientation` の値はAndroidの端末によっては異なるかも（これに対応するには別途対策が必要）

## 実装

以上を総合して以下のようなコードに落ち着きました。

```js
var $rootElm = $('html');

$(window).on('orientationchange', (evt) => {
  var angle;
  angle = screen && screen.orientation && screen.orientation.angle;
  if (angle == null) {
    angle = window.orientation || 0;
  }
  if(angle % 180 !== 0) {
    $rootElm.addClass('is-rotated');
  } else {
    $rootElm.removeClass('is-rotated');
  }
}).trigger('orientationchange');
```


## 最後に
画面回転についてのAPIはまだ不安定なので、現状確実に検知する方法はありません。過信しないようにしましょう！

参考: [Screen Orientation APIを試してみる - Qiita](http://qiita.com/tomoyukilabs/items/951408b969d207a90847)
gitのヘルプのSYNOPSISの読み方

gitでコマンドの使い方がわからなかったらググる人も多いと思いますが、普通にコンソールでもマニュアルが読めますよ。

例えば、 `git add` のヘルプを見たいときは次のようにすれば良いです。（どちらのコマンドも同じ内容）

```
$ git help add
$ git add --help
```

インストール方法によっては `man` コマンドでも同じヘルプページが表示できます。

```
$ man git-add
```

でも、英語で非常に読みづらい、とか思いますよね。英語に関してはがんばって読んでください(；´∀｀)
同じヘルプページはオンラインでも読めます。 https://git-scm.com/docs

もう一つ読みにくいポイントはコマンドライン引数やオプションの指定方法に関して書かれた部分 `SYNOPSIS` です。

```
SYNOPSIS
       git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
                 [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
                 [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
                 [--chmod=(+|-)x] [--] [<pathspec>...]
```

Linuxの `man` コマンドに慣れている方は割とすんなり読めると思いますが、読み方を少し書いておきます。

## 文法

- `[ A ]` : 任意で入力できる項目。あってもなくても良い。Optional。
    - `[--refresh]` : `--refresh` というオプションを指定可能。なくても動く。
- `[ A | B ]` : A または B のどちらかを指定可能。
    - `[--verbose | -v]` : `--verbose` というオプションを指定可能。 この場合、`-v` は同じ意味の省略形。
    - `[--[no-]all | --[no-]ignore-removal | [--update | -u]]` : この場合、 `--all`, `--ignore-removal`, `--update` は同時に指定できないことを示す。
- `( A | B )` : A または B を必ず指定。
    - `[--chmod=(+|-)x]` : `--chmod` オプションを使うときは `+x` または `-x` で指定する。
- `<A>` : 変数。リビジョン番号やブランチ名、ファイルパスなどが入る。
    - `<pathspec>` : `file1` とか `dir1/*` とか `dir1/**/*.ext` とか。
- `A...` : Aの繰り返し。
    - `<pathspec>...` : `file1 file2 file3` のようにスペースで区切って指定可能。

### 参考 : git用語集

`pathspec` や `ref`, `commit` などのgitの概念を示す用語がSYNOPSISにところどころ出てきますが、これらの単語に関しても実はヘルプページがあります。

```
$ git help gitglossary
```

気になる人は頑張って読んでみましょう。[オンラインで読めるページ](https://git-scm.com/docs/gitglossary)もあります。
KeystoneJSのJSON APIを試してみた

# はじめに

Node.js製のCMSであるKeystoneJSではレスポンスをhtmlではなくjsonで返すAPIもほぼ準備されている（実際に使うには多少コード修正が必要）のですが、公式ドキュメントでの記載がなく、gistの内容も若干古いようなので、現時点で最新のバージョンで試して、注意点などを残しておきます。

# [Gist](https://gist.github.com/JedWatson/9741171)

元になるのはコミッターのJedWatson氏の記事です

先に差分となる部分を書いておくとルーティングで
`app.get('/api/post/list', keystone.initAPI, routes.api.posts.list);`
でなく
`app.get('/api/post/list', keystone.middleware.api, routes.api.posts.list);`
のように第二引数が`keystone.initAPI`から`keystone.middleware.api`に変わります。

他はGist通りで動作します。

# 環境

Mac
Node.js v7.0.0
npm 3.10.8
generator-keystone@0.4.2
mongod --version 3.0.6 #brewでinstall

# generatorでinstall

[Readmeの通り](https://github.com/keystonejs/generator-keystone)

`npm install -g yoeman  
$ npm install -g generator-keystone
$ mkdir myproject
$ cd myproject
$ yo keystone
$ cd my-site # my-siteという名前で新規ディレクトリを作成してinstallした場合
$ npm install --save keystone@next
`
なおまだベータの4.0を選んだのはこの記事の賞味期限を延ばすため、できるだけ最新にしておこうといった程度の理由です。

`$ npm start` で起動します。
※なお、npm startでMongoDBはローカル環境で起動済みである必要があります
ブラウザから `localhost:3000`でアクセスできます。

# ブログ一覧をAPI取得できるようにする例

## API作成

`mkdir routes/api`
で新規にフォルダを作成し

routes/views/blog.js
を上記フォルダにコピーします。

次に
routes/index.jsを以下のように修正します

```javascript:routes/index.js

//略

// Import Route Controllers
var routes = {
	views: importRoutes('./views'),
	//追加[1]ここから
	api: importRoutes('./api')
	//追加[1]ここまで
};

// Setup Route Bindings
exports = module.exports = function (app) {
	// Views
	app.get('/', routes.views.index);
	app.get('/blog/:category?', routes.views.blog);
	app.get('/blog/post/:post', routes.views.post);
	app.get('/gallery', routes.views.gallery);
	app.all('/contact', routes.views.contact);

	//追加[2]ここから
	app.get('/api/blog/:category?', keystone.middleware.api, routes.api.blog);
	//追加[2]ここまで

	// NOTE: To protect a route so that only admins can see it, use the requireUser middleware:
	// app.get('/protected', middleware.requireUser, routes.views.protected);

};

//略
```

これでkeystoneを再起動すれば`/api/blog`で`/blog`と同じコンテンツが表示されます。


## htmlからjsonへ

ここで  routes/api/blog.jsを編集し

```
view.render('blog');
```
を
```res.apiResponse(locals)
```
に置き換えれば済みそうですが

```
view.on('init', function (next) {
略
}
```
は 
`view.render('blog');`
の記述がないと動作しない。

実際Gistのサンプルには`view.on`は使われていませんね。

#補足
Gistに対するコメントの中に
res.apiResponse でなく res.send or res.json
でいいんじゃないの？という指摘があり
自分も気になって理由を調べてみたのですが
コードを見る限り jsonとjsonpを自動で切り替えてくれる制御が入っていました。
意味のないwrapperではなさそうです。

# 次の目標
React+SPA化を試してみたいですね
require_relativeをPathnameに追加してみた

特定のディレクトリ配下の`*.rb`を一括で読み込みたい時にこんな感じのコードあるじゃないですか。

```.rb
Dir.glob('foo/*.rb').each{|f| require_relative f }
```

でもこのブロック引数`f`を使いたくないなあ、と思ったので`Pathname#require_relative`を定義してみました。

```.rb
class Pathname
  def require_relative
    Kernel.require_relative(self)
  end
end
```

これを使えばスッキリ書ける。

```.rb
Pathname.glob('foo/*.rb').each(&:require_relative)
```

### 参考
http://stackoverflow.com/questions/735073/best-way-to-require-all-files-from-a-directory-in-ruby
アイコンフォントをCSSで細くする(webkit限定)

CSSのみでアイコンフォントの太さを変えたいけど、`font-weight`が効かないときの対応。
(Chromeで動作確認してます）

### 方法

→ 以下を付与する。

```css
-webkit-text-stroke: 2px white
```

- `2px` … この幅だけ細くなる
- `white` … 背景色に合わせる

----

縁取り用のwebkit-text-strokeが内部に食い込むことを利用して、色を背景と合わせることで、細くなったように見せる。

### サンプル

```html
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  <style type="text/css">
    .material-icons {
      font-size: 5rem;
    }
    .material-icons.slim {
      -webkit-text-stroke: 0.2rem white;
    }
  </style>
</head>
<body>
  <i class="material-icons">language</i>
  <i class="material-icons slim">language</i>
</body>
</html>
```

見え方
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/55375/dfde2a3e-e6ad-726c-6026-2ff6e5f38d4d.png)



参考: https://codepen.io/mackdoyle/pen/yrgEH
jupyter(ipython notebook) + matplotlib + vagrantでグラフ描画

## 環境
- Python 3.5.2
- matplotlib 1.5.3
- ipython 5.1.0
- jupyter 4.2.0
- vagrant
- CentOS7.1

## 関連記事
[python(pyenv)インストールメモ](http://qiita.com/Esfahan/items/0dfe70357549f92b23da)

## Jupyter LabをDockerで環境構築する
- [Jupyter LabをDockerで環境構築する](https://qiita.com/Esfahan/items/a3cb8e91e13b96eacc73)

## Vagrantで環境構築する場合
### install matplotlib

```
$ pip install matplotlib
```

### install jupyter

```
$ pip install jupyter
```

### vagrant sshでポートフォワーディング設定

PCのブラウザから、vagrant上のjupyterにアクセスするためポートフォワーディングさせる。

```
$ vagrant ssh -- -L 8888:localhost:8888
```

それか、Vagrantfileに以下を追記

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  # *snip*
  config.vm.network "forwarded_port", guest: 8888, host: 8888
  # *snip*
end
```

### jupyterを起動
`--ip=0.0.0.0` はlocalhost以外でのアクセスをする場合に必要。


```
$ jupyter notebook --no-browser --ip=0.0.0.0
```

もしくは

```
$ ipython notebook --no-browser --ip=0.0.0.0
```

## ブラウザからjupyter-notebookへアクセス
http://localhost:8888
もしくはvagrantのIPアドレスでアクセス
http://192.168.33.10:8888

右上のプルダウンメニューを下記のようにたどっていく
New -> Python 3
![581d5c.png](https://qiita-image-store.s3.amazonaws.com/0/105936/fb82ad74-626c-59a7-d9a4-8075dda06fd9.png)
sample codeを実行

```python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
```

![9bd360.png](https://qiita-image-store.s3.amazonaws.com/0/105936/a0635da1-8748-2594-39ae-f505fef2bb88.png)

`No module named _tkinter`とかtkinter関連のエラーが出る場合はこちらを参照
[matplotlib使うなら下記も先にインストール](http://qiita.com/Esfahan/items/0dfe70357549f92b23da#matplotlib%E4%BD%BF%E3%81%86%E3%81%AA%E3%82%89%E4%B8%8B%E8%A8%98%E3%82%82%E5%85%88%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

以上

[参考]
[vagrant で ipython notebook 環境を構築した話](http://kamatari.github.io/2015/06/01/install-ipython-notebook-to-vagrant/)
[vagrantで作ったVMでipython notebookを立ち上げてローカルからアクセスする](http://qiita.com/wwacky/items/133e81bd5cd558b27b7b)
[jupyter (ipython) notebook でグラフが出ない時の対応方法](http://qiita.com/polikeiji/items/c6a11c16a0587705c887)
【Swift】Alamofireのエラーが実行したら解消された話(SwiftyJSONも同様)

SwiftでAlamofireを使ってみようとしたらエラーが出たのですが，タイトル通り実行したらエラーが解消されました．
同じようなエラーが出ている方は一度試してみてください．
**SwiftyJSONも同様にエラーが解消されました**

# 環境
Xcode 7.3.1
Swift 2.2
**Alamofire 3.2.x**
**SwiftyJSON 2.4.x**

# エラーメッセージ
僕の場合は，こういうエラーが出てました．
<img width="725" alt="スクリーンショット 2016-11-01 11.06.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/139470/8ce344ff-cff4-e04d-709c-f808b73993c4.png">
他にも，下記のサイトでは，
「No such module 'Alamofire'」というエラーもこの方法で解消できたようです．

参考サイト： [[Swift]No such module Alamofireというエラーが消えない](https://teratail.com/questions/30441)
[Java][Spring Boot] 自動デプロイする - NetBeansで始めるSpring Boot (4)

NetBeansで始めるSpring Bootと題して、記事を３つ書きました。

1. [NetBeansで始めるSpring Boot](http://qiita.com/sengoku/items/735cb9639fd8e0686081)
1. [Spring BootでJAX-RSを使う](http://qiita.com/sengoku/items/891eb6ae0bdb5be1dfa5)
1. [ログイン画面を作る](http://qiita.com/sengoku/items/67552813f521b52bff11)

「NetBeansで〜」と題しながら、自動デプロイが動かず不便でした。

アプリケーションサーバとしてTomcatを動かし、自動デプロイさせるようにします。


# アプリケーションクラスを変更

アプリケーションクラスを`SpringBootServletInitializer`から継承させるようにします。

```java:src/main/java/com/example/DemoApplication.java
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

`main`メソッドは不要な気もするのですが、ないとビルド通らないです。


# pom.xmlを変更

## packagingを`war`へ

`packaging`を`jar`から`war`へ変更します。

```xml:pom.xml
    <packaging>jar</packaging>
```

↓

```xml:pom.xml
    <packaging>war</packaging>
```

## 組み込みTomcatを依存性から外す

`scope`を`provided`にします。

```xml:pom.xml
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
```

# プロジェクトのプロパティを変更

プロジェクトを右クリック > [Properties]メニュー > [Run]ツリーとすすみ、ServerとしてTomcatを選択します。

![Screenshot from 2016-11-01 09-24-22.png](https://qiita-image-store.s3.amazonaws.com/0/59475/0df4ba38-198d-70ed-30b0-8ffd2c92e8c1.png)

[Actions]ツリーへすすみ、ActionsとしてRun project、Debug project、Profile projectをそれぞれ選択し、[Remove/Reset]ボタンをクリックします。

![Screenshot from 2016-11-01 09-28-01.png](https://qiita-image-store.s3.amazonaws.com/0/59475/e8a8b9cc-335a-0bf1-f0b1-2830e0ec4d42.png)


# ビルドして実行……その前に

Tomcat 8.5以降を使用する場合は、NetBeans 8.2以降じゃないと、起動/停止に失敗します。

# ビルドして実行

ちゃんとブラウザが起動します。

テンプレートを変更して保存すると、自動デプロイされて反映されます。
Salesforce サイトゲストユーザログ [winter17]

winter17からSalesforceでサイトゲストユーザのDebug logsを設定するだけでは、ログを出してくれなくて、クライアント側のcookieも設定する必要があるようです。><

ChromeのCookie設定
・Site URLへ移動し、開発ツールのConsoleタブに以下のJSを実行する

```js
document.cookie ="debug_logs=debug_logs;domain=.force.com";
```

参考:[Setting Debug logs for Site Guest User (Winter 17)](https://help.salesforce.com/apex/HTViewSolution?id=000247187&language=en_US)