OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアだけどポートフォリオサイト作ってみた

先日、ある会社の面接に行くときに「ポートフォリオを持ってきて欲しい」ということだったので、
ポートフォリオサイトを作りました。
こんな感じです．
http://musou1500.github.io/
![Screen Shot 2016-08-23 at 23.40.18.png](https://qiita-image-store.s3.amazonaws.com/0/28859/71b8febc-5dd4-9048-7bf7-c790ccddf7ca.png)



これを作るときにこだわった点を数点上げていきたいと思います。

## デザインについて
今回，面接まであまり時間がなく，デザインに時間がかけられない状況でした．
こういうケースだと，写真や，各パーツで使う画像に凝ることは難しいと思います．
そこで，Webフォントを使用し，ゆったりとしたレイアウトにすることで，ある程度綺麗に見せることを試みました．
日本語はM+Font、英語は[Google fonts](https://www.google.com/fonts)から「Raleway」を使用しました。
自己紹介用の画像やメニュー背景も，SNSのプロフィール等にあったものをほぼ無加工で使用しています．

## どんな技術が使えるのか
こちらが一番重要だと思います．
私がポートフォリオサイトに自分の技術を伝えるために用意したコンテンツは以下の２つです．
* 自己紹介に「よく使用する技術」という項目を用意した
* 「Works」というセクションに，今までの自分の制作物等を掲載した．


## (余談)altJS
JavaScriptは動きのあるWebページを制作する上で不可欠だと思いますが，
独特なオブジェクト指向の仕組み等が苦手な方もいるのではないでしょうか．
今回はaltJSとして，Haxeという言語を使用しています．

独自の文法を持っており，コンパイラを通すと他の言語に変換できる，というちょっと変わった言語です．
JavaScriptやpython，C++等に変換できます．
文法はこんな感じです．

```hx
package ;
import js.JQuery;
class Main {
  private var elem:JQuery;
  public function new() {
    this.elem = new JQuery("#id");
    this.elem.attr("id");
    this.elem.css("display", "none");
  }
  public static function main() {
    new JQuery(js.Browser.window).ready(function() { new Main(); });
  }
}
```
かなり主観的なイメージですが，普段JavaやC#等の言語を使用する方にとっても親しみやすい文法のように感じます．
シェルスクリプトでパスの連結

シェルスクリプトで、あるファイルパスに別の相対ファイルパスを連結して新しいファイルパスを得るには次のようにします。

# 前提

- ベースとなるパス `base` は空文字列ではない
- 連結するパス `rel` は空文字列ではなく、かつスラッシュで始まらない

# コード

```sh
"${base%/}/${rel}"
```

# 解説

結果が単語分割されるを避けるため、全体を二重引用符で囲みます。

`${base%/}` で、 `base` の末尾にスラッシュがある場合にはそれを(一つ)消します。これにより `base` がスラッシュのみからなるパスである場合でもスラッシュの数が変わることを防ぎます。例えば `base` が `/` で `rel` が `home` ならば結果は `/home` になります。

ここでもし `"${base}/${rel}"` を使ったとしたら、結果は `//home` になります。Cygwin などの環境ではスラッシュ二つが特別な意味を持つため、これは正しい結果ではありません。
Swift覚書(Xcode6.3.2)

Swift覚書(Xcode6.3.2)

- 関数定義とクロージャー定義は似てる

```swift:foo.swift
func f(i: Int) -> Int {
  return i * 2
}

let g = {(i: Int) -> Int in
  return i * 2
}
//クロージャーの利用、mapの引数へ
var numbers = [20, 19, 8, 3]
let amap = numbers.map(g)
let bmap = numbers.map( {$0 * 2} ) //これでもおなじ結果
```

- Arrayは値型(Value type)、NSMutableArrayは参照型(Reference type)

```swift:foo.swift
func hoge4(inout val: [Int]) {
  val[0] = 0
}
hoge4(&numbers) // => [0, 19, 8, 3]
var nsarr2 = NSMutableArray = NSMutableArray(array: numbers)
func hoge5(val: NSMutableArray) {
  val[0] = 100
}
/*
(
    100,
    19,
    8,
    3
)
*/
```

- 引数が可変個の時にはピリオド３つの接尾語(postfix)を型名に付加

```swift:foo.swift
func hoge3(val: Int...) {
  for v in val {
    println(v)
  }
}
hoge3(8, 4, 9, 39, 27) // => 8 4 9 39 27
```

- Dictionaryの初期化４通り（３番目がチョイ心配）

```swift:foo.swift
var d: Dictionary<String, String> = ["OK": "NG", "Yeah": "What's up"]
var d: Dictionary = ["OK": "NG", "Yeah": "What's up"]
var d: [String: Int] = ["OK": 1]
var d = ["OK": "NG", "Yeah": "What's up"]
```

- Optionalは列挙

```swift:foo.swift
var hogeC: Optional<String> = nil
var hogeA: String = nil // copiling error!!
var hogeB: String? = nil
```
宣言時に?記号を使う。それからインスタンスを利用するには!記号を使う。
インスタンスを利用するとは、メソッド呼び出しとか、関数の引数にするとか。
!の記号は強制ダウンキャスト記号as!にも表れる。as?ってのもあり？

- do-catchで発生したエラーを補足(swift2.0)
let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { data, response, error in
 ...
}
error: NSErrorでエラーを補足してたswift1.2からdo-catchを使うようにswift2.0から変更。
ErrorTypeをthrowするメソッドを呼び出すにはtryを使う。こんな感じ
try NSURLSession.sharedSession().dataTaskWithURL
とか、
let str = try method()
ってな感じ。

*参照したサイト:*  [Swift入門者が覚えておきたい17項目](http://http://maplesystems.co.jp/blog/all/programming/9574.html#CocoaPods)

*これ無くなってもらっては困る:* [コンパイルエラー寄せ集めこれ無くなってもらっては困る](http://samekard.blogspot.jp/2014/09/swifterror.html)
Memcached::set 有効期限は30日まで

[PHP: Memcache::set - Manual](http://php.net/manual/ja/memcache.set.php)

![スクリーンショット 2015-06-18 15.42.16.png](https://qiita-image-store.s3.amazonaws.com/0/1642/f4bd4be8-bde7-5b09-7c57-74c51373d18d.png)

expire
項目の有効期限。ゼロの場合は有効期限なし (いつまでも有効) となります。Unix タイムスタンプ形式、あるいは現在からの 秒数で指定することが可能ですが、`後者の場合は秒数が 2592000 (30 日) を超えることはできません。`
Chocolateyを使った環境構築の時のメモ

#Chocolateyを使った環境構築の時のメモ [Windows]
Windows 10をクリーンインストールした際の
環境構築のためにソフトをインストールする際に役立った
Chocolateyの使い方をまとめました.

#chocolateyとは?
Ubuntu/Debian系でよく使われるパッケージ管理の *apt-get* が
Windows版でchocolateyになったと思えばいいと思う.

これをインストールすると

```powershell:PowerShell(管理者権限)
chocolatey install ${packagename}
```

みたいな感じでインストールできる.

#インストールするメリット
* 使いたいソフトの *Windowsインストーラ* をダウンロードして
 毎回 *Yes* とか *承諾* とかをクリックする **手間が省ける**
* chocolateyでインストールしたソフトは**一括アップデート**できる
* cinst ${packagename}でググれば，ソフトの**インストールは楽々**
* 広告URLをクリックして偽ソフトをうっかりダウンロードする**心配がない**はず

# chocolateyのインストールコマンドを実行

[chocolatey](https://chocolatey.org/install#installing-chocolatey)のサイトに掲載されているコマンドをPowerShell(管理者権限)で実行しインストールする.

具体的なインストール手順は以下の4ステップで完了！

## 1. Chocolateyへアクセス
>Chocolatey
https://chocolatey.org/install#installing-chocolatey

## 2. PowerShellのスクリプトのコピー
Step2にあるコマンドのコピーアイコンをクリック
![PowerShellCopyCommand.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29573/700f44ac-d3ac-db06-e456-85a603902036.jpeg)

## 3. PowerShellを管理者権限で起動
ディスクトップを表示して，キーボードで`スタート`と`X`を同時に押して，出てきたメニューから，`Windows PowerShell(管理者)(A)`をクリック.

## 4. PowerShellへコマンドの貼り付け
<kbd>Controll</kbd>を押しながら<kbd>V</kbd>を押してコピーしたコマンドを張り付け、<kbd>Enter</kbd>を押下する. すると、インストールスクリプトが動く.

## chocolateyを利用する準備完了!!
じゃんじゃんソフトをインストールしよう!!

#chocolateyで利用できるソフトのインストール (以下の操作は自由)
以下の操作は必要ありませんが、
chocolateyの使い方のチュートリアルも兼ねて掲載しておきます.

##「JDK8」のインストール例(任意)
chocolateyと書かずに，chocoと略しても同じように実行できる.

```powershell:PowerShell(管理者権限)
choco install -y jdk8
```

さらにchoco installを略して，cinstと表すこともできる.

```powershell:PowerShell(管理者権限)
cinst -y jdk8
```

#パッケージをまとめてインストール
以下のパッケージをまとめてインストールするための方法

* dropbox
* gimp
* adobereader
* skype
* git
* firefox

以下みたいな感じに入力

```powershell:PowerShell(管理者権限)
cinst -y dropbox gimp adobereader skype git firefox
```

#パッケージの管理
インストールしたソフトの更新やアンインストールを行う方法は次の通り.
`chocolatey`を`choco`と置換して使用もできる.

##インストールしたパッケージ全体の更新
```powershell:PowerShell(管理者権限)
chocolatey upgrade all -y
```
または

```powershell:PowerShell(管理者権限)
choco upgrade all -y
```
インストールされたすべてのパッケージが更新される.
再インストールの必要が無く、これが一番Chocolateyを使う理由だったりする.

##パッケージリストの取得
```powershell:PowerShell(管理者権限)
choco list -lo
```

インストールしたパッケージのリストを表示する

##指定したパッケージの更新
```powershell:PowerShell(管理者権限)
chocolatey upgrade ${packageName}
```

${packageName} : 指定したパッケージ名

##パッケージのアンインストール
```powershell:PowerShell(管理者権限)
cuninst ${packagename}
```

${packageName} : 指定したパッケージ名
JavaScriptで数値を整数に変換する

たまに間違うのでメモ

方法          | 型   | 範囲
--------------+--------+------
x｜0          | int32  | -2147483648 ~ 2147483647
x >>> 0       | uint32 | 0 ～ 4294967295
Math.round(x) | double | -9007199254740991 ～ 9007199254740991
cpp_binarysearch - binary search helper with block


|cpp_libraries|article|
|:--|:--|
|cpp_binarysearch|http://qiita.com/cielavenir/items/852e2458cd327ca73613|
|cpp_inspect|http://qiita.com/cielavenir/items/95615185b5ca47d9111d|
|cpp_range|http://qiita.com/cielavenir/items/94c9abbb7767bd57607b|
|cpp_rational|http://qiita.com/cielavenir/items/2171327462d2afd98b65|

## Download

https://github.com/cielavenir/cpp_libraries/tree/master/binarysearch

## What's this?

- You can write binary search using a block, with transparency.
- Specify eps=1e-9 for float search.

## Example

- 億マス計算 (ARC037C)
  - http://arc037.contest.atcoder.jp/submissions/426765
- Lake (すぬけのお誕生日コンテストF)
  - 整数小数両方の例があります
  - http://snuke21.contest.atcoder.jp/submissions/441386
cpp_range - embeddable range iterator


|cpp_libraries|article|
|:--|:--|
|cpp_binarysearch|http://qiita.com/cielavenir/items/852e2458cd327ca73613|
|cpp_inspect|http://qiita.com/cielavenir/items/95615185b5ca47d9111d|
|cpp_range|http://qiita.com/cielavenir/items/94c9abbb7767bd57607b|
|cpp_rational|http://qiita.com/cielavenir/items/2171327462d2afd98b65|

## Download

https://github.com/cielavenir/cpp_libraries/tree/master/range

## What's this?

- Very small (less than 100 lines) equivalent of boost::irange().
- The iterator should be compatible with RandomIterator (tested with `lower_bound()`).
  - But never try to write to the range (eg. `swap(ra[0],ra[1])`) or you will have unexpected result.

## Example

- Koto市営地下鉄
  - http://acm-icpc.aitea.net/index.php?2015%2FPractice%2F%E6%A8%A1%E6%93%AC%E5%9B%BD%E5%86%85%E4%BA%88%E9%81%B8%2F%E8%AC%9B%E8%A9%95
- https://github.com/cielavenir/procon/blob/master/tyama_icpc2015dpA.cpp
Docker officialのWordpressイメージでサブディレクトリ運用をする

解決課題
=======

`docker pull wordpress`で取得できるWordpressは、ルートパス (e.g. http://example.jp/) で運用する前提でいろいろ構成されているため、サブディレクトリパス (e.g. http://example.jp/blog/) でも運用できるようにするBad-Know-howです

手順
====

```
$ mkdir /tmp/wwwroot/ ; cd /tmp/wwwroot/
$ mkdir blog/
$ curl https://ja.wordpress.org/wordpress-4.2.2-ja.tar.gz | tar xzf - -C blog/ --strip 1
$ mkdir wp-includes/
$ touch index.php wp-includes/version.php wp-config.php
```

`blog/wp-config.php` の[設定](http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86)をします
POINT: /tmp/wwwroot/wp-config.php ではなく /tmp/wwwroot/blog/wp-config.php です

```
$ docker run -v /tmp/wwwroot:/var/www/html -e WORDPRESS_DB_HOST=... -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_NAME=... -e WORDPRESS_DB_PASSWORD=... wordpress
```
POINT: マウントするのは /tmp/wwwroot です
POINT: すでに blog/wp-config.php にはDB関係の情報を入れているはずですが、entrypoint.shが要求するため -e は指定してあげてください

これで http://WORDPRESS/blog/ にアクセスすれば、セットアップ画面が出てきます

タネあかし
=========

[entrypoint.sh](https://github.com/docker-library/wordpress/blob/master/docker-entrypoint.sh)によると、下記ファイルが無い場合は "新規インストールが必要" と判定され、イメージ内のtarballが展開されてしまいます

* index.php
* wp-includes/version.php

また下記ファイルが無い場合は再生成されます

* wp-config.php

よって、これら３つのファイルをあらかじめ作っておけば、新規インストール＆再生成されることが無いので、その副作用を利用したものです

あとがき
=======

Wordpress動作環境を作ることすら、面倒になってしまったこの身体
しかし、こんな方法を編み出すくらいなら、作ったほうが早いと思うのだけどね
YAMAHA RTX1210 PPTPでVPN接続できない問題（内部から外部へ）

Yamaha RTX1210を購入して運用を始めたのですが、内部から外部ネットワーク（VPN・PPTP）へ接続できなかったのでメモになります。ネットワーク初心者なので詳しくは知りません。

デフォルトの設定だった場合、GREが設定されていなかったのが原因みたいです。

ネットワーク周りは、初心者なので毎回ハマってしまいます。。。

# 忘れないための設定の手順メモ

## 管理画面へ接続

* 詳細設定をクリック
* 左カラムのIPフィルターをクリック
* PP1/LAN2の欄の確認をクリック

## 適用されているIPフィルターの一覧

一覧表示の切替部分は、「受信方向のフィルターを表示」にする

* 静的フィルターの編集をクリック
* 静的フィルターの新規をクリック
* フィルターをクリック
* プロトコルの部分をGREを選択（タイプはpass：その他省略）し確認：

## インターフェースへの適用の設定

確認後、静的フィルターに追加したプロトコルが表示されます。

* 追加したプロトコルをドラック
* PP1/LAN2  に適用する静的フィルターへドロップ（評価順は一番下）
* 確認

ネットワーク周りの基本的な部分は、これから勉強します。
memoistとRailsキャッシュのどちらがパフォーマンスが良いか調べてみた

memoistとRailsキャッシュのどちらがパフォーマンスが良いか調べてみた

## はじめに
Railsでマスター系のDBで何度も同じ内容を叩いたり、N+1問題対策でincludesをつけていても、結局
デカイSQLを発行してしまい効率的ではない場合もある

そこでメモリに保存して再利用する方法memoistを使っては見たものの、普通のRailsについてる機能のLow-Level Cachingを使ってもそんなにパフォーマンスが変わらないんじゃないか？と言う疑問をがふつふつと湧いたので計測して、運用しているサービスでどちらを採用するか決めた

※Railsのキャッシュはmemcacheを使用

## 検証環境
* OS: MacOSX 10.10
* Rails version: 4.2
* memoist version: 0.12.0


## サンプルコード

```rb
class SampleCode < ActiveRecord::Base

  #キャッシュされるSampleCodeモデルのコード群
  @@cached_codes = [AAA, BBB, CCC, DDD, EEE].map!(&:freeze).freeze

  # クラスメソッドのメモ化
  class << self
    extend Memoist
    def plan_ids
      SampleCode(code: @@cached_codes).pluck(:id)
    end
    memoize :plan_ids
  end

  #　クラスメソッドで、Low-Level Cachingを利用
  def self.plan_ids_cache
    Rails.cache.fetch("plan_ids_cache_key", expires_in: 1.day) do
      SampleCode(code: @@cached_codes).pluck(:id)
    end
  end
end
```	

## 計測

Rails consoleを起動して下記にある検証コードをコピペして実行する

```
> bin/rails console 
```

5つの整数を格納した配列を取得するメソッドが1000回
memoistを使う場合とLow-Level Cachingを使う場合、最後に普通にActiveRecordでデータを取ってくる場合だ

(ベンチマークの試行回数の書き方が間違ってたので修正してあります) 

```
# 開実行する
require "benchmark"

#試行回数
num = 1000

plan_code = [AAA, BBB, CCC, DDD, EEE].map!(&:freeze).freeze
  
report = Benchmark.bm do |r|
  r.report "memo" do
    num.times { SampleCode.plan_ids }
  end
  r.report "cache" do
    num.times { CampaignCode.plan_ids_cache }
  end
  # ActiveRecordで素でとった場合
  r.report "ar original" do
    num.times { SampleCode.where(code: plan_code).pluck(:id) }
  end
end


# ローカル環境実行結果(memcachedもローカルサーバで動いている)
=>
            user     system   total   real
memo        0.0200   0.0100   0.0300 (0.0332)
cache       0.3299   0.2200   0.5499 (1.1794)
ar original 1.6600   0.2500   1.9100 (4.5657)


=>

# Staging環境実行結果(サーバはHeroku, memcachedはアドオン動いている)

            user     system   total   real
memo        0.0099   0.0      0.0099 (0.1472)
cache       0.5000   0.1499   0.6499 (3.6802)
ar original 1.1500   0.1699   1.3200 (3.3467)


```

## 考察
memoistを使った場合圧倒的に早いLow-Level Cachingを用いた場合キャッシュもActiveRecordを直接取ってくる場合よりよりもローカル環境では5倍以上倍早く、stagingでは2倍以上早い。

Staging環境でのテストでもmemcachedが別サーバにあるでのオーバヘッドがあるにも関わらず予想外に好成績だった(むしろHerokuが予想外に早くてびっくりした)

memoistの場合はサーバのメモリに保存するがLow-Level Cachingの場合はmemcacheにキャッシュした値を委譲できるので、少メモリと言う観点ではLow-Level Cachingが優位性がある

## 結論
使いドコロによってmemoistとLow-Level Cachingを使い分けることにした

* memoist　はバッチ処理など一気に大量のデータを処理する場合に用いる
* Low-Level Cachingはユーザがよく参照する画面で必要な情報をキャッシュする



#### refs
[Ruby でベンチマークを取る方法](http://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a)
忘れてしまうＰＨＰのデバッグ方法

# 定番のvar_dump
```
echo "<pre>";
var_dump($array);
echo "</pre>";
```

**説明**
1. var_dumpをそのまま実行すると成形されずにブラウザで表示されるため、preタグで挟んであげると綺麗に出力される

# エラーログをコードに仕込んで任意のファイルに出力

```
error_log(print_r($array,true),"3","C:/xampp/log/debug.log");
```

**説明**
1. errer_log関数の第1引数に出力したい変数/文字列を入れる。
2. print_rの第2引数のtrueを渡してあげると配列が展開されてログに出力される。
3. error_log関数の第2引数に設定している”3”は任意のファイルに出力ということ
4. error_log関数の第3引数に設定しているパスは出力したい任意のファイルパスを入れること
超簡単にEvernoteを活用するたった3つのルール

# Evernoteを使うのをあきらめた人へ

あとで見やすいように細々整理しようと思ったけど、バリバリ使ってノートが増えるほど整理する手間が増えて疲弊してしまったそこのあなた。

もっと気楽にやってみませんか？ということで、超簡単にEvernoteを活用できる3つのルールをご紹介します。

# 1.ノートブックもタグも使わない

ノートブック（Evernoteでいうフォルダのようなもの）もタグも使わず、なんでもかんでも書き込み貼り付けクリップしまくるだけでOK。

もう頑張ってノートブックに分類したり、念のためであれこれタグ付けしなくても大丈夫。

# 2.見たいノートは検索する

あとでノートを探すときは思いつくキーワードで検索すればOK。

Evernoteの検索は賢くて、画像内テキストも認識率が向上しているんです。

# 3.あとで検索でヒットするか心配だったら

キーになりそうな単語自体が含まれていないノートには、タイトルでも本文でもいいので思いつくキーワードを書き込んでおきましょう。

タグじゃなくてOK。深く考えずにパッと思いついたキーワードでOK。大丈夫、あとで検索するのもあなたなのだから。

# まとめ

ちゃんと整理しようとすると、理想通りできていないと思ったときに挫折してしまいます。とにかく「頑張らない運用」を心がけましょう。

大丈夫、適当に放り込んでおけばあとでEvernoteがちゃんと見つけてくれるはずだから。
EC2インスタンスを決められた時間に自動で起動・停止させる


以前Azure VMについて、決められた時間に起動・停止させる方法について調べていたとき、比較としてEC2インスタンスの起動・停止も調べたので、その内容について書きとめておきます。

Azure VMと同じで、用意されているAPIを何らかのツールを使って実行させます。
Azureとの違いは、提供されているコマンドラインツールはPowerShellがなくても操作できるところ。通常のLinuxからも操作可能なのは嬉しいですね。

#起動・停止関連API
* 起動(再開)：ec2-start-instances
 http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-StartInstances.html
<br>

* 停止：ec2-stop-instances
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-StopInstances.html
<br>

* 状態確認：ec2-describe-instance-status
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeInstanceStatus.html

#参考ページ
* シェルスクリプトのサンプル。シンプルにcronで定期実行に使えそうです。
http://dev.classmethod.jp/cloud/aws/ec2-start-and-stop-script-on-linux/
<br>

* バッチのサンプル。ツールで使う前提のようですが、タスクスケジューラで実行するよりもスケジュールの自由度が高く、コスト削減には効果がありそうです。
https://a-auto50.unirita.co.jp/case_study2/
<br>

* AWSのサービス、AWS OpsWorksからも自動で起動できるようですが、料金は多少掛かります。
http://recipe.kc-cloud.jp/archives/4146
wgetコマンドでまるごとサイトバックアップ

wgetでまるごとサイトを取得。
動的なホームページでも静的にバックアップできます。

wget \
--recursive \
--no-clobber \
--page-requisites \
--html-extension \
--convert-links \
--restrict-file-names=windows \
--domains hogehoge.com \
--no-parent \
www.hogehoge.com/webroot/html/

細かいオプションはまたいずれ記載。
ACCESSにADO.NETでアクセスする場合のトランザクション制御 #5


#接続型、非接続型が混在したトランザクション制御

```C#:接続型、非接続型が混在した場合のトランザクション制御

// 接続型の為の記述
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN;    // CONNはOleDbConnection。定義の記述を省略。

// 非接続型の為の記述
// DAはOleDbDataAdapter。定義の記述は省略。
OleDbCommandBuilder CB = new OleDbCommandBuilder(DA);
DA.InsertCommand = CB.GetInsertCommand();
DA.UpdateCommand = CB.GetUpdateCommand();
DA.DeleteCommand = CB.GetDeleteCommand();

// 共通
CONN.Open();

OleDbTransaction TRN = CONN.BeginTransaction(IsolationLevel.ReadCommitted);

// TransactionプロパティへのTransactionオブジェクトの代入
CMD.Transaction = TRN;    // 接続型の為の記述
DA.InsertCommand.Transaction = TRN;    // 非接続型の為の記述
DA.UpdateCommand.Transaction = TRN;    // 非接続型の為の記述
DA.DeleteCommand.Transaction = TRN;    // 非接続型の為の記述

try
{
    CMD.CommandText = "UPDATE 従業員テーブル xxx";
    CMD.ExecuteNonQuery();    // 接続型のSQL文発行

    DA.Update(DT);            // 非接続型のSQL文発行
    TRN.Commit();
}
catch (System.Exception)
{
    TRN.Rollback();
    textBox.Text = "エラーが発生したのでロールバックしました。" + ex.Message;
}
finally
{
    CONN.Close();
}
```

・[ACCESSにADO.NETでアクセスする場合のトランザクション制御 #1](http://qiita.com/kakunodatenow/items/a882b9a5281175399c64)
・[非接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/05648f618c2e4e201066)
・[接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/bd958484c3bf692df80f)
・[複数のDataTableの変更を同時にDBに反映する際のトランザクション制御](http://qiita.com/kakunodatenow/items/2a44ac5492a77a59b758)
・接続型、非接続型が混在した更新のトランザクション制御
・[トランザクション制御に関する分かり難いエラーメッセージ](http://qiita.com/kakunodatenow/items/f58275921859cda61fc1)
memoistでメモ化と、ActiveRecordのクラスメソッドをメモ化する方法


## はじめに
Railsでマスター系のDBで何度も同じ内容を叩いたり、N+1問題対策でincludesをつけていても、結局
デカイSQLを発行してしまい効率的ではない場合もある

そこでメモリに保存して再利用する方法memoistを使う方法がある
※Low-Level Cachingを使う場合がある

ActiveRecordのクラスメソッドでメモ化する場合はちょっとコツがあったので共有したい

## 検証環境
* OS: MacOSX 10.10
* Rails version: 4.2
* memoist version: 0.12.0


## サンプルコード

```rb
class SampleCode < ActiveRecord::Base
  # レコードが更新されたらキャッシュしてるメモを破棄
  after_commit :flush_cache

  # クラスメソッドの場合はこんな感じで破棄する
  def flush_cache
    self.class.flush_cache
  end
  
  
  #キャッシュされるSampleCodeモデルのコード群
  @@cached_codes = [AAA, BBB, CCC, DDD, EEE].map!(&:freeze).freeze

  # クラスメソッドのメモ化
  # def self.plan_idsといつもどおりにかけないので注意
  class << self
    extend Memoist
    def plan_ids
      SampleCode(code: @@cached_codes).pluck(:id)
    end
    memoize :plan_ids
  end
end
```	

#### refs
クラスメソッドをフラッシュする方法
https://github.com/matthewrudy/memoist/issues/13


はらパンさんの記事
http://j-caw.co.jp/blog/?p=1427
Retrospect Backup Client における Password Hash の脆弱性について

## 脆弱性の内容

[JVN のデータ](http://jvn.jp/vu/JVNVU99598689/)より。

> Retrospect Backup Client には、パスワードハッシュの生成アルゴリズムに問題があります。ハッシュの生成時にパスワードを完全に使用ないため、高い確率で他のパスワードと衝突する弱いハッシュ値を生成します。Retrospect Backup Client が動作するマシンにネットワーク経由でアクセスできる攻撃者は、最大でも 128回の試行でハッシュ値の衝突を起こすパスワードを生成することができます。

要するに簡単にパスワードをぶっこ抜けます。

## 影響度

[Vulnerability Note VU#101500](http://www.kb.cert.org/vuls/id/101500) より

CVSS 基本値 7.9 (AV:A/AC:M/Au:N/C:C/I:C/A:C)

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | 隣接ネットワーク（A） |
| 攻撃条件の複雑さ（AC）                  | 中（M）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | 全面的（C）       |
| 情報改ざんの可能性（完全性への影響, I） | 全面的（C）       |
| 業務停止の可能性（可用性への影響, A）   | 全面的（C）       |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

## 影響を受ける実装

- Retrospect Client 10.0.2 より前のバージョン（Windows/Linux）
- Retrospect Client 12.0.2 より前のバージョン（Mac）

影響を受けるのはパスワード認証を行っているユーザのみ。公開鍵認証を行っているユーザには影響しない。以下のバージョンで修正済み。

- Retrospect 10.0.2 for Windows
- Retrospect 12.0.2 for Mac
- Retrospect Backup Client 10.0.2 for Windows/Linux
- Retrospect Backup Client 12.0.2 for Mac

またはパスワード認証を止めて公開鍵認証に切り替える（推奨）。

## 参考ページ

- [Retrospect: Knowledge Base > CERT Vulnerability CVE-2015-2864](http://www.retrospect.com/support/kb/cve_2015_2864)
- [JVNVU#99598689: Retrospect Backup Client が弱いパスワードハッシュを使用する問題](http://jvn.jp/vu/JVNVU94598171/)
GitLabのMerge Requestのファイル一覧を整形出力するSnippet


リリース用に資料を作らねばならぬのです。

そんなわけでmarkdownのリスト形式で出力するSnippet。

Merge Requestのページで開発者ツールのコンソールを開いて、下のコードを実行すると整形済みのファイル一覧をクリップボードに格納します。

```
var o="";$(".file-stats ul li span").each(function(){var n="";var p="* ";if($(this).hasClass("new-file")){n+=p+"A "};if($(this).hasClass("edit-file")){n+=p+"M "};if($(this).hasClass("deleted-file")){n+=p+"D "};if(n===""){n+="? "};n+=$(this).text().trim();o+=n+"\n";});copy(o);
```

難読化してないやつ。

```
var o = "";
$(".file-stats ul li span").each(function(){
  var n = "";
  var p = "* ";
  if($(this).hasClass("new-file")){ n += p + "A " };
  if($(this).hasClass("edit-file")){ n += p + "M " };
  if($(this).hasClass("deleted-file")){ n += p+"D " };
  if(n===""){ n += "? " };
  n += $(this).text().trim();
  o += n + "\n";
});
copy(o);
```

2015-09-04 追記：

Chromeのconsoleが改行無視するようになったのでクリップボードにコピーするようにした。
真也&麻夕美　サプライズパーティー企画


## 企画の目的
真也&麻夕美のおもしろお馬鹿な仲間たちが2人の第◯回目の結婚をお祝いする為に、驚きと感動が詰まったサプライズパーティーを開催する。
単に騒ぎたいだけという節もあるが・・・
## 目標

```
大阪の星の下で新郎「真也」に大粒の涙を流させる
```

##決行日時
```
2015年7月31日(金) 21:00〜 雨天決行
※雨天時は駅前第4ビルB1
```

##あらすじ
ある日の夜、親友たかしぃと共に梅田に繰り出す2人。
梅田の歩道橋を登りは始めると遠くに2人の知人が現れる。
その知人の手には一輪のバラが・・。
そして、「結婚おめでとう」の言葉と一輪のバラを貰う。
さらにその数メートル先にはまた友人が。
またさらにその数メートル先には友人が。

よく見ると大勢の友人が一列に並び祝福を待ちわびていた。

一輪のバラを受け取りながら進む2人と友人たち。

そして、最後のバラを渡すのはシンガーゆうこまん!!

祝福のメッセージを伝え「愛を込めて花束を」を歌う。
その際、友人全員で一緒に歌おう!!


~~ある日の夜、親友のたかしぃと呑む2人。~~
~~いつになく盛り上がり「次いこーっ」と店を出て肩を組み歩き出す2人+麻夕美ちゃん。~~
~~とある場所を通ると、ストリートシンガーが歌っている場所でふと立ち止まる。~~

~~（ストリートシンガーに適当にラブソング系を歌ってもらう）~~

~~その時、麻夕美ちゃんが見知らぬ人から「結婚おめでとう」の言葉と一輪のバラを貰う。~~
~~少し戸惑う真也と麻夕美ちゃんだが、たかしぃが「ええやん！おめでとう！」と言って同調する。~~
~~そうしている間にまた次、また次と見知らぬ人からバラを受け取る。~~
~~2人が「？？？」となったころに近くで潜伏している友人「バラ渡し隊」が続々と現れ一輪のバラが渡された麻夕美ちゃんの腕の中にはバラの花束が。~~

~~そこに進行役が現れ、手紙を読み上げる。~~
~~読み終える最後の方でシンガーゆうこまん登場!!~~
~~まずアカペラで歌い出し、後半(2メロ?)で全員で合唱する。~~

※曲は「愛を込めて花束を」
※まさやんのボイパ&ラップは不要ってことで取り下げ
※タンバリンもイランかも？w

~~その後、星空の下で、みんなで再度熱唱する。~~
~~サプライズが終わったら真也を「人間神輿」でお店へ移動し、飲み直し。~~

サプライズが終わったら主旨を伝えて、会場へ移動。(まさやん)

~~ここで、節子のビデオレターを流して再サプライズ。~~

二人の感動はいったいどうなってしまうのか！！

## 役割
####2人の誘導：たかしぃ
```
2人を歩道橋へ誘導する。むりくりでも白々しくでも良い。
バラを受け取りさせながら、歩道橋の奥へ進める。
```
~~当日は悟られること無く2人を呑みに連れ出し出来るだけ呑んで待つ。案内係からの連絡を受け、ポイントへ移動。日頃は通らない場所に向かうことが想定されるため誘導テクが必要。~~

####パーティー進行：まさやん、うめ
```
企画の盛り上げ、細部の調整、アドリブでの進行。
当日の周囲の空気が未知数なのでやり切る勇気が必要。
```
####案内係：さとるん、もこやん
```
全体を見渡し2人の誘導時間の決定、サプライズ開始の合図、場合によっては周囲の整理も必要
```
####オーディエンス：参加者全員
```
一体感を出して場を盛り上げる
```
####最初のバラを渡す人たち：
```
最初の1本は限りなく爽やかに。
```
~~2人との関係が遠い方が顔バレせず良い。もしくは、帽子を深々と被ってもらう~~
####シンガー：麻夕美幼なじみのゆうこまん
```
「愛を込めて花束を」を熱唱する
```
####ビデオ撮影：◯◯◯(2人〜3人)
```
いろいろ撮影する
```
####神輿：◯◯◯(4〜6人)
```
落とさないようにお店まで担ぎ続ける
```
####ビデオレター：たかしぃ
```
母節子が真也誕生秘話を暴露？
7/11までに撮影を完了する
```
####ビデオレター編集：さとるん
```
字幕を入れたり音をつけたり。
```
####手紙作成：みっきー(名前がわからなくなった)
```
思い出の話が綴られた手紙を作成し、ビデオへテロップとして入れる。
期限：7月18日
```
####バラ購入：まさやん(受け取り：たかぼん)
```
1輪バラ25本手配(まさやん)
江坂の店に取りに行く(たかぼん)
1本づつ渡すので花束というよりダンボール箱に入っている方がよいかも？
```
####宴会場探し：大阪組(さとるん、もこやん、たかぼん、じゅん)
```
30人くらいのカラオケorパーティールーム（ビデオを流せること必須）
21:30〜2時間
```


##場所
阪神前歩道橋
http://www.smart-acs.com/poi/poi-detail.php?pid=8710

~~梅新東歩道橋~~
~~http://www.kita-umeda.com/sight/10094/~~

~~交差点~~
~~梅田新道、駅前ビル辺り~~

##懸念点
* おまわりさんに注意されないか
* ~~ストリートシンガーが無理な場合、構成(あらすじ)を少し変更する必要あり~~
* 宴会の場(カラオケボックス？)の決定
* ~~最初のバラを渡す人（見知らぬ人）の選出~~
* 「愛をこめて花束を」を各自暗記・練習しておくこと！

##歌詞
Superfly - 愛をこめて花束を
https://www.youtube.com/watch?v=gU5oN0KVofU

ゆうこまんが最後にバラを麻夕美ちゃんに渡して、Bメロから歌い始めてサビは全員で合唱とゆう流れでシンプルな感じでいきましょう♪♪

【ゆうこまんソロ】
約束したとおりあなたとここにこられて本当によかったわ
この込み上がる気持ちが愛じゃないなら なにが愛かわからないほど

【全員で】
愛を込めて花束を大袈裟だけど受け取って
理由なんて聞かないでよね
今だけすべて忘れて
笑わないで受け止めて
照れていないで

【ゆうこまん&全員】
いつまでもそばにいて

#ビデオレター
Shinya&Mayumi - SurpriseParty: 
https://youtu.be/O7_kOJKdjek

#いつまでもお幸せに

Congratulations on your wedding! We wish you a long happy married life.
2015.7.31
by 愉快ななかまたち
Windows環境のOpenSSLで失効した証明書のリストをTomcatに反映させる

本ドキュメントは  [Windows環境のOpenSSLでクライアント認証するまでの流れ](http://qiita.com/alpha_pz/items/4cefda5110e622023acc) の続きです。

# 証明書を失効する仕組み

発行した電子証明書を、何らかの理由で無効化したい場合があります。電子証明書を無効化することを失効（Revoke）と言います。証明書の失効は、証明書を発行したCAが実施します。

CAは証明書を発行する以外にも、失効した証明書の番号をリスト化して公開します。このリストをCRL(証明書失効リスト）と呼びます。

## 証明書を失効する

証明書の失効は次のコマンドを入力します。

```openssl.exe
OpenSSL> ca -revoke client.crt -config openssl.cfg
Using configuration from openssl.cfg
Loading 'screen' into random state - done
Revoking Certificate 00.
Data Base Updated
```

revokeの次に、失効する証明書のファイル名を追加します。実際にはOpenSSLが管理している証明書の番号を証明書失効リストに記載します。

> Revoking Certificate 00. にある 00 がこの証明書の番号ですね。

## 証明書失効リスト(CRL)を発行する

CRLの発行をします。以下のコマンドで、現在失効リストに載っている証明書のリストをCAの署名つきで出力します。

```openssl.exe
OpenSSL> ca -gencrl -out crl.crl -keyfile ca.key -cert ca.crt -config openssl.cfg -verbose
Using configuration from openssl.cfg
Loading 'screen' into random state - done
R       160616042936Z   150618014934Z   00      unknown /C=JP/ST=Tokyo/O=Capybara-Private/OU=PrivateSection/CN=A-pZ/emailAddress=a-pz@a-pz.jp
V       160616043703Z           01      unknown /C=JP/ST=Tokyo/O=Capybara-Server/OU=Tokyo/CN=JP
V       160616050432Z           02      unknown /C=JP/ST=Tokyo/O=Capybara/OU=Capybara-Server/CN=127.0.0.1
V       160617001737Z           03      unknown /C=JP/ST=Tokyo/O=Capybara/OU=Capybara-Server/CN=10.5.6.39
4 entries loaded from the database
generating index
making CRL
signing CRL
OpenSSL>
```
> 証明書失効の状況がわかりやすいよう、-verboseオプションをつけて出力しています。特に確認が不要でしたら-verboseは記載せずにお使いください。

証明書失効リストが、crl.crl で出力されます。エクスプローラからも参照できますのでお試しください。

![crl.png](https://qiita-image-store.s3.amazonaws.com/0/13268/5e2d7f01-dde0-ef86-bc0a-d1603addb33e.png)

## 証明書失効リストをTomcatに読みこむ

Tomcatの設定ファイルである server.xml のSSL接続設定に、CRLファイルの指定を追加します。

```xml:server.xml
<Connector 	maxThreads="150" port="8443"
			protocol="org.apache.coyote.http11.Http11NioProtocol"
			scheme="https" secure="true" sslProtocol="TLS"
			…(省略)…
			crlFile="./conf/crl.crl"
			/>
```

以上で完了です。Tomcat8を起動し、Webアプリケーションへアクセスすると証明書選択のダイアログが表示されますので、1つ選びます。

![crlcheck.png](https://qiita-image-store.s3.amazonaws.com/0/13268/df7c1960-6c58-671d-ffee-0ad754680ca6.png)

なお、失効した証明書も表示され、失効した証明書を選択すると、ブラウザ標準のエラー画面が表示されます。
Swiftkey キーボードアプリの脆弱性について

## 脆弱性の内容

[JVN のデータ](http://jvn.jp/vu/JVNVU94598171/)より。

> Samsung Galaxy S には Swiftkey キーボードアプリがプリインストールされています。この Swiftkey は Samsung の署名がなされており、システム権限で動作します。Swiftkey は言語パックのアップデートを定期的に確認しますが、この通信は HTTP 経由で行われています。中間者攻撃によってこの通信内容を改ざんされると、当該機器への任意のデータ書き込みに悪用される可能性があります。

いわゆる中間者攻撃（man-in-the-middle attack）は利用できる状況が限られるため影響度はそれほど大きくないが，「[6億台に影響する](http://www.itmedia.co.jp/news/articles/1506/17/news061.html)」とも言われ，影響範囲が広い。

## 影響度

[Vulnerability Note VU#155412](http://www.kb.cert.org/vuls/id/155412) より

CVSS 基本値 5.7 (AV:A/AC:M/Au:N/C:N/I:C/A:N)

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | 隣接ネットワーク（A） |
| 攻撃条件の複雑さ（AC）                  | 中（M）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | なし（N）         |
| 情報改ざんの可能性（完全性への影響, I） | 全面的（C）       |
| 業務停止の可能性（可用性への影響, A）   | なし（N）         |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

## 影響を受ける実装

Galaxy S4 Mini, S4, S5, S6

- Swiftkey キーボードアプリは削除できない
- 端末ベンダである Samsung から通信キャリアに対してはアップデートを提供済み
- キャリアからユーザに配布されているかどうかは確認できていない。アップデートする際はキャリアから提供されるものを適用すること
- キャリアからユーザに対しアップデートが提供されていない場合は，以下の点に気を付けて回避すること
    - 公衆無線 LAN サービスなど，信頼できないネットワークを使用しないこと

## 参考ページ

- [JVNVU#94598171: Samsung Galaxy S にプリインストールされた Swiftkey が言語パックのアップデートを正しく検証しない脆弱性](http://jvn.jp/vu/JVNVU94598171/)
- [Samsung Galaxyに深刻な脆弱性、6億台に影響か - ITmedia ニュース](http://www.itmedia.co.jp/news/articles/1506/17/news061.html)

> この脆弱性を悪用された場合、端末のセンサーやGPS、カメラ、マイクなどへのアクセス、悪質なアプリのインストール、他のアプリや電話の機能の改ざん、メッセージや通話の盗聴、個人情報へのアクセスなどに利用される恐れがあるとしている。

- [Samsung、Galaxyの脆弱性に対応へ - ITmedia エンタープライズ](http://www.itmedia.co.jp/enterprise/articles/1506/19/news053.html)
Macでpyenv-virtualenvを使用したDjango開発環境の構築


#### インストールしたもの
+ pyenv
+ pyenv-virtualenv
+ django

をインストールする
（pyenv-virtualenvを入れたら、pyenvは入れなくても大丈夫かも）

#### pyenvのインストール
```
$ brew install pyenv
$ brew install pyenv-virtualenv
```

####bashrcに設定を追加
```
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
```

#### pyenvの最新版をインストール（2015/06/17時点では3.4.3）

```
$ pyenv install 3.4.3
```

#### pyenvとvirtualenvでDjangoのpython仮想環境の構築
```
$ pyenv virtualenv 3.4.3 django
```

#### Django用のアプリを配置するディレクトリを作成
```
mkdir ~/workspace/django
cd ~/workspace/django
```

#### 仮想化の設定
```
pyenv local django
```

#### pipのversionを上げる
```
$ pip install --upgrade pip
```

#### djangoのインストール
```
$ pip install django
```

#### djangoのプロジェクトを作成
```
$ django-admin.py startproject mysite
```

#### 作成したmysiteへ移動
```
$ cd mysite/
```

#### migration
```
$ python manage.py migrate
```

#### 実行
```
python manage.py runserver
```

http://127.0.0.1:8000/
に接続して It worked!と表示されたらok

### 参考URL
http://qiita.com/kaki_k/items/e824cfcf089e75d43551
http://qiita.com/maosanhioro/items/47a52f96fefba7126f9b
std::fill_nをmemcpyで書いてみた

# はじめに

インテルコンパイラでコンパイルすると、たまに_intel_fast_memcpyって関数が呼ばれている。これが何やってるかわからないが、もし速くメモリコピーできる手段があるならそれを使えばfillも速くなるんじゃないかと思ってやってみた。

# コード

コードはこんな感じ。fillforが普通にfor文回してfill。myfillはmemcpyを使って倍々ゲームでデータをコピーしていく。

```cpp:fill.cc
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <sys/time.h>
#include <stdint.h>

const int S = 28;
const int N = (1<<S)-1;
int a[N];

double mytime(void){
  timeval tv;
  gettimeofday(&tv,NULL);
  return tv.tv_sec + (double)tv.tv_usec*1e-6;
}

void
myfill(int *a, const int N, const int value){
  a[0] = value;
  for(int i=0;i<S;i++){
    const int s = 1 << i;
    memcpy((void*)(&a[s]),(void*)(&a[0]),s*sizeof(int));
  }
}

void
fillfor(int *a, const int N, const int value){
  for(int i=0;i<N;i++){
    a[i] = value;
  }
}

#define measure(func,name) {\
  double s1 = mytime();\
  func(a,N,12345);\
  double s2 = mytime();\
  printf("%s %f\n",name,s2-s1);};

int
main(void){
  printf("N=%d\n",N);
  std::fill_n(a,N,0); //最初に触っておく
  measure(std::fill_n,"fill_n  ");
  measure(fillfor    ,"fillfore");
  measure(myfill     ,"myfill  ");
  for(int i=0;i<N;i++){ //一応チェック
    if(a[i] != 12345){
      printf("Error\n");
    }
  }
}

```

環境はIntel(R) Core(TM) i7-2700K CPU @ 3.50GHz、キャッシュ  8192 KB。コンパイラのバージョンはそれぞれ以下の通り。

```shell-session
$ icpc --version
icpc (ICC) 12.1.4 20120410
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.

$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
```
若干古いが気にしない。

# 実行結果

```shell-session
$ g++ -O0 fill.cc;./a.out 
N=268435455
fill_n   0.479488
fillfore 0.617751
myfill   0.125472

$ g++ -O3 fill.cc;./a.out 
N=268435455
fill_n   0.115933
fillfore 0.115964
myfill   0.130052

$ icpc -O0 fill.cc;./a.out 
N=268435455
fill_n   0.490290
fillfore 0.596837
myfill   0.126500

$ icpc -O3 fill.cc;./a.out 
N=268435455
fill_n   0.055505
fillfore 0.055506
myfill   0.141159
```

というわけで、最適化無しだとmemcpyで倍々ゲームが速かったが、最適化したらfill_nとfor文は同じで、memcpy呼ぶ奴は遅くなった。

# ストリーミングSIMDの効果

吐いたコード見てみると、g++は愚直にmovdqaで一個ずつデータをコピーしてる。icpcも、配列サイズを知らせないとmovdqaを吐くが、サイズを教えてやるとmovntdq (ストリーミング SIMD命令)出している。memcpy呼ぶ奴は、想定通り内部で_intel_fast_memcpyをcallしている。

g++との性能差がストリーミングSIMD命令で決まってるか確認するため、icpcにストリーミングSIMDを出させるかどうか指示する。指示オプションは-opt-streaming-storesで、デフォルトはauto (コンパイラに判断させる)。

```shell-session
$ icpc -O3 -opt-streaming-stores never fill.cc;./a.out # 絶対使うな
N=268435455
fill_n   0.115863
fillfore 0.115882
myfill   0.137723

$ icpc -O3 -opt-streaming-stores always fill.cc;./a.out # 絶対使え
N=268435455
fill_n   0.056443
fillfore 0.056552
myfill   0.141629
```

ということなので、g++との性能差はストリーミングSIMD命令の有無の模様。これだけのサイズだとキャッシュに収まらないので、最初からキャッシュを介さずにストアしてしまったほうが速い。

# まとめ

for文とstd::fill_nは性能が同じで、かつ速いので、変に工夫せず普通にstd::fill_nを使えば良さそう。
シェルスクリプト内でaliasを設定する

## シェルスクリプト内でaliasを設定する要因

作成したシェルスクリプトを様々な環境で使用する場合に、aliasをシェルスクリプト内で設定したかった。
bash_profileなどに入れると他の環境で叩いた時に解決出来ないため。

以下、サンプルスクリプト。

~~~sh
#!/bin/bash

shopt -s expand_aliases

# GNUとBSDのsedでは-iのサフィックス仕様が異なる
if sed --version 2>/dev/null | grep -q GNU; then
  alias sedi='sed -i '
else
  alias sedi='sed -i "" '
fi

sedi -e “s/aaa/bbb/g” test.txt
~~~

通常aliasはインタラクティブシェルでしか機能しません。
bashの場合はexpand_aliasesをセットすればaliasが展開されます。
ACCESSにADO.NETでアクセスする場合のトランザクション制御 #4

#複数のDataTableの変更を同時にDBに反映する際のトランザクション制御

##DBからDataTableへの読み出し

```C#:DBからDataTableへの読み出し
OleDbConnection CONN = new OleDbConnection();
CONN.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.xxxx";    // 記述省略

String sql = "SELECT 名前, 年齢 FROM 従業員;
OleDbDataAdapter DA = new OleDbDataAdapter(sql, CONN);
DataTable DT = new DataTable();
DT.TableName = "従業員DT";
DA.Fill(DT);

String sql2 = "SELECT 部署名, 住所 FROM 部署;
OleDbDataAdapter DA2 = new OleDbDataAdapter(sql2, CONN);
DataTable DT2 = new DataTable();
DT2.TableName = "部署DT";
DA2.Fill(DT2);
```


##トランザクション制御なしの更新

```C#:トランザクション制御なしの更新
OleDbCommandBuilder CB = new OleDbCommandBuilder(DA);
OleDbCommandBuilder CB2 = new OleDbCommandBuilder(DA2);
try
{
    DA.Update(DT);
    DA2.Update(DT2);
}
catch (Exception ex)
{
    textBox.Text = "エラーが発生しました。" + ex.Message;
}
```


##トランザクション制御ありの更新

```C#:トランザクション制御ありの更新
OleDbCommandBuilder CB = new OleDbCommandBuilder(DA);

DA.InsertCommand = CB.GetInsertCommand();
DA.UpdateCommand = CB.GetUpdateCommand();
DA.DeleteCommand = CB.GetDeleteCommand();

OleDbCommandBuilder CB2 = new OleDbCommandBuilder(DA2);

DA2.InsertCommand = CB2.GetInsertCommand();
DA2.UpdateCommand = CB2.GetUpdateCommand();
DA2.DeleteCommand = CB2.GetDeleteCommand();

CONN.Open();

OleDbTransaction TRN = CONN.BeginTransaction(IsolationLevel.ReadCommitted);

DA.InsertCommand.Transaction = TRN;
DA.UpdateCommand.Transaction = TRN;
DA.DeleteCommand.Transaction = TRN;

DA2.InsertCommand.Transaction = TRN;
DA2.UpdateCommand.Transaction = TRN;
DA2.DeleteCommand.Transaction = TRN;

try
{
    DA.Update(DT);
    DA2.Update(DT2);
    TRN.Commit();
}
catch (Exception ex)
{
    TRN.Rollback();
    textBox.Text = "エラーが発生したのでロールバックしました。" + ex.Message;
}
finally
{
    CONN.Close();
}
```

・[ACCESSにADO.NETでアクセスする場合のトランザクション制御 #1](http://qiita.com/kakunodatenow/items/a882b9a5281175399c64)
・[非接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/05648f618c2e4e201066)
・[接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/bd958484c3bf692df80f)
・複数のDataTableの変更を同時にDBに反映する際のトランザクション制御
・[接続型、非接続型が混在した更新のトランザクション制御](http://qiita.com/kakunodatenow/items/79da9eeeadb7ad83c066)
・[トランザクション制御に関する分かり難いエラーメッセージ](http://qiita.com/kakunodatenow/items/f58275921859cda61fc1)
[rails][gem]action_args、permitsの使い方。



form_forとかstrong paramsとか、感覚的に使っている人も多いと思うんですが、
たまに詰まったのでちょっとずつまとめます。
今回はaction_argsというgemfileを用いて、メソッドのparameterの管理についてまとめます。


### [ActionArgs 公式ドキュメント](https://github.com/asakusarb/action_args)

# StrongParameters - permit



### 1. 一列で一気に宣言する方法
ハッシュを用いて、簡単にStrongParameterのpermitメソッドを記述できる。

```
class UsersController < ApplicationControllerCOnt
 
  def create(user)
    @user = User.new(user.permit(:name, :age))
    ~~~
  end
end

```

### 2. ありのままに、ホワイトリストを記述する方法(ブラックリストの反対)

ActionArgsは、controllerのclassに、ありのままのpermitsを記述する機能を提供している。
包括的な方法でpermitsをDRYに書きなさい。

```
class UsersController < ApplicationController
  permits :name, :age
  
  def create(user)
    @user = User.new(user)
    ~~~
  end
end
```  

#### ActionArgsは、ターゲットのモデルの名前をコントローラの名前から推定している。例えば、UsersControllerのpermitsは、モデルの名前をUserだと認識している。 もし、違ったら、オプションで指定することも出来るよ。


```
class UsersController < ApplicationController
  permits :name, :age, model_name: 'User'

end
```
電子回路 > 交流の平均値 2/pi * Vm

交流の最大電圧Vmの時、「平均電圧」Vavは以下の通り与えられる。

```math
Vav = \frac{2}{π}V_m 
```

こういう値(2/pi*V_m)は簡単に忘れてしまいます。でも忘れても以下の理屈で得ることができます。

#覚えておくこと
1. sinの0からpiの区間の平均値を求める
2. 振幅を求める

#それぞれの計算

1. sinの0からpiの区間の平均値: 1/pi
2. 振幅: -VmからVmの幅 = 2*Vm

上記の1と2を掛け合わせると  2/pi * Vmとなります。

sinの平均値は以下ですね。

```math
\int_0^{\pi}{sinx dx} = [-cosxdx]_0^{\pi} = (-0) - (-1) = 1
```

積分値1を区間[0, pi]で平均すれば平均値がでます。1/(pi-0)=1/pi がsinの平均値ですね。
ファイルサイズをディレクトリ（フォルダ）単位でみたいとき

HDDが心もとない自宅サーバーでどいつが容量食ってるかよく調べるので。
`du -hx --max-depth=1 <パス名> `
例）
```[root@hoge]du -hx --max-depth=1 /home/vpopmail/domains/
72K     /home/vpopmail/domains/hoge1.com
2.7M    /home/vpopmail/domains/hoge2.com
26M     /home/vpopmail/domains/hoge3.com
28M     /home/vpopmail/domains/
```
tmux備忘

自分用めも。

#コマンド

##■セッション
###＊名前をつけてセッションを作成
```
tmux new -s my_session
```

###＊セッション一覧
```
tmux list-session
```

##■ウィンドウ
###＊ウィンドウ追加
```
c-b c
```

###＊番号を指定して移動
```
c-b [ウィンドウの番号]
```

###＊ウィンドウ名の変更
```
c-b ,
```

##■分割
1ウィンドウ内を分割できるほげえ

###＊縦分割
```
C-b %
```

###＊横分割
```
C-b "
```

###＊分割解除
```
C-b !
```

###＊分割したやつの間を移動
```
C-b o
```
https、no-cache、IE8以前で特定のcontent-typeが表示・ダウンロードできない件の対応

https、no-cacheに設定しているとIE8以前のブラウザで特定のcontent-typeの場合に警告が出て表示できなかったりします。そんな場合は、下記のようにヘッダ情報をcache有効に設定すると表示・ダウンロード等ができるようになります。

```ruby:sample_controller
   def hoge
        response.headers['Cache-Control'] = 'public'
        response.headers['Pragma'] = 'public
   end
```
キャッシュさせるとまずい場合は、view側でランダムなクエリストリングをつけるようにすると良いでしょう。
```ruby: sample.erb
  = link_to 'ダウンロード', sample_hoge_path(s: SecureRandom.uuid)
```
Icinga 1のマイナーバージョンのアップデートメモ


Icingaを1.12.2から1.13.2にアップデートしたときのメモ。

現在のバーションを確認。

```bash
$ icinga --version

Icinga 1.12.2
Copyright (c) 2009-2015 Icinga Development Team (http://www.icinga.org)
Copyright (c) 2009-2013 Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 02-14-2015
License: GPL

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

```

yumでインストールしているので`yum update`する。

```bash
$ sudo yum update icinga icinga-gui*

$ sudo service icinga restart
```

ログを見るとエラーになっている。

```/var/log/icinga/icinga.log
[1434038216] Icinga 1.13.2 starting... (PID=1692)
[1434038216] Local time is Fri Jun 12 00:56:56 JST 2015
[1434038216] LOG VERSION: 2.0
[1434038216] idomod: IDOMOD 1.13.2 (04-08-2015) Copyright(c) 2005-2008 Ethan Galstad, Copyright(c) 2009-2015 Icinga Development Team (https://www.icinga.org)
[1434038216] idomod: Could not open data sink!  I'll keep trying, but some output may get lost. Is ido2db running and processing data?
[1434038216] Event broker module 'IDOMOD' version '1.13.2' from '/usr/lib64/icinga/idomod.so' initialized successfully.
[1434038216] Finished daemonizing... (New PID=1693)
```

アップデートしたことによってRDBMS(今回はMySQL)のスキーマも変更になったのが原因みたい。
したがってスキーマの変更を行う。

```bash
$ mysql -u root -p -h localhost icinga < /usr/share/doc/icinga-idoutils-libdbi-mysql-1.13.2/db/mysql/upgrade/mysql-upgrade-1.13.0.sql

$ sudo service ido2db restart
Stopping Ido2db: done.
Starting Ido2db: done.

$ sudo service icinga restart
Running configuration check...OK
Stopping Icinga: Waiting for icinga to exit ..Stopping icinga done.
Starting icinga: Starting icinga done.
```

```/var/log/icinga/icinga.log
[1434596529] Warning: config setting 'event_profiling_enabled' unknown. Remove it from your configuration!
[1434596529] Icinga 1.13.2 starting... (PID=25008)
[1434596529] Local time is Thu Jun 18 12:02:09 JST 2015
[1434596529] LOG VERSION: 2.0
[1434596529] idomod: IDOMOD 1.13.2 (04-08-2015) Copyright(c) 2005-2008 Ethan Galstad, Copyright(c) 2009-2015 Icinga Development Team (https://www.icinga.org)
[1434596529] idomod: Successfully connected to data sink.  10 queued items to flush.
[1434596529] idomod: Successfully flushed 10 queued items to data sink.
[1434596529] Event broker module 'IDOMOD' version '1.13.2' from '/usr/lib64/icinga/idomod.so' initialized successfully.
[1434596529] Finished daemonizing... (New PID=25013)
[1434596529] Event loop started...
```
オレオレInputModuleの作り方

# 目的

標準のInputModuleでは、複数のドラッグを同時に行った際のpositionが
それぞれのドラッグの中点になってしまうという仕様(?)がある。
そのため、バーチャルスティック2つなどを作ろうとするとうまく動かないため
InputModuleを自作して多重ドラッグに対応させる。

* ちなみに、ドラッグの中点になってしまう仕様については以下の2点を満たすときのみ発生するようです。  
つまり、今回作ったオレオレInputModuleはいらない子・・・
    * mousePosition を参照している。
    * simulateMouseWithTouches が true

# 概要

* [BaseInputModule](http://docs.unity3d.com/460/Documentation/ScriptReference/EventSystems.BaseInputModule.html)を継承したオレオレInputModuleで  
[UnityEngine.Input](http://docs.unity3d.com/ScriptReference/Input.html)を駆使してドラッグ情報を通知する。

# やったこと

## BaseInputModuleを継承したクラスを作る

```
public class DragInputModule : BaseInputModule {
    public override void Process(){}
}
```

## EventSystemというGameObject(uGUIを作成すると勝手に作られるオブジェクト)に  
上記のコンポーネントを付ける
## Process()内でInput.Touchesの状態を見つつドラッグの開始/ドラッグ中/終了の状態を判定する(コード割愛)
* 参考 : https://gist.github.com/stramit/b654082eb226492d9a04

## 送り先のメソッドを定義したインターフェースを作成
* [未検証]この時、 IEventSystemHandler を継承して作るのが正しいと思うが、  
実際に組んでみると継承しなくても実現できた。
* 参考 : https://gist.github.com/stramit/76e53efd67a2e1cf3d2f

## 送るパラメータを定義する
* [未検証]この時、 BaseEventData (以下同文)
* 参考 : https://gist.github.com/stramit/76e53efd67a2e1cf3d2f

## 送る対象を検索する
* 検索用にPointerEventDataを用意する  
    * eventSystem は BaseInputModule の時点で定義されている

        ```csharp
        var data = new PointerEventData( this.eventSystem );
        data.position    = beginPoint;
        data.delta       = Vector2.zero;
        data.scrollDelta = Vector2.zero;
        ```

* 検索処理
    * m_RaycastResultCache は (以下同文)

        ```csharp
        this.eventSystem.RaycastAll( data, m_RaycastResultCache );
        var target = this.FindFirstRaycast( m_RaycastResultCache );
        m_RaycastResultCache.Clear();
        ```

* 今回の場合はドラッグ開始地点のtargetをキャッシュする必要があったのでGetComponentで取っておいた。

```csharp
target.gameObject.GetComponent<IOriginalHandler>();
```

## ターゲットに向けてデータを配信する

```csharp
target.OriginalEvent( OriginalData );
```

* 正式な実装だとExecuteEvents.Executeを使うらしいが、使わなくてもどうにかなった。
    * 参考 : http://docs.unity3d.com/ScriptReference/Input.html

## イベントを受け取る
* 自作のインターフェースを継承したコンポーネントを作成する(コード割愛)

# Process()とUpdateModule()

* Process()で処理を実行していたが、毎フレーム呼び出されているわけではない模様
    * 何か実装方法が悪いのかもしれないが、UpdateModule()だとうまくいっているのでそれで実装をすすめている。
        * インターフェースを直接触っているので問題がないだけかもしれない。
* リファレンス
    * [Process](http://docs.unity3d.com/460/Documentation/ScriptReference/EventSystems.BaseInputModule.Process.html)
    * [UpdateModule](http://docs.unity3d.com/460/Documentation/ScriptReference/EventSystems.BaseInputModule.UpdateModule.html)

# simulateMouseWithTouches

* ここまでやっても、 simulateMouseWithTouches == true の状態で  
mousePosition を参照するとタップ位置全体の平均点が帰ってくるらしい。
    * [simulateMouseWithTouches](http://docs.unity3d.com/460/Documentation/ScriptReference/Input-simulateMouseWithTouches.html)
    * 参考 : http://answers.unity3d.com/questions/180987/inputmouseposition-equivalent-to-first-finger-touc.html#

# 参考
* [Unity 4.6 から利用できる UI での EventSystem をカスタムする方法について調べてみた](http://tips.hecomi.com/entry/2014/09/25/233823)
ACCESSにADO.NETでアクセスする場合のトランザクション制御 #3


#接続型の更新処理


二つのUPDATE文を発行する場合を例に示す。
トランザクション制御を行なわないと、二つ目のUPDATE文がエラーになっても一つ目のUPDATE文はROLLBACKされない。


##トランザクション制御なしの更新

```C#:トランザクション制御なしの更新
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN;    // CONNはOleDbConnection。定義の記述を省略。
CONN.Open();

try
{
    CMD.CommandText = "UPDATE 部署テーブル xxx";      // 記述省略
    CMD.ExecuteNonQuery();

    CMD.CommandText = "UPDATE 従業員テーブル xxx";    // 記述省略
    CMD.ExecuteNonQuery();
}
catch (Exception ex)
{
    textBox.Text = "エラーが発生しました。" + ex.Message;
}
finally
{
    CONN.Close();
}
```


##トランザクション制御ありの更新

```C#:トランザクション制御ありの更新
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN;    // CONNはOleDbConnection。記述を省略。
CONN.Open();

OleDbTransaction TRN = CONN.BeginTransaction(IsolationLevel.ReadCommitted);
CMD.Transaction = TRN;

try
{
    CMD.CommandText = "UPDATE 部署テーブル xxx";      // 記述省略
    CMD.ExecuteNonQuery();

    CMD.CommandText = "UPDATE 従業員テーブル xxx";    // 記述省略
    CMD.ExecuteNonQuery();

    TRN.Commit();
}
catch (Exception ex)
{
    TRN.Rollback();
    textBox.Text = "エラーが発生したのでロールバックしました。" + ex.Message;
}
finally
{
  CONN.Close();
}
```


参考：[SqlTransaction.Rollback メソッド](https://msdn.microsoft.com/ja-jp/library/zayx5s0h%28v=vs.110%29.aspx)

・[ACCESSにADO.NETでアクセスする場合のトランザクション制御 #1](http://qiita.com/kakunodatenow/items/a882b9a5281175399c64)
・[非接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/05648f618c2e4e201066)
・接続型のトランザクション制御
・[複数のDataTableの変更を同時にDBに反映する際のトランザクション制御](http://qiita.com/kakunodatenow/items/2a44ac5492a77a59b758)
・[接続型、非接続型が混在した更新のトランザクション制御](http://qiita.com/kakunodatenow/items/79da9eeeadb7ad83c066)
・[トランザクション制御に関する分かり難いエラーメッセージ](http://qiita.com/kakunodatenow/items/f58275921859cda61fc1)
node.jsで超簡単検証用HTTPサーバー

# 前置き

Chromeがいつの間にやらローカルファイルのスクリプトを実行できなくなっていた。。。

仕方がないのでWebサーバーを用意しましょうか。
ってすでに端末にはApacheやらTomcatやらZendやらいろんなやつが存在してるのにさらにサーバーモジュール導入とか嫌だなぁ。
かといってすでにあるやつは諸事情で流用できない。。

ということで、導入もポート設定も何もかも超お手軽なnode.js + connectで検証/お遊び用Webサーバー作りました。
その備忘録。


# 道具をそろえる

node.jsでいこう！なので、node.jsは当然いるとして。

* connect
* serve-static

この2つをnpmでインストールします。

```install
npm install connect
npm install serve-static
```


# サーバースクリプトを書く

道具の準備ができたらそれを使っていきましょう。
要はサーバーとして動作させるためのスクリプトを書きます。

```js:app.js
var connect = require('connect'),
    serveStatic = require('serve-static');

var app = connect();

app.use(serveStatic(__dirname));
app.listen(5000);
```

これだけです。
「__dirname」はカレントディレクトリをドキュメントルートにしますということ、
「5000」は使うポートが5000だよということを意味しています。


# 動かす

準備が済んだら動かします。
node.js用の単なるスクリプトなので

```execute
node app.js
```

これでおしまい。
ブラウザ開いて「http://localhost:5000/index.html」とか開いてみましょう。
AngularJSに関数登録時、newされる・newされないケースを調べてみた

## テストコード

```html:check.html
<div ng-controller="NewCheckController as vm">
  <ul>
    <li><new-check-directive></new-check-directive></li>
    <li><strong>{{vm.factoryMsg}}</strong></li>
    <li><strong>{{vm.serviceMsg}}</strong></li>
  </ul>
</div>
```

```js:check.js
//config
;(function(){
  angular.module('app').config(config);
  function config(){
    console.log('Config');
    console.log(this.isNew ? 'newされる' : 'newされない');
  }
  config.prototype.isNew = true;
})();

//controller
;(function(){
  angular.module('app').controller('NewCheckController', Controller)
  function Controller(
    NewCheckFactory,
    NewCheckService
  ){
    console.log('Controller');
    console.log(this.isNew ? 'newされる' : 'newされない');
    this.factoryMsg = NewCheckFactory.getMessage();
    this.serviceMsg = NewCheckService.getMessage();
  }  
  Controller.prototype.isNew = true;
})();

//directive
;(function(){
  angular.module('app').directive('newCheckDirective', directiveFactory);
  function directiveFactory(){
    console.log('Directive');
    console.log(this.isNew ? 'newされる' : 'newされない');
    return new Directive('directive()にはdirectiveのfactory関数を指定します');
  }
  directiveFactory.prototype.isNew = true;

  function Directive(msg){
    this.msg = msg;
  }
  Directive.prototype = {
    template: function(){
      return '<strong>'+this.msg+'</strong>'
    }
  }
})();

//factory
;(function(){
  angular.module('app').factory('NewCheckFactory', serviceFactory)
  function serviceFactory(){
    console.log('Factory');
    console.log(this.isNew ? 'newされる' : 'newされない');
    return new Service('factory()にはserviceのfactory関数を指定します');
  }  
  serviceFactory.prototype.isNew = true;

  function Service(msg){
    this.msg = msg;
  }
  Service.prototype = {
    getMessage: function(){
      return this.msg;
    }
  }
})();

//service
;(function(){
  angular.module('app').service('NewCheckService', Service)
  function Service(){
    console.log('Service');
    console.log(this.isNew ? 'newされる' : 'newされない');
    this.msg = 'service()にはserviceのコンストラクタを指定します'
  }
  Service.prototype = {
    isNew: true,
    getMessage: function(){
      return this.msg;
    }
  }
})();
```

## 結果

![newcheck.png](https://qiita-image-store.s3.amazonaws.com/0/15637/9ad37427-ba41-82d8-d96c-951749cb8faf.png)

- Config
  - newされない
- Directive
  - newされない
- Factory
  - newされない
- Service
  - newされる 
- Controller
  - newされる
ちょっと古い Oracle Java 8 だと型推論が上限境界付きを認識しないケース

ローカル環境は 8u45 で Jenkins が 8u11 で、この時、下記コードは Jenkins でのみコンパイルができないってことがあった。型推論が失敗しているっぽい。

問題になったコードを短くしたもの:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Main.java
import static java.util.stream.Collectors.toMap;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<? extends CharSequence> cs = Arrays.asList("a", "b", "cef");
        Map<? extends CharSequence, Integer> m = cs.stream().collect(toMap(
                c -> c,
                c -> c.length()));
        System.out.println(m);
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

それぞれでコンパイルしてみる:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash:8u45（OKなケース）
$ javac -version
javac 1.8.0_45
$ javac Main.java
$ echo $?
0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash:8u11（ダメなケース）
$ ./jdk1.8.0_11/bin/javac -version
javac 1.8.0_11
$ ./jdk1.8.0_11/bin/javac Main.java
Main.java:9: エラー: シンボルを見つけられません
                c -> c.length()));
                      ^
  シンボル:   メソッド length()
  場所: タイプObjectの変数 c
Main.java:7: エラー: 不適合な型: 推論型が上限に適合しません
        Map<? extends CharSequence, Integer> m = cs.stream().collect(toMap(
                                                                    ^
    推論: Object
    上限: CharSequence,Object
エラー2個
$ echo $?
1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`Collects.toMap` 以外のメソッドや、`#collect` じゃなくて `#map` や `#reduce` も試してみたんだけどこのような問題は起こらなかった。

ちなみに 8u25 でもエラー文言が違うもののコンパイルできない。u31, u40 は登録しないとダウンロードできないようなので諦め。

型推論が賢くなっているというより、バグなのかな？