OmniAICreator/Qiita-1.07M huggingface dataset:
TTrackBarで動作の軽そうな動画シークバー的な何かを作ってみる

#概要
そんな感じで。
プレイヤーとか描画周りは基本的にDirectShow依存なので、Windows向け。
目的は、動画の再生時間とって、それに合わせてTTrackBarをシークバーっぽく。
やることはTTrackBarのOnChange()イベントを切ってしまおうということになります。

# 事前に
事前準備として、TTrackBarが置いてあるということ
動画の現在位置が分かっている必要があります。
TTrackBar->Position を制御するのはTimer()です。

# OnChange()
OnChange()はTTrackBar->Positionを動かすと自動で呼ばれるイベントです。


# もしこれをやらないと
Timer()のIntervalごとに呼ばれるので一気に動作が重くなります。
具体的には動画がカクつき、同時にBGMもカクついてとぎれとぎれになります。

#ソースコード
```cpp:file01.cpp
	// 再生時であれば、シークバーと動画の進捗を対応させる
	if (SeekBar->Position < movie_length_) {

		/* << Notifyは切っておく >>
		 * Notifyはポジションが変わると常に呼び出されるイベント
		 * Notifyを許すと、毎回呼びだされて動画がガタつきます
		 */
		TNotifyEvent tmp = SeekBar->OnChange;
		SeekBar->OnChange = NULL;
		SeekBar->Position = media_player_->get_current_position(); // 動画の現在再生時間を取得します
        SeekBar->OnChange = tmp;
	}
```

# コレの問題点
　Position変更時のイベントを切っているので、例えばシークバーを動かして、動画の前の方に移動とかが当然効かなくなります。

# そこで
　別にOnChangeを使わなくても、もっと軽い感じで実装すればいいじゃんとなります。以下のコード。

#ソースコード2
```cpp:file02.cpp
    // シークバーの位置に動画を同期させる
    if (SeekBar->Position != now_position_) {
      // 動画の時間をセットする処理(SeekBar->Position);
    }
    
    // 再生時であれば、シークバーと動画の進捗を対応させる
    if (SeekBar->Position < movie_length_) {
      /* << Notifyは切っておく >>
       * Notifyはポジションが変わると常に呼び出されるイベント
       * Notifyを許すと、毎回呼びだされて動画がガタつきます
       */
       TNotifyEvent tmp = SeekBar->OnChange;
       SeekBar->OnChange = NULL;
       SeekBar->Position = media_player_->get_current_position(); // 動画の現在再生時間を取得します
       SeekBar->OnChange = tmp;
    }
    // TimerでIntervalごとに現在の位置をメンバか何かに得ておく
    now_position_ = SeekBar->Position;

```
AtomをMarkdownエディタとして使うためのプラグインや設定など

AtomをWindowsとMacで動くそこそこ快適なMarkdownエディタとして使う場合に入れておくべきプラグインや設定をまとめてみました。

## language-markdown

標準よりも良い感じの文法の適用とリスト等の入力補助。標準の文法バグもこれで解消されてたりする。

## markclip

画像をコピーして貼り付ける際に自動でbase64形式にしてくれたり、フォルダに保存した上でmarkdownコードを貼り付けてくれたりできるようになる。
おすすめは file in folder でmarkdownファイル名のフォルダに自動で画像を保存してくれる設定。
 
## markdown-folder

**Atom Ver1.9.0以上ではこのパッケージは正常に動作しなくなっています。このパッケージをどうしても使用したい場合、2016/08/23現在では1.8.0を使用するしかないです（推奨しているわけではありません）**

**2016/10/12 githubのリポジトリでは修正されていますが、まだatom.ioには反映されていないらしく、Atom側から追加したものは非対応版になってしまいます。なので1.9以上で使用する場合は手動でインストールする必要があります。**

### 手動インストール

（アンインストールしてから）

```bash
cd .atom/packages
git clone https://github.com/tshort/markdown-folder.git
```

参考：http://qiita.com/RyoKOYAMA/items/8618945acef1241e2e04

アウトラインで折りたたみ。
キーバインドは自動では設定されないので、keymap.csonに手動で追加する。
折りたたみ状態を保存できないのがちょっと不便。

ReadMeの書き方ではキー設定がうまくいかなかったので設定例を載せておきます。

```text:keymap.cson
'atom-text-editor:not([mini])':
  'tab':        'markdown-folder:dwim-toggle'
  'alt-c':      'markdown-folder:cycle'
  'ctrl-alt-c': 'markdown-folder:cycleall'
  'alt-x':      'markdown-folder:togglefenced'
  'ctrl-alt-x': 'markdown-folder:toggleallfenced'
  'alt-t':      'markdown-folder:toggle'
  'ctrl-alt-1': 'markdown-folder:foldall-h1'
  'f2': 'markdown-folder:foldall-h2'
  'f3': 'markdown-folder:unfoldall'
  'ctrl-alt-3': 'markdown-folder:foldall-h3'
  'ctrl-alt-4': 'markdown-folder:foldall-h4'
  'ctrl-alt-5': 'markdown-folder:foldall-h5'
```


## markdown-preview-opener

**2017/2/14現在の最新バージョンでは同時にプレビューを閉じる機能が機能しなくなっています。1.12.0では正常に動作しました。**

markdownファイルを開くと同時にプレビューも開くようになる。
設定の Close Preview When Closing Editor にチェックを入れるとmarkdownを閉じた時にプレビューも閉じるようになる。逆にプレビューを閉じたときにエディタを閉じてくれたりはしない。

## markdown-scroll-sync

プレビューの同時スクロール。
ただしエディタ→プレビューの同期のみでプレビューをスクロールしてもエディタ側は反応しない。

## project-manager

プロジェクトの状態を保存・復元。
Windowsでは不要だけどMacではプロジェクトフォルダを登録しても保存できないことが多いので必須。
Command + Control + P でプロジェクトを復元。

## その他 本体設定等

プレビュー用のペインはキープしたいので Remove Empty Panes（空になったペインを自動的に閉じる） のチェックは外す。

markdown-preview の設定でOpen Preview In Split Pane にチェック。
これでプレピューを開く時にエディタとは別のペインで開いてくれる。


## 終わりに

とりあえずこの設定である程度は快適に使えるようになると思います。
私はAtomは完全にmarkdown用にしているので他の用途での使用感は分かりませんが。

ただ致命的な問題があってプレビューのSave As HTMLを使ってHTML出力するとせっかくmarkdownでは画像を相対パスで書いているのにもれなく絶対パスに変換してくれちゃいます。HTML出力は私の場合、配布目的で使うのでこれは痛すぎです。まぁ画像のフォルダは基本的に1つにまとめてるので変換後に一括置換でいけるっちゃいけるんですがね。

**追記**

markdown用に快適に使い続けるには本体のバージョンは更新せずに固定で使い続けたほうがよさそうです。本体バージョンアップでの仕様の変更にプラグイン側は対応せずに機能しなくなることが非常に多いので。そろそろVS codeに乗り換えるべきか検討中です。
[MySQL] mysqldumpコマンドのデータベース指定に関する調査

#### 調査の発端
とある検証のため、運用サーバーのMySQL（データベース名：mysqldb）から出力したダンプファイルを、以下のコマンドで検証サーバーのMySQLにインポートを実施しました。

```
mysql -u hogehoge -p mysqldb_test < mysqldump_yyyymmdd.sql
```

比較検証用に新規に作成したデータベース（mysqldb_test）にインポートしたかったのですが、結果として、常に同じデータベース(mysqldb)にインポートされてしまう、という不思議な現象が発生したため、調査した内容と対処方法について記述します。
もし、私と同じ現象が出てしまった方に一助となれば幸いです。


#### 調査内容
mysqldumpコマンドでデータベースを指定する場合、databaseオプション（--database）で指定する方法と指定しない方法で違いがあるか調査しました。
（今回のケースでは、データベースの指定は１つのみとします）

```
-- (1)データベースオプション指定あり
mysqldump -u hogehoge -p --database mysqldb > mysqldump_yyyymmdd_01_dboption.sql

-- (2)データベースオプション指定なし
mysqldump -u hogehoge -p mysqldb > mysqldump_yyyymmdd_02_nonoption.sql
```


#### 調査結果
(1)と(2)のmysqldumpコマンドで出力されるdumpファイルの違いは、CREATE DATABASEが出力されるかどうかの違いだけでした。

