OmniAICreator/Qiita-1.07M huggingface dataset:
Atomの独自の言語ハイライトを作る方法

# Atomエディタで独自の言語ハイライトを作る方法

CSON形式のファイルを一つ作るだけで良いので基本的に簡単です。

複雑な言語のハイライトは、正規表現がすごいことになっていますが、単純な言語のハイライト定義ファイルをいくつか眺めると、なんとなく分かってきます。

## Atomへ独自パッケージを導入する方法

Atomのパッケージは、基本的にディレクトリです。例えば、language-hogeというハイライトを行うパッケージであれば、以下のパスにディレクトリを作ります。

```
~/.atom/packages/language-hoge
``` 

ファイルを編集して、エディタを再起動すると、パッケージの内容が反映されます。

## ハイライトに必要なファイル

Atomのパッケージは、npmっぽく管理するので、まず ```package.json``` を配置します。特別な項目はありません。そのため、以下の参考になる言語の定義ファイルへのリンクを見て、それっぽい内容をコピペするだけでOKです。

次に、言語のハイライトファイルを配置します。それが、```grammars/hoge.cson``` です。これが、ハイライトのメインファイルです。

このCSONファイルに何を書けば良いのか・・・・それは、以下のような感じです。

```
'name': 'hoge'
'scopeName': 'source.hoge'
'fileTypes': [
  'hoge'
]
'patterns': [
 ...
]
```

