OmniAICreator/Qiita-1.07M huggingface dataset:
MacBook Pro 2016 + Sierra で MiSTEL Barocco キーボード

MiSTEL Barocco キーボードを買った。今日届いた。

肩こりを軽減する為に以下の２つを試すことにしたので。

- 目線を水平にする( 画面を見下ろさない )
  - ノートの画面だとどうしても見下ろすので、首に負担がかかる。これは外部ディスプレイを使うことで対処

- 肩(胸)を開いてキーボードを打つ
  - これは左右分離型キーボードで対処で、これが Barocco を買った理由。
  - Barocco は左右分離型 でまあまあの値段( バカ高くはない ) だったので買った。

## 自分の環境

MacBook Pro 13-inch Late 2016
macOS Sierra, Version 10.12

## 買う前の不安

- Mac Sierra でやってうまくいくのか？ Karabiner 使えないけど大丈夫かな。
- cmd キーはどうなってんの？ cmd キー多用するのでいい感じの場所にしたい。
- ファームウェアは Windows でしかアップデートできないのか。。。やだな。Windows 持ってないし。

## 買ったもの

Barocco MD600 の赤軸。赤軸は一番キータッチが軽く、静かだと [ここ](https://www.diatec.co.jp/products/CHERRY/) に書いてあったので。

MiSTEL BAROCCO MD600 分離式 メカニカルキーボード 英語配列 62キー CHERRY 赤軸 PBTキーキャップ ブラック MD600-RUSPLGAA1

### 設定の戦略

- MD600 自体のキーボードマクロの設定は必要最低限にする。( あとは Karabiner Element でやる )
- Karabiner Element で設定
- MacOS のキーボードの Modifier 設定は使わない( Karabiner と両方やると訳が分からなくなるので )

## 結論

設定自体はまあまあいけた。
良さそう。
あとは慣れられるかどうか。

## やったこと

変更点の概要

![Photo_2017-02-25_22_57_38.jpg](https://qiita-image-store.s3.amazonaws.com/0/30758/ee03d03b-8931-b31b-fa26-385f03ebf45f.jpeg)


### MD600 のキーボードマクロ設定

- 左下 Ctrl キーを Fn( barocco の Fn ) に
  - Barocco の Fn は Barocco で色々やるためのキーで、MacBook Pro 自体についてる Fn とは違う。
  - Barocco は 単独のファンクションキーが無く、F10 とか打つにはこの Fn と数字キーの同時押しで打つ。
- 左上 Esc を ``` ` ``` キーに
  - デフォルトだと Fn + Esc で ``` ` ```が打てるが、これは我慢ならん. ``` ` ``` は Modifier 無しの単独キーで入力したい。
  - cmd + ``` ` ``` で "同じアプリの別 Window へ切り替え" に慣れているというのもある。
- 左スペースキーを Esc キーに
  - Esc をバッククォートにリマップしたせいで、が直接入力できなくなったので。
  - スペースは右親指で押すので。この大きな左スペースがまるまる空いている。これがうまくハマるかは今後様子見。

### Karabiner element

<img width="800" alt="2017_02_26_0_35.png" src="https://qiita-image-store.s3.amazonaws.com/0/30758/9fedde4a-284f-68f8-5c2f-32d588dc886c.png">

<img width="800" alt="2017_02_26_0_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/30758/63152f97-c0bb-dda1-db23-42740ccc99a5.png">

- Simple Modification タブ
  - left_option to left_command
  - left_command to left_option
  - caps_lock to left_control

- Function Keys タブ
  - Use all F1, F2, etc, keys as standard function keys をチェック。

### 試したけどやめたこと

- ~~左側スペースを cmd キーにしてみたがやめた~~
  - Good: 親指で無理せず押せる距離感は良かった。
  - Bad: 元々スペースキーなのでこのキーのサイズが大きく、スコッ と押せない(全体が垂直に押下されない)。これが、cmd キーを押している感覚になれない。( Modifier キーとして、このサイズのキーは合わない )

結局、慣れることが出来たので、左スペースを cmd キーとして使っている。

### 感想など

- Karabiner Element に付属の Karabiner-EventViewer でキーのリアクションを確認しながらやった。とても助かった。
  - 試行錯誤で設定したキーマクロをクリアした時にちゃんと元に戻ってるか等を確認するのに使った。
- トラックパッドに慣れてたから、クラムシェルモードにするとマウス使わないといけなくて慣れない。
- ノートのキーボードだと肩をすぼめてしまうが、分離式は確かに肩(胸)を開いて打てる。これは狙い通り！確かに楽だ。いい姿勢になれる。
- キーボードの音は静かな赤軸を買ったが、MacBookPro のキーボードよりも断然うるさい。
  - MacBookPro のキーボードが鈍い小さなクコクコクコという音だとすると、MD600 は軽いぱちゃぱちゃ とした音。
  - だだ、かなり軽いタッチで打てるので、底打ちしない打ち方に慣れれば、指への負担もかなり軽くなるだろう。
- 1, 2, 3, 4, 5 と左手で連続して打っているとき、6 を左手人差し指で打とうとして **踏み外す** ことが頻発している。6 は右側キーボードにあるので。これはいままで無かった感覚。
- トラックパッドが真ん中にあるのに慣れていたから、キーボードの間の机の表面をスワイプしてしまって自分で笑ってしまうことがあった。アホっぽい。
紙のページをめくるような動き

## 概要
- クリックすると紙の書類をめくるようにページを送る
- 実際の書類を読むときのように、初期配置と送ったページでz-indexを反転させる
- jQuery使用
- クリックしたときのページの重なり順など改善予定

## デモ
[http://codepen.io/viscosenpai/pen/bqNvdy](http://codepen.io/viscosenpai/pen/bqNvdy)

## コード
```html:index.html
<div id="wrapper">
  <section class="page">
    <h1>Title-1</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ad totam dolores voluptatem sint voluptate saepe qui? At quas rerum magnam iusto, illum. Vel quidem nisi eum ipsam quae blanditiis.</p>
  </section>
  <section class="page">
    <h1>Title-2</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ad totam dolores voluptatem sint voluptate saepe qui? At quas rerum magnam iusto, illum. Vel quidem nisi eum ipsam quae blanditiis.</p>
  </section>
  <section class="page">
    <h1>Title-3</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ad totam dolores voluptatem sint voluptate saepe qui? At quas rerum magnam iusto, illum. Vel quidem nisi eum ipsam quae blanditiis.</p>
  </section>
  <section class="page">
    <h1>Title-4</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ad totam dolores voluptatem sint voluptate saepe qui? At quas rerum magnam iusto, illum. Vel quidem nisi eum ipsam quae blanditiis.</p>
  </section>
  <section class="page">
    <h1>Title-5</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ad totam dolores voluptatem sint voluptate saepe qui? At quas rerum magnam iusto, illum. Vel quidem nisi eum ipsam quae blanditiis.</p>
  </section>
</div>
```

```css:style.css
#wrapper {
  width: 100%;
  height: 100vh;
  position: relative;
  z-index: 0;
}
.page {
  background: #fff;
  border: 1px solid #ccc;
  padding: 15px;
  position: absolute;
  width: 50%;
  height: 100vh;
  top: 0;
  left: 50%;
  transition: left .3s linear;
}
.read {
  left: 0;
  z-index: 1;
}
```

```javascript:script.js
var pages = $('.page');
var pageNum = pages.length;
var readPage = 0;
pages.each(function(i) {
  $(this).css('z-index', pageNum - i);
});
pages.on('click', function() {
  $(this).toggleClass('read');
  if ($(this).hasClass('read')) {
    $(this).css('z-index', $('.read').length);
  } else {
    $(this).css('z-index', pageNum - $('.read').length);
  }
});
```


## 最後に
もうちょっと工夫します。
anacondaで作成した環境からjupyter notebookを使う

# まとめ

```bash
conda create -n xxx python=3.6 jupyter
source activate xxx
conda install -c conda-forge tensorflow yapf
conda install pillow
pip install environment-kernels
jupyte notebook --generate-config
```

`~/.jupyter/jupyter_notebook_config.py`を編集する。

```text
# ここは書き換える
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
# ここは追加
c.EnvironmentKernelSpecManager.env_dirs=['~/anaconda/envs']
```

`jupyte notebook`で立ち上げてからNew->Notebookで好きな環境を選ぶ。以上。
【Laravelメモ①】ルーティング第一歩

# 概要
- Laravelインストール後、ルーティングの簡単な設定を行う
- 前提：サーバ起動すると、`http://localhost:8000` でLaravelのwelcomeページが表示される

# メモ

以下の下段を追加。

```C:\[pjDirectory]\routes\web.php
Route::get('/', function () {
    return view('welcome');
});

Route::get('hoge', function () {
   return "hoge";
});
```

http://localhost:8000/hoge
でhogeが表示される
（`php artisan serve` 等でサーバを起動しておくこと）
Basic Operators - Ternary Conditional Operator


*三項演算子 ternary conditional operator* は、`question ? answer1 : answer2` という構成で成り立っている。
動作としては、`question` の結果が真ならば `answer1` の値を返す、偽ならば `answer2` の値を返す。

例：

```swift
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight は 90 になる。
```
USB版のWindows10をBootcampにインストールする方法

USB版Windows10 Proを購入してBootcampで使おうとしたのですが、BootcampアシスタントではISOファイルしか選べないので、やり方を調べてみました。

#手順（というか結論）

1.MicrosoftのサイトからWin10のisoファイルをダウンロードする
2.Bootcampアシスタントに従ってインストール
3.Windowsが起動したら、パッケージに同梱されたプロダクトキーで認証する

##Win10のisoファイルをダウンロードする手順
・[Windows10のダウンロードページ](https://www.microsoft.com/ja-jp/software-download/windows10ISO)にアクセスします

・エディションは通常の「Windows10」を選択します
<img width="1145" alt="スクリーンショット 2017-02-25 16.41.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/87709/cf0efd9b-aceb-8725-4a8f-6bb2a9285fb1.png">

・言語を選択すると、ダウンロードリンクが表示されるので、希望するビット数のOSを選択します。
※ちなみに、HomeもProも一体化されたISOファイルでダウンロードされます。

せっかくUSB版買ったのに使わず仕舞いでした・・・。
冗長な代入文 - 良いコード書くきっかけを与えたい。4[C#リファクタリングサンプル]

#冗長な代入文
プロジェクトによっては縦持ちのテーブルで設計するべきなのに、正規化されず横持ちになっていることがある。
例えば、親子の情報を登録する場合、両親がいて、子供が一人いる場合、人コードを振って、
{子供コード, 父親コード}, {子供コード,母親コード}
という形式でテーブルに登録するべきである。
しかし、なんらかの理由で
{子供コード,父親コード,母親コード}
と１レコードで表現したい場合がある。

ここでは、テーブルの形式ではなく、画面で子供と親のコードを登録するコードがどうなるかを考えたい。

##ソースコード
子供と親コード１、親コード２を入力して、登録する画面を考える。その場合、登録ボタンクリック処理は以下のようなコードを良く見かける。

```csharp
        /** 登録ボタンクリック **/
        private void buttonRegist_Click(object sender, EventArgs e)
        {
            // 画面からの値をDTOに代入する。
            // 空文字やスペースはNULLとして登録する。
            var dto = new Company();
            if (string.IsNullOrWhiteSpace(textBoxChildCode.Text))
            {
                dto.ChildCode = null;
            }
            else
            {
                dto.ChildCode = textBoxChildCode.Text.Trim();
            }

            if (string.IsNullOrWhiteSpace(textBoxParentCode1.Text))
            {
                dto.ParentCode1 = null;
            }
            else
            {
                dto.ParentCode1 = textBoxParentCode1.Text.Trim();
            }

            if (string.IsNullOrWhiteSpace(textBoxParentCode2.Text))
            {
                dto.ParentCode2 = null;
            }
            else
            {
                dto.ParentCode2 = textBoxParentCode2.Text.Trim();
            }

            // DB登録処理は省略
        }

    /** DTO **/
    public class Company
    {
        public string ChildCode { get; set; }
        public string ParentCode1 { get; set; }
        public string ParentCode2 { get; set; }
    }
```

##気になること
空文字やスペースをNULLとして扱う部分が冗長なため、コードが長い。
この部分をルーチン化すれば、可読性があがる。

```csharp
        private void buttonRegist_Click(object sender, EventArgs e)
        {
            // 画面からの値をDTOに代入する。
            // 空文字やスペースはNULLとして登録する。
            var dto = new Company();
            dto.ChildCode = GetDBValue(textBoxChildCode.Text);
            dto.ParentCode1 = GetDBValue(textBoxParentCode1.Text);
            dto.ParentCode2 = GetDBValue(textBoxParentCode2.Text);

            // DB登録処理は省略
        }

        /** 同じ処理はルーチンにする。 **/
        private string GetDBValue(string inputValue)
        {
            if (string.IsNullOrWhiteSpace(inputValue))
            {
                return null;
            }
            else
            {
                return inputValue.Trim();
            }
        }

```

###まとめ
冗長だからルーチン化できるのではないか、ということを考えてほしい。
それほど難しいことではないと思うものの、意外と思いつかないものらしい。
ちなみに、似たようなコードを書く人にルーチン化したコードを教えたところ「思いつかなかった」とのことだった。
また、同じ処理を何回も書いているという意味ではレガシーコードと言えるかもしれない。

[前の記事(流れるようなインターフェースの使い方はこれで正しいのか？)]
(http://qiita.com/csharpisthebest/items/403d40374acc70ef24e3)

[次の記事(コレクションに対する無駄な処理)]
(http://qiita.com/csharpisthebest/items/7a9177a2a27002579b03)


[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
とあるクラスのスーパークラスとインターフェイスを再帰的に取得したい


プログラム設計書を書く――というかソースコードからプログラム設計書を起こす機会があったのですが、その設計書が「作成したJavaクラスに親クラス名すべてと実装しているインターフェイスすべてを併記しなさい」というものでした。これを馬鹿正直に手で作るのは面倒。そこで__「クラス名から親クラスとインターフェイスを再帰的に求める」__というプログラムを書くことにしました。以下はそのサンプルになります。

```java


import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        // クラス名からクラスオブジェクトを生成する。
        Class<?> pivotClass = Class.forName("java.util.ArrayList");
        
        // スーパークラスを再帰的にたどる。
        List<Class<?>> classes = new ArrayList<>();
        Class<?> superClass = pivotClass;
        while (superClass != null) {
            classes.add(superClass);
            superClass = superClass.getSuperclass();
        }
        
        // 再帰的に取得したスーパークラスの一覧を取得する。
        for (Class<?> clazz : classes) {
            System.out.println(clazz.getName());
        }
        /*　java.util.ArrayList
          　java.util.AbstractList
          　java.util.AbstractCollection
            java.lang.Object */        
        
        // 実装しているインターフェイスの一覧を取得&出力する。
        Class<?>[] interfaces = pivotClass.getInterfaces();
        for (Class<?> interfaze : interfaces) {
            System.out.println(interfaze.getName());
        }
        /* java.util.List
           java.util.RandomAccess
           java.lang.Cloneable
           java.io.Serializable */
    }
}

```

「クラスそのものがクラスとして扱える」というのは少し奇妙ですが、慣れると便利ですね。メタプログラミング万歳(´・ω・｀)
dockerでいらないimage,container,networkを一括削除する

【20170705追記】
全ての停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドは下記です。

```
docker system prune 
```
https://docs.docker.com/engine/reference/commandline/system_prune/

## 環境
docker version 1.13.1

## 使っていないimageの一括削除
存在しているimageを確認する
`docker images`

使われていないimageを一括削除する
`docker image prune`

もう一度`docker images`で確認すると、不要なimageが削除されています。

## 使っていないcontainerの一括削除
起動しているcontainerを確認する
`docker ps`

起動していないものも含め全てのcontainerを確認する
`docker ps -a`

使われていないcontainerを一括削除する
`docker container prune`

もう一度`docker ps -a`で確認すると、不要なcontainerが削除されて`docker ps`した時と同じになっているはずです。

## 使っていないnetworkの一括削除
存在しているnetworkを確認する
`docker network list`

使われていないnetworkを一括削除する
`docker network prune`

もう一度`docker network list`で確認すると、不要なnetworkが削除されています。


## 【追記】
停止しているimage,container,networkを一括削除するため、以下のようなwarninagが出ます。

```
docker image prune
WARNING! This will remove all stopped images.
Are you sure you want to continue? [y/N]

訳：このコマンドは全ての停止しているimage(container,networkも同様)を削除します。
本当に続けますか？
```
`y`を選択すると、削除が実行されます。

意図的に停止していて残しておきたいimage,container,networkも一括削除されるため、起動はしていないが残しておきたいimage,container,networkがある場合は、pruneは使わずに個別に指定して削除するようにします。
Spring Batchで区切り文字を変える with DelimitedLineTokenizer

# Spring Batchで区切り文字を変える with DelimitedLineTokenizer
Spring Batchの[Getting Startedのサンプル](https://spring.io/guides/gs/batch-processing/)を試して、読み込むダンプファイルの区切り文字を変更したくて調べました。ググって一発でヒットしなかったので、ブログネタではありますがQiitaにも投稿しておきます。

## DelimitedLineTokenizerのコンストラクタに引数として区切り文字を渡す
これだけです。
[DelimitedLineTokenizer API](http://docs.spring.io/spring-batch/trunk/apidocs/index.html)にあるように、デフォルトコンストラクタは、カンマ区切りとなります。
カンマ以外で区切り場合は、コンストラクタに区切り文字を渡します。

>public DelimitedLineTokenizer()
>Create a new instance of the DelimitedLineTokenizer class for the common case where the delimiter is a comma.

>public DelimitedLineTokenizer(java.lang.String delimiter)
>Create a new instance of the DelimitedLineTokenizer class.

## サンプル

```
reader.setLineMapper(new DefaultLineMapper() {
  {
    this.setLineTokenizer(new DelimitedLineTokenizer("\t") {
      {
        setNames(new String[] {"firstName", "lastName"});
      }
    });
    setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
      {
        setTargetType(Person.class);
      }
    });
  }
});
```

これでタブ区切りのファイルもちゃんと読み込めました。その他の部分は上記公式サンプルを参照願います。
CentOS 7.3 インストール後の設定メモ　その1

# お知らせ
VMWare Tools インストール編は長くなりそうなので別記事にします 2017.2.26

# 概要
OSインストール後のちょっとした設定変更のまとめ
折角なのでGUIでなるべくやってみます。

# 感想
6系はほとんどCUIで使っていたのでそれほど使い込んではいないのですが結構変わったなーという印象です。

# 手順
## ネットワークを有効にする
OSインストール後、再起動の度にネットワーク接続がOFFになるようなので自動接続に変更する。
1. スタートメニューからシステムツールを選択して設定をクリック
![screenshot_03.png](https://qiita-image-store.s3.amazonaws.com/0/167523/6b970e24-739d-304a-c3e1-9c51cf9c858d.png)
2. ネットワークをクリック
![screenshot_04.png](https://qiita-image-store.s3.amazonaws.com/0/167523/b185bc74-8d27-82b6-47df-2d7108a74412.png)
3. 右上のOFFをONに変更して右下のアイコンをクリック
![screenshot_06.png](https://qiita-image-store.s3.amazonaws.com/0/167523/b2e6b225-43be-69a0-5a7a-c4ab245d3315.png)
4. Identity内の自動接続のチェックを入れる
![screenshot_07.png](https://qiita-image-store.s3.amazonaws.com/0/167523/f0272f1b-9007-cdf2-ca24-85a179cc1db4.png)
5. OSを再起動してネットワークが有効になっていることを確認する

## 時計を合わせる
NTPサーバのアドレスを入れる場所がないけど、どこに合わせにいっているのだろう( •̀ㅁ•́;)
1. 画面上部の時計をクリック、日時の設定をクリック
![screenshot_01.png](https://qiita-image-store.s3.amazonaws.com/0/167523/e2090a8e-d60d-5f9d-e392-09f6f54ad0ec.png)
2. ロック解除を押下しrootのパスワードを入力し自動日時設定をOFF→ONに変更
![screenshot_02.png](https://qiita-image-store.s3.amazonaws.com/0/167523/56a252b6-2e93-0bfd-d1d4-a04210957668.png)
ES6 重複する値を持つ２次元配列をユニークな１次元配列にする書き方


### 前提:ES6

こんなふうに重複するユーザオブジェクトを持つ２次元配列

```javascript
let groups = [
    {users:[
      {userId:1},
      {userId:2},
    ]},
    {users:[
      {userId:2},
      {userId:3},
    ]},
];
```

`reduce`で2次元配列から1次元配列に変換

```javascript
let array1 = groups.reduce((a, b) => [...a.users,...b.users]);
console.log(array1);
// [
//   {userId:1},
//   {userId:2},
//   {userId:2},
//   {userId:3},
// ]
```

`Object`の配列から整数の配列に変換

```javascript
let array2 = array1.map( (user) => user.userId );
console.log(array2);
// [1, 2, 2, 3]
```

`Set`を使って重複する値を取り除く

```javascript
let unique = [...new Set(array2)]; 
console.log(unique);
// [1, 2, 3]
```

メソッドチェーンでつなげて1行で書くと、ぱっと見、何をやってるのかわからん

```javascript
let unique = [...new Set(groups.reduce((a, b) => [...a.users,...b.users]).map( (user) => user.userId ))]; 
console.log(unique);
// [1, 2, 3]
```

### 素朴な書き方
こうした方がわかりやすいという説もある

```javascript
let userIdList = [];
groups.forEach((group) => {
  group.users.forEach((user) => {
    userIdList.push(user.userId);
  });
});
let unique = Array.from(new Set(userIdList));
console.log(unique);
// [1, 2, 3]
```

### 参考
[unique values in an array](http://stackoverflow.com/questions/1960473/unique-values-in-an-array)
[Array.prototype.reduce()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
iOS の時間関数の精度

[Optimized C++](https://www.oreilly.co.jp/books/9784873117928/) で色々ある Windows の時刻取得関数の精度を測っているのを見て iOS の時刻取得関数を測ってみました。通常、Swift で時間を扱う時には Date/NSDate を使いますが、iOS ではこのほかに UNIX 由来の C の関数を使って時刻を取得できます。

Java や C# と違ってラッパーコードを書かずに C 言語の関数を直接呼べるのは Swift のいいところですね。

# time()

1970/1/1 00:00:00 からの経過秒数を取得します。Swift から呼ぶとこんな感じです。

```swift
let t = Double(time(nil))
```

仕様により精度は 1 秒です。

# getimeofday()

1970/1/1 00:00:00 からの経過秒数をマイクロ秒の精度で取得します。

```swift
var tv = timeval() // これは関数呼び出しではなくイニシャライザ
gettimeofday(&tv, nil)
let t = Double(tv.tv_sec) + Double(tv.tv_usec) / 1000000.0
```

# clock_gettime()

この関数は実時間、プロセスの CPU 時間、スレッドの CPU 時間など取得する時間の種類を指定できます。性能計測のため実時間を取得するならこのようになります。UNIX では古くからある関数ですが、iOS で使えるようになったのは iOS10 からです。

```swift
var tp = timespec() // これもイニシャライザ
clock_gettime(_CLOCK_REALTIME, &tp)
let t = Double(tp.tv_sec) + Double(tp.tv_nsec) / 1000000000.0
```

# clock_gettime_nsec_np()

clock_gettime() の結果を 64bit 整数として取得できます。

```swift
let t = Double(clock_gettime_nsec_np(_CLOCK_REALTIME)) / 1000000000.0
```

# mach_absolute_time()

CPU のタイムスタンプカウンタ(CPU が一定周期でインクリメントするレジスタ)の値を取得します。他より高精度です。

```swift
var tb = mach_timebase_info() // イニシャライザ
mach_timebase_info(&tb) // こっちは関数呼び出し
let tsc = mach_absolute_time()
let t = Double(tsc) * Double(tb.numer) / Double(tb.denom) / 1000000000.0
```

精度は CPU 依存なので定数を掛けたり割ったりしても秒に変換できません。まず、`mach_timebase_info()` でタイムスタンプカウンタの値をナノ秒に変換するための値を取得して変換します。

iOS の生い立ちを感じさせる名前ですね。

# Date/NSDate

これは説明不要ですね。Swift 標準の時刻を表す型です。

`gettimeofday()` にシンボリックブレークポイントを設定して `Date` の引数なしイニシャライザを呼んでみるとそのブレークポイントにヒットします。`Date` は `gettimeofday()` で実装されていることがわかります。したがって同じ精度を持ちます。

# 実測

Optimized C++ での測り方で各関数の精度を測ってみました。環境は iPhone 6s、iOS 10.2.1、Xcode 8.2.1 です。

| 関数/型                 |精度   |
|:-----------------------|------|
| time()                 |1.00s |
| gettimeofday()         |1.01μs|
| clock_gettime()        |1.00μs|
| clock_gettime_nsec_np()|1.01μs|
| mach_absolute_time()   |41.7ns|
| Date                   |1.09μs|

`time()` は仕様通り 1s、`mach_absolute_time()` は圧倒的に高精度で、あとはだいたい 1μs という結果になりました。`clock_gettime()`, `clock_gettime_nsec_np()` は 1ns の精度を持っていそうな型名、関数名をしていますが、少なくとも今の iOS の実装では違うようです。

また iPad Mini 4 で測ってみると `mach_absolute_time()` は 76.7ns であとはだいたい一緒でした。

通常のプログラムの実行時間計測では 1ms の精度があれば十分なので使いやすい `Date` を使えばよく、本当に精度が必要な時だけ `mach_absolute_time()` を使えばよさそうです。

計測に使ったコードは https://github.com/yamoridon/TimeResolution に置いておきますね。
SimpleDelegator で Decolator パターンを実装する

SimpleDelegator で Decolator パターンを実装します。
SimpleDelegator についてはるりまを参照ください。
Decolator パターンについてはWikipediaを参照ください。

* [class SimpleDelegator - るりま](https://docs.ruby-lang.org/ja/2.4.0/class/SimpleDelegator.html)
* [「Decorator_パターン」 『フリー百科事典　ウィキペディア日本語版』- 2014年6月11日 (水) 10:10](https://ja.wikipedia.org/wiki/Decorator_パターン)

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
人間のフルネームを表示するプログラムを作ります。
フルネームを表示には以下のパターンがあります。

|種類|表示|
|---|---|
|日本人|姓 名|
|日本人疑問形|姓 名?|
|日本人まとめ記事タイトル風|【fullname】姓 名|
|米国人|名 姓|
|米国人疑問形|名 姓?|
|米国人まとめ記事タイトル風|【fullname】名 姓|

これを Decolator パターンで実装します。
（つっこみどころはきにしない）

### <i class="fa fa-code" style="font-size:1em;"></i> コード
```ruby
require 'delegate'

class Person
  attr_reader :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name, @last_name = first_name, last_name
  end
end

class JapaneseDecorator < SimpleDelegator
  def fullname
    "#{last_name} #{first_name}"
  end
end

class AmericanDecorator < SimpleDelegator
  def fullname
    "#{first_name} #{last_name}"
  end
end

class QuestionDecorator < SimpleDelegator
  def fullname
    "#{super}?"
  end
end

class MatomeTitleDecorator < SimpleDelegator
  def fullname
    "【fullname】#{super}"
  end
end

person = Person.new('Joe', 'Hogashi')

puts person.first_name
puts person.last_name

puts AmericanDecorator.new(person).fullname
puts JapaneseDecorator.new(person).fullname
puts QuestionDecorator.new(AmericanDecorator.new(person)).fullname
puts QuestionDecorator.new(JapaneseDecorator.new(person)).fullname
puts MatomeTitleDecorator.new(AmericanDecorator.new(person)).fullname
puts MatomeTitleDecorator.new(JapaneseDecorator.new(person)).fullname
puts MatomeTitleDecorator.new(QuestionDecorator.new(AmericanDecorator.new(person))).fullname
puts MatomeTitleDecorator.new(QuestionDecorator.new(JapaneseDecorator.new(person))).fullname
```

### <i class="fa fa-terminal" style="font-size:1em;"></i> 実行結果
```
Joe
Hogashi
Joe Hogashi
Hogashi Joe
Joe Hogashi?
Hogashi Joe?
【fullname】Joe Hogashi
【fullname】Hogashi Joe
【fullname】Joe Hogashi?
【fullname】Hogashi Joe?
```
oh-my-zshのテーマ設定でつまづいたこと


やっとターミナルになれ、そろそろ色々拡張しようと思いiTerm2を設定、合わせてbashをzshにした。さらにカラフルなテーマに憧れていたのでoh-my-zshを利用し、下記画像のようなpowertrainの導入へ！
この素晴らしいthemeは[bullet-train](https://github.com/caiogondim/bullet-train.zsh)

![スクリーンショット 2017-02-25 22.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/114396/14d56aa8-9df8-cd35-3ba3-d9d2db67f4bc.png "スクリーンショット 2017-02-25 22.07.26.png")



しかし、、
文字化けで肝心のトレインが形成されず、、


![スクリーンショット 2017-02-25 22.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/114396/2eb45825-7ca3-688b-a3f0-f39e6d5fd074.png "スクリーンショット 2017-02-25 22.21.18.png")



なぜだーーーー

#解決策
テーマのreadmeに書いてある通りpowertrain用のフォントをインストールして、それをitermに設定。それでOK！でした。
powertrain用フォントは[こちら](https://github.com/powerline/fonts)からダウンロードしました。

![スクリーンショット 2017-02-25 22.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/114396/640d32a7-5bd4-056e-b57a-33c9ac26c2e4.png "スクリーンショット 2017-02-25 22.15.26.png")


###補足
あと、もうひとつつまづいたのが.zshrcの設定について。

```
BULLETTRAIN_TIME_BG
```
というオプションがあるとしてそれを設定する場合は、

```
BULLETTRAIN_TIME_BG = 'yellow'
```

といれるのではなく

```
BULLETTRAIN_TIME_BG=yellow
```
といれなくてはエラーになるので注意。（ただ自分が無知なだけかも)
PocketAPIメモ - アプリの認可まで

Pocket Authentication API Documentation

- https://getpocket.com/developer/docs/authentication


## 前提

自作アプリの登録手順は割愛。コンシューマキー取得状態からスタート。


## リクエストトークンの取得

```js
const ck = '1234-abcd1234abcd1234abcd1234'
const ru = 'pocketapp1234://authorizationFinished'
```

```js
fetch('https://getpocket.com/v3/oauth/request', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    'X-Accept': 'application/json',
  },
  body: JSON.stringify({
    consumer_key: ck,
    redirect_uri: ru,
  })
}).then((response) => {
  response.json().then(function(d){
    console.log('[Request Token]', d.code)
    console.log('[Auth URL]', `https://getpocket.com/auth/authorize?request_token=${d.code}&redirect_uri=${ru}`)
  })
})
//=> [Request Token] dcba4321-dcba-4321-dcba-4321dc
//=> [Auth URL] https://getpocket.com/auth/authorize?request_token=dcba4321-dcba-4321-dcba-4321dc&redirect_uri=pocketapp1234://authorizationFinished
```

- レスポンスには `code` と表記されるが、これがリクエストトークンのことである
- 最新１トークンのみが有効っぽい


## 第三者アプリケーションの認可ページ

```
https://getpocket.com/auth/authorize?request_token=dcba4321-dcba-4321-dcba-4321dc&redirect_uri=pocketapp1234:authorizationFinished
```

- Pocket側に登録されているアプリをユーザが __認可__ するためのページ
- ブラウザで開けばOK
- ユーザが認可ボタンを押したあとにリダイレクトする先を指定する
- この例のようにリダイレクト先をカスタムURLスキームにしてもセーフ
    - ブラウザで認可するとリダイレクトできないが、Pocketサーバには伝わっている（後述）
- すでに認可済みの場合は即リダイレクトされる
    - ブラウザでアクセスすると空っぽの画面となるが、Pocketサーバには伝わっている

### :point_up:認可プロセスの挙動について補足

__ユーザが認可ボタンを押しただけでは、アプリの認可リストには登録されない。__この時点では、Pocketサーバ側でアプリの認可“待ち”の状態になる。
アプリ側はリダイレクトで戻ってきたあと下記の authorize メソッドにさっき渡したリクエストトークンを再度渡して認可を確定する。逆に、ユーザが「認可」ボタンではなく「結構です」ボタンを押すと、Pocketサーバ側でアプリが認可“待ち”とならず、authorize メソッドを実行してもエラーとなる。


### アプリの認可

```js
fetch('https://getpocket.com/v3/oauth/authorize', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    'X-Accept': 'application/json',
  },
  body: JSON.stringify({
    consumer_key: '1234-abcd1234abcd1234abcd1234',
    code: 'dcba4321-dcba-4321-dcba-4321dc',
  })
}).then((response) => {
  response.json().then(function(d){
    console.log(d)
  })
})
//=> {"access_token":"5678defg-5678-defg-5678-defg56", "username":"pocketuser"}
```

- アクセストークンは認可操作をし直すと以前のものが無効となる
[Node]声優ラジオサイト「音泉」APIモジュール[改良版]

# はじめに
結構前に「[[Node]音泉の非公開APIをモジュール化した](http://qiita.com/yuki540/items/e539ad70a66b8a9be24d)」という記事を書いたんですが、それの改良版を作ったので公開します。
元サイトは、[http://www.onsen.ag/](http://www.onsen.ag/)です。

## インストール
```
npm install onsen-node
```
パッケージを公開しているので、```npm install```でインストールできます。

## メソッド
- getList
  - 番組一覧（曜日ごと）の取得
- getInfo 
  - 番組情報の取得
- getLink
  - 音声・動画リンクの取得
- search
  - 番組の検索
- getRecommends
  - レコメンドの取得
- getRecommendMovie
  - おすすめの番組の取得
- getRecommendGoods
  - おすすめの商品の取得
- getTopics
  - トピックの取得

## 使い方
```coffeescript
onsen = require 'onsen-node'

##
# 番組一覧の取得
##
onsen.getList (list) ->
	if list isnt null
		console.log list

##
# 番組情報の取得
##
onsen.getInfo '番組名', (info) ->
	if info isnt null
		console.log info

##
# 音声・動画リンクの取得
## 
onsen.getLink '番組名', (link) ->
	if link isnt null
		console.log link

##
# 番組の検索
##
onsen.search '検索ワード', (list) ->
	if list isnt null
		console.log list

##
# レコメンドの取得
##
onsen.getRecommends (list) ->
	if list isnt null
		console.log list

##
# おすすめの番組の取得
##
onsen.getRecommendMovie (list) ->
	if list isnt null
		console.log list

##
# おすすめの商品の取得
##
onsen.getRecommendGoods (list) ->
	if list isnt null
		console.log list

##
# おすすめの番組の取得
##
onsen.getRecommendTopics (list) ->
	if list isnt null
		console.log list
```

## CLI
CLIにも対応したのでよかったら使ってください。
### インストール
```
sudo npm install -g onsen-node
```

#### ヘルプ
```
onsen -h
onsen -help
```

#### 番組一覧（曜日ごと）
``` 
onsen list
onsen list 今日
onsen list 火
```
<img width="524" alt="list.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/90bb18cb-8424-16cc-510a-b47f3c5b82f4.png">


#### 番組の検索
```
onsen search 検索ワード
```
<img width="534" alt="search.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/c881031f-d2ea-d285-548f-6e85e5169acc.png">


#### 音声・動画のダウンロード
```
onsen download 番組名
```
<img width="782" alt="download.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/48c28260-8272-0fe6-62b9-d9bd2d9aa0c2.png">


#### 番組情報
```
onsen info 番組名
```
<img width="631" alt="info.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/3177e917-8d49-2168-0b6d-eecf1a248f1c.png">

## さいごに
GitHubにあげてるのでよかったらみてください。
[https://github.com/yuki540net/onsen-node](https://github.com/yuki540net/onsen-node)

PHP版も空いた時間に改良版を作ろうと思います。
あと、Python版もそのうち作ります。

## 追記
onsen-nodeを使って、「音泉」をダウンロードする拡張作りました。
インストールは[こちら](https://chrome.google.com/webstore/detail/%E9%9F%B3%E6%B3%89%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC/dhnkoigdmfellddkanelockblbanfldc)

GitHub: [https://github.com/yuki540net/onsen-downloader](https://github.com/yuki540net/onsen-downloader)
JetBrains系IDEのVCS機能を使ってgitのコミットメッセージのみ修正する方法

JebBrains系IDEに乗っているVCS機能では、何れかのファイルに変更が加えられていないとcommitができないので、
コミットメッセージのみを変更したい場合はRebaseを使わないといけない。

PyCharmの場合は、下記のような手順で行う（他のIDEもほぼ同じ）

1. メニューからVCS -> Git -> Rebase...を選択
1. Rebase branchウィンドウが開くので、そのままRebaseボタンをクリック
<img width="485" alt="ss01.png" src="https://qiita-image-store.s3.amazonaws.com/0/80589/af5021ea-73c7-dd9f-a343-616f4fb1af28.png">
1. 変更したいコミットのActionをrewordに変更し、Start Rebasingをクリック
<img width="588" alt="ss02.png" src="https://qiita-image-store.s3.amazonaws.com/0/80589/ecada8f8-5a19-1af0-3af4-b3eaf0f10070.png">
1. コミットコメント編集用のウィンドウが開くので、任意のメッセージに変更し、Resume Rebasingをクリック
<img width="714" alt="ss03.png" src="https://qiita-image-store.s3.amazonaws.com/0/80589/0aa662b5-efba-8d27-a953-070a49551eeb.png">
1. これでOK
<img width="739" alt="ss04.png" src="https://qiita-image-store.s3.amazonaws.com/0/80589/6fc768a8-4f35-ccb5-c9f5-38a9b43a352f.png">

ちなみに、直前のコミットのメッセージ変更くらいならコンソール開いて```git commit --amend```した方が手っ取り早いです。
OCamlの引数リスト内の型を明示的に指定してtraceする。

OCamlを学習中で引数のリストが明示的ではない時にtraceしても具体的な値が確認できず再帰のイメージがわかなかったので型を明示的にして確認したメモ。

```ocaml:merge.ml
(* merge : int list -> int list -> int list *)
let rec merge list1 list2 = match (list1, list2) with
  | ([], []) -> []
  | ([], first2 :: rest2) -> list2
  | (first1 :: rest1, []) -> list1
  | (first1 :: rest1, first2 :: rest2) ->
    if first1 < first2
    then first1 :: merge rest1 list2
    else first2 :: merge list1 rest2
```

- mergeを定義した段階でリストの中の型はどの型でもOKの「'a」になっている。
- traceしても&lt;poly&gt;になって何を渡しているかわからない。

```
# #use "merge.ml";;
val merge : 'a list -> 'a list -> 'a list = <fun>
# #trace merge;;
merge is now traced.
# merge [1; 3][2; 4];;
merge <-- [<poly>; <poly>]
merge --> <fun>
merge* <-- [<poly>; <poly>]
merge <-- [<poly>]
merge --> <fun>
merge* <-- [<poly>; <poly>]
merge <-- [<poly>]
merge --> <fun>
merge* <-- [<poly>]
merge <-- []
merge --> <fun>
merge* <-- [<poly>]
merge* --> [<poly>]
merge* --> [<poly>; <poly>]
merge* --> [<poly>; <poly>; <poly>]
merge* --> [<poly>; <poly>; <poly>; <poly>]
- : int list = [1; 2; 3; 4]
```

- リストには文字列も入れる。

```
# merge ["a"; "d"]["c"; "b"];;
merge <-- [<poly>; <poly>]
merge --> <fun>
merge* <-- [<poly>; <poly>]
merge <-- [<poly>]
merge --> <fun>
merge* <-- [<poly>; <poly>]
merge <-- [<poly>]
merge --> <fun>
merge* <-- [<poly>]
merge <-- [<poly>]
merge --> <fun>
merge* <-- []
merge* --> [<poly>]
merge* --> [<poly>; <poly>]
merge* --> [<poly>; <poly>; <poly>]
merge* --> [<poly>; <poly>; <poly>; <poly>]
- : string list = ["a"; "c"; "b"; "d"]

```

- 引数のリストの中を明示的にintにする。

```ocaml:merge.ml
(* merge : int list -> int list -> int list *)
let rec merge (list1:int list) (list2: int list) = match (list1, list2) with
  | ([], []) -> []
  | ([], first2 :: rest2) -> list2
  | (first1 :: rest1, []) -> list1
  | (first1 :: rest1, first2 :: rest2) ->
    if first1 < first2
    then first1 :: merge rest1 list2
    else first2 :: merge list1 rest2
```

- 具体的な値がtraceされるのでイメージしやすい。

```
# #use "merge.ml";;
val merge : int list -> int list -> int list = <fun>
# #trace merge;;
merge is now traced.
# merge [1; 3][2; 4];;
merge <-- [1; 3]
merge --> <fun>
merge* <-- [2; 4]
merge <-- [3]
merge --> <fun>
merge* <-- [2; 4]
merge <-- [3]
merge --> <fun>
merge* <-- [4]
merge <-- []
merge --> <fun>
merge* <-- [4]
merge* --> [4]
merge* --> [3; 4]
merge* --> [2; 3; 4]
merge* --> [1; 2; 3; 4]
- : int list = [1; 2; 3; 4]
```
Haskell GHCに、GitHubでPull Requestを送ることができます

【追記】(2019/1/20)
=====================

2019/1/20時点で、この記事の内容は古くなっています。
2018年末に、GHCへのパッチ送付手続きは、PhabricatorではなくGitLabを用いて行うように変更されました。

GHCへのパッチ送付についての新しい手順については、こちらを参照してください。
「[GHC(Haskell)の上流リポジトリ等がGitLabに移行しました](https://qiita.com/takenobu-hs/items/a2eeb327088bb1d2fe77#%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E9%80%81%E4%BB%98merge-request%E3%81%8A%E3%82%88%E3%81%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)」

なお今後も引き続き、ドキュメント修正などの軽いパッチの場合には、GitHubのPull Requestを用いることが可能です。

以下は、追記前のオリジナルの記事です。
（過去の情報として、この記事も削除しないで残しておきます。）



はじめに
=======

HaskellのコンパイラであるGHCについて、GitHubでのPull Requestの送信について、簡単に記載します。


GithubでのPull Request受付について
================================

2017年1月より、GHC開発では、GitHubを用いたPull Requestを受け付けるようになりました。
Redditでの関連情報はこちらです。「[GHC has begun to accept Pull Requests on Github](https://www.reddit.com/r/haskell/comments/5pumm3/ghc_has_begun_to_accept_pull_requests_on_github/)」

現在でも、標準的なpatchの送信手順は[Phabricator](https://ghc.haskell.org/trac/ghc/wiki/Phabricator)を用いたものです。
ですが、新しい人々の参加障壁を下げるために、GitHubによるPull Requestでもpatchを受付けるようになっています。
Pull Requestによるpatch送信後の手続きは、GHCのcommiter達が教えてくれます。


GitHubでのPull Request送信先について
==================================

GHCへのGitHubでのPull Requestの送信先は、以下のリポジトリになります。

  * https://github.com/ghc/ghc

なお、過去に送られたPull Requestは以下で表示できます。

  * https://github.com/ghc/ghc/pulls

上記ページで`Closed` のリンクをクリックすると、処理済みのPull Request一覧も表示されます。



補足
=========

### GitHubでのPull Request受付に関して行われた議論

GitHubでのPull Request受付に関しては、以下で主に議論が行われました。

- [Accept PRs on GitHub](https://github.com/ghc-proposals/ghc-proposals/pull/11)


### 従来方式の、標準的なpatchの送り方について

従来方式の、Phabricatorを用いたpatchの送り方については、こちらの公式情報が参考になります。

- https://ghc.haskell.org/trac/ghc/wiki/WorkingConventions/FixingBugs


### GHC開発の中でのGithub Pull Requestの位置づけ

GHC開発の中でのGithub Pull Requestの位置づけは、以下の資料もどうぞ。

- [GHC development flow](https://takenobu-hs.github.io/downloads/ghc_development_flow.pdf#page=11)


### オープン中のticketについて

patchを必要としているオープン中のticketの一例が、公式Webの以下にあります。
（ticketが無い案件についてのPull Requestも、もちろん可能です。）

- https://ghc.haskell.org/trac/ghc/wiki/Newcomers#Findingaticket

### 追記：

Phabricatorを用いてパッチを送付する手順については、以下の記事もどうぞ。

- [GHCへの変更提案とパッチ送付の手順例](https://haskell.jp/blog/posts/2018/ghc-proposal-and-patch.html)

以上です。
複数のファイルを cat する、ファイル名付きで。

# tail 使います

```zsh:こんな状況だとします
$ ls -l
total 72
-rw-r--r--  1 mochizuki  staff  14  2 25 16:04 hoge1.rb
-rw-r--r--  1 mochizuki  staff  17  2 25 16:05 hoge2.rb
-rw-r--r--  1 mochizuki  staff  20  2 25 16:05 hoge3.rb
-rw-r--r--  1 mochizuki  staff  27  2 25 16:06 hoge4.rb
-rw-r--r--  1 mochizuki  staff  73  2 25 17:00 omake.js
-rw-r--r--  1 mochizuki  staff  25  2 25 16:37 piyo1.js
-rw-r--r--  1 mochizuki  staff  28  2 25 16:39 piyo2.js
-rw-r--r--  1 mochizuki  staff  31  2 25 16:40 piyo3.js
-rw-r--r--  1 mochizuki  staff  38  2 25 16:40 piyo4.js
```

ここから、たとえば、`hoge${i}` の中身を全部眺めるとします。

```zsh:こんな仕上がりです
$ tail -n +1 hoge*
==> hoge1.rb <==
a = 1 + 2
p a

==> hoge2.rb <==
a = 1
  + 2
p a

==> hoge3.rb <==
a =
  1
  + 2
p a

==> hoge4.rb <==
a
  =
    1
    + 2
p a
```

# tail のマニュアル

`-n +1` はファイルの1行目から表示するというオプションです。

`man tail` を叩いて、マニュアルをよみます。



```yml:マニュアルの抜粋
DESCRIPTION
     The tail utility displays the contents of file or, by default, its standard input, to the standard output.

     The display begins at a byte, line or 512-byte block location in the input.  Numbers having a leading plus (`+') sign are
     relative to the beginning of the input, for example, ``-c +2'' starts the display at the second byte of the input.  Num-
     bers having a leading minus (`-') sign or no explicit sign are relative to the end of the input, for example, ``-n 2''
     displays the last two lines of the input.  The default starting location is ``-n 10'', or the last 10 lines of the input.
```

以上ありがとうございます。
sourcetreeでローカル上でgit管理されたプロジェクトをリモートに紐付ける手順

# 状況
- リモート上にbitbucketのリポジトリがすでに作成されている
- ローカル上にプロジェクトがある
- ローカル上にあるプロジェクトを、bitbucketにプッシュしたい

# 手順
## 1 ローカルのプロジェクトをgit管理する
コマンドで、対象のプロジェクトルートディレクトリで、

```
git init
```
でもいい。

そうではなく、sourcetreeを使う方法もある

- sourceTreeを起動し、この画面上に、プロジェクトのディレクトリをドラッグアンドドロップする
![スクリーンショット 2017-02-25 20.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/57455/0f75cd55-6b01-fd46-eff4-2efc9855a4ea.png)

![スクリーンショット 2017-02-25 20.27.57.png](https://qiita-image-store.s3.amazonaws.com/0/57455/9346b083-6f6e-6c88-d32b-a0639fc1133b.png)
- 保存先のパスなどが自動で入力される。
- git管理するのでチェックを入れる
- 今回、すでにリモートのリポジトリは存在しているため、チェックを外す
![スクリーンショット 2017-02-25 20.28.11.png](https://qiita-image-store.s3.amazonaws.com/0/57455/3262f9da-cc9f-c12d-7fbe-ba7dd08a3de8.png)

- ローカル上にgit管理されたローカルリポジトリ[testproject]が作成される

## 2 リモート上のリポジトリとローカルを紐付ける
-　ローカルリポジトリを開き、
![スクリーンショット 2017-02-25 20.28.22.png](https://qiita-image-store.s3.amazonaws.com/0/57455/2abb5b86-1972-57fd-f5ec-792b28e5b5c0.png)

- 右上にある歯車を押下する
![スクリーンショット 2017-02-25 20.28.32.png](https://qiita-image-store.s3.amazonaws.com/0/57455/75906c32-dbe0-76b3-36f0-53c67b5e5791.png)
- ロモートタブを押下し、追加を押下する

- 設定ダイアログが表示されるので、そこにBitBucketのuriを指定する

これで、このプロジェクトとbitbucketの紐付けができ、リモートへpushできるようになる
UserControl の後処理（Dispose）

# 概要
.NET Framework でコンポーネントを分離することのできる `UserControl` は、`Form` の `FormClosed`/`FormClosing` にあたるイベントがありません。

ただしスーパークラスの `Component` に `Disposed` イベントが実装されているので、これにイベントを追加する形で後処理を行います。

# サンプル

```SampleUserControl.cs
using System;
using System.Windows.Forms;

namespace Sample
{
    public partial class SampleUserControl: UserControl
    {
        // コンストラクタ
        public SampleUserControl()
        {
            InitializeComponent();
            
            /* 初期化処理など */
            
            this.Disposed += (sender, args) =>
            {
                //
                // ここに後処理を記述
                //
            };
        }
    }
}

```

# 注記
* `ControlRemoved`という、それっぽい名前のイベントがありましたが、フォームの終了時には呼ばれていないようでした。

# 参考
* http://stackoverflow.com/questions/167602/how-do-i-add-dispose-functionality-to-a-c-sharp-usercontrol
【しずおかアプリ部】活動ログ　第35回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)

##■タイトル##
第35回


##■開催日##
２０１７年２月25日（土）　１６：００～１８：００


##■参加者##
9名


##■活動内容（概要）##
・最近の話題の技術ニュース、告知
・菅原プレゼン「Dlibを触ってみた」
・部員さんプレゼン「Gitでバージョン管理～チェリーピック編」
・TEA BREAK
　　保坂報告「Resas応募完了」「モノリズムがテレビに出ます」


![IMG_7623.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/23cf0753-9006-5b7e-39a8-07ba8fc85c8c.jpeg)

##■活動内容（詳細）##

【実演・プレゼン】

**・最近の話題の技術ニュース、告知**
・[NintendoSwitchインディーズ開発者に開放](http://jp.gamesindustry.biz/article/1702/17021801/)
・[世界で話題のイモムシ型ロボット](http://ascii.jp/elem/000/001/232/1232681/)
・マリカー社、任天堂に訴えられる


<hr>

**・菅原プレゼン「Dlibを触ってみた」**

　　Dlibとは？
　　画像処理、機械学習などの機能をもったC++ライブラリ。

　　今回は顔認識機能にフォーカスを当て、Unityからの利用について紹介。
　　EnoxSoftwareさんが販売しているAssetを利用すると、
　　Unityから簡単にDlibにアクセスできるのでそれを利用。
　　まずは、サンプルプロジェクトを体験してもらった。
　　
　　やりたいこと
　　　スマホで
 　　・顔認識でリアルタイムで顔にメイクさせる
　　 ・アバター的な変身
　　 ・「目でか」「顔痩せ」機能の実装
　　を実現させたい

　　EnoxSoftwareさんのサンプルを参考にすれば、
　　機能的な部分での難しさはなさそう。

　　ただ、これをスマホで動かそうとすると、それなりに高速化が必要。
　　4案考えて、試してみた。
　　　A.カメラの解像度を下げる(ただし見た目が悪くなる)
　　　B.Aの代わりにDlibに渡す画像の解像度を下げる
　　　C.2フレームに1回のように、顔認識処理の回数を減らす
　　　D.カメラ画像のデータの扱いを工夫する

　　高速化の効果はあり。
　　さらなる高速化と、精度を犠牲にしないようにまだまだ戦いは続く。

　　資料：[第35回_プレゼン資料(～dlibを触ってみた～).pdf](http://monolizm.com/sab/pdf/第35回_プレゼン資料(～dlibを触ってみた～).pdf)

　　<img width="1467" alt="スクリーンショット 2017-02-25 19.24.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/88105/b1ce5574-c63a-4184-f4b2-939b5a8c7bea.png">

<hr>


**・部員さんプレゼン「Gitでバージョン管理～チェリーピック編」**

　　Gitでバージョン管理シリーズ、今回はチェリーピック編です。
　　■今回の目的
　　　任意のコミットを別のブランチに適用 (cherry-pick)
　　　過去のコミットや別のブランチのコミットを自分のブランチに適用できます。

　　つまり、
　　　別のブランチで作られた便利な機能をマスター側ですぐに利用したい
　　って時に、このチェリーピックを使えば簡単に実現できてしまうということ。

　　■補足
　　　同じ内容のコミットが適用される
　　　　・コミット内容が既に適用済みの場合、差分がないためコミットされません。
　　　　・差分がある箇所(行)のみ適用されます。
　　　　・差分の箇所に競合が起きる可能性もあります。
　　　手軽に色んな使い方がある
　　　　・必要なコミットを好きな順番で新しいブランチに取り出せる。
　　　　・新規ブランチにチェリーピックした後に「最後のコミットを上書き(amend)」で
　　　　　途中のコミットを修正したりできる。
　　　　　↓
　　　　インタラクティブなリベースという機能で実現できます。

　　資料：[第35回_プレゼン資料(～Gitでバージョン管理～チェリーピック編～).pdf](http://monolizm.com/sab/pdf/第35回_プレゼン資料(～Gitでバージョン管理～チェリーピック編～).pdf)

　　プロジェクト：[034_Gitでバージョン管理.zip](http://monolizm.com/sab/src/034_Gitでバージョン管理.zip)

![IMG_7621.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/595718d4-70aa-5733-3ea0-c18e007bbb53.jpeg)



<hr>


**・TEA BREAK**
　　保坂報告
　　　・Resas応募が無事完了しました
　　　　現在応募中なので、企画書や動画の情報は出せませんが、
　　　　Resasデータをゲームに活用するのは新しい試み。
　　　　審査に受かれば、3/26に六本木でプレゼン。

　　　・モノリズムがテレビに出ます
　　　　モノリズムが静岡第一テレビの取材を受けました。
　　　　キッズラボの紹介とゲームメーカーとしての紹介
　　　　2/28の16:56分からの「まるごと」で放映されます。

　　部員さんが登壇した「Shizuoka.py(pythonの勉強会)」の報告
　　　機械学習では写真を撮影して読み込ませるより、Unityなどで状況を再現してスクショした方が、
　　　圧倒的に効率が良いとのこと。
　　　「Shizuoka.py(pythonの勉強会)」の[プレゼン資料](https://connpass.com/event/33283/presentation/)

　　アプリ部のみんなで、話題になりそうな
　　　「世の中の役に立たないくだらないけど面白いモノ」
　　を作ろうかなどの話題で盛り上がりました。
忘れてしまうCSSの超基本

普段書かないので、あれどうやるんだっけと思ったときにメモしてます。

# margin プロパティの順番
```css
margin: 10px;                /*上下左右*/
margin: 10px 20px;           /*上下、左右*/
margin: 10px 20px 30px;      /*上、左右、下*/
margin: 10px 20px 30px 40px; /*上、右、下、左*/
```

# clearfix
```css
float: left;
```
などfloat指定された要素のみを子要素として持つ親要素は、そのサイズが計算されず、正しく表示されない。
そこで、以下のようにclearfix classに疑似要素を作って

```css
.clearfix::after {
  content: '';
  display: block;
  clear: both;
}
```
親要素に

```
<div class="clearfix">
  <div class="floating">I'm floating</div>
</div>
```
と指定することで、表示崩れを直せる。

# width, height にpaddingとborderも含める
デフォルトでは`box-sizing: content-box`となっていて、`width`の値が示すサイズはpadding, borderを含まない。`box-sizing: border-box`とすると、padding,borderを含んだサイズになる。

```css
width: 30%;
padding: 15px;
box-sizing: border-box;
```

# line-height に倍率だけ指定する
line-heightに倍率だけ指定すると、fontサイズに対する倍率で高さを指定することができる。

```css
font-size: 10px;
line-height: 1.5;
```

# 文字を上下の中心に配置する
`height`と`line-height`を同じにすることで、上下中央揃えにすることができる。
ただしこれは１行のものに有効。

```css
height: 30px;
line-height: 30px;
```

# marginの相殺
* 隣り合う要素のmarginは相殺される
* 子要素のmarginは親要素を突き抜ける

# 文字を省略して表示する

```css
text-overflow: ellipsis; /*...と省略する*/
white-space: nowrap;     /*改行を禁止する*/
overflow: hidden;        /*はみ出した部分は表示しない*/
```
怖い怖いクロスサイトスクリプティング(XSS)とサニタイジングの基本

# クロスサイトスクリプティング(XSS)とサニタイジングの基本

## クロスサイトスクリプティング(XSS)とは
* 動的なwebを作成する時に、入力画面が発生する。
* その入力画面（ form要素）に、JavaScriptやHTMLの文字列を埋め込んで、悪意のある動作をさせることである。

##　対策
* このようなクロスサイトスクリプティングを対策するためには、以下のHTML特殊文字をエスケープさせることが必要になる

``` 
「<」「>」「&」「"」「’」
```
* 上記の特殊文字はその名の通り、HTMLにとって特別な意味を持つ。
* なので、上記の特殊文字を特別な意味のない普通の文字列に変換する必要がある。
* このような、特殊文字を一般的な文字列に変換する処理をサニタイジングという。
（参考：http://www.weblio.jp/content/%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA）

### 具体的な置き換え
先ほどのHTMLにとって特別な意味を持つ記号を意味のない文字に置き換える<br>
以下が具体例<br>

```
 & --> &amp;
 < --> &lt;
 > --> &gt;
 " --> &quot;
 ' --> &#x27;
 / --> &#x2F;
```
(引用元)
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

### サニタイジングを行うタイミング
* HTMLを出力する直前にエスケープを行う
=>文字列を受け取った直後にエスケープすると、その文字列を使用して行う処理に異常が発生する可能性があるから


## 参考にさせていただいたサイト
http://viral-community.com/blog/xss-1835/
http://www.atmarkit.co.jp/ait/articles/0603/23/news119.html
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
http://codezine.jp/article/detail/9149?p=3
http://javatechnology.net/java/html-sanitizing/

※ ブログでも同一記事を投稿している
http://www.sekky0905.com/entry/2017/02/25/%E6%80%96%E3%81%84%E6%80%96%E3%81%84%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%28XSS%29%E3%81%A8%E3%82%B5%E3%83%8B%E3%82%BF
Raspberry PiでLOGITEC LAN-WH300NU2を使う

# 手順
1. LAN-WH300NU2のIDを調べる
2. modprobe起動用ファイル作成
3. ドライバ読み込みファイル作成
4. リブート
5. WiFi用設定ファイル編集
6. WiFi再起動

なお、**Raspberry Pi A+**で行いました。
構成は、**ラズパイ→USB HUB→無線キーボード・マウス+無線子機**です。

# 1. LAN-WH300NU2のIDを調べる

```shell-session
$ lsusb
Bus 001 Device 003: ID 0789:016d Logitec Corp.
$
````
Vender idが 0789
Product idが 016d
# 2. modprobe起動用ファイル作成

```shell-session
$ sudo vim /etc/udev/rules.d/drivers.rules
SUBSYSTEM="usb", ACTION="add", ATTR{idVendor}=="0789", ATTR{idProduct}=="016d",ATTR{type}="1", KERNEL=="wlan*" RUN+="/sbin/modprobe -qba 8192cu"
```
# 3. ドライバ読み込みファイル作成
```shell-session
$ sudo vim /etc/modprobe.d/drivers.conf
install 8192cu /sbin/modprobe --ignore-install 8192cu $CMDLINE_OPTS; /bin/echo "0789 016d" > /sys/bus/usb/drivers/rtl8192cu/new_id
```
# 4. リブート
```shell-session
$ reboot
```
# 5. WiFi用設定ファイル編集
dhcpの場合は下記のとおりです。

```shell-session
$ sudo vim /etc/network/interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp 
#iface wlan0 inet manual
  pre-up sh -c "sleep 5"
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

無線親機との接続設定をします。(WPAの場合）

```shell-session
$ sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
network={
	ssid="SSID"
	scan_ssid=1 #ステルスの場合
	psk="PSK"
	proto=RSN
	key_mgmt=WPA-PSK
}
```

# 6. WiFi再起動

```shell-session
$ sudo ifdown wlan0
$ sudo ifup wlan0
```


で私は出来ました。

REALTEK RTL8192CUを使っていて自動で認識されない子機はvendor idとproduct idの部分を変えれば、この手順で出来るとおもいます。
Javaの例外の種類と基本事項についてまとめてみた

# Javaの例外(エラー)
Javaを書く上で重要な例外処理
その例外処理を適切に行うためには、そもそもJavaにはどんな例外が存在するのか
何を処理すればいいのか
ということを抑えるのが大切だと思うので、Javaの例外について改めて調べてまとめてみた
本記事はコードは一切記述せず、Javaの例外についての基本的なことについてのみ記述する

# エラーの種類
エラーには3つの種類が存在する。
このうち例外処理を行う必要があるものは、実行時エラーのみである。

## 文法エラー(Syntax error)
* コンパイルでこけるエラー
例)スペルミスなど

## 実行時エラー(runtime error)
* 文法としては間違っていなく、コンパイルも通る
* コンパイルは通るが実行中に異常事態が発生し、プログラムの実行が強制終了する。<br>
=>この時のエラーを実行時エラーという（実行している途中で発生しているエラーなので）
例）nullを処理しようとした、配列の存在しないインデックスにアクセスしたなど

## 論理エラー(logic error)
* コンパイルも実行もできるが、期待していた値と別の値が返ってくるなどのエラー
* 作成したコードのロジックが間違っていたということ

## そもそも例外とは?
* 実行時エラーは、「プログラム実行中に発生した想定外の事象」によって引き起こされる<br>
=>この想定外の事象が「例外」である<br>


## じゃあ例外処理って?
* 「プログラム実行中に発生した想定外の事象」である例外を処理（ハンドリング）することが例外処理（エラーハンドリング）である

## チェックするべき例外としなくてよい例外
* チェックするべき例外を「チェック例外」、チェックしなくてもよい例外を「非チェック例外」と呼ぶ
* 例外処理（エラーハンドリング）を記述すべき例外は、このチェック例外である

## 例外の種類
例外は大きく分けて以下の3つなる
1. Error系 : 回復する見込みがない例外
2. Exception系: 回復可能な対策を打つべき例外
3. RutimeException系 : 絶対に対策を打つべきというわけではない例外

このうち、処理すべき例外（チェック例外）は、Exception系例外のみである

## チェック例外（検査例外）
* 実行時エラーの中で、回復の見込みがある例外で、その例外が発生することを考慮して対処方法を備えておく必要がある例外
* つまり、プログラマは実行時エラー && Exception系例外のものだけ例外処理（エラーハンドリング）するべき
* このチェック例外（検査例外）はあらかじめ、コード中で例外処理（よくcatchすると言われている行為）をしないとコンパイルエラーになる

## 非チェック例外（非検査例外）
* 上記のチェック例外以外の例外
* プログラマが特に処理する必要はない例外


## 参考にさせていただいたサイト
http://qiita.com/yuya_presto/items/3b651d6b0cf38f77e933
http://qiita.com/kata/items/bd129ba6113a61126389
http://qiita.com/yuba/items/d41290eca726559cd743

## 参考文献
中山 清喬、 国本 大悟　(2011/10/7)『スッキリわかるJava入門』 インプレスジャパン

※ ブログでも同一記事を投稿している
http://www.sekky0905.com/
Sublime Text 3のコメントカラーを調整しよう

#Sublime Text 3のコメントカラーを調整しよう
こんにちは。Rockowpolisです。
今回は大人気テキストエディタである、**Sublime Text 3**にてコメントカラーを自分流に変更する方法を解説していこうと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/ece3cc4e-3cb2-698e-0137-92b2187d3fc8.png)

Windows向けの解説とはなりますが、基本を理解すればMacでも同様の結果を得ることは可能だと思います。
初登校ですが、淫夢要素はありません。
では、はじめていきましょう。

##変更を加えたいカラースキームを決める
コメントのカラーは ``` .tmtheme ```拡張子のファイルに定義されています。
**Sublime Text 3**ではこのようなパーツごとの色を設定したものを**カラースキーム**と呼びますので、本記事でもカラースキームという言葉を使わせていただきます。

Sublime Text 3では**Monokai**がデフォルトのカラースキームであったと思うので、__Monokaiベースで話を進めていきます__がお好きなものをお選びください。

![decide_theme.png](https://qiita-image-store.s3.amazonaws.com/0/129639/cb79f454-2bec-14a4-16a3-3f7c1a5938aa.png)

ただし、この記事は
```C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\User\Color Highlighter\themes```
にあるカラースキームファイルの編集のみを対象にしておりますので、最初から入っているカラースキームのうちいくつかは編集できないというものもあります。
その場合は**Package Controll**やその他ウェブサイト上からファイルを入手する必要があります。

##カラースキームの設定ファイルを探す
基本的には、
```:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\User\Color Highlighter\themes```
にいくつかカラースキームファイルが入っています。
編集可能な対象ファイルは```tmTheme```という拡張子のものになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/1d888b3d-a2ea-9a52-0114-084389d54c8a.png)

対象ファイルの存在を確認したら、バックアップとしてファイルを複製しておきましょう。
User-オリジナルファイル名.tmThemeなどとしておくとわかりやすいと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/6de4506f-9ed6-5018-6618-7c5e4ef91f62.png)


ここで注意していただきたいのが、**複製せずにオリジナルファイルを開いて直接編集すると、うまく編集できない**場合があるので必ず複製してから作業しましょう。

##カラースキームファイルを編集する
**Sublime Text 3** で、複製したスキームファイルを開きましょう。
Ctrl + F でコメントカラーの定義個所を探します。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/b916c4b6-3805-ef70-9dcb-4bab851cabfb.png)

大体Ctrl+Fすればどうとでもなるものです。（過信）

色は16進数で表示されているので、お好きな色を指定しましょう。
おすすめとしては、[Color Hex](http://www.color-hex.com/)にて、もともと設定されている色で検索し、これに近い色を用いてあげると違和感がないかなと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/59fb4966-59fe-8284-413a-f2492d60f8c7.png)

こんな感じですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/9fb3cd02-3e97-2dd9-a14f-0df027979563.png)

編集が終わったら、保存してあげましょう。

##自分で編集したカラースキームを適応する
これで最後です。
自分で作ったテーマを選択しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/af8f1c14-aa89-5b02-7d5d-5efc2779a05a.png)


これが
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/eec2b9a8-5dd5-c482-28aa-797cc6f7ed1a.png)

こうなりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/8ba73135-1e6e-87ab-df37-111a5bb02207.png)

##このカラースキームを他のパソコンでも共有したい！
この設定を例えば学校・自宅・仕事でも適応させたいとします。
その場合はあなたが編集したファイルを
```C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\User```
以下に放り投げてください。
以下といったのは、この下ならどこに配置しても拡張子で見つけてくれるからです。

こんな感じですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/129639/995945d6-4cb5-f902-9e3a-f18ba06dd210.png)