OmniAICreator/Qiita-1.07M huggingface dataset:
自分以外のユーザの操作ログ(script)を取得する

* ubuntuにて確認

## 参考

* [Linux - リモートログインしたユーザの操作ログ（script）を取得する - Qiita](http://qiita.com/hmukai/items/80bde86c5a9e4b3f8b97)

## 仕込み方

```bash:/etc/profile.d/script.sh
#!/bin/sh
logging() {
    LOGFILE=/var/tmp/$(date +"%F_%T")-$USER.script
    # ssh接続した時のみログ記録
    P_PROC=`ps aux | grep $PPID | grep sshd | awk '{ print $11 }'`
    if [ "$P_PROC" = sshd: ]; then
      LOGTIME=$(date "+%T")
      # 端末を閉じるボタン押されると書き込みされないので-f付ける
      script -f -q $LOGFILE
      # このexitがないとログイン成功しない
      exit 0
    fi
}

#------------------------
# 自分以外であることの判定
#------------------------
#if [ $USER != "user1" ];then
if [ ! $UID -eq 1000 -a ! $UID -eq 500 ];then
    logging
fi
```

## ログの閲覧の仕方

* タイミングファイルを生成しておけば再現できるが、そうでなければ
* `more`か`cat`を使って読む。
ESP8266 > SPIFFS > 関数へのリンク > begin() / format() / open() / exists() / openDir() / remove() / rename() / info() / Flash layout

https://github.com/esp8266/Arduino/issues/1126
のコードの中で`SPIFFS.format()`というのを見つけた。

他にもいくつか関数がありそうだ。検索してみた。

https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md

> File system object (SPIFFS)
- begin
- format
- open
- exists
- openDir
- remove
- rename
- info

その他、Flash layoutなども書かれている。
ESP8266 > SPIFFS.open()成功

```txt:動作環境
Arduino IDE 1.6.6
Board Manager URL -  http://arduino.esp8266.com/staging/package_esp8266com_index.json
```

http://qiita.com/exabugs/items/2f67ae363a1387c8967c
を参考にSPIFFSでのファイル書込みをやってみて成功した。

上記リンクのコメント( http://qiita.com/exabugs/items/2f67ae363a1387c8967c )にて2.0.0でされたことを紹介されていたが、その時点でstagingの2.1.0-rc1をインストールしてしまっていた。

以下のコードでうまく動作した。

```
#include "FS.h"

void setup() {
  char *chptr;
  Serial.begin(115200);
  Serial.println();

  bool res = SPIFFS.begin();
  if (!res) {
    Serial.println("SPIFFS.begin fail");
    return;
  }

  // 1. write
  File fd = SPIFFS.open("/tmp2.txt", "w");
  if (!fd) {
    Serial.println("open error");
  }
  fd.println("data in file");    
  fd.close();

  // 2. read
  fd = SPIFFS.open("/tmp2.txt", "r");
  String line = fd.readStringUntil('\n');
  Serial.print("file read:");
  Serial.println(line);
  fd.close();
}

void loop() {
  // put your main code here, to run repeatedly:

}
```

https://github.com/esp8266/Arduino/issues/1126
にemptyファイルで生成時にエラーがでる報告があり、この症状に近い状況(!fエラー)が何回か起こっていたように思うが、何かの拍子でエラーがでなくなった。

fd.close()をしないままfd.open()をしてしまっていたのだろうか。詳細は分からない。
bash: コマンドが確かに存在するのに "-bash: COMMAND: No such file or directory" と言われる

## 起きたこと

非常にハマったのでメモ。

バイナリで渡されたあるコマンドを実行しようとして起きた。

    bash: ./xxx-command: No such file or directory

だけど、そのファイルは確実に存在する。

    $ ls -al xxx-command
    -rwxr-xr-x 1 user user  123456 2016-01-07 15:00 xxx-command*

sudo で実行した場合は、

    sudo: unable to execute ./xxx-command: No such file or directory

と出る。

## 原因

64bit Linux 上で、32bit ELF バイナリを実行しようとしていたのが原因だった。

    $ file ./xxx-command
    ./xxx-command: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped.

## バイナリをそのまま実行できるようにする方法

[Ask Ubuntu](http://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit) にあった方法の

    $ sudo dpkg --add-architecture i386
    $ sudo apt-get update
    $ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

で実行できるようになった。
Atomエディター設定記録

# 「エディターは専用品」とすると賢い
Atomを利用して10ヶ月、「エディターは何を書くか相手によって選ぶべきである」となった。Atomの初期の重たさ、またパッケージの充実具合も問題なくなり、ST3は不要となった。

# Atomに少しづつ設定を足してみる
最軽量エディターとしてVimを。RailsやPHPはJetBrains製品に任せてあるので、Atomに求めているのはフロントエンド + 軽い「書く・見る」であり、デフォルトに近い状態を維持するつもりである。ただ、最近やはりVimモードで利用できるならその方が良いなと考え出している。

# Atomの設定（2016年11月1日更新）
- `Tab Type`を`soft`に
- `Show Invisible`をON
- `Soft Tabs`をON
- `atom-jade`をインストール
- `emmet`をインストール
- `Auto Indent On Paste`をOFF（コピペ時にインデントが暴れる）
- `Remove Empty Pane`をOFF
- `Back Up Before Saving`をON
- `Tablr`をインストール（マルチバイト対応CSVエディター機能の追加） <= NEW

# Atomのショートカット
`cmd+k` + `arrow` > paneの作成（arrowの方向に）
`cmd+k` + `cmd+n,p` > pane間の移動
`alt` + `cmd` + `¥` > サイドバーのtoggleを置換、最近日本語キーボードと相性が悪い。 <= NEW

# Atomのキーバインド
```~/.atom/packages/emmet/keymaps/emmet.cson
重複するEmmetキーバインドをコメントアウト
# 'ctrl-e': 'emmet:expand-abbreviation'
```

## Atomの感想録
- デフォルトで相当優秀
- git連携系（merge, diff, historyとか）はAtomならではの設定ができるかも？
- まだまだ重い => 軽くなった。
- ShiftJISの変換も慣れればなんてことないが、デフォルト文字コードをAutoにはやはりできない。
- Windowsユーザーに薦めるとよろこぶ <= NEW
【Ruby】 gnuplotでアナログ時計を表示する

Rubyからgnuplotを操作してアナログ時計を表示します。実行すると以下のようになります。実用性... そんなものはない（画像略

![gclocl.gif](https://qiita-image-store.s3.amazonaws.com/0/54587/d9469f23-bf25-0ea9-095f-3944fac8edd2.gif)


## ソースコード
gnuplotのバージョンは4.6、Rubyは2.2.0です。

```rb
require 'open3'

Open3.popen3('gnuplot') do |gp_in, gp_out, gp_err|
  gp_in.puts "set size square"
  gp_in.puts "set xrange [-5:5]"
  gp_in.puts "set yrange [-5:5]"
  gp_in.puts "set parametric"
  gp_in.puts "set obj rect behind " <<
    "from screen 0, screen 0 to screen 1, screen 1 " <<
    "fillcolor rgb 'black'"

  Signal.trap(:INT) do
    gp_in.close
    print gp_err.read
    exit 0
  end

  loop do
    plot = "plot "

    # 時計の外周の円
    plot << "4*cos(t), 4*sin(t) notitle lw 2 lc rgb 'red',\\\n"

    # 時計の文字盤
    12.times do |h|
      plot << "'-' notitle with lines lw #{h % 3 == 0 ? 6 : 3} lc rgb 'red',\\\n"
    end

    plot << "'-' notitle with lines lw 1 lc rgb 'yellow',\\\n"  # 秒針
    plot << "'-' notitle with lines lw 4 lc rgb '#ff8c00',\\\n" # 長針
    plot << "'-' notitle with lines lw 8 lc rgb '#ff4500',\\\n" # 短針
    plot.gsub!(/,\\\n\z/, "\n")

    # 時計の文字盤
    12.times do |h|
      if h % 3 == 0
        plot << "#{3.0*Math.cos(Math::PI*(h/6.0))}, #{3.0*Math.sin(Math::PI*(h/6.0))}\n"
      else
        plot << "#{3.4*Math.cos(Math::PI*(h/6.0))}, #{3.4*Math.sin(Math::PI*(h/6.0))}\n"
      end
      plot << "#{3.6*Math.cos(Math::PI*(h/6.0))}, #{3.6*Math.sin(Math::PI*(h/6.0))}\n"
      plot << "e\n"
    end

    # 現在時刻を取得
    h, m, s = Time.now.strftime('%H%M%S').scan(/../).map(&:to_i)
    s = 75 - s
    h = 75 - (h + m / 60.0)
    m = 75 - m

    plot << "0, 0\n" # 秒針
    plot << "#{3.7*Math.cos(Math::PI*(s/30.0))}, #{3.5*Math.sin(Math::PI*(s/30.0))}\ne\n"
    plot << "0, 0\n" # 長針
    plot << "#{3.5*Math.cos(Math::PI*(m/30.0))}, #{3.5*Math.sin(Math::PI*(m/30.0))}\ne\n"
    plot << "0, 0\n" # 短針
    plot << "#{2.2*Math.cos(Math::PI*(h/6.0))}, #{2.2*Math.sin(Math::PI*(h/6.0))}\ne\n"
    gp_in.puts plot
    sleep 0.3
  end

  gp_in.puts "exit"
  gp_in.close
end
```

## 補足

`set obj ...` の部分で画面全体に黒い四角を置き、同じ黒色のx軸やy軸を見えないようにしています。見た目もかっこよくなって一石二鳥。

`set obj ...` を使わない場合は、代わりに

```rb
  gp_in.puts "set border lc rgb 'white'"
```
あるいは

```rb
  gp_in.puts "unset border"
  gp_in.puts "unset xtics"
  gp_in.puts "unset ytics"
```

という行を追加すると、軸が消えて以下のように同じく時計だけ表示されます。ただこのままだとちょっと見づらいので、秒針とかの色を変更する必要がありそうです。

![gclock.png](https://qiita-image-store.s3.amazonaws.com/0/54587/dc9e1173-a793-13d8-fdb1-919735ee0492.png)

## おわりに
gnuplot力が足りないのでRubyと組合せましたが、調べたらgnuplotだけで時計表示している人もいました。（参考ページふたつめのリンク）

参考ページ
[GnuplotをRubyから操作](http://d.hatena.ne.jp/aont/20110726/1311695355)
[現在の日付や時刻を得る gnuplotスクリプト](http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/date.html)
SwiftからJSON APIを叩きたい

NSURLSessionを利用してJSON APIを叩いてみた。ひとまず取得するだけならこんな感じ :house: 



let session = NSURLSession.sharedSession()
let url = NSURL(string: "https://api.github.com/search/repositories?q=example")!
let task = session.dataTaskWithURL(url) { (data, response, error) in
    // 取得したJSONから値を取り出す（SwiftyJSONを利用）
    let json = JSON(data: data!)
    let items = json["items"]
    for (_, item) in items {
        let fullName = item["full_name"]
        let url = item["html_url"]
        let watchers = item["watchers"]
        print("*** name: \(fullName), url: \(url), watchers: \(watchers)")
    }
}
task.resume()
Playground上ではうまく動作確認できなかったので、下記コードを適当なアプリのviewDidLoadへ埋めて動作確認する。
また、生SwiftでJSONをいじるのは茨の道なので、JSONのパースにはSwiftyJSON ( https://github.com/SwiftyJSON/SwiftyJSON ) を利用してる。
MediaWiki APIのlist=recentchanges取り扱いメモ

Wikipediaが大好きなしうへいと申します。
今回はリアルタイムWikipediaスクレイピングには欠かせない、list=recentchangesについて書きます。


#list=recentchangesって？

MediaWiki APIによって提供される、各記事を「最後に編集された時間の降順」で取得したリストです。
（要するに、編集されたばかりの記事が一覧で取得できます。）

MediaWiki APIヘルプ: [list=recentchanges (rc)](https://ja.wikipedia.org/w/api.php?action=help&modules=query%2Brecentchanges)

実際に、XML形式で/通常ページを/100件取得した様子:
[https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&format=xml&rclimit=100&rcnamespace=0](https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&format=xml&rcnamespace=0&rclimit=100)

XML形式で取得した場合は、rcタグ要素とその属性に、編集情報が収められて返されます。

#メモその1 - 記事名titleはrc要素において必須属性ではない
rc[title]には通常、編集された記事名が収められています。
「そもそも記事に対して編集をするのだから、記事名がないはずはない。」
そう思ってコーディングしていると…ぬるぽが発生します。
titleがないrc要素とは、ずばりrc[type=log]の一部です。
[https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&format=xml&rclimit=500&rcnamespace=0&rctype=log](https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&format=xml&rclimit=100&rcnamespace=0&rctype=log)

rctype=logで取得したこのリストには主に、何らかの意図でWikipediaから削除された記事名がリストアップされています。
が、その中にtitleが含まれていない要素があることがわかります。
（このリストは時間とともに変化するので、タイミングによっては表示されないかもしれません）
なぜ記事名がないのかは不明ですが、他の情報が読み取れないので、処理上は単なるノイズでしかありません…。

#メモその2 - rctypeを意識して使い分ける
rctypeオプションには以下が用意されています。

* rctype=edit　編集。
* rctype=new　新規ページ作成。
* rctype=log　削除ログ。その他。
* rctype=external　他言語版Wikipediaの編集に関する情報のようですが、いまいち不明。
* rctype=categorize　絞り込みをかけても一切の要素が引っかからないため、死に要素だと思われます。

デフォルトではrctype=edit|new|logが適用されます。
特にrctype=logの情報を活用していない場合は、オプションからlogを外してしまうのが注意点1の手っ取り早い対策になります。

#メモその3 - rctype=newのold_revidは常に0

list=recentchangesで取得した要素には、記事名の他に、古い版のid（=old_revid）と、新しい版のid(=revid)がデフォルトで併記されています。
これは非常に便利で、このidを使って新しいAPIリクエストを発行することで、版同士を比較することができます。

idを使って単純にパースしたい時は、以下のようになります。
[https://ja.wikipedia.org/w/api.php?action=parse&prop=wikitext|links&oldid=58160382&format=xml](https://ja.wikipedia.org/w/api.php?action=parse&prop=wikitext|links&oldid=58160382&format=xml)

比較専用のaction=compareも用意されています。
比較的最近（ダジャレか！）実装された命令で、今のままだとちょっと扱いづらいです。改良が望まれます。
[https://ja.wikipedia.org/w/api.php?action=compare&fromrev=58082298&torev=58160382&format=xml](https://ja.wikipedia.org/w/api.php?action=compare&fromrev=58082298&torev=58160382&format=xml)

当然ですが、新規ページに関しては古い版というのが存在せず、old_revid=0となり、前述のリクエストURLにこれを渡すと、エラーになってしまいます。
[https://ja.wikipedia.org/w/api.php?action=parse&prop=wikitext|links&oldid=0&format=xml](https://ja.wikipedia.org/w/api.php?action=parse&prop=wikitext|links&oldid=0&format=xml)

revidを使って版を比較するコードを書く時は、この点を意識して書くか、もうrctype=editしか検索しないとか、そういう対応が必要になります。

#おまけ - rc要素を重複なく処理するには

APIを利用する際、基本的には、ある間隔でlist=recentchangesにリクエストを投げることになるのですが、それだけだと処理済みの要素とそうでない要素が混在してしまいます。
これを回避する方法は大きく二つあります。

1. rccontinueパラメータを使って、必ず前回の最後から続きを行う
2. rc要素に振られているrcidを使う

1は、例外処理に強い人におすすめの方法です。
（「必ず」の部分が曲者。自分はちょっとつらいです。
2は、そのままidをマッピングするなどして重複を排除する方法ですが、
たとえばRxJavaにおけるObservableとしてrc要素を流して、distinct((rc)->rc.get("rcid"))
のようにして重複を排除するやり方もあります。
メモリの消費量さえ気にしなければこういった方法が手っ取り早いと思います。
qrintf on OSX/Clang

Trusterdを(Xcode環境の)OSXで試してみようと思い、qrintfが推奨されていたので指定したらconfigureとリンクで失敗するようだった。
以下の場合だけqrintfを通すことでエラーを回避してみた。

* conftestを含まないとき(configure対策)
* -cが指定されたとき(=リンクのときにqrintfを通さない)

qrintfをインストールしておき、以下の内容でqrintf-clangを作成する。
※ qrintfはコンパイラの名前を見ているので、(gccではなく)clangを渡す

```bash:/usr/local/bin/qrintf-clang
#!/bin/sh
if [[ "$*" =~ conftest ]]; then
  clang $*
elif [[ " $* " =~ " -c " ]]; then
  qrintf clang $*
else
  clang $*
fi
```

実行権限を付与しておく。

```
$ chmod 755 /usr/local/bin/qrintf-clang
```

Trusterdのビルド設定に追記する。

```ruby:build_config.rb
  if RUBY_PLATFORM =~ /darwin/i
    conf.cc do |cc|
      cc.command = ENV['CC'] || 'qrintf-clang'
    end
  ...
```

ビルドする

```
$ make
```
APIログをlogrotateのみで収集する


Webサーバでapacheなどが出力するAPIログを、定期的に収集する事はよくありますよね。
シェルを用意してcronで回すのも面倒だったので、logrotateのみを使って収集を行ってみました。

### logrotate

logrotateは放っておけば際限なく肥大してしまう各種ログファイルに対して、
世代ローテーションを行いN世代以前の破棄や、転送など、様々な処理が行える。
世代管理やサイズ制限などの機構を自前で持たないプログラムからのログを管理するのに使用する。

## 環境

| OS |
|:-:|
| CentOS release 6.5 (Final) |

## 要件

* 昨日のAPIのログをストレージサーバ（xxx.xxx.xxx.xxx）に転送する
* ログは圧縮する
* ログのローテートは一日ごと
* ログのsuffixに日付を付ける
* 7日以前のログはWEBサーバから削除する（容量対策）

| 対象ログ |
|:--|
| /var/log/httpd/api_access_log |
| /var/log/httpd/api_error_log |

## API用のlogrotate設定ファイルを作成する

| logrotate設定ファイル |
|:-:|
| /etc/logrotate.d/httpd-api |

apacheをインストールすると自動でhttpdの設定ファイルが作成されます。
/etc/logrotate.d/httpd
こちらにも設定が書いてあるので処理が被らないようにしましょう。
apacheのデフォルト設定が不要であればこちらを直接編集しても良いと思います。

```/etc/logrotate.d/httpd-api
/var/log/httpd/api_access_log {
    daily
    rotate 7
    dateext
    create 0644 apache apache
    olddir /var/backup/log/api
    missingok
    sharedscripts
    compress
    lastaction
        /bin/mv /var/backup/log/api/api_access_log-`date '+%Y%m%d'`.gz /var/backup/log/api/api_access_log-`date '+%Y%m%d' -d '1days ago'`.gz
    endscript
}

/var/log/httpd/api_error_log {
    daily
    rotate 7
    dateext
    create 0644 apache apache
    olddir /var/backup/log/api
    missingok
    sharedscripts
    compress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    lastaction
        /bin/mv /var/backup/log/api/api_error_log-`date '+%Y%m%d'`.gz /var/backup/log/api/api_error_log-`date '+%Y%m%d' -d '1days ago'`.gz
        /usr/bin/rsync -az  -e ssh /var/backup/log/api/ user@xxx.xxx.xxx.xxx:/var/backup/log/api/
    endscript
}
```

* 昨日のログをgzip化してolddirに移動
* ログファイル名の日付が今日になっているので昨日に変更
* olddirをrsyncでストレージサーバに転送
* access_logとerror_logのolddirは同じなのでrsyncは一回のみ

各パラメータの詳細はこのサイトが参考になります。

ログローテーション(logrotate)を使ってみる ( httpd(apache)の設定例 )
http://server-setting.info/centos/loglotation.html

### エラーチェック

下記コマンドを叩いてエラーが出ない事を確認します。

```
# logrotate -dv /etc/logrotate.d/httpd
```
TerraformでEC2インスタンスにアタッチしたEBSボリュームをuser_dataでフォーマットしてマウントする

TerraformでEC2インスタンスにアタッチしたEBSボリューム(ebs_block_device)。
やっぱりアタッチタイミングでフォーマットしてマウントしておきたいですよね。

そういうときは`user_data`が利用できます。

```
resource "aws_instance" "my-instance" {
  ami = "ami-123456"
  instance_type = "t2.large"
  vpc_security_group_ids = [
    "${aws_security_group.my-sg.id}"
  ]
  subnet_id = "${aws_subnet.my-subnet.id}"
  associate_public_ip_address = false
  root_block_device = {
    volume_type = "gp2"
    volume_size = "20"
  }
  ebs_block_device = {
    device_name = "/dev/sdf"
    volume_type = "gp2"
    volume_size = "100"
  }
  tags {
    Name = "my-instance"
  }
  user_data = "${file("userdata.sh")}"
  key_name = "${aws_key_pair.my-key.key_name}"
}
```

みたいに、`user_data`で`userdata.sh`を参照するような設定をして `/var/www` にマウントするなら、例えば、

```sh
#!/bin/bash
/sbin/mkfs.ext4 /dev/xvdf
/bin/mkdir -p /var/www
/bin/cp /etc/fstab /etc/fstab.orig
echo '/dev/xvdf  /var/www  ext4  defaults,nofail 0 0' >> /etc/fstab
/bin/mount -t ext4 /dev/xvdf /var/www
```

というような`userdata.sh`を設置すればいけます。

`ebs_block_device.device_name` が `/dev/sdf` だから`/dev/xvdf` と決め打ちにしていますが、大丈夫なはずです。
Fallout 4のグラフィックテクノロジー

「The Graphics Technology of Fallout 4」の和訳です。間違っていたらご指摘ください :sweat_smile: 
https://bethesda.net/#en/events/game/the-graphics-technology-of-fallout-4/2015/11/04/45

私たちがゲームをプレイするハードウェアは、エキサイティングな新しいグラフィックスフィーチャーとともに急速なペースで進み続けています。私たちのCreation Engineは、没入できる新しい世界を作成するために、Bethesda Game Studiosでアーティストやデザイナーにその機能を与える新技術を導入するために進化してきました。技術チームはアートチームと連携を深めており、私たちがこのワールドを製作する際に達成したい具体的なアートとパフォーマンスのゴールを元に、共に慎重に個々の機能を選択しました。

![creation.png](https://qiita-image-store.s3.amazonaws.com/0/78487/6b9de6b4-bf39-8cb9-df1f-46d92fd63b34.png)

Skyrimの後に私たちが最初に行ったことはCreation Engineのグラフィックコアに物理ベースディファードレンダラを加えることでした。この新しいレンダラは、私たちはあらゆるシーンにより多くの動的光源を追加し、リアルスティックなマテリアルをサーフェースにペイントすることができます。私たちはワールドの中のオブジェクトとキャラクターが触覚と接地を感じるようにしたいです。そして、その大部分がこれらのマテリアルが異なることを確実にすることです。例えば、金属は木材とは異なる方法で光を反射します。

![Fallout4_graph01web.jpg](https://qiita-image-store.s3.amazonaws.com/0/78487/2bdb003d-0cb9-d568-a106-30942f65ac6c.jpeg)

従来の作品どおり、私たちのワールドは完全な動的な１日の時間と天気を提供します。シーンの至る所に零れるボリュームトリックライト(時々、ゴッドレイとも呼ばれます)を作るために、Morrowind(The Elder Scrolls III)の最先端の水の表現をともに作業していたNVIDIAの友人と一緒に作業をしました。ここで使用される技術はGPU上で実行され、ハードウェアテッセレーションを活用します。美しく動き、照射を受けた荒地の空気に大気の深さを追加しています。その他の全てのフィーチャーも、プラットフォームに関わらず全て作りました。

暴風雨が移動した時、私たちの新しいマテリアルは濡れた地面のサーフェースを得ることができ、新しいクロスシミュレーションでは、クロスや髪、風による植物の揺れを作成します。

![SnapCrab_NoName_2016-1-7_12-48-7_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/78487/9231bb25-8f32-b7f1-96e8-08001ee3dd42.png)

プレイヤーは1日中どの時間でもワールドのどこにでも行くことができるため、私たちは最大限のエモーショナルな衝撃のために風景の鮮やかさと色を高めるための動的なポストエフェクト技術を追加しました。私たちのヴァーチャルカメラも同様に大幅なアップデートをしています。私たちが作成した全ての改善を駄目にするわけではありませんが、技術の詳細を楽しむ方たちのために、Creation Engineの最新版に追加したサンプリングは下記のとおりです。

- タイルベースディファードライティング
- テンポラルアンチエイリアス
- スクリーンスペースリフレクション
- 被写界深度のボケ
- SSAO
- 高さフォグ
- モーションブラー
- Filmicトーンマッピング
- カスタムスキン＆ヘアシェーダ
- ハードウェアテッセレーションを使用した動的な（手足などの）切断
- ボリュームライティング
- 物理ベースシェーディングによるガンマ補正

![Fallout4_graph05web.jpg](https://qiita-image-store.s3.amazonaws.com/0/78487/51a76894-df4e-1eb4-c772-d3c1a5112c5f.jpeg)

もし、あなたが何を意味しているのか分からなくとも心配しないでください。重要なのはこれらの技術がダイナミックで臨場感あふれる体験を作るためにFallout 4のアートとゲームプレイと一緒に提供される方法です - どんなゲームシステムであってでもです。私たちは常にバランスの取れたグラフィックやゲームプレイ、アート、パフォーマンスを取るとても協力的なチームであることを誇りに思っています。私たちは11/10にゲームをプレイする機会がある時に、あなたが賛同してくれるだろうことを願っています。

![Fallout4_graph06web.jpg](https://qiita-image-store.s3.amazonaws.com/0/78487/3ee9eb06-3a4f-385d-26c9-5bd44e166153.jpeg)

![Fallout4_graph07web.jpg](https://qiita-image-store.s3.amazonaws.com/0/78487/5fcbb582-3797-f9d9-b177-48090532b450.jpeg)

![Fallout4_Panorama1web.jpg](https://qiita-image-store.s3.amazonaws.com/0/78487/c7460131-ee52-23ae-4253-00489769b87f.jpeg)
Ruby install by rbenv on Ubuntu15 [memo]

# Ruby install by rbenv on Ubuntu15

## vm-tools install
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install open-vm-tools open-vm-tools-desktop
```

## rbenv install
```
sudo apt-get install git build-essential libssl-dev
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

```
vi ~/.profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```
```
source ~/.profile
```

# Ruby install
```
rbenv install 2.3.0
rbenv rehash
rbenv global 2.3.0
```

# 余談
## VM common directory(VMを使っている場合の共有フォルダの設定)
```
sudo apt-get install build-essential
mkdir /mnt/hgfs/
sudo mount -t vmhgfs .host:/ /mnt/hgfs
```
アクセストークンの更新

この度、rubyでアクセストークンの更新を実現したく質問させていただきました。

ドキュメントでTokenエンドポイントアクセス時にはBasic認証が必要とのことなので「アプリケーション登録時に発行されたアプリケーションIDとシークレットを「:」（コロン）でつなぎ、Base64でエンコードしたものをAuthorizationヘッダーに乗せてアクセスしてください。」ということで以下のコードを書いて実行しました。

■コードサンプル
        uri = URI.parse("https://auth.login.yahoo.co.jp/yconnect/v1/token")
        https = Net::HTTP.new(uri.host, 443)
        https.use_ssl = true
        encode_str = #アプリケーションID + ":" + #シークレットID
        #base64でエンコード
        encode_basic_auth = Base64.encode64(encode_str.dup)
        request = Net::HTTP::Post.new(uri.path)
        request['Authorization'] = encode_basic_auth
        request.add_field('Content-Type', 'application/x-www-form-urlencoded')
        request.set_form_data({"grant_type"=>"refresh_token","refresh_token"=>#リフレッシュトークン})
        res = https.request(request)
        p res.body

上記のサンプルを実行したところレスポンスには
「ページが表示できません」
「障害が発生しているため、しばらくしてから、再度アクセスしてください。」
というメッセージが帰ってきました。

上記のコードが正しくない為に帰ってきたエラーメッセージだと考えています。

初歩的なところでわかってないかもしれません。ご教示いただけると大変助かります。
よろしくお願い致します。
IE11のX-UA-Compatibleの使い方/動作仕様

IE11では、X-UA-Compatibleという制御パラメータを利用し、過去のWebブラウザの機能をエミュレートさせることができるそうです。

動作仕様
- IE=EmulateIE11 : 常にIE11モードとして動作する。 
- IE=EmulateIE10 : 常にIE10モードとして動作する。(※製品不具合)
- IE=EmulateIE9 : DOCTYPE宣言に応じて、IE9モードかQuirksモード(IE5)を選択する。
- IE=EmulateIE8 : DOCTYPE宣言に応じて、IE8モードかQuirksモード(IE5)を選択する。
- IE=EmulateIE7 : DOCTYPE宣言に応じて、IE7モードかQuirksモード(IE5)を選択する。
- IE=11 : 必ずIE11モードを選択する。
- IE=10 : 必ずIE10モードを選択する。
- IE=9 : 必ずIE9モードを選択する。
- IE=8 : 必ずIE8モードを選択する。
- IE=7 : 必ずIE7モードを選択する。
- IE=5 : 必ずIE5モードとして動作する。

やり方
メタタグに追加
`<meta http-equiv="X-UA-Compatible" content="IE=11">`
MySQLのSELECT結果に行番号を振る。

MySQLにはOracleなんかと違ってROW_NUMBER関数がないので、ユーザ変数を使って振ってやる必要がある。
便利なのでメモ。


### 普通にSELECTした結果。
```sql
mysql> SELECT TABLE_NAME FROM information_schema.TABLES LIMIT 10;
+---------------------------------------+
| TABLE_NAME                            |
+---------------------------------------+
| CHARACTER_SETS                        |
| COLLATIONS                            |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS                               |
| COLUMN_PRIVILEGES                     |
| ENGINES                               |
| EVENTS                                |
| FILES                                 |
| GLOBAL_STATUS                         |
| GLOBAL_VARIABLES                      |
+---------------------------------------+
10 rows in set (0.00 sec)

mysql> 
```

### 行番号つけた結果。
```sql
mysql> SET @rownum=0; SELECT @rownum:=@rownum+1 as ROW_NUM, TABLE_NAME FROM information_schema.TABLES LIMIT 10;
Query OK, 0 rows affected (0.00 sec)

+---------+---------------------------------------+
| ROW_NUM | TABLE_NAME                            |
+---------+---------------------------------------+
|       1 | CHARACTER_SETS                        |
|       2 | COLLATIONS                            |
|       3 | COLLATION_CHARACTER_SET_APPLICABILITY |
|       4 | COLUMNS                               |
|       5 | COLUMN_PRIVILEGES                     |
|       6 | ENGINES                               |
|       7 | EVENTS                                |
|       8 | FILES                                 |
|       9 | GLOBAL_STATUS                         |
|      10 | GLOBAL_VARIABLES                      |
+---------+---------------------------------------+
10 rows in set (0.00 sec)

mysql> 
```
keyWindowの一番上にあるViewControllerにpresentViewControllerする

ViewControllerの仕様にあわせてpresentViewController出来そうなViewControllerを探しまくってそこにpresentViewControllerする。
keyWindowのrootViewControllerはpresentされていることもあるしこうしないと常にpresentViewControllerすることができない。

```swift
let rootVC = topViewController(UIApplication.sharedApplication().keyWindow?.rootViewController)
    rootVC?.presentViewController(vc, animated: true, completion: nil)

private func topViewController(rootVC:UIViewController?)->UIViewController?{
    if let vc = rootVC as? UITabBarController{
      return topViewController(vc.selectedViewController)
    }else if let vc = rootVC as? UINavigationController {
      return topViewController(vc.visibleViewController)
    }else if let vc = rootVC?.presentedViewController {
      return topViewController(vc)
    }else {
      return rootVC
    }
  }
```

デバッグ画面出したりするときに使うと便利
digコマンドで名前解決した結果を見やすくする

## 背景
インフラリソースのクラウド化の流れに伴い、この**リソースのIPを確認したい**みたいなことが以前より増えました。ちょっとIP調べたいだけなのに、digするとつらつらといろんなセクションが表示されてパッと見で目が滑ったり、さらっとIPだけコピペするのが**若干面倒**だったりします。

## というわけで
自分がよく使う、digコマンドを使った名前解決結果の表示内容を絞りこむオプションをいくつか紹介します。
ユースケースの80%以上が、**IPだけ手っ取り早く知りたい**って感じなのでその辺にしか触れてません。

## バージョン
digのバージョンになります。以下コマンドはOSX(10.10.5)で試しました。

```console
$ dig -v
DiG 9.8.3-P1
```

# 名前解決した結果を見やすくする

## 普通の問い合わせ
まずは普通の問い合わせ。

QUESTIONとかANSWERとかもろもろセクションが表示されている感じ。これがデフォルトの表示内容ですね。**空行を含めて20行**です。

本記事の主旨とは全く関係ありませんが、以下例ではグローバルサーバーにGoogle Public DNSを指定しています。
社内のネットワークに乗っていると自社管理のDNSサーバーへ先に問い合わせしに行って、パブリックなものと若干乖離があったりなかったりするので、必要に応じて問い合わせ先を指定するようにしています。


```
$ dig @8.8.8.8 www.yahoo.com | cat -n
     1
     2	; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 www.yahoo.com
     3	; (1 server found)
     4	;; global options: +cmd
     5	;; Got answer:
     6	;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45092
     7	;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
     8
     9	;; QUESTION SECTION:
    10	;www.yahoo.com.			IN	A
    11
    12	;; ANSWER SECTION:
    13	www.yahoo.com.		67	IN	CNAME	fd-fp3.wg1.b.yahoo.com.
    14	fd-fp3.wg1.b.yahoo.com.	2	IN	A	116.214.12.74
    15
    16	;; Query time: 16 msec
    17	;; SERVER: 8.8.8.8#53(8.8.8.8)
    18	;; WHEN: Thu Dec 17 12:58:39 2015
    19	;; MSG SIZE  rcvd: 74
    20
```

## 手っ取り早く、IPだけ知りたい場合
一番良く使うパターン。**`+short`オプションを追加することで見た目スッキリ**です。
とりあえずIPだけサクっと欲しいときにおすすめです。

`+shor`でも問い合わせできます。（ `t` しか省略してないけど...）

shortつけただけで、**20行から2行になりました！**
余計な装飾が一切なくていい感じです。

```console
$ dig @8.8.8.8 www.yahoo.com +short | cat -n
     1	fd-fp3.wg1.b.yahoo.com.
     2	116.214.12.74
```

## TTLまで確認したい場合
次に使うパターン。DNSレコードを更新した直後とかによく使うコマンド。

digのオプションを組み合わせて使っています。
`+noall`で表示項目をクリアしてから、Answerセクションだけ取ってくる感じです。
`+an` は `+answer` の省略系。`+ans` でもいけます。

これも**6行なのでだいぶ見た目スッキリ**です。

```console
$ dig @8.8.8.8 www.yahoo.com +noall +an | cat -n
     1
     2	; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 www.yahoo.com +noall +an
     3	; (1 server found)
     4	;; global options: +cmd
     5	www.yahoo.com.		55	IN	CNAME	fd-fp3.wg1.b.yahoo.com.
     6	fd-fp3.wg1.b.yahoo.com.	38	IN	A	116.214.12.74
```

# まとめ

こんな感じで、digコマンドだけでも名前解決した結果からサクッとIPだけ抜いてこれます。
特に、`+short` はコピペしやすさ的にもおすすめです。
2016で遊ぶ - Vim script


[2016で遊ぶ](http://qiita.com/to4iki/items/f6631674dd3678b38d46)をVim scriptでもやってみました。

```vim
echo eval(join(range(1,63),'+'))
echo eval(join(map(range(5,10),'float2nr(pow(2,v:val))'),'+'))
echo eval(join(map(range(3,9),'float2nr(pow(v:val,3))'),'+'))
```
結論: 楽しくない

* [2016で遊ぶ](http://qiita.com/to4iki/items/f6631674dd3678b38d46)
* [2016で遊ぶ - Python](http://qiita.com/Tsutomu-KKE@github/items/697a0f60600320457c31)
LINEグループのログを解析するJavaプログラム作ってみた

#LINEグループのログの解析
1年ほどのログが溜まっていたので解析してみたいと思いLINEグループの会話ログを解析するJavaプログラムを作ってみました．

形態素解析ライブラリーの[kuromoji](http://www.atilika.com/ja/products/kuromoji.html "Kuromoji")を用いていますので，利用する際はkuromojiを[DL](http://www.atilika.com/ja/products/kuromoji.html "DL")してご利用ください．


ソースコードはこちら
https://github.com/keisuke2236/lineAnalyzer

#できること
1. 誰が何回発言したかのカウント
2. 出現した単語のカウント


#使い方
スマートフォンのLINEグループの会話ログを予めメールなどでPCに移動させてテキストファイルとして保存しておいてください．

```java:Main.java
//準備
String filePath = "ファイルパスを書く";
WordCounter count = new WordCounter(filePath);
//取得系
count.getPersonMap();  //HashMap型で人別発話数取得
count.getWordMap();  //HashMap型で出現単語数取得
//表示系
count.wordMapShow();   //出現単語数表示
count.personMapShow();   //人別発話数表示
```

#コンゴの展望
一人一人の感情解析や性格分析をして画像化することでLINEのグループに貼れるようにしたいです．

また，アンドロイドアプリにしたら面白そうだと思いました．
Cocoaの機能を使って正規表現で文字列を置き換えるAppleScriptハンドラ


* `do shell script`を使わないとできなかった正規表現の文字列置き換え
* AppleScript上でCocoaの機能を使えるようになった


```applescript:regexReplace.scpt
use framework "Foundation"

my regexReplace("<p>あいうえお</p>", "<.+?>", "")
--> "あいうえお"

on regexReplace(aText as text, pattern as text, replacement as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	return (regularExpression's stringByReplacingMatchesInString:aText options:0 range:{location:0, |length|:count aText} withTemplate:replacement) as text
end regexReplace
```

## 更新履歴

* 2016-01-07: Cocoaの機能を使って作成
rabbitmqでrabbitmqadminを使えるようにするまで

ちょっと昔のメモですが、投稿。。

## 環境

 - RabbitMQ: 3.5.2
 - CentOs 6.6


## 手順

### 1. pluginをenableにする

root 権限で以下を実行


```shell-session
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
```

### 2. rabbitmq をrestart

```shell-session
service rabbitmq-server restart
```

oh...managementのポート(デフォルトだと15672)が既存のプロセスとかぶってしまった。。。。
→ 設定ファイルを変更


```shell-session
vi /etc/rabbitmq/rabbitmq.config
```

以下のように、managementのポート番号を変更

```
[
  {rabbitmq_management,[{listener, [{port, 12345}]}]}
].
```

もう1回

```shell-session
service rabbitmq-server restart
```

### 3. rabbitmqadminコマンドをmanagementコンソールからダウンロード

```shell-session
curl localhost:12345/cli/rabbitmqadmin > rabbitmqadmin
```

ダウンロードしたファイルに実行権限をつけ。PATHが通っている場所に放り込む。

```shell-session
chmod 755 ./rabbitmqadmin
```

これで、rabbitmqadminが使えるようになりました。
2016で遊ぶ - Python

[2016で遊ぶ](http://qiita.com/to4iki/items/f6631674dd3678b38d46)をPythonでもやってみました。

```py3:python
import numpy as np

sum(range(64))
>>>
2016

sum(2**np.arange(5, 11))
>>>
2016

sum(np.arange(3, 10)**3)
>>>
2016
```
Win32-OpenSSH Note

# Install

see https://github.com/PowerShell/Win32-OpenSSH/wiki/Deploy-Win32-OpenSSH

# What is install-sshlsa.ps1
Copy `ssh-lsa.dll` to system32 folder.
`ssh-lsa.dll` hooked by `Security Accounts Manager` Service.
This dll for key-auth.

So, when uninstall or update this file, you have to rename this file at 1st. And you must reboot to apply new dll.


# Use PowerShell
`> powershell -File -`

# SCP ready?
No, use SFTP
https://github.com/PowerShell/Win32-OpenSSH/wiki/sftp.exe-examples

# autorized_keys?
`//Users/[login-user]/.ssh/authorized_keys`

# setup terminal
iterm2

<img width="520" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/89031/bd362ad5-6c68-5171-b46d-65969e73d40f.png">

<img width="520" alt="Preferences_と_2__imaoka_imaoka1_local__zsh_.png" src="https://qiita-image-store.s3.amazonaws.com/0/89031/b4cd981e-935e-b46e-9e6f-49cfad4d04f9.png">

# new-lines issue
Fixed ? @ ver 4_5_2016 
https://github.com/PowerShell/Win32-OpenSSH/releases/tag/4_5_2016

# WA for backslash '\' issue
It is caused by terminal & keyboard.
Iterm2 setting, `\` => Send-Text `\`

<img width="303" alt="Preferences_と_1__imaoka_imaoka1_local__zsh_.png" src="https://qiita-image-store.s3.amazonaws.com/0/89031/7e2a6c02-8c1b-f9f6-df3d-a5e2971934c3.png">
 
# Security Log

see Event-Viewer Security -> Audit Success (Process Infomation: Process Name: xxxx\sshd.exe)
2016で遊ぶ


<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">&gt; 1.upto(63).inject(&amp;:+)&#10;=&gt; 2016&#10;&#10;&gt; 5.upto(10).map{|n|2**n}.inject(&amp;:+)&#10;=&gt; 2016&#10;&#10;&gt; 3.upto(9).map(&amp;-&gt;n{n**3}).inject(&amp;:+)&#10;=&gt; 2016&#10;&#10;ふむー すげぇな</p>&mdash; すぎゃーん (@sugyan) <a href="https://twitter.com/sugyan/status/684766202149773312">2016, 1月 6</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

のtweetを見て、Swiftでも試してみた。

累乗計算用の演算子を定義。
(負の数を考慮していないなど、簡易版です)

```swift
infix operator ** {
associativity left
}

public func ** (lhs: Int, rhs: Int) -> Int {
    if lhs <= 0 { return 1 }
    return (1..<rhs).reduce(lhs) { (acc, _) -> Int in acc * lhs }
}
```

試す

```swift
// 2016 = 1+2+3+4+...+63
(1...63).reduce(0, combine: +) //=> 2016

// 2016 = 2⁵+2⁶+2⁷+2⁸+2⁹+2¹⁰
(5...10).map({ 2 ** $0 }).reduce(0, combine: +) //=> 2016

// 2016 = 3³+4³+5³+6³+7³+8³+9³
(3...9).map({ $0 ** 3 }).reduce(0, combine: +) //=> 2016
```

2016という数値は面白いですね。
(2016は完全数ではない.. フィボナッチ数ではない.. 素数ではない..)
【Linux】NetworkManagerを知らずに手こずった話


NICの設定ファイル（/etc/sysconfig/network-scripts/ifcfg-eth0）に保存したら即反映されるし、デフォゲ設定をネットワーク全体の設定ファイル(/etc/sysconfig/network)に設定しても反映されないしいったいなんなんだと。


原因はCent6からデフォルトで入っているNetworkManagerというものだった。
※デフォゲ設定できなかったのは、たぶんNICの設定で上書きされたから？

今までのやり方で設定したかったので、デーモンを停止して自動起動もoffにして解決。

```bash:デーモン停止
service NetworkManager stop
```

```bash:自動起動off
chkconfig NetworkManager off
```
How to build cordova's debug-app on multiple PCs

異なるPCでビルドし、アプリを上書きインストールする際に`INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES`となります。
keystoreを共有すればこのエラーを回避できます。

```bash
cp ~/.android/debug.keystore platforms/android/
```

```platforms/android/debug-signing.properties
storeFile=debug.keystore
storePassword=android
keyAlias=androiddebugkey
keyPassword=android
```
CircleCI上でmysql2がエラーを吐く


```
bundle exec rake db:create db:schema:load --trace
rake aborted!
LoadError: /home/ubuntu/xxxxx/vendor/bundle/ruby/2.2.0/gems/mysql2-0.4.1/lib/mysql2/mysql2.so: undefined symbol: __asan_option_detect_stack_use_after_return - /home/ubuntu/xxxxx/vendor/bundle/ruby/2.2.0/gems/mysql2-0.4.1/lib/mysql2/mysql2.so
```

mysql2 0.4.1のバグのようです。
https://github.com/brianmario/mysql2/issues/685

0.4.2にversion upしたら解決しました。
PHPでhello worldをツイートする


# Twitter Appsでアプリケーションを作成します。

[Twitter Apps](https://apps.twitter.com)にアクセスしてTwitterアカウントでログインして必要情報を入力します。

入力情報

* Name アプリケーションの名前
* Description アプリケーションの説明
* Website 設置するサイトのurl
* Callback URL(任意) OAuthで認証成功時にリダイレクトされるURL

APIで使用する情報

* consumerKey
* consumerSecret
* accessToken
* accessTokenSecret

# OAuthライブラリをダウンロードします。

[abraham/twitteroauth · GitHub](https://github.com/abraham/twitteroauth)からソースをダウンロードします。

使用するファイル

* autoload.php
* srcフォルダ内のファイル

# phpファイルを作成します。

```php:index.php(新規作成)
<?php
// display debug info
ini_set('display_errors', true);
error_reporting(E_ALL);

require_once("autoload.php"); 
use Abraham\TwitterOAuth\TwitterOAuth;

// api設定ファイル呼び出し
require_once("apiconfig.php");

$consumerKey = API_KEY;
$consumerSecret = API_SECRET;
$accessToken = ACCESS_TOKEN;
$accessTokenSecret = ACCESS_SECRET;

// 認証コード
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

// ツイート
$result = $connection->post("statuses/update", array("status" => "hello world"));
?>
```

```php:apiconfig.php(新規作成)
<?php
define('API_KEY', 'VVVVVVVVVVVVVVVVVVVV');
define('API_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN','YYYYYYYYYYYYYYYYYYYY');
define('ACCESS_SECRET', 'ZZZZZZZZZZZZZZZZZZZZ');
?>
```

# 配置場所
* apiconfig.php
* autoload.php
* index.php
* src(フォルダ)

# phpを実行します。

```
php index.php
```

# hello worldがツイートされているはずです。

以上
整数配列の連続区間をグループ化するアレをScalaでやってみた

# 先行事例

[整数配列の連続区間をハイフンで連結してグループ化する定番のアレ](http://qiita.com/mpyw/items/0fdffd3c70b3abd802f5)を「Scalaでできないか？」って話題で盛り上がってたので、挑戦してみました。

# たどり着いた答え（数字のみ）
```scala
scala> val sample = Seq(1,2,3,4,5,8,9,10,13,14,20,22)
sample: Seq[Int] = List(1, 2, 3, 4, 5, 8, 9, 10, 13, 14, 20, 22)

scala> sample.foldLeft(Seq((1, 0)))((z, n) => if((z.head._2 + 1) == n) (z.head._1, n) +: z.tail else (n, n) +: z).reverse
res0: Seq[(Int, Int)] = List((1,5), (8,10), (13,14), (20,20), (22,22))
```

# 解説
ぶっちゃけ関数型まだ慣れきってなくてちゃんと正しい処理してるかわからないのだけれども。たぶん、大丈夫。

## ポイント
- [foldLeft](http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#foldLeft)
 - リストを左から右へ畳み込む高階関数
- [+:](http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#_plus_colon)
 - コレクションの先頭に要素を追加する
- [tail](http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#tail)
 - 先頭を除いた残りのコレクションを返す

## 何をしてるか
前提として：与えられる数値のリストはソートされてるものとします。（されてなければソートしてください）

連続する数値をその最小値と最大値で表すタプル `(min, max)` を作って行きます。

まず最初にfoldLeftの初期値として1個目を与えてます。これは本当なら連続を確かめたいListの `(最小値, 最小値-1)` じゃないといけないと思う。いくつの連続ができるかわからないですがとりあえずタプルを含むSeqにしてます。

さて、このタプルのSeqが `z` 、そして一つ目の要素が `n` として与えられるので、先頭に入っているタプルの `max` に1を足してみてnと比較します。もし等しいなら前の数値より一つ大きいということになるので、数値が連続していると判断します。
数値が連続していた場合にはSeqの先頭のタプルを破棄して、代わりに最小値はそのままだが最大値をnに置き換えたタプルを作って、先頭にくっつけます。

もし数値が連続していなかった場合は、既存のタプルはそのままに新しくnからnまでの連続した数値、ということにしてタプルを生成して、同じく先頭にくっつけます。

さて、一つの要素について処理を終えると、そこには例のタプルをいくつか含んだSeqとまだ処理されてない要素が残ります。
このSeqに対してまたmaxと次のnを比較する処理を、要素が空になるまでひたすらに繰り返しています。

最終的に、最大値と最小値を表すタプルをいくつか含んだSeqが完成します。

varとか使いたくなかったので、タプルを作っては捨て、作っては捨て、とカジュアルにぶん投げてるあたりが無理矢理で気に入ってます。

# 最後に
```scala
scala> sample.foldLeft(Seq((1, 0)))((z, n) => if((z.head._2 + 1) == n) (z.head._1, n) +: z.tail else (n, n) +: z).reverse.map(t => if(t._1 != t._2) t._1 + "-" + t._2 else t._1).mkString(",")
res6: String = 1-5,8-10,13-14,20,22
```
VirtualBox5.0.12の罠

# VagrantがSSHを通らない
Vagrantがうまく動作してくれなくて明け暮れてました。ドユコト

## 困ったとこ
Macのターミナルで`$ vagrant up`すると、

```
$ vagrant up
Bringing machine 'wiki.dev' up with 'virtualbox' provider...
==> wiki.dev: Importing base box 'miya0001/vccw'...
==> wiki.dev: Matching MAC address for NAT networking...
==> wiki.dev: Checking if box 'miya0001/vccw' is up to date...
==> wiki.dev: A newer version of the box 'miya0001/vccw' is available! You currently
==> wiki.dev: have version '2.14.0'. The latest is version '2.19.0'. Run
==> wiki.dev: `vagrant box update` to update.
==> wiki.dev: Setting the name of the VM: wiki.dev
==> wiki.dev: Auto-generating node name for Chef...
==> wiki.dev: Clearing any previously set network interfaces...
==> wiki.dev: Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) en1: Thunderbolt 1
3) en2: Thunderbolt 2
4) p2p0
5) awdl0
6) bridge0
==> wiki.dev: When choosing an interface, it is usually the one that is
==> wiki.dev: being used to connect to the internet.
    wiki.dev: Which interface should the network bridge to? 1
==> wiki.dev: Preparing network interfaces based on configuration...
    wiki.dev: Adapter 1: nat
    wiki.dev: Adapter 2: bridged
==> wiki.dev: Forwarding ports...
    wiki.dev: 22 (guest) => 2222 (host) (adapter 1)
==> wiki.dev: Running 'pre-boot' VM customizations...
==> wiki.dev: Booting VM...
==> wiki.dev: Waiting for machine to boot. This may take a few minutes...
    wiki.dev: SSH address: 127.0.0.1:2222
    wiki.dev: SSH username: vagrant
    wiki.dev: SSH auth method: private key
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'paused' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.
```
SSHに接続できないみたいなのですが、今まではtimeoutのエラーが何秒かごとに出ていました。しかし今回は5分ほど経ってからこのエラーメッセージがパッと出てきたのでそもそも何か根本的なところがおかしい。。。
## 解決方法
色々調べまわったところどうやらVirtualBoxのせいらしくて、[こちら](https://www.virtualbox.org/wiki/Download_Old_Builds
)から古いversionのVirtualBoxをインストールし直したところうまくいきました。
自分は怖いので4.3まで落としましたが、5でも大丈夫らしいとのことです。
VirtualBox絶許！！
zabbix_agent staticライブラリ化


ライブラリ静的化させて既存システムに入っているライブラリ郡を更新したく無い場合や、
バイナリをばら撒いて叩くだけで動かしたい場合など。

稼働しているアプリケーションのサポート条件として
インストールライブラリが指定されている場合などの時に
zabbix_agentを使いたい場合などに。

今回はzabbix_server側は
別サーバで既に"rpmインストール"している所からテストした。
今回の話からはzabbix_serverのインストール等についてはこちらに記載はしていないのでご了承を。


#作成環境
CentOS 6系
Digital Oceanを使い新規で環境作成

Digital Oceanを真っ新から立ち上げて作業する場合は、
wgetなど含め無いのでyumでinstallが必要ですが
この辺りも記載はしていません。

#作る
###1.zabbixのソースを持ってくる
*2015/11/20現在 latestの2.4.7（移植記事なので日付がだいぶ前です）

```
# wget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.4.7/zabbix-2.4.7.tar.gz
```

###2.unarchiveする
```
# ls -l zabbix-2.4.7.tar.gz`
-rw-r--r-- 1 root root 15012768 Nov 12 05:42 zabbix-2.4.7.tar.gz
#
# tar zxvf zabbix-2.4.7.tar.gz
# cd zabbix-2.4.7
```

###3.configureする
zabbixのオンラインマニュアルを見ると
static-link作成時は、`--enable-static` にしろと記載がある
またagentやsenderは `--enable-agent` を付けろとの事
その他のoptionは `./configure -h` で確認可能である
実行後errorが出ていなければokであろう

```
# ./configure --enable-static --enable-agent

```

####エラーが出た場合の対処例2つほど
######失敗例1：この場合は大抵Cコンパイラが入ってないなど
```
# ./configure --enable-static --enable-agent
configure: error: in `/root/zabbix-2.4.7':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
```
######対処：入ってない場合はgcc等をいれましょう
```
# yum install -y gcc
```

######失敗例2:お前のシステムだとstatic linkの物を作れないと怒られる
```
# ./configure --enable-static --enable-agent
checking size of void *... 8
checking if static linking is possible... no
configure: error: static linking is not possible on this system
```
######対処：static-link作成の際のライブラリ群をinstall
```
# yum install -y glibc-static
```


###4. makeでビルド
error等でなければ大丈夫であろう

```
# make
```

###5.インストールはせずにビルドしたものを確認する
以下の様にstaticになりライブラリが実行ファイルに同封されているようであれば、
入れたい環境に持っていき配置などする

```
# pwd
/zabbix-2.4.7
#
# file ./src/zabbix_agent/zabbix_agentd
./src/zabbix_agent/zabbix_agentd: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, not stripped
#
# ldd ./src/zabbix_agent/zabbix_agentd
not a dynamic executable
```


###6.最後に起動の確認
zabbix-server（rpmインストール）がされているサーバ（CentOS6系）からagentが使えるかを確認する
今回は直接実行して使う事の動作確認
configのPATHはrpmインストールと同じPATHを使用
ちなみに、zabbix_agentdのオプション類はmanで確認可能
*configのPATHはconfigre時に指定できた気もする
*zabbix_agentd.confの中身は適宜設定を
*プロセスを起動するにあたり、zabbixユーザが必要

```
# ./zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
# ps -ef | grep agent
zabbix   13350     1  0 05:53 ?        00:00:00 ./zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix   13351 13350  0 05:53 ?        00:00:00 ./zabbix_agentd: collector [idle 1 sec]
zabbix   13352 13350  0 05:53 ?        00:00:00 ./zabbix_agentd: listener #1 [waiting for connection]
zabbix   13353 13350  0 05:53 ?        00:00:00 ./zabbix_agentd: listener #2 [waiting for connection]
zabbix   13354 13350  0 05:53 ?        00:00:00 ./zabbix_agentd: listener #3 [waiting for connection]
zabbix   13355 13350  0 05:53 ?        00:00:00 ./zabbix_agentd: active checks #1 [idle 1 sec]
root     13358 12720  0 05:53 pts/1    00:00:00 grep agent
```

###その他
- senderも同様にstatic化になっていると思いますのでご利用される方はどうぞ
今さら聞けないセッションとCookie、ログイン・ログアウト(Rails編)

知識の補完を目的としてRails tutorialをちまちまやっている。
[第8章 ログイン、ログアウト](http://railstutorial.jp/chapters/log_in_log_out?version=4.2#cha-log_in_log_out)に差しかかったので、セッションとCookie、並びにログイン・ログアウト機能について自分用のまとめ。

# セッション
>HTTPはステートレスなプロトコルです。文字通り「ステート (state)」が「ない (less)」ので、HTTPのリクエストひとつひとつは、それより前のリクエストの情報をまったく利用できない、独立したトランザクションとして扱われます。HTTPは言ってみれば、リクエストが終わると何もかも忘れて次回最初からやり直す健忘症的なプロトコルであり、過去を捨てた旅から旅の流れ者的なプロトコルです (しかし、だからこそこのプロトコルは非常に頑丈なのです)。この本質的な特性のため、ブラウザのあるページから別のページに移動したときに、ユーザーのIDを保持しておく手段がHTTPプロトコル内「には」まったくありません。ユーザーログインの必要なWebアプリケーションでは、セッションと呼ばれる半永続的な接続をコンピュータ間 (ユーザーのパソコンのWebブラウザとRailsサーバーなど) に別途設定します。

セッションについてはまぁこれが全てで、要するにHTTPでは状態を記憶できないので、別レイヤーでそれを行いますよという話。
これをユーザーのログイン・ログアウトで考えると、一度ユーザーがログインやログアウトをしたはいいけど、**ユーザーのログイン状態をHTTPでは記憶できない**ので、セッションでその情報を保持しましょうということ。
Railsでは基本的に```session```メソッドを使ってこの機能を実現する。```session```メソッドで作成されたセッションは自動で暗号化されるが、ブラウザを閉じると破棄される。

# Cookie
そもそもCookieは、Webアプリがブラウザを通してクライアントにデータを保持させる機能のことで、要するにユーザー側に持たせている情報と思えばいい。クライアントが情報を持っているので、ブラウザを閉じても破棄されないし、暗号化しないと簡単に読み取られる。
これまたユーザーのログイン・ログアウトで考えると、ログイン情報をセッションのみで取り扱うと、ブラウザを閉じる度にログインしないといけなくなる。それはちょっとめんどくさいよねということで、**Cookieにもログイン情報を持たせてしまい、ブラウザを閉じても状態が維持されるようにしよう。**という使い方になる。「ログイン状態を保存する」みたいなチェックボックスがあるWebサービスでやってるアレだ。実際にはDBにもハッシュ化した情報を保存し、次回訪問時にCookieの内容と突き合わせてログイン状態を参照するという方法を取っている。
Railsでは```cookies```メソッドを使ってこの機能を実現する。

# ログインとログアウトとログイン状態の記憶
以上の内容を踏まえると、ログインとは、**セッションにuser_idを保存する処理**のことであり、ログアウトとは**セッションに保存されているuser_idを破棄する処理**であるといえる。
また、ログイン状態の記憶とは**CookieとDBにログイン情報を保存する処理**のことであり、ログイン状態の破棄(つまりログアウト)とは**CookieとDBに保存されているログイン情報を破棄する処理**であるといえる。

![login_logout.png](https://qiita-image-store.s3.amazonaws.com/0/52834/26fa15c3-e865-6d14-ce45-a20b80d88e65.png)

# RailsにおけるセッションとCookieの関係
ここまでで終われば話は簡単なんだけど、Railsについての話をしようとすると、時たま話がこんがらがったりする。というのも、Railsは```session```メソッドでセッションを実現するとき、デフォルトではCookieを使用するからだ(他の言語もそうだと思うけど不勉強につき割愛)。つまり、**「ブラウザを閉じると破棄されるようなCookie」という形で、暗号化されたセッション情報をクライアント側に保存する。**この辺りの話は[Railsのセッション管理方法について](http://shindolog.hatenablog.com/entry/2014/11/02/164118)がわかりやすかったのでそこを読んでもらえるといいと思う。セッションを扱うための他の方法についても書いてある。

# 雑感
概ね理解していた内容でも、こういった形でまとめるとなると難しいし、勉強になるなぁという感じ。
間違いの指摘等ありましたら是非ともよろしくお願いします。

### 参考文献
[第8章 ログイン、ログアウト | Rails チュートリアル](http://railstutorial.jp/chapters/log_in_log_out?version=4.2#cha-log_in_log_out)
[Railsのセッション管理方法について - Programming log - Shindo200](http://shindolog.hatenablog.com/entry/2014/11/02/164118)
Windows上のRubyでSSL接続時にcertificate verify failedが出る場合の対処

# Ruby をアップデートしろ！

……ができない場合。

Windows上のRubyにおいて、

```rb
require "open-uri"
open("https://www.google.com").read
```

などとやった場合に

```
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate
verify failed (OpenSSL::SSL::SSLError)
```

とエラーがでて接続できない場合の対処について書いておきます。

1. 証明書をダウンロードする。  
   http://curl.haxx.se/ca/cacert.pem
2. 環境変数 SSL_CERT_FILE に cacert.pem のパスを設定する  
   `set SSL_CERT_FILE=./cacert.pem`  
  もしくはスクリプトの先頭付近に  
  `ENV["SSL_CERT_FILE"] = "./cacert.pem"`  
  （Windows のシステム設定から環境変数を設定する場合などは証明書ファイルのフルパスを設定する必要があるでしょう）

終わり。

試験環境

+ RubyInstaller
+ ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-mingw32]

Windows以外の環境でも証明書が古くなれば出ることがある（macOS で確認）。
その場合でも同様に環境変数 SSL_CERT_FILE に証明書へパスを通してやれば良い。

---

2016/12/06 追記

https://rubygems.org/ の証明書が更新された影響で、Gemのインストール関連でSSLのエラーが出る場合は、

```
gem install rubygems-update --source http://rubygems.org/
update_rubygems
```

とコマンドを発行することでも解決する。

（この記事の本題ではないが。gem コマンドは自分自身で証明書を持っていて、それを更新する方法のため）
Rails マウントしたエンジンとメインのアプリ間でのアクセス

# routesへの設定

```rb:config/routes.rb
Rails.application.routes.draw do
  mount MyEngine::Engine => "/my_engine", as: "my_engine"
  get "/top" => "top#index"
end
```

上記のような設定。

# メインからエンジンへ
エンジンの設定には```as```で名前をつけてあげる。そうするとエンジン側へアクセスするためのヘルパーが出来る。

```rb:メインのアプリのcontroller
class TopController < ApplicationController
  def index
    my_engine.root_url #メインのアプリ側からエンジン側へアクセス
  end
end
```

# エンジンからメインへ
メインのアプリへは```main_app```というヘルパーが用意されている。

```rb:エンジンのcontroller
module MyEngine
  class ArticleController
    def index
      main_app.top_path # エンジン側からメインのアプリへアクセス
    end
  end
end
```

# 参考

http://edgeapi.rubyonrails.org/classes/Rails/Engine.html#class-Rails::Engine-label-Using+Engine-27s+routes+outside+Engine

http://railsguides.jp/engines.html
MySQLでSWAPしてたりCPU利用率が高かったりしていたら・・・

[**Bug #57241**](http://bugs.mysql.com/bug.php?id=57241)を疑いましょう！

#[Numa](https://ja.wikipedia.org/wiki/NUMA)アーキテクチャのお話し
CPUを2発積んでいるサーバで、なんか、CPU1発だけWAIT多いとか、最近急にSWAP(in/out)を使うようになってきた。。。
と感じたら、
そんな時は、Numaアーキテクチャを思い出しましょう。

##Numaアーキテクチャのざっくりとした説明
CPUを2発以上積んでいるサーバだと、各CPUごとにメモリを分割して管理しちゃうので、管理コスト（レイテンシ－や不要な領域等）が発生しちゃうということ。
##MySQLへの影響
MySQLで物理メモリの半分以上設定して、1個のCPUのメモリ管理範囲を超えるような、SQLが来ると、物理メモリが空いているにも関わらず、SWAP発生しちゃうよというお話。
これ、実際過去に体験したんです。
##対応策とか
対応策や詳細知りたい人は、以下見てくださいね。
[Bug #57241](http://bugs.mysql.com/bug.php?id=57241)
対応策はざっくり、
[パッチ](https://github.com/twitter/mysql/blob/master/scripts/mysqld_safe.sh#L793)を作っていただいているので、当てて再起動&確認！

でも、再起動ってなかなかハードル高いけど。。。
つい、少しのSWAPなら無視したくなっちゃいますが、大事になる前に対応を！！ :bowtie:
綺麗なコードを書くために

コードレビューをしていながら、一向にコードの質が改善していないことに不安を覚えたので、ネットの海に潜って「どうすれば綺麗なコードを書けるようになるのか？」を拾い集めてみました。

## 綺麗なコードを書くための心構え

1. 後から読む人のことを意識する。（未来の自分を含めて）
2. 書いた理由・意図を明確にする

## 綺麗なコードを書くために

1. とにかく書く
2. 綺麗なコードに触れる
3. 師匠・弟子を見つける
4. 技術に対して情熱を持つ
5. ツールを使いこなす

## コードレビューをする時・される時の心構え

1. 「何が良いコードか？」を共有しておく
2. 何故良くないと思ったかをきちんと説明する
3. 良いと思ったところにもレビューを残す
4. レビューは実装した人を攻めるのではなく、コードに対して指摘する
5. 受けた指摘は素直に受け入れる

参考

* [良いコードを書く技術（まとめ）](http://qiita.com/NoriakiOshita/items/e60ab5bb01b90d927ae5)
* [綺麗なコードと汚いコード。どちらのプログラマと一緒に働きたい？～可読性を意識したプログラム言語はRuby, CoffeeScript, Elixir #Ruby #CoffeeScript #Elixir](https://codeiq.jp/magazine/2014/02/5464/)
* [[14] コードレビュー](http://プログラマが知るべき97のこと.com/エッセイ/コードレビュー)
* [デキるプログラマだけが知っているコードレビュー7つの秘訣](http://www.slideshare.net/rootmoon/7-37892729)
* [[ソフト開発]きれいなソースコードを書くために必要な、たったひとつの単純な事](http://d.hatena.ne.jp/r-west/20090510/1241962864)
TableViewにAutoLayoutで可変のUILabelを設置する


TableViewにAutoLayoutで可変のUILabelを設置する際にハマったので解決方法をメモします。

## やりたいこと
AutoLayoutを使い可変のUILabelの幅をピッタリのサイズにします。


![IMG_0202.png](https://qiita-image-store.s3.amazonaws.com/0/27793/fa193980-e0f5-cad4-f7cf-5e232b5e6095.png "IMG_0202.png")




## Content Hugging Priorityを設定する

以下のようなAutoLayoutを設定すると可変のLabel Bが伸びてしまいます。

![スクリーンショット 2016-01-07 14.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/27793/72fa86bd-cb02-946e-9dfa-632de4877dd8.png "スクリーンショット 2016-01-07 14.52.36.png")

![スクリーンショット 2016-01-07 14.53.01.png](https://qiita-image-store.s3.amazonaws.com/0/27793/ef7c7f0a-05e3-6bf6-cf23-1e661498e639.png "スクリーンショット 2016-01-07 14.53.01.png")

Label B の Horizonal の Content Hugging Priority が Label Aより低いのが原因です。

**以下のようにPriorityを上げると Label Bは伸びません。**

![スクリーンショット-2016-01-07-16.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/27793/bc835bda-ce2c-d621-a935-c7cea5ad4238.png "スクリーンショット-2016-01-07-16.08.35.png")


## コードでAutoLayoutのConstraints(制約)のconstant(値)をセットする

UITableViewのCellは再利用されるのでConstraints(制約)のconstant(値)がセル毎に違う場合はコードから指定する必要があります。
※ setNeedsLayout、layoutIfNeededではダメでした

今回の例ではLabel Bの幅のConstraints(制約)のconstant(値)をコードで設定します。
まずはConstraints(制約)をOutletでつなぎます。

![スクリーンショット 2016-01-07 16.16.32.png](https://qiita-image-store.s3.amazonaws.com/0/27793/91c4d0cd-6aa5-0caa-6825-6265194d1edd.png "スクリーンショット 2016-01-07 16.16.32.png")

sizeThatFitsを使いUILabelの幅を取得してOutletでつないだConstraintsに値をセットします。

```objective-c
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"UYVoiceTableViewCell";
    UYVoiceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];    
    
〜省略〜

    CGSize maxSize = CGSizeMake([UYUtil getScreenSize].width,[UYUtil getScreenSize].height);
    CGSize iineLabelSize = [cell.iineLabel sizeThatFits:maxSize];
    cell.iineLabelConstraintsWidth.constant = iineLabelSize.width;

    return cell;
}

```
babel で継承元の static メソッドを IE9 でも使用する方法

あくまでも使用するだけで、polyfill とかじゃないです。
そうです。無理矢理です。
もう普通に継承先に書いちまえって感じだけど、どうしてもって場合に。

```js
class Pearent {
  static test() {
    console.log(this);
  }
}

class Child extends Pearent {
  static test() {
    return this.__proto__.test.call(this);
  }
}

Child.test();
```
* `call` 使ってる理由が分かりやすいように `this` を出力するように変更（2016/1/8）

というか、どうにかして出来るんじゃないかとは思うけど、
今のトコロわかんないので、とりあえず。
Dropboxで開発ディレクトリとデスクトップを同期させるシンボリックリンク

# OSXのクリーンインストールをした際の備考録
バックアップの多重化 + 他の端末との同期のために、開発ディレクトリとデスクトップをDropBoxに同期させるシンボリックリンクの張り方。

### 1. 開発ディレクトリ`~/dev`をDropbox内dに同期させる
```
ln -s ~/dev ~/Dropbox/00_development
```

### 2. デスクトップ `~/Desktop`をDropbox内dに同期させる
```
ln -s ~/Desktop ~/Dropbox/00_desktop
```

## 今度しらべる
Dropboxがどうリンク先のファイルを扱っているかが若干理解できていない。上記の様にシンボリックリンクはDropbox側のディレクトリに配置するが、もちろんリンクとしてFinderには表示される。しかし一方Dropbox.comで見ると通常の方法で配置された実体ファイルとして扱っているのがわかる。

この辺りの理解が足りておらず気持ち悪い感じが残る。

以上。