OmniAICreator/Qiita-1.07M huggingface dataset:
個人勉強#JSON

#この投稿の目的
これからJSONを学んでいく上で自分が学んだことをアウトプットして習熟度を上げることと、備忘録の為に投稿していきたいと思っています。記事内容に間違いがあった場合は手が空いている時でもいいので教えてもらえると本当に嬉しいです。

#JSONの概要
JSON(JavascriptObjectNotation)
■概要
人間とPCとで簡単にデータ交換ができるフォーマットの事。
記述は比較的簡単でマシンにとっても簡単にパース([parse](http://e-words.jp/w/%E3%83%91%E3%83%BC%E3%82%B9.html):構文分析、品詞記述、文法に従う分析)や作成を簡単に行うことができる形式。JavaScriptの一部をベースに作られている。

■記述方法
この[参考記事](http://www.json.org/json-ja.html)は図があって理解しやすい。
■objectの場合
オブジェクトの場合にはを中括弧`{}`で表現し、{}内は順不同の`名前/値`の
セットで記述される。名前(String)と値(Value)の間には`コロン":"`を入れて記述し、名前と値のペアは
`カンマ","`で区切られる。また、基本的にはネスト(入れ子)構造を表現することができる。

■arrayの場合
array(配列)の場合には、角括弧`[]`で値を囲い、その中は順序つけされた値を格納する。
区切り文字は`カンマ","`となる。

■値の記述
値は二重引用符(ダブルコーテーション)`""`の間に記述する。扱うデータ型は、
文字列(String)、数値(number)、オブジェクト(object)、真偽値(true/false)、配列(array)、値なし(null)となる。(値なしでnilは使えないのかな？)

■文字列(String)
JSONでは文字列を表記する際にバックスラッシュ`\(option+¥)`でエスケープする必要がある文字もあるので注意。
エスケープする際には、任意の文字列の直前に"\"を挿入することで文字列化可能。
※[エスケープが必要な文字一覧](https://www.ipentec.com/document/document.aspx?page=json-character-escape)

■数値(number)
8進数と16進数が活用できない。(らしい？)頭に入れておく程度にしておけば良いかな？
atomのlinter-rubocopでrubocop-rspecが読み込まれない

# エラー内容

![スクリーンショット 2016-10-07 11.32.51.png](https://qiita-image-store.s3.amazonaws.com/0/79577/40b0e555-0ae8-e257-0e8c-afadd0492ace.png)

~~~
Error: Warning: unrecognized cop RSpec/MessageExpectation found in /path/to/.rubocop_todo.yml /path/to/kernel_require.rb:55:in `require': cannot load such file -- rubocop-rspec (LoadError) 
~~~

rubocop-rspecが読み込まれてないとな。
ちなみにコンソールだとちゃんと実行できている。

~~~sh
$ bundle exec rubocop

:
:

61 files inspected, 10 offenses detected
~~~

# エラー時の状態

## 各パッケージのバージョン

~~~sh
$ apm list | grep linter
├── linter@1.11.18
├── linter-rubocop@0.5.0
~~~

config.csonの設定内容

~~~
  "linter-rubocop":
    disableWhenNoConfigFile: true
    excutablePath: "bundle exec which rubocop"
~~~

# 原因

`$ rubocop`で実行されていた。

![スクリーンショット 2016-10-07 11.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/79577/6aea691e-d924-efbc-9924-c88701a16abb.png)

試しにコンソールで実行すると、同じエラーが💡

~~~sh
$ rubocop
Warning: unrecognized cop RSpec/MessageExpectation found in /path/to/.rubocop_todo.yml
/path/to/kernel_require.rb:55:in `require': cannot load such file -- rubocop-rspec (LoadError)
~~~

実行コマンドを`bundle exec rubocop`に設定して無事解決。

![スクリーンショット 2016-10-07 11.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/79577/c66f7752-5c23-892e-0b92-8311116b9531.png)
Git で複数のスクリプトをフックに設定する

# はじめに

* [githooks - Chaining git hooks - Stack Overflow](http://stackoverflow.com/questions/8730514/chaining-git-hooks/8734391#8734391) のとおり
* sh だけでできるので手軽で便利

# 簡単な手順

## スクリプト作成

```sh:.git/hooks/hook-chain
#!/bin/bash
#
# author: orefalo

hookname=`basename $0`


FILE=`mktemp`
trap 'rm -f $FILE' EXIT
cat - > $FILE

for hook in $GIT_DIR/hooks/$hookname.*
do
    if test -x "$hook"; then
#       echo $hook
        cat $FILE | $hook "$@"
        status=$?

        if test $status -ne 0; then
            echo Hook $hook failed with error code $status
            exit $status
        fi
    fi
done
```

## フックに設定（pre-commit に設定する場合）

```sh
$ cd .git/hooks
$ chmod +x hook-chain
$ mv pre-commit pre-commit.rename_if_already_exist
$ ln -s hook-chain pre-commit
TFSで作業項目タイプ（WIT）を削除する

# WITを削除する

間違って作ったWIT（Work Item Type）の削除方法に悩んだのでメモ。 
Power ToolsのGUIからは消せなかったので、コマンドラインから削除する。

```bat:
witadmin destroywitd /collection:"http://ホスト名 or IP:8080/tfs/コレクション名" /p:"プロジェクト名" /n:"作業項目タイプ名" 
```

開発者コマンド プロンプトからやるとパスが楽で良い。
HAProxyで高負荷時にBusyコンテンツを返す

HAProxyにぶら下がるサーバやサービスを高負荷時に守りたい場合、`be_sess_rate` とACLを連携させることによって、閾値を超えた新規セッションを別のバックエンドに流す、ということが可能です。

かんたんに構成を書くと以下のようになります。バックエンドにはNginxを使用しています。

![busy.png](https://qiita-image-store.s3.amazonaws.com/0/130972/f37a1c7e-bbe1-c6a0-feaf-2317120b1fb6.png)

コンフィグは以下の通りです。秒間の新規セッションの上限を1000としています。

```
# フロントエンドの設定
frontend frontend_001
    bind   *:80

    # バックエンドのセッションが1000を超えた場合、be_is_busy が真となる
    acl be_is_busy be_sess_rate(backend_nginx) gt 1000

    # be_is_busy が真の場合のみ、busy用バックエンドを使用する
    use_backend backend_busy if be_is_busy

    # 通常は、デフォルト用バックエンドを使用する
    default_backend backend_nginx

# デフォルト用のバックエンド
backend backend_nginx
    balance   roundrobin
    server    nginx-001 192.168.100.101:80 
    server    nginx-002 192.168.100.102:80 
    server    nginx-003 192.168.100.103:80 

# Busy用バックエンド
backend backend_busy
    balance   roundrobin
    server    nginx-004 192.168.100.104:80 
    server    nginx-005 192.168.100.105:80 
```

なお、`be_sess_rate`について、[公式ドキュメント](http://www.haproxy.org/download/1.5/doc/configuration.txt)には以下のように載っています

> **be_sess_rate([<backend>]) : integer**
  　Returns an integer value corresponding to the sessions creation rate on the backend, in number of new sessions per second. This is used with ACLs to switch to an alternate backend when an expensive or fragile one reaches too high a session rate, or to limit abuse of service (eg. prevent sucking of an online dictionary). It can also be useful to add this element to logs using a log-format directive.

この中の、"sessions creation rate" がピンとこなかったのですが、実験の結果、秒間のセッション数は、秒間のリクエスト数とほぼ同じということがわかりました。

なお、バックエンドのBusy用サーバを用意しなくても、HAProxy自体が静的コンテンツを返答することも可能です。その際は、バックエンドを以下のようにすると良いでしょう。（注意：503以外は使用できません）

```
# Busyコンテンツを直接返答
backend backend_busy
    mode http
    errorfile 503 /usr/share/haproxy/busy.http
```

これで、1秒当たり1000リクエストを超えたら、その分はBusyを返す、ということができました。
S3のバケットにアクセス権を設定する

#**概要**
IAMユーザーにS3バケットに対するユーザーポリシーを設定します。

#**特定のバケット(hoge1, hoge2)だけ読み書きを許可する**

```json:IAM_User_Policy
{
  "Statement": [
    {
      "Action": "s3:ListAllMyBuckets",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::hoge1",
        "arn:aws:s3:::hoge1/*",
        "arn:aws:s3:::hoge2",
        "arn:aws:s3:::hoge2/*"
      ]
    }
  ]
}
```

#**特定のバケット(hoge1, hoge2)以外読み書き許可する**

```json:IAM_User_Policy
{
  "Statement": [
    {
      "Action": "s3:ListAllMyBuckets",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "NotResource": [
        "arn:aws:s3:::hoge1",
        "arn:aws:s3:::hoge1/*",
        "arn:aws:s3:::hoge2",
        "arn:aws:s3:::hoge2/*"
      ]
    }
  ]
}
```

#**特定のバケット(hoge1, hoge2)だけ書き込みのみを許可する**

```json:IAM_User_Policy
{
  "Statement": [
    {
      "Action": "s3:ListAllMyBuckets",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::hoge1",
        "arn:aws:s3:::hoge1/*",
        "arn:aws:s3:::hoge2",
        "arn:aws:s3:::hoge2/*"
      ]
    }
  ]
}
```
AWS S3バケットを新品にするやつ作った

# はじめに
[aws s3のオブジェクト削除方法](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/DeletingObjects.html)って

### バージョニングなし
> ・ __単一のオブジェクトの削除:__ 単一の HTTP リクエストで 1 つのオブジェクトを削除できます
> ・ __複数のオブジェクトの削除:__ 単一の HTTP リクエストで最大 1,000 個のオブジェクトを削除できます

### バージョニングあり
> ・ __バージョンを指定しない削除リクエストの指定:__ 削除マーカーを作成し、レスポンスでバージョン ID を返します。オブジェクトはバケットから消去されます → 裏では残ってるってことですね。
> ・ __バージョンを指定した削除リクエストの指定:__ 2 通りの結果があり得ます。
  (1) バージョン ID が特定のオブジェクトバージョンに対応する場合、Amazon S3 はその特定のバージョンのオブジェクトを削除します。 → 完全削除

>  (2) バージョン ID がそのオブジェクトの削除マーカーに対応する場合、Amazon S3 は削除マーカーを削除します。オブジェクトはバケットに再び表示されます。 → 削除フラグが削除されて、復活する。 

要するに、バージョン管理しているバケットのすべてのobjectを削除するのは__めんどくさい!!__


さらに、困ったことに、
`CloudFormation`などで`S3バケット`を`バージョン管理付き`で作成していて
いらなくなったから消そう。とすると、
> バケットが空じゃないから消せないよ。

って怒られたりします。

バケットの中身、１発で全部消せたらいいなあ。
ググってみても、いまいちパッとできるものが出てこない。

あ、コンソールから`バケットを空にする`があるじゃん！
[ドキュメント参照](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/delete-or-empty-bucket.html)
> Amazon S3 コンソールを使用する（この方法は、バケットにオブジェクトバージョンと削除マーカーの両方を含めて 100,000 未満のアイテム — がある場合に限り使用できます）。
`100,000`以上オブジェクトがある場合は.....><

__だめだ、仕方ない、自分で作ってみよう!__

# 初めてのPythonで作りました
__`Python`便利ですね。__

一旦動くところまで、
[指定したバケットリストのすべてのオブジェクト削除するやつ](https://github.com/hirokikonishi/deleteAllObjectsInS3)作りました。
※もちろんバージョン管理バケット可
先人の皆様、プルリクお待ちしております。

TODO: 
  * json整形いい感じにしてobjectsのapi使いたい。
  * エラー処理をいい感じに
  * 色々汚い
  * 遅い
[ PHPUnit ] ボーリングから考えるテスト駆動開発 8テスト目

これからはじめるTDD テスト駆動開発入門 ThinkIT Books より

# ボーリングの点数計算プログラムを作る

## フレーム単位でのスコアを取得する

BowlingGameTestに以下の機能を実装。

- フレーム単位でのスコアを取得できるflameScoreメソッドを実装

### テストを書く

フレーム毎のスコアはBowlingGameクラスのflameScore(\$flameNumber)で
取得すると仮定($flameNumberで取得したいフレームの番号を指定)

```php
    /**
     * 全球ガーター時の1フレーム目の得点
     */
    public function testCalculateFrameScoreAtAllGarter()
    {
        $this->loopRecordShot(20, 0);

        $this->assertEquals(0, $this->BowlingGame->flameScore(1));
    }
```

### 実行して怒られる

```bash
1) BowlingGameTest::testCalculateFrameScoreAtAllGarter
Error: Call to undefined method App\BowlingGame::flameScore()

/var/www/html/test/UnitTest/tests/BowlingGameTest.php:213

ERRORS!
Tests: 10, Assertions: 9, Errors: 1.
```

### テストが通るように処理を書く(__最小の構成で__)

```php
    /**
     * @return int
     */
    public function flameScore(): int
    {
        return 0;
    }
```

### テスト実行

```bash
OK (10 tests, 10 assertions)
```

このままでは、最初のテストケースから実装と同じことを繰り返す・・？

↓

## 設計の見直し

BowlingGameから、フレーム毎に得点を取得するためのFlameという概念を抽出

BowlingGame ⇔ Flame

機能面の変更

- BowlingGameのcalculateScoreはFlameのscoreを合算して返す
- BowlingGameのrecordShotは現在のFlameのrecordShotを呼び出す
- BowlingGameのflameScoreは指定されたFlameのscoreを返す

### Flameクラスで全ての投球がガーターの時のテストを通す

①テストを書く

```php
class FlameTest extends TestCase
{
    /** @var Flame */
    public $Flame;

    public function setUp()
    {
        $this->Flame = new Flame();
    }

    public function tearDown()
    {
        unset($this->Flame);
    }

    /**
     * @test
     */
    public function 全ての投球がガーター()
    {
        $this->Flame->recordShot(0);
        $this->Flame->recordShot(0);

        $this->assertEquals(0, $this->Flame->getScore());
    }
}
```

日本語でテスト名書くようにしてみた

②テスト実行

```bash
1) FlameTest::全ての投球がガーター
Error: Call to undefined method App\Flame::recordShot()

/var/www/html/test/UnitTest/tests/FlameTest.php:25

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
```

③テストを通すように処理を書く

```php
class Flame
{
    /** @var  int */
    private $score;

    /**
     * @param int $pin
     */
    public function recordShot(int $pin)
    {

    }

    /**
     * @return int
     */
    public function getScore()
    {
        return 0;
    }

}
```

④テスト実行

```bash
OK (1 test, 1 assertion)
```

### Flameクラスで全ての投球が1ピンだったときのテストを通す

① テストを書く

```php
    /**
     * @test
     */
    public function 全ての投球で1ピン倒した()
    {
        $this->Flame->recordShot(1);
        $this->Flame->recordShot(1);

        $this->assertEquals(2, $this->Flame->getScore());
    }
```

②テスト実行

```bash
1) FlameTest::全ての投球で1ピン倒した
Failed asserting that 0 matches expected 2.

/var/www/html/test/UnitTest/tests/FlameTest.php:39

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
```

③テストが通るように処理を書く

```php
class Flame
{
    /** @var  int */
    private $score;

    /**
     * @param int $pin
     */
    public function recordShot(int $pin)
    {
        $this->score += $pin;
    }

    /**
     * @return int
     */
    public function getScore()
    {
        return $this->score;
    }

}
```

④テスト実行

```bash
OK (2 tests, 2 assertions)
```

## 感想

設計を変えて新しい概念が出てきたが、テスト駆動の基本は変わらないので
今までと同様に小さく積み上げていけば対応はできそう。
細かくリファクタリングを癖にできるようにしたい。
Django テンプレートで、外部ファイルに書いた Makdown や reStructuredText を HTML として読み込む

# 1. 概要

ドキュメント系のページ (利用規約、FAQ、プライバシーポリシー、アバウトページなど) をHTMLでそのまま書くのは大変なので、markdown で外部ファイルに書いて、Django テンプレート内で (include タグのように) 読み込み、HTML として出力します。

```html:templates/myapp/about.html
{% load markup %}
{% load my_tags %}

{% read_file 'myapp/about.md' as source %}
{{ source|markdown:"safe" }}
```

```md:templates/myapp/about.md
# このアプリについて

このアプリは…

* Django
* Python
* uwsgi
```

### 出力結果

![スクリーンショット 2016-10-07 11.22.56.png](https://qiita-image-store.s3.amazonaws.com/0/68302/ee88a67d-d5fe-7d8d-61ed-39de717e832c.png)


# 2. 実現方法

## 1. django-markwhat のインストール

レンダリングのコアライブラリとして、今回は django-markwhat (+Markdown) を使います。これ1つ入れておけば、markdown にも reStructuredText にも対応できて使い勝手が良いです。

```bash:
$ pip install django-markwhat Markdown
```

INSTALLED_APPS に追加

```python:
  'django_markwhat',
```

## 2. テンプレートディレクトリからファイルを検索し、読み込むタグの開発

```python:templatetags/my_tags.py
from django import template
from django.template import TemplateDoesNotExist

register = template.Library()


@register.simple_tag(takes_context=True)
def read_file(context, template_name):
    """
    テンプレートローダーを使ってテキストファイルを読み込む

    例: {% read_file 'admin_doc/pages/about.md' as source %}
    """

    for loader in context.template.engine.template_loaders:
        try:
            source, _path = loader.load_template_source(template_name)
            return source

        except TemplateDoesNotExist:
            pass
    else:
        raise TemplateDoesNotExist(template_name)
```

こんな感じで、Djangoのテンプレートローダーのファイル読み込み機能だけを使って、テンプレートディレクトリからファイルの内容を取得するテンプレートタグを作っておきます。


# 3. 実行

冒頭に書いた、

```html:templates/myapp/about.html
{% load markup %}
{% load my_tags %}

{% read_file 'myapp/about.md' as source %}
{{ source|markdown:"safe" }}
```

これで、markdown が HTML で表示されます。

ちなみに、Qiita の Markdown は強力で使い勝手が良いのですが、この Markdown はずっと貧弱です。
Raspberry Pi 3 に dockerをいれる

Raspberry Piにdockerを入れてみたかったので、試してみました。

インターネットを調べていると、すでにdockerがインストールされているOSイメージをsdに書き込む方法がヒットしました。
しかし、私の環境(すでにubuntuでファイルサーバーやらなんやらをいれている)に追加する形で入れたかったので、armアーキテクチャでのインストール方法などを調べながらやりました。

ちなみに、dockerが既に書き込まれているイメージはこれです。
http://blog.hypriot.com/downloads/

とりあえず、インストールが完了して、`docker info`コマンドが動くところまでやってみました。

##いざ尋常に インストール

インストールした環境は、Raspberry Pi3で、
OSは Ubuntu-pi-flavour 16.04 ubuntu-server(standard) イメージを使用しています。

インストールはコマンドでささっと終わります。

```
sudo apt install lxc aufs-tools cgroup-lite apparmor docker.io
```

はい、終了。

では`docker info`を実行してみます。

```
$ sudo docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.11.2
Storage Driver: overlay
 Backing Filesystem: extfs
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge null host
Kernel Version: 4.1.19-v7+
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 925.8 MiB
Name: ubuntu-standard
ID: S3BK:HQRO:ATU3:KBFZ:I5KY:AETS:IHGC:SE4U:LO7I:BGHE:CF7K:NZHE
Docker Root Dir: /var/lib/docker
Debug mode (client): false
Debug mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No oom kill disable support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
```

こんなかんじ。
ちなみにバージョンは1.11.2が入りました。

```
$ sudo docker version
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.6.2
 Git commit:   b9f10c9
 Built:        Thu, 16 Jun 2016 21:17:51 +1200
 OS/Arch:      linux/arm

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.6.2
 Git commit:   b9f10c9
 Built:        Thu, 16 Jun 2016 21:17:51 +1200
 OS/Arch:      linux/arm
```

## sudoコマンドなしで実行

インストールしてすぐは、dockerコマンドを実行するのにsudoが必要でした。
sudoをなしでdockerコマンドを実行するには、現在ログインしているユーザーをdockerグループにいれる必要があります。

ちなみに、グループがあるかどうかなどは、`/etc/group`のファイルを見るとわかります。

もしグループができないときはグループを作成します。
```
$ sudo groupadd docker
```

自分のユーザーを追加します。
```
$ sudo gpasswd -a $USER docker
```

dockerデーモンを再起動します。
```
$ sudo service docker restart
```

これで、一度ログアウトして、再度ログインすると反映されます。


## 参考url
https://github.com/umiddelb/armhf/wiki/Installing,-running,-using-docker-on-armhf-(ARMv7)-devices
http://qiita.com/DQNEO/items/da5df074c48b012152ee
GolangでHello World!

## 環境

OS:Mac OSX 
エディタ:Atom

## goインストール

Homebrewでgoをインストールする。

`$ brew install go`

go用pluginを格納するフォルダを作成して、環境変数GOPATHにセットする。

`$ mkdir ~/.go`<br>
`$ echo "export GOPATH=~/.go" >> ~/.zshrc`

### atomエディタsetup

#### go-plusプラグインインストール

Atomの設定 - InstallのSearch Packagesにgo-plusと入力して、パッケージボタンを押すと、go-plusプラグインが表示されるので、インストールボタンをクリックする。

## まずはHello World!

以下のリンクのHello Worldを進めても良いですが、せっかく環境を整えたのでそちらでもHello Worldを試しましょう。

- [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)

### hello.goファイルを作成

`$ vi hello.go`

```go:
package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}
```

### go buildコマンドでコンパイルする

`$ go build hello.go`

#### 実行ファイル「hello」が生成されたことを確認

```
$ ls -ltr
total 3160
-rw-r--r--  1 val  staff       76 Oct  7 10:47 hello.go
-rwxr-xr-x  1 val  staff  1607616 Oct  7 10:47 hello
```

#### 実行ファイル「hello」を実行してみる

```
$ ./hello
Hello World!
```

#### go runコマンドを使うとコンパイルと実行を同時に行ってくれる

```
$ go run hello.go
Hello World!
```

※この場合、実行ファイル「hello」は生成されない。

### 現在時刻を表示してみる

#### time.goファイルを作成

`$ vi time.go`

```go:
package main

