OmniAICreator/Qiita-1.07M huggingface dataset:
［iOS］Storyboardを使わないで、端末の向きに応じて背景色を変更する方法

# 端末の向きに応じて、背景色を変更する方法

縦向き（portrait）
![スクリーンショット 2017-12-01 2.03.49.png](https://qiita-image-store.s3.amazonaws.com/0/199441/ca8e89fc-17c5-93e2-c342-771910e5d83f.png)

横向き（landscape）
![スクリーンショット 2017-12-01 2.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/199441/0c374f70-9cb4-2964-4579-1140dd72af26.png)

## コード例
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .orange
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
       
    }
    
    override func viewDidAppear(_ animated: Bool) {
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.onOrientationChange(notification:)), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }
    
    @objc func onOrientationChange(notification: NSNotification){
        let deviceOrientation: UIDeviceOrientation! = UIDevice.current.orientation
        
        if UIDeviceOrientationIsLandscape(deviceOrientation){
            self.view.backgroundColor = .blue
        } else {
            self.view.backgroundColor = .orange
        }
    }

}
```
独断と偏見で選んだテスト系イベント/Twitterアカウント 2017(若手向け)

今年もソフトウェアテストアドベントカレンダー始まりました。
どうも、ぱいんです。
早速、全マス埋まってしまって感謝感激です。

1日目は、特に、若手向けの記事になります

# そもそもテストのイベント/SNSに参加すると何がおもしろいの？
偉そうに書こうかと思ったのですが、[ヤマサキさんのスライド(PDF)](http://jasst.jp/symposium/jasst17tohoku/pdf/S1.pdf
)が、言いたいことズバリそのものなのでこちらをお読みください。

一言でいうと、~~会社にお手本になる先輩がいなかったとしても~~社外のつながりを増やして、技術的な悩みを話せる仲間や知り合いを増やしていければ、同じ仕事でも楽しくなって、成長もできるんじゃないかなという考え方が、この記事のモチベーションになります。

# 1. 独断と偏見で選ぶテスト系イベント BEST 3

1. [JaSST (ソフトウェアテストシンポジウム)](http://jasst.jp/index.html) 
年中、日本のどこかで開催されているシンポジウム。北海道、東北、新潟、東京、東海、関西、四国、九州があり、テーマも毎年違う。中国も開催される？というか、企画すればいいんですかね(笑)テストエンジニアの中には、ドラゴンボール探しのように飛び回っている人もいたりする。参加費は数千円～。有料だが、論文査読もあり、基調講演で話される大御所の有難い話をはじめ、発表内容も実践的なものがおおい。ワークショップもかなり工夫されていて面白い。
まだ行ったことのない方は、過去イベントのスライドも公開されているものもあるのでぜひのぞいてみてください。

2. [NaITE (長崎IT技術者会)](http://naite.swquality.jp/)
長崎との名前を関しているが、他のイベント同様自由に参加できる。個人的には、最初に行くイベントとしては、とてもおススメ。ほぼ毎月、川崎周辺で開催。特徴は、いい意味で敷居が低い。講師やコンテンツは、実践的なものが多いにもかかわらず、小規模なので非常に質問もしやすい雰囲気＾＾

3. [Ques (キューズ)](http://quesqa.com/)
最先端をいくテストイベント（個人的感想です）。イケてる企業や、テーマを毎回持ってきてくれます。そういえば、2016年にVRのテストの話をしてましたね。早いっ。
ノベルティもイケてます。さらに、勉強会が終わった後にそのまま懇親会もある、そして全て無料。
素晴らしい。実は、私の勉強会デビューもこちら。


#2. 独断と偏見で選ぶテスト系TwitterアカウントBEST５ (順不同)
- [YasuharuNishi](https://twitter.com/YasuharuNishi)さん: 
にしさん。説明する必要すらない気もするが、テストやってて、Twitter垢持っているなら最初にフォローすべき方。

- [KeizoTatsumi](https://twitter.com/KeizoTatsumi)さん:
ご自身の発言に加えて、海外からの情報をふんだんに発信してるお方。同じくフォローすべき方。

- [akiyama924](https://twitter.com/akiyama924)さん
同じくテスト界においては、説明する必要すらない気がするが、同じくフォローすべきお方。
- [鈴木三紀夫](https://twitter.com/mkoszk) さん
常にテストネタ濃度高め。最近、勉強会「○○を語る夕べ」シリーズを主催されている。
- [Kosuke Fujisawa](https://twitter.com/mhlyc)さん
通称リリカル。テスト、時々哲学。上に挙げたテストの諸先輩方と対等にやりあっている姿はTLで見ていても、尊敬する。

#3. 番外
- [テスターちゃん](http://testerchan.hatenadiary.com/): キャッチコピーは「新人さんからわかるソフトウェアテスト漫画」。侮るなかれ、説明が充実していて楽しく学べる。作者は[まつ](https://twitter.com/mty_mno)さん。
- [テストラジオ](http://testradio.fm/): 毎週[ワニ](https://twitter.com/okauchiwani)さんと[なそ](https://twitter.com/hiroyuki3gou)さんが楽しくテストについてお喋りするツイキャス番組。Podcast配信あり。

#最後に
だいぶふんわりとした内容になりましたが、
改めて各イベントのページをのぞいてみたりすると、アップデートや今欲しい情報があったりするかもしれません。参考になれば幸いです。
俺でも申請通せたMicrosoft BizSparkプログラム

俺です。

会社運営では色々出費を抑えたいもんです。
技術的なアレがアレをアレしたいときもそーなんですが少しでも費用抑えたい俺達のために
Microsoftさんは[Microsoft BizSpark](https://www.microsoft.com/ja-jp/startups/)というスタートアップ支援プログラムを提供してくれてます。

会社起こしたけど開発環境一式そろえたいンゴンゴな俺達のために登録方法を残します。
ありがとうマイクロソフト~~

# アクセス

BizSparkプログラムサイトへアクセスします。
BizSparkに参加をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/3a2675f9-7612-ff75-0ea7-4dbebe3d0f62.png)

# メールを送る

申し込む上でココが一番の難関でした。
メールクライアントアプリが自動起動します。
ぼくはメールクライアントアプリを使わない派なのでここで詰みました。
BizSpark担当へメールが送れない。
もうだめだ。敷居が高いぞMicrosoft BizSpark.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/1a1acd82-a62c-5b84-5522-f7ea7749460b.png)

躓いたぼくを助けてくれたのは右クリックなメールアドレスをコピー機能です。
ありがとうオペレーティングシステム。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/27ea3714-9015-27a6-ebfb-75507f57f368.png)

- 送信

```
Microsoft BizSparkご担当者様

最近会社を立ち上げましたので、BizSparkでAzureを使いたいです。

以下申込情報です。

お申込者氏名:おれ たろう
スタートアップ名:株式会社アンドゲート
創業年:2017/8/1
Email アドレス:*******
ホームページURL:http://andgate.co.jp

審査よろしくおねがいします。
```

# 受付メールへの返信

いくつか質問がくるのでとりあえず事業計画書送ります。

```
お世話になっております。 
マイクロソフト BizSpark お問い合わせ窓口です。  
この度は Microsoft BizSpark にお申し込みいただき誠にありがとうございます。  
以下の点についてご確認の上、*****までにご連絡をお願いいたします。  
 
