OmniAICreator/Qiita-1.07M huggingface dataset:
Online Matching and Ad Allocation 勉強会第3回: 5. Adwords

[Online Matching and Ad Allocation](http://algomagic.com/41870-16.pdf) 勉強会のメモ (自分用) です。
証明とか辛いのは省略しています。

# Adwords problem の問題設定

- Online bipartite matching 問題の一般化
- 頂点 $u \in U$ は予算 $B_u$ を持つ
- 辺 $(u, v) \in E$ は入札額 $bid_{uv}$ を持つ
- 次々に到着する頂点 $v \in V$ と $u \in U$ をマッチングさせたい
    - マッチング先の $u$ は、それまでに消化した予算が $B_u$ を超えていないことが条件となる
- この条件において、消化予算を最大化する問題が Adwords problem になる
- この状況はつまり、Sponsored search に相当する
    - $u \in U$ は、広告主を表す
    - $B_u$ は、広告主 $u$ の一日あたりの予算を表す
    - $v \in V$ は広告枠 or クエリを表す
- この章では、広告枠 $v$ に広告主 $u$ の広告が配置された場合に $bid_{uv}$ を課金するものとしている
    - これは first price auction かつ CPM 課金に相当するものだと思えばよさそう
    - 実際の Sponsored search においては、second price auction だったり CPC 課金だったりする


# 5.1 The Small-Bids Assumption

- ここで「１日辺りの予算 $B_u$ に対して、入札額 $bid_{uv}$ はとても小さい」という仮定 small-bids assumption をおく

# 5.2 Adversarial order

## GREEDY アルゴリズム

- $v$ が到着する都度、その $v$ に隣接する広告主 $u$ のうち、最大の入札額を示す広告主とマッチングさせる、というアルゴリズム
- 広告主 $u$ の消化済み予算を $S_u$ としたときに、一日あたりの予算 $B_u$ を超えないようにするために実際の入札額 $\widehat{bid_{uv}}$ を調整 (bid-capping) する

```math
\widehat{bid_{uv}} = \min(bid_{uv}, B_u - S_u)
```

- しかしながら、small-bids assumption の仮定のもとではこの bid-capping を無視できる
- GREEDY アルゴリズムの競合比は $\frac{1}{2}$ となる


### Theorem 5.3 の証明メモ

- アルゴリズムによって割り当てをした結果、生じた損失 (最適値からの乖離) は $Loss = \sum_{v \in V'} (opt_v - alg_v)$ で表される
    - $opt_v$ は、$v$ を最適に割り当てた場合に得られる価値
    - $alg_v$ は、$v$ をアルゴリズムに従って割り当てた場合に得られる価値
    - $V'$ は、最適割り当てに対してアルゴリズムの割り当てが価値的に減少する、つまり $alg_v < opt_v$ の場合の $v$ の集合
        - 割り当てが最適でない $v$ の集合、と言える
- この $Loss$ を、最適配置した場合の広告主 $u \in U$ ごとの損失 $Loss_u$ に分解する
    - $V'_u$ は、$V'$ に含まれる $v$ のうち、最適解では $u \in U$ に割り当てられるものの集合

```math
Loss_u := \sum_{v \in V'_u}{(opt_v - alg_v)} \\
Loss_u \le B_u - \sum_{v \in V'_u}alg_v
```

- (あとは省略)

## BALANCE アルゴリズム

- GREEDY アルゴリズムが入札額のみに着目していたのに対し、BALANCE アルゴリズムは予算消化率に着目する
- 具体的には、すべての広告主の予算消化率を揃えるように、広告枠 $v$ に隣接する広告主 $u$ のうち、最も予算消化率の低い広告主を選んでマッチングさせる


## Online b-Mathcing

- Adwords problem の特殊ケース
    - すべての広告主の予算が $b$ に等しい
    - また入札額は $1$ である
- この特殊ケースにおいては、BALANCE アルゴリズムが最適なアルゴリズムとなる
    - 競合比は $1 - \frac{1}{(1 + 1/b)^b}$ となる
    - これは $b \rightarrow \infty$ とすると、 $1 - \frac{1}{e}$ になる


## MSVV アルゴリズム

- GREEDY と BALANCE のハイブリッドさせたようなアルゴリズムによって、より良い競合比が得られるのではないだろうか
    - Mehta らによるアルゴリズム MSVV が、それに相当する
    - [AdWords and Generalized On-line Matching](http://web.stanford.edu/~saberi/adwords.pdf)
- $x_u$ を、広告主 $u$ の予算消化率 $S_u / B_u$ とし、トレードオフ関数 $\psi(x_u)$ を次のように定義する

```math
\psi(x_u) = 1 - e^{x_u - 1}
```

- この関数 $\psi(x_u)$ によって計算された値を $bid_{uv}$ に乗じた値を *scaled bid* とする
- マッチングでは、この *scaled bid* が大きいものを選択する
    - この *scaled bid* は勝者を決定する処理においてのみ利用し、広告主が払うべき金額は $bid_{uv}$ のままである
- すべての広告主の入札額が等しい場合は、BALANCE アルゴリズムのように振る舞う
- 入札額に大きな隔たりがある場合は、GREEDY アルゴリズムのように振る舞う
    - 入札額が高い広告主の予算消化率が大きく、一方で入札額の低い広告主の予算消化率が小さい場合はその限りではない
- 予算が無限大であれば、GREEDY アルゴリズムとして振る舞う
- このアルゴリズムの競合比は $1 - \frac{1}{e}$ であり、これは最適である

## 5.3 Random Order and IID

- GREEDY の競合比
    - Random Order: $1 - \frac{1}{e}$
    - Unknown IID: $1 - \frac{1}{e}$
- BALANCE の競合比
    - (これ以降は気が向いたら追記する)

## 5.4 General bids
Access VBA 覚書

# 新規テーブルの作成

```
Dim objDB As DAO.Database
Dim objTable As DAO.TableDef
Set objDB = CurrentDb
Set objTable = objDB.CreateTableDef(Name:=table_name)

With objTable.Fields
   .Append objTable.CreateField(field_name1, value_type, value_size)
   .Append objTable.CreateField(field_name2, value_type, value_size)
   .Append objTable.CreateField(field_name3, value_type, value_size)
   .
   .
   .
End With

objDB.TableDefs.Append objTable
Set objTable = Nothing
objDB.Close
Set objDB = Nothing
```

# 新規レコードの追加

```
Dim objRS as Recordset
Set objRS = CurrentDb.OpenRecordset(sql_statement)

objRS.AddNew
objRS(field_name1) = value1
objRS(field_name2) = value2
objRS(field_name3) = value3
.
.
.
objRS.Update
objRS.Close

Set objRS = Nothing
```

# アクションクエリの実行

```
Dim objDB as Database
Dim strSQL as String
Set objDB = CurrentDb
strSQL = sql_statement

objDB.Execute strSQL
objDB.Close

Set objDB = Nothing
```
emscripten File System APIとUNIXコマンド対応表

# emscripten File System APIとUNIXコマンド対応表

## pwd

[FS.cwd](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.cwd)

```js
FS.cwd(); // -> "/"
```

## ls

[FS.lookupPath](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.lookupPath)

```js
Object.keys(FS.lookupPath("/").node.contents); // -> ["tmp", "home", "dev", "proc"]
```

### ファイルの詳しい情報

```js
var contents = FS.lookupPath("/").node.contents;
Object.keys(contents).map(function(name){
  var o = contents[name];
  var attr = FS.stat(o);
  var mode = attr.mode;
  var size = attr.size;
  var ctime = attr.ctime;
  var uid = attr.uid;
  var gid = attr.gid;
  return [
    FS.isFile(mode),
    FS.isDir(mode),
    FS.isLink(mode),
    FS.isFIFO(mode),
    FS.isChrdev(mode),
    FS.isBlkdev(mode),
    FS.isSocket(mode),
    new Date(ctime).toJSON()
  ];
});
```

## cd

[FS.chdir](https://github.com/kripken/emscripten/blob/incoming/src/library_fs.js#L1213)

```js
FS.chdir("/home");
```

## mkdir

[FS.mkdir](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.mkdir)

```js
FS.mkdir("web_user");
```

## rmdir

[FS.rmdir](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.rmdir)

```js
FS.rmdir("web_user");
```

## mv

[FS.rename](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.rename)

```js
FS.rename(oldpath, newpath)
```

## rm

[FS.unlink](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.unlink)

```js
FS.unlink("hoge.txt");
```

## ファイル書き込み

[FS.writeFile](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.writeFile)

### バイナリ書き込み

```js
var somedata = new Uint8Array(something);
FS.writeFile("./hoge.png", somedata, {encoding: "binary"});
```

### テキスト書き込み

```js
FS.writeFile("./hoge.txt", "hello world");
```

### 追加書き込み

```js
FS.writeFile("./hoge.txt", "hello world!", {flags: "a"});
```

## ファイル読み込み

[FS.readFile](https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html#FS.readFile)

### バイナリ読み込み

```js
FS.readFile("hoge.png"); // -> Uint8Array
```

### テキスト読み込み

```js
FS.readFile("hoge.txt", {encoding: "utf8"}); // -> "hello wolrd"
```
structでConvenience Initializerを追加したい、しかしMemberwise initialiserは残したい時の書き方

[GetWild退勤的なセンサーアプリを簡単に作れるフレームワークを作ったのでiPhoneに歯痛を心配されたり色々する](http://qiita.com/oubakiou/items/218b6ed08a6faaf5ee8b)

で得た知見シリーズ

structは何もしなくても勝手にイニシャライザを作ってくれて、それをMemberwise initialiserと呼ぶ

```swift
struct Hoge {
  let foo: String
  let bar: String
}
```

```swift
Hoge(foo:"a", bar:"b")
```

のだけれど、structに自前のイニシャライザを追加してしまうとその時点でMemberwise initialiserが自動生成されなくなってしまい、辛い思いをする事がある。

```swift
struct Hoge {
  let foo: String
  let bar: String

  init(properties: Dictionary<String, AnyObject>) {
    foo = properties["foo"] as! String
    bar = properties["bar"] as! String
  }

  // 辛いという思い
  init(foo: String, bar: String) {
    self.foo = foo
    self.bar = bar
  }
}
```

こういう時はextensionでConvenience Initializerを書くとMemberwise initialiserの自動生成が残る

```swift
struct Hoge {
    let foo: String
    let bar: String
}

extension Hoge {    
    init(properties: Dictionary<String, AnyObject>) {
        self.init(
            foo : properties["foo"] as! String,
            bar : properties["bar"] as! String
        )
    }
}
```
```swift
Hoge(foo:"a", bar:"b")
Hoge(["foo":"a", "bar":"b"])
```

とは言えこれはこれで微妙にあれなので[良い感じ](https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md)になってほしい。

欲を言えば、個別のstructではなく[共通のprotocol extensionにこういうinitWithDictionary/toDictionary的なものを持たせたかった](http://qiita.com/oubakiou/items/b08a318de82efbdab4d1)のだけれど、それはそれで辛い感じになったのでstructで我慢した方が良いという結論に至った。

# 参考にしたもの
http://stackoverflow.com/questions/34728518/swift-can-i-call-a-struct-default-memberwise-init-from-my-custom-init-method
Access SQL 覚書

# 選択クエリ

```sql
SELECT field_name1, field_name2, field_name3, ......
FROM table_name;
```

指定したテーブルのレコードを全て表示し、
指定したフィールドの値を表示する。

```sql
SELECT field_name1, field_name2, field_name3, ......
FROM table_name
WHERE condition;
```

指定したテーブルから条件に合致するレコードを抽出し、
指定したフィールドの値を表示する。

```sql
SELECT field_name1, field_name2, field_name3, ......
FROM table_name
ORDER BY field_name ASC;

SELECT field_name1, field_name2, field_name3, ......
FROM table_name
ORDER BY field_name DESC;
```

* ASC: レコードを昇順で表示する。
* DESC: レコードを降順で表示する。

```sql
SELECT field_name1, field_name2, field_name3, ......
FROM table_name
GROUP BY field_name1, field_name2, field_name3, ......
```

レコードをグループ化して表示する。後述の集計関数と共に使用されることが多い。

# アクションクエリ

```sql
INSERT INTO table_name
VALUES(value1, value2, value3, ......);
```

指定したテーブルへレコードを追加する。

```sql
UPDATE table_name
SET field_name1 = value1, field_name2 = value2, field_name3 = value3, ......
WHERE condition;
```

指定したテーブルの条件に合致するレコードの値を更新する。

```sql
DELETE FROM table_name
WHERE condition;
```

指定したテーブルから条件に合致するレコードを削除する。

# 演算子
WHERE の条件式に使用する演算子。

```sql
WHERE field_name = value
```

指定したフィールドの値が value と一致するレコードを抽出する。(完全一致検索)

```sql
WHERE field_name LIKE pattern
```

指定したフィールドの値が pattern と一致するレコードを抽出する。(あいまい検索)

```sql
WHERE field_name >= value
WHERE field_name <= value
```

指定したフィールドの値が value 以上 / 以下のレコードを抽出する。

```sql
WHERE field_name > value
WHERE field_name < value
```

指定したフィールドの値が value より大きい / 小さいレコードを抽出する。

```sql
WHERE field_name BETWEEN min AND max
```

指定したフィールドの値が min 以上 max 以下のレコードを抽出する。

```sql
WHERE condition1 AND condition2 AND condition3 ......
```

複数の条件式を全て満たすレコードを抽出する。

```sql
WHERE condition1 OR condition2 OR condition3 ......
```

複数の条件式の内一つでも合致するレコードを抽出する。

# 集計関数

```sql
SELECT function(field_name)
WHERE condition;
```

## SUM(field_name)
指定したフィールドの合計値を算出する。

## AVG(field_name)
指定したフィールドの平均値を算出する。

## MAX(field_name) / MIN(field_name)
指定したフィールドの最大値 / 最小値を算出する。

## COUNT(field_name)
指定したフィールドのレコード数を算出する。
BotKitでのエラー`Cannot use the RTM API to send messages.`


指定チャンネルに投稿できてるか確認したく試してたらエラーがでたのでメモ。

ちなみにBotKitで指定チャンネルに投稿する際の最低限のコードはこんな感じ

```app.js
'use strict'

let Botkit = require('./lib/Botkit.js');
let os = require('os');
let controller = Botkit.slackbot({debug: false});
controller.spawn({token: process.env.token}).startRTM().say({
	text: 'Mesage',
	channel: 'チャンネルのID'
});
```

ここでエラーがでます。 slackのRTMAPIのエラーっぽいですが...
 >https://api.slack.com/rtm

```
/Users/sugawara_nobisuke/n0bisuke/lab/bot/botkit/lib/Slackbot_worker.js:226
                throw new Error('Cannot use the RTM API to send messages.');
                ^

Error: Cannot use the RTM API to send messages.
    at Object.bot.say (/Users/sugawara_nobisuke/n0bisuke/lab/bot/botkit/lib/Slackbot_worker.js:226:23)
    at Object.<anonymous> (/Users/sugawara_nobisuke/n0bisuke/lab/bot/botkit/app.js:21:57)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3
```


https://github.com/howdyai/botkit/issues/178 ここをみると同じ問題が。

コードのなかのsayメソッドの呼び出しの際にBotKit自体が立ち上がってない場合があるみたいです。

```
controller.spawn({token: process.env.token}).startRTM().say({
	text: 'こんばんわ',
	channel: 'チャンネルのID'
});
```

は実際にはcronなどで定期的に実行するなどの可能性があるので、起動してから数時間後に呼び出されるはずです。
試す場合はsetTimeout()などを使うと問題なくためせます。


```
  setTimeout(() => {
   controller.spawn({token: process.env.token}).startRTM().say({
	text: 'こんばんわ',
	channel: 'チャンネルのID'
	});
  },3000);

```
「NULLは配列」「なにをいってるんだお前は」

以下みたいなコードを書いていて

```php
$values = [
'a'=>null,
'b'=>'abc',
];
foreach($values as $key => &$value)
{   // 単純にコードがおかしいのだが、二週目にエラーなので気付かず
    $value[$key] = strtoupper($value);
    // ホントはこう書きたかったのだ
    // $value = strtoupper($value);
}
```

以下のような地雷を踏んで久々に笑顔になりました。

```php

$ng = 1;
$ng['abc'] = 2; // PHP Warning:  Cannot use a scalar value as an array 

$ok = null;
$ok['abc'] = 2; // => ['abc'=>'2']
```

「NULLは配列！」「なにいってるんだお前は」

なるほど〜😀


ところで最近は以下みたいな記述ができるようになったのですが、これもいつかは踏みそうだなとおもっています。

```php
echo "abc"[2];
// => c
```

こちらからは以上です。
Bootstrap3でnavbarだけ非レスポンシブにする

Bootstrap3でよくある右側にユーザーのログインとかが固定化された`navbar`を実装したかったのですが、
公式の[サンプル](http://getbootstrap.com/components/#navbar)をベースにやったところ中々うまくいきませんでした。

いろいろ試行錯誤して弄っていたら、結果としてそれっぽいのができたのでメモ。

# 完成系
アニメーションのように画面を縮めても`navbar`のボタンのレイアウトを変えずに維持できています。

![bootstrap-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/48853/487283e2-29fd-e1aa-20b5-88bec17125a7.gif)

# コード
```html:navbar.html
<nav class='navbar navbar-default navbar-static-top'>
  <div class='container-fluid'>
      <a href='#' class='navbar-brand'>Demo</a>

      <ul class="nav navbar-right pull-right" id='header-buttons'>
        <li class='navbar-btn'>
          <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
            <span class="glyphicon glyphicon-plus" aria-hidden='true'></span>
            <span class="caret"></span>
          </button>
            <ul class="dropdown-menu">
              <li><a href="#">Menu1</a></li>
              <li><a href="#">Menu2</a></li>
              <li><a href="#">Menu3</a></li>
            </ul>
        </li>

        <li class='navbar-btn'>
          <div class="dropdown">
            <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
              Menu
              <span class="caret"></span>
            </button>
            <ul class="dropdown-menu">
              <li><a href="#">Menu1</a></li>
              <li><a href="#">Menu2</a></li>
              <li><a href="#">Menu3</a></li>
            </ul>
          </div>
        </li>
      </ul>
  </div>
</nav>
```

```css:override_bootstrap.css
.navbar {
  min-width: 320px;
}

.navbar-brand {
  margin-left: -15px;
}

#header-buttons {
  margin: 0px;
}

#header-buttons > li {
  margin-left: 10px;
  display: inline-block;
}

.navbar-right .dropdown-menu {
  left: auto;
  right: 0;
}

.navbar-nav .open .dropdown-menu {
  position: absolute;
  float: none;
  width: auto;
  background-color: white;
  box-shadow: rgba(0, 0, 0, 0.172549) 0px 6px 12px 0px;
  margin-top: 2px;
  border: 1px solid rgba(0, 0, 0, 0.15)
}

```

# ちょっと解説
まずは、[サンプル](http://getbootstrap.com/components/#navbar)のレスポンシブになる箇所である`navbar-header`と`navbar-toggle`、`navbar-collapse`などを廃止。

そして、`override_bootstrap.css`で縮めた時に変わる要素を基本的にすべて無効化。

あとは、`#navbar-buttons`で微調整。

少し特殊な場所が、

```html
<ul class="nav navbar-right pull-right" id='header-buttons'>
```
の部分。

縮めた時に`navbar-right`がうまく動かなかったのを、`pull-right`で無理やり右揃えに。

これでなんとなく、それっぽいのが完成。

# 最後に
`navbar`は依存関係が多く、その使い方から逸脱するような要件を満たそうとしたら、なんとも付け焼刃的な修正になってしまいました。
なんとも不安が多いですが動かして見た感じとしては、うまくいってるようです。

ただ、基本的にmacでChromeのブラウザ上で確認したので、他のブラウザやデバイスで見た場合など細い部分が抜けてるかも。

その辺は、発見次第少しずつ修正しようと思います。
eShare & Retrieve the metadata from define.xml

Retrieve the specific information from the define.xml on the eShare.

There are two major ways.

With XMPMAP
Creating the XMLMAP to create the dataset from define.xml.

https://www.ciser.cornell.edu/FAQ/SAS/UsingtheSASXMLMapper.shtm

Create the xlsx to convert the define.xml to DOM / equivalent. (then Impot DOM to dataset.)

So far I am not familiar two both ways... 

CNA
【Excel-VBA】エビデンス(スクリーンショット)を綺麗に並べて貼り付ける＆クリップボードを初期化するためのマクロ

#はじめに
仕事で、よくエビデンスのためにExcelにスクリーンショットを貼り付けて残しておいたりするが、
綺麗に位置が揃わないのと、操作ミスで直前のスクリーンショットを貼り付けてしまったりするのを防ぐマクロ。
後でスクリーンショットを綺麗にするのが面倒なのでこのマクロをその時々でカスタマイズしている。
このマクロに関しては、ActiveSheetに対して処理を掛けるため、エビデンスを保存するExcelには入れなくても良いメリットがある。
プロジェクトによってはVBA禁止のところもあるらしいが今の所、そう言った現場には出会ってないのである意味助かってる？


#このツールで実現したいこと
1.**スクリーンショットが綺麗に並んで表示されていること**
2.**貼り付けミスを減らす(クリップボード初期化)**
3.**エラーや確認事項があった場合に、わかりやすくしたい。**
基本的にこの３つだけ。


#仕様(ざっくり)
1.対象の画面のプリントスクリーン済の状態からスタート
2.Excelの貼り付けたい位置にカーソルを置く(今回はA1を選択)
3.貼り付けマクロを実行(私の場合、オプション設定で、CTRL+Shift+Vで登録している。)
　貼り付ける際に、クリップボードが空の場合はエラーメッセージが出力されます。
4.選択したセル(イメージ上ではA1)の下２つ(イメージ上ではA2:A3)の中に貼り付けられる。
　ここで、A2:A3の背景色を変えてあげるとそのスクリーンショットが目立つ形になるためエラーや何かを知らせたい場合に便利である。
　ヘッダー部分にコメント(イメージ上ではA1)を記載することである程度内容がわかったりする。（基本的には未記入状態）
5.クリップボード内がクリアされ、選択したセルから、4つ下のセル位置にカーソルが移動する。
　次のスクリーンショットを貼り付けるための終了処理のイメージ。


#イメージ
・初期位置選択
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/73ac0174-a992-bc3f-7967-1d153a52fa5f.png)
・貼付け後(Ctrl+Shift+V実行後)※各自で設定しないとショートカットキーに登録されない。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/8c9e598b-baca-ca03-2f88-a0679b441f83.png)
・エラーや警告があった場合のメモするイメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/22d7fd54-326b-486a-4d21-76ae061f150f.png)



#ソース(EXCEL-VBA)
```lang:Module1
Option Explicit

'プリントスクリーンの拡大率(80%)　->　100%の場合は1を指定。
Const 拡大率 = 0.8


'貼り付けるセルのサイズ調整
'セル内からはみ出たり、セルサイズが大きすぎたりする場合は調整必要。
Const ヘッダーサイズ = 18
Const CELL_SIZE_Y = 200
Const CELL_SIZE_X = 350


Sub エビデンスペースト()
    Dim tmp As Range
    Dim x, y As Integer
    Dim objShp As Shape
    y = CELL_SIZE_Y
    x = CELL_SIZE_X
    Application.ScreenUpdating = False
    Set tmp = ActiveCell
    tmp.Offset(1).Select
On Error GoTo エラー
    '貼り付けるシートのサイズ調整
    tmp.Offset(1).RowHeight = x
    tmp.Offset(2).RowHeight = x
    tmp.ColumnWidth = y
    tmp.RowHeight = ヘッダーサイズ
    '貼り付け処理
    ActiveSheet.Paste
    
    '貼り付けた際の、オートシェープ位置や拡大率を変更
    Set objShp = ActiveSheet.Shapes(Selection.Name)
    objShp.LockAspectRatio = msoTrue
    objShp.ScaleHeight 拡大率, msoTrue
    objShp.ScaleWidth 拡大率, msoTrue
    
    '大体貼り付け位置の中央付近に移動
    objShp.Top = objShp.Top + 20
    objShp.Left = objShp.Left + 20
    
    
    'コピーモード解除
    tmp.Offset(3).Select
    tmp.Copy
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End
エラー:
    tmp.Select
    MsgBox ("エラーが発生しました。" + vbLf + Err.Description)
    Application.ScreenUpdating = True
End Sub
```
Geolocation APIで熊本県を判定する

# はじめに
熊本で大きな地震があり、今でも毎日のように余震があり、毎日のようにニュースでその被害を見ているととても悲しくなります。正直自分は熊本には特に思い入れはありません。熊本出身とか熊本に知り合いがいるとかでもないですが、それでも自分で何かできないか考えてしまいます。ITで何かできないか...正直出来ることはそんなに多くはないのかもしれませんが何もしないよりはましかと思い、あるいはこれを見て何かのアイディアのきっかけにでもなればと思い書いてみる事にしました。

# Geolocation APIとは
Geolocation APIは、ウェブの標準化団体であるW3Cが仕様策定を進める規格であり、JavaScriptで位置情報を取得できるように標準化されているものです。
Firefox・Google Chrome・Safariなどの一般的なブラウザでサポートされており、 スマートフォンのようなGPS対応の携帯端末向けのウェブサイトだけではなく、 一般的なブラウザで閲覧するいわゆるPCサイトでもユーザーの位置情報を利用したコンテンツを提供することが可能になっています。
[JavaScriptで位置情報を取得する方法(Geolocation API)](https://syncer.jp/how-to-use-geolocation-api)

# Geolocation APIで熊本の位置を判定する
Geolocation APIを使うと現在地の緯度・経度を取得できます。その緯度・経度から熊本かどうかを判定できます。

```js
// Geolocation APIに対応している
if (navigator.geolocation) {
    document.getElementById("msg").textContent="Geolocation APIに対応している";
    navigator.geolocation.getCurrentPosition(
        // 第1引数 取得に成功した場合の関数
        function (position) {
            // 取得したデータの整理
            var data = position.coords;

            // データの整理
            var lat = data.latitude;
            var lng = data.longitude;
            document.getElementById("result").textContent = "緯度:" + lat + "経度:" + lng;

            // 熊本県の範囲
            // ここから超ざっくり測定
            // http://user.numazu-ct.ac.jp/~tsato/webmap/sphere/coordinates/advanced.html
            // 緯度:33.130414〜32.107929
            // 経度:130.111450〜131.292480
            if (lat > 33.130414 && lat < 32.107929 &&
                lng > 130.111450 && lat < 131.292480) {
                document.getElementById("location").textContent = "熊本県です";
            } else {
                document.getElementById("location").textContent = "熊本県ではありません";
            }
        },

        // 第2引数 取得に失敗した場合の関数
        function (error) {
            // エラーコードのメッセージを定義
            var errorMessage = {
                0: "原因不明のエラーが発生しました。",
                1: "位置情報の取得が許可されませんでした。",
                2: "電波状況などで位置情報が取得できませんでした。",
                3: "位置情報の取得に時間がかかり過ぎてタイムアウトしました。",
            };
            document.getElementById("result").textContent = errorMessage[error.code];
        }
    );
} else {
    // Geolocation APIに対応していない
    // 現在位置を取得できない場合の処理
    document.getElementById("msg").textContent="Geolocation APIに対応していない";
}
```

サンプル→http://hikarut.github.io/location/

# これで何ができるか？
例えばこれを使って熊本の人にだけサイトに応援メッセージを出すとか、
ショッピング系のサイトであれば熊本の人限定にクーポンを配布するとか、
ニュース系サイトであれば熊本の人に優先的に必要な情報を載せるとか、
何かしらに使えるのではないかと思いました。

# おわりに
結局自分も個人的に募金くらいしか出来ることはないですが、こうゆうのを見てなにかしら出来ることのきっかけにでもなればいいなと思いました。
[AWS] Amazon S3 Transfer Acceleration 速度比較ツール 結果

Amazon S3 に新しく、__Transfer Acceleration__ という機能が追加されました。

これは、CloudFrontのエッジロケーションを利用することでオリジンのリージョンと別のエンドポイントを払い出し、アップロードのスループットを向上させる機能ということです。

バケット単位で有効化が可能で、マネジメントコンソール上からも操作可能です。


![スクリーンショット 2016-04-21 0.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/111300/3c2621f8-509c-f27d-f3a0-bfc3138d5cce.png)

ここで、__"リージョンごとのスピードを比較しますか。"__のリンクに飛ぶと、__Transfer Acceleration 速度比較ツール__ により各リージョンの S3 に対し、 Transfer Acceleration を有効にした場合の効果がシミュレートできます。

![スクリーンショット 2016-04-21 0.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/111300/4ae92786-5a97-4357-b595-63b4d1f50726.png)

私の環境でテストした結果以下のようになりました。

| リージョン| 効果|
|:-----------|------------:|
| バージニア北部 |+17% |
|北カリフォルニア|+7%|
|オレゴン|-2%|
|アイルランド|+57%|
|フランクフルト|+80%|
|東京|+3%|
|ソウル|-1%|
|シンガポール|0%|
|シドニー|+15%|
|サンパウロ|+69%|

距離の近い東京、ソウル、シンガポールはともかく、北米3リージョンがイマイチな効果となっている気がします。フランクフルトやサンパウロは高い効果が出るという結果です。

あくまでテストツールの結果なので、これから実測して効果を試したいと思います。
なお、Acceleration を有効化したエンドポイントへは、__アップロードも課金対象となります__のでご注意ください。
【IE11】HTML側からのSKYPEクリックコールレイアウト無効化について

> ![cap.jpg](https://qiita-image-store.s3.amazonaws.com/0/122507/24c4f97e-6026-69a8-b551-ebdb303ebb46.jpeg)
https://support.skype.com/ja/faq/FA801/skypekuritsukukoruwochu-metegoshi-yong-sarerufang-he

画像はSKYPEの公式サポートから

SKYPEを起動している状態でサイトを閲覧している時、
HTMLで電話番号が記載されている箇所があると、SKYPEのマークが自動生成されるとともに電話番号のCSSが変更されてしまうという、有り難くない~~クソ~~仕様がある。
意図したレイアウトが台無しになるため、画像で番号を用意しない場合には、修正を余儀なくされるものだ。

PCのブラウザ上に表示された番号をクリックして電話をかけるようなリテラシー高いユーザー層がターゲットではない場合は、サイトを散らかすだけの害である。ユーザーにSKYPE表示を切るようにブラウザ設定を変更させるフローはそもそも問題外。

基本的には下記のメタタグをHTMLのheadに追記しておけば無効化できるのだが、
IE11で無効化できない形が出てきたので対処法を記載してみたいと思う。
（FREEというピンク文字が追記されてレイアウトの邪魔なことこの上ない）
そもそもIEが消え去ればいい話ではあるのだが。

##IE以外のブラウザ用
```
<meta name="SKYPE_TOOLBAR" content="SKYPE_TOOLBAR_PARSER_COMPATIBLE" />
```
##IE11用
読み込んでいるCSSファイルに下記の記述を追記。
フォントのカラーや書体、太字についてはサイト毎の指定にしないといけない。
自動生成されたCSSによる指定が要素を含んだ「span.～」の形なので、クラスセレクタだけ記述しても効かないらしい。

```<style type="text/css">
span.skype_c2c_free_text_span {
   display:none !important;
}
span.skype_c2c_text_span {
   color:#000000 !important;
   font-weight:bold!important;
   font-family:"メイリオ",Meiryo,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","ＭＳ Ｐゴシック",sans-serif !important;
}
img.skype_c2c_logo_img {
   display:none !important;
}
</style>```

JavaScriptで特定classをもったコードを消去する方法もあるだろうけど、
内包してる番号そのものまで消されたら元の木阿弥なのでCSSでの整形という方法をとった。
あまりサイトの仕様を変えたくない事情があったり、
どうしても電話番号には画像を使いたくねぇ！なんて場合にどうぞ。
X-Forwarded-Forヘッダが無い場合SrcIPをコピーする（Apache）

**前置き**
相当古いファイアウォール(以下「FW」)などを利用していると、パケットが機器を通過するとSrcIPがFWのものに変わり、X-Forwarded-ForヘッダにエンドユーザのIPが入るような仕組みがありました。その後次世代FWなどと呼ばれる機器の進化によってSrcIPを変えずに、アプリケーションサーバまで通信が到達するような仕組みを聞くようになりました。しかし、SaaS型WAFなど機器とアプリケーションサーバ間で物理的な接続がない（インターネットを経由するなど）場合、通信の仕組み上SrcIPを変え、X-Forwarded-ForにエンドユーザのSrcIPを格納する必要があります。

あるアプリケーションサーバでエンドユーザのSrcIPによって制御などを掛ける機能があれば、X-Forwarded-Forの値を参照して処理をしなければなりません。通常時は問題ないですが、SaaS型WAFが障害で停止してしまった場合、WAFを経由しない設定に戻す必要がありX-Forwarded-Forを参照しても、ヘッダ自体がなくエンドユーザのIPはSrcIPに格納されています。そのため、Webサーバ（Apache）でアプリケーションサーバへ通信を転送する際、X-Forwarded-Forヘッダがない場合は、障害発生時とみなしてSrcIPの値をコピーしてX-Forwarded-Forヘッダを付けるという設定を入れます。そうすることで、アプリケーションサーバは通常時でも、障害時でもX-Forwarded-Forヘッダの値を参照すれば問題ありません。

**Apacheの設定（本設定はIPv4限定です）**
・X-Forwarded-Forヘッダがあり、IPアドレスが格納されている場合、何もしない
・X-Forwarded-Forヘッダがあり、ありえない値が格納されている場合、SrcIPを入れる
・X-Forwarded-Forヘッダがない場合、SrcIPの値をX-Forwarded-Forヘッダを作って入れる
※X-Forwarded-ForヘッダはApacheが転送する際に付けられるため、転送先で参照できます。


**バージョン**

```sh
[Tabit@apache httpd]$ apachectl -version
Apache/2.4.6 (CentOS)
```

**設定ファイル**

```apache:httpd.conf
#log format
LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#this post settings
SetEnvIf X-Forwarded-For "([1-9]|[1-9][0-9]|[1-9][0-9][0-9]).([0-9]|[1-9][0-9]|[1-9][0-9][0-9]).([0-9]|[1-9][0-9]|[1-9][0-9][0-9]).([1-9]|[1-9][0-9]|[1-9][0-9][0-9])" xff
RewriteEngine On
RewriteRule ^(.*) - [E=ENDUSER_IP:%{REMOTE_ADDR},L]
RequestHeader set X-Forwarded-For "%{ENDUSER_IP}e" env=!xff
```

**アクセス情報とアクセスログ**

X-Forwarded-Forなしでアクセス
![xff_no.png](https://qiita-image-store.s3.amazonaws.com/0/110457/702b965a-d8f0-c81b-2e94-0cfa0aa20435.png)

```
122.223.134.39 122.223.134.39 - - [20/Apr/2016:23:48:33 +0900] "GET / HTTP/1.1" 200 91 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
```

X-Forwarded-Forをつけてアクセス
![xff_a.png](https://qiita-image-store.s3.amazonaws.com/0/110457/4ba91109-5ef1-dcc7-7f8e-e0a172eb2b74.png)

```
122.223.134.39 8.8.8.8 - - [20/Apr/2016:23:47:12 +0900] "GET / HTTP/1.1" 200 91 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
```

X-Forwarded-Forにありえない値を入れてアクセス（攻撃者？）
![xff_no_ab.png](https://qiita-image-store.s3.amazonaws.com/0/110457/c01879c6-4a1f-b603-3dc5-3c325b626a13.png)

```
122.223.134.39 122.223.134.39 - - [20/Apr/2016:23:50:34 +0900] "GET / HTTP/1.1" 200 91 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
```

こんな状況はあまりないと存じますが、仮にSaaS系サービスが障害発生して正常に動かない場合、アプリケーションへアクセスできなくなってしまいます。ケースの一つとして想定しておき、アプリケーション側でも対応を済ませて、障害発生時であっても冷静に対処したいですね。（あらゆる事態に対応できるように作り込むのは、困難だとは思いますが）
HTML上の特定の要素を非表示にする

この記事はhttp://buildbox.net/?p=782 からの転載です。

AndroidでWebViewを表示するとき、特定の項目だけ非表示にしたい場合の方法を探して見つけたので、メモ。

```java
WebViewClient webViewClient = new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        // 不要な項目を消す
　　　　　　　　　　　　　　　　view.loadUrl("javascript:document.getElementById('id').setAttribute(\"style\",\"display:none;\");");
　　　　　　　　}
}
```

WebViewClient#onPageFinishedメソッドのタイミングで、loadUrlメソッドを使って、HTML要素を非表示とするJavaScriptを実行してやればOK。
KNPでの固有表現抽出モデル生成・テスト

KNPで固有表現抽出モデルを生成し、テストする方法についてまとめます。

#インストール方法
##KNPのインストール
* Ubuntu : [Ubuntu 18.04 LTSにKNP, JUMAN, CRF++をインストールする方法](http://qiita.com/SUZUKI_Masaya/items/248a9260301435d42d5a)

#形態素解析データの生成
`$ juman < {平文ファイル} > {出力ファイル}`コマンドで、平文から形態素解析データを生成します。

#固有表現情報の付加
形態素解析データに、以下のような形式で固有表現情報を付加します。
`{元々の形態素解析結果} <NE:{タグ}:{情報}>`
(ex.`昨夜 さくや 昨夜 名詞 6 時相名詞 10 * 0 * 0 "代表表記:昨夜/さくや カテゴリ:時間" <NE:TIME:S>`)
##タグ
[IREXによる定義](http://nlp.cs.nyu.edu/irex/NE/df990214.txt) (文字コードがEUC-JPなので注意) に従った、次の8つになります。

* 固有名詞的表現

|内容|タグ|
|:--:|:--:|
|組織名、政府組織名|`ORGANIZATION`|
|人名|`PERSON`|
|地名|`LOCATION`|
|固有物名|`ARTIFACT`|
* 時間表現

|内容|タグ|
|:--:|:--:|
|日付表現|`DATE`|
|時間表現|`TIME`|
* 数値表現

|内容|タグ|
|:--:|:--:|
|金額表現|`MONEY`|
|割合表現|`PERCENT`|

##情報
|内容|情報|英称|
|:--:|:--:|:--:|
|単独で固有表現を形成している単語|`S`|Single|
|固有表現を形成している最初の単語|`B`|Begin|
|固有表現を形成している途中の単語|`I`|Inside|
|固有表現を形成している最後の単語|`E`|End|
※英称については、あくまで語呂合わせ程度に捉えておいてください。

##注意点
* __`OPTIONAL`タグを付加しない__<br>[IREXによる定義](http://nlp.cs.nyu.edu/irex/NE/df990214.txt)には`OPTIONAL`というタグが定義されていますが、このタグは使用できないため、付加してはいけません。
* __`EOS`が連続しないようにする__<br>元となる形態素解析データでは、`EOS`(行末)が連続していることがありますが、余分な`EOS`は除去しなければなりません。
* __改行やタブといった形態素を取り除く__<br>元となる形態素解析データでは、改行やタブも以下のように形態素として出力されていますが、これは除去しなければなりません。<br>※下のデータを見てもわかりづらいかと思いますが、`{改行} {改行} {改行} 未定義語 15 その他 1 * 0 * 0 NIL`という形になっています。

```

 
 
 未定義語 15 その他 1 * 0 * 0 NIL
```

#学習用データ生成
`$ knp -ne-train < {固有表現情報付き形態素解析データ} 2> {出力ファイル}`コマンドで学習用データを生成します。
※標準エラー出力をファイルに出力する (エラーが発生しても端末上に表示されない) ため、出力ファイルにエラーメッセージが出力されていないか確認するようにしてください。

#学習
`$ crf_learn -f 2 {KNPの解凍先ディレクトリ}/knp-4.16/crf/template {学習用データ} {出力ファイル}`コマンドで固有表現抽出モデルの学習を行います。
※処理がかなり重くなるので、できるだけ他のソフトウェアを終了させてから行うようにしましょう。

#テスト
1. `/usr/local/etc/knprc`のバックアップをとります。
1. `/usr/local/etc/knprc`の`NEモデルファイル`にモデルファイルのパスを指定します。
2. `$ juman < {テストデータ} | knp -simple -dpnd-fast`コマンドで生成したモデルのテストを行います。
3. `/usr/local/etc/knprc`を元に戻します。

#参考文献
* [KNP NER](http://fvcrc.i.nagoya-u.ac.jp/~sasano/knp/ne.html)
ただで、AWSを勉強するけん！！！

　最近、AWSは「流行ブマズー」になっています。

　自分は、アプリケーションを開発して、なんとなく使いますが。
　なんといっても、オンプレミスみたいなサービスを使ったばかりです。S3、RDS、EC2.。。プログラミングでもそのぐらいです。AWSのイベントに参加してみると、大勢の人たちが来ました。いつも「なんちゃらーディーDivingなんちゃら。。。」人が殺到入りました。
　みなさんはそんなに使っているかい？？？？
　「さくら」が落ちても、こんなぐらい人たちが来て、なんだろうか。
　まわりに行って、みると、社名が乗っている名刺カードが少なかったです。社名が乗っている名刺はNTT、Retail、IBM、AWSなど系でした。
　　まさか、この会社たちに入るため、人が来るかなと思いこんでいます。
　
　入りたくないのに、ただ情報収集しても、お金ない私はどうすればいいんだろう。
　会社のアカウントはXXXさんが管理して、使えないです。使うと請求。。。
　AWSのアカウントを登録するとクレジットカード。。。いやああだなあアイツ。
　
　Googleおじいさんに聞いて、プラス自分の経験でまとめ：
　１．ドキュメント＆参考リンク
　-　各サービスにドキュメントがありますが、このところだけ入れば結構です。
　リンク：https://aws.amazon.com/jp/documentation/
　特徴：CM見たいな文書が少ない、見たいところだけ集まっています。

　２．アキテクチャーのスライ
　-　スライシェアー：
  http://www.slideshare.net/AmazonWebServicesJapan?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview
  - 特徴：初心者向けの資料もあり、ハイレベルのドキュメントもあります。特にBlackBeltのセーリズ。
  システムを構築するときに、こちらに入り、アキテクチャーを勉強します。
 ★私の好きなスライド：
　・BigData
　-　http://www.slideshare.net/AmazonWebServices/getting-started-with-big-data-and-hpc-in-the-cloud-august-2015
　・ネットワーク入門
　-　http://www.slideshare.net/AmazonWebServicesJapan/awswebinar-aws-58643433　

　３．Free!!!!!QUESTION＆ANSWER（毎週の水曜日）
  　★★★  ★★★  ★★★  ★★★  ★★★  ★★★
　　https://aws.amazon.com/jp/about-aws/events/#webinar
  　★★★  ★★★  ★★★  ★★★  ★★★  ★★★
　お金がない私、これによく参加しています。
　-　特徴：受付の人ではなく、ちゃんと教育された人物が出演しますので、技術も高い（笑笑笑）
　-　開催時間は18時から→SIer人たちがあまり参加しない（決定の判断）、Questionチャンスが高い（へへへへ）
　
　４．コードサンプル
　- http://aws.typepad.com/aws_japan/
　- 特徴：最新機能のサンプルが乗っています。
　- http://aws.amazon.com/code
　- 特徴：なんにもあります（サイトは英語です）m(~ ~;

　５．ただAWSのラブ
　- https://qwiklabs.com/?locale=ja
　- 特徴：ＡＷＳのコンソールを触れます。ＥＣ２やサービスを作成できます。
　- ときときキャンペーンがあり、資格取得するためのラブもできます　(wwww).前回の記念キャンペーンで、
　プロフェッショナルのラブもやりました。資料や手順書も取得できました。ふふふふ


このぐらいの資料を解けば、AWSのコースに参加しなくても、大丈夫だろうか。
HTML上で、ExcelみたいにEnterで上下TABで左右にフォーカス移動するやつ書いた

HTMLで、ExcelみたいにEnterで上下TABで左右にフォーカス移動するやつ書いた。
shift同時押しで逆方向に行きます。

業務で使うような入力画面はこんな機能あったらいいと思うんだけど、ググっても欲しいようなのが無いみたいなので自作。
矢印キーも対応したいけど、TextBoxとかはFocus = 編集モードだから、使い勝手が悪くなりすぎるので実装してません。
矢印移動も欲しい！

書き散らした感あるんで後で整理します。。。


```js
// 使い方
// ======
// 移動させたいElementに「data-cell」というカスタムデータ属性を振る。
// そのうえで、「setKeyMove()」を実行すると、キー移動が制御される。
// data-cellへの数字の振り方は、ExcelのCellと同じかんじで、"row,column"と数字をふる。

// サンプル
// ========
// <a href="" data-cell="1,1">1-1</a><a href="" data-cell="1,2">1-2</a>
// <a href="" data-cell="2,1">2-1</a><a href="" data-cell="2,2">2-2</a>
// <script>setKeyMove()</script>

// ↑この場合、
// TABだと  1-1 => 1-2 => 2-1 => 2-2 => 1-1...
// ENTERだと1-1 => 2-1 => 1-2 => 2-2 => 1-1...
// と移動する。
// 要素が増えたり減ったりしたときは、再度setKeyMoveをすると新しい移動順で上書きされる。


var KeyCode = {
  TAB: 9,
  ENTER: 13,
};

function query(s) { return document.querySelectorAll(s);}

function sortCell(list, order) {
  var copy = list.slice();
  copy.sort(function(a, b) { return order(cell(a), cell(b));});
  return copy;
}

function cell(elem) {
  var c = elem.getAttribute('data-cell').split(',');
  return { row: +c[0], column: +c[1] };
}
function orderByRowColumn(a, b) {
  return a.row != b.row ? a.row - b.row : a.column - b.column;
}
function orderByColumnRow(a, b) {
  return a.column != b.column ? a.column - b.column : a.row - b.row;
}

function setKeyMove() {

  if (setKeyMove.horizontal) {
    remove(setKeyMove.horizontal, KeyCode.TAB);
    remove(setKeyMove.vertical, KeyCode.ENTER);
  }

  var list = [].slice.call(query('[data-cell]'));
  setKeyMove.horizontal = sortCell(list, orderByRowColumn);
  setKeyMove.vertical   = sortCell(list, orderByColumnRow);

  add(setKeyMove.horizontal, KeyCode.TAB);
  add(setKeyMove.vertical, KeyCode.ENTER);
}



function add(list, keyCode) {
  list.forEach(function(v,i,a) {
    v.addEventListener('keydown', factory(keyCode, i, a));
  });
}
function remove(list, keyCode) {
  list.forEach(function(v,i,a) {
    v.removeEventListener('keydown', factory(keyCode, i, a));
  });
}

function factory(keyCode, i, ary) {
  return function(event) {
    if (event.keyCode != keyCode) return;
    event.preventDefault();
    ary[nextIndex(i, ary.length, event.shiftKey)].focus();
  }
}
function nextIndex(cur, end, back) {
  if (back) {
    if (cur === 0) {
      return end - 1;
    } else {
      return cur - 1;
    }
  } else {
    if (cur === end - 1) {
      return 0;
    } else {
      return cur + 1;
    }
  }
}
```
[Windows][Python3] Windowsにpython3とJupyter Notebook(旧: ipython notebook)をインストールする

Windows環境でpythonとipython notebookを使えるようにする方法メモ

追記（2017/02/27）：

現在Python 3.6.0 がリリースされています。確認しましたが手順としては変更ありませんでした。

# Python3 の最新をインストール 
## 1. Python公式からWindows向けのpythonをインストール
[Download Python | Python.org](https://www.python.org/downloads/)

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/5483af84-dff6-041c-1339-18901ea9942b.png)

## 2. PATH に追加にチェックを入れて、Pythonをインストール
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/313edcba-39bd-cc35-1d93-21d6123c5369.png)

## 3. 適当なコンソールでpythonが使えることを確認する
適当なものがない場合は [Git for Windows](https://git-for-windows.github.io/) のGit Bashあたりを使うと良いと思います。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/4f42b71c-058d-8c8c-d209-70338787d0ff.png)

## 4. pip で ipython notebook をインストール

下記のどちらかでインストールする、基本的には上のコマンドでjupyterをインストールすれば良い

```console:jupyterのインストール
$ pip install -U pip
$ pip install jupyter
```

```console:ipython-notebookをインストール(昔のインストール方法)
$ pip install -U pip
$ pip install ipython
$ pip install ipython[notebook]
```

## 5. Jupyter Notebook(旧: ipython notebook)の実行
```bash
$ jupyter notebook
```

実行すると自動でブラウザが開かれる。(アドレスはデフォルトのもの)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/f74b166a-5521-3399-562e-b47d57bb1e90.png)

新規ノートブックを作成
![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/fc5eac67-faf6-0f4c-e837-e844558ee7b4.png)

これでセットアップは完了です
![3.png](https://qiita-image-store.s3.amazonaws.com/0/37721/a488537a-6144-15eb-2ae9-8b5262bac416.png)

# Vim Bindingの有効化

Vimmerであれば以下のプラグインを入れると幸せになれます。

[Jupyter (旧 IPython notebook）の本来あるべき姿を垣間見る - Λlisue's blog](http://lambdalisue.hatenablog.com/entry/2015/12/22/233817)
[lambdalisue/jupyter-vim-binding: Jupyter meets Vim. Vimmer will fall in love.](https://github.com/lambdalisue/jupyter-vim-binding)

keyboard shortcut の無効化 (firefox)
[Menu Wizard :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/s3menu-wizard/)

# matplotlibのグラフのインライン表示

以下を適当な箇所で設定

```
%matplotlib inline
```

[Plotting — IPython 5.0.0 documentation](http://ipython.readthedocs.io/en/stable/interactive/plotting.html)

# 参考
[Installing Jupyter Notebook — Jupyter Documentation 4.1.1 alpha documentation](https://jupyter.readthedocs.io/en/latest/install.html#new-to-python-and-jupyter)
[WindowsでPython3, numpy, pandas, matplotlibなどインストール - Qiita](http://qiita.com/mojaie/items/241eb7006978e6962d05)
[はじめるiPython notebook - Qiita](http://qiita.com/icoxfog417/items/175f69d06f4e590face9)
HTML,CSS勉強メモ #19

最近書いていませんでしたが、現在はBootstrapを勉強しています。

##**進度**##
<dl>
<dt>Bootstrap 3.0入門</dt>
<dd>01:Bootstrapとはなにか?</dd>
<dd>02:開発の準備を整えよう</dd>
<dd>03:Gridシステムを使ってみよう</dd>
<dd>04:レスポンシブWebデザインを使おう</dd>
<dd>05:`table`のスタイリングをしよう</dd>
<dd>06:`form`のスタイリングをしよう(1)</dd>
<dd>07:`form`のスタイリングをしよう(2)</dd>
</dl>


##**メモ**##
今のところハマっているところはありません。まぁ、動画見て書いてるだけなんで当たり前ですけど・・・
ところで、今までフレームワークという言葉にどうにも壁を感じていました。なんかいまいちピンとこなくて。でもBootstrapの便利さには目からウロコですね！ちなみにずっとブーツストラップだと思ってましたw
ということで、フレームワークに壁を感じているので、Bootstrapの使い方について忘れたとき用に書いておきます。

- Bootstrapとは
 - 面倒なスタイルをあらかじめ作ってくれてある便利なもの。

- 使い方
 - Bootstrapをダウンロードし、`CSS`として読み込む。※JSとjQueryも忘れずに！
 - 各スタイルは決まった名前の`class`を指定することで適応させる。
 - 公式HPに`HTML`の雛形があるのでそれを使うとラク。

とっても便利なBootstrapで、どんなスタイルがあるのかもっと研究してみたいところですが、いかんせん英語が苦手という致命的な欠点があり時間がかかりそうなので、ひとまず様々なレッスンを一通り終わらせてからにしようと思います。

ところで、関係ないですがうちのAtomが調子悪いです。
`form`のレッスンやってると途中で固まっちゃって強制終了せざるを得なくなっちゃいます。うーん・・・まずはここからか？
サラバ！ prepareForSegue

## SegueAddition
[SegueAddition](https://github.com/bannzai/SegueAddition)というライブラリを書きました。

このライブラリは`performSegueWithIdentifier`を便利に使えるようにしたものです。
使い方を見てみましょう。

```swift
let customString = "CustomString"
performSegue("SegueIdentfiier") { segue in
    guard let toViewController = segue.destinationViewController as? CustomViewController
        else {
            fatalError()
    }
    toViewController.string = customString
}

```

UIViewControllerのメソッドに`performSegue`というメソッドを一つ追加しました。
`performSegue`は従来通り**UIStoryboardSegue#identifier**を引数に渡せば画面遷移をしてくれます。

`performSegueWithIdentifier`を使った下記のコードと一緒な動作をします。

```swift
...
let customString = "CustomString"
performSegueWithIdentifier("SegueIdentfiier", sender: customString)
...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    guard let toViewController = segue.destinationViewController as? CustomViewController,
              customString = sender as? String
          where segue.identifier == "SegueIdentfiier"
          else {
              fatalError() 
     }
     toViewController.string = customString
}

```

`performSegueWithIdentifier` と違う点は大きく二つです。 

- `prepareForSegue`が呼ばれません。
- `performSegue`には`(UIStoryboardSegue -> Void)?`の__closure__を引数として渡すことができます。 `prepareForSegue`でやろうとしていたことを**closure**の中に書くことができます。

いかがでしょうか？
従来通りの`performSegueWithIdentifier`, `prepareForSegue`で書く場合は、
遷移を命令する場所と準備を行う場所が乖離しており、書くのも読むのも大変でした。
また、senderでAnyObjectを渡せると言っても`prepareForSegue`中でキャストしたり、
二つ以上の引数を渡したい場合はタプルを使用するなどが必要だったのではないでしょうか？

**SegueAddition** では、`performSegue`を使用することで従来通りの方法よりも書きやすさ読みやすさを実現しています。ViewControllerへ値を渡したい場合でも**closure**の中に含めることによって柔軟に値を渡すことができます。

そして、**SegueAddtion**を導入したからといって`performSegueWithIdentifier`と`prepareForSegue`のペアが使えなくなるわけではありません。もちろん、ActionSegueも使えます。
ですので、以前からあるコードを変える必要はないです。

中身はとてもシンプルなので見てもらうと分かりますが、
循環参照もしない作りになっています。

**Segue**を使ってアプリ開発をしている方は是非おためしください。

### おまけ
[ResourceKit](https://github.com/bannzai/ResourceKit)というライブラリを書いています。
この[SegueAddition](https://github.com/bannzai/SegueAddition)を書き終わった時にTODOを一つ増やしました。

- Collaboration [SegueAddition](https://github.com/bannzai/SegueAddition)

**ResourceKit**で**SegueAddition**のような書き方をサポートしようかなと思案中です。

```swift
let customString = "CustomString"
performSegueOpen() { segue in
    guard let toViewController = segue.destinationViewController as? CustomViewController else {
      fatalError()
    }
    toViewController.string = customString
}
```

これで**withIdentifier**も消えてよりスッキリしそうです。

**ResourceKit**はこちらの記事で紹介しています。
[まだハードコードで消耗してるの？ ResourceKitで安全コーディング！](http://qiita.com/bannzai/items/e9bf5904940fb1ed5082)
こちらの方も是非ごらんください。

\\(^o^)/
termitの設定保存

毎回忘れてるのでメモ

ubuntuの16.04で設定しました。
http://d.palmtb.net/2011/08/27/171422.html
には
```
$ mkdir ~/.config/termit
$ cp -i /usr/share/doc/termit/rc.lua.example .config/termit/rc.lua
```
とありますが、なぜか/usr/share/doc/termitにあるのは
rc.lua.example.gz
でした。

これを.config/termitにコピーして進めます。
```
$ mkdir ~/.config/termit
$ cp -i /usr/share/doc/termit/rc.lua.example.gz ~/.config/termit/
$ gunzip ~/.config/termit/rc.lua.example.gz
$ mv ~/.config/termit/rc.lua.example ~/.config/termit/rc.lua
```
こうするとtermitの設定が残るようになります。
いきなり背景が透過になっててびっくりしますｗｗ
ターミナルでsvn diffを色付きにする

`svn diff`が一色で見にくいため、`git diff`みたいに色付きにしたい。

<img width="943" alt="スクリーンショット 2016-04-20 22.25.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/47351/cf6ec54d-5f27-3b05-20f4-9b8b406ed6ae.png">

どうやらcolordiffというものがあるらしいです。

## colordiffをインストール

Homebrew入っているので下記でインストール。

```
brew install colordiff
```

## 設定

`~/.subversion/config`に追記。
`diff-cmd`とかがコメントアウトで書いてある近くに入れておけば良いんじゃないですかね。

```
diff-cmd = colordiff
```

色が付くようになり、これでかなり見やすくなりました。

<img width="970" alt="スクリーンショット 2016-04-20 22.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/47351/8e366b18-ec9a-b9c9-cf32-788dbde36f09.png">

### 参考

[svn diff を色つきで見る - Qiita](http://qiita.com/catatsuy/items/8e86614c36d3c006c149)
Android開発での便利なライブラリ - ShowcaseView(tutorial)


##ShowcaseView
チュートリアルで便利なライブラリ
注目した欲しい部分以外にカバーを掛けて、アクションを促すのはよく見るチュートリアルですね。
それを簡単に実現できるライブラリです。
注目してほしい部分の切り出しが円でしかできないのがちょっとネックですが、基本的には使いやすくて便利。
ちょっとしたチュートリアルであれば、自作でカスタムして作らなくてもこれで十分かと。


[**github(ShowcaseView)**](https://github.com/amlcurran/ShowcaseView)


##ShowcaseViewの種類
| HoloShowcase| NewShowcase | MaterialShowcase |
|---|---|---|
|![18720.jpg](https://qiita-image-store.s3.amazonaws.com/0/61340/b8b8dd40-3064-a354-adbe-12e3c50a14ca.jpeg "18720.jpg")|![18721.jpg](https://qiita-image-store.s3.amazonaws.com/0/61340/49ba6b81-a0fc-6c7c-5b49-4ca7dca9456f.jpeg "18721.jpg")|![18722.jpg](https://qiita-image-store.s3.amazonaws.com/0/61340/8084be21-6691-95c2-541b-89e996bb03a3.jpeg "18722.jpg")|


##利用方法

###Gradle.buildへ追加
`compile 'com.github.amlcurran.showcaseview:library:5.4.3'`

###簡単な使い方
```
new ShowcaseView.Builder(this)
    .setTarget(new ViewTarget((Button) findViewById(R.id.button)))
    .setContentTitle("ShowcaseView")
    .setContentText("This is highlighting the button")
    .hideOnTouchOutside() // タップしたら消えるように。
    .build();
```
###テーマの変更 style.xml
```
<style name="CustomShowcaseTheme" parent="ShowcaseView.Light">
        <item name="sv_backgroundColor">#3300A621</item>
        <item name="sv_showcaseColor">#00801A</item>
        <item name="sv_buttonText">Hide</item>
        <item name="sv_tintButtonColor">false</item>
        <item name="sv_titleTextAppearance">@style/CustomTitle</item>
</style>

<style name="CustomTitle" parent="TextAppearance.ShowcaseView.Title">
      	<item name="android:textColor">#00801A</item>
</style>
```

##コード例
```
public class MainActivity extends AppCompatActivity {

    private ShowcaseView view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        assert button != null;

        view = new ShowcaseView.Builder(this)
                .setTarget(new ViewTarget(button))
                .setContentTitle("ようこそ")
                .setContentText("早速、startを押して始めてください。")
                .setStyle(R.style.CustomShowcaseTheme)
                .withMaterialShowcase()
                .doNotBlockTouches() //ShowcaseView下のボタンを触れるように。
                .build();
        view.hideButton(); // Showcase上のボタンを隠す。

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("TAG", "start action");
                view.hide();
            }
        });
    }
}
```

|テーマ変更後|最終版|
|---|---|
|![18723.jpg](https://qiita-image-store.s3.amazonaws.com/0/61340/8564cbf2-e598-f3b5-a68c-16c46270629c.jpeg "18723.jpg")|![18724.jpg](https://qiita-image-store.s3.amazonaws.com/0/61340/e6f0586b-bd39-574b-ceee-a3602997dda6.jpeg "18724.jpg")|


##英単語アプリmikanのAndroidでのβ配布始めました。
[mikan Android β配信](https://goo.gl/sqs5ZL)
フィードバックお待ちしております。
(このライブラリはまだ実装されていません。)

#####参考
http://dev.classmethod.jp/smartphone/android/showcaseview-lib/
RoboVM終了っぽい今、インテルのクロスプラットフォーム開発環境の現状を眺めておく。


# RoboVM終了!?

全世界のクロスプラットフォーム界隈の人々の一部*(...せいぜい数万人かな...)*にちょっとした衝撃となったであろう4月15日の[RoboVM終了っぽいお知らせ : RoboVM Winding Down](https://robovm.com/robovm-winding-down/)。マイクロソフトがXamarin会社を買収したあおりで、Xamarin会社の子会社となっていたRoboVMが終了となった模様...JavaベースのiOS向け開発環境RoboVMが、今後、(再度)オープンソースになるか等は未定。
少なくともRoboVMのリリースを見る限り、JavaでiOSやろうとしていた皆さんは、今後はC#なXamarinでiOSしてね、とのこと*(なかなかな無茶ぶり、、)*。

#インテルのMulti-OS Engine(moe)があるよ。
今月は、並行して、GoogleがAndroid開発にSwift採用か、なんて憶測ニュースが流れていて、そちらの方はけっこう話題となっているわけだけれど、いちおう、JavaでiOS開発という流れも消えてはいない。

そう、同じく4月15日に、インテルは、自社ラボが開発を進めているiOS/Andoirdのクロスプラットフォーム開発環境Multi-OS Engine(moe)の解説ビデオを公開している: 

https://software.intel.com/en-us/videos/java-binding-for-multi-os-engine-technology-preview

なんか急いで作りました的な感じで、正直あまり中身はないんだけれど、インテルはJavaでのクロスプラットフォーム開発を応援しているんだよ、というメッセージだけは伝わってくる。

*以下、ビデオ中のキャプチャ画像:*
![スクリーンショット 2016-04-20 20.21.13.png](https://qiita-image-store.s3.amazonaws.com/0/16455/9063e22c-83b4-f209-98cd-295c881ee02a.png)

で、実際のところ、どうなのと気になるわけなのだが、[Multi-OS Engineは近いうちにAndroid Studio 2.0にも対応するよ](https://software.intel.com/en-us/forums/multi-os-engine/topic/623889)とか、やる気ありそうなアピールは行われている。　*... 現RoboVM開発チームの皆さんも、短かったマイクロソフト孫会社生活を終え、いずれインテルに転職、なのかも... !?*

#githubのmoeサンプルコードを見てみる
インテルは、**Multi-OS Engine Samples**と題して、[githubにサンプルコードを公開](https://github.com/moe-java-samples)してくれている。

Java版とKotlin版とがあるんだけれど、Java版のサンプルコードは結構充実してきている。試しに
[最近公開されたiOS向けコード](https://github.com/moe-java-samples/moe-java-samples/blob/master/NoteTaking/ios/src/main/java/com/intel/moe/samples/notetaking/ios/NavigationController.java)を眺めてみると、@ObjCClassName("NavigationController")とか@Selectorとかアノテーションを駆使したコードになっていて、ドキュメントが充実してくれば、けっこう見通しよく開発できそうな感じ。

# What's next!?
さて、今後はどうなるのか。随時注視していきたい、と思っている...のだけれど、当方は少なくとも今後半年は通常のAndroid案件で手一杯の模様。

どなたか、しっかりしたウォッチャーが現れてくれることに期待しつつ、現状報告を終える。
Atom や Sublime Text で日本語の単語移動を可能にする（Vim化プラグインでも有効）

## 概要

エディタで文章を書いているとき、Mac だといろんなところ（Cocoaアプリのテキストフィールド）で単語ごとにカーソル移動（`option + 矢印キー/ctrl+pnbf`）ができてとても便利である。英語はもちろんのこと、日本語であれば形態素解析による文節ごとの移動が可能なのがすごい。論文や仕様書を書いているときにこの機能が使えるか否かは非常に重要な問題である。

ところが、Atom や Sublime Text といった GUI エディタは**日本語における単語移動**をサポートしてくれない。Sublime Text には [LaTeXTools](https://github.com/SublimeText/LaTeXTools) という、高機能で開発も活発な LaTeX 向け拡張機能があって愛用していたが、この単語移動ができないのがつらすぎて Vim に移るなどしていた。というのも、素の Vim であれば（形態素解析ではなく、漢字・ひらがな・カタカナの文字種ごとではあるが）ノーマルモードで `w` で日本語における単語移動ができるからである（TextObject にもなっているので `diw` も効く）。

しかし、Vim を触り始めたところプラグイン沼にハマってしまい、環境構築だけで無為に時間が消費されてしまう。さらに、最近エディタ界隈で認知が高まっている [Spacemacs](http://spacemacs.org) も、Evil による Vim 実装で単語移動ができるが、全体的に重く、英語ですら入力が少しもたつくのが辛くなってきた（日本語入力はもっとひどい）。

Atom や Sublime Text といったモダンなエディタで、Vimくらいの実装でよいから単語移動ができればと思っていたところ、公式の設定項目を見つけたので記事にする。イチオシポイントは、**Atom や Sublime Text を Vim 化するプラグインでも機能する**ところ。

## 方法

Atom や Sublime Text は**単語境界**を設定することができる。
単語境界とは、スペース以外に単語を区切る可能性のある文字のことで、両エディタのデフォルトは次のようになっている。

```
/\()"':,.;<>~!@#$%^&*|+=[]{}`?-…
```

これに、日本語で単語を区切る（ことの多い）文字を入れてしまえばよい。

```
、。「」【】『』（）！？　てにをはがのともへでや
```

「て」の前には**全角スペース**も入っていることに注意。
こんなもんでいいのかと思われるかもしれないが、実用的にはかなりちょうどよい。また、あんまり律儀に助詞を足すと思わぬひらがなで立ち止まるようになる。
（とはいえ、他にも入れておくとよい記号・助詞があればご指摘ください！）

### Atom

設定に `Non Word Characters` というのがあるので、そこに上記日本語文字列を足す。

### Sublime Text

設定ファイルに `word_separators` の項目を足す。デフォルトの単語境界を消さないように注意。Sublime Text では JSON を使うので、デフォルトの単語境界の一部がエスケープされている。

```Preferences.sublime-settings
{
    //その他の設定…
    "word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?　、。「」【】『』（）！？てにをはがのともへでや",
    //その他の設定…
}
```

## 補足

以上の設定により、日本語でもおおむね単語レベルで移動するようになった。Atom の [vim-mode-plus](https://atom.io/packages/vim-mode-plus) や Sublime Text の [Vintageous](https://github.com/guillermooo/Vintageous) でも単語移動が可能になり、もっというとテキストオブジェクトとしても日本語の単語を扱えるようになる。

ちなみに、この簡単な Hack を思いつく前は、Sublime Text で [MultiByteWord](https://bitbucket.org/dat/movemultibyteword/overview) というプラグインを使っていた。はじめのうちは満足していたけど、後に Vim のキーバインドを覚えていくうちに Vim と同じように単語移動したくなったのだが、どうあがいても Vintageous の `w` motion に割り当てられないので、しばらく諦めていた。

それにしても、Atom が ver.2 に でもなれば、エディタで悩む時代は終わるんだろうか……。
cloudBit の subscriptions API に curl を使って登録する方法

## TL;DR

もう少し詳細に言うと、[subscriptions API](http://developer.littlebitscloud.cc/) に `publisher_events` パラメータ付きで登録する方法です。
以下のように json データを送ると、登録することができます。

```bash
$ curl -i -XPOST -H "Authorization: Bearer TOKEN" \
    -H "Content-Type: application/json" \
    -H "Accept: application/vnd.littlebits.v2+json" \
    https://api-http.littlebitscloud.cc/subscriptions \
    --data '{"subscriber_id":"https://your.api.server", "publisher_id":"555555555555", "publisher_events":["amplitude"]}'

```

## publisher_events パラメータ付きで登録しようとしたら、エラーになって登録できない

公式や他の記事を参考に以下のようにして登録しようとしても、500 エラーで登録することができませんでした(2016/04/20 現在)。

```bash
$ curl -i -XPOST -H "Authorization: Bearer TOKEN" \
    -H "Accept: application/vnd.littlebits.v2+json" \
    https://api-http.littlebitscloud.cc/subscriptions \
    -d subscriber_id=https://your.api.server \
    -d publisher_id= 555555555555 \
    -d publisher_events="['amplitude']"

HTTP/1.1 500 Internal Server Error
```

問い合わせをしたところ、API のアップデートに伴って json を受け付けるようになったようです(詳しくは聞いていないですが)。
なのでもしエラーで登録できない方がいれば、参考にしてみてください。


## Resources

- [cloudBit API Document](http://developer.littlebitscloud.cc/)
  - 公式
- https://github.com/littlebits/cloud-api-lessons
  - どこかで開かれた workshop 用のドキュメント。わかりやすいけど少し古いぽい。