import (
  "fmt"
  "time"
)

func main() {
    fmt.Println("The current time is", time.Now())
}
```

#### go runコマンドで実行してみる

```
$ go run time.go
The current time is 2016-10-07 11:00:11.027383849 +0900 JST
```

```
$ date
Fri Oct  7 11:00:19 JST 2016
```

## まとめ

いろいろできそうでワクワクしますね！

https://fk2000.github.io/golang-environment-setup/
Rake タスクの引数は Hash ではない

```ruby
desc 'Awesome batch task'
task :awesome_batch_task, [:foo] => :environment do |task, args|
  executor = AwesomeBatchExecutor.new(args)
  executor.execute
end
```

こういうのよくやると思います。処理内容自体は別のファイルに書いて、 Rake ファイルからはそのクラスを呼び出すだけ。

で、クラスの方はこういう実装だったりするのではないでしょうか。

```ruby
class AwesomeBatchExecutor
  def initialize(options={})
    @options = options.merge(:buzz => "blah blah blah")
  end

  def execute
    puts @options[:buzz]
  end
end
```

Rake タスクから渡ってきた `options` に何らかの値を `#merge` したいとか。

実はこれ失敗します。なぜならインスタンス変数 `@options` が `nil` になるから。というのも Rake の args は Hash のように見えて Hash ではないのです。

