OmniAICreator/Qiita-1.07M huggingface dataset:
【LINQ】Sum()でOverFlowExceptionが発生

LINQのSum()はOverFlowExceptionが発生することが有りますので、doubleやdecimalなど適切な範囲を持つ数値型を使いましょう、というお話。


```C#
var testList1 = new List<int>() { 1, 2147483647 };
//Sumでは型の範囲を超えるとOverflowExceptionが発生
//var sum = testList1.Sum();
//Console.WriteLine("sum = " + sum);

//AggregateすればOverflowExceptionは発生しない。
var aggregate = testList1.Aggregate((sum1, sum2) => sum1 + sum2);
//但し、aggregate = -2147483648になってしまう。
Console.WriteLine("aggregate = " + aggregate); 

var doubleSum = testList1.Select(a => (double)a).Sum();
Console.WriteLine("doubleSum = " + doubleSum);//期待通りdoubleSum = 2147483648

var decimalSum = testList1.Select(a => (decimal)a).Sum();
Console.WriteLine("decimalSum = " + decimalSum);//期待通りdecimalSum = 2147483648

```

事の発端はOpenCVSharpでcontour(OpenCVSharp.Point[])の座標計算でした。
以下の計算をしたところOverFlowExceptionが発生しました。

```C#
List<OpenCvSharp.Point> points = GetPoints();
//OverFlowExceptionが発生
points.Select(p => p.X * p.X * p.X - p.X * p.Y * p.Y).Sum();
```

上のコードは以下数式を演算しようとしました。


```math
\sum_{i=1}^{n}(x_i^3 - x_iy_i^2)
```

OpenCVSharp.PointのXとYはint型の為、上の計算をintで実行してOverFlowExceptionが発生しました。
渡したパラメータがたまたまintの桁あふれが起きる値で気付けました。
こういった計算で意識せずに桁あふれとか怖いですね。




```C#

List<OpenCvSharp.Point> points = GetPoints();
//計算結果が欲しいだけなら
var total = points.Select(p => (double)p.X * (double)p.X * (double)p.X - (double)p.X * (double)p.Y * (double)p.Y).Sum();

//そもそも演算中はdouble型のPoint2dを使ったほうがいいのでは
var toDouble = points.Select(a => new OpenCvSharp.Point2d(a.X,a.Y);
```

