OmniAICreator/Qiita-1.07M huggingface dataset:
.NET Core のコンソ－ルアプリケーションで設定ファイルを利用する

# `.NET Core` のコンソ－ルアプリケーションで設定ファイルを利用する

`.NET Core 2.0` で設定ファイルを利用できるようにする方法です。
環境は以下の通りです。

- Visual Studio 2017
- .NET Core 2.0

## NuGet パッケージのインストール

設定ファイルを読み込むのに必要な NuGet パッケージをインストールします。

- [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/)
- [Microsoft.Extensions.Configuration.FileExtensions](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.FileExtensions/)
- [Microsoft.Extensions.Configuration.Json](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/)

## 設定ファイルの追加

プロジェクトに Json ファイルを追加します。
ファイル名は自由ですが、自分は `AppConfig.json` としました。

Json ファイルを追加した後、ファイルのプロパティを以下のように変更しておきます。
( ファイルを右クリック -> [プロパティ] )

- ビルドアクション: なし
- 出力ディレクトリにコピー: 新しい場合はコピーする
    - この設定をしておかないと、実行ファイルにしたときに出力ディレクトリに Json ファイルが出力されず、自分でファイルをコピーしなければならなくなります。


## 設定の追加

追加した Json ファイルに設定を書きます。
データベースの接続設定を書く場合は、キーを `ConnectionStrings` にしておくとコードからの読み込みがしやすくなります。

```json:AppConfig.json
{
    "ConnectionStrings": {
        "Default": "server=localhost;userid=root;pwd=;port=3306;database=db_test;"
    },
    "AppSettings": {
        "TestConstValue": 88
    }
}
```

## ソースコードから設定値を読み込む

設定値を読み込むには、`Microsoft.Extensions.Configuration.ConfigurationBuilder` を利用して以下のように読み込みます。

```csharp:Program.cs
using Microsoft.Extensions.Configuration;
using System.IO;

namespace TestProject
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = GetConfiguration();

            // 設定値の取得
            var testValue = config["AppSettings:TestConstValue"];
            // 以下の書き方でも取得できます。
            testValue = config.GetSection("AppSettings")["TestConstValue"];

            // ConnectionString は専用のメソッドが用意されています。
            var connectionString = config.GetConnectionString("Default");
            // 下記の書き方でも取得できますが、専用のメソッドを利用するほうが簡単です。
            connectionString = config["ConnectionStrings:Default"];
            connectionString = config.GetSection("ConnectionStrings")["Default"];
        }


        static IConfiguration GetConfiguration()
        {
            var configBuilder = new ConfigurationBuilder();

            // 設定ファイルのベースパスをカレントディレクトリ( 実行ファイルと同じディレクトリ )にします。
            configBuilder.SetBasePath(Directory.GetCurrentDirectory());

            // Json ファイルへのパスを設定します。SetBasePath() で設定したパスからの相対パスになります。
            configBuilder.AddJsonFile(@"AppConfig.json");

            return configBuilder.Build();
        }
    }
}
```

## 参考ページ