```sh
⚡ bin/rake awesome_batch_task[hoge]
Running via Spring preloader in process 17134

From: /Users/morygonzalez/src/awesome_project/lib/tasks/awesome_batch_task.rake @ line 6 :

     2:
     3: desc 'Awesome batch task'
     4: task :awesome_batch_task, [:foo] => :environment do |task, args|
     5:   binding.pry
 =>  6:   executor = AwesomeBatchExecutor.new(args)
     7:   executor.execute
     9: end

[1] pry(2.3.1-p112)> args
=> {:hoge=>"hoge"}
[2] pry(2.3.1-p112)> args.class
=> Rake::TaskArguments
[3] pry(2.3.1-p112)> args.respond_to?(:merge)
=> false
```

ぱっと見 Hash っぽいのにクラスは `Rake::TaskArguments` であり、 `#respond_to?(:merge)` も `false` となってしまうのです。

もし Rake::TaskArguments を Hash 引数として別のクラスに渡したいときは以下のような一手間を加えればオッケーです。

```ruby
  executor = AwesomeBatchExecutor.new(args.to_h)
```

`#to_h` してやることで Hash になります。

`Rake::TaskArguments` 、 Hash ではないならそもそも `options.merge()` したときに `nil` を返すのではなく `NoMethodError` なんかを発生させて欲しいですね…。このことに気がつかずハマりましたので知見を共有させていただきます。
eachの中からoptsへアクセス

eachを使った繰り返し処理の中で、optsへのアクセスが必要になったため、
試行錯誤したところ、以下の方法でアクセスできたのでメモ。

* thisは省略可能です

