OmniAICreator/Qiita-1.07M huggingface dataset:
UIレイヤーまでユニットテストを入れているiOS オープンソースアプリ/フレームワーク/ライブラリポインタ集　

# はじめに

UIレイヤーまでユニットテストを入れているオープンソースアプリ/フレームワーク/ライブラリです。

[商用レベルなiOSオープンソースアプリ集](https://qiita.com/Disko-Muzik/items/cb08a47a0e4d41c7f609)と一部被りますが列挙してみました。

2019年現在、UIが絡まないかつテストコードがないOSSフレームワーク/ライブラリはほとんどないので入れてません。。。

# Wire iOS[(GitHub)](https://github.com/wireapp/wire-ios) [(App Store)](https://apps.apple.com/us/app/wire-secure-messenger/id930944768)
検証方法＆フレームワーク：スナップショット、Viewのプロパティを検証

# TwitterKit[(GitHub)](https://github.com/twitter/twitter-kit-ios)
検証方法＆フレームワーク：OCMock、Viewのプロパティを検証

# FireFox[(GitHub)](https://github.com/mozilla-mobile/firefox-ios) [(App Store)](https://apps.apple.com/us/app/firefox-private-safe-browser/id989804926)
検証方法＆フレームワーク：EarlGrey, KIF, スナップショット

# Kickstarter[(GitHub)](https://github.com/kickstarter/ios-oss) [(App Store)](https://apps.apple.com/us/app/kickstarter/id596961532)
検証方法＆フレームワーク：MVVM、スナップショット

# SpreadsheetView[(GitHub)](https://cocoapods.org/pods/SpreadsheetView)
検証方法＆フレームワーク：?

# まとめ
- この中で普通レベルの開発組織で取り入れやすいのはWire iOS、Twitter Kit、Artsy（BDD Frameworkはお好みで)
- ほとんどのアプリのアーキテクチャはMVC。[さわって学べる！iOSテスト駆動開発](https://booth.pm/en/items/1040471)の作者が関わっているプロダクトも10人体制/MVC+DIで回している。
- 検証方法はスナップショットが多い
- テストが用意なアーキテクチャ(MVVM+リアクティブプログラミング)を採用しているアプリはKickstarterのみで、後はView毎を巻き込んでゴリ押し
- UIテスト用フレームワークを採用しているアプリはFireFoxのみ

というわけで、純粋なMVCでもUIのユニットテストは十分可能。


# 参考文献/スライド

[App Architecture: iOS Application Design Patterns in Swift] (https://www.amazon.co.jp/dp/B07D21KRJN)
[iOS Code Testing: Test-Driven Development and Behavior-Driven Development with Swift (English Edition)](https://www.amazon.co.jp/dp/B073LPHJ3G)
[さわって学べる！iOSテスト駆動開発](https://booth.pm/en/items/1040471)
[Viewのテストどうしてますか?] (https://speakerdeck.com/kariad/viewfalsetesutodousitemasuka)
[Snapshot Testing in iOS] (https://speakerdeck.com/susieyy/snapshot-testing-in-ios)
Yahooニュースのコメントを一括取得(AutoPagerize)するブックマークレットを作ってみた

![pages.jpg](https://qiita-image-store.s3.amazonaws.com/0/311399/b301b939-770e-80ea-141e-accc79d05a58.jpeg)

Yahooニュースの記事において上のように分割されているコメントを一気に読みたい。

[前回](https://qiita.com/querykuma/items/b2e4d8e0da79141678f3)、東洋経済オンラインのコメントを一括取得するブックマークレットを作ってみたが、Yahooニュース用にブックマークレットを作ってみる。

東洋経済オンラインのコメントは`fetch`で取得した。Yahooニュースのコメントは`fetch`で取得できなかったので、`iframe`で取得するようにした。


# ブックマークレット

https://raw.githubusercontent.com/querykuma/AutopagerizeToyokeizaiComment/master/autopagerize_yahoo_comment-bookmarklet.js



# 使い方

Yahooニュースの記事を開いて、すべてのコメントを読むをクリックしてから、ブックマークレットを動かす。ブックマークレットの作り方は省略。

- const start_page = 1; コメントの開始ページ。
- const page_times = 4; 取得ページ数。
- const comment_num = 50; 1ページあたりのコメント数（元は10）。
- const frame_height = "8000px"; ページのコメントの高さ（固定値）。
- const sleep_time = 1000; 次のコメントを取得するまでの待機時間（ms）。

諸事情につき設定値を変更する必要がある。

# fetch時のエラーメッセージ

```
main?d=20190412-00000001-it_nlab-bus_all:1 Access to fetch at 'https://news.yahoo.co.jp/comment/plugin/v1/full/' from origin 'https://headlines.yahoo.co.jp' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

VM312:1 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://news.yahoo.co.jp/comment/plugin/v1/full/ with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.
```

# CORS

ざっくりと言うと、次のような構成になっていると考えられる。
- 別サイトにあるものをJavaScriptで取得することを禁止。
- iframeのsrc指定で別サイトにあるものを取得することを許可。
- しかし、iframeの中で取得したテキストをJavaScriptで取得することを禁止。
- このような構成になったのは、iframeのsrc指定で不正アクセスさせられるから。例えばログイン必要なものをiframeのsrc指定して操作できたらアクセス権が奪えて危ない。
【8th Wall Web】実機で動かしてみる



環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️iPhone7(IOS 12.2)

↓↓↓実際に動かした動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">🎁WebAR🎁<br>Blenderで🍫チョコレート💕作ったのでお皿の上とテーブルいっぱいにチョコレート並べてみたよぉ😍<br>💕チョコいっぱい🍫幸せ気分💕<br>🌟8thWallのWebAR（Webブラウザで表示するAR）試してみたよぉ<br>🏜️iPhoneでもAndroidでも動いた‼️<a href="https://twitter.com/hashtag/8th?src=hash&amp;ref_src=twsrc%5Etfw">#8th</a> <a href="https://twitter.com/hashtag/wall?src=hash&amp;ref_src=twsrc%5Etfw">#wall</a> <a href="https://twitter.com/hashtag/8thwallweb?src=hash&amp;ref_src=twsrc%5Etfw">#8thwallweb</a> <a href="https://twitter.com/hashtag/webAR?src=hash&amp;ref_src=twsrc%5Etfw">#webAR</a> <a href="https://twitter.com/hashtag/AR?src=hash&amp;ref_src=twsrc%5Etfw">#AR</a> <a href="https://t.co/AgK6u5pbiv">pic.twitter.com/AgK6u5pbiv</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1116037834933014528?ref_src=twsrc%5Etfw">2019年4月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


１ヶ月１,０００アクセスまでは無料なので、無料版は、実機で動かす時に、あらかじめ、デバイス認証しないといけない。
有料版は、不要らしいです。

あらかじめスマホのブラウザのモーションとカメラのアクセスをONにする。

「設定」でsafariを選ぶ
<img width="353" alt="スクリーンショット 2019-04-11 5.04.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/c5eff4f1-fede-382a-0d7e-6910847c2f06.png">

モーションと画面の向きのアクセス
カメラとマイクのアクセス
をONにする。
<img width="520" alt="スクリーンショット 2019-04-11 5.04.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/5734cefc-6c88-4456-c5c9-cd0eea6d2b68.png">



1. ８thwallの管理画面を開く
https://console.8thwall.com/web
<br/>
管理画面の上の方に「Device Authorization」を選択する
<img width="1239" alt="スクリーンショット 2019-04-07 23.30.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/f8bf06f5-affd-3611-89c1-7a638e62a5ee.png">


2.右側の「Mobile Browser」のQRコードをスマホで読み込む
Developer　Mode　ON　になっていれば承認OKです。
<img width="1257" alt="スクリーンショット 2019-04-11 4.12.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/9dc907e0-dc49-590a-849e-eb635d13a7c7.png">

<img width="342" alt="スクリーンショット 2019-04-11 4.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/b3a76deb-3c93-1366-95a2-87764ae11ac8.png">

あとは、URLを、スマホに入力して、起動する。
<img width="356" alt="スクリーンショット 2019-04-11 4.23.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/5697c045-d4b7-2c20-5337-b36f30f15ed8.png">


オフィシャルの手順書は、下記のページにあります。
https://docs.8thwall.com/web/#authorize-your-device



【8th Wall Web】アカウントの作成からサンプルソースダウンロードまで
https://qiita.com/nonkapibara/items/30bd3510bafb33126e4a

【8th Wall Web】デバイス認証がきれた場合の対処法
https://qiita.com/nonkapibara/items/74f06899a3f840675fca
はじめてのDjango (1) Djangoでプロジェクトを作成して開発用サーバを立ち上げてみる

# はじめに

このドキュメントは，もともとはラボの新メンバー向けの入門テキストとして作成したもので，はじめてDjangoにふれる人にざっとその全体像をつかんでもらうことを狙っています．Djangoの日本語での参考資料も充実してきたので今さらという気がしないでもないですが，見直しを機にQiitaに移すことにしました．万が一でもどなたかの参考になれば幸いです．

説明のための具体例として，Djangoのオフィシャルチュートリアルにある投票アプリをとりあげています（が，説明上の都合で少しコードを追加，変更しているところもあります）．素人の独学がベースで，特に前半は公式チュートリアルをやってみた感想のような記事です（今回は全7回中の1回目）．

全体のコードはまとめて[GitHub](https://github.com/j54854/introDjango)に置きました．

## 変更履歴

- [2021/04/26] Djangoのバーションを3.2に更新し，それ基づいて内容を微修正しました．

# プロジェクトの作成と開発用サーバ

最初に，Djangoのバージョンを確認しましょう．そのためには，Pythonの仮想環境に入って，次のコマンドを打ち込みます．

```console
$ python -m django --version
```
Djangoでは，プロジェクトという枠の中にいくつかのアプリケーションを格納する構成をとっています．最初に，プロジェクトを1つ作成しましょう．そのためには次のコマンドを打ち込みます（mysiteはプロジェクトの名称です）．

```console
$ django-admin startproject mysite
```
この結果，カレントディレクトリの中にmysiteというディレクトリが作成されます．ディレクトリの構成は下記のようになっています．

```
mysite/
    manage.py (管理コマンドにアクセスするためのファイル)
    mysite/
        __init__.py
        asgi.py
        settings.py (プロジェクトの設定ファイル)
        urls.py (urlルーティングのためのファイル）
        wsgi.py
```

これでプロジェクトが作成できたので，サーバを立ち上げてブラウザで確認しましょう．Djangoには，開発に便利なように簡単な開発用のサーバが用意されています．これは，外側のmysiteディレクトリに移動して，次のコマンドを打ち込めば立ち上がります．

```console
$ python manage.py runserver
```

Chromeなどのウェブブラウザを立ち上げて，http://127.0.0.1:8000/ もしくは http://localhost:8000/ を開くと，今作成したプロジェクトの初期ページが表示されるはずです．なお，ポート番号を（例えば8080に）変更したい場合は，

```console
$ python manage.py runserver 8080
```

ローカル以外のマシンからipアドレスを指定してアクセスできるようにしたい場合は，

```console
$ python manage.py runserver 0:8000
```

とします．開発用サーバは`ctrl+c`で停止させることができます．

内側のmysiteディレクトリの中にあるsettings.pyがプロジェクトの設定ファイルです．ファイルの中身をざっと確認しておきましょう．下の方にタイムゾーンの設定があるので，これを日本時間に変更しておきます．

```
TIME_ZONE = 'Asia/Tokyo'
```

また，DATABASEという項目があり，既に設定が書かれていることがわかります．これは，DjangoにはSQLiteという軽量DBが標準装備されていて，すぐに使えるようになっているからです．自分で用意した他のデータベースを使いたい場合はそれに対応するようにこの設定を書き換える必要がありますが，そうでなければこのままSQLiteを使えばよいでしょう．

では，SQLiteを使えるようにしましょう．外側のmysiteディレクトリから，次のコマンドを入力します．

```console
$ python manage.py migrate
```

これでデータベースの構成が初期化されました．外側のmysiteディレクトリの中にdb.sqlite3というファイルが作られているはずです．SQLiteはデータベースの情報をファイルで管理していて，このファイルがデータベースの本体になります（このファイルを消去するとデータベースが消えてしまいます）．

次のコマンドで，データベースの管理者を登録しでおきます．

```console
$ python manage.py createsuperuser
```

開発用サーバを立ち上げて，http://localhost:8000/admin/ にアクセスするとDjangoに標準で用意されているadminサイトが立ち上がります．ここに上で登録したデータベースの管理者でログインすると，データベースの中身を簡単に編集することができます．

# おわりに

以上で1回目は終了です．[第2回](https://qiita.com/j54854/items/040cc4a18218bd4ffbc1)に続きます．
気持ちいいRuby/Ruby on Rails開発環境を作ったので解説（Mac/Win両対応）

[hayakasa/docker-vagrant-template-rails](https://github.com/hayakasa/docker-vagrant-template-rails)

以下の要件を満たすRuby/Ruby on Railsの開発・実行環境を環境を作成しました。  

- ホストOSの環境を極力汚さないこと
- 必要最低限の手順で環境構築できること
- 実行環境のバージョンを管理する手間を極力省くこと
- ソースコードを共有ディレクトリでマウントし、編集後に即時反映されること
- Dockerコンテナ側からファイル操作が可能なこと（bundle install、tmp内のファイル作成など）
- Mac・Windowsどちらでも可能な限り同じ手順で構築し動作すること

rvm、rbenvなどで実行環境のバージョン管理をすることが手間に感じていたのでDockerを採用することを決めたのですが、公式で配布されているDocker Desktop for Mac/Windowsにはソースコードを即時反映できるようにマウントした場合に実行速度が遅くなるなどの問題があります。
この問題を解決するため、ホストOSとDockerコンテナの間にVagrantで管理するVMを挟み、共有ディレクトリをNFSでマウントすることによって実行速度を犠牲にせずにアプリ開発ができる環境を作りました。

前提アプリケーションのインストールや使い方は下記GitHubリポジトリのREADMEを参照ください。
[hayakasa/docker-vagrant-template-rails](https://github.com/hayakasa/docker-vagrant-template-rails)

こちらでは、少し突っ込んだ解説を行います。

##NFSについて
Vagrantfileの以下の設定で共有ディレクトリをNFSマウントしています。

```ruby:Vagrantfile
config.vm.synced_folder ".", "/vagrant-nfs",type:"nfs" #DocRootをvagrant-nfsという名前でNFSマウント
```

###Macの場合
Macでは標準でNFSサーバーが準備されているので以下のコマンドで有効化します。

```shell
YourPC$ sudo touch /etc/exports #nfsd設定を保存するファイルを作成
YourPC$ sudo nfsd enable #nfsdの有効化
```

###Windowsの場合
WindowsではVagrantのプラグインを使うことによってNFSサーバーを立てずにNFSでマウントができるためそちらを使用します。

```shell
YourPC$ vagrant plugin install vagrant-winnfsd
```

##vagrant-bindfsプラグインについて

NFSでマウントした共有ディレクトリはホストOSのユーザーがownerになっているので、bindfsでvagrantユーザーがownerになるようにマウントし直します。

```ruby:Vagrantfile
config.bindfs.bind_folder "/vagrant-nfs", "/vagrant" #vagrant-nfsをvagrantという名前でbindfsマウント
```

##vagrant-hostsupdaterプラグインについて

vagrant upでVMを起動するときにhostsファイルにホスト名の登録を行います。これによってホスト名でアプリケーションにアクセスすることができるようになります。
（hostsを操作するためWindowsではコマンドプロンプト・PowerShellを管理者権限で実行する必要があります）

```ruby:Vagrantfile
config.vm.hostname = "myapp.localhost"
```

##ポートフォワーディングについて

以下の設定によって一般的に使用されるポートでホストOSからアクセスができるようにしています。

```yaml:docker-compose.yml
services:
  db:
    ports:
      - "5432:5432" #例：PostgreSQLの場合。Dockerコンテナの5432番をVMの5432番にポートフォワーディング
  app:
    command: bundle exec rails s -p 3000 -b '0.0.0.0' --no-dev-caching #rails s を3000番ポートで実行
    ports:
      - "80:3000" #Dockerコンテナの3000番ポートをVMの80番にポートフォワーディング
```

```ruby:Vagrantfile
  config.vm.network "forwarded_port", guest: 80, host: 80 #VMの80番をホストOSの80番にポートフォワーディング
  config.vm.network "forwarded_port", guest: 5432, host: 5432 #VMの5432番をホストOSの5432番にポートフォワーディング
```

##Dockerコンテナの実行ユーザーについて

以下の設定によってRubyのDockerコンテナをvagrantユーザーとして実行します。これによってコンテナ内で作成されるファイルのownerがvagrantユーザーになり、アプリ実行時のパーミッションエラーを回避しています。

```yaml:docker-compose.yml
services:
 app:
    user: "1000:1000" #vagrantユーザーのUID:GIDを指定してコンテナを実行
```

##データベースのvolumeについて

以下の設定によってデータベースのvolumeをVMのディスク領域で永続化しています。したがってVMのイメージ自体を削除しない限り、Dockerコンテナを破棄してもデータベースの中身は保持されます。

```yaml:docker-compose.yml
services:
  db:
    volumes:
      - /data/db:/var/lib/postgresql/data  #例：PostgreSQLの場合 Dockerコンテナの/var/lib/postgresql/dataをVMの/data/dbに保存します
```
Firebase Typescript エラー対応

どうもFirebase Typescriptのバージョンが上がったかコンパイルのルールが厳しくなったかでエラーが出ているので修正した例をあげておきます。

#### 型がないとダメ？
##### メソッド引数
修正前

```typescript
Parameter 'object' implicitly has an 'any' type.

    function objectSort(object) {
```

修正後

```typescript
    function objectSort(object: any) {
```

修正前

```typescript
Parameter 'fcmToken' implicitly has an 'any' type.

    const pushMessageChat = (fcmToken, nickname, badge) => ({
```

修正後

```typescript
    const pushMessageChat = (fcmToken :any, nickname :any, badge :any) => ({
```

##### ハッシュ、配列

修正前

```typescript
Variable 'array' implicitly has type 'any[]' in some locations where its type cannot be determined.

     var array = [];
```

修正後

```typescript
     var array :any = [];
```

修正前

```typescript
Variable 'array' implicitly has type 'orders ' in some locations where its type cannot be determined.

     const orders = []
```

修正後

```typescript
     const orders :any = [];
```

#### forn文がそのままでは使えない？
##### for
修正前

```typescript
 Cannot assign to 'i' because it is a constant.

     for (const i = 0; i < array.length; i++) {
```

修正後

```typescript
    const i;
    for (i = 0; i < array.length; i++) {
```

#### オブジェクトのチェックが必要？
##### for
修正前

```typescript
Object is possibly 'undefined'.

    const newValue = snap.data()
    const newHistory = newValue.history
```

修正後

```typescript
    const newValue = snap.data()
    if ( newValue === undefined) return

    const newHistory = newValue.history
```

[修正してやっとPush通知が送れるようになった・・・](https://itunes.apple.com/jp/app/id1447657356?mt=8)
[初投稿]Pythonプロジェクトの作成

初投稿になります。

仕事では主にC言語で組み込み開発をしていますが、将来的にPythonとかVue.js+firebaseとかで開発したいなって思ったので、それまでに自分が学んだ知識やノウハウをここにまとめておこうかと思います。

今回はPythonの開発環境作成方法についてです。

# 参考記事
[Windows + Python 3.6 + PipEnv + Visual Studio Code でPython開発環境](https://qiita.com/youkidkk/items/b6a6e39ee3a109001c75)

# 環境
・OS：Windows10
・Python　: 3.7.1
・pipenv : 2018.11.26

# つまづいた点
ほとんど参考記事通りでできると思いますが、つまづいた点が１か所あったのでそこだけ残しておきます。

**"実行構成の追加"の章でPythonがリストに表示されない**
原因としてはインタプリタ(python.exe）の設定を行っていなかったことでした。VScodeのPython拡張のGuideを見て解決しました。

これによって出来上がる環境はプロジェクトごとに以下のようになるようです。

```
pythonProject/
┣ .git/
┣ .venv/
 　　pipenvで作成するPython仮想環境の実体いろんなライブラリとか？
┣ .vscode/
┣ .gitignore
┣ hello.py
　　作成するpythonコード
┣ Pipfile
　　pipenvのpackage.jsonみたいなもの？パッケージの依存関係とか
　　このプロジェクトに必要なものが記載されてる
　　$ pipenv installで同じ環境作るときに必要
┣ Pipfile.lock
　　Pipfileとセット
```

それぞれのファイルについてはきっとやっていくうちにさらに理解深まると思うんで随時更新していきます。

happy python!!
GINZA をGoogle Colab で試してみた

この記事では、リクルート社から新たに登場した
自然言語処理のフレームワーク「GINZA」をGoogle Colab で使ってみた感想を
記事にしてみました。この記事を参考に、GINZA のフレームワークに触れてみてください。

## 1. 導入
導入方法はいたって簡単で、
`!pip install "https://github.com/megagonlabs/ginza/releases/download/v1.0.2/ja_ginza_nopn-1.0.2.tgz"` とセルの中に記述すれば導入完了です。



## 2.実行
それでは、例題にならって、以下のコードを記述し、実行してみてください。

```python
import spacy
nlp = spacy.load('ja_ginza_nopn')
doc = nlp('依存構造解析の実験を行っています。')
for sent in doc.sents:
    for token in sent:
        print(token.i, token.orth_, token.lemma_, token.pos_, token.dep_, token.head.i)
    print('EOS')

```

問題なく動作すれば、

```
依存 依存 NOUN compound 2
1 構造 構造 NOUN compound 2
2 解析 解析 NOUN nmod 4
3 の の ADP case 2
4 実験 実験 NOUN obj 6
5 を を ADP case 4
6 行っ 行う VERB root 6
7 て て SCONJ mark 6
8 い 居る AUX aux 6
9 ます ます AUX aux 6
10 。 。 PUNCT punct 6
EOS
```

と結果が表示されます。

## 3.最後に
今後は、この GINZA を利用して使ってみた感想などを挙げていきたいと思います。
Macでdlsymを呼ぶプログラムをXcode経由で実行すると失敗する件

タイトルの通り。
原因は不明。解決策も不明。

これでハマった人は、Xcodeではなくコマンドラインから実行してみると良いかも。

類似報告
https://comp.sys.mac.programmer.help.narkive.com/9LroglEc/dlsym-fails-to-find-existing-symbol
元号に関する個人サービスを作る上での感想など

# はじめに
2019年3月、ひっそりと[GENGOH](https://gengoh.jp/info.html)というサービスをリリースしました。

開発は2018年8月くらいに開始し、予定では2018年の12月中にリリースする予定でしたが、途中のモチベーション低下による放置期間を経て、なんとか半年以上かけてやっと完成にこぎつけてました。。。

ということで、この記事では元号を返すAPIサービス「[GENGOH](https://gengoh.jp/info.html)」を作るにあたっての考えや採用した技術、その他雑多なことを書きたいと思います。

##なぜこのサービスを作ろうと思ったか
久々に個人でサービス開発をしようかなーと思い、今までストックしていた「いつかは作りたいサービス」の中から、一番簡単に出来そうな元号変換サービスを作ることにしました。

##開発環境と採用技術を考える
ほぼ自己満で、それほどアクセス数を見込めるようなサービスでも無いと思たので、できるだけコストがかからない環境と、自分の学習も兼ねた技術を採用し構築することにしました。

##開発環境
- Windows10
- xampp
- Chrome
- git
- Visual Studio Code
- 秀丸

##使用言語やフレームワークなど
- PHP
- HTML
- Javascript
- [vue.js](https://jp.vuejs.org/index.html)
- [Bootstrap4](https://getbootstrap.com/)
- jquery(仕方なく)

###ホスティングなど
- さくらのレンタルサーバ 

##サービスや提供内容を考える
2019年5月に改元することが決まりましたが、WEBのシステムでも「西暦」を使う場合と「和暦」を使う場合がそれぞれがあり、都度対応するのが面倒だなーと思いいつか作るリストにピックアップしていましたが、この度日の目を浴びる事となりました。
ちなみに今回は、純粋に個人の趣味の範囲で考えたので、マネタイズなどは一切考えていません。（サービスが失敗する原因とどこかの記事にありましたが、ホントその通りだと思います）
利用者数が増えて、管理にコストが掛かるようになったら少し考えようと思います。

兎にも角にも、元号をもっと使いやすくできたらいいなと思っています。

##元号や暦などについて調べる
元号を改めて調べてみると元号は「645年」の「大化」から始まっていることがわかりました。
645年というと歴史の授業で習う「大化の改新」があった年なのですが、昔は「蘇我入鹿が暗殺された」程度の認識だったのが、今回改めて調べてみると至る経緯など含め多くを学ぶ機会になりました。
そのせいで、Wikipedia回りが止まらず、開発が全く進まないということも多くありました。
少し寄り道して、日本の暦を調べていくうちに、「天地明察」なども読んでしまいました。
また、西暦には「ユリウス暦」と「グレゴリオ暦」があり、それぞれどのように日付を管理するかなども結構悩み未だこれだという管理方法を決められていません。

##ドメインを決めてサーバーを選定する
元号を扱うので、jpドメインを取りたいなと調べたところ、「gengoh.jp」が空いていたので、それに決定しました。
サーバーは特にこだわりはないので、とにかく安い「さくらのレンタルサーバ」にしました。

##設計する
個人開発なので、細かい設計などは特になしで取り掛かりました。
規模や難易度も高くないので、なんとかなっています。

##データベースを用意する
これもほぼ思いつきでデータベース構成を作りました。
規模も小さいので今段階ではあまり困りませんでした。
ただし、将来的にアカウント管理する段階になったら、少し考えようと思います。

##実装
モチベーションの影響をもろに受けながら、仕事では考えられないくらいの長い開発期間を経て実装を勧めました。。。
特にこだわった点や注意すべき点もないのですが、普段使わない三項演算子を使ったり、インデントを2タブにしたりと、少しやんちゃなコードになっています。
テストも適当なので、潜在的なバグも結構ありそうですが、あまり気にせず進めています。

##良かった点
- vue.jsがとにかく便利、PHPよりもjs書いている方が多い気がする
- 改めて歴史や暦について学ぶ機会となり勉強になった
- 久々に作ったので楽しかった
- 発展型のサービスアイディアを思いついた

##困った点
- モチベーションが続かない
- 納期がないのでダレる
- MySQL系のドライバが、PHPのバージョンの影響を受けて面倒だった
- 資金不足で良い感じの環境で作れない
- Vue Routerの使い所がまだわからない＆必要性を感じない
- 「ユリウス暦」と「グレゴリオ暦」のどちらで管理するほうがいいのかわからない年代がある
- アクセス数が少なく、利用者がほぼ皆無

##まとめ
個人サービスなので、勉強も兼ねてとにかく気楽にやっていきたいなーと思っています。
今後はご意見やご要望などを反映しながら適度にバージョンアップなどをしつつ、サービスを拡充していく予定です。

興味があれば[GENGOH](https://gengoh.jp/info.html)を使ってみて下さい。

[ご意見ご要望はTwitterまで](https://twitter.com/GengohJP)
データ連携の平成世代sftpクライアントだってコンテナになりたい令和元年のtips

俺です


昭和の僕が思い浮かぶ外部連携といえばftpです。全銀tcp/ip最高みたいな話です。
sftpクライアントなコンテナを使い、他のサーバからファイルをgetしてから後続のシェルコマンドやスクリプトで何かしたい。というアレがアレなものをdocker-composeのvolumeを使い、dockerホストにsftpで取得したファイルを保管して動かすtipsです

sftpクライアント用のコンテナには[こちら](https://hub.docker.com/r/chartedcode/alpine-sftp-client)を使います。

# 定義

- docker-compose.yml

sftpコマンドのワンライナーをcommandに埋めるのはしんどいのでbatchfileをreadします.

```
version: "3"
services:
  sftpclient:
    image: chartedcode/alpine-sftp-client
    command: sshpass sftp -i /tmp/.ssh/id_rsa -oStrictHostKeyChecking=no -b /tmp/sftp_job_script sftpsaikou@127.0.0.1
    volumes:
      - .:/tmp:ro
      - /mnt/data:/mnt/data
  subsequent_job_a:
    image: ubuntu:latest
    command: ls -l /mnt/data && echo "sftpは最高だぜ"
    depends_on:
      -  sftpclient
    volumes:
      - /mnt/data:/mnt/data
```

- sftp_job_script

docker-composeと同一ディレクトリにbatchfileを作ります。(パス分けてもいいんですけども)

```
ls
lcd /mnt/data
get unko.csv
bye
```

# 実行例

```
$ docker-compose -f docker-compose.yml up
Starting jobuser_sftpclient_1 ... done
Recreating jobuser_cron_job_1 ... done
Attaching to jobuser_sftpclient_1, jobuser_cron_job_1
sftpclient_1  | sftp> ls
sftpclient_1  | sftp> lcd /mnt/data
sftpclient_1  | sftp> get unko.csv
sftpclient_1  | sftp> bye
jobuser_sftpclient_1 exited with code 0
cron_job_1    | total 0
cron_job_1    | -rw-r--r-- 1 root root 0 Apr 10 16:49 unko.csv
cron_job_1    | sftpは最高だぜ
jobuser_cron_job_1 exited with code 0
```

良いデータ連携ライフを！
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates　が出た

「解決法」
提示されたapp label名（start projectした名前）が重複しているみたいなので、ファイル名を変更すればいい。
[linuxの場合]
sudo mv 元のファイル名　変更したいファイル名

を実行する。
dockerでiOSの疑似脱獄

iOSでは、制約に縛られることがかなり多いわけですが、dockerを使って、iOSを乗っ取れるかもしれない、などと夢想しています。

たまたまiPhoneのマイク、スピーカーを共有する必要のあるプロジェクトにかかわっていまして、アイデアの一つとして、可能性を追いかけたく思っています。

皆様のご意見等いただければ幸いです。:smile:
netstatの出力をTCPのState毎にカウントする

いつも忘れるのでメモしておきます。
TCPのStateとコネクション数を出力する。

```sh
# 単発
$ netstat -nat | awk '{print $6}' | sort | uniq -c
      1 ESTABLISHED
      1 Foreign
     12 LISTEN
      5 TIME_WAIT

# 定期的に確認する
$ watch -n 10 "netstat -nat | awk '{print \$6}' | sort | uniq -c"
```
xcode で「No such module 'SwiftyJSON'」エラーの対策

```
//import SwiftyJSON をやめて
```

直接 *SwiftyJSON.swift* ファイルをプロジェクトツリーにDrag&Drop

で　JSON()関数は使えるようにするはず。。。

公式Readme

```
Manually (iOS 7+, OS X 10.9+)
To use this library in your project manually you may:

for Projects, just drag SwiftyJSON.swift to the project tree
for Workspaces, include the whole SwiftyJSON.xcodeproj
```

https://github.com/SwiftyJSON/SwiftyJSON/blob/master/README.md
LINEBOT + RailsでWikipediabotを作ってみました。

<h1>はじめに</h1>
Railsの勉強のためにLINEBOTを作ってみました。
内容はLineメッセージに調べたい単語を送信すれば、Wikipediaの概要とurlを返すものです。

<h1>LineBotの設定</h1>
下記のリンクを参考に設定しました。ありがとうございます。

[今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。][1]
[1]:https://qiita.com/y428_b/items/d2b1a376f5900aea30dc

<h1>Wikipediaの情報取得</h1>
Wikipediaの情報を取得するためにGemがあったので、そちらを利用しました。
[wikipedia-client][1]
[1]:https://github.com/kenpratt/wikipedia-client

```ruby:Gemgile
gem 'wikipedia-client'
```

```ruby
$ bundle install
```

<h1>Controllerを編集</h1>
```ruby:linebot_controller.rb
class LinebotController < ApplicationController
  require 'line/bot'
  require 'wikipedia'

  # callbackアクションのCSRFトークン認証を無効
  protect_from_forgery :except => [:callback]

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end

  def callback
    body = request.body.read

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      head :bad_request
    end

    events = client.parse_events_from(body)

    events.each { |event|
      if event.message['text'] != nil
        # LINEで送られてきた文書を取得
        word = event.message['text']
        # 日本語版Wikipediaを設定
        Wikipedia.Configure {
          domain 'ja.wikipedia.org'
          path   'w/api.php'
        }
      end

      # wikipediaから情報取得
      page = Wikipedia.find(word)

      # 概要とURLを返す
      response = page.summary + "\n" + page.fullurl

      case event
      # メッセージが送信された場合
      when Line::Bot::Event::Message
        case event.type
        # メッセージが送られて来た場合
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: response
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    }

    head :ok
  end
end
```

あとはherokuにデブロイして、動作確認すれば完成です。

<h1>動作イメージ</h1>
こんな感じで概要とURLを返してくれるようになります。
![2019-04-11 0.53のイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/330080/e5ecb9ad-e9e6-c387-580a-43bce2ce68b2.jpeg)

<h1>まとめ</h1>
簡単なまとめになりましたが以上になります。
結構簡単に実装できました。APIと組み合わせれば色々使えるんじゃないかなと思いました。
何かご指摘等がございましたらコメントよろしくお願いします。

<h1>参考サイト</h1>
[今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。][1]
[1]:https://qiita.com/y428_b/items/d2b1a376f5900aea30dc
[Web APIとは？ （LINE bot API・グルナビAPI）][1]
[1]:https://qiita.com/NoharaMasato/items/6fb1ac277c965905e019
[wikipedia-client][1]
[1]:https://github.com/kenpratt/wikipedia-client
特権レベル(DPLとCPLとRPL)

<h1>特権レベル</h1>

CPUやOSの入門書には、特権レベルが説明されていますが、実は特権レベルって3種類あるんです。(IntelのCPUの場合)
ややこしい・・・

具体的には、
RPLや、CPLや、DPL
が特権レベルです。

これらがどう関係してくるかを簡単に説明します。

<h2>特権レベルの値について</h2>
とにかく、知っててほしいのが、
特権レベルって0~3の値のどれか1つもつということです。
これは、RPL、CPL、DPLすべて同じことが言えます。
0が一番権利が強くて、3が弱いということだけはとりあえず覚えてください。

<h2>DPLとは</h2>
DPLが最も基本となる特権レベルです。
各セグメントは、必ずDPLを持ちます。
これは、どういうものかというと、
他のセグメントにアクセスされた際に、使われるものです。
とりあえず、<strong>DPLというのは、他のコードセグメントにアクセスされた際に、利用する特権レベルなんだなという認識でいいと思います。</strong>

<h2>CPL</h2>
CPLとは、実行しているコードセグメントの特権レベルのことを言います。
CPLは、DPLと全く同じ値を持ちます。
そして、このCPLが、他のセグメントにアクセスしようとしたときに
そのセグメントのDPLと今実行しているコードセグメントのCPLを比較します。

例えば、
アクセスしようとしているコードセグメント　CPL=0
アクセスされるセグメント DPL=3
のとき、
0のほうが特権レベルは強いので、この場合
アクセスできます。

実行中のコードセグメント　CPL=3
アクセスされるセグメント DPL=0

この場合、CPUは、一部保護例外を起こします。

つまり、アクセスできないのです。

<h2>RPLとは</h2>


RPLはどういう特権レベルかというと

<strong>CPLを書き換えることができる特権レベルです。</strong>

これは割り込みやコールゲートで、元のコードの特権レベルを引き上げる(権力としては下げるという意味。)役割を持っています。
Macでvimのluaを有効化しようとしたら--with-luaが無いと言われた

## そもそものきっかけ
最近ずっとvimをカスタマイズしていて、
補完機能を強化するプラグインとして有名な**neocomplete**を入れようとした。
しかし**neocomplete**を使うには**lua**が有効化していないと使えないらしく、
luaを有効化させたvimを入れようとした。

あとで知ったんですけど**neocomplete**は開発終了するらしく、
今は**deopelete**を使うのが良いそうです。

## 環境
macOS Mojave 10.14.4
Homebrew 2.1.0
vim 8.1.1100

## やったこと
まずはluaのインスコ
`$ brew install lua`

次にlua付きでvimを再インスコ
`$ brew reinstall vim --with-lua`
↑のコマンドでエラーを吐いた

```
brew reinstall vim --with-lua
Usage: brew reinstall [options] formula

Uninstall and then install formula (with existing and any appended install
options).

Unless HOMEBREW_NO_INSTALL_CLEANUP is set, brew cleanup will be run for the
reinstalled formulae or, every 30 days, for all formulae.

    -d, --debug                      If brewing fails, open an interactive
                                     debugging session with access to IRB or a
                                     shell inside the temporary build directory
    -s, --build-from-source          Compile formula from source even if a
                                     bottle is available.
        --force-bottle               Install from a bottle if it exists for the
                                     current or newest version of macOS, even if
                                     it would not normally be used for
                                     installation.
        --keep-tmp                   Don't delete the temporary files created
                                     during installation.
    -f, --force                      Install without checking for previously
                                     installed keg-only or non-migrated
                                     versions.
    -v, --verbose                    Print the verification and postinstall
                                     steps.
        --display-times              Print install times for each formula at the
                                     end of the run.
    -h, --help                       Show this message.
Error: invalid option: --with-lua
```

**<font color='red'>Error: invalid option: --with-lua</font>　// 無効なオプションって意味**
↑
？？？？？
最近使えなくなったのかな？(要検索)

そして何を思ったのか、とりあえずvim自体をオプションなしで再インストールしてみた
`$ brew reinstall vim`
**動いた**

luaが有効化されているか確認
`$ vim —version | grep lua`

+lua

<font color='red'>**なんで有効化されてるの？？？？？**</font>

## 原因は分からずじまい
vimのマニュアル等を少し読んでみたり、調べてみたりしましたが分かりませんでした。
**--with-lua** が存在しないのも謎
ただ素のvimを再インストールしただけでluaが有効化したのも謎

もしも知ってる方がいらっしゃったら教えていただけると助かります。

## 蛇足
$ brew reinstall vim を試すまでに3時間くらい四苦八苦してた…

## 追記
**--with-lua** のoptionが使えない理由を教えていただけました。
>Homebrewではオプションを指定してパッケージをインストールしようとすると、ソースからビルドすることになってしまいます。
この不便さを解消するため、homebrew-coreの全てのformulaから、よく使われるオプションをあらかじめオンになるようにした上で全てのオプションを削除することになりました。

ありがとうございます！！
Windows 10 Educationにしてみた

## 事の発端
周りの人を含めてみんなDockerやってるし自分も流行に乗りたいなーDockerでドカドカしたいなー
→Docker for Windowsを使うためにはHyper-Vが必要
→Windows 10 HomeではHyper-Vを有効化できない
というところまで調べて諦めていたのですが、MicrosoftのMicrosoft Imagineというプログラムの一環で学生であればWindows 10 Educationが無料で使える(=Hyper-Vの有効化ができる)とのことだったので、実際にやってみました。

## Azure for Studentのアカウントを作成する
はじめに、Microsoftのアカウントを持っていない人は以下のリンクから新規作成を行いましょう。https://account.microsoft.com/account?lang=ja-JP


次に、https://azure.microsoft.com/ja-jp/free/students/ このページへアクセスし、今すぐアクティブ化をクリックします。
すると以下のようなページに飛ぶので、自分の学校でのメールを入力していきます。
<img width="469" alt="azure2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/d602a241-a4aa-4fd9-f8da-53258ded365b.png">

メールアドレスを2回入力したら教育機関ステータスの確認をクリックし、きちんと学校の有効なメールアドレスであることを証明します。(自分の場合はメールが届きそのメールに添付されていたリンクを押して証明しました。)
(学生であってもメールアドレスを取得することがない学校の場合は取得できるかわからないです・・・)

学生であることを証明したら自分の情報を入力していきます。
<img width="960" alt="azure3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/ef6eff7b-f9d3-36d9-6367-6a499ab40885.png">

最後に電話番号で本人確認(？)を行うと完了です。(画面に従うだけなので特に難しいところはないと思います。)
以下の画面に到達すれば成功です。
<img width="955" alt="azure4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/fcf27a4f-82bc-2b16-0e14-2361cefa21b5.png">


## Windows 10 Education用のライセンスキーの入手
上記の画面にたどり着いたらそのまま右に表示されているソフトウェアを取得の横の方にあるすべて表示をクリックし、一覧の中からWindows 10 Educationを探します。(検索を使うといいかもしれません)
その後キーを表示し、コピーします。
<img width="597" alt="azure7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/41cafd2f-27ac-197a-072c-9a1847bfe3a7.png">

キーをコピーしたら次は左下のスタートメニューから設定を開きます。設定→更新とセキュリティ→ライセンス認証へ進み、プロダクトキーを変更しますから先ほどコピーしたプロダクトキーをペーストし次へを押しプロダクトキーを更新します。

するとWindowsのインストールが始まるので、しばらく待って再起動したら成功です。PCのプロパティから現在のWindowsのバージョンを確認してみます。
<img width="559" alt="azure6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/6a48a05d-4eda-5c20-b6c2-2e8431f743e0.png">
無事にWindows 10 Educationに変更できていることが確認できました。

また、事の発端であったHyper-Vも有効にできることが確認できました。
<img width="178" alt="Hyper.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302026/83ca1b9a-cc31-2b1c-e03c-c147f403f477.png">

## まとめ
これで自分もDockerでドカドカできるぞー！
Qiitaの投稿初めてなので読みづらかったり変なところがあったらごめんなさい。

Hyper-Vの有効化からDockerの導入はたくさんの人がわかりやすく説明してくださっているのでここでは割愛させていただきます。

この記事が少しでもお役に立てれば光栄です。
特徴量エンジニアリング備忘録

特徴量エンジニアリングはすごく大事なのでここにまとめておきます
説明が短いけど多分日本語の特徴量エンジニアリングの記事で一番種類がたくさん載ってます

## Label encoding
全てのカテゴリに数値によるIDを割り当てる

## Count encoding
カテゴリの出現回数を特徴量とする

## LabelCount encoding
カテゴリの出現回数の順位を特徴量とする

## One-hot encoding
カテゴリごとにBooleanで表現

## X-meansで新しいクラスタを作り分類に落とす
X-meansはk-meansの拡張で、k-meansを繰り返して最適なクラスタを見つけてくれる

## target encoding
カテゴリカルな変数をサンプルのratioでエンコーディングするらしい。要勉強。
<img width="606" alt="Screen Shot 2019-04-10 at 23.46.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/248886/b21ba1cb-7a47-303a-f248-08d511528c10.png">
<img width="491" alt="Screen Shot 2019-04-10 at 23.47.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/248886/97b5c5a2-171c-00b7-7085-82cb1cd1be67.png">

出典: https://www.slideshare.net/HJvanVeen/feature-engineering-72376750

## NaN encoding
いつもは適当に補完するNaN値も、NaNという一つのbooleanの特徴量として扱う

## Polynominal encoding
カテゴリ変数同士の関係を元に作るらしい。XORですね
<img width="606" alt="Screen Shot 2019-04-11 at 0.10.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/248886/7a8bf0cd-2aba-6dc2-4a9c-3510c853724d.png">

## expansion encoding
一つの特徴量からカテゴリカル変数を作る手法。
例えば、ユーザーの使用しているバージョンを示す特徴量があったとしたら、
「ユーザーは最新のバージョンを使っているか？」→1(使用している) 0(使用していない) 
とかそんな感じです。

## Consolidation encoding
これは実際にありがちな問題で、何気なく使っている手法。例えば、会社の名前っていう変数があるとする。「shell」「Shell」「SHELL」「shEll」これらは一つの「Shell」という変数として扱わなきゃいけないから、適当にpythonで辞書でも作ってmapかreplaceする必要がある。これは特徴量エンジニアリングより、データクリーニングって感じですね。

## Rounding
連続値の場合は、ある程度のところで四捨五入するのも良いみたいです。あまりに細かい小数点◯位とかの数値はただのノイズだったりして、ちょうどいいところで数値を四捨五入することで、最も顕著なデータを得られるらしいです。Log変換する前にRoundingを入れるといいらしいですよ、

##binning
連続値の場合に、ある特定のレンジを決めて、レンジごとにカテゴリを分ける手法です
例えば、年齢という特徴量なら、「20歳以下」→分類0 「21歳から40歳」→分類1, 「40歳から60歳」→分類2...などこんな感じです。

## scaling
numericalな特徴量をある特定の範囲にスケーリングする手法です。Standard(Z) Scaling, MinMax Scaling, Root Scaling, Log scalingなどがあります

## imputation
これは欠損値補完のことです。平均やメジアンで補完するのが一般的ですよね、時系列なら線形補間かspline補完が一般的です。欠損を無視するのは他の問題を引き起こす可能性があるのでやめましょう

## Interaction
特徴量同士の関係を新しい特徴量にする手法です。例えば特徴量同士をかけたり、足したり、引いたり、割ったりするのがそれです。
例えば、1年前のある特徴量と現在の同じ特徴量があります。この２つを引き算すれば、「1年での変化量」の特徴量になりますし、割れば「1年での伸び率」の特徴量になります。

## Trendlines
例えば、「売上総額」を特徴量にするのではなくて「先週の売上」「先月の売上」「過去10年の売上」など「傾向」をモデルに与えてあげましょうねっていうやつです

## Box-Cox transformation
ロングテイルなデータを持っている場合はログ変換してあげると良い感じになりますよってやつです

## sigmoid / tanh / log transformations
Deeplearningのときだけじゃなくて他のモデル特徴量エンジニアリングでも使うんですね！

## model stacking
複数の予測モデルのアンサンブルを行う。(ライブラリあり) これは特徴量エンジニアリングなのか?? 

## Random Feature Elimination
RFEで特徴量の数を減らすとき、AUCで評価してあげると良いです
参考: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6101392/

## Downsampling/ Upsampling
不均衡データの場合、データが多い方に合わせてカサ増しするか、少ない方に合わせて切り捨てるか、という手法です。


####出典
【Kaggle】特徴量エンジニアリングとパラメータチューニングで、titanic　上位10%に入りました。https://qiita.com/jami291/items/2c1a230698ee19be7dee

特徴量エンジニアリングの手法としてのクラスタリング(とX-meansによる最適なクラスタ数の導入) https://qiita.com/sakabe/items/470b7c72c535de477f7c

Feature-Engineeringのリンク集めてみた https://qiita.com/squash/items/667f8cda16c76448b0f4

Feature Engineering
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
#MicrosoftFlow 使いが #LogicApps をつかってシステム構築を行った際に詰まったこと（その２）

# この記事は・・・

[#MicrosoftFlow 使いが #LogicApps をつかってシステム構築を行った際に詰まったこと（その１）](https://qiita.com/rnakamuramartiny/items/694a0d667a7203506801)
の続きです。

前回は、ループ処理のお話でしたね。
今回は、データソースのお話です。

# Microsoft Flowでは・・・
私だけかもしれませんが、Microsoft Flowを作るときは、当然それで使えるデータソースであることを前提として作っていました。

- UTF-8
- JSON

まぁこんな感じですかね。
Office365内における業務フローを作る製品という前提なので、まぁ当たり前っちゃ当たり前なんですが・・・

# しかし・・・
今回使うデータソースは、オンプレミスのシステムが吐き出す

- SJIS
- CSV

なわけですよ。

# LogicAppsって・・・
## CSV使えるのかなー？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/0c9e48b2-ea31-1ca2-603e-aa1eb77f589c.png)

CSVテーブルとして作成するってのはありますが・・・
要は、JSONをCSV化するってだけですね・・・。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/73a1f3ec-e094-89e2-c76a-c794d9069a00.png)
※テストデータ生成ツールで出力したJSONを使っています。
http://tm-webtools.com/Tools/TestData

## SJISってちゃんと読み込んでくれるかなぁ？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/e8398987-876f-8382-e60b-4a99138c9e60.png)

まぁ、当然文字化けするんで読めるわけないですね。

# というわけで・・・
このままではどうしようもなく
「Shift-JISのCSVしか渡せない」ともいわれましたので
こちらでデータ変換せざるを得ず
Azure Functionsを使って変換する方針となりました。
⇒こちらの内容は近日中に纏めて公開する予定です。
　※ソースコードありｗ

# まとめ
Low-Code No-Codeでモノを作るにしても、元ネタもある程度歩み寄らないとなかなかうまいこといかない。
逆に言うと、そういうところをエンジニアにお願いするというのは非常に有益なんじゃないかということを改めて感じた次第。

# ちょっとしたTips
Blobやファイルからデータ参照する時、octet-stream ってなってうまく取り出せないなんてことありませんか？
そんな時は、以下の式を使うと幸せになれますよ！

```
base64ToString(<欲しいデータのコネクタ名>.$content)
```
Windows10上にCentOS環境構築

# はじめに
Windows7からWindows10にアップグレードしたので、Hyper-Vを使ってWindows上にCentOS環境を構築しようと思います。

## Hyper-Vの準備
Windows10にアップグレードした直後だとHyper-Vは有効になっていません。
そのため、下記手順でHyper-Vを有効にする必要があります。

コントロールパネル＞プログラム＞Windowsの機能の有効かまたは無効化
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3098/7e506956-7676-11bd-920c-4ce94a2254cf.png)


## CentOSのISOファイルダウンロード
下記URLから必要なISOファイルをダウンロードしてください。
https://www.centos.org/download/

## Hyper-Vで仮想マシン作成
下記画像の「新規」から仮想マシンを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3098/ad7c5671-df18-1387-e13f-c5e2e2dbb66c.png)

世代を選ぶ際に第二世代を選ぶ場合は、あとでセキュアブートを無効にしてください。
私の環境では、その設定がないと起動しませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3098/12070766-5b63-aee4-1377-c1180e33babb.png)

さきほどダウンロードしたISOファイルをイメージファイルで指定してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3098/6863b7db-5f2a-008d-fa82-555d75eb4f89.png)

## CentOSのセットアップ
あとは、作成された仮想マシンを起動し、初期セットアップをすればは完了です。
ただし、このままでは外部へのネットワーク接続が行えないので、必要に応じて仮想スイッチマネージャーで仮想ネットワークスイッチを作成してください。
zshのPluginを作ってみた（『zsh-ghq-fzf』 -  「ghq」のリポジトリに「fzf」で選択して移動する）

# tl;dr
zsh初心者で、zshrcの改造中です。
その中で気になったことがありました。

[ghq](https://github.com/motemen/ghq)と[fzf](https://github.com/jethrokuan/fzf)や[peco](https://github.com/peco/peco)といったfuzzy finderを組み合わせてzshで使う記事はたくさんあります。
しかし、ghqとfzfを組み合わせたzsh pluginは見当たりません。

また、zshにPluginを入れる記事はたくさんありますが、Pluginを作る記事もありません。

そこで、ghqとzshを組み合わせて使うPluginを作ってみることにしました。

# Pluginの作り方
今回は、Plugin Managerに[zplug](https://github.com/zplug/zplug)を使います。
[Antigen](https://github.com/zsh-users/antigen)等の他のPlugin Managerでうまくいくはずです。

1. githubにプラグイン名でリポジトリを作る
2. プラグイン名.plugin.zshファイルを作る
3. .zshrcに以下のように記述する

```
zplug ユーザー名/リポジトリ名

# 実際に作ったPluginを使うと以下のようになる
zplug migutw42/zsh-fzf-ghq
```

# 成果物
[zsh-fzf-ghq](https://github.com/migutw42/zsh-fzf-ghq)

# 調査

検索しても見つからなかったので、[awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins)のPlugin一覧を見てどのように作っているかを眺めてみました。
すると、基本的には、一番上の階層のディレクトリに`プラグイン名.plugin.zsh`でファイルを作っているだけというのが多かったです。
Plugin Managerによって挙動が違うかもしれませんが、多分一番上の階層のディレクトリにあるzshファイルが全部読み込まれるので、ファイル名自体はなんでもいいはずですが、慣習的にこのような名前にしているようです。

# まとめ
zshのPluginの作り方ですが、滅茶苦茶簡単でした。
汎用性の高い処理があったらどんどんPlugin化していきたいですね。
（README書くほうが大変でした。）
C#でMarkdownパーサーアプリを作った

## 使い方
コマンドライン引数にmdファイルのパスを渡す

```
Markdowner.exe mk.md
```

するとMartkdowner.exeがあるフォルダーにmk.md.htmlファイルができる

## ビルド手順

※ターゲットは.NetFrameworkを指定する

1. ツール->Nugetパッケージマネージャー->パッケージマネージャーコンソールを開く

![パッケージマネージャーコンソール](https://qiita-image-store.s3.amazonaws.com/0/47053/cb05a25e-3829-1d6d-16fc-fab927aaa441.png)


2. でてきたコンソールに以下のコマンドを打つ

```
PM> Install-Package javascriptengineswitcher.v8.native.win-x86
PM> Install-Package JavaScriptEngineSwitcher.V8
PM> Install-Package marked
```

## ソースコード

```c#

using JavaScriptEngineSwitcher.Core;
using JavaScriptEngineSwitcher.V8;
using System;
using System.IO;
using System.Text;

namespace Markdowner
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("args zero");
                Console.ReadKey();
                return;
            }

            string markdown = "";
            try
            {
                markdown += File.ReadAllText(args[0], Encoding.GetEncoding("sjis"));
                var parser = new MarkdownParser(new V8JsEngine());
                var html = parser.Transform(markdown);
                File.WriteAllText(args[0] + ".html", html, Encoding.GetEncoding("sjis"));
                Console.WriteLine(html);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }
    }

    public class MarkdownParser : IDisposable
    {
        private IJsEngine _jsEngine;
        private bool _disposed;

        public MarkdownParser(IJsEngine jsEngine)
        {
            _jsEngine = jsEngine ?? throw new ArgumentNullException("jsEngine");
            _jsEngine.ExecuteResource("Scripts.marked.js", GetType());
        }

        public string Transform(string markdown)
        {
            return _jsEngine.CallFunction<string>("marked", markdown);
        }

        public void Dispose()
        {
            if (_disposed) return;
            _disposed = true;

            if (_jsEngine == null) return;
            _jsEngine.Dispose();
            _jsEngine = null;
        }
    }
}
```

## 落ち葉ひろい

パーサー部分はライブラリにおまかせ
C#でmarkdownパーサーやろうとしてぐぐったら、出てくる情報が古いらしくそのままでは動かなかった
string markdown="";と分けてるのはここでCSS読み込みとかするかなと思ったから
文字コードはちゃんと指定しないとうまくいかなかった
はじめてのC++【37日目】

#はじめに
かなり投稿を休んでしまった気分。
今日から毎日投稿を再開できそう。てか、する。
##ロベールのC++
前回の投稿から少し範囲が飛んでいますが、qiitaにかけなかったとき裏でやっていたので問題ないです。
###08-11 iostreamの謎
いままで、C++でコードを書くときに `<iostream>` を `include`　してきた。 `<fstream>`　が出てきたとき、名前が似ているのでなにか関係あるのかなと思っていた。
なんと `stringstream` `fstream`　は `iostream`　の派生クラスであった。また、 `iostream` は `ostream`　や `istream`　の派生クラスのよう。
`istream`が入力のためのクラスで `std::cin`　はこのクラスにある。また `ostream`　が　出力のためのクラスである。
`i + o `で `io`　になってたのか。なかなかおもしろいな。たぶん、 `i` は `in` , `o` は `out` って意味かな。

`ifstream`　、 `ofstream`は `std::ios::in` , `std::ios::out` をつけなくても良いとコメントにて教えていただきました。
私は、　なんで `if` や `of`　が名前に使われているのかと疑問に思っていましたが、実際には `if` とかの意味ではなくて、入力専用の `i`　が `fstream` にひっついてただけなんですね。笑

`fstream`　と `ifstream` `ofstream`は関係性があるので、派生クラスなのかと思ったが違う。 `fstream`　は `iostream`　の派生クラスである。  
`fstream&`　は `istream&`　へアップキャストできる。(アップキャストできると聞いて、なにができるのかわからない。アップキャストももう一度調べ直して見る必要がある。)

###std::coutとstd::cerrの使い分け
`std::cerr` っていうのは、エラーメッセージを出力するための機能である。 どうして使い分けるの？というと、`std::cout` と `std::cerr`　の出力先をそれぞれ変えることができるからである。また、**エラーの出力処理は `std::cerr` でする**　といったルールがあるみたいなので、可読性が上がるみたいね。
###マニピュレータ
マニピュレータとは、動的配列のメンバ関数みたいな様々な機能をもったものである。

```cpp
std::cout << 〇〇
std::cin >> 〇〇
```
〇〇の部分にマニピュレータを書く。
[機能はたくさんある](https://qiita.com/sileader/items/b896b42da3681485b524)
マニピュレータの機能を使うのがめんどくさくて `printf`　を使う人も多いみたい。でも、マニピュレータにしかできないこともあるため、使い慣れといたほうがいいみたい。
##キャスト
やっとキャストの区別が付きました！
int(c)は前回の投稿でやったがもう一度書いとく
###int(c)
`int(c)`　の正体は 関数形式の明示的型変換 である。関数みたいな見た目なので、関数形式って呼ぶみたい。そして、これを使えるのは、単純型指定子か、typename指定子である。単純型指定師とは、 `int`　とか `double` とか `char` とか他にもたくさんある。
###(int)c
これは、C言語形式のキャストでありとても危険なキャストである。なぜ危険なのかというと、`const_cast` や `static_cast` などのキャストを順番に当てはめて、当てはまるのもがあったら そのキャストを実行するというような感じである。
[詳しくはこちら](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#expr.cast)
つまり、使わないほうがいい。てか、使ったら危険。
###static_cast\<int\>(c)
C++でキャストをしようと考えるなら、とりあえず `static_cast` で問題ないみたい。
`reinterpret_cast` との使い分けが難しいみたいだがそれはまた明日調べるとしよう。
##ブロック崩し
###初期準備
[プログラミング入門サイト~bituse~](https://bituse.info/game/blockbreak/)のブロック崩しを参考にして作っていこうと思う。どのようなときにクラスを使うのか、などのことがまだわからないため今回はこのサイトを参考にして進めていこうと思う。
また、このサイトでは`DXlib`で画面描写や音声を使用しているが`Mac`非対応なため、 `OpenGL` を使って画面描写をしようと思う。 `OpenGL` ではサウンドの利用ができないため、サウンドは余裕があればすることにする。
###openGLの導入
導入できたと思ったがコンパイルするとエラー出る。
[解決策](https://qiita.com/yuya296/items/da4d73a0f6b5e6cc78ee)
ここに解決策が乗ってそうなので、時間がとれたとき少しずつ直していこうと思う。
xcodeだと、簡単にOpenglが使えるみたいなのでそれまではxcodeで開発をすすめる。
#終わりに
久しぶりの投稿になってしまったが今日からまた再開する！
おやすみなさい
jsで書いたフロントを徐々にtsに移行する

# はじめに
jsで書いたreact,reduxのフロントをtsに徐々に移行していくにあたって、つまづいたところをまとめました。

もうすでにある程度の規模感のjsのコードだったため、一度に全てtsに置き換えていくのは現実的ではなく、jsとtsが共存するような環境を整える際の備忘録です。

# 環境
webpack 4

# ts-loaderは何かtsファイルがないとエラーをだす
当たり前っちゃ当たり前な気がしますが、ts-loaderを入れただけでtsファイルが一つもないと以下のエラーが出ました。
https://stackoverflow.com/questions/41211566/tsconfig-json-buildno-inputs-were-found-in-config-file


# tsconfigのmodule
こんなエラーが出ました。

```console
Uncaught ReferenceError: exports is not defined
Object.defineProperty(exports, "__esModule", { value: true });
```
tsconfigのmoduleが `commonjs` になってたのが原因でした。 `es2015` に変えたらこのエラーは出なくなりました。

# tsconfigのlib
`TS2318: Cannot find global type 'IterableIterator'.` のエラーが出ました。
ジェネレータを使う場合、tsconfigに

```
"downlevelIteration": true,
"lib": ["esnext"]
```
が必要でした。参考： https://github.com/Microsoft/TypeScript/issues/19025

`TS2304: Cannot find name 'window'.` のエラーが出ました。

tsconfig.jsonのlibを修正したら治りました。

```
"lib": ["esnext"],
```

↓

```
"lib": ["esnext", "es5", "es6", "dom"],
```

参考：https://stackoverflow.com/questions/41336301/typescript-cannot-find-name-window-or-document 

# tsとjsが共存できるようにする
`tsconfig.json` の `allowJs` をtrueにすることで ts と js が混ざっていてもOKになります。
また、`allowJs` をtrueにする際は `declaration` はfalseにしておく必要があるみたいです。

```js
  "compilerOptions": {
    "allowJs": true,
    "declaration": false,
```

参考： https://github.com/Microsoft/TypeScript/issues/7546

# tsにする範囲を指定する
`tsconfig.json` の `include` でts化するファイル対象を指定できます。

```js
  "include": [
    "src/**/*"
  ]
```

# importのパスのエイリアス設定

webpackのresolve.aliasに以下のような設定を書いてました。

```js
  resolve: {
    alias: {
      '@config': path.join(process.cwd(), './src/config'),
      '@actions': path.join(process.cwd(), './src/js/actions'),
      '@components': path.join(process.cwd(), './src/js/components'),
      '@assets': path.join(process.cwd(), './src/assets'),
      '@utils': path.join(process.cwd(), './src/js/utils'),
      '@modules': path.join(process.cwd(), './src/js/modules'),
      '@domain': path.join(process.cwd(), './src/js/domain'),
    },
    extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.css', '.styl'],
  },
```

tsconfig.jsonのpathにも同様の設定を書かないとなんかのエラーが出ました。(エラーは覚えてない)

```js
    "paths": {
      "@config/*": ["src/config/*"],
      "@actions/*": ["src/js/actions/*"],
      "@components/*": ["src/js/components/*"],
      "@assets/*": ["src/assets/*"],
      "@utils/*": ["src/js/utils/*"],
      "@modules/*": ["src/js/modules/*"],
      "@domain/*": ["src/js/domain/*"],
    }
```

# tsファイルからjsファイルをimportする
徐々にtsに移行していく場合、tsからjsをimportすることはままあると思います。
tsからjsをimportするにはjsの型定義ファイルを作成しておかないとエラーになりました。

参考:
https://stackoverflow.com/questions/54320967/nodejs-how-to-import-js-file-into-typescript
https://teratail.com/questions/31327


# tslintではなく@typescript-eslint/eslint-pluginを使う
tslintはそのうち非推奨になる？っぽいので、先を見越して `@typescript-eslint/eslint-plugin` を入れておく。
参考：https://teppeis.hatenablog.com/entry/2019/02/typescript-eslint
Python使わないけどPythonが欲しい（Ubuntu）

Ubuntu環境（[Ubuntu Server 18.04.2 LTS](https://www.ubuntu.com/download/server)） をインストールして、node環境を構築し、いざnpmでパッケージをインストールしようとすると、
![python_err.png](https://qiita-image-store.s3.amazonaws.com/0/280104/bba86cb3-5500-271f-b6e7-b3ccef8bd3ba.png)
「python」が見つからないエラーが出る事あると思います。
んで、ググってみるとよく見かけるのが、

　・Ubuntuには最初からPythonが入っている
　　→「python3」コマンドで起動できます。でもnpmインストールに必要なのは2.7系。

　・Ubuntu2.7系をインストールするには「sudo apt-get install python2.7」
　　→「python2」で起動できます。でもnpmインストール時エラーは回避出来ません。

「ただnpmインストール時のエラーを回避したいだけ」の方は、
このコマンドでインストールすれば、npmからpythonが使える様になります。

```
sudo apt install python-minimal
```
Kotlinでnull+nullするとNonNullになる


ある時、null + nullするとNonNullになったので少し調べました。

#例

```kotlin
val hoge: String = null // エラー
val hoge: String = null + null // エラーじゃない
```

`+`を参照すると次のようになっていました。

```kotlin
public operator fun String?.plus(other: Any?): String
```

次のような場面で遭遇しました。
`Map`の`get`はNullableなので、強制アンラップしたり、例外にしたりでしたが、conf2のようなパターンでは突然NonNullになっています。`nullnull`にいつの間にかならないように注意しないと行けなさそうです。なんか不思議な感じ。

```kotlin
val config = mapOf("aaa" to "bbb")
val conf1: String = config["hoge"] ?: throw Exception() // -> throw Exception
val conf2: String = config["hoge"] + config["fuga"] // -> conf2 = nullnull
```
【Redshift】大量の一時スキーマを消したい

#一時テーブルと一時スキーマの関係
データベースを使っているとき、処理速度を上げるための手っ取り早い方法として
一時テーブルを作成することがある。
CREATE TEMPORARY TABLE *table_name* ...

この時、pg_tempで始まる一時スキーマが作成され
一時テーブルはこのpg_tempスキーマ内に作成される。

そして、ユーザーのコネクションが切断されると
当該ユーザーが作成した一時テーブルはすべて削除される
・・・**が、pg_tempスキーマは残り続ける**

#pg_tempスキーマを消したい
SQLクライアントによるが、pg_tempスキーマが見えるものがある。
そうすると、このpg_tempスキーマが一時テーブルを作成するたびに
どんどん増殖していき、スキーマが大量に存在するデータベースが
めでたく出来上がってしまう。
※バッチ処理で一時テーブル多用するとえらいことになる

#【結論】pg_tempスキーマは消去不可能
SuperUserでDROP SCHEMA することもできず、
Google先生に聞いても似たような事象に遭遇せず、
頼みの綱のAWSサポートに問い合わせしたところ
以下の回答をいただきました。

- pg_tempスキーマは基本的に消去不可
- 同様の問い合わせ多数あり
- 製品担当部署もこの問題を認識
- 対応可否と対応時期は未定 

サポートの人、ありがとうございました！
Djangoでテンプレートを継承したらCSSが上手く適用出来なかった場合の対処法

Djangoではテンプレートを継承することで共通部分を複数回記述することを避けられるという話を聞いたので、
早速Qiitaの記事を参考に下記のコードを書いてみた。

```base.html
{% load static %}
<html>
    <head>
      {% block extra_head %}{% endblock %}
        <title>hoge</title>
    </head>
    <body>
      {%block content%}
      {{content}}
      {%endblock%}
    </body>
</html>

```

```extend.html
{% extends 'homepage/base.html' %}
{% block extra_head %}
  <link rel="stylesheet" href="{% static 'css/extend.css'%}">
{% endblock %}
{% block content %}
<h1>Hello,World!</h1>
{% endblock %}
```

このように書けばbase.htmlを継承したextend.htmlが表示されると思っていたのだが、実際にはTemplateSyntaxErrorが出てしまった。
base.htmlではなくextend.htmlの方でcssを適用しようとしたのだが、どうもそこが上手く行っていないらしい。
その後初心者ながら適当にいじりまわしたところ、なんとか解決法を見つけることが出来た。

```extend.html
{% extends 'homepage/base.html' %}
{% load static %}
{% block extra_head %}
  <link rel="stylesheet" href="{% static 'css/extend.css'%}">
{% endblock %}
{% block content %}
<h1>Hello,World!</h1>
{% endblock %}
```
このようにextend.htmlの2行目に{% load static %}を入れることでエラーを吐かれることなくCSSを適用することが出来た。
どうやらbase.htmlの方に{% load static %}を入れたからといって、extend.htmlの方に入れなくて良いということではなかったらしい。

恐らくほとんどの人は知っていることだとは思うが、俺のような初心者がこの記事を読んで問題を解決出来たら幸いだ。
UnityでPolygon ColliderやEdge Colliderを使わない方法

## UnityでPolygon ColliderやEdge Colliderを使わない方法
複雑な地形を使った2Dゲームを作る場合にはBox Colliderでは対応できないことがありますよね。

しかし、Polygon ColliderやEdge Colliderは処理が重いためあまりお勧めできません。

そこで取るべき方法が、透明なBox Colliderを組み合わせて複雑な地形を作り、それらをまとめた親コンポーネントに透過png画像をはりつけ、複雑な地形を作るのです。

他にやり方があるかもしれません。何か思いつく方はコメントをぜひ。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
[C#]実装で見返すリンク集

# LINQ
LINQでの記載に迷った時
[C# LINQ サンプル集](https://qiita.com/takutoy/items/3187952035acbea373e8)
[LINQチートシート的なもの](https://qiita.com/Marimoiro/items/0e119b47d65bf138789a)

Whereを使ったがもっと良い記載がないか疑問に思った時
[LINQ、そのWhere本当に必要ですか？](https://qiita.com/RyotaMurohoshi/items/037fd1c82773aebd9390)

インデックス付きのコレクションが必要になった時
[【C#,LINQ】インデックス付きで射影(Select)と抽出(Where)【iが欲しい!?】他の言語もちょっと。](https://qiita.com/RyotaMurohoshi/items/118d4aa4d5be8c71c9ce)

# コレクション
コレクションの継承関係や一覧が見たい時
[意外と知らない！？ C#の便利なコレクション！](https://qiita.com/hiki_neet_p/items/75bf39838ce580cca92d)

どのコレクションを使うか迷った時
[C#(.NET)コレクションの使い分けヒント](https://qiita.com/takutoy/items/cb1e94c36296108e5fd7)

簡略化された継承関係図を見たい時、メソッド引数や戻り値としてどのコレクションを使うか迷った時
[引数の型を何でも List にしちゃう奴にそろそろ一言いっておくか](https://qiita.com/lobin-z0x50/items/248db6d0629c7abe47dd)

# Moq
[Moq - GitHub](https://github.com/moq)

Mockの記載に迷った時
[【C#】【Mock】Moq ～ 文法編 ～](https://blogs.yahoo.co.jp/dk521123/21216313.html)

# 非同期処理
再復習したい時
[なんとなくで来ちゃった人向けのデリゲートとイベントハンドラ再復習](https://qiita.com/Ich_wei_/items/1e5993c316f4a78fac79)

[Taskを極めろ！async/await完全攻略](https://qiita.com/acple@github/items/8f63aacb13de9954c5da)
Taskとasync/await何が違うかは、以下のこと先輩に言われました。
Taskは仕事を押し付ける人
async/awaitは別の仕事をしていていいよと返す人と仕事終わったよと報告する人。報告するために戻り値は必要、voidは基本的にはダメ。

[[C#]イベントハンドラとはなんぞや](http://gomocool.net/gomokulog/?p=255)

# ラムダ式
再復習したい時
[C# 今更ですが、ラムダ式](https://qiita.com/rawr/items/11790e9ea08a29d028a4)

# MicrosoftのReferenceSource
メソッドの中身が見たい時
https://referencesource.microsoft.com/

# その他
NULL三兄弟(Null許容型/Null条件演算子/Null合体演算子)について
https://www.wareko.jp/blog/nullable-type-null-condition-operator-null-coalescing-operator-three-nulls-brothers

Stringとstringの違い
大文字のStringを使う場合は、「System名前空間」のusingが必要。
小文字のstringを使う場合は、usingは不要。
https://kuroeveryday.blogspot.com/2014/09/string.html

yield について
コード内で特定の意味を付与するコンテキストキーワードの1つ
yield returnにしておくと、メソッドが実際に利用されるタイミングで実行されるようになる(遅延評価される)。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/yield
https://csharp.keicode.com/basic/yield.php


outとref
参照渡しをするためのパラメーター修飾子
out：return以外に戻り値を渡したいとき
ref:メソッド内の変更をメソッド外に反映されたいとき
https://qiita.com/muro/items/f88b17b5fea3b4537ba7


[is、switchの拡張(型スイッチ)](https://ufcpp.net/study/csharp/datatype/typeswitch/)
特にC#7.0から使えるis演算子の拡張↓は積極的に使おう（コスパ良し）

```cs
            var obj = "test";
            if (obj is string s)
            {
                Console.WriteLine(s);
            }
```

[C# パフォーマンス改善に使える新しめの機能たち 7.0〜](https://qiita.com/hadashiA/items/0c65a999422e7713ed3c)