OmniAICreator/Qiita-1.07M huggingface dataset:
欠損値の確認方法（Kaggle:House Prices）


#初めに
データ分析をする上で大切なことの1つが、データの内容の確認です。今回は、非エンジニアでもできる、欠損値の確認方法について紹介します。

#データセットの読み込み
pandasをimportしてデータセットを読み込みます。今回は、kaggleのHouse Prices: Advanced Regression Techniquesのtrain.csvのデータを使用します。

House Prices: Advanced Regression Techniques
https://www.kaggle.com/c/house-prices-advanced-regression-techniques

```python
import pandas as pd
data = pd.read_csv('../train.csv')
```

#欠損値が多い項目から表示
dfに確認したいデータをセットします。今回の場合は上記でセットしたtrain.csvを見ていきます。

```python
#欠損値の確認方法
df=data #dfにデータセットを登録
total = df.isnull().sum()
percent = round(df.isnull().sum()/df.isnull().count()*100,2)

missing_data = pd.concat([total,percent],axis =1, keys=['Total','Ratio_of_NA(%)'])
type=pd.DataFrame(df[missing_data.index].dtypes, columns=['Types'])
missing_data=pd.concat([missing_data,type],axis=1)
missing_data=missing_data.sort_values('Total',ascending=False)
missing_data.head(20)

print(missing_data.head(20))
print()
print(set(missing_data['Types']))
print()
print("---Categorical col---")
print(missing_data[missing_data['Types']=="object"].index)
print()
print("---Numerical col---")
print(missing_data[missing_data['Types'] !="object"].index)
```
![missingvalue.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/d8ab08a7-28f9-414e-38f0-55ecf7f17b16.png)


#欠損値の可視化
上のコードを使えば、欠損値の割合がわかります。しかし時系列のデータセットなど、どこに欠損値があるか
を知りたい時があります。そのような場合は、heatmapを使います。

```python
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

df = data
plt.figure(figsize=(16,16)) #サイズ調整
plt.title("Missing Value") #タイトル
sns.heatmap(df.isnull(), cbar=False) #ヒートマップ表示
```
![heat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/c9cb57b6-7704-5b29-f296-1ef9884eb2d3.png)

#まとめ
各コードのdfに様々なデータセットを登録すると、自動的に、各列がテキスト型か、数値型かの判定と、欠損値可視化ができます。
JS thisの使い方について

thisについて
thisはイベントの中でそのイベントが起こった要素を取得する事ができる。
よく聞く文言だがよく分からなかったので調べてみた

例を出すとわかりやすく

```html
<div>
 <ul>
  <li>text1</li>
  <li>text2</li>
  <li>text3</li>
 </ul>
</div>
```

```js
$function(){
 $('li').click(function(){
  $(this).css('color','red');
  });
});
```
このように指定した場合、仮にtext1をクリックした際にthisの中にはli要素のtext1が取得されtext1の文字の色が赤に変化する
Docker - How to Get Private Git Repository Inner Golang Container via HTTP?

You may be put your golang modules in a self-hosting git repository which likes gitlab. The most ways to tell us using ssh method and it is not easy enough (need to generate ssh key). I am just want to use https to get golang modules.

```dockerfile
FROM golang:1.13.4-alpine
...
...
...
ARG GIT_URL
ARG GIT_GROUP
ARG GIT_ACCOUNT
ARG GIT_PASSWORD

RUN apk update -qq && apk --no-cache add git

RUN printf "machine ${GIT_URL}\n\
    login ${GIT_ACCOUNT}\n\
    password ${GIT_PASSWORD}\n"\
    >> /root/.netrc
RUN chmod 600 /root/.netrc

RUN go env -w GOPRIVATE=${GIT_URL}/${GIT_GROUP}
...
...
...
```

https://medium.com/@jwenz723/fetching-private-go-modules-during-docker-build-5b76aa690280

https://blog.csdn.net/du_chao_qun/article/details/53464454
OutSystemsのExtensionでRange Action作ってみた