```
{this.parent.opts.xxxx}
```

あんまりいい例ではないですが、例えば

```html
<!-- 例) input type はoptsで指定したものを使いたい -->
<div each="{input in inputs}">
    <input type="{parent.opts.input_type}"
        name="{input.name}"
        value="{input.value}">
</div>
```
とか。
日本、世界のスマホ市場

# 日本のOS別販売シェア

<img width="481" alt="スクリーンショット 2016-10-05 19.26.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/126678/a796a9b0-ed99-db3e-eb6f-fdf0255a429f.png">

---

## 各企業ごとの内訳

<img width="545" alt="スクリーンショット 2016-10-05 19.27.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/126678/09a45654-814b-f93a-b71c-035e5b9b772c.png">

---

# 世界のOS別販売シェア

<img width="479" alt="スクリーンショット 2016-10-05 19.27.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/126678/0cc12084-9c57-f16a-f406-db1e103774ef.png">


---

# EU5カ国のOS別販売シェア

<img width="480" alt="スクリーンショット 2016-10-05 19.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/126678/24ab3ace-6901-6862-c098-04b9ebd23de9.png">

出典　カンター・ジャパン
調査時期 2015年8月~10月

---

# 日本がガラパゴス化した理由

・AndroidというOSが理解されなかった
・身の回りに使っている人が少なかった
・日本で買うiPhoneは安い(優遇政策のため)
　ほとんどの国では、iPhoneはとても高級品となっている

・海外では、廉価版のスマホでも以前のケータイよりも上位互換になりえたが、
　日本では、ガラケーの機能がそもそも多く、廉価版のスマホでは上位互換になりえなかった


---


# スマホの世界シェア、普及率
- Android　82%
- iOS 12%

## スマホの世界的な普及率についてはどのような傾向が見られているのか

２０１４年　１１、７億台　前年比約25％増加
２０１５年　１２、９億台　前年比10.3％増加
２０１６年　１３、９億台　前年比約8%増加　（予測）


--- 

#　iPhone7 VS  pixel



- pixel
  - カメラの性能(DxOMarkスコア)
  - RAM容量

第一販売国
アメリカ、オーストラリア、カナダ、ドイツ、イギリス
日本はまだ未定…。

- iphone7
  - 感圧タッチ式ディスプレイ
  - 防水、防塵性能
  - FeliCa対応

<img width="387" alt="スクリーンショット 2016-10-05 18.58.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/126678/c97d0fb2-6d7f-678f-3da6-dd48b63521a6.png">


---

# まとめ

- iPhoneの流れが減衰すると、Androidの勢力が日本でも拡大するのではないか
- この流れを考えての言語選択、開発に従事するべきであると考える
CentOS 7.1 にrbenvでRubyをインストールする。そして、asciidoctorを使いたい。


## 前提条件

* CentOS 7.1 64bit
* git（version 1.8.3.1）※ 早く試したかったのでyumで入れました。gitの最新版を使いたい人はソースコードから入れてください。

> 2016/09/27に作業しました。
> 
> この情報が古い可能性もありますので、うまくいかない場合はフィードバック頂けるとありがたいです。

## この記事でわかること

* rbenvのインストール方法
* rbenvを使ったRubyのインストール方法
* gemによるasciidoctorのインストール方法

## この記事に書いていないこと

* rbenvのその他設定方法
* adciidoctorの使い方

## rbenvのインストール

rbenvとは、1つの環境で、複数のRubyバージョンを切り替えて利用するためのツールです。

### 必要な依存関係をインストール

```shell-session
# yum -y install epel-release
# yum -y install gcc-c++ git glibc-headers libffi-devel libxml2 libxml2-devel libxslt libxslt-devel libyaml-devel make nodejs npm openssl-devel readline readline-devel sqlite-devel zlib zlib-devel bzip2
```

### Githubからソースコードをチェックアウト

```shell-session
# git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
```

### シェルにパスを通す

すべてのユーザに反映させないので、`/etc/profile`に追記しました。

```shell-session
# echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> /etc/profile
# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> /etc/profile
# echo 'eval "$(rbenv init -)"' >> /etc/profile
# source /etc/profile
# rbenv -v
rbenv 1.0.0-31-gd0779fc
```

これでrbenvのインストールは完了です。

### Rubyをインストールする

インストール可能なRubyバージョンを確認する。

```shell-session
# rbenv install --list
Available versions:
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
  1.8.5-p231
  1.8.5-p52
  1.8.6-p110
  1.8.6-p111
  1.8.6-p114
・・・たくさん出てきます
```

指定のバージョンをインストールする。

```shell-session
# rbenv install 2.0.0-p648
```

取り急ぎ、ログイン中のユーザで使用するバージョンを指定する。

```shell-session
# rbenv global 2.0.0-p648
# ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]
```

### asciidoctorをインストールする

gemからインストールするだけです。

```shell-session
# gem install asciidoctor
```

`1.5.4`というバージョンが入りました。
CSSの教科書を読んで自分なりにまとめてみたこと（第7章）

## はじめに

谷拓樹さんのWEB制作者のためのCSS設計の教科書を読み、自分なりにまとめたものです。
自分のメモとして残しておきたいので、詳細を多少端折っていますので、気になる方は購入してみてください。
数回に分けて投稿する予定です。
今回で最後になります。

[前章の記事はこちらから](http://qiita.com/poster-keisuke/items/fe6087774206f43d2345)

## Webコンポーネントの可能性

### HTML/CSSのコンポーネント化

#### 現状のHTML/CSSにおける限界

世界中のフロントエンドの開発者が、他の言語よりもアプリケーションを創るための言語として貧弱なCSSと戦ってきた。その結果、OOCSSのようなアイデアや、十分に工夫されたフレームワークやガイドラインの登場によって再利用性、メンテナンス性の高いCSSのを書くことができるようになった。
　しかし、ここまで色々紹介してきたものを駆使しても、本来のプログラミングに於けるコンポーネントをCSSでは実現することができない。それはCSSには他のプログラミング言語のようなスコープ化や、カプセル化といった概念が無いからである。Web Componentsはその問題の解決につながるかもしれない手段の一つである。

#### Web Componentsとは

Web Componentsは簡潔に言えば、名前の通り、WebのUIをコンポーネント化する為の仕様である。W3Cで仕様策定が進んでおり、各ブラウザベンダの協力もあって、少しづつブラウザに実装され始めている。

https://www.google.co.jp/chrome/browser/canary.html
↑Chromeの開発者向けブラウザ

### Web Componentsの仕様

Web Componentsは単独の仕様ではなく、4つの技術で成り立っている。

- Templates
- Custom Elements
- Shadow DOM
- HTML Imports

それぞれ個別の仕様として扱うこともできるが、これらの仕様を組み合わせることによって、独自のUIコンポーネントをつくることができる。

#### Templates

やや複雑なサイトやアプリケーションの開発では、開発効率などのメリットからテンプレートエンジンと呼ばれるものを採用することがある。Handlebars.jsなどはその一つである。マークアップの断片をテンプレートとして、必要なときに呼び出すことができる。
そうしたテンプレートの機能をブラウザのネイティブで提供するものになる。
コンポーネントを作る上では、それを構成するマークアップとCSSをこのテンプレート<template>に内包することになる。

#### Custom Elements

独自の要素（カスタム要素）を作ることができる。
つまり、<like-button>のようなものや、<x-author>など、現状のHTMLとして定義されていない要素を作ることができ、それらをブラウザに解釈させられるということ。単にそうした名前のタグが使えるということだけではなく、プロパティやメソッド、イベントを持たせる事ができる。
例えば、select要素をクリックすれば、オプションを選択するメニューが開き、選択ができるというような機能を独自の要素に必要に応じて実装することができる。
全く新しく要素を作るだけではなく、既存の要素を元に拡張することもできる。その際には、is属性をもたせ、値に独自の名前を入れる。

````html:test.html
<button is=“like-button">
```

#### Shadow DOM

CSS設計において最も重要な仕様である。Shadow DOMはその名の通り、隠蔽されたDOMを作ることができるものである。
ここにカプセル化の機能を持つ。カプセル化は、あるスコープ内の処理や、値などを外部に漏らさないようにすること。

https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom/
https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-201/
https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-301/

https://www.polymer-project.org/1.0/

#### HTML Imports

独自に作ったコンポーネントは再利用されることに大きな価値がある。あらゆるページ、プロジェクトで使いやすいように、パッケージにして読み込めるようにするのが、HTML Importsである。
利用イメージは、Javascriptのファイルをscriptタグで読み込んだり、CSSファイルを<link>タグを用いて読み込んだりするのと同じ。

```html:test.html
<head>
<link real=“import” href=“component/success-message.html">
</head>
```
Memcachedから全データをDumpしたメモ

Memcachedに大量のデータが保存されている場合、たいていの場合は全データをDumpすることができない。（Memcachedのメモリ設定によるけどデフォルトは1Mか2M分しか出力できないようになっている。）

そのため、Dumpするときは特殊な方法が必要だった。
今回は、Memcachedから出力できるだけデータをDump→Redisに保存→（テキストに保存）→getで対象のデータがRedisに保存されていることを確認→Dumpしたデータを削除→MemcachedからDump…を繰り返して行った。

```
open(DATAFILE, ">", $self->{filename}) or die("Error:$!");

while (1) {
    # 全データを取得するための処理
    my $memc_dump_text = MemcachedTool->dump($host, $port);
    unless ($memc_dump_text) {
        last;
    }   
    my @lines = split /\r\n|\n/, $memc_dump_text;

    my @keys;
    for (my $i=0; $i<@lines; $i=$i+1) {

        if ($lines[$i] =~ /^add /) {
            my (undef, $key, $flag, $ttl, $len) = split /\s/, $lines[$i];
            if (my $value = $lines[$i+1]) {
                unless ($value && $key) {
                    next;
                }   

                $self->redis->set( $key => $value, sub {} );
                $self->redis->expire( $key => $ttl, sub {}  );  
                if ($self->redis->get( $key )) {
                    push (@keys, $key);

                    print DATAFILE $lines[$i] . "\t" . encode_json($value) . "\n";
                }   
            }   
        }   
    }   
    $self->memcached->delete_multi(@keys);
}
close(DATAFILE);
```

念のため、出力したテキストとRedisに保存した中身を比較して差分を確認した方がよさそう。
Windows 7でコピーしたときの「 - コピー」やショートカット作成時の「 - ショートカット」を変更する

同じフォルダ配下でファイルをCtrl+C→Ctrl+Vしたときに「ファイル名 - コピー」と付くんだけど、これがうっとうしいので変更する方法。
Windows 7で試したけど10でもできるかどうかは不明。

下記例では「 - コピー」と「 - ショートカット」は出さない設定。

- レジストリエディタから入力

Win+Rで「regedit」と打つ→HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorerまで移動
Explorerのところで右クリック→新規→キー→NamingTemplates→
作成された「NamingTemplates」キーの中に右クリック→
新規→文字列値→ShortcutNameTemplate→値のデータに「%s.lnk」と打つ→
右クリック→新規→文字列値→CopyNameTemplate→値のデータに「%s」と打つ

![image](https://qiita-image-store.s3.amazonaws.com/0/93950/dabab1d3-f481-c7da-d92a-37ed171d660d.png)


- 直接レジストリファイルを作って適用

以下の内容をUTF-16で作成して実行する。Windows標準のメモ帳（notepad）では保存するときの文字コードをUnicodeとすることで、UTF-16として保存できる。
ファイル名は「～.reg」とする。

```registry:NamingTemplates.reg
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\NamingTemplates]
"ShortcutNameTemplate"="%s.lnk"
"CopyNameTemplate"="%s"

