OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codeでリモート開発環境と完全同期する

この記事は以下の条件に当てはまる人向けに書いています。

- 開発環境が共用のリモートサーバー
- リモートにssh(sftp)でログインできる
- VimじゃなくてVSCodeを使いたい
- `git`と`rsync` `samba` `lsyncd`の併用は遅すぎて無理
- 更新だけじゃなく削除されたファイルも同期したい
- ローカル→リモートの一方通行でOK (でも削除は検知したい)
- 純正のリモート同期が使えない事情がある

ショートカットキーやパスなどMac仕様なのでWindowsの人は適宜読み替えてください。

# 拡張機能のインストール

[sftp](https://github.com/liximomo/vscode-sftp)を入れる。`sftp`で検索すると一番上に出てきます。
<img alt="スクリーンショット 2018-11-09 13.28.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54083/bdc1c63a-9d35-5f77-bfb8-2cc6479e2e23.png" width="500">

# sftpの設定

`Command + P` → `>sftp` で設定ファイルを作成する。

```json:sftp.json
{
    "name": "foobar",
    "protocol": "sftp",
    "host": "foobar",
    "port": 22,
    "username": "foo",
    "privateKeyPath": "/Users/foo/.ssh/foobar_rsa",
    "remotePath": "/home/foo/bar",
    "ignore": [
        ".vscode",
        ".git",
        ".DS_Store"
    ],
    "sshConfigPath": "/Users/foo/.ssh/config",
    "syncOption": {
        "delete": true,
        "skipCreate": false,
        "ignoreExisting": false,
        "update": false
    },
    "uploadOnSave": true,
    "watcher": {
        "files": "**/*",
        "autoUpload": true,
        "autoDelete": true
    }
}
```

|項目(key)|意味|説明|
|-----------------|------------------|------------------|
|name |設定名 |任意の設定名。省略可能。 |
|protocol |プロトコル |ftpかsftp。最近はほとんどsftpなのでよく分からなかったらsftpで。 |
|host |ホスト |リモートサーバーのホスト名。 |
|port |ポート |リモートサーバーのポート名。sftpならふつうは22。|
|username |ユーザー名 |リモートサーバーにログインするユーザー名。|
|privateKeyPath|秘密鍵のパス|リモートログイン用の秘密鍵のパス。パスワードログインの場合は`privateKeyPath`ではなく`password`キーに値としてパスワードを直接書く。|
|sshConfigPath |ssh設定のパス |こだわり設定がある場合は指定しよう。|
|syncOption.delete |同期オプション(delete) |削除を同期するか。|
|syncOption.skipCreate |同期オプション(skipCreate) |新規作成ファイルをスキップするか。|
|syncOption.ignoreExisting |同期オプション(ignoreExisting) |既存ファイルの更新をスキップするか。|
|syncOption.update |同期オプション(update) |ローカル側が新しい場合のみ上書き更新する。|
|uploadOnSave |保存時にアップロード |trueを指定するとファイル保存時にアップロードが行われる。|
|watcher.files |監視するファイル |VSCode以外からのファイル変更を監視する対象。|
|watcher.autoUpload |自動更新 |VSCode以外から変更された場合にリモートを自動で更新する。|
|watcher.autoDelete |自動削除 |VSCode以外から削除された場合にリモートを自動で削除する。|

よきVSCodeライフを♡
PHP Slim3フレームワークで500番エラー（リダイレクトループ）が起きたとき

プルリクエストを送ったが、ここでも同じ理由でさまよっている人向けに備忘録として残しておく
（…Qiitaに備忘録って正直どうなんだろう）
https://github.com/slimphp/Slim-Website/pull/323

# 何が起きたか
Slim3を使ってWebアプリを作っていたのだが、ある程度作って来たタイミングでさくらレンタルサーバーにアップロードをしてみた。

すると、500番エラーが表示されてindex.php以外が全く見れない（slim3の処理範囲外のページは見れた）

てことで、ログを見る
※さくらレンタルサーバーの場合はサーバーコントロールパネルのアクセスログの設定メニューからエラーログが見れます

```
[Fri Nov 09 13:17:39.191931 2018] [core:error] [pid 61852] [client 000.000.000.000:0] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: ○○○○○○
[Fri Nov 09 13:17:39.271332 2018] [core:error] [pid 61853] [client 000.000.000.000:0] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: ○○○○○○
```

リダイレクトループ…？`.htaccess`の仕業だなとなんとなく予想を付けた

# 修正内容

`.htaccess`を以下のように修正した

[公式ドキュメント](https://www.slimframework.com/docs/v3/start/web-servers.html#apache-configuration)の`.htaccess`はこう

```
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
```

これに1行追加

```
RewriteEngine On
# 以下1行を追加
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
```
リダイレクトのベースディレクトリを指定して無事表示されるようになりました、やったぜ。

# 後書き

このWebアプリはいろんな環境（DockerとかXAMPPとかラズパイとか）で開発してて問題なく動いてるからレンタルサーバーでも動くっしょっと勘ぐってたら動かなくて焦った。

さて、この記事が誰かの役に立つ日は来るのだろうか……
iOS 11 SafariのCORSに関する仕様変更点

※ はてなブログからこちらへ技術ネタを移動しました
※ 2017-09-25 初稿

iOSのアップデートをしました。iOS 11です。
純正ブラウザであるSafariにも公表されていない仕様変更がいくつかある模様です。
今回はそのうちの一部であるCORS処理について。
※ 雑な検証の上で判った（つもりになっている）仕様変更点です。

~~【変更点】
CORS (Cross Origin Resource Sharing)関連のレスポンスヘッダである
`Access-Control-Allow-Origin`ヘッダーにワイルドカードが使えない（または、使えない場合がある）。~~

~~これまでも、`xhr.withCredentials = true` ならば`Access-Control-Allow-Origin: http:///hoge.example.net` のようにワイルドカードでない値を返す必要があったが、`xhr.withCredentials = false` でもそのようにすべき、という事になりました。
バグかもしれませんが、新仕様かもしれません。~~

~~【追記】上記はもしかすると大嘘かもしれません。追加検証中ですが、safariのブラウザキャッシュがOriginヘッダの有無を考慮していないのが原因で現在私がトラブっているだけかもしれません。~~

【追記】大嘘でした。開発中のWebアプリケーション内で、Cross OriginなResourceに対するリクエストが「1. browser-nativeなloader経由」と「2. XHR経由」で重複して発生しているのが原因でハマってました。
1が先に起こる＝Originヘッダなしリクエストに対してCORS関連ヘッダのないレスポンスが帰ってきてブラウザにキャッシュされる。
続いて、2のリクエストが起こる＝CORSヘッダの無いブラウザキャッシュが返るが、その後段のcross originチェックで弾かれてxhrがfailする。
という流れです。前々から気になっていたことですが、やはりSafariはブラウザキャッシュの管理が雑すぎて時々ハマります。

【追記終わり】


by-nameでAccess-Control-Allow-Originヘッダを作る方法。
S3の場合、CORS設定のルールの中で

```
<AllowedOrigin>*</AllowedOrigin>
```

となっている部分を

```
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
```

と変更すれば良いみたいです。

Thanks to 
[Getting S3 CORS Access-Control-Allow-Origin to dynamically echo requesting domain - stackoverflow.com](https://stackoverflow.com/questions/24424490/getting-s3-cors-access-control-allow-origin-to-dynamically-echo-requesting-domai)

自前appサーバの場合は自分でCORSヘッダーをうまく作ってください。
円周率の中から連続する10桁の最初の素数を見つける

### 与えられた数列の中から連続するN桁の最初の素数を見つけるプログラム

```python
def is_prime(n):
# nが素数かどうか判定するプログラム
    for p in range(2, int(math.sqrt(n)) + 1):
        if n % p == 0:
            return False # 素数でないならFalseを返す
    return True # 素数ならTrueを返す

def get_prime(str_num, N):
# 文字列として受け取ったstr_numからN桁の最初の素数を見つけるプログラム
    for i in range(0, len(str_num) - N):
        if is_prime(int(str_num[i : i + N])) is True:
            print(i,'-th,',  str_num[i:i + N] )
            break
```

### 実行結果
`math.pi`を文字列にして上のプログラムを実行。

```python
>> import math
>> str_pi2 = '3' + str(math.pi)[2:]
>> get_prime(str_pi, 10)
4 -th, 5926535897
```
### 追記
@shiracamusさんにもっとカッコイイ書き方を教えていただので追記。
元コードではforとifで判定していたが、allですっきりとかける。またsqrtも`n**0.5`にすることでmathをインポートせずにかける。

```python
def is_prime(n):
    """nが素数かどうか判定する"""
    return all(n % p != 0 for p in range(2, int(n**0.5) + 1))
```

こちらも元コードではforとifで判定していたが、イテレータでワンライナーに。あと` range(len(str_num) - N)`のようにNを引くのを忘れていることに気づきました。(修正済み)

```python
def get_prime(str_num, N):
    """文字列として受け取ったstr_numからN桁の最初の素数を見つける"""
    i = next(i for i in range(len(str_num) - N) if is_prime(int(str_num[i:i+N])))
    print(f'{i}-th, {str_num[i:i+N]}')
```
## もっと長い桁数の素数を見つけたい場合
### 円周率の計算
`math.pi`や`numpy.pi`の円周率では有効桁数が足りないので自分で計算する必要がある。そこで、[ガウス＝ルジャンドルのアルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%EF%BC%9D%E3%83%AB%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%89%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)を用いてN桁の円周率を計算。また、decimalモジュールを使い正確に浮動小数点計算を行う。(じゃないとOverflowしちゃうよ！)

```python
import math
from decimal import *
def get_pi(N):
# N桁の円周率をガウス＝ルジャンドルのアルゴリズムで計算するプログラム
    max_iter = 2*math.ceil(math.log2(N))
    getcontext().prec = N

    # 初期値の設定
    a_n = 1
    b_n = Decimal(1) / Decimal(2).sqrt()
    t_n = Decimal(1) / Decimal(4)
    p_n = Decimal(1) 

    for n in range(0, max_iter):
        a_next = Decimal((a_n + b_n) / 2)
        b_next = Decimal(a_n * b_n).sqrt()
        t_next = Decimal(t_n - p_n * (a_n - a_next) ** 2)
        p_next = Decimal(2 * p_n)

        a_n = a_next
        b_n = b_next
        t_n = t_next
        p_n = p_next

    return Decimal((a_n + b_n) ** 2) / Decimal(4 * t_n)
```

### 実行結果
10000桁の円周率を計算しその中から15桁の最初の素数を見つける。

```python
>> pi = get_pi(10000)
>> str_pi = '3' + str(pi)[2:]
>> get_prime(str_pi, 15)
35 -th, 841971693993751
```
AWS ElasticBeanstalk で Docker 動かすときの備忘録

※ はてなブログからこちらへ技術ネタを移動しました
※ 初稿: 2018/07/20

単一コンテナ環境で何回かやってるんですが、dockerコンテナのデプロイ方法には2種類あります。この方法の選択についていつも忘れてしまうので備忘。

方法1: Amazon ECR などに事前に `docker build` したイメージを push しておいて、ElasticBeanstalk に Dockerrun.aws.json だけを食わせて ECR からpullしてきて起動
方法2: railsのファイルやらDockerfileやらを全部 zip にしてeb deployか何かでアップロードする

普通に考えれば、方法1は可搬性のあるdockerということだし手元で `docker build` してしまったほうがエラー対処の手戻りが少なかったり、EB上でbuildしなくていいのでEBのUpdating state時間が少なくなって楽なのだが、ある問題が生じる。

問題：
.ebextensions でdocker hostに関する設定のinjectionができない。
したがって（単一コンテナ環境では）awslogs (CloudWatch Logs) へのアプリケーションログのストリーミングを行う手段がない。
※方法1ではEBはDockerrun.aws.json というマニフェストに従って docker image のみをpullするので.ebextensionsが介入するタイミングが無いとかそういうやつ。

ということで、deployプロセスが冗長になりがちだが仕方なく方法2を使うのである。デプロイの時間はもちろん長くなるが、苦渋の選択です。
Elastic Beanstalkへのデプロイ方法その3

※ はてなブログからこちらへ技術ネタを移動しました
※ 初稿: 2018/08/30

先日の記事で、Elastic Beanstalkへのデプロイ方法には2通りあると言った。このたび、その2通りのちょうど中間に当たる方法が解ったのでメモ。前提として, awsebcliというpipパッケージを利用してコマンドラインベースでdeploy処理を走らせる場合のお話。
[AWS ElasticBeanstalk で Docker 動かすときの備忘録](https://qiita.com/qpSHiNqp/items/6781039dcaea967bfc00)

上記の2パターンをまとめると下記のようになる。

### パターン1: 丸ごとzipアップロード方式
メリット:

- 簡単
- .ebextensionsによるeb環境ホストの設定injectionが可能

デメリット:

- デプロイ所要時間が長い
- eb deployコマンドのデフォルトの挙動で, ebプロジェクトルートディレクトリ内すべてをzip化し, ebプラットフォームにアップロードする。

eb環境ホストは上記zipを落としてきて, docker buildした後docker runし, アプリケーションが動き出す。

### パターン2: dockerリポジトリpull方式
メリット:

- デプロイ所要時間が短い

デメリット:

- .ebextensionsによるeb環境ホストの設定injectionができない
どこかのdockerリポジトリに予めdocker buildしたimageをpushしておく。

Dockerrun.aws.jsonファイルにそのimageの所在（リポジトリ:タグ）を指定しておき, Dockerrun.aws.jsonファイルのみをebプラットフォームにアップロードする。

eb環境ホストはDockerrun.aws.jsonに指定されているdocker image情報をもとにリポジトリからimageをpullし、docker runすることでアプリケーションが動き出す。

### 中間手法: buildartifact.zip方式
メリット:

- デプロイ所要時間が短い

- .ebextensionsによるeb環境ホストへの設定injectionが可能

デメリット:

- デプロイの下準備が比較的面倒

eb deployによりzipアーカイブをアップロードし, それをもとにdocker runするのはパターン1と同じなのだが, zip生成過程を自前で準備するという点がパターン1と異なる。

zipアーカイブの中身に, 動かしたいdocker imageのリポジトリ:タグ情報を格納したDockerrun.aws.jsonと、.ebextensionsディレクトリのみを格納する。

これにより、パターン2と同様にeb環境ホスト側でのdocker build処理を回避しつつ、.ebextensionsによる設定injectionを可能にしている。

まあ、知っている人は知っているのかもしれないがいろいろと試行錯誤したのちにこの方法に落ち着いた。
頂点シェーダーアニメーション入門

2018/11/8に開催された**「[Unity Shader 勉強会](https://connpass.com/event/103300/)」**と言うイベントにて登壇した際の発表資料です。
こちらもほぼ個人用に纏めたスライド中のリンク一覧のメモみたいなものですが折角なので公開。

**[【スライド】頂点シェーダーアニメーション入門](https://docs.google.com/presentation/d/1F7HAdPVSmZ159egi4RBpUVtLZ0_9s_NcwUAcXBIY0cM/edit#slide=id.g45a9342bcf_0_48)**





# ▽ 各種リポジトリ & サンプル

- **[mao-test-h/VertexShaderSample](https://github.com/mao-test-h/VertexShaderSample)**
    - 登壇資料用 サンプルリポジトリ
    - Unity2018.3.0b8で実装/動作確認
- **[Wiggle.shader](https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/Samples/Assets/SampleAssets/Shaders/Wiggle.shader)**
    - 頂点シェーダーアニメーションの一例として紹介した物。BoidExampleの魚の動きにて使用されていた物。
- **[sugi-cho/Animation-Texture-Baker](https://github.com/sugi-cho/Animation-Texture-Baker)**
    - アニメーションの応用例にて引用させて頂きました。
    - ※但しスライド中のコードサンプルはこちらを参考に以前実装したECSのアニメーションサンプルのを掲載。
        - **[mao-test-h/ECS-AnimationSample](https://github.com/mao-test-h/ECS-AnimationSample)**



# ▽ モデル X ビュー X プロジェクション変換について

- **[opengl-tutorial : チュートリアル3 行列](http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/)**
- **[バーテックスシェーダによる座標系変換](http://tkengo.github.io/blog/2015/01/10/opengl-es-2-2d-knowledge-3/)**
- **[MVP行列による座標変換について](https://matcha-choco010.net/2018/08/30/mvp%E8%A1%8C%E5%88%97%E3%81%AB%E3%82%88%E3%82%8B%E5%BA%A7%E6%A8%99%E5%A4%89%E6%8F%9B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)**
- **[Image Based Shader Programming](http://esprog.hatenablog.com/entry/2018/11/08/190841)**
   - ※主催者であるEsさんの登壇資料の完全版。16ページ目～の「3DCGざっくり基礎」にて解説されております。



# ▽ その他

- **[Unityシェーダープログラミングの教科書 ShaderLab言語解説編](https://s-games.booth.pm/items/660001)**
    - 今回の講演ではShaderLabの言語仕様までは詳しく触れていなかったので、代わりに参考書籍として紹介させて頂きました。
- **[空間とプラットフォームの狭間で – Unityの座標変換にまつわるお話 –](https://tech.drecom.co.jp/knowhow-about-unity-coordinate-system/)**
    - Unityに於ける行優先と列優先の違いについて、**「Script(C#)側は列優先となっているが、Shaderの方は行優先となっている上に中身が転置されていないので計算自体は列ベクトル想定で行う必要がある」**と言う旨について解説されている。
        - 個人的に割と混乱する箇所な感じに思えたので...例えば既存のコードを移植する際などに念頭に置いておくと幸せになれる場合があるかもしれない。。
- **[成分ごとの演算 (DirectX HLSL)](https://msdn.microsoft.com/ja-jp/library/ee418342(v=vs.85).aspx)**
    - スウィズル(swizzle)演算子について
【swift4】UICollectionViewのドラッグ時のプレビューをカスタマイズする

iOS11から、新しくドラッグ＆ドロップまわりのメソッドが追加されました。
以下の記事がとても参考になるので、ぜひご一読ください。
[collection viewとtable viewにおけるDrag & Drop[WWDC 2017]](https://qiita.com/akatsuki174/items/63606d42fb9b39bb97c9)

## ドラッグ時のプレビューをカスタマイズする方法
本題ですが、、
UICollectionViewのドラッグ中のプレビュー画像のカスタマイズに関する記事があまりなかったので投稿させていただきます。

ドラッグ中は、デフォルトではドラッグ中のアイテムのcellがプレビューに使われます。cellの一部分だけを使うなどカスタマイズしたいときは以下のメソッドを使います。

```swift
    func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
        let previewParameters = UIDragPreviewParameters()
        //ドラッグ中のViewの背景を透明にする
        previewParameters.backgroundColor = UIColor.clear
        return previewParameters
    }
```

他にも、プレビューを円で表示したいとかのときは以下のようにすれば、実現が可能です。

```swift
    func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
        let previewParameters = UIDragPreviewParameters()
        let path = UIBezierPath.init(ovalIn: CGRect.init(x: 0, y: 0, width: 100, height: 100))
        
        previewParameters.visiblePath = path
        return previewParameters
    }
```

今、ちょっと個人的に困っているのは、切り抜いたプレビューに影がついてしまうのですが、影をなくしたく、、、でも方法が見当たっていません。どなたか知っている人いれば、情報いただけますと幸いです。
HerokuでRails動かすときのカスタムLogFormatterでハマった話

※ はてなブログから技術ネタを移動しました
※ 初稿: 2018/03/31

## TL;DR
結論から言うと、Rails 5を使うときはrails_12factor gemは使わないほうが良さそう。

## くわしく
アプリケーションログベースでの監視をしたい/アラートを上げたいので、loggerの上げるログのseverity（ログレベル）の情報はかなり重要。この辺の情報はloggerのformatterにActiveSupport::Logger::SimpleFormatterを使っちゃうと消されてしまうが、::Logger::Formatterを使えば指定すれば消されずに出力される。

```ruby:config/environments/production.rb
config.log_formatter = ::Logger::Formatter.new
```

しかし、herokuにデプロイしているアプリで上記のFormatterが動いてくれずに非常に時間を消費してしまった。いくらformatterを変えても、強制的にActiveSupport::Logger::SimpleFormatterが使われてしまう。そういえば、[rails_12factor](https://github.com/heroku/rails_12factor) gemってherokuでログを標準出力に吐き出す設定を良しなにやってくれるgemだったっけ？考えられるとしたらこれしか無いな...

よく読んでみると
> If you are starting a new application with Rails 5, you do not need this gem.

Rails 5ではもうこのgem要らないらしい。マジか。

Gemfileからgem "rails_12factor"の行を消したらちゃんと動いた。
Amazon Elastic Beanstalkのお付きのRDSはけっこうやばい

※ はてなブログから技術ネタを移動しました。
※ 初稿: 2018/10/03

例のごとく、備忘録程度に

Elastic Beanstalkで環境を新規作成するときに、同時にRDSインスタンスを作ることができるんですよね。
で、安定稼働してしまうと、どうしてもappサーバとdbサーバは別々に動いていると思い込んじゃう。
ある日突然ebの環境が調子悪くなったりして「再構築」ポチッと押すと、昔々ebの環境の一部として作ったRDSインスタンスまで落とされて再構築されてしまい、現場は大パニックに。なんてことが起こることがあるかもよ？
これ、どれくらい皆さんやらかすのか分かってないんですが、やりがちっぽいし、自分もやっちまったし、やばい。
まあ、RDSはebの環境とは別体で作るのが良さそう。
[rails]最近覚えた初歩的だけど大事なこと

# 最近覚えた初歩的だけど大事なこと
最近railsをはじめてこれは大事なだなと思ったことをメモ。

## 例
```.rb
class Article < ActiveRecord::Base
  belongs_to :adviser
end
```
例えばarticleに紐づくadviserのnameを取ろうとしたとき

```.slim
p = @article.adviser.name
```
という感じで表示していた。

## が、どうもデメテルの法則とかいうのに反しているらしい。
### デメテルの法則
>あるオブジェクトAは別のオブジェクトBのサービスを要求してもよい（メソッドを呼び出してもよい）が、オブジェクトAがオブジェクトBを「経由して」さらに別のオブジェクトCのサービスを要求してはならない

## delegateを使用する
これを解決するには

```.slim
p = @article.adviser_name
```

という形だったら問題なさそうなのでこの形にしたいと思う。
これを実現するためにはdelegateというのを使う必要があるっぽい！

modelに

```.rb
class Article < ApplicationRecord
  delegate :name, to: :adviser, prefix: true, allow_nil: true
end
```
こう書くと

```.slim
p = @article.adviser_name
```
これで取れるらしい。

### 解説
このdelegateを解説させてもらうと、
:nameで委譲するメソッド、to:で委譲先、prefix:をtrueにすれば委譲先_委譲するメソッドで取れるし
falseにすれば委譲先.委譲するメソッドとなるらしい。
allow_nil:はnilを許可するかしないか。


## まとめ
こんな感じでrailsエンジニアからしたらどうとでもない内容にしまったが
自分としては結構役に立った。
SlackのWebAPIを直接呼ぶときに困ったこと

# はじめに
![cloudfunding-198x148.jpg](https://qiita-image-store.s3.amazonaws.com/0/165224/b3ece023-7f9a-4c7b-b183-d56cea48acad.jpeg)
会社で[Unibo](https://www.unirobot.com/)というAIロボットを扱っているのですが、[こちら](https://qiita.com/dama-a/items/88988f0229d124275d51)の記事にある通りSlackとつなげてみようということになりました。
が、巷にある**Slackと繋げてみた**系の記事は軒並みランタイム環境用の**ライブラリ**を使っているものばかり。。
Uniboは、直接ソースからプログラムを実行することができず、また**SkillCreator(Node-REDベース)**でアクションを定義することができますが、オリジナルのNode-REDのように自由にノードを追加することが**できない制約**があります。
そこで、Slack公式のAPIドキュメントを眺めつつ、直接APIをHTTP Requestするよう実装するには？で若干ハマりましたので、記事を起こしました。

# 困ったこと
UniboはロボットなのでBotTokenを取得して、BotとしてメッセージをSlackに投げるわけですが、APIは *chat.postMessage* を使用することになります。
で、公式のAPIドキュメントではこう書かれています。
**[chat.postMessage](https://api.slack.com/methods/chat.postMessage)**
<img width="468" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/f195064d-efbc-3a9c-0563-5c117169bb68.png">

なので、tokenはchannelと同様にリクエストパラメータで送信してしまいそうになりますよね。

```javascript
msg.payload = {
    "token": "xoxb-...",
    "channel": "CDVSKQUAZ",
    "text": "hello!"
};
return msg;
```

で、これをやると、Slackサーバーからは、こんな感じにツーンとされます。

```json
{
	"ok": false,
	"error": "not_authed",
	"warning": "missing_charset",
	"response_metadata": {
		"warnings": [
			"missing_charset"
		]
	}
}
```
認証されてないよ！

# 解決方法
結局、tokenってOAuth（認証のしくみ）のものなので、これに従ってHTTP Requestしてやる必要があります。
つまり、ヘッダに**"Authorization"**を指定してやります。
SkillCreator(Node-RED)だと、こんな感じ。

```javascript
msg.headers = {
    "content-type": "application/json",
    "Authorization": "Bearer xoxb-..."
};
msg.payload = {
    "channel": "CDVSKQUAZ",
    "text": "hello!"
};
return msg;
```

**"Bearer"**については、[このあたり](https://qiita.com/uasi/items/cfb60588daa18c2ec6f5)に記事がありました。

# まとめ
ライブラリは便利です。
が、ライブラリを使わなくても公式のWebAPIをそのまま使用することができます。
そんなときは、初心忘れるべからず。
**ドキュメントはちゃんと読め。**

<img width="464" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/7cbed206-6c45-b7fc-37e8-6e42390e5e03.png">

https://api.slack.com/web#posting_json
<img width="464" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/ba85bd72-eca7-3020-6921-e5f762a0e44b.png">


以上です。
Python のmapに複数引数の関数を用いる場合について


### 目的
pythonでリストに対して関数操作したいときにmapを用いて高速化を図りたい。
操作する関数が複数引数受け取るときに困ったのとリスト内法表記とどちらが早いのかを試したのでそのメモがてらまとめました。
リスト内法表記について初耳な方は[こちら](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)を参考にして頂ければと思います。

### 引数が1つの場合
たとえばリスト内の数字を全て2乗にしたいときは次のexample_map.pyのように書けます。

``` python:example_map.py
def square(x):
    return x**2

test = [1,2,3,4,5]
test_result = map(square, test)
print(list(test_result)) # [1,4,9,16,25]
```

これは以下のコードと等価です。

```python:example_normal.py
def double(x):
    return x**2

test = [1,2,3,4,5]
test_result = []
for i in test:
    test_result.append(square(x))
print(test_result) # [1,4,9,16,25]
```

リスト内法表記については簡単なので省略。

### 引数が複数の場合
複数引数をとる関数にmapを適用させたいときとかあると思います。その時は以下のように書けます。

``` python:example_map_double.py
def matmul(x, y):
    return x*y

test1 = [1,2,3,4,5]
test2 = [3,4,5,6,7]
test_result = map(matmul, test1, test2)
print(list(test_result)) # [3,8,15,24,35]
```

これは以下のコードと等価です。enumerateについては[ここ](https://qiita.com/wwacky/items/27402b5aa27b34423ec0)とかを参考にして頂ければと思います。

```python:example_normal_double.py
def matmul(x, y):
    return x*y

test1 = [1,2,3,4,5]
test2 = [3,4,5,6,7]
test_result = []
for i,k in enumerate(test1):
    test_result.append(matmul(k, test2[i]))
print(test_result) # [3,8,15,24,35]
```

また、同じpythonのリスト操作の高速化の手段としてリスト内法表記がありますが、複数引数の場合だと一旦zipに渡して、[(リスト1の要素1,リスト2の要素1),(リスト1の要素2,リスト2の要素2),(...,...),...]という形にしないといけません。下記のようになります。

```python:example_normal_double.py
def matmul(x, y):
    return x*y

test1 = [1,2,3,4,5]
test2 = [3,4,5,6,7]
test_result = [matmul(k, d) for k,d in zip(test1, test2)]
print(test_result) # [3,8,15,24,35]
```

mapとどちらが便利かと言われたら微妙なところですね。

### mapとリスト内法表記のスピード比較
スピードを比べてみました。異なる配列を用意してもやることは変わらないので同じ配列を各引数に入れる形にしました。また10回実行した平均を出しました。

```python:example_speed_vs.py
def mutmal(x,y):
    
    return x*y

a = range(100000)

sum_time = 0
for k in range(10):
    start = time.time()
    b = map(mutmal, a,a)
    c = list(b)
    sum_time += time.time() - start
print(c[:5]) # [1,4,9,16,25]

print("finish in {}s".format(sum_time/10)) # 0.014s
sum_time = 0
for k in range(10):
    start = time.time()
    b = [mutmal(d,k) for d,k in zip(a,a)]
    sum_time += time.time() - start
print(b[:5]) # [1,4,9,16,25]

print("finish in {}s".format(sum_time/10)) # 0.017s
```

結果としてはあまり変わらないですね。関数の引数が3以上の場合でも使えます。

### まとめ
mapとリスト内法表記、性能はどちらも変わらないので関数をリストの各要素に作用させたい場合はどっちを使ってもよさそうです。コードが短くなるmapの方が良いんですかね...

### 追記
@shiracamus さんからいただいたコメントを元に、%timeit を使ってjupyter notebookで実行しました。

```python

def mutmal(x,y=3):    
    return x*y

a = range(100000)

%timeit b = list(map(mutmal, a))
# 14.6 ms ± 961 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit b = [mutmal(d) for d in a]
# 17 ms ± 972 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
```

標準偏差も出力されるのでこれは便利ですね、mapの方が少しだけ早い、という結論になります。
javascriptのif文で2つ以上の数値を比較する（範囲指定、条件分岐）

# TL;DR
* javascriptで2つ以上の数値を使って範囲を示す条件式を書く場合、「&&」で連結する必要がある

```javascript
var a = 3;

if (1 <= a && a < 5){
  //処理
}
```

# 自戒
* javascriptを普段あまり使わないので、下記のように書いてしまっていた。
* 「条件式あってるはずなのになんで思った通りの処理ができないんだ？？？」って1時間くらい悩んだので、自戒の念を込めてメモしておく。


```javascript
var b = 5;

if (1 <= b < 5){
  // 処理A
} else if (5 <= b < 10) {
  // 処理B
}
```
NodeInvocationException:document is not definedのエラーが出る

## NodeInvocationException:document is not defined

.NET CoreとAngularの開発において、複数のパターンでこのエラーが出た。
ソースのサーバサイドレンダリング設定箇所を修正し、解決した。

## 開発環境

Windows 10 ver 10.0.17134
Visual Studio Community 2017 ver 15.7.1
.NET Framework ver 4.7.03056
.NET Core Framework ver 2.0.7
Angular ver 4.2.5
ブラウザ　Fire fox ver 63.0.1

## 問題が発生した状況

ASP.NET CoreとAngularを使用してWebサイトを開発していると、二つのパターンで同じエラーが出るようになった。
一つ目は、以下の画面上でボタンをクリックしたとき。
![キャプチャ40.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/77d0f11f-e4da-b833-a692-f66086dc1e7a.png)

このようなエラーになる。
![キャプチャ41.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/4675feea-9b43-279d-97c6-dfd0842ea6bd.png)

もう一つは、URLにパラメタが含まれる以下の画面を開き、ブラウザ再表示を行ったとき。
![キャプチャ31.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/69ffe060-e896-d700-59b2-db31eeab0d77.png)

同じエラーになる。
![キャプチャ30.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/c852b36e-d9ad-2b58-e41b-3adbfe356f20.png)


## 対処方法

初回の表示は問題がなく、それぞれリダイレクトした後でエラーが出ている。そのため、サーバーサイドレンダリングの関係かと思って調べていたところ、以下のサイトで解決方法を発見した。

[ASP.NET CORE 2 + ANGULAR 4: NodeInvocationException: Prerendering failed because of error: ReferenceError: window is not defined](https://stackoverflow.com/questions/46695079/asp-net-core-2-angular-4-nodeinvocationexception-prerendering-failed-because)

内容は、Views\Home\Index.cshtmlの、サーバサイドレンダリングを有効にするモジュール設定項目を書き換える。

```Index.cshtml
@{
    ViewData["Title"] = "Home Page";
}

@*<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app> この行を削除する。*@
<app asp-ng2-prerender-module="ClientApp/dist/main-server">Loading...</app> @*この行を追加する。*@

<script src="~/dist/vendor.js" asp-append-version="true"></script>
@section scripts {
    <script src="~/dist/main-client.js" asp-append-version="true"></script>
}

```

Angularを使っている場合は上記が解決方法になるが、他にもサーバサイドレンダリングをしない方法もある。

```Index.cshtml
<app>Loading...</app>
```
## 余談：サーバサイドレンダリングの速度調査結果

サーバサイドレンダリングを使用する場合としない場合とのレスポンスの速度を、開発中のサイトで計測してみた（上記asp-ng2-prerender-moduleを指定する場合と、記載しない場合）。本番環境で想定しているデータ量の範囲内だと、どちらも500ms未満で返ってきたため、違いが分からなかった。。。
pandasのCSV読みだしでInitializing from file failedエラーが出た場合

## 症状
kaggleのデータを読みだそうとしてpandasで`read_csv`すると`Initializing from file failed`が出てしまった.
このエラーはpandasの古いバージョンを使っている時に, 日本語(というかマルチバイト文字)を含むファイルを読みだそうとすると出ることが多いエラーらしいが, 英語圏のデータだし,マルチバイト文字でひっかかった可能性はなさそう.

## 解決法
権限の問題だった. `chmod 777 hogehoge.csv`とかしたら治った.あほらしい.
Azure Functionsのチュートリアルについて

Azure Functionsのチュートリアルに関して公式の手順の一部が
変更になっていたため、備忘録として記録しておきます。

### チュートリアル
---
+ Azure Logic Apps と統合される関数を作成する

電子メール通知を追加するの項目ですが、現在は正の手順となります。

誤：[新しいステップ] > [条件の追加] 
正：[新しいステップ] > [制御] > [条件]
Macでls -lの短縮コマンドをエイリアスに登録

# はじめに
Macでls -lコマンドをllと短縮すると利用できない、、
不便だなーと感じたので、aliasコマンドを利用し、コマンドの短縮を実現しました。
aliasをシェルスクリプトに記載し、これをMac起動時に実行されるようにします。

#　.bash_profileへ記述
Macのホームディレクトリで.bash_profileに以下の記述を記述します。
.bash_profileがない方は新規に作成することになります。

```
if [ -f ~/.bashrc ]; then
        . ~/.bashrc;
fi
```

#　.bashrcへ記述
実行したいaliasコマンドを記述します。
このファイルに関しても、ない場合は新規に作成します。

```
alias ll='ls -l'
```
AWS Certified Cloud Practitioner (CLF)の認定を受けました

本エントリはタイトルの通りAWS認定(CLF)を受験して合格までの体験記となります。

受験日：2018年11月某日


### 前提知識
---
+ AWSの操作経験(EC2,Lambda,SNS,S3) 1年
 
業務でEC2を利用する機会があり、EC2の簡単な操作は理解出来ているレベルです。
書籍でLambda、SNS、S3などチュートリアル通り操作した経験あり。

### 認定を受けようと思った理由
---
業務でAWSを利用する機会が拡大しそうだったこと。
自分が会社の中で第一人者としてAWSを先導していけば大きな経験が積めると考え
AWSの各サービスやソリューション、セキュリティ面を一から学ぼうと考えました。
その中でCLFというAWSの初歩的な知識を認定する試験を知り、また、体系的に学習できる
トレーニングの存在などから試しに受験してみようと思ったのがキッカケです。

### 学習期間
---
CFLを取得しようと考えて10日程で受験を行いました。

+ 受験までにやったこと

AWS認定で推奨されている通りにやりました。

1. AWSトレーニング
2. ホワイトペーパー
3. 書籍による学習
4. 模擬試験


+ AWSトレーニング

AWS Cloud Practitioner Essentials
7時間オンラインの動画を見るのは辛かったですが通勤中などを利用して学習しました。
音声が日本語に変換されているためとても理解が深まりました。

+ ホワイトペーパー

セキュリティに関するホワイトペーパーを読みましたが
AWSトレーニングの内容と被っている事が多かったので
あまり読み込みませんでした。

+ 書籍による学習

ネットでおすすめされていた書籍を購入して2周読み込みました。
【合格対策 AWS認定ソリューションアーキテクト - アソシエイト】

体系的に学習するにはとても良い本だと思います。
ただ、ちょいちょい執筆日から変わったり追加されたサービスがあるので
最新の情報は逐一収集する必要があると感じました。

+ 模擬試験

無料だと思ってたら2000円かかるんですね・・・
オンラインで即受講できます。満点でした。

### 受験日
---
PSIの試験は初めてで戸惑いましたが無事合格できました。
スコアは855点でした。


### 余談
---

試験会場スタッフに案内され、座席に座ると身分証明書をスキャナに置けと
指示がでます、そのあともう一つのID・クレジットカードをカメラに向けろと
指示がありますが、かざしても反応がないためチャットでこれでいい？と
質問したところ、問題ないぜOKだ、と連絡来たのが面白かったです。

試験自体は模擬試験より難しいですが（そりゃそうか）、サービスの役割や
責任範囲、AWSの利点をしっかり抑えておけば問題ないかと思います。
bq query --max_rows（--n）に指定できる最大値

## 調査経緯
Cloud ShellやVMインスタンスからbq queryでBigQueryに接続してクエリ発行したとき、「--max_rows=行数」または「--n=行数」で指定できる最大値が日本語の公式リファレンスに記載されていなかった。

[bq コマンドライン ツール リファレンス](https://cloud.google.com/bigquery/docs/reference/bq-cli-reference)

## 推測
bq query --helpでオプションを確認したところ以下のようになっていたので、integerの最大値と推測する。
![キャプチャ1_bqヘルプ_トリミング後.png](https://qiita-image-store.s3.amazonaws.com/0/311571/4a04fd8b-d1db-6514-8f28-0cb2ea90dafe.png)


integerの最大値は「2147483647」なので、
「bq query --max_rows=2147483647 "実行したいクエリ"」で正常終了、
「bq query --max_rows=2147483648 "実行したいクエリ"」で異常終了すれば、推測通り。

## 結果
--max_rows=2147483647の場合
![キャプチャ1_bq実行_正常_トリミング_隠し.png](https://qiita-image-store.s3.amazonaws.com/0/311571/e5035482-b26c-03ef-30dd-5f7597a34d54.png)

正常終了。

--max_rows=2147483648の場合
![キャプチャ1_bq実行_異常_トリミング_隠し.png](https://qiita-image-store.s3.amazonaws.com/0/311571/353bee7c-90a6-1317-5104-155af446692e.png)

異常終了。BigQuery error in query operation: Value out of rangeが表示された。

以上から、「--max_rows（--n）」に指定できる最大値は「2147483647」と判明。
全ての開発者が学ぶべき３つの言語

どの言語を学ぶべきかがトレンドで大盛況ですね。
でも私はその全ての論争を終結し得る、もっと習得が必要となる３つの言語をピックアップしました。
**きっと全ての開発者がこれに賛同してくれることでしょう。**

# 1.日本語（母国語）
日本語は日本国における公用語ですが、日本人にとっては母国語に当たります。
母国語が日本語ではない方は、日本語の記述を**母国語**に置き換えて読んでみてください。
これははっきり申し上げますが、日本語を習得せずに日本で仕事をするなど**不可能**です。

## 日本語ができることのメリット

### 日本語の資料を読み書きできる
日本で仕事をすれば間違いなく日本語の資料が存在します。
顧客の要望や仕様書、プレゼンテーション、メールに至る日本人からのドキュメントは全て日本語です。

日本語を正しく読み理解する能力がなければ、その人が何を希望しているのか汲み取ることはできません。
日本語を正しく書くことが出来なければ、自分が何を言いたいかも伝えられません。
Qiitaも書けないし読めないんです！

### 日本人と話せる
日本語の聞き取りとスピーキングができれば、日本人と話すことができます。
読み書きよりもエビデンスが残りにくいというデメリットは存在しますが、その場で迅速にコミュニケーションを取ることが出来ます。

### 日本人を顧客にできる
日本語の喋れない日本人を相手にビジネスしたいですか？
私は嫌ですね……時々いますけど。
仮に日本生まれの日本人なのに、日本語が喋れない人と日本国ベースで仕事ができる人が居たら教えてください。

### コミュニケーションロスが減る
自分が考えている内容を考えている通りに文章や言葉にできれば、相手から「それはどういうことですか？」と聞き返される回数が減ります。（人間は意識を共有できる高等な生物では無いので、ロスを０にすることはできません）

日本語は特に主語が抜けやすい言語ですが、正しく表現することができれば有用な言語です。
ロスを減らすこと、それはすなわち早く仕事を終わらせることに繋がります。

## 日本語ができないことによるデメリット

### 言ってることがわからない
文章や話の理解力を欠いた状態で仕事することはできません。何故なら人の要望を理解せずに、その人の希望するものを作り出すことはできないからです。

### 思っていることが伝えられない
支離滅裂な文章を想像してください。

>オレンジが欲しいので天気が、いいですよね、

この文章から筆者の考えていることを想像することができたら、あなたは狂気に満ち溢れています。
自分の考えを正しい日本語で伝えることは、認識の齟齬を生まないためにも絶対に必要なことです。
単純なSlackのメッセージだろうとも、正しい日本語を使いましょう。コミュニケーションロスが減ります。

---
以上、日本語の必要性でした。
全ての開発者だけでなく、日本人はちゃんとした日本語を使いましょう。
**主に、訳のわからないメッセージを飛ばしてくるそこのあなた!**

書きたいことはもう以上で書ききったので、あとはおまけです。
ここまで読んでくれたあなたはもう気がついていると思いますが、**これは業務時間中の暇つぶしに読むためのネタ記事なので、いいねする暇があったら仕事してください。**

# 2.各種プログラミング言語
ここでいうのはDだとかCだとかそういう次元の話ではありません。コンピューターへ命令をするための言語全てです。
Qiitaが主に対象としているソフトウェア開発者の方々は、何らかのプログラミング言語を使用できるはずですが。

## プログラミング言語ができることのメリット
ソフトウェア開発者としてお仕事ができます。
仮にマネージメントを専門とする方でも、仕事を円滑に進めるためにも触りは理解しておくことをお勧めします。

## プログラミング言語ができないことのデメリット
ソフトウェア開発者としてのお仕事ができません。

# 3.英語
英語は英国発祥の言語です。昨今では世界共通言語のデファクトスタンダードとなっています。
ですが英語を母国語とする人は、[存外少ない](https://ja.wikipedia.org/wiki/%E8%8B%B1%E8%AA%9E%E3%82%92%E5%85%AC%E7%94%A8%E8%AA%9E%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%9B%BD%E3%81%AE%E4%B8%80%E8%A6%A7)ようです。

## 英語ができることのメリット

### 英語の情報リソースを活用できる

開発者が何らかの問題にぶち当たった時、解決方法をGoogleへ尋ねると思います。
その時の検索の対象として、日本語だけではなく英語も範囲に含めることができたら、あなたの問題解決力は飛躍的に向上するでしょう。

何故ならそもそもこのIT業界というのは英語圏であるアメリカで飛躍的に発達し、今も強い影響を及ぼしています。情報量は英語の方が圧倒的に多いわけですから、使わない手はないですよね。

### 非日本語圏の人的リソースを活用できる。

私は以前、ベトナム人開発者を活用したオフショア開発を担当していました。彼らとは英語でやりとりしていました。
この日本においてソフトウェア開発者が不足している中、人材としてカウントできる人種を増やすことができれば、根本的な問題解決を図れます。

外国人と仕事をする場合は、双方が同じ言語でコミュニケーションを取る必要があります。その場合に用いられる可能性が高い言語が、英語なのです。

## 英語ができないことによるデメリット

これは議論が別れるところでしょう。

日本というのは幸せな国でして、多くの有志によって海外の文献からネットの資料まで、日本語訳されたものが出回っています。
最新情報もタイムラグはあるものの、有用なものは翻訳されて発信されます。多くの国は母国語での情報が無いために英語を使うことを強いられているのですから、これは大変幸せなことです。

Qiita,Teratailなど開発者向けのサービスも豊富ですし、**英語ができないからといって開発者になれないことはない**と考えています。
ただし、英語を使うことができれば前述のメリットを享受できます。

#最後に
似たような記事が乱立しているのですが、普段から強く感じていることなのでキーボードを叩かせていただきました。
日本語がおかしい人と仕事するのが本当にストレスなので、英語とかプログラムとかの前にまずは正しい母国語を使っていきましょう。

# 関連記事

書こうと思ったことを先越されましたが、意見は違うので是非とも御一読を。
https://qiita.com/Gaccho/items/e12e998b0a1788d55f5f
fractal のテンプレートをpugにする

fractalの導入は下記記事にまとめました。
[Fractal デザインスタイルガイド 導入](https://qiita.com/fujihiko/items/70f985fbc4bb32c505a1)

fractalのコンポーネントは基本`Handlerbars`ファイルなのですが、
`pug`ファイルで利用したい場合の変更箇所をまとめました。

###ファイル構成（hbs）
```
guide
 ├── src
 │    ├── components
 │    │    ├── header.hbs
 │    │    └── _preview.hbs
 │    │
 │    └── docs
 │         └── index.md
 │
 ├── fractal.js
 └── package.json
```

##fractal-pug-adapterのインストール
`fractal-pug-adapter`というパッケージをインストールし、`fractal.js`に下記2行を追加することでpugファイルを利用できるようになります。（[参考](https://fractal.build/guide/components/configuration-reference.html#ext)）

```
$ npm i @rsm/fractal-pug-adapter
もしくは
$ yarn add @rsm/fractal-pug-adapter
```

```
/* Fractalのインスタンスの作成とエクスポート */
const fractal = module.exports = require('@frctl/fractal').create();

/* Pugテンプレートの利用 */
fractal.components.engine('@rsm/fractal-pug-adapter');
fractal.components.set('ext', '.pug');
```

##hbsファイルをpugファイルに変更
`hbs`ファイルを`pug`に変更。`_preview.hbs`を利用している場合は、`{{{ yield }}}` や`path`の記述を下記のようにすることで表示できるようになります。

```
doctype html
html(lang="ja")
  head
    meta(charset="utf-8")
    meta(content="IE=edge", http-equiv="X-UA-Compatible")
    meta(name="viewport", content="width=device-width, initial-scale=1")
    link(media='all', rel='stylesheet', href=path('/css/○○.css'))

  body
    .preview
      != yield
```

###ファイル構成（pug）
```
guide
 ├── src
 │    ├── components
 │    │    ├── header.pug
 │    │    └── _preview.pug
 │    │
 │    └── docs
 │         └── index.md
 │
 ├── fractal.js
 └── package.json
```

##参考
[@rsm/fractal-pug-adapter](https://www.npmjs.com/package/@rsm/fractal-pug-adapter)
minitestの依存関係(?)問題をbundlerで解決する

プロを目指す人のためのRuby入門の第3章のminitestのところで、以下のようなテストクラスを用意するところがあります。


```ruby
# fizz_buzz_test.rb

require 'minitest/autorun'

class FizzBuzzTest < Minitest::Test
	def test_fizz_buzz
		assert_equal'1', fizz_buzz(1)
		assert_equal'2', fizz_buzz(2)
		assert_equal'Fizz', fizz_buzz(3)
	end
end

```

環境によっては以下のようなエラーに遭遇する場合があります。

```

k-3:lib k$ ruby fizz_buzz_test.rb
/usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/specification.rb:2291:in `raise_if_conflicts': Unable to activate railties-5.1.6, because activesupport-5.2.1 conflicts with activesupport (= 5.1.6) (Gem::ConflictError)
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/specification.rb:1411:in `activate'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems.rb:220:in `rescue in try_activate'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems.rb:213:in `try_activate'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:126:in `rescue in require'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from /usr/local/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/minitest/rails_plugin.rb:2:in `<top (required)>'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:98:in `block in load_plugins'
        from /usr/local/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:92:in `each'
        from /usr/local/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:92:in `load_plugins'
        from /usr/local/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:121:in `run'
        from /usr/local/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:63:in `block in autorun'

```

これで解決できます！（本質的な解決ではない）

bundlerを使うことで、Gemfileで指定したバージョンのminitestを実行できる。


```

gem install bundler
bundle init
```
Gemfileが作られるので、Gemfileに追記します。

```ruby

# Edit Gemfile
gem 'minitest'
```

```

bundle install
bundle exec ruby fizz_buzz_test.rb
```
[Vue.js] white-space: pre-wrap するときは v-text を使おう

CSSの `white-space: pre-wrap` を使うと、このスタイルの当たった要素の中の空白はそのまま出力されます。
https://developer.mozilla.org/ja/docs/Web/CSS/white-space

```html
<p style="white-space:pre-wrap;">
　吾輩わがはいは猫である。名前はまだ無い。
　どこで生れたかとんと見当けんとうがつかぬ。
</p>
```


Vue.jsでもこれは同様で、空白をそのまま反映したい場合は `white-space: pre-wrap` を使います。

```html
<p style="white-space:pre-wrap;">{{ wagahai }}</p>
```

このとき、気を利かせて改行したりすると、textには含まれない余分な空白が出力されてしまいます。

```html
<!-- NG -->
<p style="white-space:pre-wrap;">
  {{ wagahai }}
</p>
```

こういうときは、 `v-text` の出番です！
https://jp.vuejs.org/v2/api/#v-text

`v-text` は、要素のtextContentに、指定された値を代入します。

したがって、↓のように余分な空白が含まれている場合にも、空白の影響を受けることはありません。

```html
<!-- 空白が含まれてもOK -->
<p style="white-space:pre-wrap;" v-text="wagahai">
  
</p>
```

`v-text` って、用途不明なディレクティブだったんですが、こういう使い道があったんですね :eyes:
ABAPデータ定義

メモ書きです、間違っていたら訂正お願いします＞＜
ABAPを使ってレポートを作成する上で事前に変数や定数を定義する必要がある

変数はDATAで定義

```
DATA:
   W_DATE(14) TYPE C,    "現在日付
   W_TIME(12) TYPE C.      "現在時刻
```

定数はCONSTANTSで定義

```
CONSTANTS:
    C_DATE(8) TYPE C VALUE '現在日付
    C_TIME(8) TYPE C VALUE '現在時刻
```
()の仲の長さは数値は1,テキストは2として数える

書式変換

```
WRITE SY-DATUM TO W_DATE
  USING EDIT MASK '____年__月__日'.
WRITE SY-UZEIT TO W_TIME
  USING EDIT MASK '__時__分__秒'.
```
WRITE TO で変数へ転送
SYは構造
【Unity】”FPSみたいなカメラの実装”

## 概要

カメラを回転させると「X軸 Y軸 Z軸 の回転になってしまい大変…」という事があると思います。
なので**”””FPSとかでよくあるあのカメラがほしい”””**という気持ちを書きました。

## 手順

１．Unityの[Hierarchy]で右クリックをして[Create Empty]を押す
２．GameObjectで新規オブジェクトができるので、Transformを0,0,0にリセットして[CameraRig]など分かりやす名前にリネームする。
３．CameraMover.csを[CameraRig]にアタッチする。
４．[CameraRig]の子にゲーム画面のレンダリングに使うカメラを配置する。

```c#:CameraMover.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMover : MonoBehaviour
{
	//cameraのtransform
	private Transform _camTransform;
	
	//マウス操作の始点
	private Vector3 _startMousePos;
	
	//カメラ回転の始点情報
	private Vector3 _presentCamRotation;

	void Start ()
	{
		_camTransform = this.gameObject.transform;	
	}
	
	void Update ()
    {
        //カメラの回転 マウス
        CameraRotationMouseControl();
    }

	//カメラの回転 マウス
	private void CameraRotationMouseControl()
	{
		if (Input.GetMouseButtonDown(0))
		{
			_startMousePos = Input.mousePosition;
			_presentCamRotation.x = _camTransform.transform.eulerAngles.x;
			_presentCamRotation.y = _camTransform.transform.eulerAngles.y;
		}
		
		if (Input.GetMouseButton(0))
		{
			//(移動開始座標 - マウスの現在座標) / 解像度 で正規化
			float x = (_startMousePos.x - Input.mousePosition.x) / Screen.width;
			float y = (_startMousePos.y - Input.mousePosition.y) / Screen.height;

			//回転開始角度 ＋ マウスの変化量 * 90
			float eulerX = _presentCamRotation.x + y * 90.0f;
			float eulerY = _presentCamRotation.y + x * 90.0f;

			_camTransform.rotation = Quaternion.Euler(eulerX, eulerY, 0);
		}
	}

}
```

## 解説

マウスの入力を正規化してる部分については、Cameraのスクリプトに似たような関数があると思いますが特定のCameraを参照してなくても使えるようにするために書きました。
※カメラのクラスを使うなら <a href="https://docs.unity3d.com/ja/2017.4/ScriptReference/Camera.html">ScreenToViewportPoint</a> あたり？
マウスの入力に関する部分は適宜書き換えてよいかと思います。

```
 _camTransform.rotation = Quaternion.Euler(eulerX, eulerY, 0);
```

**Z回転の傾き**が入ってこない理由ですが、現在の状態を保存しながらZ回転を含まない値を使って毎フレーム現在のカメラの状態を決めてるからです。
おそらく純粋にクォータニオンを扱って回転させると「現在の状態を保存する（２つの回転を合成する）」という部分で厳しいと思うので、分かりやすく「現在の状態とマウスの操作量を合計した値」をQuaternion.Euler()に渡してやる形にしました。


```
float eulerX = _presentCamRotation.x + y * 90.0f;
```

ゲームで使う事を考えてないので、正規化されたマウスの変化量に「90の定数」を掛けてますが、ここを変数にすればマウス感度の変更機能などをつけれると思います。
Google Cloud Platformに突然繋がらなくなったときの処方箋

Google Cloud PlatformのVMに突然SSH接続できなくなってしまった。さっきまで繋がったのに、ってときの対処方法をねこでもわかるレベルで説明します。

はじめてVMをつくったとき
VMのサイズを変更したとき

に対処できます。
#繋がらなくなる原因
　最低限必要なことを説明します。SSH(Secure Shell)という通信方法は、クライアント(自分がいる方のマシン)とサーバー(自分がいない方のマシン)とで通信する方法です。SSHで通信するためには３つのものが必要です。１つめがクライアントがもつ秘密鍵(Private key)。２つめがサーバーがもつ公開鍵(Public key)。そして３つめが、サーバーがどこにあるのかという住所、つまり外部IPアドレスです。この外部IPアドレスはクライアントがもっていなければいけません。
　(もちろんSSHのソフトも必要ですが、ここでは省略します。)
　うえの説明にあてはめて原因を説明します。あなたのPCがクライアントです。Google Cloud PlatformのVMはサーバーです。Google Cloud PlatformのVMは、必要な3つのうち３つめの **外部IPアドレスがコロコロ変わってしまいます** 。なので、クライアントはサーバーがどのにあるのかわからなくなって繋げないのです。

#対処方法
外部IPアドレスを固定すればOKです。
１、まず [Google Cloud Platform](https://console.cloud.google.com) にいきます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/8901a509-9027-5d9c-7be8-b2a2f54d92c4.png)



２， Compute Engine をクリック
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/cc4b1005-60b7-d2ed-be2f-2ea99c4c29e6.png)

３．自分のVMの名前をクリック
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/35fc0cd5-0ab2-343c-50ca-55c4b770aae5.png)

４．編集をクリック
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/13502cb6-d90d-eab5-594f-123ee6f98654.png)
５．ネットワーク　インターフェースをクリック


６．画像が取れなかったんですが、新しい静的IPアドレスをクリック

![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/b78a41ad-0f56-c481-d960-ccb23ebe8685.png)





![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/f0dceeab-6b1f-902b-b8a9-5728ae04dfa1.png)

７、適当に名前を入力、neko とか inuwaannmarisukijanaiとかなんでもいいです。ただしアルファベット小文字、空白なし
説明は書かなくていいです。　

８，画像ないですが、つづいて予約をクリック

![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/255c1216-7216-c007-5584-543196bbd41e.png)

９，完了をクリック

![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/ad3ff53b-54db-d697-621e-dd55ca8a923c.png)

１０、保存をクリック

![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/257157/2b674d5a-4231-64b1-f77a-bdda4d77275e.png)

２０秒ほど待つと外部IPアドレスが表示されます。表示されなかったらページもう一回読み込んでください。

この外部IPアドレスをSSHのソフトで書き換えてやったら完了です。
PHPでMattermostにattachments本文をPostするサンプルプログラム

とりあえず今はただただ自分へのメモとして。。。

SlackクローンのMattermostへ、内向きのウェブフック(Incoming Webhooks)を利用してメッセージをPostするPHPスクリプトのサンプルです。
Postする本文としては、表示を装飾したattachments本文を書き込みます。

タイトルのこの前置きだけでなんかお腹いっぱいですがとりあえず忘れないように。。。

# サンプルスクリプト

とりあえずめちゃくちゃ単純に本文のみをPostしてます。

```php
<?php

// Webhook URL
$url = "取得したWebhook URL";

// メッセージ本文(Attachmentsで装飾する)
$message = array(
        "attachments" => array(
                array(
                        "color" => "warning",
                        "title" => "たいとる",
                        "text"  => "本文"
                )
        )
);

// メッセージをJSON化
$message_json = json_encode($message);

// URLエンコードしてpayload指定
$message_post = 'payload=' . urlencode($message_json);

// cURLで送信
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
//echo $result;

// cURLチャンネルを閉じる
curl_close($ch);

?>
```

とりあえず単純にこれだけ。
実際に投稿された結果はこんな感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49156/8a033532-debb-e6df-384e-4df8a12e686c.png)

ちなみに動作確認は PHP 5.4.16 で行いました。（古い）

```console
$ php -v
PHP 5.4.16 (cli) (built: Apr 12 2018 19:02:01)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```
Windows10メモリダイエット作戦

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

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

でも、このタイトルを見たとき、君は、きっと言葉では言い表せない
「ときめき」みたいなものを感じてくれたと思う。
殺伐とした世の中で、そういう気持ちを忘れないで欲しい
そう思って、この記事を立てたんだ。

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

#前置き
今回記事を起こした理由としてはWindows7→10へアップグレードした人達には昔のスペックのままPCを使用しているのではないかと思い記事にしてみました。
経験上4GBのメモリだとすぐにメモリ使用量が100％近くまで上がりストレスがしゅごいのぉぉぉぉってなってしまうのではないかと思います。
下手をすると2GBのままアップグレードした人もいるのではないでしょうか。
そんな方の少しでも役に立てれば・・・・


#注意事項
あくまでPCに関しては素人が試行錯誤している部分の記事なので、
ここに記載されている方法を行ったことによる不具合等々については自己責任でお願いいたします。
間違った知識等を載せる可能性がございますので、まずは行う前にググったりして安全をご自身の目で確認したうえで自己責任でお願いいたします。

**というかおとなしくメモリを増設したほうが安心安全ではある。**

#PCスペック紹介
OS：Windows10 PRO
CPU：Intel I7-7700(3.60GHz)
メモリ：8GB
HDD：1TB 7.2k（回転速度？）　SATA接続
電源：180W　※ブロンズとかシルバーとかではないらしい
立ち上がり直後のメモリ使用率は約45％～55％ほどです。


#Cortana強制停止
![0127.png](https://qiita-image-store.s3.amazonaws.com/0/237388/f0e09d23-a9a7-1281-0cc3-bbd28fcd9975.png)
グループポリシーとかレジストリ変更とかそんな生易しいものじゃねぇ！
フォルダ名を変更しCortanaの起動自体を止めてしまうというもの。

**下記の作業を行う際には元のフォルダ名、アドレス等々を絶対にメモっておくこと。
どうにもWindowsUpdateとかで不具合が起きる可能性があるらしい。
あと代償としてスタートメニューでファイルの検索ができなくなります。
その為ウィンドウズキー→アドレス直入力→フォルダ移動ができなくなります。**

##やり方
1．タスマネからCortanaのフォルダを検索
多分この辺り
C:\Windows\SystemApps\Microsoft.Windows.Cortana~~~~~~~~
~~~の部分はおそらくランダム文字列？
2．このフォルダの名前を変更する。
　 そうすると使用中となっているため変更ができませんとメッセージが出てくる。
　 メッセージは消さずにそのままに。
3．Cortanaをタスマネでタスクキルと同時に2のダイアログにて再試行を押下する。
4．やったねたえちゃん家族がへったよ！
**上にも書きましたがWindowsUpdate等で障害が出る可能性があるので、バックアップは確実にとっておいたほうがよいです。**

#Dell製のアプリケーション停止
読んで字のごとくです。
私が使っているPCはDell製なので色々常駐アプリがあるので片っ端からアンインストールしています。
日々のバックアップを取っていれば特に問題ないかと思います。

#オーディオ系のアプリケーション停止
こちらも読んで字のごとくです。
Dell製な為かRealtekHDオーディオマネージャーは入っているのですが、他のオーディオ系のソフトが常駐しているのでこちらもアンインストール。
音響系は特にいじらない仕事なので消しています。

#superfetchの停止
ほぼWeb上に落ちている情報をうのみにしていますが、
どうにもアプリケーションの起動を早くするための機能らしいですが、こいつがまぁメモリをよく食べる食べる・・・
メモリのダイエットを狙うだけなら停止してもいいかもしれません。
説明が長くなるので下記の検索結果より適当なWebサイトを開いてやってみてください。
https://www.google.co.jp/search?q=Windows10+superfetch&oq=Windows10%E3%80%80superfetch&aqs=chrome..69i57j0l5.10693j0j7&sourceid=chrome&ie=UTF-8

#GoogleCrhome周りを整理する
最近やたらとGoogleCrhomeのメモリの食い方がすげぇんです。
使っていない人は関係ないですが、使用している人はお気を付けください。
こまめにタブを閉じることをお勧めいたします。
あとアドインを大量に入れるとそいつらもバックグラウンドで動き続けるっぽいので
不必要なアドインは消しておいたほうが省メモリ化を図れるかと思います。
お勧めのブラウザがあったら是非とも教えてください。
##Crhomeの自動メモリ解放機能
どうにもシステムのメモリが少なくなった時にメモリを自動解放してくれる公式の機能らしい。
ただ完全にサポートしきっているわけではないので色々と自己責任とのこと。
ちょっと調べてみたところFlashを多用する艦これ等々は不具合が出やすいらしいのでお気を付けをくださいませ。
機能としてはタブを切り替えた際に自動的に再読み込みをするとかなんとか。

アドレスバーに
1．chrome://flags/を入力
2．Automatic tab discardingの項目をEnabledへ変更
3．crhomeを再起動で完了とのこと。

#まとめ
正直検索すれば色々出てくるとは思うのですが、ざっと効果のありそうな部分だけまとめてみました。
個人的にももう少し色々やってみようとは思っているので気が付き次第更新します。
この記事を見た方も何かいい方法があったらリクエストやコメント等々是非ともお願いいたします！！！
泣いて喜びます。
【PHP】bindParamでNULLが返ってきてしまう誤った書き方

## 結論
bindparamは右辺の値に使うこと。

```php:修正前
$sql = "SELECT a FROM b WHERE :something = :otherthing";
$bindparams["something"] = $something;
$bindparams["otherthing"] = $otherthing;
```

↓

```php:修正後
$sql = "SELECT a FROM b WHERE ${something} = :otherthing";
$bindparams["otherthing"] = $otherthing;
```

## 事象
### ハマった内容
下記のようなデータの取り出し方をしたら値が返ってこなくてハマった。

```php:実行内容
$sql = "SELECT a FROM b WHERE :something = :otherthing";
$bindparams["something"] = $something;
$bindparams["otherthing"] = $otherthing;

$stmt = $dbh->prepare($sql);
$stmt->bindValue("something", $something, PDO::PARAM_STR);
$stmt->bindValue("otherthing", $otherthing, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($result);
exit;
```

```bash:結果
NULL
```

### 原因
SQLエラーやPHPのエラーとしては拾うことができなかったので、少し時間がかかってしまったが、ようするに両辺にbindparamを使うと上手くいかないようです。

```
:something = :otherthing
```

### 解決方法
そこで、あらかじめ左の値を直接入れるように書き換えるとうまくいく。
本来bindparamをするのはSQLインジェクションを防ぐためなので、右辺の値をbindparamするのが正しい。

```php:実行内容
$sql = "SELECT a FROM b WHERE ${something} = :otherthing";
$bindparams["otherthing"] = $otherthing;

$stmt = $dbh->prepare($sql);
$stmt->bindValue("something", $something, PDO::PARAM_STR);
$stmt->bindValue("otherthing", $otherthing, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($result);
exit;
```

```bash:結果
array(1) {
  [0]=>
  string(4) "success"
}
```

意味を考えずに使うとこうやってハマるので、ちゃんと考えて書きましょうね、、
シクシク素数アドベントカレンダー Ruby 編

シクシク素数アドベントカレンダー Advent Calendar 2018 の 1 日目です

## プログラム(Ruby)
```ruby
require "prime"

😭prime = Enumerator.new do |y|
  a = 1
  loop do
    a += 1
    loop { a.prime? && a.to_s.match(/[49]/) ? break : a += 1 }
    y << a
  end
end

print 😭prime.take(ARGV.first.to_i).join(",")
```

## 出力例
```
$ ruby test.rb 2
19,29
$ ruby test.rb 4
19,29,41,43,47,59,79,89,97
$ ruby test.rb 100
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569,593,599,619,641,643,647,659,691,709,719,739,743,769,797,809,829,839,859,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1019,1039,1049,1069,1091,1093,1097,1109,1129,1193,1229,1249,1259,1279,1289,1291,1297,1319
```
「どこでもKotlin #6 〜Kotlin 1.3の新機能に触れる〜」参加レポート #m3kt

# イベント概要

今回はM3さん主催の「どこでもKotlin #6 〜Kotlin 1.3の新機能に触れる〜」に参加してきました。
会場はクラウドワークスさん@恵比寿ガーデンプレイス でした。
https://m3-engineer.connpass.com/event/105650/

## Twitter hash tag

[#m3kt](https://twitter.com/search?q=%23m3kt)

# What's new in Kotlin

[スライド](https://speakerdeck.com/satorufujiwara/whats-new-in-kotlin)

[@satorufujiwara](https://twitter.com/satorufujiwara) さんからKotlinの考え方などのお話がありました。
「Pragmatic(実用主義)」というのがキーワードで、「Kotlin 1.3はまさにそれを表したバージョン」とお話されていたのは、本当にその通りだと感じました。

また、Evolutionのところで話されていた以下の２つ

- Keep the language modern
- Confortable update

これらのバランスを取るためにIDEでのマイグレーションツールなどを提供するというアプローチもJetBrainsならではのアプローチだなと思います。
こういったサポートは開発者としては嬉しい限りですね。

スライドの中で紹介されていた CA.kt の KotlinConf 2018 報告会の資料はこちらです。

- [KotlinConf 2018 Keynote Overview](https://speakerdeck.com/satorufujiwara/kotlinconf-2018-keynote-overview)

また、Kotlin 1.3 の新機能については [@_a_akira](https://twitter.com/_a_akira) さんのブログが一番わかりやすいと紹介がありました。

- [Kotlin1.3の新機能](https://aakira.app/blog/2018/10/whatsnew-kotlin13/)

私も勉強のために「[Kotlin 1.3 まとめ（Coroutines、Kotlin/Native以外の変更点）](https://qiita.com/sadashi/items/55e35fad6f144a372abd)」を投稿した時も参考にさせていただきました。
すごくわかりやすかったです。ありがとうございましたm(_ _)m

# コードで見る Kotlin 1.3

[スライド](https://speakerdeck.com/daiwahome/kododejian-rukotlin-1-dot-3)
（2019/11/13 資料が公開されたので追加しました）

[@daiwahome0](https://twitter.com/daiwahome0) さんからのお話で、Kotlin 1.3で追加された機能の紹介でした

注目のCoroutineなどをコードで解説していただきました。
CoroutineはPresenterあたりでやるようなRxのコードを書き換えると読みやすくなるかもという印象です。（人によるかもしれませんが）
個人的にはinline classが結構好きですね。

# 8割完成済みのJavaプロジェクトにKotlinを途中導入した話

[スライド](https://speakerdeck.com/kawamataryo/8ge-wan-cheng-ji-mifalsejavapuroziekutonikotlinwotu-zhong-dao-ru-sitahua)

[@KawamataRyo](https://twitter.com/kawamataRyo)さんから SpringBoot + Java で作ってたところにKotlinを導入したというお話でした。

元消防士という珍しいご経歴でしたので、印象が強かったですw

デモで簡単なJavaのWebアプリケーションにKotlinを導入するのを実演していただきました。
Androidもそうですが、導入が楽にできるというのは素晴らしいところですね。


# Kotlin / Native を「使ってみた」の一歩先へ

[スライド](https://www.slideshare.net/TakakiHoshikawa/kotlinnative)

[@oboenikui](https://twitter.com/oboenikui) さんからKotlin/Nativeのお話です。
Kotlin/Nativeがどういったものか、どういった歩みをしてきたかという内容に加えて、具体的な実装の内容もありました。
まだ、ベータ版ですので、足りないところはあるにしても、だいぶ各種機能が揃ってきた印象でした。

こちらでも紹介されていた[@_a_akira](https://twitter.com/_a_akira) さんのブログです。

- [Kotlin/Nativeチュートリアル Android, iOS編](https://aakira.app/blog/2018/10/kotlin-native/)

個人的にもまだKotlin/Nativeは触れていなかったので、今回のお話を聞いてちょっとサンプルアプリぐらい作ってみようかなと思いました。

# Kotlin Contracts

[スライド](https://speakerdeck.com/ntaro/kotlin-contracts-number-m3kt)

[@ngsw_taro](https://twitter.com/ngsw_taro) さんからのKotlin Contractsのお話です。
丁寧な説明で大変わかりやすかったです。
Contractsによりコンパイラが賢くなり、スマートキャストなどの恩恵がさらに受けられるので、より可読性の高いコードがかける印象でした。
カスタムのContractはまだexperimentalですが、Optinalなオブジェクトの状態チェックなどに使えそうなので、個人的には使ってみたいです。

# 所感

私は今Androidアプリの開発に携わっていますので、CoroutineやContractsは特に興味深かったですし、個人的にはそろそろKotlin/Nativeも試してみようかと思っています。

また、最初にあった「Pragmatic(実用主義)」という言葉も本当に印象深かったです。
今回のバージョンではstdlibへのContracts対応やwhenで変数がもてるようになったり、main関数の引数が不要になったりと、どれも開発者に「優しい」機能だなと感じました。それが「Pragmatic(実用主義)」というところなんだと思いました。

最後に、全体を通して大変勉強になる会でした。ありがとうございました。