- [Configuration in ASP.NET Core | Microsoft Docs](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration)
- [ASP.NET Core configuration for .NET Core console application - Stack Overflow](https://stackoverflow.com/questions/38114761/asp-net-core-configuration-for-net-core-console-application)
【CEDEC+KYUSHU 2017】Cygames デバッグで「最高のクオリティ」を作り出す

2017/10/28(土)
九産大（九州産業大学）にて開催された『CEDEC+KYUSHU 2017』に行ったので、見た講演の内容（当社調べ）と感想を。
※自分が気になった部分しかメモっていないので、講演の内容そのままでは無いです
※あと長年連れ添った折り畳み傘がJRに運ばれていきました南無

# デバッグで「最高のクオリティ」をつくりだす～品質管理が会社の未来を変える～デバッグとはなにか？ 基本の知識からデバッガーが１００％の力を発揮できる環境と組織とは～
登壇者：平岡 徹也さん/芦原 栄登士さん

内容は学生向けで開発者向けの要素はほぼ無し。

### デバッグとは
**・バグの検出**
**・ゲームバランスの確認**
**・操作性や分かりやすさ等のユーザービリティチェック**
を行うもの

### デバッグの種類
・**プレデバッグ**：仕様を元にコアデバッグからリリースまでにどういうデバッグが必要かを洗い出す
・**コアデバッグ**：全デバッグ（仕様チェック/イレギュラーチェック/フリーデバッグ）
・**マスターQA**：フリーデバッグ/通しテスト
=>通しプレイやフリーデバッグも考えなしにやるのではなく、ちゃんと目的をしっかり持ってやる。

### 今のアプリは通信周りでバグが起きやすい
=>リリース前に山手線に乗って開発中のアプリのテストを行っている（山手線チェックと呼んでいるらしい）
　山手線で複数の端末を持ってゲームをしている人がいたらもしかしすると･･･

### Cygamesさんでの取り組み
・仕様書を元にテストケースをしっかり作る => 全て洗い出す
・テストケースはテスト手順/期待値/実際値までしっかり記載

### デバッグにもチームが複数ある
・**プロジェクトチーム（プロジェクトごとに専任を立てる）**
=>全仕様チェック（プロジェクト間で共有）

・**ＴＱＡチーム（全プロジェクト検証）**
=>ガイドラインチェック
=>ネットワークテスト
=>フィールドテスト
=>課金テスト
=>電池消費量・温度測定
=>リソースDL容量測定
=>メモリ・CPU測定

・**端末検証チーム（全プロジェクト検証）**
=>新機種テスト
=>全機種テスト
=>推奨機種選定テスト
=>FPS測定
=>新OSテスト

### **デバッグに向いている人**
**・間違いに気づく注意力** ←大事
**・文章構成力** ← 個人的にはすごく大事だと思っている
**・エクセルの基本的な操作**
**・コミュニケーション能力** ←大事
**・ゲームが好きでやりこんでいる**
**・基本に忠実に業務遂行出来るか**

---
箇条書きですが、こんな感じのことをお話されていました。
Cygamesさんのタイトルのデバッグでも、やはりというかスマホゲーでは避けて通れない通信に関わるバグは多いらしく
もれなく検知して修正出来るように入念にチェックをされているとのことでした。
そこから山手線チェックなるものが生まれたのかもしれませんね（笑）これは東京ならではだなーと思いました。

研修育成なども行っているらしく、
バグをわざと入れたROMを作りそれを新しく参加した人たちに触らせてバグを見つける研修を行ったりもしているらしいです。
新しく入ってきた人たちにどういうバグがあるか、生まれやすいかとかを理解してもらうのには良いかもです。

私の感想としては、
**・必要なデバッグ洗い出し**
**・情報の共有徹底**
新しい機能や既存の機能を改修する際に、
どういうところをチェックしないといけないか、どういうところまで影響が出るか、しっかり洗い出す。
そしてテストケースももれなく作る。
どういうテストをしたか、どういう結果が出たかをちゃんと共有する、共有できる形を作る。
共有することで、どういう機能を入れるとどういう不具合が生まれるのか、どういう場所に影響が出るのか、
もっと掘り下げるとどういう仕様がどういう不具合を生むのかといった部分まで見えるようになってくる。


あれ？これって当たり前のことなんじゃ（ｒｙ



質の高いデバッグってなんだろう？と改めて考える機会になりました。
最近よく考えることなのですが、どこにどう相談すればいいのか分からないまま、時が過ぎていく。。。


*[2017/10/31 17:26]タイポ修正*
Project Euler Q16 【各位の数字の和】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$2^{15} = 32768$ であり, 各位の数字の和は $3 + 2 + 7 + 6 + 8 = 26$ となる.

同様にして, $2^{1000}$ の各位の数字の和を求めよ.

## 解答
```bash
awk 'BEGIN{print 2 ** 1000}' |
awk -v FS= '{for(i=1;i<=NF;i++){s+=$i};print s}'
1366
```

`awk`で2^1000を計算できることにびっくりした。
[こちらのサイト様](http://cute.sh/solairo/d/big_02.html)を見る限り正確な値なんだと思う。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/016.html
togelack を docker で動かしたときの注意点

# 概要

* [Togetter的な社内Slackまとめサイトをつくった話 - Qiita](https://qiita.com/ru_shalm/items/32160b23df535ed78967)

この記事を見てすぐ、dockerで立ち上げたあと、使ったマシンを飛ばして以来、docker-composeに手を付けていなかったら、ちょうど以下の記事を見つけた。

* [togelack (slack + togetter みたいなやつ) を docker で動かしてみた - Qiita](https://qiita.com/tily/items/3bc7eee3df612347ee6d)

これをみて、久しぶりに、dockerでtogelack を動かしてみた。

いくつか、はまったところがあったので、メモ。
docker-compose だからおこる可能性があるところもあるので、原因については、まだ細かく調査していない

# まとめ

うまく動いたら、動かしつづけそうなので、
忘れないようにはじからメモ

## mongodb のデータ永続化

```
  mongo:
    image: mongo
    volumes:
      - /home/vagrant/work/togelack/datadir:/data/db
```


## ホスト側待受ポートの変更(5000で待ち受ける)


```
 app:
    build: .
    ports:
      - 5000:3000
```

## アクセスするとき

ホストが許可するアドレスに追加されていること。
IPなどを登録しておく。
登録場所は、調査中（以前の設定が残っていて、いまはどこにあるのかわからない）

```
http://localhost:3000
```

でアクセスするときは、allow に localhost:3000 を追加しておく必要があるとおもう。
もし動かなかったら、IPをいれてみる

自分は、このことをよくわすれて、localhostを使いしていないのに、localhostでアクセスするので、メモ。

## 許可するURLの追加方法


1. https://api.slack.com/applications
2. 作成したアプリを選ぶ
3. 左側のメニューから、`OAuth & Permissions` を選ぶ
4. Redirect URLs の、中の `Add a new Redirect URL` を選ぶ
5. 追加する

### 3. 実際の画面はこんなかんじ

2でアプリを選んだ後のアドレスは、アプリ固有なので
だいたいこんなかんじのメニューが左にある
(2017年10月31日時点)

![Screenshot from 2017-10-31 16-07-54.png](https://qiita-image-store.s3.amazonaws.com/0/82011/b6c321db-fa76-4b0a-b422-099e00753647.png)

### 4. の実際の画面はこんなかんじ

(2017年10月31日時点)

![Screenshot from 2017-10-31 16-09-52.png](https://qiita-image-store.s3.amazonaws.com/0/82011/10fbc5b5-edcc-c0bb-2d2e-420135d41ed7.png)


###

## SLACK_CLIENT_TOKEN は、クォートで囲う

Slack のクライアントトークンがいかのように数字と、ピリオドにみえる。

```
SLACK_CLIENT_TOKEN: 123345789.3358393128
```

このまま docker-compose.yml  に書いてしまうと、
oauthのパラメータには、


```
123345789.34
```

小数点３桁目がまるめられてしまうようだ。

せっていするときはクォートで書こう。
シングルクォートはうまくいっている。


```
SLACK_CLIENT_TOKEN: '123345789.3358393128'
```

### PRIVATE_MODE も同様にクォートで囲う必要がある？

本家のサイト[rutan/togelack: Slackまとめ](https://github.com/rutan/togelack) では、

true false がかけるようだが、これもクォートで囲わないとエラーになった。

ただし、これは、これでうまくいっているのか確認していない。起動ができることを確認したのみ

### 環境変数から設定を取り込む

これは、.env でできるようなので、そこから指定できるようにちょっと、`docker-compose.yml` を修正している。
Project Euler Q15 【格子経路】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
2×2 のマス目の左上からスタートした場合, 引き返しなしで右下にいくルートは 6 つある.
では, 20×20 のマス目ではいくつのルートがあるか.
![p015.png](https://qiita-image-store.s3.amazonaws.com/0/204486/c6bc2192-ccef-070f-a645-c2ff1cf315f8.png)

## 解答
前提：要するに、

```math
\frac{(20+20)!}{20!20!}
```

を計算すればよい。すなわち、

```math
\frac{21*22*...*39*40}{1*2*...*19*20}
```

を計算すればよい。
※筆算で解く場合にはもっと[華麗な方法](https://mathtrain.jp/dp)がある。

`bash`や`awk`に階乗を計算するものがないようだったので仕方なく`awk`でループする。
`print`だと指数表示になってしまうので`printf`を使用する。

```
awk 'BEGIN{a=1;for(i=21;i<=40;i++){a*=i};print a}' |
awk '{v=$1;for(i=1;i<=20;i++){v/=i};printf("%d\n",v)}'
137846528820
```

思っていたより大きな値だった。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/015.html
rubyでJISコードを扱う

やあ （´・ω・｀)
ようこそ、バーボンハウスへ。
このテキーラはサービスだから、まず飲んで落ち着いて欲しい。

うん、「また」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。

でも、このタイトルを見たとき、君は、きっと言葉では言い表せない
「可能性」みたいなものを感じてくれたと思う。
全銀と戦うの中で、そういう気持ちを忘れないで欲しい
そう思って、この記事を書いたんだ。

じゃあ、注文を聞こうか。

# JISコードはISO-2022-JPのこと？

[ウィキペディア](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)で「JISコード」を検索すると[ISO-2022-JP](https://ja.wikipedia.org/wiki/ISO-2022-JP)のページに飛ばされます。
しかし、[文字コード表](http://charset.7jp.net/jis.html)をみるとASCIIコードと半角カタカナのコードが重複しています。
例えば、「ｱ」だと`0x31`で「1」も`0x31`と表現しています。
`0x31`1バイトだけだと「1」になるんですが、じゃあ、「ｱ」を表示したい場合はどうするかというと
エスケープシーケンスを使い`0x1b284931〜`として複数バイトを用いて表現します。
しかし、某全銀フォーマットだと1文字1バイトとなっているため、これだと半角カタカナ使えないじゃん、という話になります。

ここでちょっとコードを書いて確認してみましょう。

```ruby
> require 'kconv'

> '1'.tojis.unpack('H*').join
=> "31"
```

次から、ちょっと想定と違ってきます。

```ruby
> 'ｱ'.tojis.unpack('H*').join
=> "1b244225221b2842"
```

`0x1b284931〜`じゃないですね。じつは[勝手に全角に変換](https://docs.ruby-lang.org/ja/latest/method/Kconv/m/tojis.html)しちゃってます。
※ちなみに、後ろ3バイトの`0x1b2842`は半角カタカナの終了(ASCIIの開始──ようするにコードエリアマップの切り替え用のエスケープシーケンス)

```ruby
> 'ア'.tojis.unpack('H*').join
=> "1b244225221b2842"
```

なので、ドキュメントに書いてあるとおりにNKFで変換してみましょう。


```ruby
> require 'nkf'

> NKF.nkf('-jxm0', 'ｱ').unpack('H*').join
=> "1b2849311b2842"
```

前と後ろの3バイト(`0x1b2849`と`0x1b2842`)はエスケープシーケンスなので残った`0x31`がISO-2022-JPの半角カタカナエリアマップにおける「ｱ」となり、やっと目的のバイトコードにたどり着きました。
が、1バイトどころか7バイトになってしまいます。

# JISコードはJIS X0201のことだった

じゃあ、JISコード1バイトで半角カタカナを表示するにはどうすればいいのか？
最初にウィキペディアでJISコードを検索したのが罠で、
実は扱うべき文字コードはISO-2022-JPではなくJIS X0201が正しいのでした。
[JIS X0201の文字コード表](http://www.asahi-net.or.jp/~EK5Y-NSMR/ref-ascii.htm)をみるとASCII文字と半角カタカナがちゃんと別のコードとしてマッピングされています。
この文字コードをRubyで扱うにはどうすればいいか？実際にコード上で確認してみましょう。

```ruby
> NKF.nkf('-s -x -Z4', 'ア').unpack('H*').join
=> "b1"
> NKF.nkf('-s -x -Z4', 'ｱ').unpack('H*').join
=> "b1"
```

`0xb1`は[JIS X0201の文字コード表](http://www.asahi-net.or.jp/~EK5Y-NSMR/ref-ascii.htm)を確認すると、ちゃんと「ｱ」の文字コードとなっています。
[NKFのオプション](https://docs.ruby-lang.org/ja/latest/class/NKF.html)はそれぞれ

- `-s` シフトJISに変換
- `-x` 通常行われる半角カナから全角カナの変換を行わない(上記`#tojis`による変換で半角カタカナが全角になっていたのはこれが原因)
- `-Z4` 全角カナを半角カナに変換

という意味になります。
ちなみに[ここ](https://www.tanshin.co.jp/business/netbk/pdf/zengin_moji.pdf)にあるスペースと￥マーク以外の記号は全角から半角のコードに変換してくれます。

これでJISコード1バイトで半角文字を扱うことができるようになりました。

# JIS X0201はシフトJISの一部

NKFのオプションでシフトJISの変換を指定していましたが、
[JIS X0201の文字コード表](http://www.asahi-net.or.jp/~EK5Y-NSMR/ref-ascii.htm)と[シフトJISの文字コード表](http://charset.7jp.net/sjis.html)を見比べるとASCII文字と半角カタカナのコードは同じだということがわかります。
「じゃあ結局、最初からSJISに変換するだけでよかったじゃん」となるところですが、そのとおりです。
ただ、Kconvによる変換だと、暗黙の半角→全角変換が行われ…

```ruby
> 'ｱ'.tosjis.unpack('H*').join
=> "8341"
> 'ア'.tosjis.unpack('H*').join
=> "8341"
```

…となり、結局NKFを利用するところまでは必然となります。
goの依存管理ツール depを使ったメモ

## はしがき

大雑把に[dep](https://github.com/golang/dep)を使った最低限のメモです。
以前はglideを使ってたのだけど、depにmigrateしてね、っと
glideでもアナウンスされていたので、まぁdep触るいい機会かな〜くらいの。
他にも山ほどあるけど、golang謹製なので、まぁ標準化されていきそうだし。

## install

```
go get github.com/golang/dep
```

## 初期化

```
dep init
```

`Gopkg.toml`と`Gopkg.lock`が生成される

## パッケージをインストール

```
dep ensure
```
Siamese Networkをchainerで実装するまで(1)

Siamese Networkを理解してchainerで実装するまでの流れを書きたいと思います。

Siamese Networkとは、１クラスあたりの学習データが極端に少ないケース（これをone shot learningとかfew shot learningと言います）にでもうまく学習をしてくれるネットワークモデルです。

Siamese Networkは20年以上前に作られたものらしいのですが、近年のディープラーニングブームでSiamese NetworkにCNNやLSTMを組み込んだものが良い結果を出してきて、プチブームが起こっている気がします。(GANには遠く及びませんが)

このSiamese Networkに基づいた研究にNIPS2016で発表された”Matching Networks for One Shot Learning”(Oriol)があります。個人的にはこれを実装することが最終的な目標です。

その他にも関連する論文を載せておきます。
・Siamese Recurrent Architectures for Learning Sentence Similarity (Jonas and Aditya)[リンク](http://www.mit.edu/~jonasm/info/MuellerThyagarajan_AAAI16.pdf)
SiameseNetwork+LSTMで文章間類似度の計測。
・Siamese Neural Networks for One-shot Image Recognition（Gregory）[リンク](https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf)
SiameseNetwork+CNNで画像の分類。

【背景〜導入】
-
Siamese Networkとは何か？を理解するために、以下の説明がとても役に立ちました。
[1]https://www.slideshare.net/NicholasMcClure1/siamese-networks
[2]https://hackernoon.com/one-shot-learning-with-siamese-networks-in-pytorch-8ddaab10340e

一例をあげて説明すると、
・データセット${(x_{0},x_{1},x_{2},...,x_{n}),(t_{0},t_{1},t_{2},...,t_{n})}$を用意する。($x$がデータ、$t$がラベル)
・適当に２つのデータ$x_{a}$,$x_{b}$をとってきて、$t_{a}=t_{b}$ならば$t_{ab}=1$、それ以外ならば$t_{ab}=0$とする。
・２つのデータ点$x_{a}$,$x_{b}$を、同じ関数（ここでは重みを共有したニューラルネットワーク）に入れる。
・２つ出力$y_{a}$,$y_{b}$が得られる。
・２点間の距離を測る関数(例えばマンハッタン距離関数)$D$を用いて、$D(y_{a},y_{b})$を出力する。
・$MSE(D(y_{a},y_{b}),t_{ab})$を誤差としてバックプロバゲーションをする。
という流れになります。

これは、同じクラス同士のデータを近くに、違うクラス同士のデータを遠くに写像するようなニューラルネットワークを求めていると解釈することができます。そういった点で、Siamese Networkは計量学習ともいえそうです。

![スクリーンショット 2017-10-31 15.00.51.png](https://qiita-image-store.s3.amazonaws.com/0/210451/4d0e722d-c3a9-cce4-6352-d7d5c4eab62a.png)


ちなみに、[2]の記事にあるようにContrastive Loss functionを使う場合は、
「$t_{a}=t_{b}$ならば$t_{ab}=1$、それ以外ならば$t_{ab}=0$とする。」の部分が逆になります。

次回は実装部分について書いていこうかと思います。
PHPのコメントについて

## 概要
コメントの書き方について、少し意識をしたいと思って調べた内容を自分用にメモしておく。

## コメントの書き方
そもそもどう書くの？。
※ [PHPDoc reference](https://docs.phpdoc.org/references/phpdoc/index.html)

## 最低限書きたいコメント
調べていたら、同じ考え方の記事があったので、そのまま流用させてもらいます。

※ [最低限書いておきたいPHPのDocコメント](https://qiita.com/motoyan-qwt/items/ee973666f1105435822c)

入力/出力の各値の型が分かれば（<font color="red">統一されていれば</font>）使うことができる。

型を意識していないコードとかも頻繁に見かけるので、
最低限下記のコメントを書き、型について意識して欲しいと思う。

**＜型に関するアノテーション＞**

* @var [型] 説明
* @param [型] 変数名 説明
* @return [型] 説明

以上

## 参考サイト
* [PHPDoc reference](https://docs.phpdoc.org/references/phpdoc/index.html)
* [最低限書いておきたいPHPのDocコメント](https://qiita.com/motoyan-qwt/items/ee973666f1105435822c)
GitHub Project に自動でカードのカラム遷移をする機能が追加された

[GitHub の Project Boards](https://help.github.com/articles/about-project-boards/) を使っていますか？
ボクは時折使っているんですけど、Issue を Close した時に自動で `Done` カラムに行ってくれなくて不便だなぁと思ってました。

しかし、先日遂に、そのような Issue や PR の状態変化でカラムを自動で遷移してくれる機能が追加されました！

詳しくは公式の記事へ

- [Keep your project boards up to date, automatically · GitHub](https://github.com/blog/2458-keep-your-project-boards-up-to-date-automatically)
- [About automation for project boards - User Documentation - GitHub Help](https://help.github.com/articles/about-automation-for-project-boards)
- [Configuring automation for project boards - User Documentation - GitHub Help](https://help.github.com/articles/configuring-automation-for-project-boards/)

## 使い方

ボードを作成するとき、作成済みならカラムの横の `...` をクリックすると設定できます。
`Automation` というのがそれです。

![add_column.jpg](https://qiita-image-store.s3.amazonaws.com/0/143424/1b0fe188-bcd2-5218-eb82-d6c290705c27.jpeg)

![done.jpg](https://qiita-image-store.s3.amazonaws.com/0/143424/aa800ea8-569c-548e-c5c7-3886dd98953c.jpeg)

全部で4つの状態が定義されており、各状態で設定できるトリガーが決まってます。

- `None` (デフォルト)
    - トリガーなし 
- `To do`
    - Move all newly added issues and pull requests here (新しい Issue や PR を追加した時)
    - Move all reopened issues and pull requests here (Issue や PR を reopen した時)
- `In progress` 
    - Move all reopened issues and pull requests here (Issue や PR を reopen した時)
- `Done`
    - Move all closed issues here (Issue を close した時)
    - Move all merged pull requests here (PR をマージした時)
    - Move all closed, unmerged pull requests here (PR を close した時)

`To do` や `Done` など状態自体は複数のカラムで設定可能ですが、**トリガーはひとつのプロジェクトでひとつのカラムにしか設定できません**。
そのため、`To do` と `In progress` の「Issue や PR を reopen した時」はどちらかにしか設定できません。
既に設定してあるトリガーを別のカラムに設定しようとすると警告が出て、OK すると他方が解除されるようです。

あと、「新しい Issue や PR を追加した時」というのは Issue や PR の右側にある `Assignees` や `Labels` のところの `Projects` に、このプロジェクトを設定した時のことを指します。
ちなみに、`To Do` のトリガーが無いと以下のような `add cards` ってとこに溜まるみたいですね(このカードを D&D する必要があった)。

![no_auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/143424/f295e98e-0d5f-bd97-859e-f5c569c5894e.jpeg)

## おしまい

以上です。
便利ではありますが、`In progress` のトリガーなど、まだ物足りない感じですね。
まぁ GitHub で力を入れてる部分？(要出典)っぽいのでドンドン改良されるのではないでしょうか？

(この記事も早く腐りそう...)
Bluetooth で通信が可能になるまで

Linux に接続した Bluetooth デバイスと通信が出来るようになるまでの流れ。

## Linux に BT アダプタが接続される

もしも BT アダプタが存在していれば bt-adapter -l で表示される。また sysfs 経由でも確認出来る。

    # bt-adapter -l
    Available adapters:
    qemux86-64 (00:1B:DC:08:A4:0B)
    
    # ls /sys/class/bluetooth/
    hci0  hci0:63  hci0:71

## 対象デバイスとペアリングが出来ている

ペアリングは GUI や [bluetoothctl コマンド](https://qiita.com/propella/items/6daf3c56e26f709b4141)で行う。もしもペアリンス済なら bluetoothctl コマンドの paired-devices で表示される

    # echo paired-devices | bluetoothctl
    ...
    [M00213]# paired-devices
    Device D4:0B:1A:F2:FE:DC M00213
    ...

## 対象デバイスと通信が出来る

一応 Ping してみる。

    # l2ping D4:0B:1A:F2:FE:DC
    Ping: D4:0B:1A:F2:FE:DC from 00:1B:DC:08:A4:0B (data size 44) ...
    44 bytes from D4:0B:1A:F2:FE:DC id 0 time 8.62ms
    44 bytes from D4:0B:1A:F2:FE:DC id 1 time 14.32ms
    44 bytes from D4:0B:1A:F2:FE:DC id 2 time 1891.53ms

## 対象デバイス上で必要なサービスが動いている。

TCP/IP では IP アドレスとポート番号で接続先を指定するが、Bluetooth では Port 番号を Service Discovery Protocol (SDP) という仕組みで間接的に取得する。SDP 自体のポート番号は決め打ち。あるデバイスの SDP を見るには sdptool を使う

    # sdptool browse D4:0B:1A:F2:FE:DC
    Browsing D4:0B:1A:F2:FE:DC ...
    ...
    Service Name: Handsfree Gateway
    Service RecHandle: 0x10003
    Service Class ID List:
      "Handsfree Audio Gateway" (0x111f)
      "Generic Audio" (0x1203)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 3
    Profile Descriptor List:
      "Handsfree" (0x111e)
        Version: 0x0106
    ...

各項目の意味は以下の通り

* Service Name: このサービスの名前
* Service RecHandle: このレコードを特定するデバイス内で一意の ID
* Service Class ID List: この Service Record が理解する UUID のリスト
    * 一つのサービスが複数の Service Class ID を持っても良い。
    * サービスは必ず Service Class ID を持つ。
* Protocol Descriptor List: このサービスが使うプロトコルとポート番号のリスト
    * L2CAP: UDP みたいな物。ポート番号は 1 - 32767 の奇数。
        * L2CAP ではポート番号を Protocol Service Multiplexer (PSM) と呼ぶ。
    * RFCOMM: TCP みたいな物。ポート番号は 1 - 30。
        * RFCOMM ではポート番号を Channel と呼ぶ。
* Profile Descriptor List: このサービスが提供する Profile のリスト (オプション)

クライアントは、Service Class をキーにしてサービスを検索する。Profile も似たような目的らしいが良くわからなかった。

## 対象サービスに接続する

SDP の Protocol Descriptor List にポート番号が Channel または PSM として現れるので接続する。あとはインターネットソケットと同じ。

## 参考

* [Bluetooth Essentials for Programmers](http://amzn.asia/4Beg2cn)
* [Service Discovery](https://www.bluetooth.com/specifications/assigned-numbers/service-discovery)
* [Core Specifications](https://www.bluetooth.com/specifications/bluetooth-core-specification)
MySQL文字コードをutf8に設定し反映

```
emacs /etc/mysql/my.cnf
```

emacsなどのエディタで設定ファイルを開く

```
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
```

上記の内容を追記

```
/etc/init.d/mysql restart
```

mysqldを再起動
Capybaraのfeature specでraise_errorでテストしたらinternal server error

# この記事について
表題の通り

# 状況
1.Railsを使っている
2.`context 'ほにゃらら', js: true do`とjavascriptを動くようにした
3.`Internal Server Error`が出る

こちらのコメントを見て、試しに`js: true`を`js: false`にしたら404とか拾ってくれた
https://stackoverflow.com/questions/15950677/where-do-i-see-the-reason-of-a-internal-server-error-when-running-rails-reques#comment22731368_15950677

```rb
context 'かくかくしかじか', js: true do
  scenario 'あれこれそれこれ' do
    # javascript使ったテスト
  end
  scenario 'ほげほげうまうま', js: false do
    expect do
      visit user_path(1_000_000) # 存在しないユーザ見に行くとか
    end.to raise_error(ActiveRecord::RecordNotFound)
  end
end
```
これで普通に拾えた
むしろみんなこのエラーにならないんだろうか？

#### 追記
raise_error以外に、`js: false`した方がいい場面としてturbolinksが有効な時にファイルのダウンロードをテストする時もjavascriptは切る必要がある

```ruby
click_on 'test.ppt'
# js: trueでturbolinksが有効だとtest.pptがダウンロードされるのを待たずに次へ行く
expect(page.response_headers['Content-Type']).to eq('application/vnd.ms-powerpoint')
```
UbuntuでMySQLインストールを自動化

具体的にはrootパスワードの入力、および再確認の入力を事前に定義することで自動化します。
以下の例では、rootのパスワードをPASSWORDで設定しています。

```
apt-get update
debconf-set-selections <<< "mysql-server-5.7 mysql-server/root_password password PASSWORD"
debconf-set-selections <<< "mysql-server-5.7 mysql-server/root_password_again password PASSWORD"
apt-get install -y mysql-server-5.7
```
GoogleAppsScriptでQiitaの投稿をスプレッドシートに一覧表示する

Googleサイトで作った社内向けサイトに、Qiitaの投稿を一覧表示したいので調べました。

社内向けに情報を発信するためにGoogleサイトを使用しています。最近Qiitaに技術系の情報を公開しているメンバーが増えてきたので、社内のGoogleサイトからまとめて見ることができればいいなと、社内のGoogleサイトにQiitaの投稿を一覧表示できる仕組みを考えていました。

ネットで調べて、どうやら[QiitaのAPI](https://qiita.com/api/v2/docs)とやらを使えば、Qiitaの投稿を取得できそうだったので、挑戦:v:

GoogleサイトのGoogleAppsScript（以降、GAS）で直接一覧を作って表示したかったのですが、GoogleサイトのGASから’UrlFetchApp.fetch’をしようとすると何も返事が来ず・・・:tired_face:
そこで、スプレッドシートのGASで試したらデータを取得できたので記録しておきます。

スプレッドシートにQiitaのデータを取得して表を作成します。そしてGoogleサイトからスプレッドシートにデータを取りに来て表示する仕組みを作ります。

まずはスクリプトを編集します。
![エディタ.png](https://qiita-image-store.s3.amazonaws.com/0/55407/f39c85e1-cb94-9635-c0ab-6473184e16fb.png)


ここに以下の内容を書きます。

# Qiitaの投稿情報を取得
```ruby:Spreadsheet(GAS)
function getQiitaData() {
  var user = "user_id" /ユーザーIDを設定 /

  try { 
    var response = UrlFetchApp.fetch('https://qiita.com/api/v2/users/' + user + '/items')
    var json = response.getContentText();
    var jsonData = JSON.parse(json);
    Logger.log(jsonData);
    return jsonData;
  } catch(e){
    /　失敗した時の処理　/
    var error = e;
    Logger.log("message:" + error.message + " qiitaアカウントが間違っていないか確認してください。");
  }
}

```

これで投稿の情報を全部持って来れるハズ。
getQiitaDataを実行すると、
![実行.png](https://qiita-image-store.s3.amazonaws.com/0/55407/2fa82b02-4ff9-59d2-f544-c91ad548dbe1.png)

実行後ログをチェック。
![ログ.png](https://qiita-image-store.s3.amazonaws.com/0/55407/df260c97-5f1c-567f-6a09-297945b1bf45.png)

![スクリーンショット 2017-10-31 14.20.04.png](https://qiita-image-store.s3.amazonaws.com/0/55407/e8dc71d7-8af9-9af3-0c62-f16b459ebe12.png)

投稿してる情報をGETできましたー:smiley:

#スプレッドシートにデータをセット
あとは、取得したQiitaの投稿をスプレッドシートにセットしていきます。



```ruby:Spreadsheet(GAS)
function setSpread(){
  /　Spreadsheetを指定 /
  var sp_url = "SpreadsheetのURLをコピペ"; 
  var spreadsheet = SpreadsheetApp.openByUrl(sp_url);

  /　シート名を指定　/
  var sheet = spreadsheet.getSheetByName("シート名をコピペ");
  sheet.clearContents();
  
  /　getQiitaDataを呼び出してデータ取得　/
  var jsonData = getQiitaData();
  
  if(jsonData == undefined){
    Logger.log("Qiitaのアカウント確認してください。");
  }else{
    /　データ数チェック　/
    if(jsonData.length == 0){
      Logger.log("今のところ投稿がありません。");
    }else{
      Logger.log(jsonData.length + "件のデータを取得しました。");
      for(var i=0;i<jsonData.length;i++){
        sheet.getRange(i+1,1).setValue(jsonData[i]["title"]); /投稿のタイトル/
        sheet.getRange(i+1,2).setValue(jsonData[i]["url"]); /投稿先URL/
        sheet.getRange(i+1,3).setValue(jsonData[i]["created_at"].slice(0,10)); /投稿作成日/
      }
    }
  }
}

```

スプレッドシートに投稿内容（タイトル、URL、作成日）が表示されましたー:clap:
![スクリーンショット 2017-11-01 9.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/55407/bea566c9-7ccb-1fe6-aaa6-5a79e174b1b8.png)


次はこの一覧表をGoogleサイトに表示します。
今日はここまで。
Project Euler Q14 【最長のコラッツ数列】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
正の整数に以下の式で繰り返し生成する数列を定義する.

    n → n/2 (n が偶数)
    n → 3n + 1 (n が奇数)

13からはじめるとこの数列は以下のようになる.
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

13から1まで10個の項になる. この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)

さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.

注意: 数列の途中で100万以上になってもよい

## 解答

```bash
time seq 999999 |
awk '{v=$1;for(i=1;i<=999;i++){print $1,v,c[v];if(c[v]!=""){c[NR]+=c[v];next};if(v==1){next};if(v%2==0){v=v/2}else{v=3*v+1};c[NR]+=1}}' |]
awk '$3==""{s[$1]+=1} $3!=""{s[$1]+=$3+1} END{for(i=1;i<=$1;i++){print i,s[i]}}' |
sort -k2,2n |
tail -1 |
awk '$0=$1'
837799

real	0m20.440s
user	0m25.205s
sys	0m0.451s
```

`awk`で次の行に行く為のコマンド`next`を知らなかった為、勉強になった。

※2018/01/22修正
実行時間が$70$秒ほどだったのを$20$秒ほどに改善。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/014.html

## 参考にさせて頂いたサイト様
[next = 次行の処理に移る - AWK - to_dk notebook](http://tounderlinedk.blogspot.jp/2010/07/next-awk.html)
Cognos BI でのOracleデータソース接続設定手順

#概要
Cognos 10 BIでの、Oracleデータソースへの接続設定の手順です。

昔のメモからの再現なので、間違っていたらご指摘下さい。

#手順
##CognosサーバーへのOracle Clientインストール

Oracleのサイトから、32bitのクライアントをダウンロード。

インストール・タイプは「管理者」で「次へ」。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/138a1a41-a991-50a1-446d-0538c60b51ee.png)

日本語と英語を選択し「次へ」。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1c7128a9-a2b4-5618-fe79-551668ef075c.png)

導入先を指定し「次へ」。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9b07a0c1-8317-8a21-7834-a269f1cd6259.png)

「終了」。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2d352205-0823-7a6e-4c3d-52c697e26b23.png)

レスポンスファイルを「保存」。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1ce0423e-55ce-d066-0c1c-4470e582e901.png)

インストール中。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/94ddf624-b055-04e5-366e-0ebe070b3c92.png)

終了。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/50859ca0-2570-e130-607b-6618637f2455.png)

Oracle JDBCドライバーを、\<CognosInstall>/webapps/p2pd/WEB-INF/libと\<CognosInstall>/v5dataserver/lib にコピー。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2c86f5f5-bf60-905c-ac02-e3aee914efd4.png)

Windows環境変数で、システム環境変数の path に、Oracleホームの場所を追加
C:\app\oracle_c32\product\11.2.0\client_1

Windows環境変数で、システム環境変数に TNS_ADMIN を追加し、Oracleホームの場所を指定
C:\app\oracle_c32\product\11.2.0\client_1

C:\app\oracle_c32\product\11.2.0\client_1\network\admin\tnsnames.ora ファイルを作成
※以下は参考。

```html

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleHostName)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

```

Cognosサービスを再起動。

##Cognosデータソース設定
「起動」メニューから「IBM Cognos Administration」を選択。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1af816c3-918a-a592-4429-43ab00f85641.png)

「設定」タブを選択し、「データ・ソース接続」から「データ・ソースの新規作成」を選択。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/31a46be8-bedb-0505-1adf-de5766e2e183.png)

タイプは「Oracle」、「JDBC接続の設定」をチェックし「次へ」。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/10d0f2f8-e88c-7e97-6aa2-7784c76befed.png)

tnsnames.oraに記載したSERVICE_NAMEを接続文字列に記載し、ユーザーID・パスワードを記載し、接続テスト。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/05ef44e2-c4b7-632e-a46c-846d5bed04f8.png)

「成功」を確認し「閉じる」。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/02f06278-48d1-546f-b584-7336aabafec8.png)

JDBC接続で、接続タイプに「サービスID」を指定し、Oracle サービス IDにtnsnames.oraに指定した「SID」を記載し、「接続をテスト」。
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9b3ea081-3de1-c64d-f0ed-50b6c027f588.png)

「成功」を確認し「閉じる」。
![015.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/161fd4c8-08fe-2cbd-92c9-76cbab12da32.png)

データソース接続が作成される。
![016.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1a7761b4-b3aa-c2c0-9c89-608184be94f7.png)

##Framework Managerの設定

上記と同じ様な手順をFramework Managerにも行います。

・Oracle Clientの導入

・tnsnames.oraファイルの作成

・環境変数の設定

・JDBCドライバーのコピー
※\<CognosInstall>/webapps/p2pd/WEB-INF/libのみ
Capybara + Poltergeistで画像を保存する


# 概要
* Screenshot ではなく img タグの画像を保存します
* Capybara + Poltergeist で画像のソースURLに visit して body を取得しても、画像表示用のURLが展開されていて、画像データを取得できないようです
* そもそも Capybara + Poltergeist で画像を保存する必要があるのかは謎

# 前提
* 対象画像の img タグを特定できている(idなど)
* 対象画像のフォーマット(png や jpeg) も特定できている
* jQueryは使ってないです(使ってももちろんできます)

# やり方
#### 何をやっているのか
* JavaScript を使って、img タグで表示されている画像を canvas に書き出し、canvas#toDataURLを使ってBase64化した画像データを取得
* Ruby側でBase64データをデコードして生画像データを取得し保存する

#### コード

```ruby
JS_CODE = <<-JS
  (function() {
    var image_element = document.getElementById("%s");

    var canvas = document.createElement('canvas');
    canvas.width  = image_element.width;
    canvas.height = image_element.height;
    canvas.getContext('2d').drawImage(image_element, 0, 0);

    var type = "%s";
    var dataURL = canvas.toDataURL(type);
    canvas = null;

    return dataURL;
  })()
JS

visit(url)
dataURL = page.evaluate_script(JS_CODE % ["image_id", "image/png"])
image_data = Base64.decode64(dataURL.gsub(/^.*,/,""))

file = File.open("image.png")
file.write(image_data)
file.close

```

* Poltergeist の execute_script は値を返さないので evaluate_script 使ってます
* evaluate_script は 引数とれないみたいなので 書式付き文字列で値を展開してます

# 参考
* https://gist.github.com/HereChen/e173c64090bea2e2fa51
ブラウザでマイク音声からwavファイルを生成する手引 1

[Google Cloud Speech API](https://cloud.google.com/speech/?hl=ja)を使うときクラアイアントとサーバサイドを連携するときに必要な知識。

React ReduxでWebRTC使う前に知識をまとめておく


## navigator.mediaDevices.getUserMedia()
カメラやスクリーンシェアリング、マイクのようなビデオやオーディオ入力装置の使用許可をユーザーに要求する。
最近よく見かける「通知を許可しますか？」というポップアップと同じUIです。

要求項目はこのように設定できます。

```
{ audio: true, video: true }
```

## AudioContext()
AudioContextコンストラクタです。
すべての音声の再生を管理します。

## AudioContext.createMediaStreamSource()
`getUserMedia()`で入出力デバイスの使用許可が降りると`stream`が渡されるので、AudioContextで音声ストリームを扱えるようにします。

```
const audioCtx = new AudioContext();
const source = audioCtx.createMediaStreamSource(stream);
```

## AudioContext.createScriptProcessor()
直接音声データを触るために必要なオブジェクトを生成します。
`bufferSize`についてはOSごとに最適なサイズがあります。
[https://weblike-curtaincall.ssl-lolipop.jp/portfolio-web-sounder/webaudioapi-basic/custom](https://weblike-curtaincall.ssl-lolipop.jp/portfolio-web-sounder/webaudioapi-basic/custom)

```
const source = context.createMediaStreamSource(stream);
const processor = context.createScriptProcessor(bufferSize, 2, 2);

source.connect(processor);
processor.connect(context.destination);
```

## ScriptProcessorNode.onaudioprocess
イベントハンドラーです。
ScriptProcessorNodeが生きている間呼ばれます。

```
processor.onaudioprocess = evt => {
  console.log(evt.inputBuffer);  // AudioBuffer
};
```

## 感想
[Recording Audio from the User | Web Fundamentals | Google Developers](https://developers.google.com/web/fundamentals/media/recording-audio/)にサンプルがあるので少し触るぐらいであれば直ぐに実装できました。
次はこれを活用していきます。
Xephyrでマウスポインタが表示されなくなった場合の対応


# はじめに
開発環境をCentOS6.5からCentOS7.3へ移行したのを機に、Xephyrのマウスポインタが表示されなくなってしまったため、その対応内容をまとめました。

# 実行環境
- 不具合が発生した環境
　　- OS：CentOS7.3
　　- Xephyr：1.17.2-22

- 不具合が発生していない環境
　　- OS：CentOS6.5
　　- Xephyr：1.13.0-23.1

# 不具合内容
次のように、例えばディスプレイ番号(:2)でXephyrを立ち上げると、CentOS6.5ではマウスポインタが表示されるのにCentOS7.3では表示されない。

```console
$ Xephyr -ac -host-cursor :2 
```

オプションについて補足です。

- "-ac"：アクセス制御しない
- "-host-cursor"：ホストサーバのカーソルを再利用する

# CentOS7.3で表示されなかった原因
"-host-cursor"オプションが削除されたため

- CentOS 6.5のXephyrのmanページ(一部)

```
Xephyr Option Usage:
-parent <XID>        Use existing window as Xephyr root win
-host-cursor         Re-use exisiting X host server cursor
-fullscreen          Attempt to run Xephyr fullscreen
(以下略)
```

- CentOS 7.3のXephyrのmanページ(一部)

```
Xephyr Option Usage:
-parent <XID>        Use existing window as Xephyr root win
-sw-cursor           Render cursors in software in Xephyr
-fullscreen          Attempt to run Xephyr fullscreen
(以下略)
```

オプションの2つ目が"-host-cursor"の代わりに"-sw-cursor"となっています。
しかし、単純に"-sw-cursor"を指定してもマウスポインタは表示されませんでした、、、

# 対応内容

次のように"-host-cursor"の代わりに"-softCursor"を指定するとマウスポインタが表示されました。

```console
$ Xephyr -ac -softCursor :2 
```

manページのTinyX Device Dependent Usageに"-softCursor"というオプションがありました。

```
TinyX Device Dependent Usage:
-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][+[-]XOFFSET][+[-]YOFFSET][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]]  Specify screen characteristics
-rgba rgb/bgr/vrgb/vbgr/none   Specify subpixel ordering for LCD panels
-mouse driver [,n,,options]    Specify the pointer driver and its options (n is the number of buttons)
-keybd driver [,,options]      Specify the keyboard driver and its options
-zaphod          Disable cursor screen switching
-2button         Emulate 3 button mouse
-3button         Disable 3 button mouse emulation
-rawcoord        Don't transform pointer coordinates on rotation
-dumb            Disable hardware acceleration
-softCursor      Force software cursor
-videoTest       Start the server, pause momentarily and exit
(以下略)
```

# おわりに
OSをアップデートした際に困って、調べた内容をまとめてみました。
もしよければ参考にしてください。
Sublime text 3 備忘録

# いじってる設定
#### `"highlight_line" : true`
カーソルがある行全てをハイライトする
(暗転しているテーマだと、ほんとにカーソルがどっか行っちゃうので)

#### `"show_encoding" : true`
下のStatus Barに文字コードを表示する
![encode.png](https://qiita-image-store.s3.amazonaws.com/0/113991/2340ca3b-be5e-f46a-e675-3bb9c3eea15a.png)
クリックすることで、文字コードをセットしたり、指定して開き直すこともできる

#### `"show_line_endings" : true`
下のStatus Barに改行コードを表示する
クリックすることでWindows(CR+LF), Unix(LF), Mac(CR)を選択できる

#### `"font_options":["directwrite"]`
フォント描写の設定

#### `"trim_trailing_white_space_on_save":true`
行末のスペースを保存時にトリムする

#### `"hightlight_modified_tabs": true`
保存できていないタブをハイライトする

---
# 入れてるパッケージ(2018/04/25 現在）
#### ConvertToUTF8
- エンコードをUTF-8に自動変換してくれる
    - 元のコードがわからない場合は選択肢の中から選択することができる

#### IMESupport
- Google 日本語入力などでの変換候補表示位置がおかしいときに入れる

#### Japanize
- Sublime textを日本語化

#### OmniMarkupPreviewer
- Markdownファイル(hoge.md)をブラウザでリアルタイム表示

#### Alignment (or Abacus)
- 複数行の"="などを揃えてくれる
    - 揃える文字は指定可能

#### SideBarEnhancements
- サイドバーの機能を拡張
    - サイドバー上でファイル操作まで可能に

#### SetiUI-Icons-Sublime
- サイドバーのアイコンを変更する
    - Package Controlには登録されていないのでマニュアルでインストール
    - https://github.com/mrmartineau/SetiUI-Icons-Sublime

#### Monokai Extended
- カラースキームパッケージ
    - 全体の色合いなどのセットが用意されている

#### SublimeLinter
- リアルタイム構文チェック
    - 言語ごとに追加でパッケージを入れる必要がある

#### ALL Autocomplete
- 別ファイルを参照してまでコードを補完してくれる

#### Origami
- 複数ペインに画面を分ける
    - 同じファイルの別位置も見ることができる

---
# 困ったことと対策
#### OmniMarkupPreviewer
- ブラウザにリアムタイム表示する際に、404エラーを吐く
- OmniMarkupPreviewerのsettingで`renderer_options-MarkdownRenderer`の`strikeout`が悪さ
- 対策：strikeoutを削除(下記コードをUserディレクトリのOmniMarkupPreviewer.sublime-settingsのカッコ内に記述)

```
"renderer_options-MarkdownRenderer": {
    "extensions": ["tables", "fenced_code", "codehilite"]
}
```
---
# 最後に
片手間で更新しているため、内容が薄い部分が少々ありますが、ご容赦ください。
コメント、間違っているところなどなどあればご指摘ください。
おすすめのプラグインとか教えていただけると筆者も作業効率が上がります^^
angular2 AoTコンパイルが通るまでの修正リスト

# 修正リスト
## template/stylesの参照方法を変更
 - 変更前
 
```ts
@Component({
  selector: "hoge-page",
  template: require("./hoge.component.html"),
  styles: [ require("./about.css") ]
})
export class HogeComponent {
}
```
 - 変更後

```ts
@Component({
  selector: "hoge-page",
  templateUrl: "./hoge.component.html",
  styleUrls: ["./about.css"]
})
export class HogeComponent {
}
```

## ngOnChangesの引数を定義する
 - 変更前
 
```ts
export class HogeComponent {
  ngOnChanges() {
  }
}
```
 - 変更後

```ts
export class HogeComponent {
  ngOnChanges(changes: SimpleChanges) {
  }
}
```
## htmlで参照する変数はprivateを外す
 - 変更前
 
```ts
export class HogeComponent {
  private hoo: string;
}
```
 - 変更後

```ts
export class HogeComponent {
  hoo: string;
}
```

## constructorで定義したprivate変数をhtmlで参照するときは、publicに変更する
 - 変更前
 
```ts
export class HogeComponent {
  constructor(private model: HogeModel){};
}
```
 - 変更後

```ts
export class HogeComponent {
  constructor(public model: HogeModel){};
}
```
## build コマンドの変更
 - 変更前

```sh
./node_modules/.bin/ng build --prod --aot
```

 - 変更後

```sh
node --max_old_space_size=2048 ./node_modules/.bin/ng build --prod --aot
```
Excelの連続データ作成と入力制限の組み合わせでエラー

# 概要

仕事で使用していたExcelで、0.1 ~ 999.9までの小数点0.1刻みの数値のみ入れたい（0.11とかは認めない）という件を対応するため、深く考えずエクセルの連続データ作成で 0.1 ~ 999.9のサンプルデータ列を作って、入力制限のリストでサンプルデータ列を指定すると有事が発生しました。

解決策はオートフィルし直すか、メモ帳等でコピペし直すしかありません。

# 環境

32, 64bit
Excel 2007, 2013

# サンプルエクセル

下記画像を参考に、サンプルデータ（0.1 ~ 999.9）を作って、そのサンプルデータの列を入力制限のリストで使用します。
すると、何故か2.2までは正常に動いているように見えるが、2.3でだめって言われます。不思議です・・・。

まずは適当な場所に入力制限を掛ける場所をつくって、、、
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/02c20a9e-ee41-2b95-8ad9-ecd14e5bcb93.png)

適当な場所にサンプルデータ（0.1 ~ 999.9）を入れる準備をして、、、
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/f4bece5e-61a9-d62e-52bc-685feda78fd9.png)

連続データ作成はこんな感じ
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/f7cba44a-e2b6-e84c-bb6d-0aa772a0ef2a.png)

連続データができました
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/09a788ee-9f1a-a40e-7f7d-8c4b73a116a0.png)

これを入力制限で使用すると、、、
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/659e0fe3-fb28-e3fc-81a2-4975822227b9.png)

えいやぁで設定！
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/4181c638-71ee-25e0-909e-27967a33d167.png)

うまく動いているように見えるが、、、
![ok.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/751e6138-e51c-96b1-2dc6-db3b31660534.png)

何故か2.3で弾かれる！！！（どうもお尻に3が来るとだめなような、、、気のせい？？？）
![ng.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/3a64fdc4-df9e-0a62-2bb1-944d19d3b2e2.png)

# 解決策

サンプルデータ（0.1 ~ 999.9）をオートフィルで作るか、テキストエディタ等に１度コピペして、エクセルに再度コピペして下さい。

これMicrosoftから褒賞金でないですか？お金欲しいです。
How to fix yum update - Error: Package: graphite2-devel-1.3.6-1.el7_2.x86_64 (ol7_latest)

# Symptom

Oracle Linux 7.4

```
Error: Package: graphite2-devel-1.3.6-1.el7_2.x86_64 (ol7_latest)
           Requires: graphite2(x86-64) = 1.3.6-1.el7_2
           Removing: graphite2-1.3.6-1.el7_2.x86_64 (@ol7_latest)
               graphite2(x86-64) = 1.3.6-1.el7_2
           Updated By: graphite2-1.3.10-1.el7_3.x86_64 (ol7_latest)
               graphite2(x86-64) = 1.3.10-1.el7_3
           Available: graphite2-1.2.2-5.el7.x86_64 (ol7_latest)
               graphite2(x86-64) = 1.2.2-5.el7

You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest```
```

# How to fix

ol7_optional_latest
enable=0 --> enabled=1

```sh:/etc/yum.repos.d/pu

...
[ol7_optional_latest]
name=Oracle Linux $releasever Optional Latest ($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
...

```

 cf. latest yum repository download 

https://docs.oracle.com/cd/E37670_01/E37355/html/ol_downloading_yum_repo.html
```
wget http://yum.oracle.com/public-yum-ol7.repo
```
MacOSでGitBookの環境をセットアップする


MarkDownのドキュメントをGitで手軽に管理できるGitBookを導入する。

条件：
* Mac OS Sierra
* npmがインストールされている

## インストール〜ブックの作成

gitbook-cliのインストール

```
$ npm install gitbook-cli -g
$ source ~/.bashrc 
```

gitbookの初期化

```
$ cd [対象ディレクトリ]
$ gitbook init
```


以下のファイルが自動で生成されるため、これらをベースにブックを編集する。

* README.md
* SUMMARY.md


## HTMLを出力する

gitbookをビルドすると`_book`というフォルダへHTMLが出力される。

```
$ gitbook build
```

以下のコマンドでビルド&ローカルサーバーを立ち上げて確認することも可能。

```
$ gitbook serve

Starting server ...
Serving book on http://localhost:4000
```

localhostのポート4000を開く。

![Kobito.f4pE0u.png](https://qiita-image-store.s3.amazonaws.com/0/92630/b71d5790-fdca-267a-2502-34e64505a7ba.png "Kobito.f4pE0u.png")



## PDFを出力する

PDFで出力をする場合は、Calibreというアプリケーションが必要。
https://calibre-ebook.com/


手っ取り早くcaskでインストールする。

```
$ brew cask install calibre
```


以下のコマンドを実行すると、`book.pdf`というファイル名でpdfが出力される。

```
$ gitbook pdf

info: 7 plugins are installed 
info: 6 explicitly listed 
info: loading plugin "highlight"... OK 
info: loading plugin "search"... OK 
info: loading plugin "lunr"... OK 
info: loading plugin "sharing"... OK 
info: loading plugin "fontsettings"... OK 
info: loading plugin "theme-default"... OK 
info: found 1 pages 
info: found 0 asset files 
info: >> generation finished with success in 5.7s ! 
info: >> 1 file(s) generated
```

プレビューでbook.pdfを開いた場合

<img src="https://qiita-image-store.s3.amazonaws.com/0/92630/87f97212-a4b7-8d40-50ae-17542268eea3.png" width="459" height="368" />
javascriptでバーコードを読み取る(zbarjs

# はじめに
javascriptでクライアントサイドからバーコードを読み取る機能を実装しようと、[このサイト](https://bl.ocks.org/jazzido/9435670)を参考にしたが、このサイトのindex.htmlをそのままコピーしただけでは動作しなかったので、なんとか動かせるようにしたものをまとめる。(ブラウザーはfirefox推奨)

# 事前準備
1. 作業フォルダーを作る
2. [zbarjs](https://github.com/yurydelendik/zbarjs)からzipファイルをダウンロードするなり、クローンを取ってくるなりしてzbar-processer.jsを取ってきて、作業フォルダーに置く
3. この[ページ](https://bl.ocks.org/jazzido/9435670)にあるindex.htmlを自分の作業フォルダーにそのままコピーして、作業フォルダーに置く

# やったこと
参考にしたサイトではjavascriptのWeb worker APIを使ってzbar-processar.jsを動かしているので、zbar-processer.jsの方にonmessageで、データを受け取った時の処理を追加してやる必要がある。

```html:index.html
<script type="text/javascript">
    var video = document.querySelector('video');
    var canvas = document.querySelector('canvas');
    var ctx = canvas.getContext('2d');
    var localMediaStream = null;
    var list = document.querySelector('ul#decoded');

    var worker = new Worker('zbar-processor.js');
    worker.onmessage = function (event) {
      if (event.data.length == 0) return;
      var d = event.data[0];
      var entry = document.createElement('li');
      entry.appendChild(document.createTextNode(d[2] + ' (' + d[0] + ')'));
      list.appendChild(entry);
    };

    function snapshot() {
      if (localMediaStream === null) return;
      var k = (320 + 240) / (video.videoWidth + video.videoHeight);
      canvas.width = Math.ceil(video.videoWidth * k);
      canvas.height = Math.ceil(video.videoHeight * k);
      var ctx = canvas.getContext('2d');
      ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight,
        0, 0, canvas.width, canvas.height);

      var data = ctx.getImageData(0, 0, canvas.width, canvas.height);
      worker.postMessage(data);
    }

    setInterval(snapshot, 500);

    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;

    if (navigator.getUserMedia) {
      navigator.getUserMedia({ video: true },
        function (stream) { // success callback
          if (video.mozSrcObject !== undefined) {
            video.mozSrcObject = stream;
          } else {
            video.src = (window.URL && window.URL.createObjectURL(stream)) || stream;
          }
          localMediaStream = true;
        },
        function (error) {
          console.error(error);
        });
    }
    else {
    }
  </script>
```

1. まず、index.htmlの上記部分の
function snapshot(){...
の中にあるworker.postMessage(data);
を見つける
2. 
worker.postMessage(data);
を
worker.postMessage(data.data);
に書き換える
3. 次にzbar-processer.jsを開いて、一番最後の行に以下のコードを追加する

```javaScript:zbar-processer.js
onmessage = function(e){
  var catch_img = new ImageData(e.data,320,240); //送られたデータを使って、画像を生成する
  var code = zbarProcessImageData(catch_img); //画像を解析する
  postMessage(code);
}
```

これでバーコードを読み取れるはずです。

# 参考
https://developer.mozilla.org/ja/docs/Web/API/Worker
Slack通知の表示情報をカスタマイズする。

# はじめに
この前、「[CloudWatchアラームでSlackへ通知を行う。](https://qiita.com/kooohei/items/848eeb4cbb19c83b0b6d)」を行いました。

その際はとりあえず通知されることを目的としていたので、デフォルトの Display icon が表示されるようになってました。
![](https://camo.qiitausercontent.com/97f1de1e103134f4fb4f00b59cb8d906570f07af/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f38323039302f32653566373862392d663366652d633065382d396266302d6630373839323339653838632e706e67)

でも、これだとちょっと味気ない気もするので、表示されるiconをカスタマイズしたいと思います。


# 設定
[slack API](https://api.slack.com) サイトの **Your Apps** をクリックします。

次に、作成した **App Name** がリストされるのでそれを選択します。

すると、 **Basic Information** の設定画面になるので、下の方にある **Display Information** を好きな内容に変更します。

![スクリーンショット 2017-10-31 11.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/698315df-7fa8-bc61-1baf-a1e73449cc7b.png)

今回は以下のように変更しました。

![スクリーンショット 2017-10-31 11.26.52.png](https://qiita-image-store.s3.amazonaws.com/0/82090/2b124b32-9dae-ea92-3ab7-968830e5919e.png)

変更したら右下の 「**Save Changes**」 で保存して完了です。


# 確認
保存したら内容はすぐに反映されます。

![スクリーンショット 2017-10-31 11.26.02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/f94c2ad5-d7dc-b7fb-3fe6-c9bce0a0b2fb.png)

![スクリーンショット 2017-10-31 11.26.14.png](https://qiita-image-store.s3.amazonaws.com/0/82090/bbe3a6b9-7d36-25e0-d8d3-ab8cf5746261.png)


# おわりに
Slack通知の設定ができたら、とりあえずアイコンの変更はしといた方がわかりやすいのでおすすめです。
[Ionic]WKWebViewでaタグをハンドリングする

IonicでつくるiOSアプリはすべてWKWebViewという機能で表示するように統一されました。

参考 ： [WKWebView for All: A new webview for Ionic](http://blog.ionic.io/wkwebview-for-all-a-new-webview-for-ionic/)

従来つかわれていたUIWebViewという機能で表示すると、JavaScriptの実行は遅いし、クラッシュ率高いし、iOS11ではバグがたくさん抱えているといった問題がありましたので歓迎すべきことなのですが、WordPressの`WP API`などを用いてメディアアプリをつくっている方は一点だけ注意する点があります。外部リンク、もうちょっというとaタグのハンドリングです。

[WKWebViewで躓いた10つのまとめ](https://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9)などで紹介されているように、`a[taget="blank"]`は挙動しません。ちゃんと調査していないのですが、`taget="blank"`のつかない`a`タグだとアプリ自体が書き換えられてしまったはず。ですので、HTML上のaタグがクリックされた時、そのイベントをJavaScriptサイドでハンドリングしてあげる必要があります。

いろいろなやり方がありますが、私は以下のように実装しました。Timelineというページの実装です。

```
import { NavController } from 'ionic-angular';
import { Component } from '@angular/core';
import { InAppBrowser } from '@ionic-native/in-app-browser';

@Component({
    templateUrl: 'timeline.html',
    selector: 'timeline-page'
})
export class Timeline {
    public linkListener: EventListenerObject | any;
    constructor(
        public nav: NavController,
        public iab: InAppBrowser,
    ) {}

    ionViewDidEnter(){
        // イベント登録
        document.querySelector("timeline-page").addEventListener('click',
            this.linkListener = (e) => {
                if(e.target.localName == 'a' && e.target.href){
                    e.preventDefault();
                    const browser = this.iab.create(e.target.href, '_system');
                    browser.show();
                }
            }, false);
    }

    ionViewDidLeave() {
        // イベント削除
        document.querySelector("timeline-page").removeEventListener('click',this.linkListener);
    }
}

```

`ionViewDidEnter()`はこのページが表示される時に自動的に実行されるメソッドです。ページが表示されたタイミングで、イベント登録を`@Component`で登録したselector名`<timeline-page>`に対して行っています。
その中の要素をクリックしたらイベントが実行されるようになっていて、クリックした要素がaタグだった場合は規定の処理をストップして（`e.preventDefault();`）、ブラウザを自分で立ち上げています。リンクは、aタグのhrefを読みにいっています。

`window.open`でも動きますが、アプリ内でハンドリングするために`Ionic Native`にある`In App Browser`を用いて実装しています。なお、普通にブラウザでクリックした場合、`In App Browser`の代わりに`window.open`が立ち上がってくれます。

また、イベント登録が残ったままだとずっとブラウザは監視を続けますので（メモリを使うので）、ページを離脱するタイミングで自動的に実行される`ionViewDidLeave()`メソッド内で、登録したイベントの削除を行っています。

ちなみに、`app.component.ts`でbodyタグに対してイベント監視をかけてしまうという手抜きなやり方もあります。別にそれほどでかいデメリットはないのですが、予想外のaタグのハンドリングが必要な時などに困りますのであまりおすすめではないですｗ

それでは、また。

---

`public linkListener`の型付けどうしたらいいのかコメントいただけますと喜びます。
CHIRIMEN for Raspberry Pi 3 におけるセキュリティーエラーへの対処方法

# CHIRIMEN for Raspberry Pi 3 におけるセキュリティーエラーへの対処方法

## 概要

CHIRIMEN for Raspberry Pi 3 を使っていて**「あれ？exampleが動かない！」**というときに試してください。

## 対象Version

Ver. 2017.10.17

## 原因はセキュリティーエラーかも?

CHIRIMEN for Raspberry Pi 3 では、下図のようにブラウザからPolyfill経由でRaspberry Pi 3（以下「Raspi3」）上のサーバへWebSocket経由で通信することで、GPIOやI2Cへのアクセスを行います。

![architecture](http://gc.dfm.lrv.jp/0.secerror/architecture.png)

WebSocketでアクセスするサーバドメインは`wss://localhost:33330`ですが、ここで利用しているSSL証明書が自己署名証明書のため、ブラウザがセキュリティエラーでアクセスをブロックすることがあります。

セキュリティーエラーにようるアクセスブロックは下記手順で確認できます。

**1.デベロッパーツールを起動**

ブラウザの画面でマウスを右クリックするとコンテキストメニューが表示されます。
ここで、「検証」を選びます。

![コンテキストメニュー](http://gc.dfm.lrv.jp/0.secerror/p1.png)

するとデベロッパーツールが起動します。

**2.デベロッパーツール画面でConsoleを確認**

デベロッパーツールの「Console」タブを見て下記のようなエラー（`WebSocket polyfill.js:xx connection to 'wss://localhost:33330' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE`）が出ていたらセキュリティーエラーによるアクセスブロックが発生しています。

![セキュリティーエラーの確認](http://gc.dfm.lrv.jp/0.secerror/p2.png)

## セキュリティーエラーへの対処方法

上記のようなセキュリティエラーが出たら、ブラウザから `https://localhost:33330`へアクセスしてみてください。
下記のようなエラー画面が表示されるはずです。

![config-3](http://gc.dfm.lrv.jp/0.sdcard/securityerror-1.png)

ここで、`詳細設定`をクリックしてください。

次の画面で`localhostにアクセスする(安全ではありません)`をクリックしてください。(その後画面は変わりません)

![config-3](http://gc.dfm.lrv.jp/0.sdcard/securityerror-2.png)

これで、`wss://localhost:33330` へアクセスできるようになったはずです。
再度 examples を実行してみて、正常に動作するか確認してみてください。
.NET4.7 + WPFでスタイラス・タッチが効かなくなる問題の情報まとめ

## https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2017/09/13/wpfnetframework47/
>.NET Framework 4.7上で実行している WPF アプリケーションで、タッチ操作を繰り返すと、タッチ操作に反応しなくなる。

>.NET Framework 4.7 をインストールした環境で、WPF の ComboBox コントロールのドロップダウンリストを、タッチ(またはスタイラス)により繰り返し開閉していると、ドロップダウンリスト内の項目をタッチ操作で選択できなくなる現象が確認されています。

>ComboBox 以外にも、Menu など、動作時に内部でウインドウを作成して利用するコントロールの操作で同様の現象が発生する可能性があります。
 
>問題が発生するまでのタッチやスタイラスの操作回数は決まっていませんが、アプリケーション プロセスを実行起動してから終了するまでの間の操作が累積して発生することがわかっており、その回数はおよそ 50 回から 100 回程度です。

>本問題は WPF が管理しているタッチ・スタイラスデバイスの情報に不整合が生じることが原因であり、.NET Framework 4.7 のみで発生する問題です。

## https://stackoverflow.com/questions/45721368/wpf-net-app-crashes-combobox-and-menu-events-not-fired-on-tablets-with-windows

> WPF .NET app crashes, ComboBox and Menu events not fired on Tablets with Windows 10 Creators Update, .NET 4.7 or KB4034658



## https://github.com/Microsoft/dotnet/issues/448
> .NET 4.7 - WPF - ComboBox and ContextMenu click events not fired - Pen does not work reliable with tablets #448

> Hey, i already thought this issue tracker is absolutely useless.
> No response from any developer of .NET, but at least now one from a pained WPF app developer.
> 
> I have not really found a solution for this. No idea what MS is doing with their updates and "improvements", to me it seems they absolutely don't care about WPF apps and tablets.
> Some links on this issue from me and others:
> https://stackoverflow.com/questions/45721368/wpf-net-app-crashes-combobox-and-menu-events-not-fired-on-tablets-with-windows
> https://stackoverflow.com/questions/46049673/wpf-touch-application-partially-freezes-on-net-framework-4-7
> https://connect.microsoft.com/VisualStudio/Feedback/Details/3139096
> https://connect.microsoft.com/VisualStudio/Feedback/Details/3139101
> https://connect.microsoft.com/VisualStudio/Feedback/Details/3139882
> 
> I can only encourage you to report the error to MS in the hope that they will fix it some time.