OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Cloud9 + API Gatewayで簡単API

#AWS cloud9でAPIを作成
今回はgoogle tts APIを叩いて
音声ファイルを返信するAPIを作成します
AWS lambdaを直接いじると　npmパッケージが読み込まれずめんどくさいので
Could9越しに使うのが良さそうです
ソースコードはこちら
https://github.com/freddiefujiwara/aws-lambda-tts

## 仕様
###Input

| Parameter       |       説明 |    例   |
|:-----------------|------------------:|:------------------:|
| q                |              音声にしたい文字列 |        我是日本人       |
| tl |            対象言語コード|       zh-cn      |

###Output

```javascript
{
  "statusCode": 200,
  "body": "https://translate.google.com/translate_tts?ie=UTF-8&q=%E8%BF%99%E4%B8%AA%E5%BE%88%E5%A4%A7&tl=zh-cn&total=1&idx=0&textlen=4&tk=13583.433909&client=t&prev=input&ttsspeed=1"
}
```

こんな感じです

# Cloud9
## 環境作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/00bc9e0d-ea0d-f697-d278-55014e1c47ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/bd1562be-b0ba-73bb-90d5-27acd05edf86.png)

下記を選択して"Next Step"
- Create a new instance for environment (EC2)
- t2.micro (1 GiB RAM + 1 vCPU)
- Amazon Linux

最後はCreate Environment を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/23ec7460-55d2-b8cf-046d-43eef797e7b8.png)

## setup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/81ed5a1c-4c34-1688-6185-e1b38f2ded3d.png)
↑の部分で

```shell
$ git clone https://github.com/freddiefujiwara/aws-lambda-tts.git
$ rm -rf /home/ec2-user/environment/tts/tts
$ mv aws-lambda-tts /home/ec2-user/environment/tts/tts
$ cd /home/ec2-user/environment/tts/tts
$ npm i
```

## deploy
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/f0918f38-97f0-a96c-9200-5e16926b0f73.png)

## lambdaコンソールで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/4262bda5-b5b4-153e-8183-d1d6563a5889.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/61216e47-1245-9387-cb7e-6d1291fa319b.png)

# API Gatewayと接続
https://qiita.com/vankobe/items/ab5bc6487c7e07cb3aba
をみて接続しましょう
ちなみに　このAPIの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/9264632a-c585-60b0-35e7-47617dce789e.png)

こんな感じ Mapping Templatesの設定は下記です

```javascript
#set($inputRoot=$input.path('$'))
{
  "q": "$input.params('q')",
  "tl": "$input.params('tl')"
}

```

すごく雑な説明ですが、個人的なメモとして
「独習C# 第３版」第１１章(p416) 標準ストリームのリダイレクトをクローズした後、標準出力をディスプレイに戻す方法

 「独習C# 第３版」第１１章(p416) 標準ストリームリダイレクトの項目に記載されていたコードを入力後実行したら、当たり前であるがファイルを出力するだけで、ディスプレイには次の図のように何も表示されず、何が実行されたのか分からなかったので、リダイレクト前後にConsoloe.Write文の数行を追加してみました。


![実行結果１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/e6eaf345-ff3f-6365-80c2-acb8b2c79181.png)
図－１　ディスプレイに何も表示されない様子

ところがエラー発生！

「ハンドルされていない例外:
System.ObjectDisposeException:
閉じているTextWriterに書き込むことはできません。」

![実行結果2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/a04bfaa5-d73a-9e0b-230b-05f8908df858.png)

図－２　エラーの様子
ソースコード

```C#
using System;
using System.IO;
using System.Text;


namespace p417
{
    class Redirect
    {
        static void Main(string[] args)
        {
            Console.WriteLine("logfile.txtへ出力するようリダイレクト");

            StreamWriter log_out;
            try
            {
                log_out = new StreamWriter("logfile.txt");
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
                return;
            }
            // logfile.txtへ出力するようリダイレクト
            Console.SetOut(log_out);

            try
            {
                Console.WriteLine("This is the start of the log file.");
                for (int i = 0; i < 10; i++) Console.WriteLine(i);
                Console.WriteLine("This is the end of the log file.");
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
            }
            log_out.Close();
/*
            // リダイレクトをディスプレイに戻す（以下、３行を追記。／＊と＊／記号を外せば、エラーが修正される。）
            var standardOutput = new StreamWriter(Console.OpenStandardOutput(),Encoding.Default);
            standardOutput.AutoFlush = true;    //StreamWriter が呼び出されるたびに、Write(Char) によって基になるストリームに対するバッファーをフラッシュするかどうかを示す値を取得または設定します。
            Console.SetOut(standardOutput);
*/

            //　ディスプレイに出力
            Console.WriteLine("標準出力がファイルからディスプレイに戻る。");
            Console.WriteLine("リダイレクトの結果logfile.txtを、実行ファイルのあるフォルダに出力しました。");
            Console.WriteLine();
        }
    }
}

```
そこで、上記ソースコードの下側の／＊......＊／でコメントアウトした部分を追記し、解決しました。
![実行結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/25cc20c9-ba8c-d35f-0beb-4aca5f293cab.png)

図－３　エラー修正後の結果
obniz 「ライセンス体系の廃止とユーザープランの新設」を簡単に解説してみる

obnizで「ライセンス体系の廃止とユーザープランの新設」を発表しましたが、わかりにくいので、ざっくり内容で解説してみます。