[これ](https://stackoverflow.com/questions/11033777/linq-sum-overflowexception)とか[これ](https://social.msdn.microsoft.com/Forums/vstudio/en-US/17f7d974-0c40-45c7-805a-e300032046ee/overflowexception-with-ienumerablesum-but-not-with-a-foreach-loop?forum=csharpgeneral)は似たような悩みでしょうか。
ずんだのハロウィン問題 Go編

ずんだのハロウィン問題 Ruby編
https://qiita.com/tbpgr/items/1f2ed0e14e5d94775963

## ルール
* 入力として "trick", "treat", "sushi", "poyayou", "tamakatsu" がランダムに与えられる
* 入力をそのまま標準出力する
* 入力が "trick" または "treat" だったら "happy halloween" と標準出力する
* 入力が "trick" または "treat" ではなかったら "sleepy" と標準出力する

## プログラム(Go)

zunda.go

```go
package main

import (
	"fmt"
	"io"
	"os"
)

var writer io.Writer = os.Stdout

func main() {
	var s string
	fmt.Scan(&s)
	Halloween(s)
}

func Halloween(s string) {
	fmt.Println(s)
	switch s {
	case "trick", "treat":
		fmt.Fprint(writer, "happy halloween")
	default:
		fmt.Fprint(writer, "sleepy")
	}
}
```

zunda_test.go

```go
package main

import (
	"bytes"
	"testing"
)

var buffer *bytes.Buffer

func TestHalloween(t *testing.T) {
	buffer = &bytes.Buffer{}
	writer = buffer

	Halloween("trick")
	if buffer.String() != "happy halloween" {
		t.Fail()
	}

	buffer.Reset()
	Halloween("treat")
	if buffer.String() != "happy halloween" {
		t.Fail()
	}

	buffer.Reset()
	Halloween("sushi")
	if buffer.String() != "sleepy" {
		t.Fail()
	}

	buffer.Reset()
	Halloween("poyayou")
	if buffer.String() != "sleepy" {
		t.Fail()
	}

	buffer.Reset()
	Halloween("tamakatsu")
	if buffer.String() != "sleepy" {
		t.Fail()
	}
}
```

## 出力例

```bash
$ go run main.go
trick
happy halloween

$ go run main.go
poyayou
sleepy

$ go test -v
=== RUN   TestHalloween
trick
treat
sushi
poyayou
tamakatsu
--- PASS: TestHalloween (0.00s)
PASS
ok  	_/home/yukpiz/labo/temp/zunda	0.002s
```


* [ずんだ問題まとめ - Qiita](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)
既存アプリにGoogle Play App Signingを対応させてハマったこと

# 概要

`「App Signing対応してみてGoogle Play上は有効になったはずであるがアップロード鍵が無い」`
という課題に対応していくお話です。

## Google Play App Signingとは

https://developer.android.com/studio/publish/app-signing

上記公式ドキュメントであるように、Androidアプリの署名に使っていた鍵ファイルを紛失したりすると2度と更新できなくなるので、
Google Play App Signing を使用してGoogleに署名する鍵を預けましょうという仕組み。
Androidアプリ開発者はGoogle Playへアップロードするアップロード鍵を管理してそちらで署名しアップロードすることになる。

![スクリーンショット 2018-10-31 15.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/20943/61ced8a2-7b0d-5870-d810-bc2af02eed0b.png)


メリットとしては、アップロード キーを失くしたり、キーが侵害されたりした場合は、Google に連絡して古いアップロード キーを取り消し、新しいキーを生成してもらうというリカバリ対応が取れることになる


## やってみたこと

https://support.google.com/googleplay/android-developer/answer/9842756

上記Googleのドキュメントを参考に既存Androidアプリを対応していく
私が各ステップを実施していった結果を書いてみる

#### ステップ 1: プログラムに登録する

これは問題無い。そのままボタンをクリックするだけであった。

#### ステップ 2: 元の鍵を Google に送信してアップロード鍵を作成する

ここのステップは、元々使っていたkeystoreファイルをGoogle Playに登録する手順です。
具体的には keystoreファイルからPEPKツールを用いて秘密鍵を生成しそれを登録する
アップロードまで問題なく成功！

#### ステップ 3: キーストアを更新する

これは省略可能なのでスキップする


#### ステップ 4: 次のアプリの更新にアップロード鍵で署名する

ここで問題が発生する

GoogleのドキュメントやQiitaで記載されている「アップロード鍵」なるものがどうやって入手出来るかわからない

ステップ2完了後、Google Play Consoleのアプリ署名の画面は、「Google Play App Signing が有効です」と出て変化が無い

![スクリーンショット 2018-10-31 15.33.38.png](https://qiita-image-store.s3.amazonaws.com/0/20943/e503c873-f611-56f4-9adb-3c4083625e59.png)

* アプリへの署名証明書
* アップロード証明書

がDL可能なのでこれを利用するのかと色々やってみるがうまくいかない


##### NGだったこと

`upload_cert.der` からkeystoreを生成してそれでアプリを署名するんだ！ みたいなWeb上の記載があるが何をやってもうまくいかない

```
keytool -importcert -file upload_cert.der -keystore <keystorefile> -alias <alias>
```

とか何とかしてもダメでした。そもそもkeystoreにentryが出来ない。出来上がったkeystoreをlistしてみて確認した

```
$ keytool -list -v -keystor <keystorefile> 
別名: <alias>
作成日: 2018/10/31
エントリ・タイプ: trustedCertEntry

所有者: CN=********
発行者: CN=********
シリアル番号: ********
有効期間の開始日: Mon Aug 01 10:00:00 JST 2018終了日: Fri Aug 01 10:00:00 JST 2036
証明書のフィンガプリント:
	 MD5:  ********
	 SHA1: ********
	 SHA256: ********
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3

*******************************************
{何もなさげ}
*******************************************
```

## 結果として

上記ステップ2完了後の証明書のフィンガープリント画面ですが良く見ると、
「アプリへの署名証明書」と「アップロード証明書」の *フィンガープリントの内容が同じ* である。
このことから

`アップロード鍵を登録する過程がスキップされて、アップロード鍵はアプリ署名鍵と同じもので設定されている`
`アップロード鍵 = アプリ署名鍵`

という仮説を立てた

<img width="761" alt="スクリーンショット 2018-10-31 17.25.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/20943/30238975-6ade-c0f5-9534-0758ee28eb5a.png">


#### 検証

もともとのアプリ証明書でアプリを署名してビルドして登録したところうまく行った。
このことから上記仮説は合っているではないかと考える。

### なぜすぐに理解出来なかったのか？
既存アプリにApp Signingを登録させる過程が最近変わったのか、アップロード鍵を登録するステップが無いように見える。
そのため、最終的に何をどうしたら良いのか分からない状態におちいりやすい。
また、 `アップロード鍵=アプリ署名鍵` となったとするとビルドスクリプトの変更は無く、本当にApp Signingが有効になっているか実感出来ない点もちょっとつらいところ


# 参考

【Android】Google Play App Signingのススメ
https://qiita.com/rkowase/items/90cdc4e8c6fc449d8276

[Android] アプリを Google Play に公開、apkファイルの作成
https://akira-watson.com/android/apk.html
SpringBoot + Mybatis 起動時にエラー

## 環境
- Windows10
- Eclipse 4.8
- SpringBoot 1.5.3
- Maven 3.5.4
- Mybatis3

Eclipseにて `実行→SpringBootアプリケーション` を実施したところ、
下記エラーが発生しました。

## エラー抜粋
```
***************************
APPLICATION FAILED TO START
***************************

Description:
Parameter 0 of constructor in hoge.fuga.PiyoRepositoryImpl required a bean of type 'hoge.fuga.PiyoMapper' that could not be found.


Action:
Consider defining a bean of type 'hoge.fuga.PiyoMapper' in your configuration.
```

## 原因
Mapperが見つけられなかったようです。
@MapperScanでMapperを読み込ませるのを忘れていました。

## 対応
@MapperScanを定義しました。

```

@SpringBootApplication
@MapperScan(basePackages = "hoge.fuga") // ←Mapperクラスがあるpackageを設定
public class DemoApplication {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(DemoApplication.class, args);
	}

}
```


下記サイトの `Mapperの自動検出` の項目にかかれているいずれかの対応が必要かと思います。
http://www.mybatis.org/spring/ja/mappers.html
A Tour of Go解答めも

A Tour Of Go
https://go-tour-jp.appspot.com/

解けた問題だけ。

# Exercise: Maps

```exercise-map.go
package main

import (
	"strings"
	"golang.org/x/tour/wc"
)

func WordCount(s string) map[string]int {
	wordMap := map[string]int{}
	splitWords := strings.Fields(s)
	for i := range splitWords {
		elem, ok := wordMap[splitWords[i]]
		if ok {
			wordMap[splitWords[i]] = elem + 1
		} else {
			wordMap[splitWords[i]] = 1
		}
	}
	return wordMap
}

func main() {
	wc.Test(WordCount)
}

```
テストコードの Timecop.freeze の戻し忘れで Devise に関係するテストが落ちてた

# 何が起きたか

テスト中に Devise.gem の `active_for_authentication?` ([source](https://github.com/plataformatec/devise/blob/715192a7709a4c02127afb067e66230061b82cf2/lib/devise/models/confirmable.rb#L144))がなぜか true になってしまう問題が発生。ログインできないのに認証されているように振る舞い、テストが落ちた。

# 原因

`active_for_authentication?` が呼んでる `confirmation_period_valid?` ([source](https://github.com/plataformatec/devise/blob/715192a7709a4c02127afb067e66230061b82cf2/lib/devise/models/confirmable.rb#L213))が変な動きをしていることがわかった。

```ruby:device/lib/devise/models/confirmable.rb
def confirmation_period_valid?
  self.class.allow_unconfirmed_access_for.nil? || (confirmation_sent_at && confirmation_sent_at.utc >= self.class.allow_unconfirmed_access_for.ago)
end
```

デフォルトだと `allow_unconfirmed_access_for` が 0 seconds になっててかならず `false` がかえるんだけど、 `Timecop.freeze` することで `confirmation_sent_at.utc >= self.class.allow_unconfirmed_access_for.ago` が 0 seconds でも true を返すようになってた。

# 対策

`Timecop.freeze` したあとは `Timecop.return` する

```ruby:spec_helper.rb
RSpec.configure do |config|
  config.after(:all) do
    Timecop.return
  end
end
```
って書いちゃっても良いと思う。もしくは safe_mode をオンにしてブロックなしで使えなくする。

cf: https://github.com/travisjeffery/timecop
Homebrewでインストールできるオススメパッケージ

## 環境

- OS：macOS Mojave 10.14

## オススメパッケージ一覧

### PlantUML(UML生成)

https://qiita.com/uhooi/items/7f102e0f546b477f0ad8

### Git(バージョン管理ツール)

### git filter-repo(Git履歴編集)

### tig(GitのCUIクライアント)

https://qiita.com/uhooi/items/d1300f43f468341fcdc6

### gh(GitHub操作)

https://cli.github.com/

`hub` より `gh` を使うのがよさそうです。

### hub(GitHub操作)

https://github.com/github/hub

### coreutils(GNUのコマンド群)

### bash-completion(補完強化)

`make` コマンドの補完などが有効になります。

`.bashrc` で `/usr/local/etc/bash_completion` を読み込みます。

```bash:.bashrc
if [ "$(uname)" == 'Darwin' ]; then
  source /usr/local/etc/bash_completion
fi
```

### ranger(ファイラー)

https://github.com/ranger/ranger

### Neovim(テキストエディタ)

https://qiita.com/uhooi/items/8a023c24c004ec0c8b84

### Graphviz(グラフ出力)

https://qiita.com/uhooi/items/83e70e32d5bd7f12af8a#graphvizのインストール

### fontforge(フォント作成)

### Mint(Swift製CLIツール管理ツール）

https://qiita.com/uhooi/items/6a41a623b13f6ef4ddf0

### nodebrew(Node.jsバージョン管理ツール)

https://qiita.com/uhooi/items/1fd481bfaf1459e29f6a

### npm(Node.jsパッケージ管理ツール)

### pyenv-virtualenv(Python仮想環境)

https://qiita.com/uhooi/items/b2f3a121b2e9dac6a256#pyenv-virtualenvのインストール

### jEnv(Java仮想環境)

https://qiita.com/uhooi/items/9a6747084bcfd4df07a6

### rbenv(Ruby仮想環境)

https://qiita.com/uhooi/items/3ff6f2747036189f649b

### tree(フォルダ構成をツリー形式で出力)

### nkf(文字コード・改行コード変換)

### cloc(ソースコード行数カウント)

https://github.com/AlDanial/cloc

### mas(App Storeアプリ管理)

### FFmpeg(音声・動画変換)

https://qiita.com/uhooi/items/dacd8cb6eede97b0d1b0#ffmpegのインストール

### ImageMagick(画像変換)

https://qiita.com/uhooi/items/26b944f6908351d41bf2

私はSVGをPNGに変換するときに使います。

### Ghostscript(PostScript・PDFインタープリタ)

https://www.ghostscript.com/

### StyLua(Luaリンター)

https://github.com/JohnnyMorganz/StyLua

### RedPen(文書校正)

### sl(ジョークコマンド)
vagrant box addでエラーが出る時

# 入力

```bash
$ vagrant box add ubuntu/trusty64
```

# エラー文

```bash
The box 'ubuntu/trusty64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Vagrant Cloud, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://vagrantcloud.com/ubuntu/trusty64"]
Error: The requested URL returned error: 401 Unauthorized
```

# 対処法

vagrant cloudにログインしてからbox add

```bash
vagrant login # username password description を聞かれるので入力する

box add ~ # エラーなくインストールが始まる
```
atcoder ABC69 C問題

簡単なグラフ探索の問題だったが、グラフの作成の仕方が汚かったので、メモしておく。(良い方法があったら教えて欲しいです)

https://beta.atcoder.jp/contests/abc068/tasks/arc079_a

問題は、たくさんの島が辺で繋がっており、島1から島2まで2回までの移動でいけるかを判定する問題だった。なので、解法は、グラフを作成して、dfsをしようと考えた。
グラフは、今回辺に重さがなかったので、ArrayList<ArrayList>>で作ろうと思った。実装は下のようにした。

```java

map = new ArrayList<ArrayList<Integer>>(200001);
 
		for(int i = 0;i <200000;i++){				//初期化
			ArrayList<Integer> set = new ArrayList<Integer>();
			set.add(0);
			map.add(set);
		}
 
		for(int  i = 0;i < M;i++){             //グラフ作成
			int a = sc.nextInt();
			int b = sc.nextInt();
			map.get(a).add(b);
		}

```

実際、これですんなり通ったが、グラフの作り方が汚いと思ったので、メモした。(良い方法があったら教えて欲しいです)
JSTQB 認定テスト技術者資格 Foundation Level試験合格

# TL;DR

- JSTQB 認定テスト技術者資格 Foundation Level試験に合格しました！
- 受験の動機など
- 勉強方法は、シラバスと教科書だけで十分

※ 本記事は、2018/10/19に[弊社スタッフブログ](https://www.northtorch.co.jp/archives/407)に投稿した記事をQiitaに転載しています。

# JSTQB 認定テスト技術者資格 Foundation Level試験

去る8/25(土)に、JSTQB 認定テスト技術者資格 Foundation Level試験を受験していました。  
この度、試験結果がホームページにて公開され、無事合格しました。  

## 試験について

テスト技術者試験は、[JSTQBのページ](http://jstqb.jp/)によれば、下記2つのレベルに分かれています。  

- Advanced Level
- Foundation Level

今回私が受験したのは、初級編ともいうべき、「Foundation Level」です。  
シラバスによると、その位置づけは、下記の通りです。

> Foundation Level の資格認定はソフトウェアのテスト作業に関与する全ての人を対象としている。  
> これにはテスト担当者、テストアナリスト、テストエンジニア、テストコンサルタント、テストマネージャ、ユーザ受け入れテスト担当者、およびソフトウェア開発者の役割を持つ人々が含まれる。  
> この Foundation Level の資格認定はソフトウェアテストについて基本的な理解を望むプロジェクトマネージャ、品質管理者、ソフトウェア開発マネージャ、ビジネスアナリスト、IT 部門長
および経営コンサルタントのような人にも適切である。  
> Foundation Level 認定資格の保持者はソフトウェアテスト資格での上位レベルに進むことが可能である。   

問題の内容も、テストに関する極めて基本的な用語や概念だけで、本業としてシステム開発を行っていれば、常識的な内容ばかりです。  

## 受験の動機 

当該試験について知ったのは、ちょうど前職を辞めた後、現在の会社に参画したタイミングでした。  
参画した段階でのNorth Torch株式会社は技術者が自分一人という状況でしたので、自分の仕事の品質がそのまま会社の仕事の品質になります。  
これは結構怖いことで、自分の技術力を総合的に高める必要性を強く感じました。

それまで開発したソフトウェアやシステムについてもテストを行っていなかったわけではないのですが、独学の域を出ていませんでした。  
本試験を知り、一度きちんと体系化した知識として勉強してみよう、と思い立ったのがきっかけでした。  

ただし、受験料が2万円くらいしますので、会社が受験料を補助してくれなければ、諦めていたように思います。

## 勉強方法

ホームページで公開されているシラバスの読み込みと、下記の書籍を購入し、勉強しました。  

- [ソフトウェアテスト教科書 JSTQB Foundation 第3版 (amazon)](https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-JSTQB-Foundation-%E7%AC%AC3%E7%89%88-%E5%A4%A7%E8%A5%BF/dp/4798124699/)

システム開発に従事していれば、概念として目新しいものはほとんどありません。  
メインの勉強内容は、下記のようなものでした。  

- 自分の中の概念とそれに対するJSTQB上の用語の対応を記憶
- ISO関連の内容をざっと記憶

## 実際の試験について雑感

シラバスの読み込みおよび教科書の問題を繰り返し解いていれば、それほど苦戦しないと思います。  
個人的には、受験会場内の他の受験者の方が、年齢も性別もバラバラでした。  
どのような層が、どのような動機で受験されていたのか、ちょっと気になりました。  

# 参照

- [JSTQBのページ](http://jstqb.jp/)
AzureのApplication Gatewayを使ってリバースプロキシを構築した話

# はじめに
* とあるアプリケーションをHTTPS化するのにリバースプロキシを構築することになったので手順をメモ:writing_hand:

# 事前準備
* Azureアカウント

# 参考資料
* 以下の先生の記事を参考しながら、進めます。先生に感謝。

> **AzureのサービスでARRを構築する**

> * https://qiita.com/papeMK2/items/3eef4c3075828a02e831

# 作業の流れ
1. 証明書(pfxファイル)の作成
2. Application Gatewayの作成

## 【手順1】証明書(pfxファイル)の作成
* 以下手順に従い、証明書（pfxファイル）を作成する

> **opensslでオレオレ証明書（pfxファイル）を作成した話**

> * https://qiita.com/ttoori-ttoori/items/f756a1baabda6359995d


## 【手順2】Application Gatewayの作成
* 以下手順に従い、AzureのポータルからAppliation Gatewayを作成する

> **AzureのサービスでARRを構築する**

> * https://qiita.com/papeMK2/items/3eef4c3075828a02e831

-
> **Note：** 
> 最新の状況では、リスナー、バックエンド、ルールは初期設定から自動生成された。
> 更新時には、時間がかかる（エラーが出たりもする）ので気長に待つべし。


# まとめ
* Azureポータルから簡単にリバースプロキシを構築できました！
* nginxとかapacheとかIISとか立てなくてもPaaSベースでできるのは嬉しい。
* ただ、Let's Encryptとのインテグレーションはないので、そのあたりはどうすべきか。（nginx、apache、IISなら証明書自動更新とかもできちゃうので。）
Homebrewのセットアップ&操作方法

## 「Homebrew」とは？

MacのCUIアプリ用パッケージ管理ツールです。

## 環境

- OS：macOS Mojave 10.14
- Homebrew：1.6.6

## セットアップ

### Xcodeのインストール

App StoreからXcodeをインストールします。

### Command Line Developer Toolsのインストール

ターミナルで以下を実行し、Command Line Developer Toolsをインストールします。

```shell-session
$ xcode-select --install
```

### Homebrewのインストール

ターミナルで以下を実行するのみです。

```shell-session
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 警告の解消

ターミナルで以下を実行すると、状況に応じて警告が表示されます。

```shell-session
$ brew doctor
```

表示される警告の指示に従い、全て解消させます。
以下が出力すればOKです。

```
Your system is ready to brew.
```

## 操作方法

### バージョンの確認

```shell-session
$ brew --version
```

### Homebrewの更新

```shell-session
$ brew update
```

### Homebrewに問題がないか調べる

```shell-session
$ brew doctor
```

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

```shell-session
$ brew install {パッケージ名}
```

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

```shell-session
$ brew uninstall {パッケージ名}
```

### パッケージの更新

先に `brew doctor` `brew upgrade` を実行するのが望ましいです。

```shell-session
$ brew upgrade {パッケージ名}
```

### Homebrew+全パッケージの更新

```shell-session
$ brew upgrade
```

### パッケージの古いバージョンを削除

```shell-session
$ brew cleanup {パッケージ名}
```

※ `brew update` または `brew upgrade` を実行したとき、古いバージョンが上書きされずに残ってしまうため

### インストールされているパッケージの一覧を表示

```shell-session
$ brew list
```

### パッケージの情報を表示する

```shell-session
$ brew info {パッケージ名}
```

### インストール可能なパッケージを検索する

```shell-session
$ brew search {検索文字列}
```

## 参考リンク

- [macOS 用パッケージマネージャー — macOS 用パッケージマネージャー](http://brew.sh/index_ja.html)
- [Installation — Homebrew Documentation](https://docs.brew.sh/Installation)
- [brewのupdateとupgradeの違い - Qiita](https://qiita.com/okhrn/items/aa71b066a525456550c0)
Skitch使ってて保存できなくて焦った話(for Mac)

こんにちは。私です。
Qiita投稿時のスクショや手順書作成時って何使われてますか？

##Skitch,使ってますか？
私は先輩から教えてもらってSkitchで編集してQiita投稿時に使用してます。
使いやすくてわかりやすい。手順書作成にはもってこいですね！

<img width="215" alt="スクリーンショット 2018-10-31 午後4.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/150dc3a2-3a26-9641-40bc-54ae7cd57c45.png">

##こんなことができます
選択範囲の指定や文字入力、矢印の挿入が時間をかけずに簡単できるので資料作成にもってこいなんですよね。
<img width="801" alt="スクリーンショット 2018-10-31 午後4.33.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/39a4fdbc-dc6c-30f8-f55f-2f84f5e61dca.png">

##よしできた保存しよう
スクショ、資料ができたら伝家の宝刀 [Ctrl+s] で保存しようとするじゃないですか。
押しても保存された形跡がないんですよ…。
「保存しました！」とか「名前をつけて保存？」といったおきまりの言葉が出てこない…

##さてはお主保存できていないな？
OK,OK...コマンドは諦めよう、きっと使えないんだね。
右上のタブから保存しようじゃないか…。

<img width="677" alt="201.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/b4397667-1bfe-a51f-1170-636ffe5fcbdf.png">

いやいや…え？？

##え、Sktchって保存できないの？
保存のコマンド非活性だし保存できんやん！なんやこれ！なんでなんや！
…失礼いたしました。取り乱しました。

##保存じゃなくてエスケープ
伝家の宝刀 [Ctrl+s] の保存でなく [Ctrl+e] のエクスポートで保存するんですって！
もちろんタブからも選択できます。
<img width="677" alt="202.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/8364f61f-ed5b-6373-4fac-35fd89f95950.png">

##待ちに待った名前をつけて保存
名前をつけて保存及び保存場所の指定ができる！！
Skitchは [Ctrl+e] で保存！！！ 
<img width="816" alt="203.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/82c6b334-f1d4-f84d-d9f9-c1b6104f478e.png">

##まとめ
いつもと違う保存方法だとちょっと焦りますね。
Skitchは [Ctrl+e] で保存。肝に銘じましょう。
ではみなさま、良い資料作りライフを٩( 'ω' )و



##余談
作ってる時何が何だか分からなくなって頭おかしくなるかと思った。
<img width="955" alt="スクリーンショット 2018-10-31 午後4.47.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/50b553a9-9341-717c-e5fe-264704d0144c.png">

##2018.11.01追記
とても有力な情報をいただいた…。
>ウィンドウ下にある「PNG」のアイコンをFinderにドラッグ&ドロップすると注釈を入れた画像が保存できますよー。

…なん…ですと…。。

###やってみた
![401.gif](https://qiita-image-store.s3.amazonaws.com/0/217071/0c4d923d-da96-a01e-059e-bd86049a9e8c.gif)


できた！！！(gifの貼り付け初めてで拙いgifになってますがご了承ください…)
opensslでオレオレ証明書（pfxファイル）を作成した話

# はじめに
* HTTPS化するのに証明書が必要になったが、Windowsでpfxファイルを作成するのに苦労したので手順をメモ:writing_hand:

# 事前準備
* クライアントPC（Windows）

# 参考資料
* 以下の先生の記事を参考しながら、進めます。先生に感謝。

> **オレオレ証明書をopensslで作る（詳細版）**

> * https://ozuma.hatenablog.jp/entry/20130511/1368284304

# 作業の流れ
1. opensslのインストール
2. 秘密鍵(Private Key)の作成
3. 証明書署名要求(CSR : Certificate Signing Request)の作成
4. サーバ証明書の作成
5. pfxファイルのエクスポート

## 【手順1】opensslのインストール
* 以下URLを参考にインストール

> **Win32 opensslのインストール手順**

> * https://rms-digicert.ne.jp/howto/basis/openssl_on_windows.html

> **Shining Light Productions (opensslのダウンロード)**

> * http://slproweb.com/products/Win32OpenSSL.html

## 【手順2】秘密鍵(Private Key)の作成
* 以下のコマンドを順に実行

```powershell
# 秘密鍵(Private Key)の作成
$ openssl genrsa 2048 > server.key
```

## 【手順3】証明書署名要求(CSR : Certificate Signing Request)の作成
* 以下のコマンドを順に実行

```powershell
# 証明書署名要求(CSR : Certificate Signing Request)の作成
$ openssl req -new -key server.key > server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

> **Note：**本当ならちゃんと入力すべきだが、オレオレ証明書の場合は、全てENTERで。


## 【手順4】サーバ証明書の作成
* 以下のコマンドを順に実行

```powershell
# サーバ証明書の作成
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Getting Private key
```

## 【手順5】pfxファイルのエクスポート
* 以下のコマンドを順に実行

```powershell
# pfxファイルのエクスポート
$ openssl pkcs12 -export -inkey server.key -in server.cer -out server.pfx
```

# まとめ
* オレオレ証明書ファイル（pfxファイル）ができた！
* opensslの使い方はたくさん出てくるが、pfxファイルまで作成する手順に辿り着けなかったので備忘メモ。
* っていうか、この面倒な手順なんなの？？、、、と思っていたらLet's Encryptなる救世主がいたんですね。オレオレ証明書だとダメな場合もあるので、素直にこっちにすれば良かったかも。
Go言語フレームワークIrisのサンプルみてみた

#Irisを用いたサンプル集をみてみた
[このサイト](https://github.com/iris-contrib/examples)によくまとまっている。
ただし、サーバプログラムのサンプルに対するHTTPリクエストはないので初見だときつかった。
あと、そのままだと動かないコードがちらほら見つかる。
例えば下記のコードはboltDBではなくbboltをインポートしているが、boltを参照するようになっていた。
https://github.com/iris-contrib/examples/pull/35/files



#それぞれのサンプルに簡単な説明を追加するかも
JenkinsでPHPとJavaScriptのコーディング規約違反をGithubのレビューコメントに表示させる

# JenkinsでPHPとJavaScriptのコーディング規約違反をGithubのレビューコメントに表示させる

Githubのプルリクを検知して、ファイル差分のみに静的解析を行い
レビューコメントに表示される処理を実装いたしました。

GithubのAPIでも実装は可能でしたが、
レビューコメントを登録する際のPositionの特定が難しかったのでsaddlerを利用いたしました。

今回結構はまったので、内容を記載いたします。


## 環境(Azure VM)
* ubuntu上にJenkinsを構築しております。
* PHPはインストール済みとなります。

## 今回の設定に必要なツール

* PHPCode_Sniffer (phpの静的解析)
  + PHPの実行環境が構築できていれば問題なくインストールできると思います。
* ESlint(JavaScriptの静的解析)
  + nodeとnpmが利用できれば問題なくインストールできると思います。
* saddler
  + ruby製のgit差分の静的解析結果をgithubのレビューコメントに通知してくれる便利ツール
  + Jenkinsでの設定の記事があまりなかったので記載します。

## saddlerの設定
+ rubyとruby-bundlerが必要なのでない場合はインストールします。
+ 環境に応じて替えてください。

```
$ sudo apt install ruby
$ sudo apt install ruby-bundler
```
+ Gemfileに以下を追記して、インストールしてください。
  + jenkinsの場合、「saddler-reporter-support-git」がないとエラーとなってしまい、ここでつまりました。

```
source "https://rubygems.org"
gem "checkstyle_filter-git"
gem "saddler"
gem "saddler-reporter-github"
gem "saddler-reporter-support-git"
```

## Jenkinsの設定
JenkinのジョブでGithubのプルリクを検知する仕組みを導入します。

ビルドトリガの「GitHub Pull Request Builder」を利用します。
設定方法はわかりやすく書いている記事がいくつかあるので、ここでは割愛します。

+ White listに複数アカウントを設定する場合は、改行区切りで設定できました。

GithubでPullRequestを作成すると、
Github Pull Request Builderをトリガとしたジョブが実行されます。

ビルド時にブランチ名やidなどプルリク情報が変数で利用できますので、
必要な人は[wiki](https://wiki.jenkins.io/display/JENKINS/GitHub+pull+request+builder+plugin)のEnvironment Variablesを確認するといいと思います。

## ビルド作成
+ Github Pull Request Builderで作成したジョブのビルドでシェルの実行を選択して、
以下のシェルを作成しました。

```
#!/bin/bash

# HEADを更新
git fetch

# GitHub Pull Request Builderの設定時に[Create API Token]で取得したtokenを環境変数に設定します。
export GITHUB_ACCESS_TOKEN="[access_token]"

# 対象のブランチから更新があるファイルのみを検出して、コーディング規約違反があればレビューコメントに登録

echo "PHPのコーディング規約違反を通知" 
git diff --name-only --diff-filter=AM origin/${ghprbTargetBranch} \
| grep -e '.php$' \
| xargs phpcs -n --standard=phpcs.xml --report=checkstyle \
| exec checkstyle_filter-git diff origin/${ghprbTargetBranch} \
| exec saddler report \
--require saddler/reporter/github \
--reporter Saddler::Reporter::Github::PullRequestReviewComment

echo "JavaScriptのコーディング規約違反を通知"
git diff --name-only --diff-filter=AM origin/${ghprbTargetBranch} \
| grep -e '.js$' \
| xargs eslint -f checkstyle \
| exec checkstyle_filter-git diff origin/${ghprbTargetBranch} \
| exec saddler report \
--require saddler/reporter/github \
--reporter Saddler::Reporter::Github::PullRequestReviewComment
``` 


ざっくりと書いてしまいましたが、それぞれの細かい設定などは
詳しく書いていただいている記事が多くありますので参考にしていください。

だいぶ便利な機能だと思いますので、レビュアーの負荷が下がることを期待します！
i++と++iの違い

## 概要

前置インクリメント演算子（++i）と後置インクリメント演算子（i++）はどちらもiにi+1の結果を代入する演算子ですが、その違いについてざっくりと説明します。

## 前置インクリメント（++i）

式の値としてインクリメント後、つまりi+1の値を返します。

```c
i = 1;
j = ++i; // jは2
```

## 後置インクリメント（i++）

式の値としてインクリメント前、つまりiの値を返します。

```c
i = 1;
j = i++; // jは1
```

## 補足

`for (int i = 0; i < n; ++i)`
`for (int i = 0; i < n; i++)`

どちらもよく見るforループですが、このように++i, i++が単独で現れ、式の値を使わない場合は動作に関して違いはありません。
また最近のコンパイラでは最適化によって実行速度にも違いがないため、好みの方を使えばいいと思います。
オンプレADとAzureADの連携について

# はじめに

ADとAzureを連携している。
昔はSyncを使っていたが現在はConnectになっている。

https://docs.microsoft.com/ja-jp/azure/active-directory/hybrid/reference-connect-dirsync-deprecated

未だにSyncを使っているところはサポート切れてるので **即確認！**


## 連携がすぐ反映されない件
AD側で設定した場合、AzureADに連携されるまで時間がかかる。（デフォルト30分程度）

すぐに反映確認したい。

`# Start-ADSyncSyncCycle [initial/delta]`

こちらを使用する。

構文としては完全同期か差分同期かを促す構文である。


完全同期:`Start-ADSyncSyncCycle initial`
**初回のみで問題ないです!**


差分同期:`Start-ADSyncSyncCycle delta`
更新した箇所のみ同期されます。


原則差分同期で実施。
完全同期はかなり時間がかかります。

## まとめ

Azureは固有のコマンドが多いのでちょっとメモ書き程度に書いていくことが多いなぁ。。。
Blogやってます。
最近更新できてないのでちゃんと更新しよう。

https://natsuo.jp
続Python備忘録だったり色々

#代数演算子
```python:
+a     #正の数
-a     #負の数
a + b  #加算
a - b  #減算
a * b  #乗算
a / b  #除算
a % b  #aをbで割った余り
a ** b #aのb乗
a // b #切り捨て除算
```

#ビット演算子
```python:
~a     #ビット反転
a & b  #AND(aもbも1のビットが1)
a | b  #OR (aまたはbが1のビットが1)
a ^ b  #XOR(aまたはbが1のビットが1)
a << b #b ビット左シフト
a >> b #b ビット右シフト
```

#代入演算子
```python:
a = b   #aにbを代入する
a += b  #a = a + bと同じ
a -= b  #a = a - bと同じ
a *= b  #a = a * bと同じ
a /= b  #a = a / bと同じ
a %= b  #a = a % bと同じ
a **= b #a = a ** bと同じ
a //= b #a = a // bと同じ
a &= b  #a = a & bと同じ
a |= b  #a = a | bと同じ
a ^= b  #a = a ^ bと同じ
a <<= b #a = a << bと同じ
a >>= b #a = a >> bと同じ
```

#比較演算子
```python:
a == b     #aがbと等しい
a != b     #aがbと異なる
a < b      #aがbよりも小さい
a > b      #aがbよりも大きい
a <= b     #aがb以下である
a >= b     #aがb以上である
a <> b     #aがbと異なる
a is b     #aがbと等しい
a is not b #aがbと異なる
a in b     #aがbに含まれる
a not in b #aがbに含まれない
```

#ブール演算子
```python:
a and b #aもbも真であれば真
a or b  #aまたはbが真であれば真
not a   #aが偽であれば真
```
ansibleが何もしなくなったとおもったら自分のミスだった件

# 概要

ansibleでshellとかcommandとか、touchすらもできなかった。
なぜかわからなかったので、調べた。

# 結論

もともとは、Dry run したくて、以下のオプションをつけて実行していた。


```
--check
```

# 参照

以下のようなメッセージがでていて、どうも、何も実行されない。

```
Conditional result was False
```

よくみるとこんなメッセージもでていた。


```
skipped, running in check mode
```

どうも、おかしいとおもっていたら、`ansible-playbook` 実行時に、 `--check` をつけていたためのようである。
もともと `Dry Run` をしたかったので、完全に自分のミスであるが、はまってしまうとよくわからなくなった。

# 参考情報

- [Check Mode \(“Dry Run”\) — Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_checkmode.html)
- [Ansibleはcheck modeだとshellやcommandは実行されない · さよならインターネット](http://blog.kenjiskywalker.org/blog/2015/01/08/ansible-check-mode/)
herokuでruby 2.3系を動かす

通常通りに`heroku create`でアプリを作成するとHeroku-18というものが入るらしくこやつがruby2.3系に対応していないらしい。

### やったこと
- プロジェクトに`app.json`ファイルを作成して中に`"stack": "heroku-16"`を記述
- curlでherokuのアプリを作成

### コマンド

```
curl -n -X POST https://api.heroku.com/app-setups \
-H "Content-Type:application/json" \
-H "Accept:application/vnd.heroku+json; version=3" \
-d '{"source_blob": { "url":"https://github.com/アップしたいリポジトリ名/tarball/master/"} }'
```

そうするとidがついたresponseが返ってきます。そこからidをいただいて

```
curl -n https://api.heroku.com/app-setups/レスポンスに含まれるid \
-H "Content-Type:application/json" \
-H "Accept:application/vnd.heroku+json; version=3"
```
とします。今回のレスポンスに

```
output_stream_url
```
というのがあるのでそこからdeployのログを追うことができます。

app.jsonファイルを作ってなかったりするとレスポンスのエラーメッセージにファイルがないよと教えてくれるのでわかります。
ruby2.3を使うことは少ないかもしれませんがメモとして残します。
今から始めるProjectEuler

私はプログラミングの練習として、ProjectEulerをやっています。Write Code Everydayのネタとして使っている方もいます。今後挑戦する方のために、始め方をまとめておきます。
#ProjectEulerについて
数学の問題をプログラミングで解いていきます。現在は631問あります（2018/10/31)。使用する言語に制限はありません。数学の知識が必要となり（私は調べながらやっています）、問題を進むごとに難しくなっていきます。アルゴリズムを工夫せずに書くと計算量が多くなり長時間実行が終わらなくなることもあります。効率よく、簡潔に正解を導けるアルゴリズムを考える練習になります。

#Project Eulerの始め方
会員登録をしなくても問題を見ることができますが、会員登録をすると1問ずつ答え合わせができ、その問題についてのフォーラムを見ることができます（英語ですが……）。また、自分がどこまで解いたかの状況も確認でき、実績制度もあります。
まず、公式サイトにアクセスします。
ProjectEuler公式
https://projecteuler.net/


画面右上の「Register」をクリックし、Username,Password,Confirm Passwordを入力し登録します。
![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/295196/77f25c12-a7cc-85e0-7d0c-d615336911dd.png)

登録後サインインして、「Archives」をクリックすると、1問目からの問題リストが開きます。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/295196/bd5828c6-2f91-e9d6-eab8-a53f38a49d62.png)
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/295196/fad50cf6-80f9-56e5-b319-13ac79560505.png)

問題は英語なので、日本語訳は以下のサイトを参考にしてください。
http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler

挑戦する問題を開いて、自分が選択した言語で答えを導きましょう。答えが導けたら、問題のページに入力し答え合わせしましょう。答えがあっているとDifficultyの横のチェックマークがつきます。

#1問目
1問目はこのような問題です。
「10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ」
例として答えを乗せておきます。私はC#でやっているので、このようになりました。

        {
            var Sum = 0;
            for (int i = 0; i < 1000; i++)
            {
                if (i % 3 == 0 || i % 5 == 0) Sum += i;
            }
            label1.Text = "Answer = " + Sum.ToString();
        }

この方法では、答えをラベルに表示させてます。

簡単だと思ったかもしれませんが、2問目は「フィボナッチ数列の項の値が400万以下の, 偶数値の項の総和を求めよ」、3問目は「600851475143 の素因数のうち最大のものを求めよ」ですので、アルゴリズムは思いつくけれどもいかに計算量を減らすかということを考えることになります。

#終わりに
私は計算時間が長くかかってもいいから答えを出せるようにしています。難しいですが、
アルゴリズムを考える練習になります。やってみようと思った方はぜひやってみてください。自分の好きな言語で挑戦できるので力試しにも勉強にも使えます。こだわりがなければ、pythonが楽だと思います。
Android端末でデバッグしようとしたら英語のエラーが出た

こんにちは。私です。
今回も初心者向けであり、私のための備忘録です。

##事の経緯
Android端末で実機デバッグしーましょって実行したのが運の尽き

##見たことがない英語
>Troubleshoot device connection issues.
this guide helps you troubleshoot issues connecting running your app on a physical device .....

以下Assistantに表示された文言
<img width="597" alt="スクリーンショット 2018-10-31 午後3.49.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/5511cce7-70d1-d777-cb6f-f0756f10e46d.png">

##パッと見た感想
なるほど、USB繋がってないんじゃない？って言ってない？
→めちゃくちゃちゃんと刺さってる
　→じゃあ違うねなんだろうね

##ちゃんと調べてみた

実機がUSBデバッグ承認してないんじゃない？
→大正解

Android端末側で開発者オプションが無効化されてました。
じゃあ有効化しようじゃないか！
![01.png](https://qiita-image-store.s3.amazonaws.com/0/217071/b3b9cc25-890a-86c1-243d-52d9a4c4c4e8.png)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/217071/9a71501a-f22e-5050-8e4e-b9f42be50922.png)

![03.png](https://qiita-image-store.s3.amazonaws.com/0/217071/f12b7778-cfd8-2761-e6a7-fa8d896473e2.png)

![04.png](https://qiita-image-store.s3.amazonaws.com/0/217071/65ca4358-b0a8-ff02-fd08-5f2bb5130403.png)


##急な英語の警告はびっくりする
実機デバッグで選択するところに出てこないしなんで！？
ってなりましたが、よくよく考えれば簡単なことでした。
そりゃ許可してなければ実行できんわな。

##まとめ
英語の警告でも慌てふためくことはないので落ち着いて設定を見直しましょう。
開発者向けオプションは知ってればなんのそのなので！

では、みなさま英語に慌てない、良いAndroidライフを……٩( 'ω' )و
ElixirでGoogle APIを使う

ElixirからGoogle APIを使った。
ライブラリがSwaggerをつかってコード生成されてることもあってか使い方が初見殺しなのでメモ残しておく。

具体的なほうがわかりやすいので、Spreadsheetを例にする。

SpreadsheetのAPIを使いたい場合は[google_api_sheets](https://hex.pm/packages/google_api_sheets)を使うことになる。APIごとにgoogle_api_xxxが存在します。

ドキュメントは下記URLで閲覧することができるが、初見はどこからみればいいのか大変わかりづらいです。
https://hexdocs.pm/google_api_sheets/api-reference.html

まず先に、Google Sheetsの開発者ドキュメントを眺めたほうが良いです。
IDの確認方法や必要な概念の説明どが書かれているのでサラッと確認しておくほうが良いです。

* https://developers.google.com/sheets/
* https://developers.google.com/sheets/api/guides/concepts

APIの一覧が確認したいならこちら。

* https://developers.google.com/sheets/api/reference/rest/

このAPIと対応するものが、APIモジュール内で提供されている。
Sheetsの場合は`GoogleApi.Sheets.V4.Api.Spreadsheets`となる。

Spreadsheetで最初によくつかいたくなるのは読み込みだと思う。
読み込みは`spreadsheets.values.get`を用いる。

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get

対応する関数は `sheets_spreadsheets_values_get/4`になる。
https://hexdocs.pm/google_api_sheets/GoogleApi.Sheets.V4.Api.Spreadsheets.html#sheets_spreadsheets_values_get/4

第一引数のConnectionは`GoogleApi.Sheets.V4.Connection`である。API毎にあります。
https://hexdocs.pm/google_api_sheets/GoogleApi.Sheets.V4.Connection.html#content

作成方法は、[new/0](https://hexdocs.pm/google_api_sheets/GoogleApi.Sheets.V4.Connection.html#new/0)や[new/1](https://hexdocs.pm/google_api_sheets/GoogleApi.Sheets.V4.Connection.html#new/1)を使って作ります。

new/1の引数tokenは[Goth](https://github.com/peburrows/goth)を用いて生成することになります。
Gothの詳細は省く。

elixir-google-apiの情報も役に立つと思います。
https://github.com/googleapis/elixir-google-api

# 具体例

configにGothの設定が必要ですが、下記のコードで取得できるはずです。

```elixir
def get() do
  alias GoogleApi.Sheets.V4.Connection
  import GoogleApi.Sheets.V4.Api.Spreadsheets

  {:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/spreadsheets.readonly")
  conn = Connection.new(token.token)  # token.token を渡す点に少し注意
  sheetID = "XXXXX" # 自分で用意してください
  range = "A1:A2000" # A列を20000行まで(2000行までなくても値があるところまでとれる)
  sheets_spreadsheets_values_get(conn, sheetID, "A1:A2000")
end
get()
```
[ASP.net] ソリューションのconfig変換の出力について

自身が忘れるので単なる備忘録

##構成マネージャの追加について

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/50d3beb5-a408-dfdf-185e-a13c6cb35dc9.png)
visual studioでの構成って大体こんな感じになってるよね
いろいろ機能追加してたりするとちょっとだけ違ったりするけどおおよそはこんな感じ

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/755929c8-4cb8-34cb-0bac-2ad594239edc.png)
そしてこの構成マネージャーから追加ができる、と

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/ac457b9a-c0f5-1d71-85cc-04c62736d40e.png)
(ソリューション名のところは白塗りにしました)

「アクティブソリューション構成」の部分でアクティブ時の各ソリューションの設定を変更することができます。
上記画像の例であれば、アクティブソリューションがDebug時に各ソリューションがDebugという構成を基にビルドされるということになります。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/63367b8e-01f5-a526-2c89-3a15e816689d.png)

最後にアクティブソリューションの設定を行っても、各ソリューションにおける設定の変更を行わないといけないですね。

ということで、上記の設定を行った後に各ソリューションのconfigにて右クリック
→「Add Config Transforms」を選択
というところまで行えば各アクティブソリューションに対するconfig変換用の拡張configが追加されます。
ずんだのハロウィン問題 Ruby編

## ルール
* 入力として "trick", "treat", "sushi", "poyayou", "tamakatsu" がランダムに与えられる
* 入力をそのまま標準出力する
* 入力が "trick" または "treat" だったら "happy halloween" と標準出力する
* 入力が "trick" または "treat" ではなかったら "sleepy" と標準出力する

## プログラム(Ruby)
```ruby
input = %w(trick treat sushi poyayou tamakatsu).sample
puts input
puts %w(trick treat).include?(input) ? "happy halloween" : "sleepy"
```

## 出力例
```
trick
happy halloween
```

```
poyayou
sleepy
```

* [ずんだ問題まとめ - Qiita](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)
gitサーバー作る

# 目的

* gitのサーバーをたてて、ローカルリポジトリと同期する。
* ブランチの扱いになれる

全部、https://git-scm.com/doc に書いてある内容だけど、そしゃくのため。。。

## 手順概略

1. ローカルリポジトリを作る
1. コードを書く
1. ローカルリポジトリにコミットする
1. ローカルリポジトリからcloneする形でリモートリポジトリを作る
1. リモートリポジトリをcloneする
1. cloneしたローカルリポジトリにブランチを作る
1. 勝手にリモート追跡ブランチが作られる

## 手順

### 【端末A】ローカルリポジトリの作成～ローカルリポジトリにコードをコミット

```
$ cd /home/nuuuuume
$ mkdir projectA
$ cd projectA
$ git init 
$ vim hello.c
...
$ git add .
$ git commit -m "first commit"
```

これでhello.cがローカルリポジトリに入る

### 【端末A】リモートリポジトリの作成

/var/gitは適当な場所で、フォルダ構成はこの限りではないので適当に読み替えてください。

```
$ cd /var/git
$ mkdir repos
$ cd repos
$ git clone --bare ssh://localhost/home/nuuuuuume/projectA projectA.git
```

### 【端末B】リモートリポジトリをclone

```
$ cd /home/nume
$ git clone ssh://nuuuuume@<端末A>/var/git/repos/projectA.git projectA
$ cd projectA
```
に hello.cがcloneされてるはず。

### 【端末B】ローカルブランチを作ってチェックアウト

```
$ git checkout -b develop
On branch develop
Your branch is up to date with 'origin/develop'.
```
こんな感じになるはず。

リモートブランチというのは存在せず、リモート追跡ブランチというらしい。
サーバーもローカルブランチを持っていて、端末もローカルブランチを持っている。
端末のブランチを push するとリモートにもブランチが作られる。
その互いのブランチをつなぐ役割をするのがリモート追跡ブランチ、というらしい。
端末に develop ブランチがあると、リモート追跡用ブランチは origin/develop などとなるらしい。

頑張ってsvnから切り替えてこ。。。
【最終】時系列解析ライブラリProphet　公式ドキュメント翻訳12（ヘルプ編）

Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。

目次
[1.Prophet公式ドキュメント翻訳（概要＆特徴編)](https://qiita.com/japanesebonobo/items/96868e58d4da42d36807)
[2.Prophet公式ドキュメント翻訳（インストール編)](https://qiita.com/japanesebonobo/items/a7309bc07c59c11bee7b)
[3.Prophet公式ドキュメント翻訳（クイックスタート編）](https://qiita.com/japanesebonobo/items/6f3234adb592f73bafbf)
[4.Prophet公式ドキュメント翻訳（飽和状態の予測編）](https://qiita.com/japanesebonobo/items/9a5a5a13440e90f06f30)
[5.Prophet公式ドキュメント翻訳（トレンドの変化点編）](https://qiita.com/japanesebonobo/items/26cccef8ee9d45006093)
[6.Prophet公式ドキュメント翻訳（周期性・イベント効果・説明変数の追加編）](https://qiita.com/japanesebonobo/items/e674359618a879a49c05)
[7.Prophet公式ドキュメント翻訳（増加し続ける周期性編）](https://qiita.com/japanesebonobo/items/ed02f49ea66eab432af8)
[8.Prophet公式ドキュメント翻訳（誤差の間隔編）](https://qiita.com/japanesebonobo/items/f1acdd4ec1a1d0948553)
[9.Prophet公式ドキュメント翻訳（外れ値編）](https://qiita.com/japanesebonobo/items/4eb36710c689bca80c71)
[10.Prophet公式ドキュメント翻訳（1日単位ではないデータ編）](https://qiita.com/japanesebonobo/items/7062dd300a14bda4f84b)
[11.Prophet公式ドキュメント翻訳（モデルの診断編）](https://qiita.com/japanesebonobo/items/2266729f849868581011)
**12.Prophet公式ドキュメント翻訳（ヘルプ編）**

2018/10/31公開。原文リンクは以下。
・Prophet概要＆特徴：https://facebook.github.io/prophet/
・公式ドキュメント：https://facebook.github.io/prophet/docs/quick_start.html

今回の記事はヘルプ編です。
![スクリーンショット (106).png](https://qiita-image-store.s3.amazonaws.com/0/296645/81c7cee6-330e-35fc-93e1-0de4db1f192d.png)
#ヘルプを得る＆ヘルプする
Prophetは定期的なアップデートは行っていませんが、ユーザのフィードバックに応じてバグを修正したり、機能を追加します。現在はバージョン0.3です。現在、我々は致命的なバグがあることは想定していません。もし発見した場合、[ここ](https://github.com/facebook/prophet/issues)にissueを追加することでバグを報告してください。[ここ](https://github.com/facebook/prophet/issues)はProphetに関する質問をするための場所でもあります。

私たちはユーザの報告や質問を歓迎します。バグを直すことを計画している場合は、その正当性について慎重に議論しなくても構いませんので、どんどん報告してください。

新機能の提案やアップデートをすることに貢献できる場合は、まずissueを立てて私たちとその機能について議論しましょう。プルリクエストを送ることも歓迎します。しかし、そうするよりもissue上で事前に機能について話し合って、お互いの合意がとれてからプルリクエストするほうが、早くリクエストをマージできます。

RとPythonの2つのバージョンで機能に差はありません。しかし、新機能の実装については別々に行われるため、タイミングによっては機能に差があることがあります。
#ドキュメント
今回のドキュメントの大半のページは[Jupyter notebooks](http://jupyter.org/)のソースツリーに基づいた[notebooks](https://github.com/facebook/prophet/tree/master/notebooks)形式で作られています。ドキュメントのコードの変更はそこで行って、我々のコードを改造してみてください。

```
$ cd docs
$ make notebooks
```
[notebooks](https://github.com/facebook/prophet/tree/master/notebooks)上でRのコードを実行したい場合、[rpy2](https://rpy2.bitbucket.io/)を忘れずにインストールしてください。
git初期設定（ssh key作成、色付け、エディタ変更、git logを見やすく）

gitインストールしたら設定していること。
参考になれば幸いです。

## ssh key作成
```bash
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

作成した公開鍵（id_rsa.pub）は、githubなどに登録します。
公開鍵の中身は、cat ~/.ssh/id_rsa.pubなどで確認しましょう。
Macなら、`cat ~/.ssh/id_rsa.pub | pbcopy`で公開鍵の中身をクリップボードにコピーできます。

## ユーザー設定
```bash
$ git config --global user.name "First-name Family-name"
$ git config --global user.email "your_email@example.com"
```

## 自動色付け
```bash
$ git config --global color.diff auto
$ git config --global color.status auto
$ git config --global color.branch auto
```
diff,status,branchコマンドに設定。


## エディタ変更(vim)
```bash
$ git config --global core.editor 'vim -c "set fenc=utf-8"'
```

## UTF-8問題解決設定(※macOS Sierra以前の場合に実施する)
```
$ git config --global core.precomposeunicode true
$ git config --global core.quotepath false
```

## git logを見やすくする
```bash
$ git config --global alias.plog 'log -15 --pretty="format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(cyan)[%an]" --date="format:%Y-%m-%d %H:%M:%S" --no-merges'
```

#### コマンドオプションの説明
- -15  : 最新から15こまでの変更履歴を表示
- --pretty="format: : logのフォーマット指定
 - %C   : 色指定(Color)
 - %h   : コミットの短縮版ハッシュ(Hash)
 - %cd  : コミットした日付(Committer Date)
 - %s   : コミットメッセージの1行目(Subject)
 - %an  : 修正者名(Author Name)
- --date="format: dateのフォーマット
 - %Y   : 年
 - %m   : 月
 - %d   : 日
 - %H   : 時
 - %M   : 分
 - %S   : 秒
- --no-merges   : マージ履歴非表示

#### 確認
`git plog`を実行すると以下のような形式で出力されるようになります。

```
$ git plog
4cb474a 2018-10-31 13:59:17 Add hogehoge.yml   [Zama Kei]
```

## ~/.gitconfigの確認
設定後の~/.gitconfigは、こんな感じになっています。

```
$ cat ~/.gitconfig

[user]
	name = First-name Family-name
	email = your_email@example.com
[color]
	diff = auto
	status = auto
	branch = auto
[core]
	editor = vim -c \"set fenc=utf-8\"
[alias]
	plog = log -15 --pretty=\"format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(cyan)[%an]\" --date=\"format:%Y-%m-%d %H:%M:%S\" --no-merges
```

修正するときは、コマンドを流し直すか、`~/.gitconfig`を直接編集してもOK。

## 参考
- [Gitをインストールしたら真っ先にやっておくべき初期設定](https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3)
- [コミット履歴の閲覧](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)
[Android] Kotlinを使ってSHA-256 暗号化。

以前書いたのはこちらになります。

1．Android Studioで簡単なSHA-1発給。　
https://qiita.com/Dreamwalker/items/5888bfac4bfa65d3d68e


Kotlinで簡単に発給してみました。
今回も難しくないです。簡単でしやすいです。


## 重要なコード。

```kotlin:main.kt
fun sha256(input: String) = hashString("SHA-256", input)

private fun hashString(type: String, input: String): String {
   val HEX_CHARS = "0123456789ABCDEF"
   val bytes = MessageDigest
            .getInstance(type)
            .digest(input.toByteArray())
   val result = StringBuilder(bytes.size * 2)

   bytes.forEach {
        val i = it.toInt()
        result.append(HEX_CHARS[i shr 4 and 0x0f])
        result.append(HEX_CHARS[i and 0x0f])
    }
    return result.toString()
}
```

## 使用。

```kotlin:main.kt

val hashs = sha256("Hello Qiita!")
```


## Logger使用。

```kotlin:main.kt

val hashs = sha256("Hello Qitta！")
Logger.getLogger(this::class.java.name).warning(hashs)
```

## 結果。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/79656a15-d4da-2629-35b7-c7a9870911d0.png)

hash : E863D36C24ADA694FA77454B33E8F9B9545D372AAE251E8779FC25DF16943FED 

# 終わりに

読みいただきありがとうございました。
次のPostで会いましょう！

Dreamwalker
[python]Seleniumメモ


自社勤怠管理システムがWebシステムでログインから出勤の確定を行うまでの工程を自動化したく、Seleniumを学習。
そのことについてのメモをこの記事に入力しようと考えています。

#実行OS
Windows10 64bit

#必要なもの
python
chromeドライバ

※エディタはお好みで、私はVisualStudioCodeを使用しました。



#pythonインストール
以下サイトから「DownLoad Python～」というボタンアイコンを押してダウンロード
https://www.python.org/downloads/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/290123/d2d2a0de-f439-e5ad-85a2-6f00020e0509.png)

ダウンロードした実行ファイル(windowsの場合は.exe)を起動し、pythonのインストールを行う。

#seleniumのインストール
seleniumはWebブラウザを操作するためのライブラリという認識
インストール方法はコマンドプロンプトを開いて以下を入力する

```
>pip install selenium
```

#ChromeDriverダウンロード
https://sites.google.com/a/chromium.org/chromedriver/downloads
上記サイトからchromeドライバをダウンロード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/290123/f07f36ca-2c4a-1de1-e72c-02a0ee3e8b9e.png)
⇓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/290123/2381d4e4-6db1-021a-f9ab-2633dd9682df.png)


※上記GoogleChromeブラウザを操作するためのドライバなので、
　操作したいブラウザによってドライバが異なるので、それぞれ使用したい
　ドライバをダウンロードする

#seleniumコードメモ

##selenium.webdriver インポート
```python
from selenium import webdriver
```
##chromedriverの利用
```python
driver = webdriver.Chrome("ダウンロードしたChromeドライバの場所/chromedriver.exe")
```
##操作したいWebサイトの指定
```python
driver.get('webサイトURL')
```
上記まで終了したら、Webサイト上のオブジェクトが操作できるようになる

##frameの指定
```python
f1 = driver.find_element_by_name("frame1")
driver.switch_to_frame(f1)
```
Webサイト上で操作したいオブジェクトがiframe内のオブジェクトである場合
iframeを選択する処理が必要

##element情報の取得
取得するための関数は沢山用意されているので、関数のメモだけ残す

```python

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
```

##input type="text"に値を入力
```python
#以下はname="LoginID"のテキストボックスに"xxxxx@gmail.com"を入力した例
element = driver.find_element_by_name("LoginID")
element.send_keys("xxxxx@gmail.com")
```
##Linkタグをクリック
```python
#以下はname="alink"というリンク<a>をクリックした例
element = driver.find_element_by_name("alink")
element.click()
```

##driverの終了
```python
driver.quit()
```
※"driver"部分はchromedriverの利用で宣言した変数です。
Nextcloud のWebメール機能

#はじめに
Nextcloudは、ownCloudから派生したオンラインストレージパッケージです。ファイル共有がメインの機能となっており、またマルチデバイス対応でもあるので、どこからでもアクセス（もちろん公開していればですが）できます。なので、Gmailみたいにブラウザがあればどこでもメールが見れるなんて事ができたらいいですよね。今回は、NextcloudのWebメール機能を紹介します。

#プラグイン
![画像22.png](https://qiita-image-store.s3.amazonaws.com/0/308127/69b1eaf3-4692-089b-1a5c-422489e30652.png)

#使い方
Mailプラグインを有効にすると、ブラウザ画面の上部メニューにメールのアイコンが表示されます。
![画像23.png](https://qiita-image-store.s3.amazonaws.com/0/308127/cd656714-13ca-a5c8-7210-5b8b91c4a701.png)
メールアイコンをクリックすると初期設定画面が表示されます。（設定していない人のみ表示）自分のメールサーバの情報を入力していきます。
![画像24.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8fe6faf6-b23e-7776-fb33-ec3876794808.png)
設定が完了するとメールが受信できます。結構見やすいですね。
![画像25.png](https://qiita-image-store.s3.amazonaws.com/0/308127/a2886a1f-edb3-8629-3179-944b423879c1.png)
スマフォのブラウザで表示した場合、メールの一覧が表示されます。
![画像26.png](https://qiita-image-store.s3.amazonaws.com/0/308127/26887cc5-7884-c7df-840a-d18ba86315ec.png)
メールを選択すると、内容を確認できます。もちろん、返信もできます。右上の×を押すと、一覧に戻ります。
![画像28.png](https://qiita-image-store.s3.amazonaws.com/0/308127/24c6ba2b-135d-0e23-1cab-5ebfb55117d2.png)

#まとめ
スマフォのメールアプリでもいいじゃんっって人も多いと思いますが、Nextcloudでもこんなことができるんだよって事を紹介させていただきました。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
nuxtのDynamic Routingは場合によりパラメータが常に任意になるので必須にするにはvalidateを使う

2018.10.31現在。`nuxt-2.2.0`で確認。

## 問題：ドキュメント通りでは必須パラメータにならない場合がある

https://nuxtjs.org/guide/routing/#dynamic-routes
Dynamic Routingについてのドキュメントを見ると、パラメータを必須にしたい場合は、`pages/_id.vue`ではなく、`pages/_id/index.vue`にファイルを配置しろと記述されている。

これは`pages`直下のルーティングには適用されるが、ディレクトリ掘ると対応されず常に任意になる。
例えば`pages/post/_id/index.vue`は生成された`.nuxt/router.js`を見るとパラメータが`id?`で任意になっている。（追記参照、`post.vue`が存在しない場合）

### 再現手順

```sh
$ yarn create nuxt-app testhoge
$ mkdir -p testhoge/pages/post1 && touch testhoge/pages/post1/_id.vue
$ mkdir -p testhoge/pages/post2/_id && touch testhoge/pages/post2/_id/index.vue
```

```vue:pages/post1/_id.vue
<template>
  <div>post1: ... {{ $route.params.id }}</div>
</template>
```

```vue:pages/post2/_id/index.vue
<template>
  <div>post2: ... {{ $route.params.id }}</div>
</template>
```

```sh
$ yarn dev
```

## 解決策：対象のコンポーネントで、`validate`を実装してパラメータを制限する

https://nuxtjs.org/guide/routing/#validate-route-params

```vue
<template>
  <div>required params.id: ... {{ $route.params.id }}</div>
</template>
<script>
export default {
  validate({ params }) {
    // params.idの存在チェックをしとかないと、正規表現マッチ時にstring変換されてtestを通ってしまう場合がある
    return params.id && /^\w+$/.test(params.id)
  }
}
</script>
```

validate対応で、`pages/post/_id.vue`と`pages/post/_id/index.vue`は結局どちらでも同じに動作する。


...

どちらのファイル配置を使うかは、ルーティングをネストするかどうかで変わってくるけど、迷うなら`_id/index.vue`　を使うほうが良さそう。
親コンポーネントを作りたい場合や、親コンポーネントなしで兄弟コンポーネントがある場合にも対応しやすい。

```
■_id配下に子ページコンポーネントがそもそも無いならどっちでもおｋ
post/
　　└　_id.vue

post/
　　└　_id/
　　　　└ index.vue


■_id.vueを親コンポーネントにする場合
post/
　　├　_id.vue (<nuxt-child/>を含む)　
　　└　_id/
　　　　├ index.vue
　　　　└ comment.vue

■親コンポーネントは使わないない
post/
　　└　_id/
　　　　├ index.vue
　　　　└ comment.vue
```


## 追記

nuxtのルーティング生成のコードを読んだ限り、そもそも、親コンポーネントの無いディレクトリ区切りは想定されていないっぽい。
https://github.com/nuxt/nuxt.js/blob/39b558f59c0ecb5aa40bf709ca5dff83a151b20b/packages/common/src/utils.js#L213

つまりコンポーネントを入れ子にする場合は

```:pages/
post/
　　└　_id/
　　　　├ index.vue
　　　　└ comment.vue
```

ではなく

```:pages/
post.vue (<nuxt-child/>を含む)　
post/
　　└　_id/
　　　　├ index.vue
　　　　└ comment.vue
```

と、ディレクトリと同名の親コンポーネントを定義する必要があるようだ。
そうすると、nuxtビルドでパラメータ必須でRouter設定が生成される。

まあ、これで設定可能なのは必須/任意だけで、その他validationは本文中の通り`Component.validate`を使わないといけない。

ファイル配置での自動ルーティングはあまり気にせず`validate`でのパラメータチェックを重視するのが良さそう。
Linux のCPUの温度を知る方法

ビルド中にファンが回るので、ちょっとCPUの温度が気になった。


# 準備

Ubuntu 18.04を使用しています。

```
sudo apt install lm-sensors
```

# 温度を一回だけ表示

sensorsコマンドを実行する。

```
$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +75.0°C  (high = +82.0°C, crit = +100.0°C)
Core 0:        +74.0°C  (high = +82.0°C, crit = +100.0°C)
Core 1:        +74.0°C  (high = +82.0°C, crit = +100.0°C)
Core 2:        +74.0°C  (high = +82.0°C, crit = +100.0°C)
Core 3:        +75.0°C  (high = +82.0°C, crit = +100.0°C)
Core 4:        +73.0°C  (high = +82.0°C, crit = +100.0°C)
Core 5:        +74.0°C  (high = +82.0°C, crit = +100.0°C)

iwlwifi-virtual-0
Adapter: Virtual device
temp1:        +56.0°C  

```

# 繰り返し表示する

watchコマンドと組み合わせる。デフォルトで2秒間隔で繰り返す。

```
watch sensors
```

# 余談

`sensors`コマンドをstraceで見るとわかるが、これは`/sys/class/hwmon/hwmon0/` 以下のファイルから情報を得ている。
なので、雑に温度を得るには以下のようにすればよい。

```
$ cat /sys/class/hwmon/hwmon0/temp?_input
77000
77000
77000
75000
77000
75000
74000
```
LinuxってどんなOS？

# LinuxってどんなOS？
Linuxカーネルを用いたオープンソースなOSです。
カーネルってなんだ？とか説明すると終わらなくなるので「へーそうなんだー。ぐらいにしておきます」

オープンソースは誰でも手に入れることができて、自由に修正したり機能を追加することが可能なプログラムです。
こちらも厳密にいうと色々ありますが、「へーそうなんだー。ぐらいにしておきます」

# Linuxには色々な種類が存在する
LinuxにはCentOS、Ubuntu、SUSE、RedHatなどさまざまな種類(ディストリビューション)があります。

ちなみにLinuxってどんなイメージでしょうか？
黒い画面のコマンドラインで操作するというイメージでしょうか。
そんなことはありませんGUIもあってWindowsみたいなデスクトップもあります。
ただサーバに使う場合はデスクトップを使わないケースが多いのでコマンドラインのイメージになっている感じでしょうか。

デスクトップで有名なのはUbuntuでしょうか。日経Linuxなどで特集が組まれたり、実際に

# 結局どのLinuxを使うのがいいの？
正直どのOSが一番で使いやすい！
というのはありません(個人的感想)
ただ日本ではCentOS及びRedHat、Ubuntuが使われるケースが多く、実際にインターネットで検索しても、それらに関する文献が多く存在するので特別な理由がなければCentOS及びRedHat、Ubuntuを使うのが良いと思います。

# 日本で一番使われている(たぶん)CentOSを使う
というわけで、CentOSを使って勉強会します。
Gson().fromJson(str, 局所クラス) すると null が返ってきた

ちょっとハマったのでメモ

（kotlin でやっていたのでコードサンプルも kotlin で書きますが、 Java でも同じはず。です。gson のバージョンは 2.8.4）

とある API から取ってきた json を Gson でハンドリングしようとして、モックのつもりで下記のように書いた。

`fun` の中で `JsonFormat` を定義して `Gson().fromJson` に渡す

```kotlin
class Sample {
    fun parseJson(jsonString: String) {
        data class SampleJsonFormat(
            val sample_key: String
        )

        val obj = Gson().fromJson(jsonString,  SampleJsonFormat::class.java)
        if (obj == null) {
            System.out.print("obj is null.")
        }
    }
}
```

と、たとえば、 `{"sample_key":"sample value"}` を渡しても、

```kotlin
Sample().parseJson("""{"sample_key":"sample value"}""")
```

この場合 `obj is null.` が出力される。 `SampleJsonFormat` が見つからなかったからといって例外とかは出ない。

解決法の一個としては、desirialize するクラス（この例でいうと `data class SampleJsonFormat`）を `class Sample` の外に定義してあげると、きちんとデータが作れる。