```

共通事項として「%s」は元のファイル名を表す。
CopyNameTemplateは「コピー ～ %s」のようにするとXP時代のコピーにできる。
ShortcutNameTemplateはファイルを選択した状態で右クリック→ショートカットの作成を押したときの名前を変更できる。
自分の好きなようにカスタマイズしよう！
window.open(undefined)はブラウザによって結果が異なる

# <i class="fa fa-cubes"></i> 概要

タイトルそのままですが、
JavaScriptで
`window.open(hoge, '_self');`
としたとき、変数`hoge`が`undefined`だった場合の動作が主にIEとそれ以外で異なります。

***
# <i class="fa fa-cogs"></i> 環境毎結果
| ブラウザ | 結果 |
|:-:|:-:|
| IE11  | /undefined へ移動  |
| Edge  | /undefined へ移動  |
| Chrome  |  移動しない |
| FireFox  |  移動しない |

***
# <i class="fa fa-code"></i> コード

JSFiddleでは上手く行かなかったので手元で確認しました。
ボタン名が変われば移動しなかったとしています。

```html
<!DOCTYPE html>

<html>
<script>
    window.onload = function () {
        document.getElementById('open').addEventListener('click', function () {
            var a;
            window.open(a, '_self');
            document.getElementById('open').innerText = 'end';
        })
    }

</script>
<body>
<button id="open">oepn</button>
</body>
</html>
```

***

遭遇箇所が、処理が失敗した場合は移動しないという仕様で、開発ブラウザでは見た目上エラーもなく、移動もせずで仕様通りだった。
また、URLをスラッシュ区切りでパラメーターとして扱うフレームワークだったので、
IEの場合は、失敗時にリロードが起こる(実はundefinedパラメータ付きでのURLへ移動)というよくわからないブラウザ差異を生み出していた
【決定版】Segueの発音はセグエ？セグウェイ？

iOSアプリ開発者にはおなじみの`Segue`。
皆さんはどのように発音されていますでしょうか。
ネット上では`セグエ`という表記が目立つように感じます。

しかし本当に`セグエ`が正しいのでしょうか？
いくつか資料に当たってみましょう。

macOS付属の辞書
--
まずmacOS付属の辞書を参照してみましょう。
以下のような記述です。

```
segue /séɡweɪ/
〖＜イタリア〗
動詞
自動詞
«…に» (ある曲話題状態などから)円滑に[穏やかに]移行する «into, to» .
名詞
C切れ目なく続くこと.
```

発音は`séɡweɪ`とあります。どうやら **この辞書では`セグウェイ`** のようです。

AppleのWWDCの動画
--
次に[What's New in Storyboards - WWDC 2015 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2015/215/)を聞いてみました。

この動画での発音は私が聞く限り`セグウェイ`と聞こえます。英語の字幕での表記では`segueways`とあったので、この動画でもやはり **発音は`セグウェイ`** で良いようです。

HiNative
--
最後に一般のアメリカ英語のネイティブがどのように発音されるかを語学系Q&Aサービスの[HiNative](https://hinative.com/ja)で聞いてみました。（ちなみにHiNativeは私が所属しているLang-8社のサービスで、HiNative for iOSは私が開発しています。[iOSアプリエンジニアの募集](https://www.wantedly.com/projects/66174)もしております。Androidアプリエンジニアも募集中です。）

[Please tell me how to pronounce "segue".](https://hinative.com/ja/questions/1071002)がその質問です。`Seg-way`と回答をいただきました。 **やはり`セグウェイ`** ということでした。

（HiNativeでは音声での回答は質問者もしくは有料のプレミアム会員のみが再生できるようになっています。）

結論
--

**`Segue`の発音は`セグウェイ`**


以上です。

--
追記
誤解があるといけないので解説すると、Appleのドキュメントでの表記は`セグエ`となっています。この記事では`Segue`の **英語での発音** のみに焦点を当てています。この記事の意図は「私が勉強会などでセグウェイと言っても理解してもらえるように」ということです。
Xcode8にしたときのcircle.ymlとFastfileなどの設定

## CircleCIのWEB設定

### 環境変数

- FASTLANE_ITC_TEAM_ID
- FASTLANE_PASSWORD
- DEPLOYGATE_API_TOKEN
- DEPLOYGATE_USER
- DEPLOYGATE_DISTRIBUTION_KEY

### Keychain

iPhone DistributionのKeychainを設定する

## 設定ファイル

```ruby:Gemfile
source "https://rubygems.org"

gem "cocoapods", "1.1.0.rc.2"
gem "fastlane"
```

```circle.yml
machine:
  timezone: Asia/Tokyo
  xcode:
    version: '8.0'
dependencies:
   cache_directories:
    - "/Users/distiller/.cocoapods/"
test:
  override:
    - echo 'no test'
deployment:
  develop:
    branch: develop
    commands:
      - bundle exec fastlane adhoc --verbose
  master:
    branch: master
    commands:
      - bundle exec fastlane adhoc --verbose
      - bundle exec fastlane beta --verbose
      - git push git@github.com:dessart/insta-app.git master -f
```

```ruby:Fastfile
fastlane_version "1.104.0"

default_platform :ios