(1)のdatabaseオプションを明記した場合は、以下の通り、CREATE DATABASEとUSE文が追加されます。

```　:出力例
--
-- Current Database: `mysqldb`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldb` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `mysqldb`;

```


#### 対処方法
現象の起きたダンプファイルの内容を確認してみると、案の定、上記CREATE DATABASEとUSE文が出力されていたため、viコマンドでダンプファイルを開き、CREATE DATABASEとUSE文を削除し保存しました。
保存したダンプファイルをインポートすることで、期待通り別名のデータベースにインポートすることができました。


#### 参考サイト
http://ips.nekotype.com/415/
脆弱性検知ツールVulsで前日分との差分だけレポートする

# はじめに

脆弱性検知ツールVulsを使うとシステムに内在する脆弱性を一発で俯瞰することができ、非常に便利です。

ただ実際には、運用的にステージング環境で検証を行ったあとサービスのメンテナンス時間にアップデート作業を行うため、直ぐに最新版を適用することが難しかったり、脆弱性の深刻度・攻撃元区分(ローカルかリモートか）によっては適用しないといった判断をすることもあるかと思います。

そういった場合、Vulsで毎日自動スキャンしたあと見つかった脆弱性全部をレポートするのではなく、**前日との差分だけ**通知してくれたほうが運用的に管理しやすい場合もあります。

導入については各所に纏まった手順があるため、今回はスキャン後の差分レポートの作成についてのみ記載したいと思います。

# スキャン後にレポートの差分だけメールする
当初、スキャンが終了したホストの順でレポート結果が出力されていたためタイミングによって順番が入れ替わる場合があり困っていましたが、issues#77、#78で text形式で**ホスト別**にレポート出力が出来るように対応していただきました。感謝！感謝！ ♪(o￣∇￣)/

[#77 Add JSONWriter, Fix CVE sort order of report](https://github.com/future-architect/vuls/pull/77)
[#78 Add -report-text option, Fix small bug of report in japanese](https://github.com/future-architect/vuls/pull/78)

また、--cve-dictionary-dbpath オプションが使えるようになり、go-cve-dictionaryを常駐させる必要がなくなりました。
[#84 #85 Fix README, change -cvedbpath to -cve-dictionary-dbpath](https://github.com/future-architect/vuls/pull/85)

これらのオプションを使って、以下のフローをスクリプト化しました。

> 脆弱性情報の更新
> 　　　↓
> スキャン実行 ※text形式でレポートを出力
> 　　　↓
> text形式のレポートの差分をホスト毎にチェック　⇒　前日分と差分がなければ終了
> 　　　↓
> 差分だけをメールで送信



```bash
$ cat /opt/vuls/vuls_scan.sh

#!/bin/bash
VULS_HOME="/opt/vuls"
VULS_LOG="${VULS_HOME}/results"

MAIL_FROM="hoge1@hogehoge.jp"
MAIL_TO="hoge2@hoge.co.jp"
SMTP_SERVER=smtp://192.168.0.1:25

########################
my_logger() {
    local priority="user.info"
    logger -i -p $priority -t `basename $0` "$1"
}

update() {
  local target=$1
  local option=$2
  local period=$3

  for i in `seq 1 3`
  do
    go-cve-dictionary ${option} -${period}
    if [ $? -eq 0 ];then
      my_logger "[INFO] Update success. [${target}]"
      break
    else
      my_logger "[ERROR] Update fail. [${target}] (count=$i)"
    fi
  done
}


#======
cd ${VULS_HOME} 
  if [ $? -ne 0 ];then
    my_logger "[ERROR] path not found [${VULS_HOME}]"
    exit 1
  fi

update NVD fetchnvd last2y  
update JVN fetchjvn last2y

vuls scan -lang=ja -report-text -cve-dictionary-dbpath=${VULS_HOME}/cve.sqlite3
  if [ $? -eq 0 ];then
    my_logger "[INFO] Scan success."
  else
    my_logger "[ERROR] Scan fail."
    exit 1
  fi

diff -r -N -P \
     --exclude="all.txt" \
     -y --suppress-common-lines -W 170 \
     `ls -rtd ${VULS_LOG}/* | grep -v current | tail -2` > _tmp_diff.log

  if [ $? -eq 0 ];then
    my_logger "[INFO] No difference in the scan results."
    exit 0
  fi

export LC_CTYPE=ja_JP.utf8
cat _tmp_diff.log | \
  /bin/mail -s "Vuls Scan Report" -S "smtp=${SMTP_SERVER}" -r "${MAIL_FROM}" "${MAIL_TO}"

  if [ $? -eq 0 ];then
    my_logger "[INFO] Success to send mail."
  else
    my_logger "[ERROR] Failure to send mail."
    exit 1
  fi

exit 0  
```

mailコマンドが入っていない場合は、インストールしておきます。
```
$ sudo yum install mailx
```

上記のスクリプトをcronに登録します。(rootユーザの環境変数を読み込むためbash -lを付けてます)

```bash
$ cat /etc/cron.d/vuls_cron 
05 13 * * * root bash -l /opt/vuls/vuls_scan.sh > /dev/null 2>&1
```

# さいごに

前日分との差分だけ通知することで、自サーバに関連する**新着**の脆弱情報にいち早く気づくことが出来るようになりました。
SVG 線、円、四角形 で超かんたんな顔

![スクリーンショット 2016-06-03 17.17.38.png](https://qiita-image-store.s3.amazonaws.com/0/76843/205b9894-9c08-c0b4-f7c1-11417b9278fe.png)

svg入門で超簡単な顔

rect
circle
line
の使い方の備忘録


```html:hoge.html
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>svg</title>
</head>
<body>
	<svg width="500" height="500">

		<!-- 目 -->
		<circle cx="200" cy="100" r="20" fill="black"/>
		<circle cx="100" cy="100" r="20" fill="black"/>

		<!-- 鼻？ -->
		<line x1="150" y1="130" x2="150" y2="180" stroke-width="5" stroke="black"/>

		<!-- 口 -->
		<rect x="50" y="200" width="200" height="20" fill="red"/>

 	</svg>
	
</body>
</html>
```
Mac (ローカル)とLinux (リモート)とtmuxでクリップボードを共有

# xselを準備する

* [リモートのtmuxのコピーモードとクリップボードを共有する](https://gist.github.com/pn11/c973af16d91f92f9874f)
    * リモート: `yum install xsel` で `xsel` を入れる
* [LinuxからMacへX11 Forwarding - 日々の報告書](http://d.hatena.ne.jp/stakizawa/20080818/t1)
    * リモート: `X11Forwarding` を `yes` に変更して `sshd` を再起動
    * ローカル: `xhost + ###.###.###.###` を実行 (###.###.###.### はリモートのIPアドレス)