- patternsの項目に、``match:正規表現パターン``と``name:ハイライトの名前``のオブジェクトを記述していきます。
- ``include``のキーがあれば、それは、``repository``へのリンクとなっているようです。([language-json](https://github.com/atom/language-json/blob/master/grammars/json.cson)が参考になります)

## 参考になる言語の定義ファイルへのリンク

- [BrainFunck](https://github.com/EvanHahn/atom-language-brainfuck/blob/master/grammars/brainfuck.cson)
 - 俺様言語で最も有名なBrainFuncの定義ファイル。シンプル。 
- [JSON](https://github.com/atom/language-json/blob/master/grammars/json.cson)
 - 文法を知っている言語なら、構造を理解しやすい 
- [CSS](https://github.com/atom/language-css/blob/master/grammars/css.cson)
 - 上記と同じ理由。とは言え、結構複雑
- [Lua](https://github.com/FireZenk/language-lua/blob/master/grammars/lua.cson)
 - 言語が単純なのでハイライトもシンプル。

## 地道に動作確認しながら作ろう

CSONファイルを書いて、ウィンドウをリロードして、動作を確認。CSONを変更してリロードを、地道に繰り返していくと、良い感じにハイライトが完成することでしょう。そして・・・作り方をマスターした方、もっと詳しく教えてください。

- [作ったCSONファイル - 日本語プログラミング言語「なでしこ3」用](https://github.com/kujirahand/nadesiko3/blob/master/misc/atom-packages/language-nako3/grammars/nako3.cson)

## 参考になったページ

- [Atom パッケージを作成してみる](https://ez-net.jp/article/49/YtV73ttL/VrjL9C_RSwq3/)
- [483名のBrainfuckerを救ったAtomのシンタックスハイライト](http://qiita.com/tbpgr/items/74b6f0a5f5a69cc0d0f8)
衝突判定のあれこれ


1回理解してもしばらく経つとやらかしてるのでざっくり自分用まとめます。

#Collision系とTrigger系
+ Collision系関数

| 関数 | 呼び出されるタイミング |
|:-----------|:------------|
|OnCollisionEnter|他のcollider/rigidbodyに触れたとき|
|OnCollisionExit|他のcollider/rigidbodyと触れ合うのをやめたとき|
|OnCollisionStay|他のrigidbody/colliderに触れている間|

+ Trigger系

| 関数 | 呼び出されるタイミング |
|:-----------|:------------|
|OnTriggerEnter|Collider が他のトリガーイベントに侵入したとき|
|OnTriggerExit|Collider が other のトリガーに触れるのをやめたとき|
|OnTriggerStay|OnTriggerStay はトリガーが 他の Collider に触れ続けている間|


※[スクリプトリファレンス](https://docs.unity3d.com/ja/540/ScriptReference/Collider.html)より引用

### 違いは<b>Rididbodyの有無</b>
Trigger系はColliderのIsTriggerのチェックボックスをオンにするだけでOK。
Collider系は<b>衝突するオブジェクト”両方”がColliderとRigidbodyを持っている必要がある</b>。

動くもの同士の衝突判定＝＞　Collision系
どちらかが動かない衝突判定＝＞　Trigger系

※もっと詳しい解説　[Unityつかうよ](http://unitytsukauyo.blogspot.jp/2012/07/oncollisionhogehogeontriggerhogehoge.html)　
※もっと詳しい具体例とか　[Unityにおける衝突判定まとめ](http://qiita.com/nutti/items/1a284c4bf8c79386aca7)

#衝突対象の判定
##①タグ
基本こっち使う（のわりに忘れがち）
Add Tagでタグを追加して使う。

```csharp:タグを使った例
    void OnCollisionStay(Collision other)
    {
            if (other.gameObject.tag == "sample")
            {
            Destroy(other.gameObject);
            }
     }
```

##②レイヤー
特定のオブジェクト同士に判定をさせたくないときに便利。
Edit → Project Settings → Physics 2Dでできる。

```csharp:レイヤーを使った例
    void OnTriggerEnter (Collider other)
    {
        string layerName = LayerMask.LayerToName(other.gameObject.layer);

        if( layerName == "sample")
        {
            Destroy(other.gameObject);
        }
    }
```


[スクリプトリファレンス](https://docs.unity3d.com/ja/current/Manual/LayerBasedCollision.html)

他またあったら追記します。
多：多のアソシエーションでN+1問題を起こさないための手段


## 前提

ブログとカテゴリがn:nの関係

```rb:app/models/blog.rb
class Blog < ApplicationRecord
  has_many :blogs_categories
  has_many :categories, through: :blogs_categories, source: :category
end
```

```rb:app/models/category.rb
class Category < ApplicationRecord
  has_many :blogs_categories
  has_many :blogs, through: :blogs_categories, source: :blog
end
```

```rb:app/models/blogs_category.rb
class BlogsCategory < ApplicationRecord
  belongs_to :blog
  belongs_to :category
end
```

ちなみに中間テーブルの名前は `複数_複数` とするのがRailsのルール。
今回なら `blogs_categoriesテーブル` 。
ちなみにモデル名は `複数_単数` とするみたい。
今回なら ファイル名が `blogs_category.rb` クラス名が `BlogsCategory` 。
ややこしや。。


## includesのみ

アソシエーションごとにキャッシュ
今回は以下３つのテーブルがあるので

* blogsテーブル
* blogs_categoriesテーブル
* categoriesテーブル

クエリは３回


```rb:app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
  def index
    @blogs = Blog.includes(:categories)
  end
  
  # 省略
end
```

```sql
Blog Load (0.7ms)  SELECT "blogs".* FROM "blogs"

BlogsCategory Load (0.9ms)  SELECT "blogs_categories".* FROM "blogs_categories" WHERE "blogs_categories"."blog_id" IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" IN (1, 2, 3, 4, 5)
```


## includes + references

LEFT OUTER JOINで１回のクエリでアソシエーションをキャッシュ


```rb:app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
  def index
    @blogs = Blog.includes(:categories).references(:all)
  end
  
  # 省略
end
```

```sql
SELECT "blogs"."id" AS t0_r0, 
		"blogs"."title" AS t0_r1, 
		"blogs"."content" AS t0_r2,
		"blogs"."deleted_at" AS t0_r4, 
		"blogs"."created_at" AS t0_r5, 
		"blogs"."updated_at" AS t0_r6, 
		"blogs"."publish_at" AS t0_r7, 
		"blogs"."status" AS t0_r9, 
		"categories"."id" AS t1_r0, 
		"categories"."name" AS t1_r1, 
		"categories"."created_at" AS t1_r3,
		"categories"."updated_at" AS t1_r4,
FROM "blogs" 
LEFT OUTER JOIN "blogs_categories" 
		ON "blogs_categories"."blog_id" = "blogs"."id" 
LEFT OUTER JOIN "categories" 
		ON "categories"."id" = "blogs_categories"."category_id"
```
Python3+CloudFront+SignedURL


# 参考
http://boto3.readthedocs.io/en/latest/reference/services/cloudfront.html
https://stackoverflow.com/questions/2573919/creating-signed-urls-for-amazon-cloudfront

# version
```
$ pip3 show boto3
Name: boto3
Version: 1.4.4

$ pip3 show cryptography
Name: cryptography
Version: 1.9

$ pip3 show botocore
Name: botocore
Version: 1.5.65
```

# 共通関数

```
from botocore.signers import CloudFrontSigner
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from datetime import datetime, timedelta
import pytz
```
```
def rsa_signer(message):
    with open('path/to/key.pem', 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )
    signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1())
    signer.update(message)
    return signer.finalize()
```

# Signed URLを発行
## Expiresパラメータを使う場合

5分有効なSinged URL

```
def rsa_signer(url):
    expire_date = datetime.now().replace(tzinfo=pytz.timezone('Asia/Tokyo')) + timedelta(minutes=5)
    cloudfront_signer = CloudFrontSigner('APK・・・・・・・・', rsa_signer)
    return cloudfront_signer.generate_presigned_url(
        url,
        date_less_than=expire_date,
    )
```

## Policyパラメータを使う場合
5分有効なSinged URL

```
import json
```
```
def rsa_signer(url):
    expire_date = datetime.now().replace(tzinfo=pytz.timezone('Asia/Tokyo')) + timedelta(minutes=5)
    cloudfront_signer = CloudFrontSigner('APK・・・・・・・・', rsa_signer)
　　　　　　　　policy = {
        'Statement': [
            {
                'Resource': url,
                'Condition': {
                    'DateLessThan': {
                        'AWS:EpochTime': int(expire_date.timestamp()),
                    }
                }
            }
        ]
    }
    return cloudfront_signer.generate_presigned_url(
        url,
        policy=json.dumps(policy),
    )
```

# 謎
`hashes.SHA1()`
を、
`hashes.SHA256()`
に変更したら、AccessDenied・・・。
推測するな計測せよ（activerecord, pluck, map）

```math
コードの林を進む中、僕は手元のコンパスを見た。\\
そのコンパスには「こっちが北っぽい」とだけあった。
```


そんなのだと死にます:chicken:
リファクタする時に速いらしいという推測だけだとあの手この手があるので最良の選択ができません。
プログラマの偉い人が言いました、「推測するな計測せよ:moyai:」。

activerecordとpluckとmapでeachで回す時を例に、
rubyを使って計測してみましょう。

### 計測 :chart_with_upwards_trend:

```ruby
def ar_each
  Category.all.each do |c|
    c.name
  end
end

def pluck_each
  Category.all.pluck(:name).each do |name|
    name
  end
end

def map_each
  Category.all.map(&:name).each do |name|
    name
  end
end

Benchmark.bm 10 do |r|
  r.report "activerecord" do
    1000.times { ar_each }
  end
  r.report "pluck" do
    1000.times { pluck_each }
  end
  r.report "map" do
    1000.times { map_each }
  end
end
```

### 計測結果 :chart_with_downwards_trend:

```ruby
=> [#<Benchmark::Tms:0x007fe6a736b8a8
  @cstime=0.0,
  @cutime=0.0,
  @label="activerecord",
  @real=1.6582986700013862,
  @stime=0.20999999999999996,
  @total=1.3299999999999996,
  @utime=1.1199999999999997>,
 #<Benchmark::Tms:0x007fe6a7d0b610
  @cstime=0.0,
  @cutime=0.0,
  @label="pluck",
  @real=0.6788127159961732,
  @stime=0.06000000000000005,
  @total=0.43000000000000016,
  @utime=0.3700000000000001>,
 #<Benchmark::Tms:0x007fe6a70b3570
  @cstime=0.0,
  @cutime=0.0,
  @label="map",
  @real=1.6277251890060143,
  @stime=0.21999999999999997,
  @total=1.3099999999999998,
  @utime=1.0899999999999999>]
```

この計測結果から、このケースだとpluckが速いことが分かります。

## ただケースバイケース

この例だと、pluckが一番速いです。
ただ、1000回繰り返してやっと1秒の差なので、
シンプルに使えるactiverecordのままeach回したほうが楽です。
また、具体例は忘れてしまいましたがpluckよりもmapのほうが速くなる時もあります。
`pluck選ぶ！pluckが速いらしいから。`と推測するのはやめましょう。
ただプロジェクト全体でpluckに統一しちゃえば全体的に処理が軽くなるかもしれません:hugging_face:
計測して使うメソッドを決めましょう。:rabbit::turtle:
Goでのアルゴリズムクイックリファレンス第2版(ブルームフィルタ)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(ハッシュに基づいた探索)](http://qiita.com/amesho/items/47382ccf3fe2f1463008)

今回は[ブルームフィルタ](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF)

> ブルームフィルタ（Bloom Filter）は、1970年に Burton H. Bloom が考案した空間効率の良い確率的データ構造であり、要素が集合のメンバーであるかどうかのテストに使われる。偽陽性（False Positive）による誤検出の可能性があるが、偽陰性（False Negative）はない。要素を集合に追加することができるが、削除することはできない（Counting filter を使えば削除できる）。集合に要素が追加されればされるほど、偽陽性の可能性が高くなる。

+ アルゴリズム
  + 全て 0 に設定された m ビットのビット配列
  + k 個のハッシュ関数が定義されており、それぞれがキー値を m 個の配列位置のいずれかにマッピング

https://play.golang.org/p/bDnlUmvXhN

```go
package main

import "fmt"

const SIZE = 1999

func hashes(a *[]int) []int {
	xs := []int{0, 0, 0}
	for _, v := range *a {
		xs[0] = xs[0]*137 + v
		xs[1] = xs[1]*69 + v
		xs[2] = xs[2]*545 + v
	}

	hashes := make([]int, 3)
	for i, _ := range xs {
		hashes[i] = xs[i] % SIZE
	}

	return hashes
}

type BloomFilter struct {
	BitArray *[]int
}

func (bf *BloomFilter) add(a *[]int) {
	for _, v := range hashes(a) {
		(*bf.BitArray)[v] = 1
	}
}

func (bf *BloomFilter) query(a *[]int) bool {
	for _, v := range hashes(a) {
		if (*bf.BitArray)[v] == 0 {
			return false
		}
	}
	return true
}

func main() {
	ba := make([]int, 0)
	for i := 0; i < SIZE; i++ {
		ba = append(ba, 0)
	}
	bf := &BloomFilter{&ba}

	ary := []int{1, 2, 3}

	bf.add(&ary)

	if bf.query(&ary) {
		fmt.Println("ok")
	}

	ary2 := []int{1, 2, 3, 4}

	if !bf.query(&ary2) {
		fmt.Println("ng")
	}
}
```


西尾さんのblogにあった実装を参考にさせていただきました。

+ 参考
  + [Bloom filterのシンプルな実装](http://d.hatena.ne.jp/nishiohirokazu/20080213/1202912207)
  + [Bloomフィルターについて調べた](https://siguniang.wordpress.com/2012/02/01/bloom-filter/)

次回は二分探索木です。
ホスト名"localhost"でローカルサーバーに接続できない問題いろいろ（主にWindows環境)

# はじめに
開発中のWebアプリには"localhost"というホスト名で接続するのが一般的ですが、昨今のIPv6のOSサポートにより、いろいろな問題が起きるようになりました。
※ 本記事の再現環境はWindows 10 Proです。Linuxなどの環境では現象は異なるかもしれません。

# 詳細はいいから、今すぐ解決したい場合

- localhost というホスト名でローカルサーバーに繋らないと思ったら、代わりに 127.0.0.1 を使用してください。恐らく問題は解決します。

# 詳細

ここからが本記事の本編です。詳細を知りたい人は読んでください。抽象的な説明は避け、実際に遭遇した現象で説明します。

## ホスト名 "localhost" とは
かつて、IPv4しか無い時代には "localhost" とは 127.0.0.1 (ループバックデバイス)であることに疑いはありませんでした。
OSがIPv6をサポートした今では、"localhost" は 127.0.0.1(IPv4アドレス) と ::1(IPv6アドレス) の両方を指します。
これがいろいろな問題を引き起こします。

## 遭遇した問題

### Rubygemsのredisクライアントから "localhost" で接続するとredis-serverに接続できない
redis-cli からは "localhost"を使って接続できるので、かなりわかりにくい現象です。
原因は次のようなことだと推測できます。

- 事実:Windowsのredis-serverは 127.0.0.1:6379 のみlistenしており ::1:6379 は listenしていません。

- 推測:Rubyのクライアントは "localhost" は ::1:6379 のみを使う。redis-cliは 127.0.0.1:6379 を使う。

### RubyのWEBrickで起動したHTTPサーバーに Google Chrome Extensionから http://localhost/ で接続するとconnectに3秒かかる

実際には次のようになります。

    1回目は即connectする。
    2回目は3秒かけてconnectする。
    3回目は即connectする。
    4回目は3秒かけてconnectする。この繰り返しとなります。
    .
    .

- 事実:WEBRrickは 0.0.0.0:80 をlistenしている。(0.0.0.0はIPv4の全てアドレスという意味。つまりIPv6ではlistenしていない)

- 推測:Google Chromeは localhostを 127.0.0.1 と ::1 に解決し、127.0.0.1 と ::1 をラウンドロビンで使う。もし繋がらない場合は3秒タイムアウトで次のIPアドレスを試している。

### RubyのWEBrickで起動したHTTPサーバーに Emacsの内蔵HTTPクライアントから接続できない

詳細は説明しませんが、恐らく localhost が ::1 に解決されるのでしょう。

# さいごに

この記事のような現象はサーバーがIPv4とIPv6でlistenするようになるのが一般的になるまで発生し続けるのでしょう。
Mocha+Sinon.JSでjQueryのajaxコールを、XMLHttpRequestを置き換えてテストする。


# 概要
前回の[Mocha+Sinon.JSでjQueryのget, ajaxをスタブに置き換えてテストする。 - Qiita](http://qiita.com/_teruchi/items/2062878c428afe92a89b)では、Sinon.JSのstubを使って、
`$.get`や`$.ajax`のコールバックを置き換えることでテストしました。

本記事では、jQueryの`$.get`, `$.ajax`が内部で使っている`XMLHttpRequest`を置き換えることで、
`$.post`などに対しても置き換えを行います。


# 環境
macOS Sierra *10.12.5*
Docker for Mac *17.03.1-ce-mac12 (17661)*


# 準備
[前回](http://qiita.com/_teruchi/items/2062878c428afe92a89b)同様にDocker上で環境構築します。

https://github.com/teruchi/mocha-sinon


# テスト実行！
`docker.sh`の中にdockerコンテナ内でmochaを起動するスクリプトを入れておいたので、それを使います。

```bash
$ ./docker.sh mocha opt/fake.js
```

こんな感じのメッセージが出力されるはずです。

```
  Test User API
    ✓ get /api/users/100


  1 passing (45ms)
```

# 解説

## Dockerコンテナ内の環境について

### Dockerfile
Dockerfileは前回同様です。

### docker.sh

前回からの変更点です。

```bash:docker.sh
"mocha" )
    TARGET=`echo $2 | sed 's/^opt\///'`
    shift
    shift

    docker run \
      --rm \
      --name ${SERVICE_NAME} \
      -v "$(pwd)"/opt:/opt \
      ${REPO}:${TAG} \
      mocha ${TARGET} $@
    exit
    ;;

```

`$ ./docker.sh mocha opt`まで入力したところでTABを押すとbash であればファイルリストが表示されます。
そのまま、ローカルのファイルを`$ ./docker.sh mocha opt/fake.js`という形で指定すると、
`TARGET`の行にあるように、`opt/`を外すことでコンテナ内のパスに置き換えてくれます。


### テストコード

今回のテストコードです。

```javascript:fake.js
// Sinon.JS初期化
var sinon = require('sinon');
var assert = require('assert');

// windowオブジェクト生成
var jsdom = require('jsdom/lib/old-api.js');
global.window = jsdom.jsdom().defaultView;

// jQuery初期化
var $ = require('jquery');


/**
 * User APIのテスト
 */
describe('Test User API', function () {

    var server;
    var spy;

    /**
     * before test
     */
    before(() => {
        // sinon Fake Server生成
        server = sinon.fakeServer.create();

        // XMLHttpRequest置き換え
        global.window.XMLHttpRequest = server.xhr;

        // Sinon Spy初期化
        spy = sinon.spy();
    });

    /**
     * after test
     */
    after(() => {
        server.restore();
    });

    /**
     * $.getのテスト
     */
    it("get /api/users/100", () => {
        // Initialize
        var response = {
            id: 100,
            name: "teruchi"
        };

        // Test
        $.getJSON('/api/users/100', spy);


        server.respond(
            'GET',
            '/api/users/100',
            [
                200,
                {
                    'Content-Type': 'application/json'
                },
                JSON.stringify(response)
            ]
        );

        // Assertions
        assert(spy.calledOnce);

        assert(spy.calledWith(response));
    });
});
```

前回うまくいかなかったと書きましたが、
`global`の`XMLHttpRequest`を、
`sinon.fakeServer`の`xhr`に置き換えることで動くようになりました。


# あとがき

普段、PHPUnitを使っている身としては、sinon.stubの方がテストを考えやすい場面が多いですが、
APIの実装を記述しながらのテストコードの方がわかりやすい場面もあると思います。
場面によって使い分けるといいと思いました。
Access 2000/2003 +VB6.0 /VB5.0 ODBCDirect 幻の技術


###歴史の谷間にみつかったODBCDirect
[マイクロソフトのデータアクセス技術 の変遷をたどる PDF 断片](www.shoeisha.com/mag/dbm/pdf/200401/1.pdf)
2010年に[廃刊](http://d.hatena.ne.jp/matu_tak/20100531/1275241115)してしまったDB Magazine の2004年1月の記事

>DAO 1.0は1993年に発売されたVB3.0（日本未発売）に搭載され「Microsoft Access1.1（以下、Access)」のJetエンジンを利用するインタフェースとして登場。
当時のJetエンジンにはパフォーマンスに難があったが、2.0で大きく改善。
1995年12月に発売された日本語版のVB4.0ではDaoのVersionはAccess95と同じDao3.0 Jetエンジン改良
VB5.0ではAccess97と同じDao3.5。数年前までVB5.0とAccess97の組み合わせで開発
現在はAccess2000とDao3.6とVB6.0で開発される
VB5.0 Dao3.5 Jetエンジンを介さずに直接ODBC対応データベースへ接続することが可能に

```vbnet:ODBCDirect
'This Sample Only VB 5.0 / VB 6.0
Dim ws as Dao.WorkSpace
Set ws=Dbengine.Workspaces(0)
Dim db as Dao.databes
Set db = ws.OpenDatabase("C:\Northsind.mdb")
Dim rs as Dao.Recordset
set rs = db.OpenRecordset("Select * From 社員")
Do Until rs.Eof
List1.AddItem rs("氏名")
rs.MoveNext
Loop
```

　というサンプルがあった。
　これを利用すると古いMDBファイルと接続できるのかと思ったが、残念ながらそんなことはなかった。現在では使えないサンプルだからだ。
　とはいえ、見つかった以上はまとめておくと、ODBCDIrectはAccee2000 Access2003 VB6.0またはVB5.0でできた技であり、Access2007以降はサポートされていない。
このため、これを利用したAccess97/95 Access2.0への接続はできない。

現在は参考リンクのAccess2010でのODBCDirectの代替案をみて書き換える必要がある。そうしないと実行時エラーが発生する。
しかし、このODBCDirectは6年くらいしか存在しなかったという短命な技術だがセキュリティの問題でもあったのだろうか。

###この記事のもう一つの重要な点
Access1.1は日本で未発売だったということ。次の記事で重要になる。


###参考リンク

[Access 2010 での ODBCDirect サポートについて ](https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_access-mso_other/access-2010-%e3%81%a7%e3%81%ae-odbcdirect/a9122586-264c-4dad-baac-1d62471a0449?msgId=05e73371-f9b8-4422-8bd8-c5226fb75592)
[【Access】DAOのODBCダイレクト接続を、泣く泣くADO接続に書き換える。](http://plus-sys.jugem.jp/?eid=432)
[Access2010でのODBCDIRECTの代替案](https://foolexp.wordpress.com/2012/11/28/p2wpsu-5a/#respond)
>Access2013はAccessProject(ADP)がサポートされないのでほぼODBCを使うことになると思います。しかしAccess2007以降ODBCDirectは使えません。
>しかしAccess2007以降ODBCDIRECTは使えず
>実行時エラー3847
>ODBCDIRECTはサポートされません。DAOの代わりにADOを使用するには、コードを記述しなおしてください。
[Microsoft Access 2010 を使用したデータ プログラミング](https://msdn.microsoft.com/ja-jp/library/office/ff965871(v=office.14).aspx)
webcamでpix2pix

pix2pixはganのなかでも汎用力が高い。
これがリアルタイム処理がされると中々おもしろい。

ソース
https://github.com/memo/webcam-pix2pix-tensorflow


```
sudo pip install pyqtgraph
```

#学習済みモデルの取得
https://github.com/memo/webcam-pix2pix-tensorflow/releases/tag/downloads
取得したデータをmodels以下のフォルダに移動

```
wget https://github.com/memo/webcam-pix2pix-tensorflow/releases/download/downloads/gart_canny_256.tar.gz
```

#実行する

```
python webcam-pix2pix.py
```


<img width="721" alt="スクリーンショット 2017-06-26 22.35.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/f654ec15-5440-859a-160d-444bb4b0fc8f.png">
nologinアカウントのcronを設定する方法

## はじめに
ログインシェルに`nologin`が指定されているアカウントで、cronを指定する方法を記述します。

### nologinが設定されているアカウント例
```shell-session
apache:x:48:48:Apache:/var/www:/sbin/nologin
```

## nologinとは
そのアカウントにログインすることは出来ません。ログインしようとすると、以下のようなエラーメッセージが表示されます。

```shell-session
$ su - apache
This account is currently not available.
```

## 設定方法
crontabは、`-u user`でcrontabを設定するユーザーを指定できます。これにより、nologinアカウントにcronを設定できます。

```shell-session
$ crontab -u apache -e
```

## 参考
* [Man page of CRONTAB](https://linuxjm.osdn.jp/html/cron/man1/crontab.1.html)
【初心者向け】iOS11(beta) 入れたい（；；）

# 【初心者向け】iOS11(beta) 入れたい（；；）

## ※はじめに
- iOSのbeta版を入れたことない人向けの初心者記事です。
- ベテランの人はさよなら( ´ ▽ ` )ﾉ

:writing_hand:`先行してリリースされている開発者向けのベータ版の話です。`
:writing_hand:`誰でも入れられるパブリックベータ版はまた別になります。`
:writing_hand:→([パブリックベータはこちら(近日開始予定)→公開されました](https://beta.apple.com/sp/ja/betaprogram/))

## ※事前準備
- Apple Developer Programへの登録が必要です。
    - こちら→https://developer.apple.com/programs/enroll/jp/
    - (→そもそも登録がない人はパブリックベータ版をお待ちください。)

# :beginner:iOS11 (beta) ってどこで頂けるんですか（；；）
- ベータ版をインストールする方法は２種類あります。
    - 1.iPhoneやiPadに直接インストール
    - 2.iTunes経由でインストール
    
　　:point_up:今回は１の端末に直接インストールの方法の解説をします。

## :white_check_mark: **1.ダウンロード**
:writing_hand:こちらから → https://developer.apple.com/download/
※iPhone,iPadからアクセスしてください。
↓
iOS11 betaのDownloadボタンを
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/a1308421-8936-2bb9-3b9b-929e56d30e58.png" width=70%>
↓
許可する!
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/6c71d1ef-4bee-9666-01da-807722c04f01.png" width=40%>
## :white_check_mark: **2.プロファイルインストール**
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/9cf742e2-09bd-a5fe-7e95-d36d43624c2a.png" width=40%>
↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/9a8ad1e6-fc0f-216e-e3fd-67ca3e1de133.png" width=40%>
↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/8b456e55-7f4e-5b2a-bd67-34a2e1916c4b.png" width=40%>
## :white_check_mark: **3.再起動**
再起動が必要です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/f51e17e3-b1a2-5365-c8a0-16d99fc3ea38.png" width=40%>

## :white_check_mark: **4.iOS11 beta インストール**
再起動が完了したらこちらの画面へ
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/a7a10e5c-0a25-4259-b6a3-bed864723db1.png" width=40%>

「設定」 > 「一般］ > 「ソフトウェア・アップデート」で、
「iOS11 Developer beta」と表示されているので、ダウンロードとインストールへ進みます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/5c3d3b71-9bb6-7fc1-c61e-06494f24aea6.png" width=40%>

完了したら再起動があります。
## :white_check_mark: **5.完了**
iOS11インストール完了です！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/ba66a18d-653b-f89f-5939-ef25b442112c.png" width=40%>

:bow:おつかれさまでした。:bow:



## :runner_tone2: おまけ :runner_tone2: 
- Xcode betaの入れ方はこちら→http://qiita.com/keroppi0_0/items/8396e05b57e377b9eaa0
【初心者向け】Xcode 9 (beta) 入れたい（；；）


## ※はじめに
- Xcodeのbeta版を入れたことない人向けの初心者記事です。
- ベテランの人はさよなら( ´ ▽ ` )ﾉ

## ※事前準備
###### :beginner:MacOSが古いと入らないので注意です（；；）
→:writing_hand:macOS 10.12.4以降にアップデートしてください。
 > About Xcode 9 beta
 >> Supported Configurations
 >> Xcode 9 beta requires a Mac running macOS 10.12.4 or later.
 >> Xcode 9 beta includes SDKs for iOS 11, watchOS 4, macOS 10.13, and tvOS 
 11.


# :beginner: Xcode 9 (beta) ってどこで頂けるんですか（；；）
## :white_check_mark: **1.ダウンロード**
:writing_hand:こちらから → https://developer.apple.com/download/
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/11a709ce-dfaa-42ae-8797-6a6241896b29.png" width=80%>

:runner:※4.9GBあるので注意してください:runner:
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/9751cc4e-fb04-111d-af39-42a9ddbc3417.png" width=30%>

## :white_check_mark: **2.インストール作業**
xipファイルを開く
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/72bf9368-16cf-44c5-e6d5-e4a6b0abb852.png" width=30%>
↓
展開中
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/80fcbcb7-a3cc-0e7a-efb3-1b57f4ff5157.png" width=40%>
↓
検証中（ここが長い、10分とかかかるかもです）
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/89c95592-e7d4-b829-047c-ea9a4f643dc2.png" width=40%>
↓
キタッ！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/13db0eee-ca5a-4824-9898-e95cd6734061.png" width=70%>

## :white_check_mark: **3.Xcode-beta.app 開いてみる**

同意してしまいましょう（Agree）
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/6c800398-688d-169d-6b56-7865213f536f.png" width=50%>

↓
パスワード聞かれるかも
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/348255c5-b80c-23ce-ff19-45c01faafdf0.png" width=40%>

↓
少々お待ちください
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/0f1cfbfe-e09a-5f84-3bca-6579d59b1a03.png" width=40%>

↓
キタァ！！(Xcode9.0 beta入りました)
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/117dfbff-5337-dcac-d72d-35218c94362a.png" width=60%>

:bow:おつかれさまでした。:bow:

## :runner_tone2: おまけ :runner_tone2: 
- iOS betaの入れ方はこちら→http://qiita.com/keroppi0_0/items/97e428777541e4bcc098
マルチエリアOSPFを復習する

たまーにしか使わない知識ってあるじゃないですか。そういうのは大抵、いざ使おうとすると全部忘れているのが常であって、それに対する有効な対処策は忘れないうちに文書に書いてネットに上げることです。というわけで今回のお題はOSPFのエリア！

本稿ではIPv4用のOSPFv2 ([RFC2328](https://tools.ietf.org/html/rfc2328), [Google翻訳](https://rfcs.web.fc2.com/rfc2328.html)) を扱います。IPv6用のOSPFv3 ([RFC5340](https://tools.ietf.org/html/rfc5340), [Google翻訳](https://rfcs.web.fc2.com/rfc5340.html)) は扱いません。

#エリア6種

OSPFのエリアは以下の6種類です。ここは暗記必須です。

||エリアの種類|英語表記|できること|
|:--|:--|:--|:--|
|1|バックボーンエリア|Backbone area|外部ASとの接続|
|2|標準エリア|Standard area|外部ASとの接続、トランジットエリア|
|3|スタブエリア|Stub area||
|4|NSSA|Not so stubby area|外部ASとの接続|
|5|トータリー・スタブエリア|Totally stub area||
|6|トータリーNSSA|Totally NSSA|外部ASとの接続|

普通の端末を接続するのは、どのエリアでもできます。

バックボーンエリアは、一つのASに一個しかない「エリア0」です。それ以外のエリアはゼロ個の場合もあれば、複数個の場合もあります。

トータリー・スタブエリアはCisco独自です。

##トランジットエリア

バックボーンエリア以外の全てのエリアは、バックボーンエリアに直接接続するのが基本です。

。。。ではあるのですが、何事にも例外はあって、バックボーンでないエリアにさらに別のエリア（孫エリア）を接続することも可能です。この場合、仮想リンクという機能を使います。孫エリアとバックボーンエリアの間に入るエリアをトランジットエリアと呼びます。トランジットエリアになれるのは標準エリアだけです。

##外部AS

外部ASとは、要はOSPFが通っていない領域です。外部ASはEIGRPでもRIPでも別枠のOSPFでも何でも構いません。外部ASとの間のルーティングは、スタティックルーティングでもBGP4でも構いません。

外部ASとの接続を持てるのは、バックボーンエリアと標準エリアとNSSAとトータリーNSSAです。スタブエリアとトータリー・スタブエリアはダメです。

外部ASには二種類あります。0.0.0.0/0に繋がっているASと、そうでないASです。0.0.0.0/0に繋がっているASはバックボーンエリアか標準エリアに繋ぐのが基本です。その理由は、後述するデフォルトルートへの集約です。

#エリアの種類と傾向

標準エリアよりもNSSA、NSSAよりもスタブエリアのほうが、ルータの負荷が低いです。また、Totallyがつくエリアのほうが、つかないエリアよりも負荷が低いです。負荷が低いのと引き換えに、限られたことしかできないし、経路制御が大雑把になります。

ここでいう「経路制御が大雑把になる」とは、エリア境界 (ABR) で「デフォルトルートへの集約」が行われるということです。

- バックボーンエリアと標準エリアでは、デフォルトルートへの集約は行われません。
- TotallyがつかないスタブエリアとNSSAでは、ABRが外部ASへの経路をデフォルトルートに集約してエリア内に配信します。
- Totallyがつくトータリー・スタブエリアとトータリーNSSAでは、それに加えて自AS内の他エリアへの経路もデフォルトルートに集約して配信します。

以上！ここまでの知識では本番系ネットワークの詳細設計や障害対応、受験などには不足ですが、ポンチ絵をレビューする程度のミッションなら何とか乗り切れるかと思います。幸運を祈る。

#参考文献

J. Moy (1998)
OSPF Version 2
https://tools.ietf.org/html/rfc2328 ([Google翻訳](https://rfcs.web.fc2.com/rfc2328.html))
CakePHP 3.4.9リリースされました

CakePHPの最新バージョンをもっとよく知るためにリリースノートの翻訳と関連のPRを紹介しています。

## 本家リリース

twitter: https://twitter.com/cakephp/status/879250075674963968
release: https://bakery.cakephp.org/2017/06/25/cakephp_349_released.html

## リリース内容 

CakePHP開発チームは、CakePHP 3.4.9 を発表しました。今回のリリースは、いくつかのコミュニティ報告された問題を修正する3.4ブランチのメンテナンスリリースです。

- `RedisEngine`は、キーをクリアするときに複数の削除操作を使用するようになりました。これにより、redisクラスタとの互換性の問題が解決されます。 [#10781](https://github.com/cakephp/cakephp/pull/10781)
- [ドキュメント](https://book.cakephp.org/3.0/en/development/testing.html#loading-fixtures-in-your-test-cases)にあるサブディレクトリのプラグインfixtureのエラーを解消 [#10799](https://github.com/cakephp/cakephp/pull/10799)
- `HasMany`アソシエーションの`Query::contains（）`で`Finder`オプションを使ったときの動作が期待どおりになりました。[#10807](https://github.com/cakephp/cakephp/pull/10807)
- `IntegrationTestCase`は`getRequestTarget（）`を使ったときに正しい環境変数でシミュレートされるようになりました。[#10808](https://github.com/cakephp/cakephp/pull/10808)
- `Debugger::excerpt（）`をファイルの最後の行で使用できるようになりました。[#10818](https://github.com/cakephp/cakephp/pull/10818)
- PHPUnit5.7.21とCakePHPの後方互換shimの非互換性が解決されました。[#10817](https://github.com/cakephp/cakephp/pull/10817)
emacsのauto-mode-alistが動かない！？

#何が起こったか

perl を書こうと思って、`.emacs.d/init.el` に以下のような設定をしました。

```lisp:.emacs.d/init.el
(add-to-list 'auto-mode-alist '("\\.pl\\'" . cperl-mode))

(defun hookfunc-cperl-mode ()
  (flycheck-mode))

(add-hook 'cperl-mode-hook 'hookfunc-cperl-mode)
```

find-file(`C-x``C-f`)で、新しいファイルを開くと、ちゃんと`cperl-mode`になったのですが、再度エディットしようと思い、ファイルを開くと…　　あら？　普通の`perl-mode`になってしまいました。

#調査開始ｗ

`buffer`の  エディットモードは`lisp/files.el`(自分の環境では`/usr/local/share/emacs/25.2/lisp`)で定義されています。

ソースが長いので、コメントを見てみます。

```lisp:files.el
(defun set-auto-mode (&optional keep-mode-if-same)
  "Select major mode appropriate for current buffer.

To find the right major mode, this function checks for a -*- mode tag
checks for a `mode:' entry in the Local Variables section of the file,
checks if it uses an interpreter listed in `interpreter-mode-alist',
matches the buffer beginning against `magic-mode-alist',
compares the filename against the entries in `auto-mode-alist',
then matches the buffer beginning against `magic-fallback-mode-alist'.
```

1.　`-*-`のタグ（# -*- mode:cperl -*-）
2.　`interpreter-mode-alist`(shebangをチェックしてモードを決める)
3.　`magic-mode-alist`（正規表現が最初の行にマッチするかでモードを決める）
4.　`auto-mode-alist`（ファイル名がマッチするかで、モードを決める）
5.　`magic-fallback-mode-alist`（上記にマッチしない場合、最後にもう一回最初の行をチェック）

の順番で確認してメジャーモードを決めているようです。

最初にファイルを作る場合は、４．でめでたく`cperl-mode`を認識したのですが、ファイルを一度作ったあとにもう一度開いたときには２．でメジャーモードが判定されたため、`perl-mode`になってしまったようです。

#どうしたか

今回の原因は、上記の２．でメジャーモードが判定されるのが原因なので、

```lisp:.emacs.d/init.el
(add-to-list 'auto-mode-alist '("\\.pl\\'" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
(defun hookfunc-cperl-mode ()
  (flycheck-mode))
```
のようにしました。　これでめでたく既存のファイルも`cperl-mode`になりました。

#その後

色々書いてきましたが、今は下記の通りで落ち着いています。

```lisp:.emacs.d/init.el
(defun hookfunc-perl-mode ()
  (cperl-mode)
  (flycheck-mode))
(add-hook 'perl-mode-hook 'hookfunc-perl-mode)
```
なんだかなーな、感じですが、これが一番ラクですw
Stage 1 Float16Array (with ponyfill)

## イントロダクション

### 半精度浮動小数点数について

IEEE754 で半精度浮動小数点数 Half-precision floating-point format（以下 float16 と表記します）として 16bit の浮動小数点数が定義されています。主に機械学習やコンピュータグラフィックスにおいて、GPU との通信やメモリのコスト削減を目的に用いられています。

https://ja.wikipedia.org/wiki/%E5%8D%8A%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

### JavaScript における扱い

WebGL では `"OES_texture_half_float"`, `"OES_texture_half_float_linear"`, `"EXT_color_buffer_half_float"` の拡張を用いることで float16 を扱うことができます。また WebGL 2.0 ではデフォルトで扱えます。

しかし残念なことに現状 JavaScript では float16 を扱える `TypedArray` や `DataView` のメソッドは存在しません。つまり Fetch API などで直接バイナリを取得し、そのまま WebGL に渡すといったことは出来ますが、float16 の値を JavaScript で動的に変更したいときに `number`（64bit float）型との変換を自前で用意しなければなりません。

## パッケージの紹介

というわけで float16 を扱えるパッケージを公開しました。

https://github.com/petamoriken/float16/

### 使い方

README.md を読んでいただけるとわかると思いますが、`Float16Array` の他にも `getFloat16`, `setFloat16`, `hfround` が用意されています。基本的に ECMAScript の `TypedArray`, `DataView`, `Math.fround` と同じように使えると思います。

`Float16Array` の実装を見てもらえるとわかると思いますが、`Proxy` でラップされています。よって IE 11 では動きません。また WebGL にバイナリを渡す時に `ArrayBuffer` や `Uint16Array` として渡す必要があります。

例えば `"OES_texture_half_float"` を用いて `Float16Array` のバッファを渡したい場合、以下のように `Uint16Array` でラップしなければなりません。

```javascript
const ext = gl.getExtension("OES_texture_half_float");

const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, ext.HALF_FLOAT_OES, new Uint16Array(image.buffer));
```

https://developer.mozilla.org/en-US/docs/Web/API/OES_texture_half_float

## Stage 1

喜ばしいことに ES Discuss の該当のトピックにこのパッケージの周知を図ったところ、TC39 May 23, 2017 Meeting にて取り上げていただき、Stage 1 入りを果たしました。

https://esdiscuss.org/topic/float16array#content-16

https://github.com/tc39/notes/blob/master/meetings/2017-05/may-23.md#16ig-float16-on-typedarrays-dataview-mathhfround-for-stage-1

今後の展望としてはこのミーティングで挙げられた問題点や疑問点の解消、float16 が本当に JavaScript に必要なのかといった点で議論がなされると思いますので、もしよろしければフィードバックをいただければ幸いです。

## 参考

実装に用いたアルゴリズム

http://fox-toolkit.org/ftp/fasthalffloatconversion.pdf
PHP7の宇宙船演算子 <=> 並みにPHP5で短く書く方法

```php:PHP7
$a <=> $b
```

```php:PHP5（読みやすいが比較回数が常に2回）
($a > $b) - ($a < $b)
```

```php:PHP5（やや読みにくいが比較回数が1回になる場合もある）
+($a > $b) ?: -($a < $b)
```

整数キャストで true → 1，false → 0 と変換されることを利用している


```php
function compare($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return $a < $b ? -1 : 1;
}
```

↑こんなの書かなくてええんやで！

----

ちなみに中身が整数に限定されるときはこれだけで十分です

```php
$a - $b
```

浮動小数点数とか文字列とか入ってるとアウト
UnrealEngine4.16 ～NvClothの検証　Physical Mesh編～

どうもです。前回の **[NvCloth](http://qiita.com/pokoponmaru/items/3c9f7855e37f55e804f3)**の記事から
の検証の続きです。**Physical Mesh**の結果まとめましたので記述します。

そもそも**Physical Mesh**とは　なんぞや？
2015年度のCEDECでEPICの方の講演から転載いたします→**[youtube](https://www.youtube.com/watch?v=tpwgqPJg98k&t=540s)**

クロスシミュレートとあわせ、ハイメッシュの動きをローポリゴンのメッシュでも似たように
再現できるとのことから処理（パフォーマンス）を考慮した作りでクロスが使えるような感じです。
（間違ってたらすみません）

本題戻りまして手順も大体把握しました。
まずはその手順を位置から動画に撮りましたのでご覧になられたほうが
一番早いかと思います。
以下どうぞ。
https://1drv.ms/v/s!An4e2LDSu7INggOaNhk_sVfduzZ6

恥ずかしながら途中失敗もしていますが、表面と裏面のラッチ処理もどうなったのかも気になるところですね。。。

動画をみただけじゃあれなので・・・箇条書きではありますがメモ的な。
![19420487_1407588999320304_614659347192973844_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/0b6a9745-8b83-9e4a-c170-444210c05736.jpeg)

実際にEPIC様の方にも回答いただいて
今年やったアンリアルフェスの動画をみてください。
**[youtube](https://www.youtube.com/watch?v=oBAASH3hl8w&index=1&list=PLr_Cbd4sUDTz85RU6qQi9Hpvq0a3-ggKk&t=1457s)**
のと
公式のヘルプを見てください。
**[公式](https://l.facebook.com/l.php?u=https%3A%2F%2Fdocs.unrealengine.com%2Flatest%2FJPN%2FEngine%2FPhysics%2FCloth%2FOverview%2Findex.html&h=ATOwwl1MNbljdp1n1822RrQIceh5DtFhXC8MmROVxXIv1HTDMHoiaZkEajvpEcATfUkPXwKUHt3OIfeiJ566vGYNJn9hnlIpKBwUXeqSqThRDdCpfh87x7whYaVNfiVf8dmzvJtQqDM)**

とのことでした。

自分ではＵＥ４での使用する用語とかがまだまだちんぷんかんぷんなので
おっつかない感じですが・・・。

4.16からはmayaや3dsMAX等DCCツールから設定しなくてもまだ効率図れるかもしれないですね。
Riotで複雑な<table>を構築する場合に

Riot.jsで複雑なテーブルを作ろうとしたら、ハマったところがありました。

## `each`で回す

Riotには、タグに`each={item in items}`のように書くことで、要素1つごとにそのタグを作る、という機能があります。

また、「1つの`<dl>`の中で、要素ごとに`<dt>`と`<dd>`のペアを作りたい」というような、要素ごとに1つのタグを繰り返すのではない場合も、`<virtual each={...}>`のような`<virtual>`タグを使うことで、複数タグをセットでループさせられます。

## 限られたタグしか入らない場所

ところが、そうは問屋がおろさない場所があります。それはテーブルの中で、`<table>`タグの中には決まった要素しか入れられないので、Riotのカスタムタグや`<virtual>`を置こうとしても、うまく動かなくなってしまいます。

## とりあえずの解決策

`<table>`内で`<virtual>`がうまく回らないことは[riotのissue](https://github.com/riot/riot/issues/1428)にも投げられていましたが、そこでは**`<tbody>`で`each`する**という解決策が紹介されていました。`<tbody>`を複数書いていい、というのは知らなかったのですが、とりあえずはこれで動くようにはできました。
Read the Docsでコンパイルがうまくいかなかったのでローカル環境でデバッグした話

# tl;dr

* [Read the Docs](https://readthedocs.org/) (RTD)でよくわからないバグでコンパイルできない -> [Docker](https://hub.docker.com/r/readthedocs/build/)を使うと簡単にデバッグできるよ。

# 問題

* RTDにはじめてドキュメンテーションを登録してみたところ、エラーでまくり。
    - [このGithubレポジトリ](https://github.com/koreyou/word_embedding_loader/tree/0.1.0)を[このRTD](http://word-embedding-loader.readthedocs.io/en/latest/)としてアップロード。
    - ローカルの環境ではうまくいくのに`ImportError`がでていた。

# やったこと

[公式ドキュメンテーション](http://docs.readthedocs.io/en/latest/builds.html)にあるとおりRTDはそのドキュメンテーションビルド手順を完全に公開しています。また、ビルドに使う環境の[dockerイメージ](https://hub.docker.com/r/readthedocs/build/)も公開しているので、手元で同等の環境を作り、デバッグすることが容易です。

まず、dockerイメージをpullし、interactive shellで起動します。

```bash
docker run -it readthedocs/build:latest /bin/bash
```
ちなみに、本記事記載時は`2.0`のtagが`latest`でした。

次に、管理画面のビルドログを元にコマンドを実行していきます。本来であれば公式のビルド方法をpythonから読み解いてもいいのですが、面倒なのでディレクトリ名などから適当に行間をうめつつ実行していきます。

```bash
export READTHEDOCS=1  # 追加分
mkdir -p /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs  # 追加分
git checkout https://github.com/koreyou/word_embedding_loader.git /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest
cd /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest  # 追加分

python2.7 -mvirtualenv --no-site-packages --no-download /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest 
source /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest/bin/activate  # 追加分
python /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest/bin/pip install --use-wheel -U --cache-dir /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/.cache/pip sphinx==1.5.3 Pygments==2.2.0 setuptools==28.8.0 docutils==0.13.1 mkdocs==0.15.0 mock==1.0.1 pillow==2.6.1 readthedocs-sphinx-ext\<0.6 sphinx-rtd-theme\<0.3 alabaster\>=0.7,\<0.8,!=0.7.5 commonmark==0.5.4 recommonmark==0.4.0 
# requirements.txtのpathは自ら指定していないので、前処理としてrequirements.txtの場所を探してくれている模様
python /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest/bin/pip install --exists-action=w --cache-dir /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/.cache/pip -r/home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/checkouts/latest/requirements.txt
python setup.py install --force 

# 元は -b readthedocs になっていたが、動かないので定番のhtmlに変更
python /home/docs/checkouts/readthedocs.org/user_builds/word-embedding-loader/envs/latest/bin/sphinx-build -T -b html -d _build/doctrees-readthedocs -D language=en . _build/html 
```

あとは問題がおきた手順のところで、`python -m pdb`なりなんなりしてデバッグしてください。

ちなみに、原因は[余計な項目をPATHに加えていたから](https://github.com/koreyou/word_embedding_loader/commit/18430b2394018fac00c9e6726cb3845490e9a9b5)でした。(RTDは`python setup.py install`を実行してくれるため、プロジェクトのパッケージディレクトリをPATHに加える必要はない)
お名前.comにて、拡張子htmlのままphpを動かす

既存サイトのheaderとfooterをincludeさせようと思い、
拡張子htmlのままphpを動かす為、「お名前.com」サーバーにてhtaccessに
以下コードを追加した。

`AddType application/x-httpd-php .php .html`

しかし、**できなかった。**

当然のようにレンタルサーバーによって書き方が違う為、
上記記述では動かない場合があるのだ。
しかし久しぶりに案件でレンタルサーバーを触り、
失念してしまっていたので、忘れないように残しておく。

#対処法
まずは「お名前.com」のQ&Aには以下のような回答がある。
[https://help.onamae.com/app/answers/detail/a_id/9096/](https://help.onamae.com/app/answers/detail/a_id/9096/)

つまりCGIとしてPHPを動かす必要があるとのこと。
一生懸命ググって、以下の方法を見つけることが出来た。


①まず、「.htaccess」には以下のように書く。

```
Action myphp-cgi /php.cgi
#AddHandler myphp-cgi .html
<Files ~ "^index\.html?$">
  AddHandler myphp-cgi .html .htm
</Files>
```
「.htaccess」がアップロードされていない場合はアップロード。
されている場合は記述を追加。パーミッションを「755」にする。

②次に、「php.cgi」というファイルを用意し、以下のように書く。

```
#! /usr/bin/bash
exec /usr/local/bin/php-cgi
```
「php.cgi」がアップロードされていない場合はアップロード。
パーミッションを「700」にする。

以上で**動くはず**。

私はこれでうまくいったが、
もしこれで動かなければ、改行コード、文字コードを
変えるといい、という情報があるので、その場合は以下のようにする。

- 「.htaccess」と「php.cgi」はSHIFT-JSのLF
- 「index.html」はUTF-8のLF

#ディレクトリを変える場合
ホームディレクトリではなく、色んなサイトをディレクトリ切って管理していて、
とあるディレクトリのみ対応させたい要件が出た。

つまり、

```
home
├ .htaccess
└ php.cgi
```

ではなく、

```
home
└ site
   ├ .htaccess
   └ php.cgi
```

とする必要がある。

この場合、先程の「.htaccess」の記述を以下のように変える必要がある。

```
Action myphp-cgi /site/php.cgi ←ディレクトリを変える
#AddHandler myphp-cgi .html
<Files ~ "^index\.html?$">
  AddHandler myphp-cgi .html .htm
</Files>
```

以上で、「site」ディレクトリ以下で拡張子「html」のままで
PHPが動き、headerとfooterがincludeできた。
Dataflowとサービスアカウント

Dataflowを実行するときには、以下３つのサービスアカウントが必要である。

| Service Account | 備考 |
|:-:|:---|
|Cloudservices Account   | 入力サイズの決定、Google Cloud Storage ファイルへのアクセス、Compute Engine ワーカーの開始などメタデータオペレーションのために使用される。  |
| Dataflow Service Account  | Dataflowサービス上でpipelineが実行されるときに使用される。  |
| ComuputeEngine Service Account  | WorkerがPipelineのファイルやリソースにアクセスするときに使用される。  |

同じGCPプロジェクト内のリソースにアクセスしにいくときにはあまり気にしなくても動作するが、違うGCPプロジェクト内のリソースにアクセスするときはドキュメントを読まず設定を怠ってると動作しないので注意。
ざっくりとまとめると下図のようにアクセスがあるので、必要なサービスアカウントを許可しておく必要がある。

<img width="777" alt="Screen Shot 2017-06-26 at 20.43.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/3aaabf2d-fea5-0e94-be56-f703878ab2c5.png">
ブックマークレットでEthereumのDAGサイズを計算する


EthereumのDAGサイズを計測する機会があったので、計算してみました。

<img width="490" alt="スクリーンショット 2017-06-26 21.02.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/188896/1bda0950-9901-1435-b9ba-b8457f6b00e5.png">

## 仕様

- [Ethash · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/Ethash)

block高（`eth.blockNumber`）に依存しているようです。


**python**

```py
def get_full_size(block_number):
    sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH)
    sz -= MIX_BYTES
    while not isprime(sz / MIX_BYTES):
        sz -= 2 * MIX_BYTES
    return sz
```

```py
WORD_BYTES = 4                    # bytes in word
DATASET_BYTES_INIT = 2**30        # bytes in dataset at genesis
DATASET_BYTES_GROWTH = 2**23      # dataset growth per epoch
CACHE_BYTES_INIT = 2**24          # bytes in cache at genesis
CACHE_BYTES_GROWTH = 2**17        # cache growth per epoch
CACHE_MULTIPLIER=1024             # Size of the DAG relative to the cache
EPOCH_LENGTH = 30000              # blocks per epoch
MIX_BYTES = 128                   # width of mix
HASH_BYTES = 64                   # hash length in bytes
DATASET_PARENTS = 256             # number of parents of each dataset element
CACHE_ROUNDS = 3                  # number of rounds in cache production
ACCESSES = 64                     # number of accesses in hashimoto loop
```

## 確認方法

### block number

- [Ethereum BlockChain Explorer and Search](https://etherscan.io/) によると執筆当時は以下

> 3932564


### 確認script

ブラウザで実行したいですよね。。  
ブックマークレットを作りました。お気に入りに登録することで確認できるようになります。

以下のスクリプトをお気に入りに登録して実行できます。

```js
javascript:
(function() {
  var DATASET_BYTES_INIT = 2**30;
  var DATASET_BYTES_GROWTH = 2**23;
  var EPOCH_LENGTH = 30000;
  var MIX_BYTES = 128;
  var isprime = function(n) {
    if (n === 2) return true;
    var s = Math.sqrt(n);
    for(var i = 2; i <= s; i++)
    if(n % i === 0) return false;
    return n !== 1;
  };
  var get_full_size = function(block_number) {
    var sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * Math.floor(block_number / EPOCH_LENGTH);
    sz -= MIX_BYTES;
    while (!isprime(sz / MIX_BYTES)) {
      sz -= 2 * MIX_BYTES;
    }
    return sz;
  };
  var block_number = prompt('block number');
  var size = get_full_size(block_number);
  var sizeGb = size / (1024**3);
  alert('dag size is ' + sizeGb + 'GB');
})();
```
TextViewの選択中の文字列を取得する方法

![on.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/7f4ca6e8-61e9-73fe-ed7e-d5791ceabfc8.gif)


```swift

func textViewDidChangeSelection(_ textView: UITextView) {

        let location = textView.selectedRange.location
        let length = textView.selectedRange.length
        let text = (textView.text as NSString).substring(with: NSRange(location:location,length: length))
        print(location)
        print(length)
        print(text)

    }
```

# 参照

[【swift】uitextviewの選択範囲の文字列を取得する方法](http://kimagureneet.hatenablog.com/entry/2016/07/04/004227)
[How to restrict cursor position in swift?](https://stackoverflow.com/questions/37639076/how-to-restrict-cursor-position-in-swift)
Digdagを使って定期的にBigQueryへクエリを投げる

digdagのスケジュール実行機能を使って毎日1回、BigQueryへクエリを投げることを実現することを試みる。

#### 環境
- digdag:0.9.12
- java:1.8.0_131

ローカルモードでスケジュール実行しないときは正常に動作していたが、スケジュール実行したところ、以下のエラーが発生。

```
Task failed with unexpected error: Secret not found for key: 'gcp.credential'
```
サーバモードで動作させたところ正常に動作するようになったため、その手順を以下に記載する。

#### 設定
設定ファイルに以下を記述

```~/.config/digdag/config
database.type=h2
database.path=~/digdag/test.db
digdag.secret-access-policy-file=~/.config/digdag/secret-access-policy.yaml
digdag.secret-encryption-key=暗号化に使うKey==
secrets.gcp.credential=~/work/json.key
```

#### 実行
digdagをserver modeで起動

```
digdag server -c ~/.config/digdag/config -L ~/digdag/server.log -l debug -O ~/digdag/logs &
```

workflowを登録

```
digdag push PJ名
```

スケジュール設定は以下を参照
https://docs.digdag.io/scheduling_workflow.html#running-scheduler

Secretを登録 

```
digdag secrets --project PJ名 --set gcp.credential=@json.key
```

server.logを見て正常に動作していることを確認できればOK。

定期的にジョブが実行されていることは確認できたが、ドキュメントに記載してる"digdag sched"を実行ないままscheduledジョブを実行させてる感じなので、正しい使い方なのかどうかまだ確証を持ててない。引き続き色々試してみる。
git stash popやgit stash clearを誤って実行してしまった時の処方箋

## 想定シーン
* あっ！意図しないブランチで`git stash pop`してしまってConflictしてわけわかんなくなった！別のブランチにこのstash内容を反映したいのに！
* あっ！日々の激務で疲れていて、わけのわからないところで`git stash clear`してしまった！死にたい！
* もうなんかよくわかんなくなってきたから、一回全部白紙に戻してstashを反映したところから人生をやり直したい

## stash を呼び戻す手順
1.まずstashを反映したかったブランチに切り替えます

2.stashの履歴を探します

下記のコマンドで、git logから探します。

```
git fsck --unreachable | grep commit | cut -d\  -f3 | xargs git log --merges 
--no-walk --grep=WIP
``` 

結果はこんな感じで出ます。

```
commit 6e54e2d5920f7464774e09b8f6d782c716494a2a
Merge: 5b70c38c 5829f39b
Author: hoge hogeo <hogeo@MacBook-Pro.local>
Date:   Wed Jun 14 21:02:11 2017 +0900

    WIP on feature/hogehoge: 5b70c38c Merge branch 'develop' into feature/hogehoge

commit baa17b7debbe43b254b5dee686e931c6a072f524
Merge: 5b70c38c b971c527
Author: hoge hogeo <hogeo@MacBook-Pro.local>
Date:   Wed Jun 14 20:48:13 2017 +0900

    WIP on feature/hogehoge2: 5b70c38c bug-fix hogehoge
```

3.目当てのcommit履歴を見つけたら、cherry-pickします

例えば、

```
commit baa17b7debbe43b254b5dee686e931c6a072f524
Merge: 5b70c38c b971c527
Author: hoge hogeo <hogeo@MacBook-Pro.local>
Date:   Wed Jun 14 20:48:13 2017 +0900

    WIP on feature/hogehoge2: 5b70c38c bug-fix hogehoge
```

のstash履歴を、現在のブランチに反映したいっ！という場合は、

```
git cherry-pick -n -m1 baa17b7debbe43b254b5dee686e931c6a072f524 <= 復元したいやつのSHA-1です
```
を実行します。
すると、現在のブランチに内容が反映(cherry-pick)されます。
やったね:v:
yhpg02

http://nabetani.sakura.ne.jp/hena/ord2/
で出題されたBit Tetrisの問題をPythonで解いてみる。

```python:yhpg02.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# https://yhpg.doorkeeper.jp/
# http://nabetani.sakura.ne.jp/hena/ord2/
import numpy as np
import math

def solve(data):
    field = createField(data)

    y = len(data.replace("-",""))/2
    for i in range(len(field)):
        isVanish = True
        for j in range(len(field[i])):
            if field[i][j] == 0:
                isVanish = False
        if isVanish == True:
            field = np.delete(field, [i], 0)
            zeroData = np.zeros((1,int(y)))
            field = np.r_[zeroData,field]

    return createResult(field)


def createField(data):
    dataArray = data.split("-")
    y = len(data.replace("-",""))/2
    field = np.zeros((int(y),8))

    for i in range(len(dataArray)):
        b = "{0:08b}".format(int(dataArray[i], 16))
        for j in range(len(b)):
            field[i][j] = b[j]
    return field.transpose()

def createResult(field):
    resultField = field.transpose()
    result = ""
    for i in range(len(resultField)):
        value = ""
        for j in range(len(resultField[i])):
            value = value + str(math.floor(resultField[i][j]))
        value = "{0:02x}".format(int(value,2))
        result = result + value
        if i != len(resultField)-1:
            result = result + "-"
    return result


def test(data, expect):
    result = solve(data)
    if result == expect:
        print("成功: " + result + "/" + expect )
    else:
        print("失敗: " + result + "/" + expect )

test("ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06" )
test("01", "00" )
test("00", "00" )
test("7a-4e", "0c-02" )
test("56-b6", "08-14" )
test("12-12-12", "00-00-00" )
test("de-ff-7b", "0a-0f-05" )
test("95-be-d0", "05-1e-20" )
test("7c-b0-bb", "1c-20-2b" )
test("7a-b6-31-6a", "3a-56-11-2a" )
test("32-0e-23-82", "18-06-11-40" )
test("ff-7f-bf-df-ef", "0f-07-0b-0d-0e" )
test("75-df-dc-6e-42", "35-5f-5c-2e-02" )
test("62-51-ef-c7-f8", "22-11-6f-47-78" )
test("0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b" )
test("aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f" )
test("ff-55-d5-75-5d-57", "0f-00-08-04-02-01" )
test("fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f" )
test("fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f" )
test("d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e" )
test("38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a" )
test("fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f" )

```
Macで離席時にキーボードを使わずにスクリーンロックする

# はじめに
業務で使用するパソコンは、多くの場合離席時にスクリーンロック(画面ロック)をするように決まっていると思います。
Windowsの場合は <kbd><kbd>Win</kbd>+<kbd>L</kbd></kbd>で画面ロックできますが、
Macの場合は<kbd><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Power</kbd></kbd>で(個人的に)ちょっと押しにくいです。
なので、キーボードを使用しない画面ロックを使用しています。

# 画面ロック設定

## 前提条件
**システム環境設定** > **セキュリティとプライバシー** > **一般**タブ にて、
**スリープとスクリーンセーバの解除にパスワードを要求**を**すぐに**で設定します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/62796/9360a9c7-622e-ac37-d009-9a978d80c3d6.png)

## ホットコーナーの設定
1. **システム環境設定** > **デスクトップとスクリーンセーバ** を開きます
![2.png](https://qiita-image-store.s3.amazonaws.com/0/62796/754cc87d-c826-43e8-502f-51b31d233b3b.png)
2. 設定画面右下の**ホットコーナー**を開きます
3. 任意のコーナー(オススメは左下)にて **ディスプレイをスリープさせる** を設定します
![3.png](https://qiita-image-store.s3.amazonaws.com/0/62796/8e85c782-ce75-d0f6-47fc-8577f4134782.png)

これで、カーソルを任意のコーナーに移動しただけでディスプレイがスリープ
(前提条件の設定により、すぐに画面がロック)するようになります。

# Special Thanks
@zwirky さん、便利な設定を教えていただきありがとうございます！
Route53にDNS自動登録


- EC2インスタンスを起動すると内部DNSにAレコードを登録し、停止するとAレコードを削除するinitスクリプトを作成しました。
”ZONE_NAME”だけ書き換えてあとはコピペでいける！はずです！

# 起動停止スクリプト作成

```bash:/etc/init.d/aws_route53_edit
#!/bin/bash
# chkconfig: 2345 99 10
# description: regist A record to aws route53
# Author:



ZONE_NAME="ゾーン名"
HOST_NAME=$(aws ec2 describe-tags --output text --query "Tags[?ResourceId==\`$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\` && Key==\`Name\`].Value")
IP_ADDRESS=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones | grep "Id" | awk '{print $2}' | sed -e 's/\/hostedzone\///' | sed -e 's/\,//' | sed -e 's/\"//g')
LOCK=/var/lock/subsys/aws_route53_edit


case "$1" in
  "start" )

  ARECORD_JSON="{
    \"Changes\" : [
      { \"Action\" : \"UPSERT\",
        \"ResourceRecordSet\" : {
          \"Name\" : \"${HOST_NAME}.${ZONE_NAME}\",
          \"Type\" : \"A\",
          \"TTL\"  : 60,
          \"ResourceRecords\": [
            { \"Value\" : \"${IP_ADDRESS}\" }
          ]
        }
      }
    ]
  }"
  touch $LOCK
  ;;

  "stop" )

  ARECORD_JSON="{
    \"Changes\" : [
      { \"Action\" : \"DELETE\",
        \"ResourceRecordSet\" : {
          \"Name\" : \"${HOST_NAME}.${ZONE_NAME}\",
          \"Type\" : \"A\",
          \"TTL\"  : 60,
          \"ResourceRecords\": [
            { \"Value\" : \"${IP_ADDRESS}\" }
          ]
        }
      }
    ]
  }"
  rm -f $LOCK
  ;;

  *)
  echo $"Usage: $0 {start|stop}"
  exit 2
  ;;

esac
```

# 自動起動停止登録

```bash
sudo chmod 755 /etc/init.d/aws_route53_edit
sudo chkconfig --add aws_route53_edit
sudo chkconfig --list aws_route53_edit
```

# 確認

- マネジメントコンソールから落とし上げをして別ウィンドウでRoute53を監視

# ハマったところ

- ロックファイル
/var/lock/subsys/以下にファイルが無いとうまく動かないことがしばらくわからず時間をかけてしまった。ない状態でやると起動時のレコード登録はうまくいくがレコード削除がされなかった

- グローバルIP
インスタンスから直接AWSのAPIを実行するのでグローバルIPが各インスタンスについていないとエラー。というか固まる。。。
私はElasticIPではなく自動割当パブリックIPにしました

# その他
- 起動停止時にCloudWatch登録削除なども作成予定なのでスクリプト名やロックファイル名は”aws_サービス名_動作名”などがよさそう
link: Watson Explorer Analytical Component (WEX-AC) 日本語


Watson Explorer Analytical Component (WEX-AC) 日本語 - #TAKMI #WCA #OmniFind : Home
https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/Watson%20Content%20Analytics%20%E6%97%A5%E6%9C%AC%E8%AA%9E