platform :ios do
  lane :adhoc do
    cert
    sigh(force: true)
    gym(scheme: "Techinsight", configuration: "AdHoc")
    deploygate
  end

  lane :beta do
    cert
    sigh(force: true)
    gym(scheme: "Techinsight", configuration: "Release")
    pilot(skip_waiting_for_build_processing: true)
  end

  lane :release do
    cert
    sigh(force: true)
    gym(scheme: "Techinsight", configuration: "Release")
    deliver(skip_screenshots: true, skip_metadata: true)
  end

  lane :refresh_dsyms do
    download_dsyms                # Download dSYM files from iTC
    upload_symbols_to_crashlytics # Upload them to Crashlytics
    clean_build_artifacts         # Delete the local dSYM files
  end
end
```

circle.ymlのCocoapodsのキャッシュ設定はこちらを参考にしました。
https://lebedev.cc/speeding-up-ios-builds-on-circleci/

## ハマリポイント

### Automatically manage signingのチェックを外す

https://docs.fastlane.tools/codesigning/getting-started/ を参考に以下の作業を行ったほうがいい場合がある。

<img width="715" alt="スクリーンショット 2016-10-07 7.52.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/6678/5037a9a4-61ac-507c-867e-2b8b9fe8e904.png">

### mobileprovisionをプロジェクトに含める

CircleCIはmobileprovisionを参考にInstall Code Signing Credentialsを実地するためsighで生成されるmobileprovisionがプロジェクトに含まれる必要がある。

```
$ sigh --development
$ sigh --adhoc
$ sigh
```

mobileprovisionが3つなのにConfigurationsが2つだと困るため、Configurationsを増やす。

<img width="790" alt="スクリーンショット 2016-10-07 7.53.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/6678/45f45671-5599-a6e0-bfd2-ba92251d244b.png">
TensorFlow > link > CentOS6.X, GPU使用の場合のセットアップに関して > Support for Redhat, Centos and many superclusters

TensorFlowを自分がよく使っているCentOS 6.Xで使うのは可能か。GPUとしてGTX 750 Tiを使用予定。

CentOS6.7にインストールした例はあるが、GPU使用ではなさそう。
http://qiita.com/Wanwannodao/items/42c93686e49498c43529

以下を見つけた。
https://github.com/tensorflow/tensorflow/issues/110

GPU使用でのセットアップに成功した例はあるが、コードそのものを書き換える必要があるようだ。
> zym1010 commented 7 days ago
> I have succeeded in compiling a GPU, Python 3.5 version of TensorFlow 0.10.0 on a CentOS 6 Docker, 
...
> Basically, it's replacing some hardcoded lines in CROSSTOOL-related items, and adding -lm to everything to prevent errors like #2291.


rdipietro commented on 26 Mar
の記載の手順というのも参考になるかもしれない。
> Compiling on CentOS still isn't all that straightforward, but I figured I'd give an overview here for now. This works for me with CentOS 6.7 and gcc 4.8.2, with GPU support (Cuda 7.0, cuDNN 4.0.7). 

Ubuntuでセットアップして、linuxを使った数値計算をUbuntuで実行する環境を構築する方が面倒が少ないだろうか。

(追記 2016/10/08)
色々調べた結果　CentOS 6.Xでセットアップするのは茨の道だと感じた。セットアップは目的ではないので、Ubuntu 14.04でインストールした。
git mergeではなくgit merge --no-ffを使う理由

自分のなかでしっくりきていなかったので調べました。下記のような理由らしい。

> --no-ff フラグは、たとえマージがfast-forwardで実行できるとしても、新しいコミットオブジェクトを作成する。これは、履歴にフィーチャーブランチが存在したという情報を失うのを避けるのと、機能の追加に使った全てのコミットをひとまとめにしておける。
> http://keijinsonyaban.blogspot.jp/2010/10/a-successful-git-branching-model.html
AlpineLinux3.4でJenkins2を動かしssh接続させる

* このエラーの回避方法

![err.png](https://qiita-image-store.s3.amazonaws.com/0/25728/edf3c253-8970-4a6e-5578-c6df64f4272b.png)

## 手順

```bash:
wget http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war

# java8では起動成功しなかった
apk add openjdk7-jre-base

# 起動にはfontが必要だった
apk add font-xfree86-type1
```

```
export JAVA_OPTS="-Djava.awt.headless=true"
java -jar jenkins.war
```

## 画面確認

* http://ipaddress:8080 にアクセス

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f237bdb2-9fda-bc0d-1d8d-ae84c8fb4125.png)

adminユーザーの初期パスワードは以下

* $HOME/.jenkins/secrets/initialAdminPassword

## トップページ

![success.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bf823c23-1e82-dbc8-40f5-6d95a2280d97.png)

![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f0d8c1a1-7c4c-857e-c689-fec235b7f0b9.png)

![ssh2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3e730a52-00ef-79e8-7c97-4f9e81384d23.png)

* 初回接続時、yes/noが出るのは~/.ssh/config書く必要ありそう。
    * 多段sshさせる時などは.ssh/config書いたほうがいいのでは。

```bash
Are you sure you want to continue connecting (yes/no)? yes
```

* adminで使う場合~/.ssh/を自分で管理すればプラグイン不要かも

* [sshのパスフレーズ入力を、keychainで省略する - Qiita](http://qiita.com/u6k/items/5970618c4a8c23f71fb9)
* [ターミナルからパスワード入力無しでssh接続する3つの方法 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/01/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%85%A5%E5%8A%9B%E7%84%A1%E3%81%97%E3%81%A7ssh%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B3/)

```bash:
# sshpass使う場合
sshpass -p パスワード ssh ホスト名 -l ユーザ名 -o 'StrictHostKeyChecking no'

# keychainの場合 (こちらのほうがいいかも)
keychain -q ~/.ssh/id_rsa ~/.ssh/id_rsa_2
source ~/.keychain/$HOSTNAME-sh
```


## docker-composeで使う

* プラグインは何一つ入れなくて良い。

```yaml:docker-compose.yml
jenkins:
  image: jenkins:alpine
  container_name: jenkins
  volumes:
    - "./data/:/var/jenkins_home/"
  ports:
    - "8080:8080"
    #- "50000:50000"
```

```bash:
docker-compose up -d
#
cat ./data/secrets/initialAdminPassword
#
mkdir -p data/.ssh
ssh-keygen
# パスワード空の鍵を作ってみた
```

```rb:data/.ssh/config
ServerAliveInterval 10
ServerAliveCountMax 12
Compression yes
CompressionLevel 1
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

Host va01
    User vagrant
    HostName va01.co.jp
    Port 22

Host *
    User jenkins
    IdentityFile ~/.ssh/id_rsa
```

* sshコマンドを書けば接続できる

![スクリーンショット 2016-10-07 10.47.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fea1f9d3-27f6-a0c3-8008-95abb5cf8326.png)

## Jenkins:alpineイメージをカスタマイズする

* パッケージ追加する場合

```rb:Dockerfile
FROM jenkins:alpine

USER root
RUN apk add --no-cache sshpass
USER jenkins
```

* なぜかalpineイメージでsshpassを使ったssh接続が成功しなかった。
実行時パラメータの受け取り　Javaの問題をTypeScriptにしてみる 8-2

次のプログラムの実行結果を選びなさい

```java:java.java
public class Main{
 public static void main(String[] args){
  try{
      if(args.length==0){
         System.out.println("A");
      }
  }catch(NullPointerException e){
      System.out.println("B");
  } finally{
      System.out.println("C");
  }
 }
}
```

ターミナル側の実行は

```java:Terminal.java
javac Main.java
java Main
```
とします。

A.「A」「B」「C」と表示される
B.「A」「C」と表示される
C.「B」「C」と表示される
D.「A」「B」と表示される
E.コンパイルエラーが表示される
F.実行時に例外がスローされる

答えはBです。
実行時パラメーターを指定しなくても要素数０の配列が渡されます。
要素数０の配列に対してlengthをしてもNullPointerExceptionは発生しないためcatchされることはありません。
jsはコマンドラインで実行しないため実行パラメーターがないためnode.jsとprocessを使い実行します。

```ts:TypeScript.ts
 declare var process: any;
 try{
      if(process.argv.length>=0){
           console.log("A");
      }
 }catch(e){
      console.log("B");
 } finally{
      console.log("C");
 }