* [MacでLinuxへssh -Xする](http://qiita.com/iruseira/items/7b94730e479e1008e9b6)
    * ローカルMac: [XQuatz](https://www.xquartz.org/)を入れた後、Macを再起動

# xselの動作確認を行う

* リモートで環境変数 `DISPLAY` が空でない事を確認
* ローカルでなんかをコピーし、リモートで `xsel` を実行
* リモートで `echo $HOME | xsel -bi` を実行、ローカルでペーストを実行

既に `tmux` を起動済の場合 `DISPLAY` が空の事があるので、その時は手動で設定。

```
export DISPLAY=localhost:##.#
```

# tmuxを設定する

* [リモートのtmuxのコピーモードとクリップボードを共有する](https://gist.github.com/pn11/c973af16d91f92f9874f)
    * `X` でクリップボードを扱うコマンドは `xsel`
    * Mac でクリップボードを扱うコマンドは `pbcopy` と `pbpate`

以下の設定を `$HOME/.tmux.conf` に追加。

```
# `tmux` のコピペとクリップボードの連携
# Linux with xsel
if "which xsel" "bind-key -t vi-copy y     copy-pipe 'xsel -bi'"
if "which xsel" "bind-key -t vi-copy Enter copy-pipe 'xsel -bi'"
if "which xsel" "bind-key ] run 'tmux set-buffer -- \"$(xsel -bo)\"; tmux paste-buffer'"
# Mac
if "which pbcopy"  "bind-key -t vi-copy y     copy-pipe 'pbcopy'"
if "which pbcopy"  "bind-key -t vi-copy Enter copy-pipe 'pbcopy'"
if "which pbpaste" "bind-key ] run 'tmux set-buffer -- \"$(pbpaste)\"; tmux paste-buffer'"
```

最後に `source-file $HOME/.tmux.conf` で設定ファイルを再読込。

# リモートの Neovim でも共有する

[この記事](http://chakku.hatenablog.com/entry/2015/12/03/004348)を読んで設定ファイルに以下を追加した。

```
set clipboard+=unnamedplus
```
逆引き flow samples

http://flowtype.org/

flow を触ってみて初見殺しだと思ったので特にハマりそうなところをまとめてみた。

https://github.com/januswel/flow-sample

関数引数の数を厳密にチェックしたい
----------------------------------

基本的に公式でも説明されている下限チェックと上限チェックの両方を同時に使う。

- http://flowtype.org/docs/functions.html#too-few-arguments
- http://flowtype.org/docs/functions.html#too-many-arguments

これで引数の数が固定の場合はチェック可能になる。 1 つしか取らないことを明示したい場合は次のようになる。

```js:one-argument.js
function minus (n: number, ...rest:Array<void>): number {
    return -n
}

// these will raise errors
minus()
minus(1, 4)
```

数は変動するんだけどチェックはしたい、という場合は `?` を使う定義を併用する。

http://flowtype.org/docs/builtins.html#null-and-void

例として、 1 個でも 2 個でもいいけど 0 個や 3 個以上は怒ってほしい場合は次のように書く。もちろん flow は型チェックしかしてくれないので、引数の数による分岐は実際の関数定義内に書くことになる。

```js:one-or-two-argument.js
function minus (a: number, b?: number, ...rest:Array<void>): number {
    if (arguments.length === 1) {
        return -a
    }
    return a - b
}

// these will raise errors
minus()
minus(1, 4, 0)
```


destructuring を使った関数引数の型チェックをしたい
--------------------------------------------------

object の型指定を使う。 destructuring で検索してもそのものずばりの例は出てこないので注意。

http://flowtype.org/docs/objects.html#object-types

例。

```js:destructuring.js
function foo ({a, b}: {a: number, b: string}): string {
    return a.toString() + b
}

// these will raise errors
foo({
    a: 'life',
    b: 42,
})
foo(42, 'life')
```


generics を使って型の定義をいちいち書かなくて済むようにしたい
-------------------------------------------------------------

関数の引数の型と返り値の型があっているかどうかをチェックしたい場合などは any ではまかなえない。が、各型についていちいち定義していくとキリがないし、ライブラリーの場合利用者が定義したクラスが使えないなどの弊害がある。

こういう場合は generics を使う。

http://flowtype.org/docs/quick-reference.html#generics

generics function は次のように。この場合どういう使い方をしてもエラーは飛ばない。はず。

```js:generics-function.js
function echo<T> (a: T): T {
    return a
}
```

generics class は次のように書ける。

```js:generics-class.js
class List<T> {
    items: Array<T>;

    constructor (x: Array<T>) {
        this.items = x.slice()
    }

    map<DstType>(f: (x: T) => DstType): List<DstType> {
        return new List(this.items.map(f))
    }
}

// these are ok
let numbers: List<number> = new List([1, 2, 3])
let strings: List<string> = numbers.map((x: number) => {
    return x.toString()
})

// these will raise error
numbers.map((x: string) => {
    return parseInt(x, 10)
})
```

generics とはいうものの特殊化をしたいときは実関数の中で場合分けするしかない。


関数の overload を許可したい
----------------------------

例によって flow は型チェックしか提供しないのでその他言語でいうところの overload とは厳密には違う。関数の実引数に異なる複数の型の値がきてもエラーにしない、というだけ。

http://flowtype.org/docs/functions.html#overloading

やはり次のように関数の定義をするところで実引数の型を見て処理を切り分けないといけない。

```js:overload.js
declare function add (a: number, b: number): number
declare function add (a: string, b: string): string
declare function add (a: Date, b: number): Date

function add (a, b) {
    if (a instanceof Date) {
        return new Date(a.getTime() + b)
    }
    return a + b
}

// these will raise errors
add('life', 42)
let a:string = add(1,3)
let a: Date = add(60 * 60 * 1000, new Date())
add(new Date(), 'foo')
```
Rails に静的ファイルの配信をお願いする

# 概要

`config/environments/production.rb` : L25 のコメント内容をよく見て、Apache やNginx 配下で動かしましょうね、という話し

# 前提状況

* アプリケーション テンプレート機能を利用したRails の初期化ができる
* [gouf/dotfiles/.rails_application_template.rb - GitHub](https://github.com/gouf/dotfiles/blob/53c168895a99d109bcb738e4813b23848ee30d11/.rails_application_template.rb) (アプリケーション テンプレート)を利用してアプリケーションを初期化( `rails new $PROJECT_DIR`)
* テンプレートはbootstrap 適用済みの状態でプロジェクトを作成してくれる
* Apache やNginx は登場しない
* サンプル アプリケーションとして動作させるためにコマンドいろいろ叩く

```shell
rails g scaffold user name:string
rake db:migrate
rake assets:precompile
```

# 問題

`rails s` して開発環境としてサーバを起動させると、bootstrap が適用された状態で起動する

しかし、`rails s -e production` で、プロダクション環境としてサーバを起動させると、bootstrap が適用されない

# 原因

* `log/production.log` を観察してみると、静的ファイルに対して、No Route Match エラーが発生していた

```log:log/production.log
F, [2016-06-02T07:06:44.055266 #8812] FATAL -- : $                                                  
   7 ActionController::RoutingError (No route matches [GET] "/javascripts/application.js")
```

* そもそもとして、Apache やNginx 配下でproduction 環境を動作させていない
* `config/environments/production.rb` の設定

```ruby
Rails.application.configure do
  # ...

  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

  #...
end
```

「Rails のやることじゃないよ」って書いてあった...
# 解決

`rails -e production` にシェル変数を加えて起動してあげる

```
rails -e production RAILS_SERVE_STATIC_FILES=true
```

(`ENV[...]` 部分を削除して直接`true` に書き換えると、環境変数による制御が、外部からの制御がむつかしくなるので、それはよくない)

# まとめ・注意点

ログ見るのだいじ

開発環境で直接Apache or Nginx を動かすようにするか、docker-compose を利用して同様に、`config.serve_static_files` が`false` でも動くように環境を整備したい
vagrantでCaboCha

# 環境
Windows8.1
vagrant 1.8.1
ubuntu/trusty64

# CaboChaのインストール
`./configure` はうまくいったあとの`make`でこんなエラーが…

```
% make
make  all-recursive
make[1]: ディレクトリ `/home/vagrant/cabocha-0.69' に入ります
Making all in src
make[2]: ディレクトリ `/home/vagrant/cabocha-0.69/src' に入ります
make[2]: `all' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/vagrant/cabocha-0.69/src' から出ます
Making all in model
make[2]: ディレクトリ `/home/vagrant/cabocha-0.69/model' に入ります
../src/cabocha-model-index -f UTF8 -t UTF8 dep.ipa.txt dep.ipa.model
emitting dic    : 100% |###########################################|
make[2]: *** [dep.ipa.model] 強制終了
make[2]: ディレクトリ `/home/vagrant/cabocha-0.69/model' から出ます
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/home/vagrant/cabocha-0.69' から出ます
make: *** [all] エラー 2
```

# 解決方法
vagrantのメモリの割当を512MBから1024MBに変更する。

# 最後に
下記のリンクとほぼ同じ内容ですが、エラーが違ったので上げときました。
http://qiita.com/ariarijp/items/d3c329eedabdc327df83

この方のおかげで問題に気づけた！！ほんとうに助かりました。
JavaでHTMLメール送信


```java
package hello.javax.mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class HelloSendHtmlMail {

	public static void main(String[] args) {
		try {
			Properties props = System.getProperties();
			props.put("mail.smtp.host", "localhost");
			props.put("mail.smtp.auth","true");
			Session session = Session.getDefaultInstance(props, null);
			MimeMessage mimeMessage = new MimeMessage(session);
			// x-windows-iso2022jp
			mimeMessage.setFrom(new InternetAddress("aaa@xxx.com", "Taro Yamada", "iso-2022-jp"));
			mimeMessage.setRecipients(Message.RecipientType.TO, "bbb@xxx.com");
			// x-windows-iso2022jp
			mimeMessage.setSubject("MAIL TITLE", "iso-2022-jp");
			// x-windows-iso2022jp
			mimeMessage.setHeader("Content-Type", "text/html; charset=iso-2022-jp");
			mimeMessage.setContent("<html><body><a href=\"http://www.ibm.com/\">ibm.com</a></body></html>", "text/html; charset=iso-2022-jp");
			mimeMessage.setSentDate(new Date());
			Transport tp = session.getTransport("smtp");
			tp.connect(null, "user", "user");
			tp.sendMessage(mimeMessage, mimeMessage.getFrom());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
```
rake db:seedでActiveRecord::RecordInvalid: Validation failedって怒られたとき

railsでgitを使用し共同開発している場合、よくリモートリポジトリの履歴を取得するために

```
$ git pull <repository> <refspec>
```

をしますね。そんなときに*pull*したのに自分だけ画像が違う！！
ってことになったので...とりあえず...

```
$ rake db:seed
```

してみたら

```
rake aborted!
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
```

uniquenessのvalidateをかけたときのデフォルトエラーメッセージが

```
has already been taken
```

になるらしい....なので...

datebase.ymlの設定に従って、データベースを削除してみた

```
$ rake db:drop
$ rake db:create
$ rake db:schema:load
$ rake db:seed
```

そしてデータベースを作製し、
スキーマファイルでデータベースを作成、
最後にシードファイルを使ってデータベースに初期データを挿入して上手くいきました
Rubyのextendとincludeの理解


Object#extend is simply a shortcut that includes a module in the receiver’s singleton class.
You can always do that yourself, if you so choose

extendはレシーバーの特異クラスの中にincludeをすることと同じ意味

define module

```ruby
module MyModule
  def my_method
    'my_method'
  end
end
```

We include module inside singleton class

```ruby
class MyClass
  class << self
    include MyModule

    def test
      my_method
    end
  end
end
```

```ruby
MyClass.test
```
=> "my_method"

above case is same with this.

```ruby
class MyClass
  extend MyModule

  class << self
    def test
      my_method
    end
  end
end
```

```ruby
MyClass.test
```
=> "my_method"

This is bad example


```ruby
module MyModule
  def my_method
    'my_method'
  end
end
```

```ruby
class MyClass
  include MyModule

  class << self
    def test
      my_method
    end
  end
end
```

```ruby
MyClass.test
```

NameError: undefined local variable or method `my_method' for MyClass:Class
Javaで添付ファイル送信


```java
package hello.javax.mail;

import java.io.File;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class HelloSendFile {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Properties props = System.getProperties();
			props.put("mail.smtp.host", "localhost");
			props.put("mail.smtp.auth","true");
			Session session = Session.getDefaultInstance(props, null);
			MimeMessage mimeMessage = new MimeMessage(session);
			mimeMessage.setFrom(new InternetAddress("aaa@bbb.com", "Taro Yamada", "iso-2022-jp"));
			mimeMessage.setRecipients(Message.RecipientType.TO, "xxx@yyy.com");
			mimeMessage.setSubject("File Attachment", "iso-2022-jp");
			
			MimeBodyPart mbp1 = new MimeBodyPart();
			mbp1.setText("MimeBodyPart 1", "iso-2022-jp");
			
			MimeBodyPart mbp2 = new MimeBodyPart();
			File attachmentFile = new File("report.csv");
			FileDataSource fds = new FileDataSource(attachmentFile);
			mbp2.setDataHandler(new DataHandler(fds));
			mbp2.setFileName(MimeUtility.encodeWord(fds.getName()));

			Multipart mp = new MimeMultipart();
			mp.addBodyPart(mbp1);
			mp.addBodyPart(mbp2);

			mimeMessage.setContent(mp);

			mimeMessage.setSentDate(new Date());

			Transport tp = session.getTransport("smtp");
			tp.connect(null, "user", "user");

			tp.sendMessage(mimeMessage, mimeMessage.getFrom());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

```
Javaでテキストメール送信



```java
package hello.javax.mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class HelloSendTextMail {

	public static void main(String[] args) {
		try {
			Properties props = System.getProperties();
			props.put("mail.smtp.host", "localhost");
			props.put("mail.smtp.auth","true");
			Session session = Session.getDefaultInstance(props, null);
			MimeMessage mimeMessage = new MimeMessage(session);
			mimeMessage.setFrom(new InternetAddress("test@xxx.com", "Taro Yamada", "iso-2022-jp"));
			mimeMessage.setRecipients(Message.RecipientType.TO, "testfrom@xxx.com");
			mimeMessage.setSubject("MAIL TITLE", "iso-2022-jp");
			mimeMessage.setHeader("Content-Type", "text/plain; charset=iso-2022-jp");
			mimeMessage.setText("this is test", "iso-2022-jp");
			mimeMessage.setSentDate(new Date());
			Transport tp = session.getTransport("smtp");
			tp.connect(null, "user", "user");
			tp.sendMessage(mimeMessage, mimeMessage.getFrom());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
```
CentOS 6.7にアップデートしたらgrepの動きが壊れた

RHEL 6.7／CentOS 6.7で `grep` のバージョンが 2010年4月の `2.6.3` から 2014年6月の `2.20` まで一気に上がってしまった影響で、`grep` の一部のオプションの動作が変更されております。

秘伝のタレ的な `.bashrc` もしくは `.bash_profile` などで、以下のような `alias` を仕込んでいたとします。

```sh:.bashrc
alias grep='grep -nr -E --color=auto'
```

そうすると、例えば

```
cat anaconda-ks.cfg | grep logvol
```

とかすると、 `alias` の `-r` オプションのせいで、**カレントディレクトリ以下のディレクトリやファイルに対し再帰的に `grep` が実行され**作業者は死ぬ。

## 回避方法1

```sh:
cat anaconda-ks.cfg | \grep logvol
```

`grep` に設定された `alias` を無視するバックスラッシュをつける書き方。素の `grep` をお楽しみいただけます。

## 回避方法2

`alias` をやめて、環境変数 `GREP_OPTIONS` に設定を移設する。

```sh:bash_profile
export GREP_OPTIONS="-nr -E --color=auto"
```

```sh:
cat anaconda-ks.cfg | grep logvol
```

この場合は、バックスラッシュをつけても環境変数のオプションを使うので注意。

環境変数 `GREP_OPTIONS` を一時的に空にして素の `grep` を実行したい場合は、こう書く。

```sh:
# export GREP_OPTIONS="-nr -E --color=auto" の実行後のシェルだとして
GREP_OPTIONS= grep part Maildir/
```

実行結果（ `-r` オプションが効かないので、エラーが出る）

```
grep: Maildir/: ディレクトリです
```

### 参考URL

- [文字列検索コマンド「grep 2.17」リリース | OSDN Magazine](https://osdn.jp/magazine/14/02/19/153000)
- [高速化したGNU grepをインストールする - Qiita](http://qiita.com/quattro_4/items/e75f2b4156ef45fb6640)
- [いまさらgrepが10倍高速化したのはなぜか | はむかず！](http://hamukazu.com/2014/02/24/why-grep-can-be-accelerated/)
- [GNU grep 2.18リリース: 10倍速くなったと思ったら今度は200倍遅くなっていた | はむかず！](http://hamukazu.com/2014/02/26/gnu-grep-1-28-fixed-performance-regression/)
- [GNU grep 2.20 リリース - 気ままなブログ](http://d.hatena.ne.jp/entree/20140604/1401843149)
JenkinsでUser interaction is not allowed.と言われて失敗してしまう

# Jenkins環境
* Jenkins v1.656
* Mac OSX 10.11

# Jobのコンソールログ

```
/usr/bin/codesign --force --sign 99999999999999999999999 --entitlements /Users/niko/jenkins/home/jobs/Sample/workspace/build/Sample.build/Sample.app.xcent --timestamp=none /Users/niko/Library/Developer/Xcode/DerivedData/Sample-aaaaaaaaaaaaaaaaaaaaa/Build/Intermediates/ArchiveIntermediates/Sample/InstallationBuildProductsLocation/Applications/Sample.app
/Users/niko/Library/Developer/Xcode/DerivedData/Sample-aaaaaaaaaaaaaaaaaaaaa/Build/Intermediates/ArchiveIntermediates/Sample/InstallationBuildProductsLocation/Applications/Sample.app: User interaction is not allowed.
Command /usr/bin/codesign failed with exit code 1

** ARCHIVE FAILED **
```
※パスやプロジェクト名はダミーです

# 原因
* ProvisioningProfile更新後に起きた
* codesignを許可するためのGUIがでないので認証ができないため

# 対策
## 1. KeychainをUNLOCKする
* 参考： http://qiita.com/ginrou@github/items/6b81f7a48d47872e5a1e
* codesignを実行する前にKeychainをアンロックする

```
security -v unlock-keychain -p ${KEYCHAIN_PASSWORD}
```

## 2. codesign をターミナルで実行
* 1はすでにやっていたが、ダメだった
* もっとほかにいい方法がありそう
* コンソールログにあるcodesignの実行コードをJenkinsマシン上でターミナルから実行する

```
$ /usr/bin/codesign --force --sign 99999999999999999999999 --entitlements /Users/niko/jenkins/home/jobs/Sample/workspace/build/Sample.build/Sample.app.xcent --timestamp=none /Users/niko/Library/Developer/Xcode/DerivedData/Sample-aaaaaaaaaaaaaaaaaaaaa/Build/Intermediates/ArchiveIntermediates/Sample/InstallationBuildProductsLocation/Applications/Sample.app
```

* 上記を実行するとJenkinsマシン上にGUIで認証許可のダイアログがでるので、「**常に許可**」にする
* ジョブをビルドして確認する
CareKitをシンプルに動作させてみるサンプル

# CareKit とは？
[Introducing CareKit 日本語訳](URL "http://qiita.com/ktanaka117/items/fb3dac89f35422943e97")
[GitHub](URL "https://github.com/carekit-apple/CareKit/")
[CareKit Framework Programming Guide](URL "http://carekit.org/docs/docs/Overview/Overview.html")

# CareKit を取得する
```shell-session
git clone --recurse-submodules https://github.com/carekit-apple/carekit.git
```

# 開発環境の準備をする

1. Xcode -> File -> New -> Project -> Single View Application で新しいプロジェクト(名前はCareKitSampleとしておく)を作成する
1. 余計なものを削除する
    1. ViewController.swift を削除する
    2. Main.storyboard を削除する
    3. Info.plist -> Main storyboard file base name をエントリーごと削除する
1. File -> Add Files to "CareKitSample" -> clone した CareKit.xcodeproj を追加する
1. CareKitSampleのProjectを選択 -> TARGETS -> CareKitSample -> General -> Embedded Binaries の + ボタンから CareKit.framework を追加する

# 実装する

1. AppDelegate.swift を下記のように書き換える

```swift:AppDelegate.swift
import UIKit
import CareKit

extension OCKCareCardViewController {
    class func create() -> OCKCareCardViewController? {
        let fileManager = NSFileManager.defaultManager()
        guard let documentDirectory = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last else { return nil }
        let storeURL = documentDirectory.URLByAppendingPathComponent("MyCareKitStore")
        guard let storePath = storeURL.path else { return nil }
        if !fileManager.fileExistsAtPath(storePath) {
            do { try fileManager.createDirectoryAtURL(storeURL, withIntermediateDirectories: true, attributes: nil) }
            catch { return nil }
        }
        let carePlanStore = OCKCarePlanStore(persistenceDirectoryURL: storeURL)
        return OCKCareCardViewController(carePlanStore: carePlanStore)
    }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    lazy var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds)
    lazy var careCardViewController: OCKCareCardViewController? = OCKCareCardViewController.create()
    lazy var navigationController: UINavigationController? = self.careCardViewController.map(UINavigationController.init)

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        window?.rootViewController = navigationController
        window?.makeKeyAndVisible()
        
        return true
    }
}
```

今回はCareCardだけを動かしてみました。他のモジュールはドキュメントに書いてある・・・かと
APIエコノミーに関する記事

ここにきて「APIエコノミー」が騒がれる理由。

従来からテクノロジーとしてAPIの世界では、ソフトウェアが別のソフトウェアと連携するために、APIは機能連携のためのインターフェースを定義する事。そのインターフェース（＝API）を使ってソフトウェアは値を呼び出し、自身のアプリケーションに機能を戻り値としてインプットする事を実現していた。

今、APIエコノミーと言われるのはこの世界観が発展的に拡張されている。ソフトウェア自身がクラウド化され、サービス化された。サービスとしてのソフトウェア（SaaS）がマーケットに浸透したからと言う事が出き、サービスとサービスがAPIを介して連携する事が可能となる。つまりビジネスとビジネスがAPIを使って連携する。こうなると、テクノロジーだけの範疇ではなく、企業の業務連携のAPI連携、クラウドサービスを利用する企業が用途に応じて複数のサービスを利用する場合の機能同士のマッシュアップも可能に。

今更API連携？という話ではなく、APIエコノミーの世界ではビジネスとテクノロジーの融合すら可能にする。私が以前から興味深いと感じているのは、そんな理由からです。

The Rise of APIs
（原文）http://techcrunch.com/2016/05/21/the-rise-of-apis/
（和訳）http://jp.techcrunch.com/2016/05/31/20160521the-rise-of-apis/

63 Insanely Useful APIs Across 12 Segments to Supercharge Your Product
https://letstalkpayments.com/63-insanely-useful-apis-across-12-segments-to-supercharge-your-product/

The API Management Solutions Market Will Quadruple By 2020 As Business Goes Digital
http://blogs.forrester.com/michael_yamnitsky/15-06-07-the_api_management_solutions_market_will_quadruple_by_2020_as_business_goes_digital

APIは単なる技術仕様ではなく、企業のビジネス資産
http://itpro.nikkeibp.co.jp/atcl/interview/14/262522/020900228/

繋ぐことで生まれる｢APIエコノミー｣の衝撃
http://toyokeizai.net/articles/-/107473

260兆円市場が静かに広がりをみせる「APIエコノミー」
http://news.mynavi.jp/articles/2016/01/12/bizapieconomy/
他ドメインで認証するProxyを使ってNexusを構築する場合の設定

**2016/6/7 追記** ： Maven Centralだけではなく、ヘルスチェック用にSonatypeの証明書も追加する必要があるので、追加した。

Nexus 2.xでのお話。3.xになっても同じかは試していない。

Proxyによって、信頼するSSL証明書が書き換えられる？らしく、Maven Centralからデータが取れなくなる。
WindowsにNexusが入っていて、他のドメインで認証するProxyを使っている場合しか起きないレアケース。

以下、こんな状況だと仮定する。

* ドメイン : HOGE-DOMAIN
* ユーザ : hoge-user
* パスワード : hogehoge
* Proxyホスト : 192.168.99.99
* Proxyポート : 8080

## Maven Centralの証明書を登録
### 証明書を取得する
JRE付属のkeytoolを使って証明書を取得する

```
> keytool -J-Dhttps.proxyHost=192.168.99.99 -J-Dhttps.proxyPort=8080 -J-Dhttps.proxyUser=HOGE-DOMAIN/hoge-user -J-Dhttps.proxyPassword=hogehoge -printcert -rfc -sslserver repo1.maven.org:443
```

を発行すると、

```
-----BEGIN CERTIFICATE-----
略
-----END CERTIFICATE-----
```

が取得できるので、これをcentral.pemのような名前で保存する。

### 信頼する証明書として追加する
同じく、keytoolを使って、始めから入っている証明書リスト？に追加する。

```
> keytool -importcert -keystore %JAVA_HOME%\lib\security\cacerts -file central.pem -new repo1.maven.org
```

パスワードの入力を求められるので、 **changeit** を入力し、信頼するか？の質問に **はい** と答える。

## Sonatypeのヘルスチェック用の証明書を登録
### 証明書を取得する
```
> keytool -J-Dhttps.proxyHost=192.168.99.99 -J-Dhttps.proxyPort=8080 -J-Dhttps.proxyUser=HOGE-DOMAIN/hoge-user -J-Dhttps.proxyPassword=hogehoge -printcert -rfc -sslserver rhc.sonatype.com:443
```

を発行すると、

```
-----BEGIN CERTIFICATE-----
略
-----END CERTIFICATE-----
```

が取得できるので、これをsonatype.pemのような名前で保存する。

### 信頼する証明書として追加する
同じく、keytoolを使って、始めから入っている証明書リスト？に追加する。

```
> keytool -importcert -keystore %JAVA_HOME%\lib\security\cacerts -file sonatype.pem -alias rhc.sonatype.com
```

パスワードの入力を求められるので、 **changeit** を入力し、信頼するか？の質問に **はい** と答える。

## NexusにProxy設定
* 証明書が追加できたら、Nexusを起動する
* 管理者でログイン
* 左メニューの Administration -> Serverを選択
* Default HTTP Proxy Settingsをチェックして、以下のように入力

    * Proxy Host : 192.168.99.99
    * Proxy Port : 8080
    * Authentication : チェック
    * Username : hoge-user
    * Password : hogehoge
    * NT LAN Manager Domain : HOGE-DOMAIN

## 参考
* [Fix https repository blocking by PKIX path building failed - Sonatype Support](https://support.sonatype.com/hc/en-us/articles/213465038-Fix-https-repository-blocking-by-PKIX-path-building-failed)
* [How to trust the SSL certificate issued by the HTTP proxy server in Nexus - Sonatype Support](https://support.sonatype.com/hc/en-us/articles/213464948-How-to-trust-the-SSL-certificate-issued-by-the-HTTP-proxy-server-in-Nexus)
* [Nexus Repository Remote Health Check Analysis fails with SSL errors - Sonatype Support](https://support.sonatype.com/hc/en-us/articles/213464898-Nexus-Repository-Remote-Health-Check-Analysis-fails-with-SSL-errors)
* [SSL Certificate Guide - Sonatype Support](https://support.sonatype.com/hc/en-us/articles/213465768-SSL-Certificate-Guide#common-keytool-commands)
* [24.1. Managing Outbound SSL Certificates
](https://books.sonatype.com/nexus-book/reference/ssl-sect-client-cert.html)
ProcessingでSphereやBoxのPShapeを取得

ProcessingでもCinderのgeom::Sphere()や，
oFのofSpherePrimitiveのgetMesh()的なのができた．
これでプリミティブのPShapeを生成できるみたい．

参考URL
https://processing.org/tutorials/pshape/
http://processing.github.io/processing-javadocs/core/processing/core/PShape.html


```java:PShapeSample.pde
PImage img;
PShape sphere;
PShape box;
  
void setup() {
  size(600, 600, P3D);
  img = loadImage("world32k.jpg");
  sphere = createShape(SPHERE, 100);
  sphere.setTexture(img);
  sphere.setStrokeWeight(0);
  
  box = createShape(BOX, 100);
  box.setTexture(img);
  box.setStrokeWeight(0);
}

void draw(){
  background(0);
  
  pushMatrix();
  translate(width/3, height/2, 100);
  rotateX(map(mouseY, 0, width, -PI, PI));
  rotateY(map(mouseX, 0, width, -PI, PI));
  shape(sphere);
  popMatrix();
  
  pushMatrix();
  translate(width/3 * 2, height/2, 100);
  rotateX(map(mouseY, 0, width, -PI, PI));
  rotateY(map(mouseX, 0, width, -PI, PI));
  shape(box);
  popMatrix();
}
```

![PShapeSample.jpg](https://qiita-image-store.s3.amazonaws.com/0/80816/e3bd0ddd-057a-1152-93d8-3dbf51c5024f.jpeg)
【論文シリーズ】縮小自己符号化器とは

```
※深層学習の調査のなかで、気になった論文を共有していきます。
```
## 原文タイトル
[特徴抽出時の(自己符号化器の)明示的不変性(Contractive Auto-Encoders_Explicit Invariance During Feature Extraction)](http://goo.gl/voFvuQ)
Salah Rifai (2011)

## 1. 要約
* 事前学習として、多くの教師なし学習手法が生み出されている中、著者は新しいタイプの自己符号化器を考案した。
* 名称は、**縮小自己符号化器(CAE)**
* 過学習を防ぐために、重みベクトルの更新に、あるペナルティ項を加える。これ自体は、過去の自己符号化器にも見られた(スパース正則化や重み減衰など)。
* 加える項目に、革新性がある。ヤコビアンをフロベニウス正規化した項を加える。詳細は、2.の理論の項に譲る。



## 2. 骨子の理論
はじめに、加えるべきペナルティ項を記載する；
$$||J_f(x)||^2_F = \sum_{ij}(\frac{\partial h_j(x)}{\partial x_i})^2$$

$J_f$は、入力層と隠れ層の間の変換関数を微分した係数を行列化したもので、いわゆるヤコビアンである。
$J_f$の2乗をペナルティ項に加えると、特徴ベクトル場が、収縮する。これは、特徴量の不変性や頑健性につながる。
(すなわち、事前学習としての自己符号化器の学習機能向上になる。)
これを、誤差関数に加えると、次のような収縮自己符号化器の誤差関数ができあがる；
$$J_{CAE}(\theta) = \sum_{x \in D_n}(L(x,g(f(x))) + \lambda||J_f(x)||^2_F)$$

活性化関数がシグモイドの場合、上記のヤコビアンペナルティは、次のように変形できる；
$$||J_f(x)||^2_F = \sum_{i=1}^{d_h}(h_i(1-h_i))^2\sum_{j=1}^{d_x}W_{ij}^2$$

この式からわかるように、計算コストで言えば、通常の自己符号化器で、元の入力データへの再構築(reconstruction)時に誤差を計算するのと、大きく変わらない。


## 3. モデル適用例
事前学習器としてのCAEの性能を確かめるために、他の事前学習器との比較を行った。
・2項RBM(学習は、Contrastive Divergence)
・Basic AE
・AE + 重み減衰(wd)
・Denoising AE(ガウシアンノイズ)
・Denoising AE(二項マスキングノイズ)
自己符号化器の極値計算は、SGDでおこなった。

試験データは、CIFAR-bwとMNISTの画像分類問題をそれぞれ利用した。
トレーニングサンプル：10000
Validationサンプル：2000
テストサンプル：50000
結果は下表のようになった。これより、①CAEのパフォーマンスのよさ、と②誤差率とヤコビアンペナルティ項との相関性が観測された。

![151124164009_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/9f109a9e-c94c-c79e-1204-0778c1dfd256.jpeg)


積層の学習性能比較も行った。
総合的なパフォーマンスで、2層のCAEは、3層のRBMを上回った。
ワイルドカードSSL証明書がAlphaSSLなら年額$40

naked domainに対応したワイルドカードSSL証明書を買いたかったので、最安のを探したときのメモ。

## 日本語サイト

RapidSSLが2万円
PositiveSSLが11000円
ただし、PositiveSSL及びCOMODO社のSSL証明書はnaked domainに対応していない。

> ![スクリーンショット 2016-06-03 15.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/1676/1ff0e1bf-9064-30d8-44c8-43aca6f14cd7.png)
> https://www.ssl-store.jp/

## 海外サイト

いくつかのサイトでRapidSSLは日本の半値だったが、`.jp`ドメインや所在地が日本の会社にはGeoTrust系列のは海外サイトから買えないとの注意書きがあった。
GeoTrust以外、かつ、COMODO以外で、と探したところ、AlphaSSLに行き着いた。AlphaSSLはGlobalSign系列。 `.jp` ドメインも問題なく利用可能。

なんとお値段、**SSL2BUYで $40.00**

> ![スクリーンショット 2016-06-03 15.36.47.png](https://qiita-image-store.s3.amazonaws.com/0/1676/41c7f7e4-4fe3-784d-59aa-341fc0a69bb6.png)
> https://www.ssl2buy.com/wildcard-ssl-certificate

ちなみに日本のサイトでもAlphaSSLは売ってたけど、結構高かった。。
CentOS 7をVMWare Toolsを導入する

# はじめに
以下の環境が揃ってることを前提とします。

- CentOS 7 最新版
    - GNOMEデスクトップ環境
- VMWare Workstation 12 Player

※yumでパッケージを最新版にして置くことを推奨します。

# VMWare Toolsのインストールメディアを挿入する
ホストウィンドウのPlayerをクリックし、管理、VMWare Toolsをインストールをクリックします。ファイルマネージャにVMware Toolsのディスクデバイスが出るはずです。
"VmwareTools-＊＊.＊.＊-＊＊＊＊＊＊＊.tar.gz"というファイルがあるので、適当な場所にコピーします。(＊にはバージョン、ビルド番号です。)今回はデスクトップにコピーします。

# 展開してインストール
コピーしたファイルを開きます。
vmware-tools-distribを展開したディレクトリなどにコピーします(コピー場所は問いません)。
展開したフォルダを端末で開き、
`./vmware-install.pl`
をスーパーユーザー(SU、root権限)で実行します。sudoコマンドでも可能です。
あとは基本はEnterしていけばインストールできます。
インストール後は再起動してください。
ログイン画面などのグラフィック場面でホストのウィンドウサイズを変更し、それに合わせてゲストの解像度が変わった場合は成功です。
MFC-9420CNをUbuntu 16.04 LTSで使えるようにする方法

Ubuntu 16.04 LTSで、MFC-9420CN(Brother製複合機)をネットワーク経由で使用するための方法についてまとめます(Brother製の他の複合機でも同様の方法でできるのではないかと思われます)。

#注意
* MFC-9420本体を操作することで、IPアドレスの確認が可能ですが、その際に出てきたIPアドレスの各部分において、左側に`0`がある場合には、それを消して考えてください(ex.`123.098.006.543`と表示された場合、`123.98.6.543`と考える)。

#必要ソフトウェア・ドライバのインストール
1. [ソフトウェアダウンロード | MFC-9420CN | 日本 | ブラザー](http://support.brother.co.jp/j/b/downloadlist.aspx?prod=mfc9420cn&c=jp&lang=ja&os=128)にアクセスします。
3. 次のソフトウェアをダウンロードします(ビット数はお手元の環境に合わせて選んでください)。
 * Linux 簡易インストーラー
 * スキャナードライバー (deb package)
 * スキャンキーツール (deb package)
 * スキャナー設定ファイル (deb package)
3. 端末を起動します。
1. `sudo apt install xsane`を実行し、インストールに必要なパッケージをインストールします。

#プリンタの設定
1. Linux 簡易インストーラーを適当なディレクトリに解凍します。
3. 端末を起動します。
4. `cd {解凍先のパス}`でカレントディレクトリを移動します。
6. `chmod +x {Linux 簡易インストーラーのファイル名}`で、実行権限を与えます。
7. `sudo ./{Linux 簡易インストーラーのファイル名} MFC-9420CN`を実行し、案内に従ってインストールを行います。

#スキャナ関連の設定
3. 端末を起動します。
2. `cd {ダウンロード先のディレクトリ}`を実行し、カレントディレクトリを移動します。
2. `sudo apt install ./brscan2-0.2.5-1.{ビット}.deb`を実行し、スキャナードライバーをインストールします。
3. `sudo apt install ./brscan-skey-0.2.4-1.{ビット}.deb`を実行し、スキャンキーツールをインストールします。
4. `sudo apt install ./brother-udev-rule-type1-1.0.0-1.all.deb`を実行し、スキャナー設定ファイルをインストールします。
5. `brsaneconfig2 -a name={プリンタ名(任意)} model=MFC-9420CN ip={IPアドレス}`を実行し、MFC-9420CNを登録します。
6. `brsaneconfig2 -p`を実行し、pingが通っていれば成功です。
2. `sudo nano /lib/udev/rules.d/40-libsane.rules`を実行し、以下のように追記します。

```40-libsane.rulesの追記箇所
# Dell 1600n
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="5250", ENV{libsane_matched}="yes"
# 【以下の内容を追記】
# Brother scanners
ATTRS{idVendor}=="04f9", ENV{libsane_matched}="yes"
```

#スキャナの使用方法
##データを取り込むだけで良い場合
Dashホームで`scan`と検索すると、`シンプルスキャン`と`XSane Image scanning program`が表示されるので、どちらか好きな方を使ってデータを取り込んでください。
##データを取り込んだ後、GIMPで編集する場合
1. GIMPを起動します。
2. [ファイル]ー[画像の生成]ー[Xsame]-[Device dialog...]をクリックします。
3. `XSane Image scanning program`が起動するので、データを取り込みます。
4. 取り込まれたデータがGIMPに反映されます。

#その他
今回ダウンロードしたdebパッケージはリポジトリに登録されているわけではないので、手動でアップデートしなければなりません。

#参考文献
* [【XSane】Ubuntuで複合機Brother MFC-6490CNを使う方法 - HOT CAT QUERY FEVERS](http://がりはり.com/%E3%81%AD%E3%81%93/Ubuntu/%E3%80%90XSane%E3%80%91Ubuntu%E3%81%A7%E8%A4%87%E5%90%88%E6%A9%9FBrother%20MFC-6490CN%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95)
* [【Linux FAQ】.debファイルをダウンロードしたのですが、どうやってインストールすればいいですか？ | Linux Fan](https://linuxfan.info/post-1881)

#関連記事
* [EP-805AをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/67e281d16e36c9ac09d2)
* [MG6230をUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/84269bfeeda538429feb)
* [HL-4570CDWをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/3fdb8343e1a74b3e9f55)
PHPのarray_columnで連想配列でネストされたキーを取得できるのか

配列の特定のキーのものだけを取得する際に、(個人的に)array_columnを使う事が多い。
で、ネストされた連想配列ではどうなるの？って思ったので試してみる。

[array_column](http://php.net/manual/ja/function.array-column.php)

### 実験

公式のサンプルから拝借。

```php:sample
<?php
$records = [
    [
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ],
    [
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ],
    [
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ],
    [
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    ]
];
 
$first_names = array_column($records, 'first_name');
print_r($first_names);
```
これの出力は以下のようになる。

```php:output
Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)
```

ここで、$recordsの配列をちょっと変えてみる。
first_nameとlast_nameをprofileというキーにいれる。

```php:sample2
<?php
$records = [
    [
        'id' => 2135,
        'profile' => [
            'first_name' => 'John',
            'last_name' => 'Doe',
        ]
    ],
    [
        'id' => 3245,
        'profile' => [
           'first_name' => 'Sally',
           'last_name' => 'Smith',
        ]
    ],
    [
        'id' => 5342,
        'profile' => [
           'first_name' => 'Jane',
           'last_name' => 'Jones',
        ]
    ],
    [
        'id' => 5623,
        'profile' => [
           'first_name' => 'Peter',
           'last_name' => 'Doe',
        ]
    ]
];
 
$first_names = array_column($records, 'first_name');
print_r($first_names);
```

結果は・・・

```php:output2
Array
(
)
```

むぅ。。取得出来ませんでした。。。

### おまけ

ちなみに、

```php
$first_names = array_column($records, 'first_name');
```
の部分を

```php
$profiles = array_column($records, 'profile');
$first_names = array_column($profiles, 'first_name');
```

という具合に二回分ければ取得できるのだが、他に良いやり方ないかな。。。


### まとめ
PHPのarray_columnで連想配列でネストされたキーを取得できませんでした。
Cakephp3で Unitテストをするときの RecordNotFoundException例外との付き合い方

#概要
Cakephp3で edit アクションを作るとき、存在しないデータを editしようとすると
RecordNotFoundException 例外が発生します。
例えば、`http://....../controller/edit/99999999` にアクセスすると、Cakeのエラー画面になります。
Unitテストのログも下記のようなものが出てきます。

```
1) App\Test\TestCase\Controller\SomeControllerTest::testEdit
Cake\Datasource\Exception\RecordNotFoundException: Record not found in table "something" in /var/www/app/vendor/cakephp/cakephp/src/Datasource/QueryTrait.php:410
Stack trace:
#0 /var/www/app/vendor/cakephp/cakephp/src/ORM/Table.php(1201): Cake\ORM\Query->firstOrFail()
#1 /var/www/app/src/Controller/SomeController.php(86): Cake\ORM\Table->get(Array, Array)
#2 [internal function]: App\Controller\SomeController->edit('10000')
```


例外を抑制するにはどうしたらよいか、
例外が出る場合のUnitテストはどうするのか
例外でUnitテストが途中で止まるのをなんとかしたい、
ということでまだスッキリ解決していないものの現状を書いてみました。

#問題点
・例外の出方がイマイチ不明で、テストの時の挙動も不明。
例えば、

 - Controllerの中でTry-catch で例外を捕捉できるが

```php:app/src/Controller/SomeController.php
$this->SomeTable->get($id, [
            'contain' => []
        ]);
```

 - Table の中では例外が捕捉できない。

```php:app/src/Model/Table/SomeTable.php
$this->get($id, [
            'contain' => []
        ]);
```
Tableの中で例外が捕捉できないなら、getメソッドを自作すればよいかも、と思ったものの try-catch は`app/vendor/cakephp/cakephp/src/ORM/Table.php` にあるgetの中には存在せず、
`app/vendor/cakephp/cakephp/src/ORM/Behavior/TreeBehavior.php` の中でthrowしていたり、
`app/vendor/cakephp/cakephp/src/Datasource/QueryTrait.php` の中でthrowしていたり、
かなり深い部分を探る必要がありそうです。

つまりTableの中で例外を捕捉せず、コントローラ側で RecordNotFoundException例外などをTry-catchすべきなのでしょう。

#テストでの挙動
##Controller のテスト
アサーションの結果と違う場合には例外が出てテストが途中で終了し、
アサーション通りだとテストが成功するようです。

```php:app/tests/TestCase/Controller/SomeControllerTest.php
// 下記のように書くと例外は確認出来ず
$this->assertResponseError();

// 下記のように書くと例外が発生する。
$this->assertResponseOk();
```

```php:app/tests/TestCase/Controller/SomeControllerTest.php
//この例外が発生しているところで
$this->expectException('Cake\Datasource\Exception\RecordNotFoundException');
$this->assertResponseOk();

// あるいはアノテーションで
/**
* @expectedException \Cake\Datasource\Exception\RecordNotFoundException
*/
public function someEditTest(){
    ..........................
    $this->assertResponseOk();
```

というようにテスト関数の前に書いても例外は発生してテストが中断します。

##Tableのテスト
例外は、`expectException` で宣言しておくとテストが止まらないものの、
例外が発生した箇所より後は何も実行されません。

```php:app/tests/TestCase/Model/Table/SomeTableTest.php
$this->expectException('Cake\Datasource\Exception\RecordNotFoundException');
debug('このデバッグ文は表示されますが');
$this->SomeTables->dosomething($data);
debug('このデバッグ文は表示されません');
//このAssertionも実行されません。
$this->assertFalse($result);
```

#結論
- 例外をTry-catch するなら、Controllerでやると良さそう。
- テストでは、Controllerのテストで例外が出ないようにし、
- Tableのテストでは例外が出ることを確認できる。
PHP拡張、PEAR, PECL

### どっちがどっちってわからなくなので、簡単にメモ

* PECL
    * C言語製
	* Cなので高速
	* PHP言語自体の拡張なのでなんでもできうる
	* インストール大変（権限の問題でできないかも）
	
* PEAR
    * PHP製
	* PHP5なら元々同梱されているからインストール不要
	* PHPなのでサーバに配置するだけなので動く、修正も書き換えだけでいけるから楽
WinInet(MFC)を使ったhttpとhttps(自己証明書)

### http

```cpp:httpでPOST
CInternetSession session;
CHttpConnection *pConn = NULL;
CString strServer, strObj, strHeader;
INTERNET_PORT nPort;
DWORD dwServiceType;
CHttpFile *pFile = NULL;
 
// ShiftJIS -> UTF-8 変換
CString cstrBody = "{}"; // Body部
CString cstrUtf8Body = SjistoUTF8(cstrBody);

// URLを作成
CString cstrUrl = "http://localhost"
// URL情報を解析
::AfxParseURL(cstrUrl, dwServiceType, strServer, strObj, nPort);
// ポート番号を設定
pConn = session.GetHttpConnection(strServer, nPort);
 // ヘッダ部を用意
strHeader.Append(_T("Content-Type: application/json ; charset=\"utf-8\"\n"));
strHeader.AppendFormat(_T("Content-Length: %d\n"), cstrUtf8Body.GetLength());

// 要求
pFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObj);
pFile->SendRequest(strHeader, (LPVOID)((LPCTSTR)cstrUtf8Body), cstrUtf8Body.GetLength());
```

### https

```cpp:httpsでPOST
CInternetSession session;
CHttpConnection *pConn = NULL;
CString strServer, strObj, strHeader;
INTERNET_PORT nPort;
DWORD dwServiceType;
CHttpFile *pFile = NULL;
 
// ShiftJIS -> UTF-8 変換
CString cstrBody = "{}"; // Body部
CString cstrUtf8Body = SjistoUTF8(cstrBody);

// URLを作成
CString cstrUrl = "https://localhost"
// URL情報を解析
::AfxParseURL(cstrUrl, dwServiceType, strServer, strObj, nPort);
// ポート番号を設定
pConn = session.GetHttpConnection(strServer, INTERNET_FLAG_SECURE, nPort, NULL, NULL);
 // ヘッダ部を用意
strHeader.Append(_T("Content-Type: application/json ; charset=\"utf-8\"\n"));
strHeader.AppendFormat(_T("Content-Length: %d\n"), cstrUtf8Body.GetLength());

// 要求
DWORD httpsFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID; 
pFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObj, NULL, 1, NULL, _T("HTTP/1.1"), httpsFlags);

// 自己証明書の許可
DWORD dwSecFlags;
pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwSecFlags);
dwSecFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwSecFlags);

pFile->SendRequest(strHeader, (LPVOID)((LPCTSTR)cstrUtf8Body), cstrUtf8Body.GetLength());
```

ポイントというか違いは `getHttpConnection()`と、`OpenRequest()` で適切なフラグを渡してあげることです。

自己証明書を利用する場合には、`INTERNET_FLAG_IGNORE_CERT_CN_INVALID`と`INTERNET_FLAG_IGNORE_CERT_DATE_INVALID`を追加します。
あとは、`QueryOption`でSECURITY_FLAGを設定してあげればOKでした。

ちなみに僕はC++全然わかりません。

## 参考
[WinInet APIの利用(その3) HTTPS](http://www.independence-sys.com/weblog/item/22)
[WinInet (MFC) の SSL通信 で 開発中に自己署名証明書(オレオレ証明書)を利用する場合のコード](https://techwing.wordpress.com/2010/01/24/wininet-mfc-%E3%81%AE-ssl%E9%80%9A%E4%BF%A1-%E3%81%A7-%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%AB%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B/)
LinuxでC++からdmesg(/dev/kmsg)の更新監視

[Linuxでpythonからdmesg(/dev/kmsg)の更新監視 - Qiita](http://qiita.com/koara-local/items/768a95326a101da8c097)

上の記事で、pythonで書いたが、C++のほうでも意外と簡単に書けた。

```cpp:
#include <iostream>
#include <string>
#include <fstream>

int main()
{
	std::ifstream ifs("/dev/kmsg");

	ifs.seekg(0, std::ios_base::end);

	std::string str;

	for (;;) {
		std::getline(ifs, str);
		std::cout << str << std::endl;
	}

	return 0;
}
```

pythonではやり方がいまいちわからなかったが、C++ の fstream では
`ifs.seekg(0, std::ios_base::end)` でファイルの末尾まで seek できる。(ブロッキングされない）

実行とその結果は以下のようになる。

```shell-session:実行結果と終了(監視側)
$ g++ tailf_kmsg.cpp
$ ./a.out
12,676,80928667951,+;stop aaa
12,677,80932948508,-;stop bbb
12,678,80938639308,-;stop ccc
```

`/dev/kmsg` にリダイレクトすることで、擬似的にドライバのログの出力を確認している

```shell-session:実行結果と終了(更新側サンプル)
$ sudo sh -c "echo aaa > /dev/kmsg"
$ sudo sh -c "echo bbb > /dev/kmsg"
$ sudo sh -c "echo ccc > /dev/kmsg"
```

# 参考
[ストリームの読み込み位置を自由に変えるには？｜C++ フリーでぷろぐらみんぐ](http://ameblo.jp/nana-2007-july/entry-10104294377.html)
VirtualBox 用 Ubuntu 16.04 LTS "Xenial Xerus" 日本語デスクトップ イメージ

関連ページ
=========

* 前回の記事：[14.04 LTS "Trusty" 版](http://qiita.com/yuki-takei/items/1a5fc4ab66f58e9536f0)

動機
====

Unity 3D supported な xenial64 のデスクトップを
パッと作れたらいいなと思って。

利用手順
=======

```shell:Shell
$ vagrant init yuki-takei/ubuntu-xenial64-ja
```

作成された Vagrantfile の、``config.vm.provider "virtualbox" do |vb|`` の部分を以下のように変更

```Vagrantfile
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--ioapic", "on"]
    vb.customize ["modifyvm", :id, "--vram", "128"]
    vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
  end
```

因みに Vagrant Enterprise のページはこちら。
https://atlas.hashicorp.com/yuki-takei/boxes/ubuntu-xenial64-ja/

備考
====

* [日本語 Remix](https://www.ubuntulinux.jp/japanese) を適用済み