# きっかけ
[Outsystemsで、いろいろなループの処理時間を計測してみた](https://qiita.com/oyuchan/items/3d412befa4cdd13ff08b)でRange ActionをExtensionで作っているのを見て、もう少し改良できそうと思ったので取り組んでみました。

# コード
```C#
using System;
using System.Collections;
using System.Data;
using OutSystems.HubEdition.RuntimePlatform;
using OutSystems.RuntimePublic.Db;
using OutSystems.HubEdition.RuntimePlatform.Db;

namespace OutSystems.NssRangeExtension {

	public class CssRangeExtension: IssRangeExtension {

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ssDestinationList"></param>
		/// <param name="ssFrom"></param>
		/// <param name="ssTo"></param>
		public void MssRange(object ssDestinationList, int ssFrom, int ssTo) {
            IOSList list = (IOSList)ssDestinationList;
            
            for(int i = 0, j = ssFrom; j < ssTo; i++, j++)
            {
                list.Insert(i, j);                
            }                        
        } // MssRange

	} // CssRangeExtension

} // OutSystems.NssRangeExtension
```

# 使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/10daaa74-d555-218e-5d2a-54f7ab0e3607.png)

このListの型はInteger Listです（既に別のRange Actionを作ってしまっていたのでAction名がRange2になってしまっています）。

# コード説明
なぜかExtensionのInput/Output ParameterにはRecord Listは設定できるのですが、プリミティブ型のListが設定できません（Integer Listなど）。そのためObject型を使うことにしました。Output ParameterにObject型を設定しても、その後それをOutSystemsの中でList型に変換することはできません。そのため、Input Parameterとして受け取ったObject型の変数（元はInteger List型）をExtensionの中で加工することにしました。Objectは参照渡しのため、この方法でも元のInteger List型の変数の値を変更できます。その他にもBinary Data型、List型が参照渡しのようです。これは忘れがちなので要注意ですね！古いですが[リンク](https://www.outsystems.com/help/servicestudio/9.1/index.htm#t=Designing_Actions%2FAbout_Input_Parameters.htm)を載せておきます。

# おまけ
当初、Range Actionの実装をするときに、IEnumerable<int>を返せばForEachのRecord Listの中にFunctionとして書けるのでは？と思ったのですが、残念ながらOutSystemsはIEnumerableには対応していませんでした。ということで今回の実装になりました。よりよい実装があれば是非教えて欲しいです。
https://www.outsystems.com/forums/discussion/33259/using-httprequestmessage-and-ienumerable/
Githubでプルリク出すまでの流れ

## はじめに

Github等のバージョン管理を利用して開発を行う際に、コードを修正して、プルリクを投げて・・・みたいな一連の流れがあると思いますが、一般的な流れと、それに用いるコマンド等を備忘録的にあげておきます。

## 開発の流れ

僕が関わってきた開発だと以下のような流れが多かったです。もちろん、現場やプロダクトのやり方によって色々あるので、一つの例として見ていただければと思います。

  - issueの作成
  - issueへのアサイン
  - ブランチの作成
  - ブランチのpush
  - プリルクの作成

### issueの作成

プロダクトオーナーなどが、新しい機能やバグ等々についてissueを作成します。

<img width="1028" alt="スクリーンショット 2019-11-28 16.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55871/cc176b26-49d0-0ab9-0796-b39d5316714a.png">

### issueへのアサイン

プロダクトオーナーなどが、実装を担当するエンジニアをアサインします。

<img width="1035" alt="スクリーンショット 2019-11-28 16.14.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55871/2453dc01-46ee-a6c8-c1b3-e97425cd7891.png">

### ブランチの作成

エンジニアが自分の開発ブランチを作成します。例えば、developブランチから作成する場合

```bash

git checkout develop
git pull origin develop
git branch feature/image-crawler
git checkout feature/image-crawler
```

### 修正のコミット

大きな修正であれば毎日、キリのいい部分まで開発が終わったら都度など、よきタイミングでコミットを行います。

```bash

git add xxxxxx.js
git commit -m "crawlerベース処理の作成"
```

### コミットをまとめる

実装が完了したら、今までのコミットをまとめます。たくさんのコミットがあるとレビュワーが見辛くなる可能性があるからです。

まずは、`git log`してまとめるコミットを確認します。

```bash

git log

commit 07a7c37f5b961275241d5e172f5e54af5a67155a
Author: xxxxxxxxxxxxxxx <xxxxxxxxxxxxxxx>
Date:   Wed Nov 27 20:54:52 2019 +0900

    〇〇機能の修正

commit 6435a8ac27c90b7689483b625388adf952b60276
Author: xxxxxxxxxxxxxxx <xxxxxxxxxxxxxxx>
Date:   Wed Nov 27 17:39:50 2019 +0900

    〇〇機能の修正

commit 8b75ffa1b1a458d73168bbeb664139042f799102
Author: xxxxxxxxxxxxxxx <xxxxxxxxxxxxxxx>
Date:   Tue Nov 26 18:38:39 2019 +0900

    〇〇機能のバグフィックス

commit c204d9006a14b58e44a119ddeadd7a97704405c1  (HEAD -> develop, origin/develop, origin/HEAD)
Author: xxxxxxxxxxxxxxx <xxxxxxxxxxxxxxx>
Date:   Tue Nov 26 17:34:23 2019 +0900

    〇〇機能の修正

```

この場合は、`c204d9006a14b58e44a119ddeadd7a97704405c1`以降のコミットをまとめたいので、以下のような感じでまとめます。

```bash

git rebase -i c204d9006a14b58e44a119ddeadd7a97704405c1
```

rebaseすると、以下のような感じでコミットをどうするか表示されます。

```
pick a1095a7 リファクタ
pick c5f8c89 テスト追加
pick 8b75ffa リファクタ
pick 6435a8a 取得画像の処理実装
pick 07a7c37 crawlerベース処理の作成
・・・
```

なので、だいたい、一番上のコミット以外を`s`に変更してまとめます。

```
pick a1095a7 リファクタ
s c5f8c89 テスト追加
s 8b75ffa リファクタ
s 6435a8a 取得画像の処理実装
s 07a7c37 crawlerベース処理の作成
・・・
```

で、保存する。
次にコミットメッセージを編集する画面になるので、そこでコミットメッセージをまとめます。
これで準備完了です。

#### 大元のブランチに更新があった場合

`develop`からブランチを切って開発をしていると、自分が開発しているうちに、`develop`が更新されているなんてことはよくあると思います。

その場合は、大元のブランチを`rebase`すると最新のコミットを反映させることができます。

```bash

git checkout feature/image-crawler
git rebase develop
```

もちろん、コンフリクトがでること必須なので、そこは修正してマージしましょう。

### ブランチのpush

origin上にブランチをpushします。

```bash

git push origin feature/image-crawler
```

### プルリクの作成

最後にGithubの画面からプルリクを作成します。

<img width="1037" alt="スクリーンショット 2019-11-30 15.33.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55871/ccc5b1fc-57f3-9a54-fa53-d2bb03eabb96.png">


この時に `関連issue #123` のように`#+issue_id`を記述してあげると、プルリクとissueの関連がわかるので、レビュワーも見やすくなり、おすすめです。

以上で1つの開発が完了する感じです。

## 最後に

今回紹介したのはあくまでの一つの例なので、実際にはコミットのルールやメッセージの書き方など、プロジェクトで決まっていることが多いです。後は、もっとお作法がいいgitのコマンドとかを利用した方がいいこともあるので、それに関しても時と場合によって合わせるのがいいです。
ネットワーク設定のプロファイルを変更する


```powershell:
PS> Get-NetConnectionProfile
Name             : ネットワーク 2
InterfaceAlias   : vEthernet (HW Switch)
InterfaceIndex   : 9
NetworkCategory  : Public
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

PS> Set-NetConnectionProfile -InterfaceIndex 9 -NetworkCategory Private

PS> Get-NetConnectionProfile
Name             : ネットワーク 2
InterfaceAlias   : vEthernet (HW Switch)
InterfaceIndex   : 9
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic
```

<font color="red">※ Hyper-Vをインストールしてる環境のため、ネットワーク接続名が特殊。</font>
[UE4]Unreal Python実行時に任意の引数を変数として渡す

Unreal Pythonを実行するとき、状況によってPythonスクリプト内の変数を変えたい場合があると思います。
例えばアクタを10個スポーンさせるスクリプトがあったとして、8個にしたり20個にしたり調整したいときに毎回スクリプトを書き換えるのはスマートではありません。
そんな場合はargvを使います。

###argv
sysライブラリの関数。
実行時に引数を付けることで変数として取得できる。

```python:qiita.py
import sys
print(sys.argv[1])
```

一例として、以下のようなスクリプトを作ってみました。


###選択アクタのライトマップ解像度を調整
※numpyライブラリのインストールが必要です。
外部ライブラリのインストールについては以下の記事を参考にしてください。
https://qiita.com/EGJ-Hiroyuki_Kobayashi/items/1f8472a77e322704d603

```python:qiita.py
import unreal
import sys
import numpy as np

#選択したアクタを取得
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
selected_static_mesh_actors = unreal.EditorFilterLibrary.by_class(selected_actors,unreal.StaticMeshActor.static_class())

static_meshes = np.array([])

#配列のユニーク化
for sma in selected_static_mesh_actors:
    smc = sma.static_mesh_component
    sm = smc.static_mesh
    static_meshes = np.append(static_meshes,sm)

static_meshes = np.unique(static_meshes)

#引数から値を取得
offset = float(sys.argv[1])

for sm in static_meshes:
    #現在のライトマップ解像度を取得
    current_resolution = sm.get_editor_property("light_map_resolution")
    #新しいライトマップ解像度を設定
    log = unreal.MathLibrary.log(current_resolution,2)
    new_resolution = unreal.MathLibrary.multiply_multiply_float_float(2,log + offset)
    sm.set_editor_property('light_map_resolution',new_resolution)

```


ライトマップ解像度を1段階あげたい時は引数に1を付ける。(256 → 512など)
1段階下げたい場合は引数に-1を付ける。(512 → 256)
![2019-08-07_11h51_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/8505aff9-8aa8-7d90-e8bb-ce3e791ad1bc.png)
こんな感じで使えます。
サーバエンジニアから始める、Swiftロードマップ

こんにちは
taskey サーバエンジニアの田代です。

ふとSwiftを学ぶことになり、その時の軌跡をまとめておこうと思いnoteに残しました。

対象者: サーバエンジニアだけど、Clientのことをもっとわかってあげたい方、こまい修正位やっちゃいたい方

社内マガジンに載せる都合上noteにまとめました。
[内容はこちらをご閲覧下さい。](https://note.com/tashiro_rb/n/ne82973c03f18)
ES6で使えるアロー関数

ES6から関数にアロー関数というものが使えるようになりました。
functionとかくよりシンプルです。

今まで

```javascript
const hoge = function() {
  console.log("foobar");
}
```

ES6ではアロー関数で記述できる

```javascript
const hoge = () => {
  console.log("foobar");
}
```

内容はいままでとかわりありません。

```javascript
hoge();
```

呼び出し方も今までと同じです。
Java Tips

String
　・文字列の操作は、StringBuilderを利用することでパフォーマンスが向上
　　→特にループ内で+での文字列結合を行わないこと

```java:bad.java
    static String concat(String[] array) {
        String result = "";
        for (String s : array) {
            result += s;  // 
        }
        return result;
    }
```
↓

```java:better.java
    static String concat(String[] array) {
        StringBuiler result = new StringBuiler();
        for (String s : array) {
            result.append(s);
        }
        return result.toString();
    }
```

※StringBuiler 比較は、注意が必要

```java:StringBuiler_equals.java
        StringBuilder sb1 = new StringBuilder("ABC");
        StringBuilder sb2 = new StringBuilder("ABC");

        if(sb1 == sb2){
            System.out.println("sb1 == sb2" + " is OK.");
        }else{
            System.out.println("sb1 == sb2" + " is NG.");//FALSE
        }

        if(sb1.equals(sb2)){
            System.out.println("sb1 equals sb2" + " is OK.");
        }else{
            System.out.println("sb1 equals sb2" + " is NG.");//FALSE
        }

        if(sb1.toString().contentEquals(sb2)){
            System.out.println("sb1 contentEquals sb2" + " is OK.");//TRUE
        }else{
            System.out.println("sb1 contentEquals sb2" + " is NG.");
        }   

```
いい感じに１ページで印刷するやつ for Excel

####きっかけ
いわゆる”ペライチ”の資料を、
Excelでわーっと作って、サクッと印刷しようとしたら、
縦○ページ×横○ページ、みたいになって萎える。
####やりたいこと
* 「印刷！」ってやったら、いい感じにA4一枚に収めてほしい。
* A4縦にするかA4横にするか、いい感じに勝手に判断してほしい。
* あと、「文字が小さすぎて読めない！となりそうだったんで、A3印刷にしときました」とかしてほしい。


####コード
```vb
Sub いい感じに１ページで印刷するやつ()
    Dim ws As Worksheet, w, h
    Set ws = ActiveCell.Worksheet
    With ws.UsedRange
        w = .Width
        h = .Height
    End With
    With ws.PageSetup
        .Orientation = IIf(w > h, xlLandscape, xlPortrait)
        .PaperSize = IIf(w > 1000 Or h > 1000, xlPaperA3, xlPaperA4)
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
    ws.PrintPreview
End Sub

```

####補足
A4とA3の閾値は、各自の老眼の進行具合にあわせて好きに変えてください。
MySQLでもWITH句でSQLの可読性を上げられる

この記事は [ラクス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rakus) の5日目の記事です。

弊社、[株式会社ラクスパートナーズ](https://www.rakus-partners.co.jp/) は特定派遣の会社なのでいくつかの現場に行かせてもらっているのですが、いまだに `MySQL8.0` を使用している現場は見たことがありません。まあ、MySQLに性能や機能を求めてない現場ばかりだったというのもりますが。

本記事ではMySQL8.0で追加されたWITH句(CTE)を紹介します。速度面はではく、SQLの可読性の面を取り扱いMySQLのバージョンアップでミドル自体の性能向上以外にも、コードの可読性、メンテ性の向上も図れることを示せたらなと思います

本記事は公式ドキュメントに添います。引用はこのドキュメントからになります
[MySQL :: MySQL 8.0 Reference Manual :: 13.2.13 WITH (Common Table Expressions)](https://dev.mysql.com/doc/refman/8.0/en/with.html)

使用するデータも公式にあるサンプルを使用します。下記サイトの Expert Guides - world database にあるデータを使用しています
[MySQL :: Other MySQL Documentation](https://dev.mysql.com/doc/index-other.html)

## WITH句

WITH句はサブクエリ結果に名前をつけ、クエリ実行中のみ有効な一時テーブルを作成する機能です。使い方は他のDBMSと変わりません

```sql
WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
```

このSQLではWITHのブロックで `cte1`、 `cte2` の二つの名前のついた一時テーブルを作成します。以降のSELECT文ではその名前を使って一時テーブルに対し操作を行っています

## 例
スペイン語を話すヨーロッパの都市を抽出する `WHERE句の副問合せ`、`JOIN句`、`WITH句` を用いた例を示します

### WHERE句の副問合せ
副問合せは読みづらいし、書きづらいです。データ量が多くなれば速度も出ません。

```sql
SELECT * FROM city WHERE CountryCode IN (
  SELECT CountryCode FROM countrylanguage
  WHERE Language = 'Spanish' AND CountryCode IN (
    SELECT Code FROM country WHERE Continent = 'Europe'
  )
);
```

### JOIN句
いままでよくやる手法です。副問合せよりマシですが、JOIN一つ一つ追わないと意図の把握ができません

```sql
SELECT a.* FROM city a
JOIN countrylanguage b
  ON b.CountryCode = a.CountryCode AND b.Language = 'Spanish' 
JOIN country c 
  ON c.Code = b.CountryCode AND c.Continent = 'Europe';
```

### WITH句
JOINでつないでいたテーブルをWITH句に切り出し意味の分かるエイリアスを付けました。SELECT文は簡潔になり、WITH句を読まなくても意図がわかると思います

トランザクションが使える場面では似たことを `TEMPORARY TABLE` を使って行うと思いますが、WITH句を使うことで1つのクエリ内で完結できるのがいいですね

```sql
WITH europe_using_spanish AS (
  SELECT a.CountryCode FROM countrylanguage a
  JOIN country b ON b.Code = a.CountryCode 
    AND a.Language = 'Spanish' AND b.Continent = 'Europe'
)
SELECT a.* FROM city a
JOIN europe_using_spanish b ON b.CountryCode = a.CountryCode;
```
---
示したのは簡単な例でしたがそれでも違いが出るので、うまく使えることができれば可読性が高くメンテナンス性の高いクエリを書けるようになると思います。

新機能も性能も上がった新バージョンがあるのに、前バージョンでインデックスやパーテションをいじって速度アップを図るのは疲れますよね。MySQL8.0に上げることで性能だけでなくSQL、アプリのコードの改善も可能になりますヨ。ということで、バージョンアップの検討材料の材料になればと思います。
#Github PR で master develop ブランチなどがコンフリクトした時にマージ用の PR を作成する


![image](https://user-images.githubusercontent.com/13635059/69891832-c7dadc80-1342-11ea-94a2-870474893fe2.png)

# 問題

- develop から master にマージしたい
- master <- develop に向けてPRを作成するとコンフリクトする
- devlopは直接 push できない
- masterは直接 push できない 

# どうする？

-  master <- develop を実現するために、develop の状態を直接変えるのではなく、developからの派ブランチを master にマージすれば良い
- developからの派生ブランチで master 向けの conflict を解消してマージすれば、 master <- develop をしなくても、コミット状態の辻褄は合う
- ほとんどこのconflict解消作業をしたことがないので、概念が掴めていなかったが、なんだか分かった気がする

# 手順

- developから派生させたブランチをてきとうな名前で作成する ( 例 develop-to-master )
- develop-to-master から masterに向けて merge して merge コミットを作成する
- develop-to-master のコミットは develop + merge コミット一個の状態になる

例

- `git checkout develop`
- `git checkout -b develop-to-master`
- `git merge master`


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2787








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby の pry gem で直接ファイル指定実行して続きを書けること気づいた。文法エラーチェックも。

```rb
require 'date'

p Date.today
p Date.today
# Date.yesterday

binding.pry
```

binding.pryを書いた場所からpryを実行できる
途中までの標準出力もされる。

```rb
$ pry ~/tmp/time.rb
#<Date: 2019-11-30 ((2458818j,0s,0n),+0s,2299161j)>
#<Date: 2019-11-30 ((2458818j,0s,0n),+0s,2299161j)>
[1] pry(main)> Date.today + 1
=> #<Date: 2019-12-01 ((2458819j,0s,0n),+0s,2299161j)>
[2] pry(main)>
```

文法エラーがあるとそこでも止まってpryできる！

```rb
$ pry ~/tmp/time.rb

Exception: NoMethodError: undefined method `yesterday' for Date:Class
--
From: (pry) @ line 3 @ level: 0 of backtrace (of 17).

    1: require 'date'
    2:
 => 3: Date.yesterday
...exception encountered, going interactive!
[4] pry(main)>
```

ということは文法エラーがあればデバッグができて、なければスクリプトが正常完了する。

いやいやpryってそもそもそういう目的のものだしね。これいいな。



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2786








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby on Rails チュートリアル１周目

Railsチュートリアルを一周してみましたので簡単な感想とこれから学習する人向けにポイントなどをまとめようと思います。

まず、Railsチュートリアルをいきなり始めるのではなくもっと基礎的な学習を前にやっておいたほうがスムーズに理解できます。

学習カリキュラムについてはこちらの方が細かく書いてくれてます。
https://qiita.com/saboyutaka/items/1a8c40e105e93ac6856a

## フロントエンド
私自身はWebデザイナーということもあり飛ばしていたのですが、
HTML/CSS(Sass)/Javascript
Jquery
Bootstrap
についてはすでに理解していました。

## IT基礎知識
どうということはないのですがサーティファイの情報処理技術者能力検定試験もとっているので基礎知識も一応あるつもりです。
https://www.sikaku.gr.jp/js/jss/

## Git, Command Line, SQL
Git, Command Line, SQLについては
Progate
ドットインストールで学習

## Ruby, Ruby on Railsの基礎
さらに
Ruby
Ruby on Railsもこちらで一周しておきました。

書籍ではこちらをやってみました。
[Railsの教科書](https://tatsu-zine.com/books/rails-textbook)
[たった1日で基本が身に付く! Ruby on Rails 超入門](
https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F-Ruby-Rails-%E8%B6%85%E5%85%A5%E9%96%80-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88/dp/4774196185/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=rails&qid=1574654294&sr=8-6)
[ゼロからわかる Ruby 超入門](https://www.amazon.co.jp/s?k=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B+ruby+%E8%B6%85%E5%85%A5%E9%96%80&adgrpid=56185614193&gclid=Cj0KCQiAoIPvBRDgARIsAHsCw0-npBfAy2eOcWXpTuql1bFYGqJ9_1aG_5Cz-WElrRO9S9U27qNUZjsaAjFGEALw_wcB&hvadid=338567997350&hvdev=c&hvlocphy=1009565&hvnetw=g&hvpos=1t2&hvqmt=e&hvrand=15965168341862812530&hvtargid=aud-758806828496%3Akwd-598748352914&hydadcr=27269_11561182&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_7sgzqtowjn_e)

### Rails チュートリアル前に
下記サービスの登録をしておくとスムーズにすすめることができます。

#### Github、もしくはBitbucketの登録
Gitの操作を行うにあたってリポジトリーを登録する必要性があるのでやっとくといいでしょう。

#### Herokuの登録
フリープランでいいのでクレジット登録しておくと後のsendgridからのメールで認証するときに必要になります。

#### AWSの登録
Cloud9ではじめているならアカウントできていると思いますが、
画像を保存するときはS3を使うので先に登録しとくとよいでしょう。

## Rails チュートリアル後
１周終えるだけボリュームがすごいのでかなりの学習時間がかかります。
その間に挫折する人も多いと思うのでおすすめは動画か質面ができるサービスと一緒にやるといいと思います。

１周を終えたあとは２周めやるもよし、サービスを作るとよしなのですが
何を作ったらいいのかわからない、もうちょっと勉強したいという方には

[Techpit](https://www.techpit.jp/)
クローンサイトを作れるカリキュラムがあります。
Rails チュートリアルに比べるとかなり簡単につくれますが機能が簡単すぎて物足らないとおもいますので
Rails チュートリアルと組み合わせながらやるのがいいかもしれません。

[e-Navigator](https://e-navigator.feedforce.jp/)
作ったサービスのコードレビューをしてくれるサービスです。
現役エンジニアがレビューを行ってくれるので実践経験がない方にはちょうどいいかもしれません。

私はフロントエンド(Vue.js)のほうも勉強しているのでBackendの部分はもう一度Railsチュートリアルを進め、フロントの部分をうまいこと組み合わせて見ようと思います。

以上ですが、Railsチュートリアル１周目のまとめと感想でした。
S3ウェブホスティングとS3 + CloudFront構成の料金比較

# はじめに
S3単独でウェブホスティングするより、S3 + CloudFront構成の方が安くなるという話を聞いたので、机上で計算して確認しました。
料金は、東京リージョンの2019/11/30現在で計算しています。

# S3の料金
ざっくりした費用。
オプションを設定したり、データ量が多くなると単価が変わる。

| 種類   |  料金 |
|:-------------|----:|
| ストレージ費用|  0.025USD/GB |※標準ストレージ
| リクエスト費用|  0.00037USD |※リクエスト 1,000 件あたり
| データ転送費用(イン)|  無料 |
| データ転送(アウト)|  0.114USD/GB |※月に１GBまで無料

# CloudFrontの料金

| 種類   |  料金 |
|:-------------|----:|
| ストレージ費用|  無料 |
| リクエスト費用|  0.0120USD |※リクエスト 1万件あたり
| データ転送費用(イン)|  無料 |
| データ転送(アウト)|  0.114USD/GB |
| オリジンからCloudFrontへの転送|  0.060USD/GB |※S3がオリジンのときは無料

# 料金表

|    |  S3 | CloudFront |
|:-------------|----|----:|
| リクエスト費用(1万件あたり)|  0.0037USD |0.0120USD|※S3の方が安い
| データ転送(１GBあたり)|  0.114USD |0.114USD|※同じ

データ量が多いときのデータ転送費用(1GBあたり)

|    |  S3 | CloudFront |
|:-------------|----|----:|
| 150TBまで|  0.084USD |0.084USD|
| 524TBまで|  0.084USD |0.080USD|
| 5PB以上|  0.084USD |0.060USD|
150TBを超えてからCloudFrontの料金の方が安くなる

# 計算
・前提
月に1万リクエスト、5PBのデータ転送があるサイト

```text:1万リクエストの料金
S3        ： 0.0037USD　×　1万　＝　37USD
CloudFront： S3料金※　+　0.012USD　×　 1万　=　157USD
            ※仮に全てキャッシュせずS3にリクエストする前提
```

```text:5PBのデータ転送量
S3        ： 0.084USD　×　5PB(5120GB)　=　430.08USD
CloudFront： 0.060USD　×　5PB(5120GB)　=　307.2USD
```

・合計金額

| 種類   |  料金 |
|:-------------|----:|
| S3単独のウェブホスティング|  467.08USD |
| S3 + CloudFront構成|  464.20USD |

S3 + CloudFront構成の方が若干安くなる

# 結論
データ転送量が多い(５PBを超える)場合はCloudFrontの方が安くなりそう。
データ転送量が少ない(５PB未満)の場合は、 S3単独のウェブホスティングの方が安い。
しかし、 CloudFrontを利用することで料金以外のメリットを得るために使うことが想定される。
※エッジロケーションでの転送速度、オリジンへのアクセスを減らす。

# 参考
・公式ページ(S3料金)
https://aws.amazon.com/jp/s3/pricing/
・公式ページ(CloudFront料金)
https://aws.amazon.com/jp/cloudfront/pricing/
ホームディレクトリ以外の.vimrcを使う



諸事情で一時期共有ユーザーアカウントを使う羽目になり、
自分の.vimrcを使えなくて大変困ったので、
将来の自分へ宛ててメモ

常識的に考えてユーザーアカウントは分けたほうがいいよ絶対。

## よく言われる手順
ネットを調べると単に-uで.vimrcを読みこませる手順が多いが、
筆者の場合、~/.vim/フォルダもホームディレクトリ以外に置きたいので、これだと困る。

``` bash
$ vim -u /filepath/dotfiles/.vimrc
```

なお、この記事では設定ファイルは/filepath/dotfiles/に入っている前提とする。
以下のような感じ。

- /filepath/dotfiles/.vimrc 
- /filepath/dotfiles/.vim/ 

## ~/.vim/フォルダも別のパスに移す手順
1. まず、.vimrc, .vim/を以下の通りにリネームする。   
   - .vimrc -> vimrc  
   - .vim/ -> vimfiles 
2. 以下のコマンドでvimを起動すると/filepath/dotfiles/.vim/以下もきちんと読み込んでくれる。  

``` bash
$ VIM=/filepath/dotfiles/ VIMRUNTIME=/usr/local/share/vim/vim81 vim
```
VIMRUNTIMEのところは環境に合わせて適宜変えてあげる必要がある。
筆者の場合、自分でビルドしたvimを使っているのでこのパスだけど、
ubuntuなら普通は/usr/share/vim/vimXXとかになると思う。
MAC, Windowsはわからない。

## aliasを設定する
毎回打つのはだるいのでaliasを設定する。
~/.bashrcとかに書きたくなるけれど、ホームディレクトリのファイルを弄りたくないので、
これは端末開くたびに打つしか無いか。。。

``` bash
$ alias myvim="VIM=/filepath/dotfiles/ VIMRUNTIME=/usr/local/share/vim/vim81 vim"
```
pythonでinput()にいい感じで補完を効かせたい

readlineで input() (python2で raw_input() だったやつ) のときにreadline module (GNU readlineじゃなくて) を使うとtabでcompletionできていい感じになるんですけど余りにも情報がないので困った話



フォルダとかのcompletionとかだとまぁ適当にやればよさそうなんだけど、なんか任意のlistでやらせたい場合は以下の内容が参考になるようす
https://stackoverflow.com/questions/18369207/python-user-input-replay

要するに、Completerクラスをでっち上げて

```
readline.parse_and_bind("tab: complete")
readline.set_completer(completer.complete)
```
みたいなことするとinput() したときにtabで補完できるようになるっぽい

Windows使ってるなら

```
$ pip install pyreadline
```

すればいい感じっぽい (import pyreadline しなくても import readline で動くのでクロスプラットフォームでうれしい、少なくとも私の環境では動いた)

もうちょい複雑な例： https://stackoverflow.com/questions/5637124/tab-completion-in-pythons-raw-input
素のJavaScriptのみでのAjax共通ロジック

最近はjQuery使いたくない時もあるので、これもメモ

```javascript:commonajax.js
//-----------------------------------------------
// 素のJavaScriptのみでのAjax共通ロジック
// @param url   リクエスト先
// @param requestJson リクエストデータ(json形式)
// @param callback 取得後実行処理
// @param cbparam 取得後実行処理に対する引数
//-----------------------------------------------
const commonajax = function(url, requestjson, callback, cbparam){

    fetch(url,{
        method : "POST",
        body : JSON.stringify(requestJson),
        headers: {"Content-Type": "application/json; charset=utf-8"},
    })
    .then(function(res){
        return res.json(); 
    })
    .then(function(data){
        // 返されたデータ(json) 
        if(callback) callback(data, cbparam);
    })
    .catch(function(err){
        // エラー処理
        console.error(err);
    });
}
```

## 使い方
```
{"reqname1":"name1","reqname2":"name2"} 
```
みたいなjsonが帰ってくるとして

```javascript:temp.js
window.addEventListener("load", function(){
    //イベントトリガー
    var getbtn = document.getElementById("getbtn");
    if(getbtn){
        //クリックしたとき
        getbtn.addEventListener("click", function(){
            commonajax("hoge/ajax",
            {reqcode:"001"}
            setdata,
            {setid1:"field1",setid2:"field2"});
        });
        
        //事後処理
        var setdata = function(data, param){
        	console.log(data)
        	var elem1 = document.getElementById(params["setid1"]);
        	if(elem1) elem1.value = data["reqname1"];
        	var elem2 = document.getElementById(params["setid2"]);
        	if(elem2) elem2.value = data["reqname2"];
        }            
    }    
});
```

使い方の動作確認はまだしてない(^^;
ES6で使えるようになった変数のまとめ

今までjqueryとか古いjavascriptの文法しかつかったことがなかったので
もう一度新しくなったJSを勉強しなおしています。

そのメモ代わりとして

## 変数
### var 
ずっとこれを使ってきました。

変数宣言はもちろんのこと
再宣言、再代入も可能

```js
var hogehoge = "Variable";
console.log(hogehoge);
```

### let
ES6からはこちらがvarより主流になってきました。
再代入は可能ですが、再定義はできません。

```js
let hogehoge = "Let";
console.log(hogehoge);
```

### const
定数として利用
再宣言、再代入が不可

```js
const hogehoge = "Constant";
console.log(hogehoge);
```
コーディングスキルテストの回答（超基礎）

アリ本と呼ばれる、プログラミングスキルコーディング本の回答です。
自分用と、問題が知りたい方は、書籍を見て頂きたいので、
詳細は書きませんが、ざっくり蟻の移動時間の把握です。

```js
// 制限
// 毎秒1cm
// 1=<L<=10
// 1=<n<=10
// 0<=X<=L
// 求めるもの。
// 毎秒１cmで歩く全ての蟻が竿の端から落ちるまでの長さ。

// 竿の長さ
const LTotalCm = 10;
// 蟻の数
const nCounter = 2;
// 蟻の現在地から左端までの長さ。
const xMeter = [3, 5];

const Calculate = () => {
  // それぞれの蟻の左端までの最小の時間を計算
  let minArray = [];
  // for文を回す。
  for (let i = 0; i < nCounter; i++) {
  // 蟻のいる位置から端までの距離の中で最小値を取得する。
  minArray.push(LTotalCm - xMeter[i])
  }
  // それぞれの蟻の右端までの最大の時間を計算
  let maxArray = [];
  // for文を回す。
 for (let i = 0; i < nCounter; i++) {
  // 蟻のいる位置から端までの距離の中で最大値を取得する。(蟻の歩く時間かける毎秒1秒を出したいのはわかる。)
  maxArray.push(LTotalCm - xMeter[i]);
 }
 console.log('minT:', Math.min(...minArray), 'maxT:', Math.max(...maxArray));
}
Calculate();
```
node.jsのテスティングフレームワークmochaの使い方

#Mochaとは
公式サイトによると、Mocha（モカ）とは以下のようなものらしいです。
>Mochaは、豊富な機能を持つJavaScriptのテストフレームワークであり、Node.jsおよびブラウザーで実行されます。また、非同期処理のテストも簡単に行えます。Mochaによるテストは連続して実行されるため、対処できていない例外処理も抜け漏れなくテストすることができ、柔軟で正確なレポートを作成できます。
*引用・参考：[Mocha公式](https://mochajs.org/)*

私の勉強不足のため、よくわかりませんが、すごいテストフレームワークということに間違いないようです。



それでは公式サイトに沿って使っていきましょう。
Node.jsのインストールが完了していることが前提です。
#Mochaでテストをしてみる
まずは、コンソールにて以下のように入力していきます。

```console:console
$ mkdir test
$ cd test
$ npm init
$ npm install mocha
$ touch test.js
```
・1行目でtestと言う名のディレクトリを作成しています。
・2行目でtestディレクトリに移動しています。
・3行目でpackage.jsonを生成しています。
・4行目でmochaをインストールしています。
・5行目でtestディレクトリ内にtest.jsというファイルを作成しています。

続いて、test.js内にmochaの公式の書き方に沿って、テストを記述していきます。

```JS:test.js
const assert = require('assert');
describe('Array', () => {
  describe('#indexOf()', () => {
    it('指定された値が見つからない場合は -1 を返します。', () => {
      assert.equal([1, 2, 3].indexOf(4), -1);
    });
  });
});
```
・1行目でassertモジュールを読み込んでいます。
これはmocha自体にはアサーションという、プログラムの正当性をチェックする機能がないためです。

・2行目は、describe("テストの対象", () => { ... })を意味し、
第二引数に、テストの処理を無名関数として渡します。
つまり、「テストの対象」と「どういうテストを行うか」を宣言しています。
Arrayとは配列を意味し、配列をテストの対象とすることを意味しています。

・3行目も同じで、テストの対象とどういうテストを行うかを宣言しています。関数処理の場合は'#'とつけるのが良いようです。
indexOf()メソッドは引数に与えられた内容と同じ内容を持つ配列要素の内、最初のものの添字を返します。存在しない場合は -1 を返します。

今回は、ArrayとindexOf()をテストの対象としています。

説明を続けます。

・4行目は、it("テストの内容", () => { ... })
第一引数では、テストがどんなテストであるのかを記述し、第二引数は、それをテストするための関数を書いています。

・5行目は、assert.equal(テスト対象, 想定されるテスト結果)となります。
今回は、assert.equal([1, 2, 3].indexOf(4), -1)で
配列[1, 2, 3]の中に、4という数字が入っているはずがないので、-1という数字を返すことを想定しています。

これで、mochaのテストの記述が終わりました。
続いて、コンソールに戻り、以下を入力し、テストの実行を行います。

```console:console
$ ./node_modules/mocha/bin/mocha
> Array
    #indexOf()
      ✓ 指定された値が見つからない場合は -1 を返します。


  1 passing (9ms)
```
./node_modules/mocha/bin/mochaはテストを実行するコマンドです。
テスト結果がうまくいったので、✓ 指定された値が見つからない場合は -1 を返します。という結果が出ました。

ただ、このままだとテストをするたびに長いコマンドを打たなくてはならず、面倒なので、
package.jsonでテストスクリプトを設定します。

```json:package.json
"scripts": {
    "test": "node_modules/mocha/bin/mocha"
  }
```
これで簡単にtestが実行できるようになりました。
コンソールに戻り、以下のコマンドを実行します。

```console:console
$ npm test
```
先ほどと同じ結果が表示されれば、完了です。

###beforeとafterでテストの前後に記述する
テストを実行する前後に実行する before/after 関数を設定することができます。すべてのitの前後で実行するするには、 beforeEach/afterEach を使います。

```JS
describe("test", function() {

  before(() => alert("テストが実行される準備ができました"));
  after(() => alert("テストの実行が完了しました"));

  beforeEach(() => alert("テストが始まります"));
  afterEach(() => alert("テストが終わります"));

  it('test 1', () => alert(1));
  it('test 2', () => alert(2));

});
```
結果は以下のようになります。

```
テストが実行される準備ができました (before)
テストが始まります (beforeEach)
1
テストが終わります (afterEach)
テストが始まります (beforeEach)
2
テストが終わります (afterEach)
テストの実行が完了しました (after)
```

以上になります。

参考文献：[現代の JavaScript チュートリアル](https://ja.javascript.info/)
人工知能系・機械学習系・AI系のオススメAPIまとめ

## Watson API
提供：IBM
リンク: https://www.ibm.com/watson/jp-ja/developercloud/services-catalog.html
機能: 検索、テキスト分析、画像認識、音声認識、音声読み上げ、翻訳、心理分析、感情分析、データ分析プラットホーム

## Vision AI
提供：Google
リンク: https://cloud.google.com/vision/
機能: クラウドやエッジにある画像を分析

## Cloud Speech-to-Text API
提供：Google
リンク: https://cloud.google.com/speech-to-text/
機能: 機械学習によって音声をテキストに変換、短時間音声にも長時間音声にも対応

## Cloud AutoML
提供： Google
リンク: https://cloud.google.com/automl/
機能: カスタム ML モデルを迅速かつ簡単にトレーニング

## dialogflow
提供： Google
リンク:https://dialogflow.com/
機能: 顧客からの予約・オーダーの受付や問い合わせに自然言語プロセッサ（チャットボット）で対応をするAPI

## Wit
提供: Wit.ai
リンク: https://wit.ai/
機能: 自然言語処理

## AWS 機械学習
提供: AWS
リンク: https://aws.amazon.com/jp/machine-learning/
機能: 音声,高度なテキスト分析,ドキュメント分析,翻訳,文字起こし,対話型エージェント

#### 参考
http://smsurf.app-rox.com/api/
Java　Optional型

```java:sample.java
import java.util.Optional;

public class Main {
    void exec(Optional<StringBuilder> pSb) {

        System.out.println("pSb-->" + pSb);

        StringBuilder sbEdit = pSb.orElseGet(() -> new StringBuilder("none")); // 
        System.out.println("orElseGet-->" + sbEdit ); -- "none"

        // 引数の編集
        Optional<String> os = pSb.map(sb -> {
            sb.insert(0, "[");
            sb.append("]");
            return sb.toString();
        });
    }

    public static void main(String... args) {
        Main main = new Main();
        // foo
        StringBuilder sb = new StringBuilder("Jack");
        sb = null;
        main.exec(Optional.ofNullable(sb ));
        System.out.println("return-->" + sb ); -- "[none]"
        
    }
}

```
Effekseer Emitterの大きさは、アタッチされているGameObjectとEffekseer自体のスケールにしか依存しない

##つまり
何が言いたいかというと、
**アタッチされているGameObjectの親以上のGameObjectのスケール変更によって大きさは変動しません。**

#はじめに
この記事は、[VCI Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vci)の2日目の記事です。
Effekseer Emitterに関するTipsで、直感的でない挙動を示すため記事にしました。

#Effekseer Emitterとは
こちらを参照してください。
[Effekseer (VCI対応)](https://virtualcast.jp/wiki/doku.php?id=vci:sdk:effekseer:introduction)


#何が起こっているの？
VCI SubItemのGameObjectのスケールを変更してもその変更が影響されない事象が発生する。
![Baton_NotScale.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/8986dc38-9603-2d88-5569-5e036896f3eb.gif)

#どんな時に発生するか
VCI SubItemの付いているGameObjectの子供にEffekseer Emitterがアタッチされている場合に発生します。
![Baton_NotScaleA 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/765015cf-b2e9-de8e-dc66-707abf711f47.png)![Baton_NotScaleB 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/d8c4aa9a-e795-8a22-f475-210cc144995b.png)
親のGameObjectの大きさにEffekseer Emitterは影響されません

#対策について
手っ取り早い方法だと、VCI SubItemと同じGameObjectにEffekseer Emitterをアタッチすれば改善されます。
![Baton_ScaleB 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/4befa602-d138-8b8b-c94d-493b04fe3249.png)
![Baton_ScaleB.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/10f43661-4a3f-cfb8-fa2a-592094ab142d.gif)
Using an encrypted column for auth login in Laravel.

Everybody wants to encrypt personal information.
That is the way of the world isn't that?
Anyway, I wrote down how to make it come true.

## Introduction
This time, I encrypt 'email' column and use it for auth login.

Encryption is easy because you use just encrypt method, however you can't login because values don't be matched in attempt method.

So that I override attempt method to decrypt email column which was encrypted in its.

## Environment
| Target       |       Version |
|:-----------------|------------------:|
| PHP             |              7.3.12 |
|Laravel|6.2|

## Encrypt when create

```php:app/Http/Controllers/Auth/RegistraterController.php

    protected function create(array $data)
    {   
        return User::create([
            'email' => encrypt($data['email']),
            'password' => Hash::make($data['password']),
        ]); 
    }   
}

```

## Add Attributtion method on Model

You always get decrypted value when you use below.

```php:appModels/User.php

      public function getEmailAttribute($value)
      {                        
          return decrypt($value);
      } 
```

## Override attemptLogin method

```php:app/Http/Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Models\User; // Add
use Illuminate\Http\Request; // Add
use Illuminate\Support\Facades\Hash;  // Add
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
  
class LoginController extends Controller

...

    // Override to use decrypt column for attempt.
    protected function attemptLogin(Request $request)
    {            
        $users = User::all();
        $isUserValidated = false;
        $field = $request->email;
        foreach ($users as $user) {
            try {
                if ( $field === $user->email && Hash::check($request->password, $user->password) ) { 
                    $isUserValidated = true;
                    $this->guard()->login($user, false);
                    break;
                }
            } catch (DecryptException $e) {
                // do something you want
            }
            return $isUserValidated;
        }
    }
}   

```

## References
[Encrypted email validation in laravel](https://stackoverflow.com/questions/48226218/encrypted-email-validation-in-laravel)
jQueryでのAjax共通ロジック

都度都度作るハメになってしまっているので、書き残しメモ

```ajaxcommon.js
//-----------------------------------------------
// ajax共通
//  requrl:リクエスト先
//  reqparam:リクエストパラメータ(json形式)
//  callback:ajax成功時における関数処理
//  cbparam:ajax成功時における関数処理の引数
//            （複数必要な場合は、json等を使用）
//-----------------------------------------------
const ajaxcommon = function(requrl,reqparam,callback,cbparam){
  $.ajax({
    type: "post",
    url: requrl,
    data: reqparam,
    dataType : 'json'
  }).done(function(data) {
    if(callback) callback(data, cbparam);
  }).fail(function(e) {
    //エラー処理
    console.log(e);
  });
}
```

type("post" or "get")の指定とエラー処理はお好みで
※エラーは引数増やして、ちゃんとやったほうが良いかも

## 使い方
```
{"reqname1":"name1","reqname2":"name2"} 
```
みたいなjsonがリクエスト先から返ってくると仮定するとして、

```temp.js
$(document).ready(function(){
  //取得ボタン押下
  $("#getbtn").on("click", function(){
    ajaxcommon(
              "/hoge/ajax/",
              {reqcode:"001"},
              setdata,
              {setid1:"field1",setid2:"field2"} //設定id
    );
  });
});

//設定処理
var setdata = function(data, params){
  console.log(data);
  $("#"+params["setid1"]).val(data["reqname1"]);
  $("#"+params["setid2"]).val(data["reqname2"]);
}
```

とかで動かすイメージ
javascript(Typescript) 配列覚え書き


# オブジェクトのキー一覧を取得

```
const test = { prop1: 'hoge', prop2: 'fuga' };
Object.keys(test); // ['prop1', 'prop2']
```
※オブジェクトのプロパティ参照順序は不定のため注意

# オブジェクトの値一覧を取得

```
const test = { prop1: 'hoge', prop2: 'fuga' };
Object.values(test); // ['hoge', 'fuga']
```

# オブジェクト配列からあるプロパティのみをピックアップ

```
const brothers = [
  {id: 1, name: 'taro'},
  {id: 2, name: 'jiro'},
  {id: 3, name: 'saburo'},
];
brothers.map(brother=> brother.name); // ['taro', 'jiro', 'saburo']
```

# オブジェクト配列から数値プロパティのみをピックアップし、すべて加算する

```
const brothers = [
  {id: 1, name: 'taro', age: 32},
  {id: 2, name: 'jiro', age: 28},
  {id: 3, name: 'saburo', age: 18},
];
// 全員の年齢を加算
const sum = brothers.map(brother=> brother.age).reduce((prev, current) => prev + current);
// 平均年齢を算出
sum / brothers.length; // 26
```

# オブジェクト配列から別の型のオブジェクト配列を生成

```
interface Student {
  id: number;
  name: string;
}
interface StudentWithClass extends Student {
  class: string;
}

const students: Student [] = [
  {id: 1, name: 'hanako'},
  {id: 2, name: 'saburo'},
  {id: 3, name: 'takumi'},
];

const className = '1年1組';
students.map<StudentWithClass>(s => ({id: s.id, name: s.name, class: className }));
/*
[
  {id: 1, class: '1年1組', name: 'hanako'},
  {id: 2, class: '1年1組', name: 'saburo'},
  {id: 3, class: '1年1組', name: 'takumi'},
];
*/
```

`map<変換後の型>`とすることで`(s => ({}))`の記述時に補完機能が動いてくれるので、型セーフな変換が出来ます


# 時分秒文字列を時分に変換

```
const timeStr = '12:34:56';
timeStr.split(':').slice(0,2).join(':');
```

やってることは
- `:`で分割（[時, 分, 秒]へ変換）
- 配列の0,1のみを切り出し
- 再び`:`で結合

※時：分：秒形式でない場合は、元の文字列がそのまま返ります

事前に`timeStr.match(/^\d{2}:\d{2}(:\d{2}){0,1}$/)`とかでチェックしておいた方が安全です。
deviseでログイン状態からsign_up(登録)画面に遷移した際のリダイレクト先

２種類のユーザ権限があるサービスで、ログイン状態かsign_up(登録)画面にした際に、想定してなかった画面にいリダイレクトされてこまったという話

## 構成

`hoge_user`, `fuga_user`という２種類のユーザがあります。それぞれ個別の認証が必要です。  
また、それぞれのnamespaceでroot設定しています。 

```rb
# routes.rb
    namespace :hoge_users do
      root to: 'tops#show'
      ~略~
    end

    namespace :fuga_user do
      root to: 'tops#show'
      ~略~
    end
``` 

さらに、親のルートでは`hoge_user`のルートに遷移するように設定しています。



## 問題

`fuga_user`でログイン済状態で`fuga_user`のsign_up(登録)画面に遷移しようとすると`hoge_user`トップにリダイレクトされてしまう。  
ログを見ると以下のように遷移していました。

- `fuga_user/new`  (sign_up)
- `/` 
- `hoge_user/top`

ログイン済の場合親のルートにリダイレクトされたため、そこから更に`hoge_user`ルートにリダイレクトされてました。  
想定としては各ユーザのルート設定したとこにリダイレクトされると思ってたので困った。

## 調査

[deviseのコード](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb#L4)を確認しました。  

- newでは`require_no_authentication`が呼ばれログイン状態を確認する
- ログイン済なら`after_sign_in_path_for`を呼ばれる

なるほど。`after_sign_in_path_for`をoverrideしてないので親ルートにリダイレクトされると。  
しかもこのアプリ構成上`application_controller`ではなく個別のcontrollerでoverrideする必要がある。  
→ ２種類のそれぞれのリダイレクト先を設定したいので 
→ `session_controller`ではすでにやってた。今回は`registration_conroller`

## 対応

全然DRYじゃないんだけど、それぞれのユーザ配下の`session_controller`, `registration_controller`で `after_sign_in_path_for` をoverrideした。  
これ以上増えるようだったらmixinするなり共通化します。
強化学習２５　testpypiにmymoduleを登録する。

この記事は、中学生から大学生（専門前）までを対象に書いています。
基本的に習うより慣れろなので、コピペして、差分だけ書くようにしています。

こちらの記事を参考にさせてもらいました。
というかそのままです。
PyPIパッケージ公開手順
https://qiita.com/shinichi-takii/items/e90dcf7550ef13b047b5
こちらも参考にしています。
https://qiita.com/Kensuke-Mitsuzawa/items/7717f823df5a30c27077

まず、サンプルプロジェクトをダウンロードします。
名前はchokozainerrlにしました。
.gitとrequirement.txtを削除します。
githubに、chokozainerrlリポジトリを作成します。

githubへの登録は、こちらを参考にしました。
https://qiita.com/under_chilchil/items/ec9d0050c1e3fb6576de
これくらいの英語には慣れましょう。

```
cd chokozainerrl
git init
git add .
git commit -m 'first commit'
git remote add origin https://github/chokozainer/chokozainerrl.git
git push -u origin master
```

以降は、VSCodeで編集します。
setpu.pyは、以下のようにしました。

```setup.py
# -*- coding: utf-8 -*-
import os, sys
from setuptools import setup, find_packages

def read_requirements():
    """Parse requirements from requirements.txt."""
    reqs_path = os.path.join('.', 'requirements.txt')
    with open(reqs_path, 'r') as f:
        requirements = [line.rstrip() for line in f]
    return requirements

with open('README.md', encoding='utf-8') as f:
    readme = f.read()

with open('LICENSE') as f:
    license = f.read()

setup(
    name='chokozainerrl',
    version='0.0.7',
    description='Wrapper package for chainerRL',
    long_description=readme,
    long_description_content_type='text/markdown',
    author='chokozainer',
    author_email='fgtohru@gmail.com',
    install_requires=read_requirements(),
    url='https://github.com/chokozainer/chokozainerrl',
    license=license,
    packages=find_packages(exclude=('tests', 'docs','sample'))
)


```

テストコードは、、、。
そもそも、colaboratory　notebookを活用する場合、コンソールベースでは使いづらいので、その部分をwrapperするのがchokozainerRLなので、どうやってテストを書くのか？　微妙すぎる話題。見つかったら書く予定。

アップロードの準備をします。
まずは、インストール。

```
pip install wheel twine
```

とりあえず作ってみます。

```
python setup.py bdist_wheel sdist
```
distフォルダに２つのファイルができました。

testPypiにアップロードします。

```
twine upload --repository testpypi dist/*
```

notebookの方は、

```
!pip --no-cache-dir install --upgrade --index-url https://test.pypi.org/simple/ chokozainerrl
```

rwquirements.txtに、chainerrlを入れておいたので、かなり楽になりました。
いろいろとトラップに引っかかっているので、chokozainerRLはしばらくtestバージョンで使用します。
git pull したら permission deniedになったから、その解決法をメモ

開発環境用のサーバーで、git pull したら、
permission denied でエラーになった。

まさしくこのような感じのエラー

```
$ git pull
error: cannot open ファイル名: Permission denied
```

エラーの原因としては、自分が使用しているユーザーはそのディレクトリを変更する権限を持っていないからが理由のよう。

##試しにファイルの権限を確認

```terminal:
$ ll
-rw-r--r--   1 hoge  hoge   5742 10 26  2018 test1.php
-rw-r--r--@  1 fuga  hoge   6807 10 12  2018 test2.php
-rw-r--r--   1 hoge  hoge     65 10 11  2018 a1.php
-rw-r--r--   1 fuga  hoge     65 10 11  2018 a2.php
```

本来であれば、hogeユーザーで作業する決まりだが、
fugaユーザーで作業した人がいたみたい。。


なら、ファイルの権限を変更すればOKと思いきや、
修正するファイルは、プロジェクトのいたるところにあり、
おまけに.git配下も修正しなくてはいけず、いちいち該当するファイルのパスを指定して権限を変更していたら日が暮れるという感じ。。


##まとめてファイルの権限を変更

ということで、便利なlinuxコマンドもメモしておく

ルートディレクトリで作業

```terminal:
//ファイル
find ./ -user fuga -type f -print | sudo xargs chown hoge:hoge

// ディレクトリ
find ./ -user fuga -type d -print | sudo xargs chown hoge:hoge

//シンボリックリンク
find ./ -user fuga -type l -print | sudo xargs chown hoge:hoge
```

これでまとめて権限を変更することが可能。

実行する流れとしては、

```
find ./ -user fuga -type f -print
```

で該当するファイル一覧を確認し

```
find ./ -user fuga -type f -print | sudo xargs chown hoge:hoge
```

で権限をまとめて変更

```
find ./ -user fuga -type f -print
```

再び、こちらを実行し、ファイルが表示されないことを確認って感じ。


こういうコマンドをすらすら思いつけるようになりたい。
クラス変数とインスタンス変数

職場で「クラス変数とクラスインスタンス変数の違い」が話題にあがっていて、以前理解したよな、と思いつつ咄嗟に整理して述べられないなと思ったので、思い出しつつまとめてみる。

基本的にはクラス変数とインスタンス変数というものがある。

まずサンプルコード。

```ruby
class Parent
  @@var = 'class variable of Parent'
  @var = 'instance variable of Parent (so called class instance variable)'

  class << self
    def at_at_var
      @@var
    end

    def at_var
      @var
    end
  end

  def initialize
    @var = 'instance variable of parent'
  end

  def at_at_var
    @@var
  end

  def at_var
    @var
  end
end
```

# インスタンス変数とは

あるインスタンスが保持する変数。そのインスタンスにおいて利用できる。`@{変数名}`により指示される。

たとえば、parentという「Parentクラスのインスタンス」は`@var(='instance variable')`というインスタンス変数をもっている。
```ruby
parent = Parent.new
parent.at_var  # => "instance variable of parent"
```

同様に、Parentという「Classクラスのインスタンス」は`@var(='instance variable of Parent (so called class instance variable)')`というインスタンス変数をもっている。
```ruby
Parent.at_var  # => "instance variable of Parent (so called class instance variable)"
```

後者のように「Classクラスのインスタンス」が持つインスタンス変数のことを「クラスインスタンス変数」と呼ぶことがある。

# クラス変数とは

あるクラスが保持する変数。`@@{変数名}`により指示される。

当然ながらParentクラスは自身のクラス変数を利用できる。
```ruby
Parent.at_at_var  # => "class variable of Parent"
```

クラス変数はこれに加えて、以下の特徴をもつ。

##### 1. Parentクラスのインスタンスから、Parentクラスのクラス変数にアクセスできる
```ruby
parent.at_at_var  # => "class variable of Parent"
```

##### 2. Parentクラスを継承したChildクラスから、継承元であるParentクラスのクラス変数にアクセスできる
```ruby
class Child < Parent
  def initialize
    @var = 'instance variable of child'
  end
end
Child.at_at_var  # => "class variable of Parent"
```

##### 3. （上記の合わせ技として）Parenetクラスを継承したChildクラスのインスタンスから、Childクラスの継承元であるParentのクラス変数にアクセスできる
```ruby
child = Child.new
child.at_at_var  # => "class variable of Parent"
```

# おまけ

仕組みはこれだけだと思う。最後に念のため、上で述べたクラス変数の「色んなところからアクセスできる性質」は、クラスインスタンス変数には与えられていないことを確認する。

##### 1. Parentクラスのインスタンスから、Parentクラスのクラスインスタンス変数にはアクセスできない
```ruby
parent.at_var  # => "instance variable of parent"
```
@varはparentのインスタンス変数を指してしまっている。

##### 2. Parentクラスを継承したChildクラスから、継承元であるParentクラスのクラスインスタンス変数にはアクセスできない
```ruby
Child.at_var  # => nil
```
@varは「ChildというClassクラスのインスタンスが持つインスタンス変数」を指してしまっている。（これは宣言していないので`nil`が返っている。）

##### 3. Parenetクラスを継承したChildクラスのインスタンスから、Childクラスの継承元であるParentのクラスインスタンス変数にはアクセスできない
```ruby
child.at_var  # => "instance variable of child"
```
@varはchildのインスタンス変数を指してしまっている。

丁寧に言語化すると「ClassクラスのインスタンスであるHogeクラスのクラスインスタンス変数」とか、どうしても早口言葉っぽくなるな...。

以上です。
Vim の変数スコープについて簡単に調べた

## はじめに

Vim Script を書いているときに、`let s:hoge` というような変数定義を書くことがあると思います。その時の変数の前置子につけるアルファベットの意味をいつも忘れてしまうので、まとめておこうと思います。

## そもそも変数の前置子につけるアルファベットは何か

Vim のマニュアルを調べてみると、変数のスコープを指定するもののようでした。以下、マニュアルを引用します。

前置子の種類|前置子|スコープ
:--|:--|:--
buffer-variable  |`b:`|現在のバッファにローカル
window-variable  |`w:`|現在のウィンドウにローカル
tabpage-variable |`t:`|現在のタブページにローカル
global-variable  |`g:`|グローバル
local-variable   |`l:`|関数にローカル
script-variable  |`s:`|:sourceされたVim scriptにローカル
function-argument|`a:`|関数の引数(関数内のみ)
vim-variable     |`v:`|グローバル、Vimがあらかじめ定義

例えば変数のスコープをグローバルにした場合、他のプラグインからもアクセスできるため、他の変数との衝突は気にする必要がありそうです。

Vim Script 内でのみアクセスできる変数の場合は、スクリプトローカルを意味する `s:` をつければ良さそうです。

調べていて面白いなと思ったのは、バッファ、ウインドウ、タブページ内でローカルな変数を定義できることでした。他のバッファ、ウインドウ、タブに影響を与えないようにする変数も定義できるのは便利ですね。

## おわりに

普段と違う文法については、意味を知ってから使うほうが楽しいと思うので、引き続き調べていこうと思います。

## 参考

* [Vim script の変数のスコープについてのお話](https://thinca.hatenablog.com/entry/20120619/1340061987)
* [usr_41 - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/usr_41.html#41.2)
【続】M5StickCで天気通知システムを作る(機能追加＆バグ修正＆リファクタリング)

#はじめに
以前、以下のような記事を投稿しました。
- [M5StickCで天気通知システムを作る](https://qiita.com/issi030/items/89d11c185ee78120d9d7)
それからかなり間が空いてしまったのですが、軽微な機能追加と、バグ修正、ソースコードのリファクタリングを行ったので本記事を投稿することにしました。
ソースコード全体は下記リンクで公開しています。
[https://github.com/issi8131/public/tree/master/M5StickC_WeatherAlert](https://github.com/issi8131/public/tree/master/M5StickC_WeatherAlert)

#動作
こんな感じです（GIF画像）。
![bbbbb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352068/b62009bc-093a-fbf7-8ca5-feb972421cff.gif)

#変更点
### 1. 最低・最高気温の表示
　本ガジェットで使用している天気取得API[Weather Hacks お天気Webサービス(※PCからアクセスが必要)](http://weather.livedoor.com/weather_hacks/webservice)ですが、リンク先の仕様に記載があるように、レスポンスJSONデータ内にtemperatureというプロパティがあり、最低気温と最高気温が取得できます。そこで、これらの情報もディスプレイに表示できるようにしました。
ただし、取得タイミングによっては気温の値がNullで返ってくることもあるため、その場合は表示用の内部変数を更新しない仕様としました。

### 2. 天気表示の日付先送り
　天気取得APIからのレスポンスには、2日先までの天気情報が含まれています。M5StickCのAボタン（ディスプレイ横のデカいボタン）を押すと、2日先までの天気を表示できるようにしました。

### 3. バグ修正
　前回のコードでは、電源を入れて2~3日ほどすると天気取得に失敗するようになるバグがありました。おそらくメモリリーク系でやらかしているのでは、と考え、使用しているArduinoJSONライブラリのリファレンスを注意して読んでみました。
[https://arduinojson.org/v6/api/dynamicjsondocument](https://arduinojson.org/v6/api/dynamicjsondocument)
そして、`DynamicJsonDocument`オブジェクト（APIからのレスポンスJSONを格納する領域をヒープ領域に確保する）を利用している部分で、都度メモリ解放するよう修正したところ安定動作するようになりました。

```java:
DynamicJsonDocument jsonDoc(10000);//レスポンスデータのJSONオブジェクトを格納する領域を確保(レスポンスデータの想定最大サイズに合わせて大きめ)
deserializeJson(jsonDoc, payload); //HTTPのレスポンス文字列をJSONオブジェクトに変換
JsonVariant jvToday = jsonDoc["forecasts"][gDaySelector];//forecastsプロパティの0番目の要素が今日の天気に関するプロパティ
//～～中略～～
jsonDoc.clear();//JSONオブジェクトの領域をメモリから解放
```

### 4. コードリファクタリング
　最近、O'Reillyの[リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)という本を読んでいることもあり、前回のソースコードから読みやすさを向上させました。変数名や制御文の記載等を修正修正しています。
SQLAlchemyでクラスオブジェクトを辞書型(dictionary)に変換する方法

## 概要
SQLAlchemyの行オブジェクトを辞書型と同じように扱おうとしても型が違うためうまくいきません。
何パターンか方法はあるのですが、2つ方法を紹介します。

具体例があったほうが分かりやすいので、サンプルとして下記のTodoクラスを元に説明します。

```python
class Todo(db.Model):
	__tablename__ = 'todos'
	id = db.Column( db.Integer, primary_key=True )
	description = db.Column( db.String(), nullable=False )
	completed = db.Column( db.Boolean, nullable=False, default=False )

	def __repr__(self):
		return f'<Todo {self.id} {self.description}>'
```

## 方法1（`__dict__`にアクセスする)
`__dict__`プロパティにアクセスすることで辞書型の値を取得することができます。
ただしこの方法だと、`_sa_instance_state`というプロパティも取得されてしまうので注意してください。


```python
todo = Todo.query.first()
print( todo.__dict__ )
# {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x10f4559e8>, 'completed': False, 'id': 17, 'description': 'TASK1'}
```


## 方法2（クラス側にdict型を返す関数を用意する)
クラス側に辞書型の値を返す関数を用意することでも辞書型の値を取得することができます。

```python
todo = Todo.query.first()
print( todo.toDict() )
# {'id': 17, 'description': 'TASK1', 'completed': False}

class Todo(db.Model):
	__tablename__ = 'todos'
	id = db.Column( db.Integer, primary_key=True )
	description = db.Column( db.String(), nullable=False )
	completed = db.Column( db.Boolean, nullable=False, default=False )
	list_id = db.Column( db.Integer, db.ForeignKey('todolists.id'), nullable=False )

	def __repr__(self):
		return f'<Todo {self.id} {self.description}>'

	def toDict(self):
		return {
			'id': self.id,
			'description': self.description,
			'completed': self.completed
		}
```


## 検索用

**1. 行オブジェクトにプロパティを追加しようとした際のエラー**

```python
todo = Todo.query.first()
todo['label'] = 'Important'
# TypeError: 'Todo' object does not support item assignment
```

**2. dict()関数を用いて型変換しようとした際のエラー**

```python
todo = Todo.query.first()
dict(todo)
# TypeError: 'Todo' object is not iterable
```