```

**「declare var process: any;」について**
このソースでは「declare var process: any;」をつけています。
なくても動くっちゃ動きますが、TypeScriptはブラウザサイドのjsしか知らないため、コマンド引数という概念がありません。当然processもnode限定のものとなるのでprocessがどこから来たかわからずエラーになってしまいます。
そのため「declare」をつけて「知らないかもしれないけど、processもいるからね☆」と存在を教えておきます。

**「process.argv.length>=0」について**
Javaでは「args.length==0」としていますが、TypeScriptでは「process.argv.length>=0」にしています。
それは、node.jsの実行時パラメータには必ず第1引数に"node"第2引数に"ファイルパス"が入ることになっているからです。実行時パラメーターを渡した場合格納されるのは第3引数になります。

TypeScriptの実行は

```ts:node実行.ts
tsc test.ts
node test.js 123
```

答えはBで、「A」「C」と表示されます。

この問題の趣旨である、「実行時パラメーターを明記しなかった場合Nullとなるか？」という部分に関しては上記でも説明した通り、そもそも２要素入ってるのでNullになるはずがない。ということになります。
技術英語 > If you [forgo] the index structure ... / I'll go without it.

@ Code complete (No. 13985 / 36077)

> If you <font color=red>forgo</font> the index structure ...

http://ejje.weblio.jp/content/forgo
> なしですませる、差し控える、見合わせる

<hr>
関連して思い出したのは

> I'll go without it.
http://ejje.weblio.jp/content/go+without
【jQueryプラグインinfiniteSlide.js】が上手く動かないとき

画像を繰り返しで横スライドさせるjQueryプラグインinfiniteSlide.jsというものがあります。
https://github.com/woodroots/infiniteslide

シンプルで使いやすいプラグインなのですが、ある環境でつかったら、stack overflowでエラーになったり、画像がうまく読み込めなかったりしました。
どうやら、画像の読み込みが重かったり遅かったりすると、上手くいかないようなのです。
（画像の幅を計測して、それをボックスの総幅として処理が進むようで、そのときに画像がうまく読み込まれていないと、幅が０とかになったりしちゃうようです）

```js
$(function(){
	$('.infiniteslide').infiniteslide();
});
```

って実行しているところを

```js
$(window).load(function(){
	$('.infiniteslide').infiniteslide();
});
```

という風にすると、画像が全部読み込まれてから実行されるので、エラーとかはなくなるようです。
MacでCapsLockにEscとCtrl（同時押し）を割り当てる方法

Mac において、Caps Lock key を Esc 及び Ctrl として活用する方法をまとめておきます。

**Caps Lock 単体を押すと Esc として、他のキーと同時に押すと Ctrl として働くようになります**。おかげで主に vim の使い勝手が少し良くなりました。

##方法
1. Karabiner と Seil をインストールする
2. System Preferences の Keyboard （Macのキーボードの設定） において Caps Lock の設定を No Action にする
3. Seil において Caps Lock のキーコードを 53 (Escape) に変更する
4. Karabiner の Misc & Unistall における Open private.xml より xml ファイルを編集し、Change Key からリロードして設定を反映する
5. Change Key の一覧に追加された、今回新しく作った項目にチェックを付ける

##ポイント
Caps Lock は Karabiner だけではキーバインドをうまくいじることができないため、Seil を利用してまずは Caps Lock の割り当てを Esc に変更しておきます。

キーバインドを変更したら、private.xml にて \_\_KeyOverlaidModifier__ に関する記述を書き込むことで one-shot modifier の機能を Karabiner に加えることができます。

一例として下記のように private.xml を編集すると Caps Lock key の挙動を目的のものとすることができます。

```xml

<?xml version="1.0"?>
<root>
    <item>
        <name>CapsLock to Esc/Ctrl</name>
        <identifier>private.CapsLock_to_Esc_Ctrl</identifier>
        <autogen>
        __KeyOverlaidModifier__
        KeyCode::ESCAPE,
        KeyCode::CONTROL_L,
        KeyCode::ESCAPE
        </autogen>
    </item>
</root>
```

\_\_KeyOverlaidModifier__ の第一引数は置き換えたいキー（今回はEsc）、第二引数が他のキーを押した時に割り当てられるキー（Ctrl）、第三引数が単独で入力した場合に割り当てられるキー（Esc）となっています。

Karabiner の一覧に追加される設定の名称は \<name> で指定したものとなります。（今回の場合だと CapsLock to Esc/Ctrl）
Oculus Connect 3で気になったこと

## Web VR

https://developer.oculus.com/webvr/

これまでOculusのVRシステムはネイティブアプリ用に開発していたが、これからはWeb VRにも力を入れる。Web VRならストアを介さずURLを入力するだけで簡単にVR体験を提供できる。
Web VRのための二つのトピックが紹介された。

### React VR

Web VRのためのフレームワーク。JavaScript等Webの技術でVRアプリケーションがWebベースで開発できる。
A-FRAMEのようなもの？

### Carmel

Riftで使える、Web VRに対応したWebブラウザ。近日Early Accessが公開予定。
現状ではWeb VRを利用するにはChromeやFirefoxのカスタムビルドを使わないといけなかったりして敷居が高いが、これからはWeb VRが公式にサポートされて、使いやすくなる。といいな。

## Video SDK

Gear VRで360度ビデオのストリーミングやアンビソニックへの対応を簡単に行えるVideo SDKを開発中。個人的にはとても気になる話題でした。

## Standalone VR Device

現状のモバイルVRとPC VRの中間に位置する、VR専用機を開発中。あったらいいよねと思っていたけどついに！

## Asynchronous Spacewarp

以前からAsynchronous Timewarpというヘッドトラッキングを利用した映像補完技術が搭載されていたが、これとは異なる新たな映像補完技術を開発中。Asynchronous Spacewarpと呼んでいた。
過去の2フレームから映像中のオブジェクトの動きを解析して間の映像を補完するというもので、従来は90fpsでレンダリングしないと快適なVR体験ができなかったというところが処理的には半分の45fpsで良くなり、ロースペックマシンでも快適なVR体験ができるようになる。
発表されたマシンは$499ということで、現行のOculus Ready PCと比べて約半額である。VR用PCは高すぎるのが短所だったが、これである程度解決されるか？

Oculus ReadyのPCを新たに製作していて最低動作要件がGeforce 960以上、Core i3以上に引き下げられ、より安価にVRマシンを購入できるようになる。ノートPCでもOculus Readyのマシンが登場する。
Stackを使ってMacにGHCJSを導入する

素人が自分用メモとして、[GHCJS](https://github.com/ghcjs/ghcjs)の導入方法を書いている為、
もし間違ってたら、教えていただけるとありがたいです。。。

## 事前準備
node と stack を導入してください。

##プロジェクト作成

```
stack new [project-name]
cd [project-name]
```

## ghcjsインストール

[このサイト](https://docs.haskellstack.org/en/stable/ghcjs/#ghcjs)にアクセスし、Example Configurations の設定をコピーし、stack.yaml に追記してください。

記事執筆時点では以下の通り。

```yams:stack.yaml
resolver: lts-7.2
compiler: ghcjs-0.2.1.9007002_ghc-8.0.1
compiler-check: match-exact  

setup-info:
  ghcjs:
    source:
      ghcjs-0.2.1.9007002_ghc-8.0.1:
          url: http://ghcjs.tolysz.org/ghc-8.0-2016-10-01-lts-7.2-9007002.tar.gz
          sha1: a41ae415328e2b257d40724d13d1386390c26322
```

以下、実行します。

```
# stack.yaml 編集
vim stack.yaml
# セットアップ （１〜２時間かかりますが、二回目からは不要）
stack setup
# ビルド
stack build
# 実行
node $(stack path --local-install-root)/bin/[project-name-exe].jsexe/all.js
```

```
# コンパイラはビルド時に指定する事も可能です。
stack build --compiler ghcjs-0.2.1.9007002_ghc-8.0.1
```

パスを通しておけば、ghcjsコマンドを直接実行できます。

```
# パス通す
export PATH=$HOME/.stack/programs/x86_64-osx/ghcjs-0.2.1.9007002_ghc-8.0.1/bin:$PATH
# コンパイル
ghcjs tarai.hs
# 実行
node tarai.jsexe/all.js
```
Storyboardで生成したSegue（セグエ）をコードで呼び出すときの注意

##概要
`ViewController`の`UITextField`にテキストを入力し`UIButton`をタップすると、その内容が`LabelViewController`の`UILabel`に表示される。SegueはStoryboard上で生成。


```ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var textField: UITextField!
    
    var text: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    // ボタンが押された時
    @IBAction func tapButton(_ sender: UIButton) {
        
        print("tapButton内の処理")
        self.text = "入力："

        performSegue(withIdentifier: "toLabelViewController", sender: nil)
        print("セグエが呼ばれました")
    }

    // Segueの準備
    override func prepare(for segue: UIStoryboardSegue, sender: Any!) {
        
        if (segue.identifier == "toLabelViewController") {
            let next: LabelViewController = (segue.destination as? LabelViewController)!
            next.text = self.text + textField.text!
            print("遷移先にテキストを受け渡す")
        }
    }
    
    // 戻るボタンにより前画面へ遷移
    @IBAction func back(segue: UIStoryboardSegue) {
        print("back")
    }

}
```


```LabelViewController.swift
import UIKit