質問要項A
質問要項B
..
```

# 承認

やったぜ。
アンケートに答えればOK.
このあと添付されるドキュメントに従ってサブスクリプションIDを登録したら完了です。

```
お世話になっております。ご返信ありがとうございました。
アンケートのご回答と共に本メールにご返信頂き次第、追って承認させていただきます。
（****までにご返信がない場合は自動的にキャンセルとさせていただき、次回お申込みいただいた際は再度審査となります。 ご了承下さい。)
```

# Hello　Microsoft World

- VisualStudio Subscriptionsページへアクセス

ぼくはVisualStudioではなくMicrosoft Azureが使いたいのでAzureのコンソールへアクセスします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/3725629f-9f53-8b26-27e4-9fcf27dfcafc.png)

BizSparkサブスクリプションが適用されています。やったね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/add6ea04-89b9-3f72-e8b1-dbaae70149bc.png)

完
Pull Request の指摘修正でコミットログが汚れていく問題への対処法の一案

この記事は [Akatsuki Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aktsk) の 1 日目の記事です。

## はじめに

この記事では rebase の是非やルールについては議論しません。

開発者が限定されているプライベートリポジトリや、事前に「このブランチはあとで整理する」と通知してあれば、一定の rebase は問題ないという前提の元、話を進めます。

## 問題

私は普段、GitHub 上で Pull Request ベースで開発しています。
一旦 Pull Request を出したあと、レビューで間違いを指摘されたり、予期しない箇所がテストで落ちたりなどして、追加の修正を行うことは日常的に発生します。

この時、単純な typo など本当に些細なミスは、既存のコミットに修正を入れ込んでしまいたいことも多々あります。

しかしそのようにして `push -f` すると、レビュアーは追加で修正した箇所がわからなくなってしまいます。


## 解決

fixup コミットを使ってこの問題を解決します。以下で手順を説明します。

### 追加の修正を行う

あとから行う修正を、すでに行っているコミットの中に混ぜ込みたい場合、`git commit --fixup` を使います。例えば直近の `Add` という単語をコミットメッセージに含むコミットに混ぜ込みたい場合は以下のようにします[^1]。

```
$ git commit --fixup=:/Add
```

これを実行すると、以下のようなメッセージのコミットが作成されます。

```
!fixup Add new feature
```

`Add new feature` の部分は、指定したコミットのコミットメッセージになります。

レビュー中はこのコミットを push して行きます。こうすることで新たな変更が明確になるので、レビュアーは新しい変更だけをレビューできます。

### コミットを整理する

さて、一通りの修正が終わって、マージできる状態になりました。ここで積んでいた fixup コミットを通常のコミットに混ぜ込みます。

```
# 元ブランチが master の場合
$ git -c core.editor=true rebase -i --autosquash $(git merge-base master @)
```

これで `!fixup` コミットが、`--fixup=` で指定したコミットに入れ込まれます。 [^2]

問題なければリモートブランチに反映します。

```
$ git push -f
```

### 何が起きているのか

何が起きているのかを確認するために、いくつかオプションを取り除いて実行してみます。

```
$ git rebase -i $(git merge-base master @)
```

ここで `$(git merge-base master @)` は単にベースになるコミットを指定しています。代わりに `@~10` のような数の指定や、直接 hash を指定しても構いません。

さて、上記のコマンドを実行すると、以下のような内容でテキストエディタが起動するはずです。`rebase -i` を使ったことがある人ならば見慣れた内容でしょう。

```
pick 02d6268 Add new feature
pick 0cec502 Improve new feature
pick 89a3f4b fixup! Add new feature
```

既存のログ通り、一番最後に `fixup!` のコミットが積まれています。

ここで一旦 rebase をキャンセルして、今度は `--autosquash` を付けて実行してみます。

```
$ git rebase -i --autosquash $(git merge-base master @)
```

すると今度は以下のような内容になります。

```
pick 02d6268 Add new feature
fixup 89a3f4b fixup! Add new feature
pick 0cec502 Improve new feature
```

`fixup!` のコミットが `Add new feature` の直後に移動し、さらに操作が `pick` から `fixup` に変わっています。

これが autosquash の機能です。`fixup!` で始まるコミットがあると、その後ろにあるメッセージのコミットを探してその下にコミットを移動し、操作を `fixup` に変更した状態でテキストエディタが開かれます。

あとはこれを何も変更せずに終了すれば、fixup が適用された rebase が完了します。そのために以下のオプションを追加します。

```
$ git -c core.editor=true rebase -i --autosquash $(git merge-base master @)
```

`-c core.editor=true` というオプションを渡しています。これは `git rebase -i` で起動するテキストエディタに `true` コマンドを使うと言う意味です。ご存知の通り、`true` コマンドは何もせずに終了コード 0 で終了するコマンドです。つまり `git rebase -i` で開かれる TODO リストに対して何も変更を加えずに `git rebase -i` を実行しているということです[^3]。

ちなみにここまでずっと `fixup` のみを言及してきましたが、autosquash という名前からもわかるように squash も同様に可能です。`--squash={commit}` を使うと `!squash ...` コミットが生成され、rebase 時に自動的に `squash` になります。

## おわりに

fixup を用いたブランチ整理の機能は以前からあり、探せば解説している記事もいくつか見付かります。この記事では、これを Pull Request のレビューの際に活用する提案をしました。

最初にも書いた通り、一度公開されたブランチ上でこれを行うのは賛否があるでしょう。事前にチームメンバーに確認を取っておくとスムーズです。

Git のログは日記帳ではありません。実際に起きた事細かなことを記録するのではなく、あとから見てわかりやすいログを残せるとよいですね。




[^1]: `:/Add` の部分は、単にコミットを指定しています。直接 hash 値や `@~3` のような指定も可能です。
[^2]: 混ぜ込むコミットを間違えたりすると、場合によってはコンフリクトが起きる場合もあります。
[^3]: 例えば `true` の代わりにシェルの組み込みコマンドの `:` などでも同様の結果が得られます。
デコレータでトランザクション処理を試しに実装してみた

# OverView
Pythonのデコレータがまだイマイチ馴染みきれていないので、何か実際に書いてみようと思った。
DBのトランザクション処理がちょうど良さそうだと思ったので、試しに実装してみた。

## DBの処理フロー
成功時 `begin -> [何らかの処理] -> flush -> commit -> end`
テスト時 `begin -> [何らかの処理] -> flush -> rollback -> end` 
失敗時 `begin -> [何らかのエラー] -> rollback -> end`

## 環境
python: 3.6

## 構成
簡単に以下の2ファイル

```
- app.py
- utils.py
```

## メイン関数
先にメインの関数である`main_func`のソースから。デコレータ`transaction`は後述する。
`main_func`はprintしているだけだが、本来はinsertしたりupdateしたりいろいろ考えられる。
今回は動作検証が目的なので、`success`の値に応じて例外を投げている。
この例ではデコレータの引数`production`がハードコーディングされているが、実際はアプリケーション起動時とテスト起動時で読み分けることを想定。

```
from utils import transaction

@transaction(production=True)
def main_func(success):
    if success:
        print("DBで処理する")
    else:
        raise


if __name__ == '__main__':
    main_func(success=True)
```

## デコレータ

```
def begin():
    print("開始しました")

def end():
    print("終了しました")

def flush():
    print("flushしました")

def commit():
    print("commitしました")

def rollback():
    print("rollbackしました")

def transaction(production):
    def decorator(f):
        def wrapper(*args, **kwargs):
            begin()
            try:
                f(*args, **kwargs)
                flush()

                if production:
                    commit()
                else:
                    rollback()
            except Exception:
                rollback()
                raise MyError("失敗しました")
            finally:
                end()
        return wrapper
    return decorator


class MyError(Exception):
    def __init__(self, message):
        self.message = message
```
実際にテスト書くときは、flushとrollbackの間にテストコードが入るので、setupの中にbegin、teardownの中にrollbackとendが入る。

## まとめ
多少デコレータがわかった。
もっと良い方法など知ってる方いたら教えてください。
Python(Click)でデフォルト安全なコマンドラインツールを作る

サーバ管理業務の自動化のため、Pythonでコマンドラインツールを作るということはわりと多いかと思います。
普段自分がコマンドラインツールを作るときには、そのツールを利用した際にオペレーションミスが発生する可能性を低くするために以下の点を心がけています。

- dry-runオプションを用意する
- 実動作には明示的なオプション指定を必須にする(デフォルト動作をdry-runする)

これをPythonのサードパーティ製コマンドラインパーサーである[Click](http://click.pocoo.org/5/)を使ったやり方をまとめました。

## コマンドラインパーサー

Pythonのコマンドラインパーサーは、標準モジュールだと[argparse](https://docs.python.jp/3/library/argparse.html)がありますが、より少ない記述量でかつ実装が楽な[Click](http://click.pocoo.org/5/)がオススメです。

以下の例はバージョン6.7で試しています。

```python
pip install click==6.7
```

次のようにエンドポイントとなる関数に`option()`デコレーターでオプションを設定します。コマンドラインから指定された値は引数として受け取って関数の中で利用できます。

```echo.py
#!/usr/bin/env python

import click


@click.command()
@click.option('--text', help='Print text')
def echo(text):
    print("%s" % text)


if __name__ == "__main__":
    echo()
```

```bash
$ python echo.py --text "Hello World"
Hello World
```

オプションのタイプも豊富に用意されていて、フラグオプションの[Boolean flags](http://click.pocoo.org/5/options/#boolean-flags)、選択オプションの[Choice Options](http://click.pocoo.org/5/options/#choice-options)など、必要なものはひと通り揃っています。


## dry-runオプションを用意する

コマンドラインツールを実行したときに、どのリソースに対してどんな操作が行われるかを事前に確認したいことはよくあると思います。
そのようなときのために、dry-runオプションを用意しておくとよいでしょう。事前に確認することで意図しないリソースに変更を加えてしまうというような事故を防ぐことができます。

`--path`オプションで指定したファイルを削除するプログラムを例とすると、`--dry-run`オプションによって削除対象のファイルが正しいかを確認できるようにしておきます。

clickを利用する場合だと、[Boolean flags](http://click.pocoo.org/5/options/#boolean-flags)を利用して`dry-run`オプションを実装できます。

```delete.py
#!/usr/bin/env python

import os
import sys

import click

@click.command()
@click.option('--path', help='Target path')
@click.option('--dry-run', is_flag=True, help='Dryrun')
def delete(path, dry_run):
    if dry_run:
        print("Dry-run: %s is deleted." % path)
        sys.exit(0)

    os.remove(path)
    print("%s is deleted." % path)

if __name__ == "__main__":
    delete()
```

```bash
$ python delete.py --path demo.txt --dry-run
Dry-run: demo.txt is deleted.
```


## 実動作には明示的なオプション指定を必須にする(デフォルト動作をdry-runする)

破壊的な操作を行うコマンドラインツールの場合は、意図しない操作によって実害が出る可能性を減らすために、デフォルトの動作を`dry-run`同様にしておき、明示的にオプション指定しない限り実際の操作が行われないようにします。

先程のファイル削除のプログラムを少し変えてみます。
`--delete`オプションを明示的に指定しない場合はDry runが実行されるようにしています。

```delete_2.py
#!/usr/bin/env python

import os
import sys

import click

@click.command()
@click.option('--path', help='Target path')
@click.option('--delete', is_flag=True, help='Actually delete file')
def delete(path, delete):
    if delete:
        os.remove(path)
        print("%s is deleted." % path)
    else:
        print("Dry-run: %s is deleted." % path)
        sys.exit(0)


if __name__ == "__main__":
    delete()