いちばん重要なのを一言でいうと、<font color="red">**obnizBoardを使えば月額料金がかからず何でもできるようになります。**</font>(昔の状態と同じ)


 ※この記事はわかりやすさ優先のため、一部詳細を省いているところがあります。詳細は[公式記事](https://blog.obniz.io/ja/news/obnizcloud-userplan-2/)をお読みください



# 大きな変更点
- 機能が開放されて、無料で使える範囲が広がります
- 料金体系が変わります


## 機能が開放されて、無料で使える範囲が広がります

<font color="red">obnizBoard</font>を無料で使える範囲が広がります。

obnizBoardはいままで<font color="green">**ローカル接続**</font>と<font color="blue">**クラウド接続**</font>という２つの使い方があり、無料では<font color="green">**ローカル接続**</font>のみができるようになって、<font color="blue">**クラウド接続**</font>はできませんでした。

・・・と書きましたが、これを理解できる方はobniz玄人です。

この<font color="green">**ローカル接続**</font>とか<font color="blue">**クラウド接続**</font>が何？どう違うの？と混乱の元でしたが、今回その区切りがなくなり、無料でどちらも使うことができるようになります。


つまり、
obnizBoardを使おう！
　→　なんか接続エラー出た！ライセンスの問題だ！
　→　<font color="blue">**クラウド接続**</font>はだめらしい
　→　**どうしたらつながるのかわからない！**

ってのがたくさんあったのですが、それがなくなります。

obnizBoardを使おう！
　→　**つながった！　（接続方式は気にしない）**

となります。
悩みポイントが１つ減りますね。


具体的には、下のように使おうとしたときに接続エラーが出てたのが、今後は無料で使えるようになります

- 外出先から家にあるobnizを使う
- python SDKでobnizをつかう
- ブロックプログラムを使う
- 自分の独自システムからobnizを使う



## 料金体系が変わります

上記の機能開放に伴って（？）、料金体系が変わります。
こちらは<font color="red">obnizBoard</font>と<font color="red">obnizOS</font>とどちらも変わります。


1. 年払から月払いに変わります
1. obnizBoardは商用利用しない限りお金がかかりません
2. デバイスごとの機能ライセンス料金体系から、アカウント全体でのプラン料金体系に変わります。


1と2は文字通りです。

3が少々わかりにくいです。


いままでは**このデバイスの1年間利用券を買う**というスタイルでしたが、 これからは**使用しているデバイス数に応じた従量課金**に変わります。
slackとかG Suiteの料金体系をイメージしてもらえるとわかりやすいかとおもいます。

計算式としては

> [支払金額] = [使用しているデバイスの数] x [プランの料金]

です。

プランの料金はこの様になってますね

> Liteプラン　：　150円 /月 /1デバイス
> Businessプラン　：　500円 /月 /1デバイス （商用利用）


なので、例えば3つobnizOSを持っていたら、

> 150円/月  x 3個 = 450円/月

となります。

このときのポイントは、所有しているデバイス数ではなく<font color="red">**使用しているデバイスの数**</font>での支払いとなります

3つデバイスを持ってるけど同時に使うのは２つだけ　となれば、デバイスを切り替えることで2台分の金額で３台を使うことができます。あくまで<font color="red">**同時に**</font>使用しているデバイス数で金額が決まります。

# 移行について

色々変わるのはわかった、では**今使ってる人たちはどうなるの？**も気になりますよね。

#### いままで無料で使ってた人（デバイスの購入だけした人）

単純に機能が拡張されて、よりいろいろなことにobnizを使うことができるようになります。

####  お金を払ってインターネット接続ができるようにしてた人（ライセンスを買った人）

購入した期間の間使うことができるようにします。
具体的にはクレジットという形で返金され、月額の支払いにあてることができます。




<br/><br/><br/><br/><br/><br/>


ざっくりと解説してみましたがどうでしょうか。理解の助けになれば幸いです。
シェルスクリプト パイプライン

パイプラインは、一つ以上のコマンドをパイプで区切って並べたもの。
左側のコマンドの標準出力は、右側のコマンドの標準入力になる。

以下のようなテキストファイルがあったとする。

```bash:file1.txt
This is file1.
```

最も右側のコマンドの終了ステータスが、パイプラインの終了ステータスになる。

```bash:pipeline1
$ cat file1.txt | grep -q 'file1'
$ echo $?
0
```

```bash:pipeline2
$ cat file1.txt | grep -q 'file2'
$ echo $?
1
```

否定演算！を付けると、終了ステータスは逆になる。

```bash:pipeline3
$ ! cat file1.txt | grep -q 'file2'
$ echo $?
0
```

右側のコマンド以外の終了ステータスを得るには、PIPESTATUS を参照する。

```bash:pipeline4
$ (exit 0) | (exit 1) | (exit 2)
$ echo ${PIPESTATUS[@]}
0 1 2
```

標準エラー出力もパイプに通す場合。

```bash:pipeline5
$ make 2>&1 | tee test.log
```
UnityのManaged code strippingをどうにかする

#Managed code stripping is 何？
　ビルドする時、Unityが不要なコードを削除してくれる機能です。ビルドのサイズは小さくなり、時間も短くなるっぽいのでそれなりに良いやつではあります。
###リフレクションの罠
　不要判定するには、実際のコードで使用されているかどうかを追ってくれているようなのですが、リフレクションを使って呼び出すようなケースは検知してくれません。リフレクションを使うZenjectのようなDIコンテナを使ってるとわちゃわちゃするわけです。デジゲー博寸前にこいつに気付いて半ベソかきました。

###PlayerSettingsで無効化できんの？
　Monoでビルドするときはできます。が、IL2CPPビルドではStripping Levelを調整することはできても無効化することはできません(2019.2.0f1 Personal)。後述の対応が必要です。
![スクリーンショット 2019-11-18 16.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/e2c0e5bb-b118-7ecb-f9fd-fb6aeb1263fa.png)

###具体的にStrippingされるもの
　ちょっと追い切れていないのですが、Lowレベルだと、Assetsフォルダ内にあるものはStrippingされないようです。一方、自作package等をインポートして、Packageフォルダ内にあるものをリフレクションでしか呼び出さないような場合はStippingされます。自分はこいつをZenjectで呼び出してやられました。

#対応
　以下のような感じのlink.xmlを書いて、Assetsフォルダ以下に置きます。これでビルドしてもStrippingされなくなります。

```xml
<linker>
       <assembly fullname="***" preserve="all"/>
</linker>
```

#具体例
###Packageフォルダ内にあるもの
　PackageManagerでインポートしました。
　同じフォルダ内には他にインポート用のpackage.jsonやSayHello.asmdefファイルがあります。

```ITarget.cs
namespace SayHello
{
    public interface ITarget
    {
        string Target();
    }
}
```

```Greeter.cs
namespace SayHello
{
    public class Greeter
    {
        private readonly ITarget _target;
        public Greeter(ITarget target)
        {
            _target = target;
        }
        public string Get() => $"ハロー, {_target.Target()}";
    }
}
```

###Assetsフォルダ以下
```Mac.cs
using SayHello;

public class Mac : ITarget
{
    public string Target() => "マック";
}
```

```Installer.cs
using SayHello;
using Zenject;

public class Installer : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<ITarget>().To<Mac>().AsSingle();
        Container.Bind<Greeter>().AsSingle();
    }
}
```

次のGreeting.csは適当なuGUIのTextにアタッチします。

```Greeting.cs
using SayHello;
using UnityEngine;
using UnityEngine.UI;
using Zenject;

public class Greeting : MonoBehaviour
{
    [Inject] private Greeter _greeter;
    void Start()
    {
        GetComponent<Text>().text = _greeter.Get();
    }
}
```

##link.xmlがない状態での動作
![スクリーンショット 2019-11-18 15.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/456a5f39-8bb2-1984-239b-e3c74282a7b5.png)
　Editor上でTextに入れていた文字がそのまま表示されてしまいました。左下に
MissingMethodException: Constructor on type 'SayHello.Greeter' not found.
NullReferenceException: Object reference not set to an instance of an object.
とか出てますね。下ネタなんかを入れていたら、元祖西遊記スーパーモンキー大冒険の再来です。

##link.xmlを書く
次のlink.xmlを書いてAssetsフォルダに置きます。

```link.xml
<linker>
       <assembly fullname="SayHello" preserve="all"/>
</linker>
```
![スクリーンショット 2019-11-18 16.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/7579fbad-5f88-f22a-a6f8-1ad6b11682f3.png)

無事に動いてくれました。

#参考
[Unity Manual : Managed bytecode stripping with IL2CPP](
https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html)
データ収集からディープラーニングまで全て行って競馬の予測をしてみた

加筆するついでに、この記事はZenn([データ収集から機械学習まで全て行って競馬の予測をしてみた](https://zenn.dev/kami/articles/66e400c8a43cd08a5d7f) )に移動しました
pyenvインストール(メモ)

# 目的
２系と３系を共存させるためpyenvを使用する。
手順の備忘録のため記載しておく

```
# sudo yum install bzip2-devel xz-devel
# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# echo 'export PATH="/home/ec2-user/.pyenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
# echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
# echo 'unalias python' >> ~/.bash_profile
# source ~/.bash_profile
# pyenv install 3.6.5
# pyenv global 3.6.5
# python --version
```

# 機械学習系で入れたライブラリ
Jupyter (1.0.0)
Notebook (5.5.0)
NumPy (1.14.3)
SciPy (1.1.0)
Pandas (0.23.0)
Pillow (5.1.0)
Imageio (2.3.0)
Matplotlib (2.2.2)
scikit-learn (0.19.1)
```
pip --no-cache-dir install jupyter==1.0.0 notebook==5.5.0 numpy==1.14.3 scipy==1.1.0 pandas==0.23.0 pillow==5.1.0 imageio==2.3.0 matplotlib==2.2.2 scikit-learn==0.19.1 tornado==5.1.1
```
【SQL server】T-SQL 学習メモ / 一時テーブル

ストアドプロシージャでよく使う一時テーブルについて、何の目的があるのか、またどんなメリットがあるのか気になったので調べてみた。

#一時テーブルを使う目的、メリット
データの量が多かったり複雑な処理をする際、１つのクエリで結果を得るのが難しかったり、処理が重くなりがちになる。そこで一旦、一時テーブルを作り対象となりそうなデータを整理し、それを基に最終目的のデータを取得した方がベター。ステップは１つ増えるがそちらの方が処理速度や情報の取得のしやすさでメリットがあるそう。急がば回れで正しく、速くデータを取得しよう。

#一時テーブル書き方
テーブル名の前に#をつける。

```sql
--テーブル作成
CREATE TABLE #一時テーブル名 (
   カラム名　型
,  カラム名　型
)
--値を挿入
INSERT INTO #一時テーブル名
SELECT 値
FROM テーブル名

```

#まとめ
複雑な処理は1つのクエリだと難しい
↓
ステップ１:
一時テーブルを作り、一度データを整理する
↓
ステップ２：
一時テーブルを基にクエリを書いてデータを取得する
ConverTo-JsonしたポリシードキュメントがWrite-IAMGroupPolicy : The policy failed legacy parsing

メモ。AWSのポリシードキュメントをハッシュから `ConverTo-Json` で生成するときは `Version` キーが最初に来るように注意する必要がある。

# 現象

PowerShellで次のようにポリシーを設定しようとすると...

```
PS> $policyDoc = ( @{
>>                 "Version" = "2012-10-17";
>>                 "Statement" = @{
>>                     "Effect" = "Allow";
>>                     "Action" = "sts:AssumeRole";
>>                     "Resource" = $RoleArn
>>                 }
>>             } | ConvertTo-Json )
PS> Write-IAMGroupPolicy -GroupName $GroupName -PolicyName $PolicyName -PolicyDocument $policyDoc
```

次のようなエラーになる。

```
Write-IAMGroupPolicy : The policy failed legacy parsing
```

# 原因

`Version` ポリシー要素が `Statement` 要素より前に来ないといけない。

> Version ポリシー要素は、このポリシーを処理するために使用される言語構文ルールを指定します。ポリシーの使用可能なすべての機能を使用するには、すべてのポリシーの Statement 要素の前に以下の Version 要素を含めます。
> （[IAM JSON ポリシーの要素:Version - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_version.html)）

`ConvertTo-Json` で生成されたポリシードキュメントでは `Statement` の方が先に来ていたため、エラーになっていた。

# 対策

元データを通常のハッシュではなく順序付きハッシュテーブルとして作成すればよい。つまり `@{...}` ではなく `[ordered]{...}` で生成する。

```
PS> $policyDoc = ( [ordered]@{
>>                 "Version" = "2012-10-17";
>>                 "Statement" = @{
>>                     "Effect" = "Allow";
>>                     "Action" = "sts:AssumeRole";
>>                     "Resource" = $RoleArn
>>                 }
>>             } | ConvertTo-Json )
PS> Write-IAMGroupPolicy -GroupName $GroupName -PolicyName $PolicyName -PolicyDocument $policyDoc
```

# 参照

* [IAM JSON ポリシーの要素:Version - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_version.html)
* [【連載】PowerShell Core入門 - 基本コマンドの使い方 [18] ハッシュテーブル｜サーバ/ストレージ｜IT製品の事例・解説記事](https://news.mynavi.jp/itsearch/article/hardware/3984)
vscodeでAltを使ってIME切り替えをするとメニューに飛んでしまう人向け

HHKB(US)等でIME切り替えを使いたい人向けの記事です。

settings.jsonに下記を追加すればOK.

```json
"window.customMenuBarAltFocus": false
```

ただし、`window.titleBarStyle`がnativeだと使えなかったのでcustomにするかデフォルトにする必要がありました。
dataFrame のindexとcolumnの一覧を取得する方法

##作業環境
Windows 10 
PyCharm

## コード

```python
import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 4]], columns=list('ABC'))

print(df.index.values)                 # indexを配列で表示する
print(type(df.index.values))
print(df.index.values.tolist())        # indexをリストで表示する
print(type(df.index.values.tolist()))

print("\nここからcolumn")
print(df.columns.values)               # columnを配列で表示する
print(type(df.columns.values))
print(df.columns.values.tolist())      # columnをリストで表示する
print(type(df.columns.values.tolist()))
```


## 実行結果

```
[0 1]
<class 'numpy.ndarray'>
[0, 1]
<class 'list'>

ここからcolumn
['A' 'B' 'C']
<class 'numpy.ndarray'>
['A', 'B', 'C']
<class 'list'>
```

##あとがき
　自分用です。

##追記
コメントにて2つ助言があったので、以下のように追加修正しました。
## コード

```python
import numpy as np
import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 4]], columns=list('ABC'))

print(np.array(df.index))              # indexをndarray配列で表示する(コピーを作るのでパフォーマンス上よくない)
print(df.index.to_numpy())             # indexをndarray配列で表示する(pandasの推奨)
print(df.index.values)                 # indexをndarray配列で表示する
print(type(df.index.values))
print(list(df.index))                  # indexをリストで表示する
print(df.index.values.tolist())        # indexをリストで表示する
print(type(df.index.values.tolist()))


print("\nここからcolumn")
print(np.array(df.columns))            # columnをndarray配列で表示する(コピーを作るのでパフォーマンス上よくない)
print(df.columns.to_numpy())           # indexをndarray配列で表示する(pandasの推奨)
print(df.columns.values)               # columnをndarray配列で表示する
print(type(df.columns.values))
print(list(df.columns))                # columnをリストで表示する
print(df.columns.values.tolist())      # columnをリストで表示する
print(type(df.columns.values.tolist()))
```

## 実行結果

```
[0 1]
[0 1]
[0 1]
<class 'numpy.ndarray'>
[0, 1]
[0, 1]
<class 'list'>

ここからcolumn
['A' 'B' 'C']
['A' 'B' 'C']
['A' 'B' 'C']
<class 'numpy.ndarray'>
['A', 'B', 'C']
['A', 'B', 'C']
<class 'list'>
```
2線分の交差判定手法 (2次元)

AtCoderで遊んでいたところ「[このような問題](https://atcoder.jp/contests/abc016/tasks/abc016_4)」に出くわした。
そこで同一平面上に存在する2線分の交差判定手法について調査した。

#線分が交差する条件
線分 $AB$ と線分 $CD$ について考える。

(1) 点 $A$ 点 $B$ を含む直線 $AB$ を境界線として平面を分割するとき、点 $C$ 点 $D$ がそれぞれ別の領域に存在
(2) 点 $C$ 点 $D$ を含む直線 $CD$ を境界線として平面を分割するとき、点 $A$ 点 $B$ がそれぞれ別の領域に存在

(1), (2)の条件を共に満たすとき線分 $AB$ と線分 $CD$ は交差する。

#点の存在する領域
点 $P$ が平面を分割する直線に対してどちらの領域に存在するかは、直線の方程式に点 $P$ の座標を代入した値の正負で判定ができる。

例えば、直線 $x - y = 0$ に対する点 $C$ $(4, -2)$ の存在する領域を調べる場合
$x - y$ に $(x, y) = (4, -2)$ を代入すると $x - y = 6$ $(> 0)$

一方、直線 $x - y = 0$ に対する点 $D$ $(-4, 2)$ の存在する領域を調べる場合
$x - y$ に $(x, y) = (-4, 2)$ を代入すると $x - y = -6$ $(< 0)$

点 $C, D$ で得られる値の正負が異なるため、点 $C, D$ は別の領域に存在することがわかる。
![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308399/e5094fe5-fe91-838f-5fc5-8780f26f1ff6.png)

つまりこの判定を

* 直線 $AB$ に対する点 $C, D$
* 直線 $CD$ に対する点 $A, B$
 
で行えば線分の交差判定ができる。
(線分の端点が別の線分上に存在する場合に注意)

#線分の交差判定を行うアルゴリズム
まず点 $A$ $(x_A, y_A),$ 点 $B$ $(x_B, y_B)$ を含む直線 $AB$ の方程式を求める。

直線 $AB$ の傾きは $\frac{y_A - y_B}{x_A - x_B}$

直線 $AB$ は点 $A$ を含むため、直線 $AB$ の方程式は $y - y_A = \frac{y_A - y_B}{x_A - x_B} (x - x_A)$

式を変形すると $(x_A - x_B)(y - y_A) - (y_A - y_B)(x - x_A) = 0$

したがって点 $C$ $(x_C, y_C),$ 点 $D$ $(x_D, y_D)$ の領域判定を行う場合

$s = (x_A - x_B)(y_C - y_A) - (y_A - y_B)(x_C - x_A)$
$t = (x_A - x_B)(y_D - y_A) - (y_A - y_B)(x_D - x_A)$

とおくと $st<0$ の時、点 $C, D$ は直線 $AB$ に対して別の領域に存在するといえる。

上記のアルゴリズムをC++で記述した例を以下に示す。

```cpp

typedef struct Point_Coordinates {
	double x, y;
} point;

// 線分ab, cdが交差する場合True
// 端点が他方の線分上にある場合もTrue
// 端点が他方の線分の延長線上にある場合もTrueを返すので注意
int Judge(point &a, point &b, point &c, point &d) {
	double s, t;
	s = (a.x - b.x) * (c.y - a.y) - (a.y - b.y) * (c.x - a.x);
	t = (a.x - b.x) * (d.y - a.y) - (a.y - b.y) * (d.x - a.x);
	if (s * t > 0)
		return false;

	s = (c.x - d.x) * (a.y - c.y) - (c.y - d.y) * (a.x - c.x);
	t = (c.x - d.x) * (b.y - c.y) - (c.y - d.y) * (b.x - c.x);
	if (s * t > 0)
		return false;
	return true;
}
```

#外積を用いる方法
ここまで直線の方程式を用いて領域判定を行ってきたが、外積を用いると簡単に判定を行うことができる。
![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308399/f27c5005-3312-662b-7b23-c781217ae79c.jpeg)

2次元平面においてベクトル $\vec{a}, \vec{b}$ の外積 $\vec{a} \times \vec{b}$ は $\vec{a}$ から $\vec{b}$ への右ねじの方向を符号に持つスカラー値となる。
したがって線分 $AB, CD$ の交差判定を行う場合

$s = \vec{AB} \times \vec{AC} = (x_B - x_A)(y_C - y_A) - (x_C - x_A)(y_B - y_A)$
$t = \vec{AB} \times \vec{AD} = (x_B - x_A)(y_D - y_A) - (x_D - x_A)(y_B - y_A)$

とおくと $st<0$ の時、点 $C, D$ は直線 $AB$ に対して別の領域に存在するといえる。
またこの $st$ の値は [線分の交差判定を行うアルゴリズム](#線分の交差判定を行うアルゴリズム) と同じ値を取ることがわかる

#まとめ
一見異なる求め方でも同じ式が導かれるの面白い
php文法メモ

# はじめに
個人的なメモ。


# 変数展開

https://www.javadrive.jp/php/string/index5.html

`${変数名}`のようにして変数を使う方法だと思っている。

```php:php
<?php
    for ($i = 0; $i < 5; $i++) {
        ${"num" . $i} = $i;
    }
    
    echo $num0 . "\n";
    echo $num1 . "\n";
    echo $num2 . "\n";
    echo $num3 . "\n";
    echo $num4 . "\n";

?>
```

```:結果
0
1
2
3
4
```

変数名の一部を変数を使って表せる、ということを表現したかった。

どこで使うかはわからないけど画期的に感じたのでメモ。


# 参照渡し
phpだとリファレンス渡し？
C言語の感覚とは違っていたのでまとめる。


```php:php
<?php
    function double($n){
        $n *= 2;
    }
    
    $a = 10;
    double($a);
    
    echo $a;
?>
```

```:結果
10
```

これは感覚通り。


```php:php
<?php
    function double(&$n){
        $n *= 2;
    }
    
    $a = 10;
    double($a);
    
    echo $a;
?>
```

```:結果
20
```

これもまあまあ感覚通り。`&`をつける位置が感覚と違う。

次が感覚と違う。

```php:php
<?php
    function double($n){
        for ($i = 0; $i < 3; $i++) {
            $n[$i] *= 2;
        }
    }
    
    $a = [1, 2, 3];
    double($a);
    
    var_dump($a);
?>
```

```:結果
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
```

配列は参照渡しだと思っていたが、違うらしい。

for文ではなくforeach文を使うと複雑になる。


なんでこのようになるのかは↓を読ませて頂き、とても納得できた。
[【PHP超入門】値の代入と値渡しについて](https://qiita.com/7968/items/58015344ddab5d5a8b93)
[【PHP超入門】参照（リファレンス）の代入について](https://qiita.com/7968/items/d68a7aaebdc1711f4345)


# 偶奇判断

なんだこれってなったからメモ

```php:通常
if ($a%2 == 1) {
    echo "奇数";
}
```

```php:なんだこれ
if ($a & 1) {
    echo "奇数";
}
```

phpでのビット演算子経験が薄かったのでパッと見で分からなかった。

md練習がてらマニュアル丸コピ
https://www.php.net/manual/ja/language.operators.bitwise.php

|例|名前|結果|
|:---|:---|:---|
|\$a & \$b|論理積|\$a および \$b の両方にセットされているビットがセットされます|
|\$a &#65372; \$b|論理和|\$a または \$b のどちらかにセットされているビットがセットされます|
|\$a ^ \$b|排他的論理和|\$a または \$b のどちらか一方にセットされており、両方にセットされていないビットがセットされます|
|~ \$a|否定|\$a にセットされているビットはセットせず、そうでないものは逆にします|
|\$a << \$b|左シフト|\$a のビットを左に \$b ビットシフトする (各シフトは "2をかける" ことを意味します)|
|\$a >> \$b|右シフト|\$a のビットを右に \$b ビットシフトします (各シフトは "2で割る" ことを意味します)|



論理和の`|`、この記号を表内に表すのに苦戦した。
参考
[Qiitaの投稿で@をエスケープする](https://qiita.com/jumjamjohn/items/2f4c8431d5371cd6794b)
[バーティカルバー](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%90%E3%83%BC)


# おわり
HerokuからAWSに本番環境を移行する際に詰まったこと。

# はじめに
MAMP環境で作成したLaravelプロジェクトをHerokuにデプロイしてたのですがAWSの学習をかねて本番環境を移行してみました。

#環境
- 開発環境
  - PHP 7.3.6
  - Laravel 5.8.35
  - MAMP 
- 本番環境
  - Heroku
- 移行する本番環境
  - AWS
     - EC2(Amazon Linux 2 AMI)
     - RDS(MySQL)

# 詰まった点
EC2にプロジェクトをgit cloneしブラウザでプロジェクトが開ける状態が出来、RDSのMySQLに

```
php artisan migrate
```
コマンドでテーブルを作成できたら完成！、、というところでエラー発生

```
Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema =  and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/html/namilog/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] No such file or directory")
      /var/www/html/<app名>/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=", "<db名>", "<パスワード>", [])
      /var/www/html/<app名>/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```
エラーの詳細をみてみるとException traceの２にMAMPで開発を行なった際のunix_socketが指定されている。

```
 PDO::__construct("mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=", "<db名>", "<パスワード>", [])
      /var/www/html/<app名>/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
```
調べてみると、unix_socketはlocalhost内で通信を行う際に必要なものらしくて、今回はEC2のIPアドレスで通信を行うので必要ないことがわかりました。
なのでlaravelプロジェクトのconfig/database.phpファイル内のunix_socketのパスを削除。

```database.php
~省略~
'mysql' => [
           ~省略~
          'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),
           ~省略~
]
~省略~
```
その後改めてphp artisan migrate を実行するとうまくテーブルが作成されました。


間違って解釈している可能性があるので異なっている点がありましたら指摘してくださるとありがたいです。

# 参考にした記事

https://beyondjapan.com/blog/2016/03/2002-mysql-socket-error/
regenerative inventory systems

```{r}

#estimating parameters 

#truncated normal distribution p.43

fun=function(x,a,b){
  
return(exp(-((x-a)/b)^2/2)/(b*sqrt(2*pi)*(1-dnorm(a/b))))  
  
}

alpha=1;beta=1

value=rpois(20,5);value=value/max(value)

ite=10000;h=0.001

eta=0.01

for(j in 1:ite){
  
alpha=alpha+eta*(sum(log(fun(value,alpha+h,beta)))-sum(log(fun(value,alpha,beta))))  

beta=beta+eta*(sum(log(fun(value,alpha,beta+h)))-sum(log(fun(value,alpha,beta))))  
  
print(sum(log(fun(value,alpha,beta))))

}



```
うた「大きな栗の木の下で」の再生を例としてasync非同期処理を説明します

#非同期処理
プログラムって実行すると、コードを上から順に1行ずつ実行していきますね。
その処理の1つに時間のかかる処理があると、その実行が完了するまで、次の行には進みません。
例えば、五線譜によって、ピアノの音声ファイルを再生する時には、音声ファイルを一つずつ再生することが必要になります。この場合は同期処理だけで出来ません、非同期処理が必須です。

#何故asyncを利用するのか
ES6以前の非同期処理って面倒です。JavaScriptではいわゆるコールバック地獄というやつにしばしば陥りがちです。
ES6からはPromiseを利用して、簡潔に非同期処理が書けました。

#asyncとは
非同期関数を定義する関数宣言のことです。
以下のように関数の前にasyncを宣言することにより、非同期関数（async function）を定義できます。
・async functionは呼び出されるとPromiseを返します。
・async functionが値をreturnした場合、Promiseは戻り値をresolveします。
・async functionが例外や何らかの値をthrowした場合はその値をrejectします。

#asyncの利用例
以下は、うた「大きな栗の下で」の再生を例として非同期処理をやってみましょう。

```#async.html
<script language="javascript">
	const playMusic = async function() {
		//大きな栗の木下で
		await play(4, 1).then((p) => { console.log("await:" + p);});
		await play(8, 1).then((p) => { console.log("await:" + p);});
		await play(8, 2).then((p) => { console.log("await:" + p);});
		await play(8, 3).then((p) => { console.log("await:" + p);});
		await play(8, 3).then((p) => { console.log("await:" + p);});
		await play(4, 5).then((p) => { console.log("await:" + p);});
		await play(8, 3).then((p) => { console.log("await:" + p);});
		await play(8, 3).then((p) => { console.log("await:" + p);});
		await play(8, 2).then((p) => { console.log("await:" + p);});
		await play(8, 2).then((p) => { console.log("await:" + p);});
		await play(2, 1).then((p) => { console.log("await:" + p);});
	}

	//signature：2→二分符、4→四分符、8→八分符
	//note：1→ド、2→レ、3→ミ、5→ソ
	const play = function(signature, note) {
		return new Promise((resolve, reject) => {
			let waitTime = signature * 500;
			//let mp3FileNm =getMp3FileNm();
			//mp3音声ファイルを再生する
			//play(mp3FileNm);
			console.log("play");
			let p = "signature:" + signature + " note:" + note;
			setTimeout(resolve, waitTime, p);
		});
	}	
</script>
```
実行結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229009/ed1b8ae9-42ba-3a74-0bea-8cb6329a8de2.png)
RaspberrypiでLINE通知する簡易防犯カメラ

#はじめに（2019.12.7構成図追加）
自宅のセキュリティを強化したいと思ってRaspberryPiで簡易防犯カメラを自作。セキュリティサービスや高価なカメラを買う前にちょっと試してみたいという方向け。
玄関前やリビング窓の不審者を検知しLINE通知させたり、LINEBot経由で好きなときに撮影させようと思う。
今回は左から右の赤線のように、カメラからストリーミングした動画をmotionというパッケージで動体検知させてLINENotifyで通知する。
将来的にはオレンジ点線のようにLINEBot経由で撮影させたい。

![Raspberrypi簡易防犯カメラでLINE通知.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/b9a1399b-220a-3d07-6d95-32896911157e.jpeg)

#準備するもの
・RaspberryPi Zero WH
![Screenshot 2019-11-18 at 17.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/09941e9f-b6c2-3ecf-6fa2-85787db919cf.png)
・カメラモジュール
![Screenshot 2019-11-18 at 17.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/07c8ef52-bb14-caf5-006b-794c5eda4c42.png)
・zero用カメラケーブル
![Screenshot 2019-11-18 at 17.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/e177b01c-4665-c57a-530c-0e3d05c8540f.png)
※これらは事前に接続しておいてください

・RaspberryPiへRaspbianOSのインストール
・SSH接続ユーザの作成
・[LINE Notifyアクセストークン](https://notify-bot.line.me/doc/ja/)

今回はなるべく小型に作ることをコンセプトにしているため、RaspberryPi Zeroを選択した。このスターターキットは安定稼働に必要な5V3A対応電源と、フリスクサイズのケース、さらにケースにはカメラが取り付けられる穴が空いているので、初心者にも始めやすいと思う。
RaspberryPi3を利用する場合、カメラモジュールをそのまま使えるのでzero用ケーブルは不要。

ただひとつ失敗したことはzero WHはGPIOピンがデフォルトで付いていて、カメラ穴が空いている上蓋ケースを取り付けられなかった。GPIOピンは使わずカメラモジュールだけを使いたい場合はzero Wを購入することをおすすめする。
![Screenshot 2019-11-18 at 17.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/a5d21dab-cfc7-cb9b-f1a9-534cf239c5ac.png)

#ゴール
RaspberryPiで動体検知するとLINEに画像を送付する

#設定
RaspberryPiがカメラモジュールを認識するように有効化

```bash
sudo raspi-config
```

動体検知にはmotionというモジュールを利用

```bash
sudo apt-get install motion
```

Daemonが起動できるように所有者を変更

```bash
chown motion:motion /var/lib/motion  
```

motion.confの設定。YOUR_PERSONAL_ACCESS_TOKENはLINE Notifyに合わせて設定

```bash:/var/etc/motion.conf
#解像度をLine通知に合わせてなるべく上げる
width 1024
height 768
 
# N秒以内のイベントを同一イベントとする設定
event_gap 5
 
# 動体検知したイベントの中で、一番変化が大きかった画像を保存する
output_pictures center
 
# 動画は保存しない
ffmpeg_output_movies off

# 動体検知箇所を赤枠表示
locate_motion_mode on

# 変化があったピクセル数を右上に表示
text_changes on

# 右下の時刻表示サイズを倍にする（デフォルトは小さくて見づらい）
text_double on

# 画像保存時に、LINE Notifyに送信する
on_picture_save curl https://notify-api.line.me/api/notify -X POST -H 'Authorization: 
Bearer YOUR_PERSONAL_ACCESS_TOKEN' -F 'imageFile=@%f'  
```

デーモンによる自動起動設定

```bash:/etc/defaults/motion
start_motion_daemon=yes 
```

サービス起動＋自動起動設定

```bash
sudo service motion start
sudo update-rc.d motion defaults   # 自動起動設定
```

#結果
玄関とリビングの前の足元に設置してみたところ。変化があった部分に白枠がついてLINEに通知してくれるようになった。
![Screenshot 2019-11-18 at 18.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/ddd6369c-1d42-ffa4-f2e7-54373e76b75d.png)

とりあえずのお試しとしてはGood！だけど運用上の課題はたくさんありそう。ストレージ寿命、電源供給、自然環境（温度、風雨）対策など。それらの検討はまた別記事で。

#参考
LINE Notifyを使って動体検知
https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-stickers-and-upload-images/

motionのパラメータ設定
https://www7390uo.sakura.ne.jp/wordpress/archives/250
db の接続のメモ

#ＤＢ接続メモ（大雑把に書きました）

```java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


Connection con;
preparedStatment pstmt;
ResultSet ts;

//1.DBと接続

con = DriverManager.getConnection(
            "jdbc:mysql://(DBのアドレス)",
            "（sqlid）",
            "(sqlpassword)"
        );

//2.dbとやり取りする
pstmt = don.prepareStatement（sql文）;

//3.selectb分の実行と結果を代入
rs.pstmt.executeQuery();

//4.結果を表示
while(rs.next()){

}catcg(SQLException e){
e.printStackTrace();
}fainally{
 DBのclose処理
}
Ruby on Railsの要点【ディレクトリ、コマンド編】

Railsチュートリアルを終えたので、学んだことを整理していきたいと思います。
##ディレクトリ構成
よく使うファイル、ディレクトリだけを抜粋します。

```
app
 ├── assets/         # 画像ファイル、CSS、Javarcriptなど
 ├── controllers/    # コントローラー
 ├── helpers/        # ヘルパー関数
 ├── mailers/        # メール送信の設定
 ├── models/         # DBの各テーブルに紐づいた設定（関数、バリデーションなど）
 ├── uploaders/      # ファイルアップロード周りの設定
 ├── views/          # ビューファイル
config
 ├── routes.rb       # ルーティングの設定
db
 ├── migrate/        # DBの構成変更に関するファイル
 ├── seeds.rb        # DBに入れるデータ
public/              # 404エラーページなど
test
 ├── controllers/    # コントローラーのテスト
 ├── fixtures/       # テスト用のサンプルデータ
 ├── helpers/        # ?
 ├── integration/    # 統合テスト
 ├── mailers/        # メイラーのテスト
 ├── models/         # モデルのテスト
 ├── test_helper.rb  # テスト用のヘルパー関数
Gemfile              # 使いたいGemのリスト
Gemfile.lock         # Gemを使うための記述
```
##コマンド
####プロジェクトを作成
`rails new {プロジェクト名}`

```
$ rails new sample_app
```
####ローカルサーバーを起動
```
$ rails s
```
####Railsコンソールを起動
Railsコンソールを使うことで、現在の設定（関数、データベース、gemなど）を引き継いだ状態でRubyのコードを実行することができます。

```
$ rails c
$ rails c --sandbox #コンソールでの実行内容をDB等に反映しない
```

####テストを実行
```
$ rails t
```
####コントローラーを作成
`rails g {コントローラー名} {アクション名}`
コントローラー名は頭文字**大文字**の**複数形**

```
$ rails g controller Users
$ rails g controller Users new show index #中身が空の「new,show,index」アクションを生成
```
**作られるファイル**
controller、view、test/controllers、test/helpers、scss、js

####モデルを作成
`rails g model {モデル名} {カラム名:型}`
モデル名は頭文字**大文字**の**単数形**
新規テーブルを作成する時に使います。

```
$ rails g model User name:string age:integer 
```
**作られるファイル**
migration、model、test/model、test/fixture

####マイグレーションファイルを作成
`rails g migration {マイグレーションファイル名}`
既存テーブルの構造を変更したい時（カラムの追加など）に使います。
マイグレーションファイル名は、作成目的がわかるように命名します。

```
$ rails g migration AddNicknameToUser
```
**作れられるファイル**
migration

**カラム追加**、**カラム削除**、**テーブル作成**を行う場合には、以下のようなマイグレーションファイル名をつけると、必要なコードが途中まで書かれている状態でファイルが作成されます。

| 変更内容 | マイグレーションファイル名 |
|:--|:--|
| カラム追加 | Addカラム名Toテーブル名 |
| カラム削除 | Removeカラム名Fromテーブル名 |
| テーブル作成 | Createテーブル名 |

####マイグレーションファイルを適用
```
$ rails db:migrate
```
####適用したマイグレーションをロールバック
```
$ rails db:rollback
```

####統合テスト用ファイルを作成
`rails g integration_test {ファイル名}`

```
$ rails g integration_test users_login_test
```

####gemをインストール
Gemfileに記述したgemをインストールします。

```
$ bundle install
```
##参考
[Rails generate の使い方とコントローラーやモデルの命名規則](https://qiita.com/higeaaa/items/96c708d01a3dbb161f20)
[【Rails】マイグレーションファイルを徹底解説！](https://www.pikawaka.com/rails/migration#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%90%8D%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
Deployerを使ってデプロイするとエラー：The command "cd /var/www/comdesk-api-staging/releases/5 && /usr/bin/php /usr/bin/composer install --verbose --prefer-dist --no-pro   gress --no-interaction --no-dev --optimize-autoloader --no-suggest" failed.

# エラー
```
The command "cd /var/www/comdesk-api-staging/releases/5 && /usr/bin/php /usr/bin/composer install --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader --no-suggest" failed.

Exit Code: 1 (General error)
```
に遭遇した場合、以下を試してみましょう。

# 解決
Composerのdependencyが `require-dev` の可能性が高いので、以下を `deploy.php` に追加

```
set('composer_options', 'install --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader');
```
nginxでのCORS設定

ngnixで直接responseを返すときに、CORS設定をしないと、client側でresponseを読み取れない問題があります。

413エラーの場合、以下の設定で、問題解決できます

```
  error_page 413 @413;

  location @413 {
    add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS';
    add_header Access-Control-Allow-Origin '*' always;
    return 413;
  }
```
VBScriptで変数名に日本語や空白を入れる方法

VBAでは変数名に日本語を使うことができるので、以下のようなコードを書くことが出来ます。

```vb
Dim 名前 As String
名前 = InputBox("名前を入力して下さい")
```

一方でVBScriptでは変数名に日本語を使うことは許されておらず、以下のコードはエラーになります。
のっぴきならない事情により、VBScriptでも変数名に日本語を使いたい時にはどうしたらいいでしょうか？

```vb
Dim 名前
名前 = InputBox("名前を入力して下さい")
```

# 解決策
変数名を`[]`で囲む。

なんと！変数名を[]で囲むことによってその中に日本語を書くことができるようになります。

```vb
Dim [名前]
[名前] = InputBox("名前を入力して下さい")
```

この機能は公式ドキュメントにも書かれていない隠し機能ですが、確かに動作します。

更に以下のブログ記事によると、ほぼすべての文字が使えるようなので、変数名を好き勝手につけ放題です。
空白や記号を含んでいても、予約語だろうが変数名にすることが出来ます。
あまりにもアレ気な仕様なので、Qiitaのシンタックスハイライトがバグってますが、実行してみるとエラーは出ません。
[VBScript Trivia: Bracket Identifiers and Reserved Word Incompatibilities](https://blogs.msdn.microsoft.com/ericlippert/2004/06/10/vbscript-trivia-bracket-identifiers-and-reserved-word-incompatibilities/)

```vb
Dim [with space], [symbol!"#$], [If]
```

また、変数名だけでなく、任意の識別子に対してこの記法が使えるため、`[While]`関数や、`[End]`メソッドを作ることだって出来ます。
LPとかでよく見るあれがやりたい（position: sticky;）

# この記事のターゲット
- あれがやりたんだよあれが
- stickyってなんだろう
- いいから動くものをくれ


# 最終成果物
これです。
LPとかでよくみますね。

![sticky.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177043/1960d5fc-58df-db74-ed8f-e1a3de4c915e.gif)


# 実装
## 土台になるhtmlの用意
さっくりと。

```index.html
<!DOCTYPE html>
<html lang ="ja">
<head>
    <link rel="stylesheet" href="../css/sticky.css">
</head>
<body>
    <main>
        <section class="block section-first"><h2>First</h2></section>
        <section class="block section-second"><h2>Second</h2></section>
        <section class="block section-thrid"><h2>Thrid</h2></section>
    </main>
</body>
</html>
```

## 要素にstickyを適用
まずは気にせず動かしてみましょう。

```sticky.css

h2 {
	font-family: 'Century';
}

.block {
	display: flex;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 100vh; 
	position: -webkit-sticky;
	position: sticky;
	top: 0;
}

.section-first {
	background: rgb(52, 225, 255);
}

.section-second {
	background: rgb(79, 183, 214);
}

.section-thrid {
	background: rgb(45, 110, 141);
}
```


## カンタンに解説
h2とsection-firstとかはただの装飾なのでまぁ置いておいて。
大事なのはblockクラスですね。

```
position: sticky;
```

これが大事です。
そもそもstickyってどんな意味でしょう。

日本語訳すると「粘着性」です。
そう言われるとわからなくもないです。
通常のスクロールで上に行かず画面に張り付いてるイメージってことでしょうかね。
これを指定したことで準備が整いました。
ただし、これだけでは例のあれにはなりません。
どこに粘着させるかを指定しないとただただ上にスクロールされるだけです。

```
top: 0;
```

ということでtopを0に固定することで粘着させます。
この値を変えるだけでいろんな高さに粘着させることができるので試してみてください。


## まとめ
なんだかシャレオツ！
普通にスクロールさせるよりもコンテンツとコンテンツの境目がはっきりしてより伝わりやすくなりますね。
とはいえ過剰なスクロールジャックは反感を買う可能性もあるのでやり過ぎ厳禁。
機械学習　データサイエンス　記事まとめ

# 機械学習参考サイト

[人工知能(AI)】ディープラーニングの仕組み！中学生でもなんとなくわかる！【入門】](https://mieruca-ai.com/ai/easy_deeplearning_algorithm/)
・基本が分かりやすく書かれている

[ディープラーニングさえあれば、競馬で回収率100%を超えられる](https://qiita.com/yossymura/items/334a8f3ef85bff081913)
・やはりお金に関わる記事はおもしろい

[AI Academy]
(https://aiacademy.jp/texts/show/?id=162)
・体験的に機械学習ができるよ

[データサイエンティストが知っておくべき5つのグラフアルゴリズム]
(https://qiita.com/baby-degu/items/904a0e832d535d9e4b31)
・データサイエンスで有効活用できるアルゴリズム

[機械学習・AIプロジェクトの要素を整理する手法をまとめてみました]
(https://qiita.com/shore/items/15e7c1aebf3b25fbfcf7)
・海外と日本で使用する要素を整理する方法

見つけ次第更新していきます。
遅延実行asyncのメモ

## asyncで遅延実行
ある実行のあとに、もう一つ実行させたい、そしてそのまた後に何秒後に実行

みたいなケースのときに活用した。

## コード
```javascript
  
  const test1 = () => {
   alert(1);
  }

  const test2 = () => {
   alert(2);
  }

  //////////////////////
  // 表示のタイミング
  //////////////////////
  async function delay() {
    try {
      //秒数と、関数を渡す
      await wait(1, test1());
      await wait(1, test2());
    } catch (err) {
      console.error(err);
    }
  }
  
  
  //////////////////////
  // 遅延実行
  //////////////////////
  const wait = (sec) => {
    return new Promise((resolve, reject) => {
      setTimeout(resolve, sec * 1000);
    });
  };
```

## 結果
test1()のalertが実行された1秒後に、test2()のalertが表示される
関数を渡すことで色々と応用できたので個人的メモ


## async
超便利
もっとうまく書く方法があれば教えてほしい、、、、、
z-index 使用方法

# z-index プロパティ

要素の重ね順を指定できる。

## 使用条件
位置が指定されている要素（position プロパティがstatic（初期値）以外）の要素に対して有効。
`position: absolute;` とか指定されていればOK。

## 例

```html
<div class="red"></div>
<div class="pink"></div>
```
```css
.red {
  height: 100px;
  width: 100px;
  position: absolute;
  background-color: red;
}
.pink {
  height: 100px;
  width: 100px;
  position: absolute;
  left: 20px;
  top: 20px;
  background-color: pink;
}
```
<img width="165" alt="スクリーンショット 2019-11-18 17.33.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/65e90955-e594-4f18-f82e-4b3a698a5602.png">


z-index を指定していないので、後から記述したピンクボックスが前に重なっている。


```css
.red {
  height: 100px;
  width: 100px;
  position: absolute;
  background-color: red;
  z-index: 1;
}
.pink {
  height: 100px;
  width: 100px;
  position: absolute;
  left: 20px;
  top: 20px;
  background-color: pink;
}
```

`z-index: 1;`を指定することによりレッドボックスが前に出る。
数が大きいほど手前になる。

<img width="180" alt="スクリーンショット 2019-11-18 17.38.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/026b766b-55dd-ad44-be31-f65261b4071d.png">
OpenSSHでSFTPサーバを構築する

## SFTPサーバの用意
`/etc/ssh/sshd_config` を適切に設定すればSFTPサーバの環境を用意することができる。

### SCPとSFTPの違い
参考：[SCPとSFTPの違い \| Skyarch Broadcasting](https://www.skyarch.net/blog/?p=379)
cpとftpの違いとして認識するとよい。opensshのデフォルトポートを利用するなら22番で両方ともsshの設定変更で実現可能。
今回はSFTPを用意する。

#### 環境
- Linux
  - CentOS Linux release 7.7.1908 (Core) ... 作業時の最新を用意してみた
- Client
    - FTPクライアントソフトを用いることを想定
    - Windows:[WinSCP](https://winscp.net/eng/docs/lang:jp), Mac:[Cyberduck](https://cyberduck.io/) など
- 接続ユーザ名/グループ
    - test001/sftp ... パスワード認証想定
    - test002/sftp ... 鍵認証想定
    - グループ名は共通。グループでの制御でもよいが、今回はユーザ単位とする。

今回はクライアントの設定は省略する。なお、鍵認証とパスワード認証の両方を用意してみる。

#### SFTPの設定
```shell:/etc/ssh/sshd_config
AcceptEnv LANG LC_*
ChallengeResponseAuthentication no
PrintMotd no
PubkeyAuthentication yes
Subsystem sftp /usr/libexec/openssh/sftp-server
UsePAM yes
X11Forwarding no

Match user test001
    ChrootDirectory /home/test001/
    ForceCommand internal-sftp
    PasswordAuthentication yes

Match user test002
    AuthorizedKeysFile /home/test002/.ssh/authorized_keys
    ChrootDirectory /home/test002/
    ForceCommand internal-sftp
    PasswordAuthentication no
```

設定としてはこのように用意。
test001はパスワード認証とした場合、 `passwd test001` 等であらかじめユーザを用意したのにちパスワードを用意。
test002は鍵認証のため、秘密鍵＋公開鍵の組み合わせを用意して、 公開鍵を `/home/test002/.ssh/authorized_keys`  に保存すること。sshと考え方は同じ。

このとき、ログインシェルはありでよいが、sshをさせたくないので `ForceCommand internal-sftp`
 としている。

```shell-session
% ssh test001@<該当IPアドレス>
sign_and_send_pubkey: no mutual signature supported
test001@<該当IPアドレス>'s password:
This service allows sftp connections only.
Connection to <該当IPアドレス> closed.
```
これにより、上記のとおりでsshに制限がかかる。
`sign_and_send_pubkey: no mutual signature supported` との表記。

#### トップディレクトリを/にしたい場合
権限がゆるいと `/home/test001` よりトップにさかのぼれてしまう。
`/home/test001` を `chown root:root` として、ディレクトリ内に該当のユーザがアクセス可能なディレクトリを別で用意してやりとりするとよい。

### 参考サイト
[SFTPで特定のディレクトリのみ利用可能とする \- Qiita](https://qiita.com/cats_touchan/items/da010486811e4a7d891a)
.NETのnull許容値型(Nullable<T>)でハマったこと

データベースの型クラスを自動生成する過程でハマったのでメモ。

## 現象
- 実行時に`int?`(`Nullable<int>`)となっている変数に対して、型情報を取得すると`int`が返ってくる

## 原因
`Nullable<T>`型がボックス化されるとき、

- `HasValue`が`false`ならば`null`に
- `HasValue`が`true`ならば`T`型に

自動でボックス化される。
そのため実行時の型を調べようと`object.GetType()`を呼ぶと、`T`型が返ってくるか、`null`にボックス化されるため、`NullReferenceException`の例外が発生する。

対象の型がNullable<T>かどうか検証するには、[`Nullable.GetUnderlyingType`](https://docs.microsoft.com/en-us/dotnet/api/system.nullable.getunderlyingtype)を使うこと。

## 検証コード

[Try.NET](https://try.dot.net/)に以下のコードを貼り付けることで、オンラインで検証できます。

```csharp:Sample.cs
using System;

public class Program
{
  public static void Main()
  {
    // typeof(int?)はNullable<int>を返す
    Console.WriteLine($"typeof(int?) = {typeof(int?)}");

    int? nullableThree = 3;
    int? nullValue = null;
    int notNullTen = 10;

    // Nullable<T>.GetType()は未定義のため、object.GetType()が呼ばれる。(ボックス化)
    // その際HasValue == trueの場合はT型に、falseの場合はnullにボックス化される。(Nullable<int>にはボックス化されない)

    // int型にボックス化されるため、intを返す
    Console.WriteLine($"nullableThree type is {nullableThree.GetType()}");

    try
    {
      // nullにボックス化されるため、NullReferenceExceptionの例外発生
      Console.WriteLine(nullValue.GetType());
    }
    catch (NullReferenceException)
    {
      Console.WriteLine("nullValue causes NullReferenceException");
    }
    
    // is演算子も同様。n is intとn is int?は同じ結果を返す(Nullable<int>に変えても同様)
    Console.WriteLine($"nullableThree is int = {nullableThree is int}");
    Console.WriteLine($"nullableThree is int? = {nullableThree is int?}");
    Console.WriteLine($"nullValue is int = {nullValue is int}");
    Console.WriteLine($"nullValue is int? = {nullValue is int?}");
    // int型の変数に対するn is int?に至っては「常にtrueを返すけどいい？」という注釈が出る
    Console.WriteLine($"notNullTen is int? = {notNullTen is int?}");

    // Nullable<int>とintの区別にはNullable.GetUnderlyingType(System名前空間)を使用する
    Console.WriteLine($"IsNullableType(notNullTen) = {IsNullableType(notNullTen)}");
    Console.WriteLine($"IsNullableType(nullableThree) = {IsNullableType(nullableThree)}");
    
    // リフレクションでプロパティやフィールドの型を取得した場合はNullable<T>になる
    Console.WriteLine(typeof(Foo).GetProperty(nameof(Foo.Value)).PropertyType);
  }

  public class Foo
  {
    public int? Value { get; set; }
  }

  public static bool IsNullableType<T>(T o) => Nullable.GetUnderlyingType(typeof(T)) != null;

}
```

```csharp:実行結果
typeof(int?) = System.Nullable`1[System.Int32]
nullableThree type is System.Int32
nullValue causes NullReferenceException
nullableThree is int = True
nullableThree is int? = True
nullValue is int = False
nullValue is int? = False
notNullTen is int? = True
IsNullableType(notNullTen) = False
IsNullableType(nullableThree) = True
System.Nullable`1[System.Int32]
```

## 参考
- [Nullable value types (C# reference)](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types#boxing-and-unboxing)
Rails6のWebpackにjQueryとBootstrapを導入する手順

Rails6からWebpackが標準導入されるようになりました。
今までjQueryやBootstrapを導入するには、それぞれのGemをインストールして`app/assets/javascripts/application.js`や`app/assets/stylesheets/application.scss`で呼び出すという手順でしたが、これからはWebpackを使って管理していくのが正しい道のようです。

#前提
Rails6を使っている想定なので、Webpackerのインストール手順は省略します。

#諸々のインストール
以下のコマンドでインストールします。

```shell
$ yarn add bootstrap jquery popper.js
```

正常にインストールされたかは`package.json`で確認できます。

#jQueryの導入手順
`app/javascript/packs/application.js`以下を追記します。

```javascript
require("jquery")
```

`config/webpack/environment.js`に以下を追記します。

```javascript
const webpack = require('webpack')

environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)
```

#Bootstrapの導入手順
`app/javascript/src/application.scss`を作成し、以下を追記します。


```css
@import '~bootstrap/scss/bootstrap';
```

`app/javascript/packs/application.js`に以下を追記します。

```javascript
import 'bootstrap'
import '../src/application.scss'
```

#設定ファイルまとめ

```app/javascript/packs/application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("jquery")

// Uncomment to copy all static images under ../images to the output folder and reference
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
// or the `imagePath` JavaScript helper below.
//
// const images = require.context('../images', true)
// const imagePath = (name) => images(name, true)

import 'bootstrap'
import '../src/application.scss'
```

```app/javascript/src/application.scss
@import '~bootstrap/scss/bootstrap';
```

```config/webpack/evironment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')

environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)

module.exports = environment
```
VBScriptで「まともな」配列を使う方法

VBScriptの配列は色々と制限が多いので、RubyやPythonなどの他のスクリプト言語を使ったことがある人は他の言語では簡単にできることがVBScriptでは出来なくイライラする事が多いと思います。
C言語で配列(と言う名前の実質ポインターのシンタックスシュガー)を扱ったことがある人なら、それと似た感じといえば通じる辛さです。

特に動的配列を扱うことが苦手な印象をうけます。
例えば、以下のように `Dim arr(2)` と宣言した要素数3の配列の要素数を後から増やしたくなったときに辛い思いをします。

```vb
Dim arr(2)
arr(0) = "hoge"
arr(1) = "fuga"
arr(2) = "piyo"

arr(3) = "hogehoge" ' ここで要素を増やすことが出来ない
```

また、配列の要素数の指定は定数にする必要があるのも面倒です。

```vb
Dim str, num
str = InputBox("input number")
num = CInt(str)

Dim arr(num) ' ERROR! 要素数を変数として与えることが出来ない
```

配列を宣言するときに、要素数を指定しなければある程度は柔軟に要素数を変えることも出来ますが、ReDimするときにPreserveを指定し忘れて要素をすべて消したことのある経験をしたことのある人は少なくないと思います。
また、要素数の変更が柔軟になったとしても、RubyやPythonの配列の足元にも及びません。

# 解決策
.NET FrameworkのArrayListを使う。
あまり知られていないテクニックですが、VBScriptのCreateObjectで.NET Frameworkのオブジェクトを生成することが可能です。
そのため、.NET Framework側のデータ構造を使うことが出来ます。
System.Collectionsの名前空間を見ると沢山のデータ構造がありますが、今回は一番汎用的に使えそうなArrayListを使ってみることにします。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.arraylist?view=netframework-4.8

```vb
Dim arr
Set arr = CreateObject("System.Collections.ArrayList")

' 末尾に要素追加
arr.add "hoge"
arr.add "fuga"

' ソート
arr.Sort

' 特定の要素を取得
Dim s
s = arr(1)

' 要素を順番に取得
Dim element
For Each element In arr
  Wscript.Echo element
End For

' VBScriptの配列に変換
Dim vbsarr
vbsarr = arr.ToArray()
```

ArrayListを生成するところだけちょっと面倒くさいですが、他の部分はほぼ違和感なく使うことが出来ています。
生成をする部分は短い名前のヘルパー関数を作ると便利になるかもしれません。

System.CollectionsにはArrayList以外のデータ構造もたくさんあるので、これらを活用することによって、VBScriptの貧弱なデータ構造をリッチにすることが出来ます。
他にもScripting.Dictionaryが貧弱だと感じている人はSystem.Collections.HashTableを使うことで他のスクリプト言語とほぼ同等の機能をもった連想配列を使うことが出来ます。
応用カリキュラム 01 用語メモ

#[jQueryのメリット・デメリットは簡単に言うと何か](https://geekly.co.jp/column/cat-technology/1903_039/)
##jQuery
javascriptを簡単に扱えるようにしたようなプログラム言語
簡単にhtml/cssを扱える。

###機能
DOM　HTMLを操作する為の仕様。
アニメーションを作成することができる
Ajax　外部ファイルを読み込ませる機能。各所で見かけるGoogleMapがいい例。

#[jQueryは最近のトレンドの中でどのような立ち位置か(人気上昇中 or 下降中)、それはなぜか](https://qiita.com/rana_kualu/items/9652879067cf658499c7)

###メリット
コードが短くかける。
ブラウザ毎に異なる挙動を吸収できる。
プラグインが豊富。
###デメリット
処理が遅くなる場合がある。
他のライブラリと共存しにくい。

2019年現在、jQueryのシェアは下降中である。
最新のライブラリと相性が悪いことと、最新のブラウザがjQueryのような機能を持ち始めた為。

#[deviseとは](https://diveintocode.jp/blogs/Technology/Devise)
Railsで作成したアプリケーションへ簡単に認証機能を実装することができるgem（ライブラリ）の一つ

#[deviseと同様な機能で他によく使われるものは何か、それらの違いは何か、なぜdevise以外にそれが生まれたか](https://qiita.com/zuchi190/items/4cb9da7dd73371fc63ee)
Authlogic Authlogicはシンプルなものになっていて、そのかわり自分で実装しないといけない箇所は多い？？
#[unicornとは簡単に言うと何か](https://qiita.com/zuchi190/items/4cb9da7dd73371fc63ee)
UNIX環境でRuby Webアプリケーションを提供するRack HTTPサーバ

#[unicornと同様な機能で他によく使われるものは何か、それらの違いは何か、なぜunicorn以外にそれが生まれたか](https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3)
Nginxがある。unicornはアプリケーションサーバー。nginxはwebサーバー。アプリケーションサーバーは重い処理を担保し、webサーバーは軽い処理を担保するべきであるから生まれた？？

#参考

『jQuery』でできることってなに？！その特徴からメリット・デメリットまで幅広くご紹介します！ | Geekly Media | Geekly（ギークリー） IT・Web・ゲーム業界専門の人材紹介会社
[https://geekly.co.jp/column/cat-technology/1903_039/](https://geekly.co.jp/column/cat-technology/1903_039/)

2019年に注目すべきWebテクノロジー6選 - Qiita
[https://qiita.com/rana_kualu/items/9652879067cf658499c7](https://qiita.com/rana_kualu/items/9652879067cf658499c7)

DIVE INTO CODE | RailsにおけるDeviseとは？
[https://diveintocode.jp/blogs/Technology/Devise](https://diveintocode.jp/blogs/Technology/Devise)

deviseについて - Qiita
[https://qiita.com/zuchi190/items/4cb9da7dd73371fc63ee](https://qiita.com/zuchi190/items/4cb9da7dd73371fc63ee)

Rails開発におけるwebサーバーとアプリケーションサーバーの違い（翻訳） - Qiita
[https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3](https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3)