class LabelViewController: UIViewController {
    
    @IBOutlet weak var label: UILabel!
    
    var text: String!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        label.text = text
        print("ラベルのテキストを変更")
        
    }

}

```

##問題点
#####ラベルに表示されるテキスト
期待する結果：`入力：{テキストフィールドに入力された内容}`
実行結果：`{テキストフィールドに入力された内容} `

このように`"入力："`の部分が表示されない。Segueは呼び出されているはずなのに、`tapButton()`内の処理が行われていないという訳のわからない状態に陥ったためログを取って確認してみた。

#####ボタンタップ後の処理の流れ
1. 遷移先にテキストを受け渡す
2. ラベルのテキストを変更
3. tapButton内の処理
4. 遷移先にテキストを受け渡す
6. セグエが呼ばれました

どうやら`performSegue()`を宣言する前にSegueが呼び出されデータの受け渡しを行われているようだ。さらに`LabelViewController`の`viewDidLoad()`が実行された後で`tapButton()`内の処理が行なわれている。ここでの`performSegue()`によって再度データの受け渡しが行われたところで処理が終わり画面が遷移する。（ちなみに`4.遷移先にテキストを受け渡す`の後で警告メッセージが表示されていた。）

######警告メッセージ
```
SegueOnStoryboard[64302:4946416] <UIView: 0x7fb10cf0c750; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x61000023bec0>>'s window is not equal to <SegueOnStoryboard.LabelViewController: 0x7fb10ac22230>'s view's window!
```

#####問題の解決
ここまで来てもよく分からない。Storyboardに問題があるのではと思い少しいじってみた。

Segueを生成する際に`UIButton`から`LabelViewController`に矢印を引っ張っていたが、`ViewController`から`LabelViewController`へのSegueに変更した結果、問題が解消できた。

`UIButton`から Segueを生成すると、タップされたタイミングで自動的にSegueが呼ばれ、その後`tapButton()`内の処理が行われる。考えてみれば当然だが、この場合はコードで Segueを呼び出す必要がなくなるため、今回のような重複処理を招いた。

Storyboardで生成したSegueを扱うときは、つなぐ元と先をしっかりと意識した上でコードを書くことが必要であると反省。
レスポンシブ・ウェブ・デザインでJavaScriptとMedia Queriesのブレークポイントを揃える

記事がだいぶ古くなってしまったので、オーバーライド。
今なら**matchMedia**を使ったほうがいいですね。

```javascript:JavaScript

const mq = window.matchMedia('(min-width: 768px)');

const handleWindowChange = () => {
  if (mq.matches) {
    console.log('PC');
  } else {
    console.log('SP');
  }
};

mq.addListener(handleWindowChange);
handleWindowChange(mq);
```

これなら、HTML側に余分な要素を追加しなくて良いです。

以下、古い記事。

---

レスポンシブ・ウェブ・デザインの案件で、ブレークポイントがCSSのMedia QueriesとJavaScriptでスクロールバー分ずれてしまうときの対処法メモ。

HTMLには空要素を追加。

```ruby:html
<!-- Media Queries 判別要素 -->
<div class="mediaQueries" id="js-mediaQueries"></div>
```

font-familyの値に任意の文字を追加。

```ruby:scss
.mediaQueries {
    display: none;
    font-family: 'pc';
    @media screen and (max-width: 768px) {
        font-family: 'tab';
    }
    @media screen and (max-width: 480px) {
        font-family: 'sp';
    }
}
```

font-familyの文字列でブレークポイントを判定し、ブレークポイント変更時に一度だけ処理をする。
（要素の取得にjQueryを使用）

```ruby:JavaScript
var $win = $(window),
$mediaQueries = $('#js-mediaQueries'),
widthStatus = '';

$win.on('load resize', function() {
	var fontFmaily = $mediaQueries.css('font-family').replace(/"/g, '');
	
	if (fontFmaily === 'pc' && widthStatus != 'pc') {
		// PCの処理
		console.log('pc');
		widthStatus  = 'pc';
	} else if (fontFmaily === 'tab' && widthStatus != 'tab') {
		// TABの処理
		console.log('tab');
		widthStatus  = 'tab';
	} else if (fontFmaily === 'sp' && widthStatus != 'sp') {
		// SPの処理
		console.log('sp');
		widthStatus  = 'sp';
	}
});
```

[デモページ](http://codepen.io/boltkeep/pen/ALVvWv)

参照：
[Media Queries（メディアクエリ）とJavaScriptの連携について](http://qiita.com/r_abe01/items/a3a2e94b5162d949037b)
[リサイズやスクロール時に1回だけ処理を行う](http://cly7796.net/wp/javascript/do-processing-once-only-when-carrying-out-the-resizeing-or-scrolling/)
テキストエディタも仮想化する時代！DockerイメージとしてインストールしたEmacsのGUIを使う

最近Dockerを使っていろいろなものを仮想化するのにはまっており、その産物です。

動機としては、普段使いしているArch Linuxで、`emacs-mozc`の日本語入力ができないということです。

Docker内にEmacsをインストールして、Emacsの画面をホスト側に映してやろうっていう魂胆です。

# 環境

- ホストOS：Arch Linux
- ゲストOS：Debian GNU/Linux ベース
- Docker version： 1.12.1

# 手順

まずは`Dockerfile`。至極単純です。もうちょっとカスタマイズして、`emacs-mozc`を入れたりしたい。

```Dockerfile:Dockerfile
FROM debian:latest

RUN apt-get update
RUN apt-get -y install emacs24

RUN useradd -G sudo -u 1000 --create-home emacs

ENV HOME /home/emacs
WORKDIR /home/emacs

CMD /usr/bin/emacs --reverse
```

この`Dockerfile`があるディレクトリで、`docker build --tag emacs .` でビルドします。

次に、Emacsの起動スクリプトを作り、パスの通ったところに設置します。

```bash:emacs-docker
#!/bin/bash

xhost +local:
docker run -it --rm \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       -v $HOME:/home/emacs/host_home \
       -e DISPLAY=$DISPLAY \
       --user 1000 \
       emacs

xhost -local:
```

環境変数でディスプレイを与えているのと、`/tmp/.X11-unix`をマウントしてXのソケット通信を可能にしています。

あとは起動するだけです。

`emacs-docker`

こんな感じになりました。ちゃんと動いています。

![Screenshot_2016-10-07_01-26-59.png](https://qiita-image-store.s3.amazonaws.com/0/103885/078982d6-5daa-263a-2542-50e0c1c6f2f4.png)

`dired`でディレクトリを確認。ちゃんと、ホスト側の`$HOME`がコンテナ内にマウントされています。
UIDが一致しているので、Docker実行ユーザー（ここではEmacs）の所有ファイルと認識されています。

![Screenshot_2016-10-07_01-30-31.png](https://qiita-image-store.s3.amazonaws.com/0/103885/fdc59c7a-6144-975f-4ee4-04f17240baa9.png)


# 注意点

- HOSTのUIDとコンテナ内のUIDが同一でないと、権限の問題が発生してファイルの編集、作成ができなくなります。
- DockerやLXCでは、シンボリックリンクが使えないようです。これは場合によってはけっこう面倒。

半分ネタですが、積極的に使っていこうかなと。

# 追記

> @mapk0y
> マウントするのは "/tmp" ではなく "/tmp/.X11-unix/" だけのほうが良い気もする。あと スクリプトの最後で "xhost -local:" したほうがいいかも。

というコメントをはてなの方でいただきました。

自分も最初`/tmp/.X11-unix/`をマウントしましたが、なぜかうまくいかなかったので`/tmp`ごとマウントしてしまいました。雑ですいません。
通常は`/tmp/.X11-unix/`だけで良いはずですので、そのように修正しました。ありがとうございます。

"xhost -local:"も追記しておきました。


`/tmp/.XIM-unix`というディレクトリもあるので、もしかしたらXIMの機能だけ仮想環境に置いとくとかもできるんですかね。
夢が広がりますね。