```

```
$ python delete_2.py --path demo.txt
Dry-run: demo.txt is deleted.
```

```
$ python delete_2.py --path demo.txt --delete
demo.txt is deleted.
```

## まとめ

- [Click](http://click.pocoo.org/5/)はオススメ
- 実用性より安全性を優先する
【iOS】タップできるUILabel - StoryBoardでTapGestureRecognizer -

# UILabelにsenderが設定できない！

StoryBoardで、UIButtonから線を引っ張るとsender(タップした時のリスナー)を登録できますが
**UILabel**から線を引っ張ろうにも

**senderが出てこない・・・**

Androidな気分でやろうとすると
Viewの部品になんでもかんでも気軽にリスナーをセットできるわけではない事態にぶつかるワケです。
TextViewにonClick()、ていう感じにはできないのです。

# UIButtonにはsenderだけど、UILabelには・・・？

**TapGestureRecognizer**
というものを**UILabel**に紐づけて
**TapGestureRecognizerから線を引っ張ってsenderを作る**
と**2段階でセット**してあげれば
**タップできるUILabel**ができます。


# やり方

(例えば、タップさせたいLabelが画面の真ん中にあるとしたら、の例です)
画面の一番右側の一番下に検索窓のようなものがあるので
そこに
Tap
と打ち込んでみると
フィルターがかかって、部品のリストに
TapGestureRecognizer
だけが出た状態になります。
Ctrを押しながら、TapGestureRecognizerをLabelの上にドラッグして指を離します。![11.png](https://qiita-image-store.s3.amazonaws.com/0/106533/b4b98152-61df-5cc9-c7ea-d002138ddf66.png)

TapGestureRecognizerをドラッグする前は↓

![2.png](https://qiita-image-store.s3.amazonaws.com/0/106533/1c3e2833-38b8-e291-7915-46a45776a364.png)

ドラッグができると↓
![3.png](https://qiita-image-store.s3.amazonaws.com/0/106533/6de5f2aa-cf70-60fc-4423-60b01bceb1ba.png)

わかりやすく名前を変えます↓
![4.png](https://qiita-image-store.s3.amazonaws.com/0/106533/8889c679-bce6-a615-b325-c66857b70163.png)

これを、UIButtonと同じ要領で
Ctrを押しながら**タップさせたいLabelのTGR**をコードの方にドラッグして紐づけます。
指を離すと吹き出しのようなものが出るので
![6.png](https://qiita-image-store.s3.amazonaws.com/0/106533/499d4fa3-1a73-6480-d13d-bd8b4a8bd1ae.png)

OutletになっているところをActionに変えて、
Nameにはつけたいメソッド名を入力して
Connectをクリックします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/106533/61a12ab4-c874-a550-aa1c-f69daed60b21.png)


↓画像の18行目のように、メソッドが追加されます。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/106533/2efd8cd7-2125-d8c6-da0d-fb55316b3d61.png)

タップされた時にやりたい処理をカッコの中に書きます。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/106533/ce874055-2b3d-4789-8b68-1ec11f284651.png)

# 忘れちゃいけない！！！
ここまでやって、タップしても全く反応せず
悶絶の1時間を過ごしてしまいました・・・。
原因はこれ

![10.png](https://qiita-image-store.s3.amazonaws.com/0/106533/92cb9c0d-688e-9cd5-3b8a-cf5d457baffd.png)


StoryBoardに戻って
Labelが選択されている状態にして
User Interaction Enabled に
**チェック**を入れないと
画面が割れるほどタップしても絶対反応しません(泣)

# Labelはドロップシャドウが簡単につけられる
悶絶するくらいならはじめからUIButtonにしておけばいいじゃないか
と思われるかもですが
LabelはButtonに比べるとお手軽に文字のドロップシャドウをつけられる、などのメリットがあるので
状況に応じて使い分けられたらベストだと思うのです。

以上でございます。
説明わかりづらい方、コメントくれたらお返しします！
(mac) Visual Studio CodeのVimでNormal modeに戻る際に日本語入力をオフにする

"関"には「つなぎめ」という意味があるそうで、Vimのモード切替え時の「つなぎめ」を少しスムーズにできれば、というテーマです。

## 何をしたいか
Visual Studio CodeのVim拡張 ([VSCodeVim](https://github.com/VSCodeVim/Vim)) でNormal modeに戻った際、毎回、日本語入力をオフにするのが大変です。また、オフにし忘れて、カーソル移動でつまずくのも大変です。これをスムーズにしたいと思いました。

カーソル移動でつまずくの図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58153/e2911f44-7be5-43f5-e911-2d96d9a57cea.png)

Insert modeから `esc` や `ctrl + [` でNormal modeに戻った際、日本語入力が有効なままのため、`j` を入力するとIMEが2文字目の入力や候補の選択待ち状態になっているのかと思います。

## やったこと
Normal modeで日本語入力を使わないので、Normal modeに戻る際に日本語入力をオフにするよう、Google日本語入力の設定を変更しました。

手順です。

- Google日本語入力の環境設定画面を開いて、キー設定を編集する

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/58153/ee2952a1-f049-ab42-eefd-d90726a35cbb.png)

- 「エントリーを追加」を選択して、`Ctrl + [` のクリック時にIMEを無効化するエントリーを追加

![screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/58153/78c0ff23-7b05-e3ed-2239-156985d88d52.png)

簡単ですね。これで少し楽になりました :)

なお、挙動は以下のバージョンで確認しています。

- Google日本語入力 2.20.700.1
- Visual Studio Code 1.18.1
- VSCodeVim 0.10.5

また、Macの標準ターミナルで起動するVimでは日本語入力がオフにならないのですが、AtomのVim拡張やVisual Studio Codeの統合ターミナル内で起動するVimではオフになりました。
[Swift]配列の重複を削除する

swiftで配列の重複を削除する処理をメモ。
「NSOrderedSet」を使用することで、重複を削除できる。厳密にいうと、このクラスは値の重複を禁止するらしく、それによって重複が削除できる。
以下、実際に書いたコード。

```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        //「notifications」は配列。
        if notifications != nil {
            
            //重複分を避けるための前処理
            let orderdset: NSOrderedSet = NSOrderedSet(array: notifications!)
            let newnotifications = orderdset.array as! [String]
            
            var items = [GetGroupnameAndApply]()
            
            for i in newnotifications {
                self.ref.child("Notifications").child(i).observeSingleEvent(of:.value, with: { (snapshot) in
                    for child in snapshot.children {
                        let item = GetGroupnameAndApply(snapshot: child as! DataSnapshot)
                        items.append(item!)
                    }
                    self.dataset = items
                    print(self.dataset)
                    self.tableView.reloadData()
                    
                })
            }
        }
        
       
        
        
    }```
coremltoolを使った画像認識でsvm形式のモデルを利用する１


### 開発環境

+ macOS 10.13
+ Swift4
+ XCode9
+ Python2.7

今更ですが、coremlでの画像認識をsvm形式のmodelで試してみました。
ここでは、元となるmodelを作るまで。

#### 学習データ
手書き数字データを公開しているWebサイトから学習用イメージを取得して、それをsvm形式のモデルに変換するのだけど、やり方については、僕はこの本のやり方で.modelファイルを作りました。

[JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック](https://www.amazon.co.jp/JS-Node-js%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC-%E3%83%8D%E3%83%83%E3%83%88%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4883379930)


手順を書けば
１. [THE MNIST DATABASE](http://yann.lecun.com/exdb/mnist/)からtrain-images-idx3-ubyte.gzをダウンロード
２. train-images-idx3-ubyteをCSVに変換

やり方は本を読むかネットで調べてください。

３. そのCSVからSVM形式のファイルを作る

SVM形式は以下のフォーマットになっている。

````
<label> <index1>:<value1> <index2>:<value2> <index3>:<value3> ...
````

mnistのデータは28x28のモノクロ画像なので、28x28=784の行列が色の明暗が０〜２５５で現れている。
本では明暗を255で割って０〜１で表現している。

例えば5を表すsvm形式のデータは以下のようになる(valueの値は適当）
````
5 0:0 1:0.12345 2:0.2344 3:0 ...
````

注意するのは、valueが0のものは省略出来る。省略した方がファイルのサイズが小さくなるが、一つの数字の行列の数がバラバラになり、今回作るmlmodelとしてはうまく動かないかもしれないので、省略せずに作る事
これも実際の作り方に関しては本を読むかネットで調べて欲しい。

４. [libsvm](https://github.com/cjlin1/libsvm)をダウンロードしてコンソールから使えるようにする

```コンソール
#ダウンロードしたlibsvmフォルダ内で
$ sudo make
$ cd python
$ sudo make

```

楽するなら、libsvmコマンドのエイリアスを作っておくと便利

５. svm-trainでsvmファイルからmodelを作る

```コンソール
$ svm-train train.svm train.model
```

出来たmodelの内容の先頭はこんな感じ


````train.model
svm_type c_svc
kernel_type rbf
gamma 0.00127551
nr_class 10
total_sv 19625
rho -0.875385 -1.57898 -1.86108 -1.69481 0.0843436 -1.11201 -1.37594 -0.864901 -3.56646 -0.464904 -0.707754 -0.23612 0.590029 0.370307 -0.106454 -0.0409962 -0.255275 0.229151 0.622187 1.22355 1.48548 0.365479 0.791545 0.736575 0.112124 2.15981 1.73285 0.383973 0.693789 0.201564 1.14541 1.10034 -0.121608 1.22076 0.184059 -0.729355 -1.53266 -1.24009 -2.48586 -0.945167 -0.414781 -2.42301 0.181592 0.114848 -0.102643
label 5 0 4 1 9 2 3 6 7 8
nr_sv 2632 1098 1988 1171 2667 1999 2289 1451 1833 2497
SV
0 0 0 0 1 1 0 0 0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:0 15:0 16:0 17:0 18:0 19:0 20:0 2
````


これでモデルを用意できました。このモデルは他の言語でも利用出来ます。
データ解析が再現するということ、あるいは Common Workflow Language が僕らにもたらしてくれるもの

##### 12/10 Updated

内容がポエミイなのでQiitaの記事としてふさわしくなかろうと自ら判断し、記事を以下の自分のblogに移しました。Qiitaはプログラミングに関する情報交換のためのプラットフォームなので、アベンジャーズのメンバー募集記事は載せるべきではありませんでした。すみません。

[データ解析が再現するということ、あるいは Common Workflow Language が僕らにもたらしてくれるもの - こんな時間ですがパスタを茹でます](http://trattoriainutano.tumblr.com/post/168391519927/)
元ゲームエンジニアの僕が初めて純Swiftで30分でゲームを作って子供達にややウケした話

＊この記事は __[クソアプリ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kuso-app2017)__ の3日目の記事です。

どうも [machio](https://twitter.com/_k0mach1) と言います。[Flatt](https://flatt.tv) というライブショッピングの会社でiOSを書いています :desktop:
前職ではUnity使ってゲーム開発の受託をしたりしてました。今も趣味でぽちぽちC#でゲーム作ったりしています。

今回はタイトルの通り、__元ゲームエンジニアの僕が初めて純Swiftで30分でゲームを作ったら、あまりのクソさにTwitterでちょっとバズって子供達にややウケした__ので、その話をしたいと思います。

# WHY
まあ開発に踏み切った理由は至極簡単で、~~大学の授業が死ぬほどつまらくて暇だったから~~ エンジニアとしての成長意欲です。

ちょうどサービスのリリースまもない頃で、細かいバグ修正などに業務時間の多くを取られてしまっており、__0からプロジェクトを作るみたいな時間を取れていなかった__ので踏み切りました。写真はイメージです。

# WHAT
10月でちょうど肌寒い季節になりつつあったので、ゲームの中身は『__ほのぼの南国楽園ゲーム__』にしました。

![saipan.jpg](https://qiita-image-store.s3.amazonaws.com/0/118610/457a5f70-8f05-d0e5-003e-b7aa688b4724.jpeg)


なんだかサイパンに行きたい気分だったので、ゲームのタイトルも『__Saipan__』です。制限時間はわずか30分、力量が問われます。

# 現物
DEMO動画として全ての機能が網羅されていますので、以下のgifをご覧ください。

[![https://gyazo.com/890d1b425f9fa02abf54fe27f0d61c57](https://i.gyazo.com/890d1b425f9fa02abf54fe27f0d61c57.gif)](https://gyazo.com/890d1b425f9fa02abf54fe27f0d61c57)

いかがでしたでしょうか？

これが僕が心血を注いで作った、制作時間30分（うち、いいフリー素材を探す時間25分、コードを書くの4分、ビルド1分）の南国ほのぼのゲームでした。


# 世間の反応
僕が会社に行ってメンバーにDEMOを披露している様子を、デザイナー（フォローワー1000人越え）が撮影してTwitterに乗せたところ、ちびっこたちにまさかの反響。。。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">同僚が授業中に30分で作ったクソゲーがクソすぎる <a href="https://t.co/JH2vb5qBxn">pic.twitter.com/JH2vb5qBxn</a></p>&mdash; とよじゅに✈️🍺 (@toyojuni) <a href="https://twitter.com/toyojuni/status/923766621692248064?ref_src=twsrc%5Etfw">2017年10月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

RT100越え、LIKE150弱という微バズりを見せました。

# まとめ
『Saipan』はオープンソースになっていますのでどんどんPRください。みんなでSaipanを良くしていきましょう！

https://github.com/k0mach1/gyakuten_saipan

こんなことしてますが普段は真面目にiOS書いてます 笑
ぜひ本業の方のライブショッピングサービスである『__[PinQul](https://pinqul.tv)__』も触ってみてください！
質問：2地点の最短経路と、ある特定の道路との重複部分の長さを求める方法

質問です。

Google MapやOpen Street Mapなどのオンライン地図検索サービス、
または各種GISソフトウェアにおいて、
2地点の最短経路検索を行った後に、結果として出された経路と、
あらかじめ指定しておいた特定の道路（たとえば国道X号線）との
重複部分の長さを求める方法は存在するでしょうか。

300地点×30地点の最短経路との計算を行いたいので、
Google Maps Distance Matrixのように
瞬時に計算可能な方法が知りたいです。

宜しくお願い致します。
System.Reflection.ReflectionTypeLoadExceptionが出ても中身を見たい場合

## 問題の所在
　不完全なアセンブリを`System.Reflection.Assembly.LoadFrom()`などで読み込むと、`System.Reflection.ReflectionTypeLoadException`が投げられてしまいます。

```C#
using System.Reflection;

static void Main(string[] args)
{
  var asm = Assembly.LoadFrom("incomplete.dll");
  foreach(var type in asm.GetTypes()) /* <- 不完全なアセンブリだとGetTypes()が ReflectionTypeLoadException を送出 */
  {
    Console.WriteLine($"{type.FullName} : {type.BaseType?.FullName}");
  }
}
```

　もちろん、「メソッドをInvokeしたい」など、実際に動かす必要がある場合は不足しているアセンブリを見つけてきて解決しなければなりません。
一方で、アセンブリのリフレクション情報だけを読み取れればよいというケースも存在します。
そのような場合に活躍するのが Mono.Cecil です。

## Mono.Cecil
　Monoプロジェクトで開発されており、Mono DevelopやILSpyなどで採用実績があります[1]。
公式サイトは http://cecil.pe/ です。
Mono.CecilはNuGetで配布されていますので、特別な理由がなければNuGetで取得しましょう。

## Mono.Cecilを用いたアセンブリの読み込み
　.NETのものと若干インターフェイスが異なりますが、ほとんど違和感なく使うことができます。

```C#
using Mono.Cecil;

static void Main(string[] args)
{
  var asm = AssemblyDefinition.ReadAssembly("incomplete.dll");
  foreach(var type in asm.Types)
  {
    Console.WriteLine($"{type.FullName} : {type.BaseType?.FullName}");
    // メソッドやプロパティの列挙も可能. 
  }
}
```

## 脚注
[1] : http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/
Ｌチカはバンコクの喧騒と共に

#Lチカはバンコクの喧騒と共に

Lチカ(LEDチカチカ)という造語は I さんが考えたらしい。とある雑誌かウェブメディアだか何だかの取材の時に「Lチカ」という言葉が舞い降りてきた。以後、様々なメディアで使われるようになる。Lチカだけでは飯のタネにならない。かといってLチカができなければ始まらない。FPGA の世界の「Hello World」的な存在だ。

Polyphony でも Lチカが出来ることは必須だ。やってみよう。

```python:blink.py
from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.typing import bit
from configs import Config

@module
class Blink:
    def __init__(self, interval):
        self.led = Port(bit, 'out')
        self.interval = interval
        self.append_worker(self.main)

    def main(self):
        ff_led:bit = 1
        while is_worker_running():
            self.led(ff_led)
            ff_led = ~ff_led
            self._wait()

    def _wait(self):
        for i in range(self.interval // 2):
            pass


blink = Blink(Config.INTERVAL)
```


Polyphony は Python のコードをコンパイルする。オブジェクト指向をサポートしていて class が扱える。加えて、実際の Verilog-HDL のインタフェースを容易に想像できるようにPort というクラスを用意している。ソース上の \_\_init__ にある次の記述に注目してほしい。

```pytyon:
self.led = Port(bit, 'out')
```

最初の引数の bit が型名で、次の 'out' が属性だ。1bit の out の信号線をイメージできると思う。

Lチカなので”光っている時は1を出力"、"暗いときは0を出力"(ここではそうしよう。負論理とかは考えない)と状態を持つ必要がある。1を出力している時間も重要になるだろう。余りに早すぎると、我々には光っているようには見えない。

状態を持ちスレッドのように常駐して外部とのやり取りをする実体をworker と定義した。ソフトウェア的にすでに意味のあるプロセスやスレッドといった名称は避けることにした。worker は関数で表現され、\_\_init__ 内で append_worker でworker として登録される。

この Lチカのモジュールは main という関数(メソッド)が worker だ。この中でff_led という変数を 0 と 1 と交互にして、その値を Port の led に書き込んでいる。ff_led の名前から連想されるように、生成されるVerilog-HDL では FF(フリップフロップ) が生成される。

main からは _wait 関数(メソッド)がよばれ、for 文で空まわりすることで時間を稼いでいる。クロックの指定はないので interval の値をシステムに合わせて調整する必要がある。

コンパイル結果の一部を見てみよう。

```verilog:
module Blink_blink
  (
    input wire clk,
    input wire rst,
    output reg led
  );

 //ざっくりと中略 

endmodule
```

使用者が気にしなくてはならないのは Verilog-HDL としての module のインタフェースだ。module 内のコードを気にしてはいけない。高位合成とはそういうものだ。

あとはこれを自分の FPGA のデザインに埋め込む必要がある。Vivado での組み込み例を示そう。クロックの供給とリセットの接続のためにZynq を使っているので大げさな感じになっているが、本質的にはBlink_blink の RTL モジュールだけでよい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/94684bd7-4c5b-133a-1eb8-51c376d71f45.png)
Polyphony 誕生:「Hello World」

# Polyphony 誕生
もともと個人的にも企業としてもコンパイラ技術を生かしてみたいという
気持ちがあった。2007 年頃に携帯電話の仕事をしている時に、「RTOS + Script 言語」で開発効率をアップしようというアイデアがあった。当時は Scheme をベースにして Java Script という考え方だった。本当は Java がよいのだろうけど権利関係で無理だろうなと思っていた。その後、Android にあっさり追い抜かれる。

そして、Polyphony。Python をベースにするというアイデアはメイン開発者の K さんのもので、2015/01/16 の高位合成友の会の Synthesijer に刺激され、その数か月後には Polyphony の最初のバージョンが動いていた。開発秘話というものはない。気が付いたら K さんが作っていたのだ。そして 2015/12/08 の高位合成友の会での発表、2016年1月発売の[FPGA マガジン No.12](:a :href "http://www.kumikomi.net/fpga/contents/0012.php" "")への寄稿と続いていく。

#HelloWorld
「Hello World」という言葉は今や開発者でなくても使う言葉になった。組み込みシステムの開発者にとって特別な意味をもつ言葉だったので、ガレージで味わう立ち上げの瞬間の鼓動を共有できずに広まってしまっていることにはちょっとした取り残されを感じてしまう。

Polyphony が生成するコードは Verilog-HDL であり、FPGA 等をターゲットとしたコンパイラなので、組み込みシステムのそれとはちょっと違う。立ち上げ確認に putc も UART も期待できない。ただし、$display を生成する
組み込み関数の print が用意されているので、シミュレーション上では「Hello World」が可能だ。やってみよう。

ソースコードは次のようになる。

```py:hello.py
from polyphony import testbench

def hello():
    print("Hello World.")

@testbench
def test():
    hello()

test()
```

コンパイルしてみよう。pip3 が入っていれば polyphony をインストールすることが出来る。

```
$ pip3 install polyphony
$ polyphony -V
polyphony 0.3.2
$ polyphony hello.py
$ ls
hello.py  hello.v  polyphony_out.v  test.v
```

出来たソースは hello.v polyphony_out.v test.v の3つだ。polyphony_out.v が実機をターゲットにしたトップモジュールになる。test.v はテストベンチ。シミュレータがあれば実行することが出来る。ここでは iverilog を使う。

```
$ iverilog -o hello polyphony_out.v test.v
$ ./hello
Hello World.
Hello World.
Hello World.
Hello World.
  150:finish
Hello World.
```

#Tutorial はここにある
ここではざくっと Hello World をシミュレーションで実行してみた。
細かいインストールは割愛した。より細かいチュートリアルが必要な人は次の URL を見てほしい。

http://polyphony.sinby.com/tutorial.html
ソフトウェア(サービス)の品質を上げるために何をすればいいのか

#実際に動かして検証をする
「テストをする」という言葉で言い換えられます。
たかがテスト、されどテスト。
そしてフィードバック。

#情報が適切に伝達されるような仕組みをつくる
めちゃくちゃ難しいです。
プロジェクトによって適切な何かに情報を残すべきですが、
それだけでは不十分です。
みんな違う人間だから。

#コミュニケーションをする
情報の伝達以外に、チームの雰囲気をよくするとか、
士気を高めるとかいったことも必要だと思います。

#リテラシーを高める
座学も大事です。
※リテラシーが低くても回る仕組みを作れる人はもっと偉い

#環境を安定させる
これも言うのは簡単ですが、様々に制約があったりしていろいろ大変です。
でも、遅かったり止まったりしたらユーザーは離れてしまうかもしれません。

#顧客が本当に必要だったもの
「あの画像」を頭の片隅に置いておくと良いかもしれません。
Redashのパラメーター機能を用いて、PrestoにSQLを実行する時のTips

株式会社アイスタイル アドベントカレンダー 1発目記事! :christmas_tree:
# 概要
弊社ではマイクロサービス化や国内・海外の会社のJOINもあり、SQL Server、MySQL、BigQuery、Hadoop、PostgreSQL、Elasticsearchなど、サービスごとに様々なDBが使用されています。
ですが、分析業務、データ抽出業務、分析基盤の運営をする身からすると大変ですよね...

そんなわけで弊社ではRedashのデータソースにPrestoを追加し、
異機種のDBをまたがるデータ分析・抽出業務に活用しています。
**今回はRedashのパラメーター機能を使用して、PrestoへSQLを実行する際のちょっとしたTipsをいくつかご紹介します。**

prestoなんぞや? redashなんぞや? という方は下記リンクから
- [『Prestoとは何か，Prestoで何ができるか』 - Treasure Data](https://tug.red/entry/2014/07/10/150250/)
- [ダッシュボードツール「Re:dash」とは？インストール方法から使い方まで解説！【初級編】 | SELECK](https://seleck.cc/614)

# RedashからDate型のパラメーターをPrestoに送る場合
SQL Serverなどであれば、RedashのGUIでパラメーターの型をDate型に設定し、
このようなSQLを実行すると、正常に結果を取得できます。

```sql:redash_parameter_to_sqlserver.sql
   USE hoge

SELECT
       *
  FROM 
       guns g
 WHERE 
       1=1
   AND g.created_at <= {{作成日が何日以下か入力}}
```
しかし、このようなSQLでPrestoに対し実行すると、以下のエラーが返ってきます。

```sql:error_redash_parameter_to_presto.sql
SELECT
       *
  FROM 
       catalog.weapon.guns g
 WHERE 
       1=1
   AND g.created_at <= {{作成日が何日以下か入力}}
```

```java:error
com.facebook.presto.sql.analyzer.SemanticException: line 3:20: '<=' cannot be applied to timestamp,integer
```

|![presto_error.png](https://qiita-image-store.s3.amazonaws.com/0/105197/1efe2de6-b953-bd3a-0b02-e745683a5103.png)|
|:-:|

GUIでパラメーターの型をDate型と設定したにも関わらず、integerとして受け取られています。
ちなみに、Presto上では以下のSQLが実行されています。

```sql:error_on_presto.sql
SELECT 
       *
  FROM 
       catalog.weapon.guns g
 WHERE 
       1=1
   AND g.created_at <= 2017-11-29
```

**解決方法として、Date型にCASTしてあげましょう**
ただinteger型から直接Date型にCASTできないので、
パラメーターをシングルクォートで囲み、StringにしてからCASTします。
下記のようなSQLになります。

```sql:redash_parameter_to_presto.sql
SELECT 
       *
  FROM 
       catalog.weapon.guns g
 WHERE 
       1=1
   AND g.created_at <= CAST('{{作成日が何日以下か入力}}' AS DATE)
```
これでRedashのパラメーターとDate型のカラムの比較が行われ、結果が返ってきます。

# IN句の中にパラメーターを渡し、Prestoに送る場合
通常であれば下記のSQLのように、IN句の中身をTEXT型のパラメータに置き換えて、
実行するだけなのですが、これだと意図した結果が返ってきません。

```sql:html_escape.sql
SELECT 
       *
  FROM 
       catalog.weapon.guns g
 WHERE 
       1=1
   AND g.id IN ({{指定の番号をカンマ区切りで入力}})
```
HTMLエスケープを無効にする必要があり、波括弧2つ`{{ }}`ではなく、波括弧3つ`{{{ }}}`で囲む必要があります。
以下のようなSQLになります。

```sql:non_html_escape.sql
SELECT 
       *
  FROM 
       catalog.weapon.guns g
 WHERE 
       1=1
   AND g.id IN ({{{指定の番号をカンマ区切りで入力}}})
```

GithubのRedashの下記issueで紹介されています。
公式のHELPにも書いていないので、解決に結構苦労しました…。
[Quotation Mark is Not Replaced Correctly When Inserted Using Query Parameters · Issue #1211 · getredash/redash · GitHub](https://github.com/getredash/redash/issues/1211)

# まとめ
Redashは本当便利ですが、様々なデータソースを繋げれるPrestoと使うと、
**Pythonデータソースをつかわなくても、SQLのみで異機種のDBの結合を行える** ので、とても便利です。
ただ、少し一筋縄では行かないことがあるのでそんな時にこの記事を参考にしていただければと思います。

2日目はkubotakさんの「勉強会駆動開発のすゝめ」です！
ノートパソコン「ASUS E200HA」にUbuntu17.10を入れてみる

#きっかけ
「Windows入ってるけど、Windows特有の機能は使ってないなー」、
「Unix環境は欲しいけど、Macを買うのはなんか嫌」
そんなことからLinuxのUbuntuを入れることを決意！
Ubuntuにしたのは特に理由はありません。強いて言うなら、更新速度がいい感じ。
OSの変更は、初心者が気軽にするものでは本来ありません。（自分自身初心者だけど...）
自己責任で行って下さい。
また、する前に多くの情報を得るようにしましょう。

#準備するもの
ノートパソコン（今回はASUS）
USBメモリ（色んなサイトに8GB以上って書いてある...）

#インストール用のメディアの作成
まずは、Ubuntuのisoイメージをダウンロードしてください。[URL](https://www.ubuntulinux.jp/download/ja-remix)
どうしてもという場合以外は日本語版ですね。

インストールしたisoイメージを使ってライブメディアを作ります。
今回はUSBからインストールしたいので、[Rufus](https://rufus.akeo.ie/?locale=ja_JP)で行いました。
ここで必要なのは空のUSBメモリです。（ライブメディアを書き込むときにデータが全て削除されます。確認画面はあるので安心して下さい。）
Rufusを開いたら、「フォーマット設定」の中のディスクのアイコンをクリックしてisoイメージを選択して下さい。書き込む準備が始まります。
次は、スタートを押して下さい。
ここで、いくつか確認が出てくるので全て「OK」で大丈夫です。この確認が終了後にUSBメモリのデータが消し飛ぶので、「スタート」を押す前にUSBメモリのデータをどこかに移動させておいて下さい。
あとは勝手に処理してくれるので、これでライブメディアの作成は終わりです。

#Ubuntuの起動
USBメモリをASUSに差して起動！
初期設定のままでは、Ubuntuは起動しないはずです。
そこで、BIOSの設定を変えましょう！
Windowsのホームボタンから「設定」を開きます。
「更新とセキュリティ」をクリックして、左のメニューの「回復」をクリック。
「PCの起動をカスタマイズする」の「今すぐ再起動する」をクリック。
「トラベルシューティング」→「詳細オプション」→「UEFIファームウェアの設定」を選択して、再起動を行います。
すると、BIOSのメニューが開きます。
上部メニュー「Security」から「Secure Boot menu」を選び、「Secure Boot Control」を「Disabled」に変更。
これで、他のデバイスからの起動が可能となります。
次に上部メニュー「Boot」から、「Boot Option #1」を「UEFI: TDK LoR TF10 PMAP, Partition 1」に変更。
あとは、設定を保存して終了でOK！

Ubuntuが起動出来たら、紫色の画面が出てくると思います。
そこに選択肢があるので、「Install Ubuntu」を選んで下さい。
あとは、表示に従って進めて下さい。
調べた中には、内臓Wi-Fiが反応しないから自力で設定したって記事もあったけど、最初から動いたなー。

#参考文献
[Ubuntu 16.04 インストール準備 その1 - Ubuntu 16.04をインストールする前に・Ubuntuのライブメディアを作成してUbuntuを起動する](https://kledgeb.blogspot.jp/2016/04/ubuntu-1604-1-ubuntu-1604ubuntuubuntu.html)
Slackユーザ向けにDiscordの概要を説明する

# [Discord Advent Calendar 2017](https://qiita.com/advent-calendar/2017/discord) の1日目！

まだまだ空きがありますので、この記事をきっかけに書いてくれる人が増えると嬉しいです！
すでにカレンダーへの参加登録をされている方、ありがとうございます。

# はじめに

## 記事を書くきっかけ
仕事ではSlackを使っていて、プライベートではDiscordを使う機会をじわじわと拡げています。使っているうちに「Slackではできるこの機能が無い」やその逆の知見が少しづつ集まりました。Qiitaはエンジニア向けの空間ですのでSlackユーザが多いハズ。ということでSlackとの比較をしつつDiscordの基本を紹介します。

## そもそもDiscordとは何か
Discordはゲーマー向けのテキストチャット・ボイスチャットのサービスおよびアプリケーションです。
![01427a94-2b3f-45fe-b476-0924b9191806.png](https://qiita-image-store.s3.amazonaws.com/0/126660/8f580ca5-4fd0-e989-3b6c-522e9ddf2b8b.png)キャプチャの通り、SkypeやTeamSpeakといったツールの置き換えとして2015年から稼働しており、ユーザ数を着々と伸ばしています。
機能追加にも積極的で、2017年には画面共有の機能がリリースされておりゲームに留まらない充実っぷり。テキストチャットのUIはSlackのそれとよく似ており、Slackユーザなら直観的に使えます。直近ではISUCONのサポート向けチャットとしても利用されたようで、活躍の場が広がっていることが実感できますね。

# 本題
ここから先は、Slackを使っている前提でお話しします。

## ユーザの扱い
Slackと違い、ユーザはチームに依存しません。チームが無くてもDiscordに利用を開始できます。
#### ニックネームだけで開始できる
開始にはメールアドレスすら不要ですが、ゲスト状態となりCookieに依存したアカウントになります。メールアドレス認証して本登録すると、他のデバイス・ブラウザからログインして使えるようになります。
#### ユーザIDの決定
Qiitaのように全体でユーザが一元管理されます。IDは「利用開始時に決めたニックネーム + ハッシュ値」で決定されます(ex: nickname#0123)。IDは後からでも変更できますが、ハッシュ値は変更することができません。

## チーム(=サーバー)の扱い
Slackでいうチームは「サーバー」という名称で流通しています。誰でも（ゲスト状態でも）自由にサーバーを作ることができます。グループでチャットを運用したいときはユーザ登録してサーバーを作りましょう。
なお、DiscordのUIは複数サーバーの参加を前提としたものになっているため、切り替えや通知の確認が簡単にできるようになっています。（左端にあるイカのアイコンでサーバーの切り替えができます）
![discord01.png](https://qiita-image-store.s3.amazonaws.com/0/126660/ea657c53-ca9c-2759-ced2-9ff1d688f9b6.png)


#### サーバーへの招待
サーバー管理メニューで招待URLを作成できます。これを経由してもらうだけでサーバーへの参加が完了します。Discordを初めて使う人を招待しても、ニックネームを決めるだけでサーバーに参加できるため非常に簡単ですね。QRコードを作成しておけば、スマートフォンでも簡単にお誘いできます。

## チャンネルの扱い
Slackに新たなユーザが加入したときは #general にだけ参加している状態ですね。Discordでは、特に参加操作をしなくても全てのチャンネルの読み書きができるようになっています！

#### チャンネル参加をユーザで絞りたい場合
ユーザに付帯した「役割」ごとにサーバーやチャンネルに関する権限を細かにコントロールすることができます！Slackと同じようなコントロールはできないものの、カバーできると思います。権限の説明は別の記事で説明する予定です。
なお、特に見たくないチャンネルについてはユーザがMuteかつ非表示設定にすることでチャンネルの存在自体をスルーできます。

## Discordで出来ないこと
Slackで出来るけど、Discordで出来ないなーと気づいたことを列挙します。
総じて、テキストの整理整頓が弱めという印象です。用途の違いがはっきりしています。

- 「スレッド」の機能はない
- Discordでは発言毎にURLが発行されないので、参照したり引用したりできない
  - お仕事的に使おうとすると地味にツライ
- 独自のemojiはサーバ毎に50個まで。Aliasは使えない
- emoji reaction が付いたときの通知が無い
- チャンネルのアーカイブはできない。消したら完全に消える
- チャンネルや発言のStar(お気に入り)ができない（ピン留めは可能）
- emoji reaction でのログ検索(has::reaction:)ができない
- チャットボットがやるようなインタラクティブなテキストは発言できない
- スラッシュコマンド(/giphy 的なやつ)の独自拡張はできない
- TwitterのURL展開は画像が一枚分しか出てこない
- 画像の折り畳み（表示・非表示の切り替え）ができない

## 逆にDiscordだと出来る！ということ
- ボイスチャンネル。テキストチャンネルと同じような感覚でボイスチャットができる
  - いわゆる通話ではないので「着信」という概念がなく、テキストからスムーズに音声に移れる
- チャンネルの並べ替えが自由にできる
- チャンネルをカテゴリごとに分類して整理できる
  - 個人での分類ではなく、メンバー全体に影響のあるカテゴリ分け
- 権限設定で Read Only なメンバーを作れる
- #general を削除できる

# 締め
Slackとは違った手軽さ、音声チャット機能を持ったDiscord、ぜひ一度使ってみてください！
明日は権限設定のプラクティスなんかを書く予定ですい。
社内技術書輪読会(英)を運営してきた試行錯誤まとめ5選

本記事は[Fringe81 アドベントカレンダー2017](https://qiita.com/advent-calendar/2017/fringe81)の1日目です。

初っ端なので、一般的な技術の話題ではなく、社内で取り組んできたネタにしてみようと思います。

突然ですがエンジニアの皆さん、技術書読んでいますでしょうか？
英語の技術書、読んでいますでしょうか？

自分自身、特に英語の技術書は買ったものの途中でくじけるということが何度かあったため、もはや自分の意志の力に頼ることを諦め社内の仲間を募って運営サイドに回ることで技術書読みを達成するようにしております。

ただし、いざ運営してみると色々と課題にぶつかり何度か消滅の危機に遭遇しました^^;
それでも危機を乗り越えながら過去数冊の技術書輪読を実施してきましたのでその間の色々と試行錯誤してきた中から効果が大きかったと思われるものを5つほど選びまとめてみました。
これから始めてみようという人に少しでも役に立つものになれば幸いです。


# その１：いつでも抜けていいという前提にする
「いつでも輪読会に参加してくださいね」はよく言っていたのですが、一方で一度参加した人は抜けられない雰囲気を作ってしまっていたかもしれません。
**有志の勉強会なので、息苦しい雰囲気は避けるべきです。**
面白そうと思って参加したものの思っていた内容と違うかったとか、興味が他に移ったということは普通の話なのでいつでも抜けていい雰囲気を作るためにも、定期的に発言するようにしています。

# その２：最少催行人数を決める
当初、最少催行人数を決めていなかったせいで欠席者が出た際、「今日は無し・・・ですかね？」みたいなやり取りが何度もありました。
なるべく皆でやりたかったのでスキップしていたところ、4回連続でスキップになったことも。そうなると久々にやる時に「え？やるの？」みたいになってて気づいたら輪読会が瀕死の状態に。

そこで途中から最少催行人数を設定することにし、自分たちは2名と決めました。
皆で読み進めることよりも **参加できる人が少しでもいる限りは前に進めて習慣化した状態を維持する** ことが重要だと気づくことが出来ました。
来ない人がいるから進められませんでした、みたいなのも雰囲気が重くなりますよね。気楽にいきましょう♪

# その３：事前に読んでくる
英語の本を集まってから訳して読むというのはかなりの時間がかかってしまい進捗が悪くなることは予想に難くないと思います。
また、輪読会にありがちかもしれませんが当初は一文一文翻訳した内容をまわし読むというスタイルにしていましたが、英訳の難しい文章に出くわすと英文法の話などで脱線しがちでした。
進捗が悪いとダラダラ感が出たりこのペースだと2年かかるぞ、、といった怪しい雰囲気になってきます。

そこで、 **輪読会はお昼休みの1hで終える。1hでそこそこの進捗が出るよう参加者は決めた範囲を事前に読んでくる。** としました。

参加者の英語力などに大きく依存すると思いますが、おおよそ1回あたり1〜3セクション、ページ数でいうと15〜20頁くらいが自分たちの目安となっています。

ここはちょっとだけ頑張ります。
...としたのですが、やはり頑張るスタイルはなかなかうまくはいきませんでした。その４につづきます。

# その４：輪読会から読解会スタイルへの進化
1〜3セクション、15頁の範囲目標があるとして、最初から逐次的にしっかりきっちり訳しながら進めると、かなり時間をかけた割に4頁くらいしか読めてない、という状態で当日を迎えるということが自分も含め他の人でも何度もありました。

そこでやったことは **輪読会当日は一文一文翻訳した内容をまわし読むのはやめよう。確認するのはセクションごとの「要はここで言いたいことは何だったのか？という要点をおさえることにしよう** という割り切りです。
よって、正確には輪読会というよりは読解会と呼んだ方が正しいような会となりました。

このように目的を変えたことで事前の読み方にも変化・工夫が出てきました。
時間をかけずに要点をおさえにかかるためには、思い切って読み捨てる部分としっかり読む部分のメリハリをつけることが重要です。
案外、技術書というのは論文のAbstract、Conclusionに相当する構成になっている事が多く、セクションの最初と最後と文中の太字の部分を読むだけで要約終わり、ということも少なくありません。
また、たとえば1回目は結構雑に構成の把握に努めるような読み方で15頁を一気に疾走し、2回目以降で重要そうなところに当たりをつけて辞書を引きながら深掘りをする、一方で捨てると決めたところは大胆に捨てるという読み方も効果的です。
なお、これは自分たちで勝手にネーミングを付けたのですが、最初からきっちり逐次的に読み進めるスタイルの読書を **ウォーターフォール・リーディング** と呼び、3回くらいまわして理解するような読み方を **アジャイル・リーディング、イテレーティブ・リーディング** と名付けました。

余談ながら御存知の通り、Google翻訳の精度がハンパないのでこんなことせずにガシガシ翻訳にかけるのももちろんありです。
一応、自分の場合は英文であっても自力で素早く要点掴めるようになりたいので英語の勉強も兼ねてアジャイル・リーディングスタイルで読んでいますが、疲れ気味の時は思いっきりgoogle先生に頼っています^^;

# その5： 開催頻度は毎週開催
開催頻度は毎週？ それとも2週間ごと？ 一ヶ月周期？
選択肢は色々ありますが、毎週開催に落ち着きました。
というのも、 **間をどれだけあけても「事前に読んでくる」を実践するのは前日という人がほとんどだったからですw**
間隔が長くなるとその分忘れて思い出しに時間がかかってしまうため特に良いことはないと気づきました。
習慣化という観点でも毎週のほうが身体に馴染みやすいと感じます。
なお土日に読むという人もある一定数いるので週の前半、月曜日か火曜日開催がオススメです。

# おわりに
いかがでしたでしょうか。
試行錯誤してきたことは一言で言えばなるべく無理のない範囲で続くような仕組み作りに取り組むということに尽きると思います。

さて、次は何の技術書を読もうかな〜。
git初心者 チートシート

# git初心者
<details><summary>gitとは</summary>
ディレクトリレベルでファイルを管理するツールです。
コーディングで変更して細かく保存していけば過去のデータに全て戻れる。
さらにブランチといって複数の形に分岐することも可能。
また、複数の人とディレクトリごと共有して開発できるため
チーム開発の効率が非常に上がる優れもの
またgithubからディレクトリごと環境をもらうこともできる。
最近では、特に無くてはならない存在。</details>

最初は、わからなくてもコマンドを打って実際に使って見るとわかってくる。
gitを使うのであれば、シェルは、bashではなくzshなどをオススメする。
zshは、gitのブランチの位置や最新のファイルの状態かどうかを教えてくれる。

## コマンド
インストール(debian系)

```
$ sudo apt install git
```

作業ディレクトリに移動して初期設定
{}の中身は、自分で決める

```
$ cd testwork
$ git init
$ git config --global user.name "{user name}"
$ git config --global user.email "{user name@mail.addr.com}"
```
### gitの基本

```
$ git add .
$ git commit -m "〇〇"
```
or

```
$ git commit -am "xxxx"
```
'git commit -a'は'add .'と同じ意味

ステータス確認

```
$ git status
```

ブランチ確認

```
$ git branch
```

ログ確認

```
$ git log
```

差分を確認

```
$ git diff
```

remote登録

```
$ git remote add origin {http://xxxx}
```

push

```
$ git push origin master
```

clone作成
{repository url}は自分が欲しいクローンのurlを指定

```
$ git clone {repository url}
```

pull

```
$ git pull origin master
```
[メモ]: keybaseとgit/githubでgpg keyを共有する

作業の備忘録です。


### 1. gpgとkeybaseをインストール

```
brew install gpg
brew cask install keybase
```

作成済みのkeybase accountにログインしている必要がある。 `keybase status` で状態を確認し、ログインしていなければ `keybase login` でログイン

keybaseのコマンドラインツールは機能が豊富で、チャットやグループの作成はもちろんのこと、暗号化gitやpgp準拠の署名などがわかりやすくできるので良い感じ(`gpg`コマンドでも同じことができるのだが、レガシー感バリバリで昔困惑した覚えがある。ようやく使いやすいものが来てくれたかという気持ち)

### 2. keybase.io上にGPG keyを作成

```
keybase pgp gen --multi
```

keybase accountに紐づいたkey pairの作成だけでなく、自動でローカルのgpg keyringに鍵を登録してくれるので、あとは通常のgpg × githubの登録手続きをすれば良い。

`--multi` は同アカウントに二つ目以降のgpg keyを追加する場合に必要。
Keybase.ioのサーバー上に秘密鍵のコピーを保持するかを聞かれるが、保持する場合は絶対にpass phraseで暗号化すること。

### 3. 全てのcommitに署名をするようにgitを設定

[git公式](https://help.github.com/articles/telling-git-about-your-gpg-key/)を参照

```
gpg --list-secret-keys # 作成したkeyがgpg keyringに(mail addressに紐づいて)登録されていることを確認
```

keyの暗号方式(この場合はRSA4096なので4096Rと表示される)の横にIDが出るので、以下のコマンドで登録

```
git config --global user.signingkey 3AA5C34371567BD2 # 3AA5C34371567BD2がIDとする
git config --global commit.gpgsign true # -Sオプションをつけなくても常に署名
```

### 4. githubに登録

```
keybase pgp export -q <keyID> | pbcopy 
```
で公開鍵をコピーし
[githubのkey登録ページ](DA98EA12CF93D08C)から登録
Perl6を学ぶ時に参考になるページ 2017

こんにちは、Perl 6アドベントカレンダーの一日目の投稿になります。

去年のアドベントカレンダーでも [Perl6を学ぶ時に参考になるページ 2016](https://qiita.com/titsuki/items/549ac95b8c37feb1dee1) という投稿がありました。

基本的なやつは去年のをみてもらうとして、今回は2017年になって充実してきたコンテンツだけ適当な順番で紹介していきたいと思います。

# [StackOverflow](https://stackoverflow.com/tags/perl6/info)

+ 質問回答があると、その週の[Weekly changes in and around Perl 6](https://p6weekly.wordpress.com)で紹介されます。
+ [初めてのPerl](https://www.amazon.co.jp/初めてのPerl-第6版-Randal-L-Schwartz/dp/4873115671)の著者として有名な、あの[Brian_d_foy](https://en.wikipedia.org/wiki/Brian_d_foy)氏もよく利用されているみたいです。
+ コアの開発メンバーがちゃんとチェックしているので、困ったときは使ってみましょう。

# [The Perl Conference](https://www.youtube.com/channel/UCd9Fs_oZBMmTUWKJKuR_qdg)

+ Perlのyoutube動画チャンネルです
+ 例えば、"The Perl Conference in Amsterdam"の動画の一部を紹介すると:
  + ["Perl 6: Superglue for the 21st Century" - Brian Duggan](https://www.youtube.com/watch?v=q8stPrG1rDo)
     + タイトルの"superglue"からしてFFIとかそっち系の話題かなと思った人もいるかもしれません
     + そうじゃなくてgrammarでcsvをパースしたり、Proc::Asyncでログフィルターを作ってみたりとかそういう内容です
  + ["Rakudo.js - compiling Perl 6 to JavaScript‎" - Paweł Murias](https://www.youtube.com/watch?v=LN0mKjmraVs)
     + 作者によってBackendの一つであるRakudo.jsが紹介されています
     + [nqpのリポジトリ](https://github.com/perl6/nqp)においてあります。遊べます！
  + ["Functional Programming in Perl 6" - Laurent Rosenfeld](https://www.youtube.com/watch?v=bJ_zYJXTLWg)
     + 高階関数、ラムダ、クロージャー、カリー化 などをPerl6でどんな感じで書いたらよいかなどが紹介されています
        + (恥ずかしながら[assumingメソッド](https://docs.perl6.org/routine/assuming)を初めて知りました)
     + ちなみにLaurent Rosenfeld氏といえばThink Perl 6の著者です
         + Think Perl 6はオープンソースになっています: https://github.com/AllenDowney/ThinkPerl6
         + pdfを読むこともできます: http://greenteapress.com/wp/think-perl-6/

# [Book](https://perl6book.com)

+ 今年はとても多くの参考書が出ました。10冊ぐらい出てます。
+ 多くは電子書籍なので日本からでも簡単に購入することができます

# オンラインジャッジ

## [exercism](http://exercism.io/languages/perl6/about)

+ エクササイズの問題がいくつか用意されています。
   + GoogleCodeJamみたいな感じで、入力データと問題文が用意されています
   + ただし、ジャッジは手元で行います

## [code-golf.io](https://code-golf.io)

+ Perl6を使ってコードゴルフができる、オンラインジャッジのサイトです
+ オープンソースになってます: https://github.com/JRaspass/code-golf

## [AtCoder](https://atcoder.jp)

+ 国内企業が運営している、オンラインジャッジのサービスです
+ 一応Perl6にも対応しています
+ ただし、RakudoStar-2016.01と結構古いバージョンが入っているので、最近のPerl6よりかなり実行時間が遅くなるかもしれません

以上、一日目の投稿でした。
Rails MWS APIを利用するまでの事前準備

# MWSとは
AmazonマーケットプレイスWebサービスの略です。
自分が販売をしているAmazon各プラットフォーム対して以下のようなことができます。

- レポートの取得
- 出品や商品情報の更新削除などができるフィードのサブミット
- 商品情報の取得
- などなど

詳しくは[公式リファレンス](http://docs.developer.amazonservices.com/ja_JP/dev_guide/DG_IfNew.html)を読みましょう。
結構色々なことができます:raised_hand:

# MWSを利用するのに必要な情報
## 開発者ではない場合（複数セラーを扱わない場合）
MWSを利用するには以下の3つのキーが必要です。

- Seller ID（出品者ID）
- AWS Access Key ID（AWSアクセスキーID）
- Secret Key（秘密キー）

取得方法は以下の記事を参照にしてください。
[amazonのMWSアカウント情報はセラーセントラルから確認できるんですけど](http://eiking.asia/article/2017/11/6929/)

## 開発者の場合（複数セラーを扱う場合）
弊社のWebアプリケーション[lismoa](https://lismoa.com/)の様に複数のセラーの情報を扱う場合には上記の3つの他に

- MWS Auth Token（MWS認証トークン）

が必要になります。

アプリ開発者のDeveloper ID（開発者ID）とセラーのアカウントを紐付けてAuthTokenを取得します。
[公式リファレンス](http://docs.developer.amazonservices.com/ja_JP/dev_guide/DG_Developing.html)に紐付ける方法は記載されていますが、正直分かり辛いと思います。
百聞は一見にしかずです:rolling_eyes:
黙って一回自分自身を紐付けて見ましょう。
https://sellercentral.amazon.co.jp/gp/mws/registration/register.html

# Railsで簡単にMWSを使えるgem「peddler」を導入する
MWSを生で扱うのはPOSTリクエストを魔改造する必要があり、かなりハードルが高いです:alien:
peddlerというgemを使いましょう。便利ですので:v:
https://github.com/hakanensari/peddler
導入方法はREADMEにある通りいつもの感じです。

APIリファレンスはこちら
http://www.rubydoc.info/gems/peddler/toplevel

# client作成のサンプル
peddlerではAPI Sectionごとにclientというオブジェクトを作成してsection以下の機能を利用するという流れになります。
API Sectionというのはこのレイヤーですね。

<img width="364" alt="85ef34ab-f24d-e17e-5b86-da6422b38d0e.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/7f0b9998-1e24-72a1-dd6d-e52e227035d9.png">
<img width="1429" alt="48bffedd-0149-7097-1001-026cdc34f4ba.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/eb61324a-62eb-3ee4-766f-a38f3433f2a5.png">


今回は「商品（Products）」のclientを作成するサンプルです。
先ほど取得した複数のキー使用します。

```rb
@client = MWS.products(
  primary_marketplace_id: 'marketplace_id',
  aws_access_key_id: 'aws_access_key_id',
  aws_secret_access_key: 'aws_secret_access_key',
  merchant_id: 'seller_id',
  auth_token: 'auth_token' # 開発者ではない場合は不要
)
```
# 準備完了
これでMWSの多彩な機能を使う準備は完了です！
今後はその多彩な機能の紹介や注意点などを記事にしていこうと考えていますのでお楽しみに:kiss:
Scientific LinuxのインストールUSBの作り方

使用するのはcentOSの既に入っているPC、USBメモリー

インストール用のDVDisoをダウンロードしてくる
http://ftp1.scientificlinux.org/linux/scientific/7.4/x86_64/iso/SL-7.4-Install-Dual-Layer-DVD-x86_64.iso

USBメモリーのマウント場所を確認（今回は/dev/sdd）

ターミナルを開いて
livecd-iso-to-disk --format --reset-mbr SL-7.4-Install-Dual-Layer-DVD-x86_64.iso /dev/sdd

と したかったのだが、livecdをyumで入れられなかったのでGUIをつかって
アプリ→ユーティリティー→ディスク
でUSBメモリーに「ディスクイメージのリストア」を用いて
直接書き込んだ
FreePascal で一番短い FizzBuzz

# FizzBuzz コード

### 追記 (2020/08/03)
Delphi 10.3 Rio から使えるインライン変数宣言で更に短く！
123 バイト

```pascal
begin for var i:=1to 100do Writeln(TArray<Variant>.Create(i,'Fizz','Buzz','FizzBuzz')[Ord(i mod 3=0)+Ord(i mod 5=0)*2])end.
```

### 追記 (12/7 14:00)
より短いコードができてしまいました…！
134 バイト

```pascal
uses Variants;var i:Word;begin for i:=1to 100do Writeln(VarArrayOf([i,'Fizz','Buzz','FizzBuzz'])[Ord(i mod 3=0)+Ord(i mod 5=0)*2])end.
```

[Ideone での実行はこちらから](https://ideone.com/v0CEyV)

## 一番短いコード

恐らくこれ以上短くすることは出来ないと思います。
138 バイト！

```pascal
var i:Word;S:Variant;begin for i:=1to 100do begin S:=Copy('Fizz',i mod 3*9,4)+Copy('Buzz',i mod 5*9,4);if S=''then S:=i;Writeln(S)end;end.
```
[Ideone での実行はこちらから](https://ideone.com/gcnZcY)

## 清書

```pascal
var 
  i: Word;
  S: Variant;
begin
  for i := 1 to 100 do 
  begin
    S := Copy('Fizz', i mod 3 * 9, 4) + Copy('Buzz', i mod 5 * 9, 4);
    if S = '' then 
      S:=i;

    Writeln(S)
  end;
end.
```

特におかしな書き方をしたわけではなく、ちょっと特殊なのは Variant を使ったくらい。

# まとめ
結局、Pascal の場合、めちゃくちゃ厳格だから普通に書くのが一番短いのだ…
colaboratory をつかってみる　CSVのファイルをアップロード

[colaboratory advent calendar](https://qiita.com/advent-calendar/2017/colaboratory) １日目です。日本では使っている人あまりいないみたいですが、使い方によっては便利です。

[colaboratory](https://colab.research.google.com/) 　は、google が提供するjupyter の動作環境です。

さくっと使えて便利なのですが、なんと、すぐに初期化されてしまいます。データを保存しておいて、使えると便利なのでこんなことしています。ファイルをローカルからアップロードしてみたのですが、時間がかかってお話になりませんでした。そこで、dropbox などにおいてあるデータを、wget でとってきて使うのはどうかなと思ったら、苦痛なくできたので紹介します。

dropbox などで、wgetできるように設定したファイルを用意しておいて、下記実行です。
ただそれだけです。

```
! wget https://dl.dropbox.com/s/8y6mqy817jltc4j/year_1988_2016.csv
```
公開鍵暗号

今回はブロックチェーンを支える暗号技術、**公開鍵暗号**について紹介します。
できる限り「Short & Simple」を心がけます。
なお、私もブロックチェーン初学者なので、内容に誤り等ありましたらご指摘いただけると幸いです。

## そもそも暗号技術の目的は？
現代における暗号技術には以下のような目的がある。

- 文書へのアクセス権を特定の人に限定する
- 文書の内容を改ざんされていないことを保証する
- 文書の作成者の署名を検証し証明する
- 文書がある時点に存在した事実を証明する
- 文書に記された内容を否認できないようにする

## 公開鍵暗号はどのような暗号技術か

- 「秘密鍵」と「公開鍵」の２種類の鍵を生成して、文書を暗号化する方式
- 「公開鍵」は「秘密鍵」から一意に生成される
- 公開鍵は通信相手に公開しても安全とされている
- 「公開鍵」を用いて暗号化した文書は「秘密鍵」を持ってのみ復号化できる
- 代表的な暗号方式として「RSA」「楕円曲線暗号（ECDSA）」などがある（ブロックチェーンではECDSAがよく使われている）

## ブロックチェーンでの応用

### 署名
仮想通貨の場合、「公開鍵」は通貨を受け取るために使われ、「秘密鍵」は通貨を支払うためのトランザクションに署名するのに使われる。
例えば、ビットコインの所有者がビットコインを使う時、自分の公開鍵と署名（秘密鍵から生成される。生成するごとに署名は異なる。）をトランザクションに記載する。
ビットコインネットワークのすべての参加者は、この公開鍵と署名が示されていることで、トランザクションを検証し、有効なものとして受け入れることができる。

### ウォレットアドレス
ウォレットアドレスは、「公開鍵」から一方向性ハッシュ関数を用いて生成される。
*※「ウォレット」については別途記事を書こうと思います*


## 秘密鍵と公開鍵
### 秘密鍵
秘密鍵は無作為に選ばれる数値。**秘密鍵を所有していることは、ウォレットアドレスに結びついた資金を所有していることと同義である。**
上述した通り、秘密鍵は署名の生成に用いられ、この署名は資金を使うときにその資金を所有していることを証明するのに必要となる。


### 公開鍵
公開鍵は、楕円曲線上のスカラー倍算を使って**秘密鍵から生成（計算）される**。なお、この逆の計算（公開鍵から秘密鍵を計算）は、現在の技術では事実上不可能（離散対数問題）。
ちなみに量子コンピュータが実用化されれば公開鍵暗号は役に立たなくなる（公開鍵から秘密鍵を求められるようになる）と考えられているが、そうなるのは２０年以上先と言われている。（でも２０年先て意外と近い未来な気もする。。。）


---
ということで、今回はブロックチェーンを支える暗号技術、「公開鍵暗号」について書いてみました。
個人的にしっくりきていない（ブロックチェーンにおける公開鍵暗号の使われ方の理解・説明が十分でない気がする）ので、
引き続き勉強して記事を追記・修正していきたいと思います。

## 参考文献

- [いちばんやさしいブロックチェーンの教本](https://www.amazon.co.jp/いちばんやさしいブロックチェーンの教本-人気講師が教えるビットコインを支える仕組み-「いちばんやさしい教本」シリーズ-杉井靖典-ebook/dp/B075CFG2TY/ref=sr_1_1?ie=UTF8&qid=1511787155&sr=8-1&keywords=いちばんやさしいブロックチェーンの教本)
- [Mastering Bitcoin](https://www.amazon.co.jp/ビットコインとブロックチェーン-アンドレアス・Ｍ・アントノプロス-ebook/dp/B072JJL66R/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1511787188&sr=1-2&keywords=mastering+bitcoin)
- [ブロックチェーンのセキュリティに必要不可欠な鍵「秘密鍵・公開鍵」](http://gaiax-blockchain.com/key#i)
- [ブロックチェーンを支える技術「公開鍵暗号方式」とは](http://businessblockchain.org/what-is-public-key-cryptography)
[WIP] iOSのカテゴリー（エクステンション）について

# はじめに

　あるクラスのメソッドはそのインスタンス変数を使ってできる事、つまり実行責務を表現したものである。必要な時に実装すれば良いアプリケーションはともかく、不特定多数で使われるメソッド(=API)はどんなのが必要か想定して実装せざる得ない。[実装パターン](https://www.amazon.co.jp/dp/4894712873 "実装")によると、それは９０％の利用者の事情を想定して定義される。残りの１０％はアプリケーション固有の物であり、全てを組み込むとなると膨大な量になるためだ。これより、アプリケーション製作者は足らないAPIを独自に実装せざる得ない。

　Objective-CのカテゴリーおよびSwiftのエクステンションはこの問題を解決するためのものである。具体的にはアプリーケーションの需要に応じてカテゴリーメソッドを実装する。この言語機能の名に記す通り、対象システム応じてクラスを振る舞いを追加/拡張するものである。

# 設計/実装のコツ
カテゴリー（エクステンション）はクラスの振る舞いをあるアプリ、レイヤー向けに拡張するというための機構であり、便利関数を実装するところではない。

## レイヤーを意識する。
例えば、ViewControllerのレイヤー、Modelのレイヤー、Viewのレイヤー向けに提供するカテゴリーを一つのヘッダーに入れない事。レイヤー間の結合度が複雑になる。

## インターフェース分離の法則を意識する。
これも先程の理由の裏返し。

## Categoryとかエクステンションとかいうフォルダを作ってそこに入れない。
これも先程の理由の裏返しです。

## プレフィックスはつけた方が良い。
名前が衝突してビルドできない。Objective-Cの場合、意図しないメソッドを上書きする。

# 実例
作業中

# 最後に
有用であり、Objective-Cの元となったSmalltalk等、３０年以上前から実現されている言語機構であるが、実際に有効に活用しているケースはほとんどなく、Utilityクラスとして実装されている場合が多い。これらはカテゴリー（エクステンション）として意識的に実装した方がクラスの実行責務をしっかりと意識できる。とりわけSwiftの場合はプロトコルと組み合わせる事で強力な制御機構を実現できる。