OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10のスクリーンショットを簡単に保存したい!

# Windows10のスクリーンショット
いつぞやのCreatorsUpdateで追加された
[Win+Shift+S]で起動できるスクリーンショット機能...

これを使うとクリップボードに画像を保存されるのですが...
やっぱりMacみたいに画像を保存したいときもあると思います!
ということで今回はWindows10で撮ったスクリーンショットをファイルに保存する
プログラムを書いていこうと思います!!

## 環境
- Windows10 CreatorsUpdate以降
- python3.6

### 必要なライブラリ
- PIL
- pynput

### インポート

```python:sc.py
from PIL import ImageGrab, Image
import datetime
from pynput.keyboard import Key, Listener
```
### クリップボードの画像を保存する関数
まずクリップボードの画像を保存する関数をさっと
書いてしまいましょう!(スピード大事!!

```python:sc.py
def save():
    im = ImageGrab.grabclipboard()
    if isinstance(im, Image.Image):
        im.save(str("保存先をここに入力")+str(datetime.datetime.today()).replace(" ","-").replace(":","-")+'.jpg')
        print('saved') #保存できた時
    else:
        print('no image') #保存できなかった時(なぜか保存出来てるのに出ることもある)
```

## そして...
特定のキー 今回は[CtrlR]そう右側にあるCtrlキーを押したときにスクリーンショットを
保存するようにします!
pynputのイベントを利用するために関数を書きます

```python:sc.py
def on_press(key):


    try:
        if key.char == "DUMMY":
            save()
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:

        it= "{0}".format(
            key)
        if it == "Key.ctrl_r":
            save()
```
詳しい説明は省きますが Ctrl,Shift,backspace,escなどを検知する時は
   ` if it == "Key.ctrl_r":`をの部分を`    if it == "ESC":`
といった具合に書き換えてください
数字や文字などのキーを検知するには
try分の中にある
` if key.char == "DUMMY":`を` if key.char == "A":`などに書き換えてください
(このコード内ではDUMMY(ダミー)を充てています)
##実行!
```python:sc.py
if __name__ == '__main__':

    with Listener(
        on_press = on_press,
    ) as listener:
        listener.join()
```
リスナーを設定して実行するコードを書いて完了です!
試しに実行してみましょう!
![GIF](https://i.gyazo.com/09a39267764cbeaf757db2b6fc95c6db.gif)
(no imageって出たりそれで慌てて二回[ctrlR]を押してしまいましたが動作には問題なさそうですね!(必死))
## バックグラウンドで動かしたい!
バックグラウンドで動かしたほうが絶対いいと思うんですよね..
ということでVBSとbatを利用します!
使えるものは何でも使ってやる!!

```bash:start.bat
@ECHO OFF
python sc.py
```
sc.pyと同じディレクトリにおいてください
そして..vbsが..

```vbs:start.vbs
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Call WSHShell.Run("D:\twitter\start.bat", 0, True )
```
[Call WSHShell.Run("D:\twitter\start.bat", 0, True )]この部分はsc.pyを設置した場所を指定してください!
# 最後に
これで以上です!
途中Unicode系のエラーが出たりして慌てていましたが(慌てすぎ)
無事に作成できました!
これをスタートアップに登録すればもっと利便性は上がりそうです!

ソースコードたち
- https://harigami.net/contents?id=c120940c-8384-4903-a738-780b052c2f91 (sc.py)
- https://harigami.net/contents?id=da035764-629f-4ecf-a231-b47ff41ba46a (start.vbs)
- https://harigami.net/contents?id=9734e737-869c-4808-a4a7-85079f70864b (start.bat)

https://github.com/Lemoneko-R/Windows10-Screenshot-save
pipでパッケージを一括アップデートする(windowsも)

# はじめに
pipを使用してパッケージをアップデートする。
Linuxのコマンドはよく見るけど、Windows版はなかなか見なかったので拙いコマンドだけど記事にしました。

## Linuxコマンド
```bash
pip list -o --format freeze | sed 's/=.*//' | xargs python -m pip install -U
```

## Windowsコマンド
```powershell
pip list -o --format freeze | % { $_ -replace "=.*", "" } | % { python -m pip install -U &_ }
```
以下はコマンドの説明をして終了です

### Linuxコマンドの説明
#### sed
- 置換を行ってくれるコマンド
- `s/置換前の対象/置換後の対象/`を意味する
- 今回の場合は、`=.*`を空白に変換するということ

#### xargs
- 引数を標準入力から与えるもの
- `なんかのコマンド1 | xargs なんかのコマンド2`って感じで使う
- なんかのコマンド1から得られる値を、なんかのコマンド2の引数として使えるよって意味
- 正直良く分かってないけど、以下のような感じ

    | # | 標準入力に値する出力内容 | 実質的な動作内容 |
    | :--- | :--- | :--- |
    | コマンド | `pip list -o --format freeze (縦線＊) sed 's/=.*//'` | `xagrs python -m pip install -U` |
    | 上のコマンドを使用したときの出力例 | pip<br>setuptools | `python -m pip install -U pip`<br>`python -m pip install -U setuptools` |

    ＊縦線＝「|」(バーティカルバー）のことです。markdownのテーブル機能でバーティカルバーを使用するため、エスケープ出来ませんでした

### Windowsコマンド説明
#### %{}
- `for each`を意味する

#### $_
- パイプラインに渡されたオブジェクトを表す変数
- ざっくり捉えると、出力された内容を受け取ってるよくらいでいいよ
  - 今回だと、以下のようになってます

    ```powershell
    $_ = pip list -o --format freeze
    $_ = %{ $_ -replace "=.*", "" }
    % { python -m pip install -U &_ }
    ```

#### -replace
- 置換を行ってくれるコマンド
- `-replace 置換前の対象, 置換後の対象`を意味する

## 最後に
もっと楽にできる方法があったら教えて下さい。
Linuxコマンドも、Powershellコマンドも中途半端にしか分かってないので
上記のコマンドは動作検証をしたまでで、最適な方法ではないです、多分。。。
【R】平均値の差を比較する方法（t検定）

# t検定の基本

## t検定とは

* 2つの母集団から抽出した標本（2群）の平均値が等しいかどうかを検定する方法。
 * 前提として、2群のデータがそれぞれ正規分布に従うと仮定している。

## 独立or対応

* 独立した（対応のない）2標本のt検定
 * 「男性と女性」「赤組と白組」などのように、別々のサンプル（標本）に対するt検定のこと。
* 対応のある2標本のt検定
 * 「投薬前と投薬後」のように、同一の被験者に由来するサンプル（標本）に対するt検定のこと。

## 等分散性の仮定

* 等分散性を仮定するt検定
 * 2群の分散が等しいと仮定する場合。
 * 「スチューデント（Student）のt検定」と呼ばれる。
* 等分散性を仮定しない
 * 2群の分散が等しいと仮定しない場合。
 * 「ウェルチ（Welch）のt検定」と呼ばれる。

## t検定の使い分け

||独立した2標本|対応のある2標本|
|---|---|---|
|等分散性を仮定する|スチューデントのt検定|対応のある2標本のt検定|
|等分散性を仮定しない|ウェルチのt検定|対応のある2標本のt検定|

# 独立した（対応のない）2標本のt検定の例

## テストデータ

* 以下のデータは、ある山の東側（east）と西側（west）で測定した葉のサイズ（mm^2）です。

```leaf_size.csv
east,west
4632.4,4159.1
3481,3844.4
3267.8,3135.0
3130.9,2837.2
3108,2801.2
2575.4,2587.8
4556.9,5180.1
4343.5,3635.9
4130.3,2651.1
2824,2642.7
```

## t検定の実行

* ここでは、等分散性を仮定しない「ウェルチのt検定」を使っています。
 * 2群のデータに等分散性が認められる場合でも、ウェルチのt検定を使用して問題ないようです。
 * 等分散性を仮定する場合は、引数として"var.equal=TRUE"を指定します。
* t.test関数の引数として、2群のデータ（東側と西側のデータ）を指定しています。
 * t検定に使うデータをデータフレームとして読み込んでおくと、"データフレーム名$列名"で指定できるので、引数を誤って指定する心配が減ると思います。
* 結果を見ると、p値（p-value）が0.48となっているので、「東西斜面間で、葉のサイズに有意差は認められない」ということになります。
 * 一般的に、p値が0.05もしくは0.01未満であれば、統計学的に有意差があるとされています。

```r:Rのコンソール
> # leaf_size.csvを読み込んで、"leaf_size"という名前のデータフレームに格納する。
> leaf_size <- read.table("C:\\leaf_size.csv", header=TRUE, encoding="CP932", sep=",")
> # ウェルチのt検定の実行
> t.test(x=leaf_size$west, y=leaf_size$east)

        Welch Two Sample t-test

data:  leaf_size$west and leaf_size$east
t = -0.71856, df = 17.719, p-value = 0.4818
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1011.5081   496.3681
sample estimates:
mean of x mean of y 
  3347.45   3605.02 
```
GoogleCTF #beginners/misc-floppy

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e023046e-b22e-fbd6-0b83-d457fb3ed0dc.png)

#問題

https://capturetheflag.withgoogle.com/#beginners/misc-floppy

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d83c8f81-face-c88d-6886-fa53f88d47d5.png)

#解いてみた

添付ファイルをダウンロードしてzipファイルを解凍してみたところ、アイコンファイルでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/94872dbd-121f-e09b-f39b-664f81e84b23.png)

画像からは特に何も得られなかったのでBzで見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/821ebe62-fda9-00e4-82ea-bea28f13a1ad.png)

アイコンのファイルって最初00？
そんなファイルあるんでしょうか？
下の方を見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e5bbfbbc-0c86-0d97-fc4e-417a637f31eb.png)

PKから始まるところがあるので、ZIPファイルのようです。
近くにdriver.txtとも書かれてますし。

拡張子をzipに変えて解凍してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6767e4f6-1ed5-3eb4-7e7d-26da0bbd2942.png)

解凍できました。
とりあえずtxtファイルを開いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8194d688-5318-78d0-f3cd-6ad72be9aadd.png)

flagありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a1d34b9a-05a3-0fb5-8c85-2166d1e24331.png)
.NETの四捨五入について

```c#:端数処理
decimal value = 2.5;
double value2 = -2.5;

//切り上げ
value = Math.Ceilng(value);

//切り下げ
//Floor: -3、Truncate: -2
value = Math.Floor(value2);
value = Math.Truncate(value2);

//四捨五入
//MidpointRounding.AwayFromZeroを指定しないと結果は2となる
value = Math.Round(value, MidpointRounding.AwayFromZero);
```

通常のMath.Roundを使うと「銀行家の丸め」といって、
厳密な四捨五入ではなく、結果が偶数になるような丸め方がされます。
(〜.5を全て切り上げする計算を、何度も足し続けると
大きな値側に誤差がよるからです。)

ビジネスロジックで金額の計算時などに、
「四捨五入をする」とされている場合には
異なる演算結果が出るので注意が必要です。

また、切り下げのMath.FloorとMath.Truncateでは、
正の値では同じ結果となりますが、
負の値では、
Floorは-無限大側、Truncateは0側に寄せて丸められます。
カタパルトをテストネットモードで動かす その１ catapult-service-bootstrap起動

# はじめに

いま、カタパルトではネットワークモードが`MIJIN_TEST`で動かされているのが主流だと思います。

メインネットやテストネットも選択できるシーンがいくつかあるのですが、使ったことがありません。

なので、テストネットで立ち上げられるかやってみようと思います。

[catapult-service-bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap)を使うのがわかりやすいかと思うので、これをベースにしていきます。

# 編集

```
git clone https://github.com/tech-bureau/catapult-service-bootstrap.git
cd catapult-service-bootstrap
```

そして、以下のように変更を加えていく。

## generate-raw-addresses-if-needed

```bash:bin/bash/generate-raw-addresses-if-needed
  /catapult/bin/catapult.tools.address --generate=${num_addresses} -n public-test > ${raw_addresses_path}
```

７行目

## nemgen.sh

```bash:dockerfiles/nemgen/userconfig/nemgen.sh
if [ ! -d /data ]; then
  echo "/data directory does not exist"
  exit 1
fi
if [ ! -d /data/00000 ]; then
  echo "running nemgen"
  cd /tmp
  mkdir settings
  mkdir -p seed/public-test/00000
  dd if=/dev/zero of=seed/public-test/00000/hashes.dat bs=1 count=64
  cd settings
  /catapult/bin/catapult.tools.nemgen --nemesisProperties /nemesis/block-properties-file.properties --resources /userconfig/
  cp -r /tmp/seed/public-test/* /data*
else
  echo "no need to run nemgen"
fi
```

`mijin-test`を`public-test`に変える。

## block-properties-file.properties.mt

```:ruby/catapult-templates/nemesis/block-properties-file.properties.mt
binDirectory = ../seed/public-test
```

９行目

## rest.json.mt

```:ruby/catapult-templates/rest_gateway/rest.json.mt
    "name": "publicTest",
```

３行目

これはたぶんやらなくてもよい。

## global.rb

```ruby:ruby/lib/catapult/global.rb
    CATAPULT_NETWORK_IDENTIFIER = 'public-test'
```

１６行目

# 起動

`docker-compose up -d`

ブロックエクスプローラーで、ネメシスブロックを見てみます。アドレスが「ｔ」から始まっているのがわかります。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/b72bd881-15a9-9e33-355d-db7308c87b25.png)

着実にブロックが増えていくのですが、まだトランザクションを送る手段がありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/38380d7e-01f8-d9d7-f3f0-64cd2f9df235.png)

# おわりに

とりあえず、テストネットモードで起動できたと思います。

テストネットモードで起動しただけで、テストネットを起動したわけではありません。

次回は、トランザクションを送ってみたいと思います。
2015年度東大理系数学第5問

こちらの記事より：
> [2015年度東大理系数学第5問をpythonでどうしても解きたい](https://qiita.com/ting/items/a1eba581c5a8628bb736)

#問題：
-------

```math
mを2015以下の正の整数とする。{}_{2015}C_mが偶数となる最小のmを求めよ。
```
--------

[Google colaboratory 上での解答例](https://colab.research.google.com/github/zaq9/memo/blob/master/qiita/todai2015Q5.ipynb)

#INPUT:
```python

from scipy.special import comb as c
next(m for m in range(1,2016) if c(2015,m,True)%2==0 )

```
#OUTPUT:
```
32
```



#参考:
[scipy.special.comb]（https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.special.comb.html）

```python
def comb(N, k, exact=False, repetition=False):
    """
    The number of combinations of N things taken k at a time.
    This is often expressed as "N choose k".
    Parameters
    ----------
    N : int, ndarray
        Number of things.
    k : int, ndarray
        Number of elements taken.
    exact : bool, optional
        If `exact` is False, then floating point precision is used, otherwise
        exact long integer is computed.
    repetition : bool, optional
        If `repetition` is True, then the number of combinations with
        repetition is computed.
    Returns
    -------
    val : int, ndarray
        The total number of combinations.
    Notes
    -----
    - Array arguments accepted only for exact=False case.
    - If k > N, N < 0, or k < 0, then a 0 is returned.
    Examples
    --------
    >>> k = np.array([3, 4])
    >>> n = np.array([10, 10])
    >>> sc.comb(n, k, exact=False)
    array([ 120.,  210.])
    >>> sc.comb(10, 3, exact=True)
    120L
    >>> sc.comb(10, 3, exact=True, repetition=True)
    220L
    """


```



#コメント:
Colaboratory、基本的なライブラリ入っていて便利。
試験時間中、スマホ監視の目、厳しくなりそうだなぁ…
（答えわかっても証明が合否決め手だろうけど）
You are trying to replace or create a prefab from the instance 'hoge' that references a missing script. This is not allowed. Please change the script or remove it from the game object.のエラーが出た

Unityのバージョンを上げたらこのようなエラーメッセージが発生してPrefabの更新ができなくなった。

```
You are trying to replace or create a prefab from the instance 'hoge' that references a missing script. This is not allowed. Please change the script or remove it from the game object.
```

や

```
The referenced script on this Behaviour is missing!
```
こういったエラーもあるそうです。

これはどうやらScriptが参照エラーになったオブジェクトのPrefab更新等がUnityのバージョンアップで、できなくなったっぽいです。

#対処方法

###http://wiki.unity3d.com/index.php?title=FindMissingScripts

ここのFindMissingScriptsをEditorにぶち込んで
Prefabの全オブジェクトを選択した上で、Window>FindMissingScriptsを選択してやるといいです。
Consoleに参照エラーが起きてるオブジェクトが表示されるので、そいつのコンポーネントを削除してやるといいです。
Cheking Prime number - Java string program examples

The number which is only divisible by itself and 1 is known as prime number, for example 7 is a prime number because it is only divisible by itself and 1.
This program takes the number (entered by user) and then checks whether the input number is prime or not. The program then displays the result.
 
Here is an example program

```
import java.util.Scanner;
class PrimeCheck
{
   public static void main(String args[])
   {		
	int temp;
	boolean isPrime=true;
	Scanner scan= new Scanner(System.in);
	System.out.println("Enter any number:");
	//capture the input in an integer
	int num=scan.nextInt();
        scan.close();
	for(int i=2;i<=num/2;i++)
	{
           temp=num%i;
	   if(temp==0)
	   {
	      isPrime=false;
	      break;
	   }
	}
	//If isPrime is true then the number is prime else not
	if(isPrime)
	   System.out.println(num + " is a Prime Number");
	else
	   System.out.println(num + " is not a Prime Number");
   }
}
```

**Output:**

```
Enter any number:
19
19 is a Prime Number
```

**Source:**

[Java string examples programs](http://candidjava.com/tutorial/java-string-programs-with-output/)
XLSX を PDF に変換　(pandas,FPDF)

XLSX を pandas のデータに変換して、それを PDF に変換します。
>PDFの作成には、PHP のポートの　FPDF を使います。
>XLSX のデータにかなり依存する変換方法です。

```py:fpdf01.py
#! /usr/bin/python
#
#	fpdf01.py
#
#						Feb/01/2019
# ------------------------------------------------------------------
import sys
import pandas as pd
from fpdf import FPDF

# ------------------------------------------------------------------
# [2]:
def show_header_proc(pdf,array_a):
	pdf.cell(50, 10, array_a[0], 1, 0, 'C')
	pdf.cell(30, 10, array_a[1], 1, 0, 'C')
	pdf.cell(30, 10, array_a[2], 1, 0, 'C')
	pdf.cell(30, 10, array_a[3], 1, 0, 'C')
	pdf.cell(30, 10, array_a[4], 1, 2, 'C')
	pdf.cell(-140)
# ------------------------------------------------------------------
# [4]:
def show_contents_proc(pdf,df_2):
#
	for it in range(0, len(df_2)-1):
		col_ind = str(it)
		col_a = str(df_2.A.iloc[it])
		col_b = str(df_2.B.iloc[it])
		col_c = str(df_2.C.iloc[it])
		col_d = str(df_2.D.iloc[it])
		pdf.cell(50, 10, '%s' % (col_ind), 1, 0, 'C')
		pdf.cell(30, 10, '%s' % (col_a), 1, 0, 'C')
		pdf.cell(30, 10, '%s' % (col_b), 1, 0, 'C')
		pdf.cell(30, 10, '%s' % (col_c), 1, 0, 'C')
		pdf.cell(30, 10, '%s' % (col_d), 1, 2, 'C')
		pdf.cell(-140)
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_xlsx = sys.argv[1]
df_2 = pd.read_excel(file_xlsx)
#
pdf = FPDF()
pdf.add_page()
pdf.add_font('TakaoMincho','','/usr/share/fonts/OTF/TakaoMincho.ttf',uni=True)
pdf.set_font('TakaoMincho', '',14)
#
pdf.set_xy(0, 0)
pdf.cell(60)
pdf.cell(70, 10, 'Writing a PDF from python', 0, 2, 'C')
pdf.cell(-40)
#
array_a = ['Index Column','Col A','Col B','Col C','Col D']
show_header_proc(pdf,array_a)
#
array_a = ['No','キー','都市名','人口','改訂日']
show_header_proc(pdf,array_a)
#
show_contents_proc(pdf,df_2)
#
pdf.output('out01.pdf', 'F')
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./fpdf01.py cities.xlsx
```

入力データ
>cities.xlsx
![xlsx_feb0101.png](https://qiita-image-store.s3.amazonaws.com/0/179446/724cdfd0-3143-36b5-bd0a-48b9aee03c8c.png)


出力データ
>out01.pdf
![xlsx_feb0102.png](https://qiita-image-store.s3.amazonaws.com/0/179446/8e5d1981-564b-d3c9-05c7-96eac19ed60c.png)

次の環境で動作を確認しました。

```text
$ uname -a
Linux iwata 4.20.6-arch1-1-ARCH #1 SMP PREEMPT Thu Jan 31 08:22:01 UTC 2019 x86_64 GNU/Linux
$ python --version
Python 3.7.2
```
Scrapy をWindowsにインストールする

Webスクレイピング、クローリングに便利なScrapyですが、Windows環境にScrapyをインストールする場合に、pipでそのままいかないケースがあります。

#Twistedはコンパイルを要する
依存パッケージの一つのTwistedがコンパイルを要するため、コンパイラ（VC++等）が入ってないとインストールできません。

```
$ pip install scrapy
Collecting scrapy
  Using cached https://files.pythonhosted.org/packages/3e/45/414e87ac8209d537c91575538c5307c20217a6943f555e0ee39f6db4bb0f/Scrapy-1.6.0-py2.py3-none-any.whl
（中略）
    running build_ext
    building 'twisted.test.raiser' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
    ----------------------------------------
Command "c:\users\user\appdata\local\programs\python\python37\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\user\\AppData\\Local\\Temp\\pip-install-7h245q4c\\Twisted\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\user\AppData\Local\Temp\pip-record-nq742j85\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\user\AppData\Local\Temp\pip-install-7h245q4c\Twisted\
```

解決方法は

* Visual C++をインストールする
* コンパイル済みパッケージをインストールする

## Visual C++をインストールする
Visual Studioのダウンロードサイトに行き
https://visualstudio.microsoft.com/ja/downloads/

Tools for Visual Studio の中にある Build Tools for Visual Studio 2017 をインストールしてください。
ただし、ディスク容量をそこそこ使用します・・・

## コンパイル済みパッケージをインストールする
手っ取り早く済ませたい場合には、コンパイル済みパッケージを利用するという方法があります。
※オフィシャルではないので、自己責任でお願いいたします。

https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
から自身の環境にあったパッケージをダウンロード
例）Python 3.7 Windows(64bit)環境の場合は
　　Twisted‑18.9.0‑cp37‑cp37m‑win_amd64.whl

ダウンロードが終わったらファイル名を指定してpipでTwistedをインストール

```
$ pip install Twisted‑18.9.0‑cp37‑cp37m‑win_amd64.whl
(中略)
Installing collected packages: Twisted
Successfully installed Twisted-18.9.0
```

これでscrapyのインストール準備はOKです。

```
$ pip install scrapy
(中略)
Installing collected packages: scrapy
Successfully installed scrapy-1.6.0

```

#最後に
今回のTwisted以外にもライセンスの関係でバイナリパッケージの配布が制限されているケースがあります。本来はコンパイル済みパッケージを使用するのが筋ですが、難しいケースなどはコンパイル済みパッケージをそういう前提を理解した上で利用する方法があることを頭に入れておくとちょっと便利ですよ。


参考サイト https://github.com/scrapy/scrapy/issues/2881
ポップアップしたときにChromeの開発者ツールを自動で開く

## やりたいこと
認証時などにポップアップが開いたとき、開発者ツールを自動で開きたい

## 方法
### 開発者ツールを開く
chromeを開いて、macなら `option + command + I`とかで。
![スクリーンショット 2019-02-01 21.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/32691/51e42e1b-86f6-6d49-96bb-6493d3953423.png)

### 開発者ツールのSettingsを開く
![スクリーンショット 2019-02-01 21.21.15.png](https://qiita-image-store.s3.amazonaws.com/0/32691/e6018f1a-66c7-ce2a-f714-93ed094821c4.png)

### Preferences > DevTools > Auto-open DevTools for popups にチェックをいれる
一番下にスクロールするとある。
![スクリーンショット 2019-02-01 21.21.51.png](https://qiita-image-store.s3.amazonaws.com/0/32691/7744d7dd-69df-5fe4-6b94-eb8b2493b0b2.png)

以上
Pythonでデバイスをリアルタイムに読み書きをする方法？

stackoverflowでも書いたのですが以下のことで悩んでます。


ラズパイマウスで`/dev/`以下のデバイスに対してechoやcatで読み書きをすることがあるかと思います。

```
echo 100 > /dev/rtmotor_raw_l0   # output 100hz frequency
```

```
cat /dev/rtswitch0 # read switch state
```

## Pythonで出力をする
一応解決したのですが後学のために古いVerも残しておきます。

## Bad case: file.write を用いる
echoで書いていた内容をPythonのwriteで代替できると思って以下のプログラムを書きました。
コード全体で見れば先程のecho文と同様の出力を投げます。

```python3
file = open('/dev/rtmotor_raw_l0','w')
file.write('100\n')            # I want output in this timing
file.close()                   # output reflected after closing file
```

問題は実行されるタイミングで，本来はwrite()したタイミングで反映されてほしいんですが，このプログラムの場合close()のタイミングで反映されてしまいます。困った。

追記にすればいいのかなと思い`'w'`を`'a'`などに変えても変わりませんでした。

## Better case：os.write を用いる

osモジュールを用いることで毎回openが必要となる問題は解決できました。
os.writeの際にファイルのディスクリプタを毎回渡すのでechoと同様の挙動が再現できているということなのでしょうか

[file.writeとos.writeの違いについて](http://d.hatena.ne.jp/tyonekura/20130727/1374892405)述べている人も居ますね。



```python
import os
flm = os.open("/dev/rtmotor_raw_l0",os.O_RDWR)
os.write(flm,"100\n")
```

# Pythonで読み込みをする


## Bad case: file.readで読み込みをする

同様の問題が読み込みにもあります。

以下のようにして読むことが出来ますが，これはfileをopenした時点での情報しか掴めないのです。

```python3
file = open('/dev/rtswitch','r')
file.read()  # works
file.read()  # after first read it does't work anymore
file.close() # need to reopen the file to get newer value
```

したがって２回めのreadは空の値を示します。

**一旦閉じて開き直さない限り，出力も入力も更新できない**というのが今の悩みです。

Streamがどうのこうのとか昔聞いたような気もするのですが，これって解決策があるんでしたっけ？

## Better case: os.read()


https://qiita.com/shotaro_tsuji/items/06fa0306651e1640ab6b

Currently I have a trouble with `lseek`.

```
>>> os.lseek(fd,0,os.SEEK_SET)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 29] Illegal seek
```

# Codes

第1引数に 周波数，第2引数に持続時間を入れて走らせる自動化コード例です。
これは完全にただのメモっす。

## .sh

```
#!/bin/sh

echo 1 > /dev/rtmotoren0 #enable

# $1 : f [hz] 
# $2 : t [ms] 

echo $1 > /dev/rtmotor_raw_l0 
echo $1 > /dev/rtmotor_raw_r0 

sleep $2

echo 0 > /dev/rtmotor_raw_l0 
echo 0 > /dev/rtmotor_raw_r0 

echo 0 > /dev/rtmotoren0 #disable
```

## .py

```python
import subprocess
import os
import sys
import time


if __name__=='__main__':
    
    arg=sys.argv
    res = subprocess.call(["echo 1 > /dev/rtmotoren0"],shell=True)

    flm = os.open("/dev/rtmotor_raw_l0",os.O_RDWR)
    frm = os.open("/dev/rtmotor_raw_r0",os.O_RDWR)

    os.write(flm,arg[1])
    os.write(frm,arg[1])

    time.sleep(float(arg[2])/1000.0)


    os.write(flm,"0\n")
    os.write(frm,"0\n")
    
    os.close(flm)
    os.close(frm)
    res = subprocess.call(["echo 0 > /dev/rtmotoren0"],shell=True)
```
Bootstrap4のカラーバリエーションを増やしたい

Twitter Bootstrap 4 には、デフォルトで以下のカラーバリエーションがあります。でも、もっとバリエーション欲しくないですか？

![Bootstrapカラーバリエーション](https://qiita-image-store.s3.amazonaws.com/0/19470/6b173c24-5b78-130d-e2fb-081a7eb1740e.png)

SASS(SCSS) を使えば簡単に増やすことができます。

Laravel Mix上での方法になります。

`/resources/sass/_variables.scss` に `$theme-colors` を設定します。

追加する色は、Bootstrapの`_variables.scss`に デフォルトで設定されているものです。ただし、 デフォルトの`$theme-colors`の中には入っていないのでカラーバリエーションとしては使えません。

それを使えるようにしてみましょう。

```_variables.scss
$indigo:  #6610f2;
$purple:  #6f42c1;
$pink:    #e83e8c;
$orange:  #fd7e14;
$teal:    #20c997;

$theme-colors: (
    "indigo":     $indigo,
    "purple":     $purple,
    "pink":       $pink,
    "orange":     $orange,
    "teal":       $teal
);
```

これで、コンパイルを実行して CSSファイルを作成します。

```
$ npm run dev
```
正常にコンパイルが終了したら、設定した色が使えるようになっています。

![Bootstrapカラーバリエーション追加](https://qiita-image-store.s3.amazonaws.com/0/19470/c00bc490-02dd-b6c1-eb84-b934b90b9d0e.png)

色を増やすことができましたが、「orange」だけ文字の色が黒になってます。これも気になります。白にしたいです。

`/resources/sass/_variables.scss` に `$yiq-contrasted-threshold` を設定します。 

これは、Bootstrap内で背景色から前面のテキストカラーを黒系にするか白系にするかを決める境界値です。数値を大きくすると白系が選ばれるようになります。デフォルトは150で、0-255までの値をセットできます。

```_variables.scss
$yiq-contrasted-threshold: 160;
```
160をセットしてコンパイル。

![Bootstrapカラーバリエーション追加](https://qiita-image-store.s3.amazonaws.com/0/19470/74746654-59e1-ef63-62b7-4b71f83ff4a6.png)

文字が白になりました！

「warning」も文字を白にしたい場合は、200をセットするとOKです。

![warning](https://qiita-image-store.s3.amazonaws.com/0/19470/86d2d9a3-8ebb-e20d-2c1e-d9fb27becb34.png)

```_variables.scss
$yiq-contrasted-threshold: 200;
```

![Worning白](https://qiita-image-store.s3.amazonaws.com/0/19470/4a8943d8-5647-e278-1127-5c6d7edbea15.png)

これはちょっと白では見にくいかな。。。
【Laravel5.7】WindowsとLinux両方で非同期処理したい

個人開発環境はWindows10上でXAMPP、デプロイはAzure WebAppのLinuxってかんじでやってるのですが、この環境で何が問題って[キュー](https://readouble.com/laravel/5.7/ja/queues.html)が動かないわけですよ。

どちらの環境でも、色々とがんばればどうにかできるのはわかってます。
でも、がんばりたくないからXAMPPなりAzureなりを使ってるわけで、キューもできるだけがんばらずにどうにかしたいところです。

# コマンドコール

まずは単にArtisanコマンドを呼んでみましょう。

```php
    Artisan::call('foo:bar');
```

一行で終わってしまった。
これはコマンドラインからの`php artisan foo:bar`と同じで、[登録したコマンド](https://readouble.com/laravel/5.7/ja/artisan.html#writing-commands)を実行するだけです。
完全に同期で、出力も全て入ってきます。

たぶん実際にはコマンド実行せず、内部的に直接呼んでるだけだと思います。
実装見てないからわかりませんが。


# キューを同期実行

`call`を`queue`に変えるとキュー経由の実行になります。

```php
    Artisan::queue('foo:bar');
```

キューがどのような手段で実行されるかは`config/queue.php`に定義されています。
デフォルトでは`sync`になっていて、これは`Artisan::call`と同じく同期実行です。


# 非同期実行

`.env`設定ファイルの`QUEUE_CONNECTION`を`database`や`redis`に変更すると、`Artisan::queue`が非同期で実行されるようになります。
これはどういう仕組みかというと、

・コマンドを実行しても、その時点では処理が行われず、単にデータベースに登録される。
・実はバックグラウンドでずっとキューワーカーというプロセスが走り続けている
・キューワーカーはDBの登録を見つけたら該当の処理を行う。

となっています。

問題はこのキューワーカーです。
`php artisan queue:work`とコマンド一個打つだけでキューワーカーは起動するのですが、実はこれただのPHPプロセスです。
Windowsだとウィンドウを閉じたら死ぬし、そうでなくとも何かの拍子に死んだらそれっきりです。
キューワーカーが動き続けることを保証するには、[プロセスモニタで監視する](https://readouble.com/laravel/5.7/ja/queues.html#supervisor-configuration)なり[定期的に実行する](https://chinotsubo.com/laravel-queue-on-shared-hosting/)なり面倒な手続きが必要です。

さて、そもそも何故Laravelでキューを使いたいのかというと、Webリクエスト時に遅い処理をバックグラウンドに回したいという理由が大半でしょう。
大半というか実際ははほぼ全てでしょう。
つまり、別にキューワーカーなど大がかりな仕組みを使わずともいいのでは？

というわけでこんなのができました。

```php
	// 非同期実行する
	if (strpos(PHP_OS, 'WIN') !== false) {
	    // Windows
	    $command = 'start /B php "' . base_path('artisan') . '" foo:bar';
	    $fp = popen($command, 'r');
	    pclose($fp);
	} else {
	    // Linux
	    $command = 'php "' . base_path('artisan') . '" foo:bar > /dev/null &';
	    exec($command);
	}
```

非同期実行したい処理はartisanコマンドで実装しておいて、呼び出し側はコマンドラインで呼ぶだけです。
コマンドはLinuxとWindowsで異なるので分岐が必要です。
わりと簡単に非同期処理が実装できました。

これをコントローラに直接書くのはどうなんだって感じですが、ではどこに持っていくのが正解なんだろう？


# 定期実行

上記は、Webサーバへのリクエストを契機にバックグラウンド処理を起動させるというものでした。
毎日定時に行うバッチ処理のようなものは、これではうまくいきません。

オンプレならcrontabに`php artisan foo:bar`とか入れとけばいいですが、Windowsではcronがないので[めんどい](https://qiita.com/nomurasan/items/dba72d1ec1d194b74a33)、Azure WebAppはプログラムをzipでアップロードしたりしないといけなくて[めんどい](https://qiita.com/garicchi/items/8356a1ca7d5e09c482d0#web-job%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)です。
どうにかならないでしょうか。

・まず定期実行したい処理を書いたコマンドを作る。
・次にそのコマンドを非同期で呼び出すコントローラを作る。
・最後に[Azure Functions](https://qiita.com/maaya8585/items/4b7761c96baa1caf5777)から該当のコントローラを[定期的](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-scheduled-function)にfile_get_contentsする。

かんせー。
定期的に実行させる必要があるのであれば定期的に呼び出せばいいのだ。


# まとめ

これLaravel関係なくね？
Shinyの日本語、中国語表記について

#R Shinyで文字化け？！フォント醜い？(windows のみの話)
我々はShinyで統計のpackageを作っています。多少でも日本人、中国人にやさしいものをできたらと思い、
**多言語対応**のものを。。。

そこで、Centos ServerでShiny serverを立ち上げる同時に、standaloneの配布packageも考えています。
チームのメンバーはmacでコーディングしています。
「日本語、中国語は**文字化け**ています、**Windowsのみ**」と言われました。
Microsoftと仲良くならないわと言わんばかりでした。

さすが、ユーザに配布するものは、ユーザの環境を考慮しなければ、
windowsユーザなら、英語版のみでと通用しないと思いましたので、対応方法をgoogleしまくりました。

--------

対症法しかなっていないが、共有します。

先ず、Macで書いたコードをUTF-8で保存する。
Windows RStudioで、

```
File>Reopen with encoding>Chose Encoding(UTF-8)
File>Sace with encoding>Chose Encoding(UTF-8)
で保存しなおす。
```

これで、PCの言語に対応する言葉が文字化けしなくなります。
つまり、日本語のPCなら日本語のコードがOK, 中国語のPCなら中国語のコードがOKになります。

ソースページがあるとき、

```
source("hogehoge.R", encoding ="UTF-8")
```
を忘れないでね。

だが、私みたい、日本語のPCで中国語のコードを文字化けせずに動かしたい人がいるでしょう？
Mac派のチームメンバーは、もういい違う？PCの言語環境を変更したら。。。といわれましたが、
やはりやってみたいです。
GOOGLE, BAIDU, GOOGLE, GOOGLE, BAIDUでした。

そこで、見つかった対症療法は

```
> Sys.setlocale(locale="Chinese")
```
でした。
これで一時的に中国語環境で使え、同じくUTF-8で保存するコードが読めるようになります。
中国語の環境で日本語のコードに関しては、"Chinese"→"Japanese"で行けると思いますが、
テストしていません。

-----

そこで別問題が発生した。文字が化けなくなりますが、
日本語、中国語の**フォントは異常に醜い**です。
Mac, Linuxでは問題がないはずですが、やはり、Microsoftさんと友達にならない。。。
何とかしたいで、また、GOOGLE, GOOGLE。
結局、見つかった答えは、cssでフォント指定してあげたらよいとのことです。

ui.Rに

```
theme = "hogehoge_jp.css"
```
を追加、
ui.R, server.Rを保存するフォルダーにwwwフォルダーを作成し、そこに、以下のようなhogehoge_jp.cssを放り込んだらよいです。
面倒なので、ここでは、googleフォント優先で、一括フォント指定しております。指摘しないでください。

```
/*!
Japanese style sheet
*/

@import url("https://fonts.googleapis.com/css?family=Noto+Sans+JP|Noto+Sans+SC");
* {
	font-family: "Noto Sans JP", "Noto Sans SC", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", "MS PGothic", sans-serif;	
}
```
ちなみにhogehoge_cn.cssは下記のようにしました。
中国とgoogle仲良くないため、中国ではgoogle fontは使えるかどうか不明なので、
どの中国語PCにも入っているSimSunを優先にしました。

```
/*!
Chinese style sheet
*/

* {
font-family: 'SimSun', "Microsoft YaHei", "微软雅黑", sans-serif;
}
```
おまけ、
-----------
google fontを使うとき、サーバーにフォントを保存したほうが、サイトのロードが早くなるみたいです。
[サイトの高速化、軽量化をするために行った事](https://www.evoworx.co.jp/blog/pagespeed/)に参照してください。
とりあえず、うちらのサイトは現状、くそ遅いですが、その辺また後で改良しようとします。
同じフォルダーを複数フォルダーの中へCOPY

# 同じフォルダーを複数フォルダーの中へCOPYする方法
（自分のためのメモ）


コピーコマンドをよく使われます。

```
cp original_file target_file
```
学生に**フォルダーごと**を**複数のフォルダー**にコピーする方法はないかと聞かれました。
例えば、folderA をhogehoge_jpのすべてのフォルダーにcopyしたいです。

```
cp -Rf folderA/ hogehoge1_jp/.
```

なら、前者であるフォルダーごとのコピーができます。
そこに、”＊”使うと何とかなる違うと思いましたが、
つまり、これ、

```
cp -Rf folderA *_jp/.
```
を使うと、何となくできないかと思ったけど、できませんでした。
そこで、

```
find . -name "*_jp" -type d -exec cp -Rf folderA/ {} \;
```

で行けました。
Firebase Authenticationにて、アクションURLにリンク先で使いたいURLをもたせる

## やりたいこと
メール確認時などで送られるメールに「アクションURL」が貼られているが、これのパラメータとしてURLをもたせたい。このURLに、確認後のリンク先から遷移させたい。

## まとめ
`firebase.auth().sendEmailVerification()`の引数に`actionCodeSettings`を渡す。
このときの`url`の値だけ使う。ただし、この`url`は、Firebase Authentication側でホワイトリストに入ってなければならない。

## 手順
Eメール確認用のメールは、`firebase.auth().sendEmailVerification()`でとばせる。
以下のコードはガイド参照。

```javascript
firebase.auth().currentUser.sendEmailVerification()
  .then(function() {
    // Verification email sent.
  })
  .catch(function(error) {
    // Error occurred. Inspect error.code.
  });
```

このときに引数で`actionCodeSettings`を渡すことができる。
詳細はガイドにも書いてある。
https://firebase.google.com/docs/auth/web/passing-state-in-email-actions?hl=ja

```javascript

var actionCodeSettings = {
  url: 'https://www.example.com/?email=' + firebase.auth().currentUser.email,
  iOS: {
    bundleId: 'com.example.ios'
  },
  android: {
    packageName: 'com.example.android',
    installApp: true,
    minimumVersion: '12'
  },
  handleCodeInApp: true,
  // When multiple custom dynamic link domains are defined, specify which
  // one to use.
  dynamicLinkDomain: "example.page.link"
};
firebase.auth().currentUser.sendEmailVerification(actionCodeSettings)
  .then(function() {
    // Verification email sent.
  })
  .catch(function(error) {
    // Error occurred. Inspect error.code.
  });
```

`actionCodeSettings`の`url`に、あとで使いたいURLをもたせる。

```javascript

var actionCodeSettings = {
  url: 'https://redirect.com/',
};
firebase.auth().currentUser.sendEmailVerification(actionCodeSettings)
  .then(function() {
    // Verification email sent.
  })
  .catch(function(error) {
    // Error occurred. Inspect error.code.
  });
```

実際に動作させて来るメールをみると、

![スクリーンショット 2019-02-01 20.58.17.png](https://qiita-image-store.s3.amazonaws.com/0/32691/12a8e0bb-0348-8775-540b-a04ac90ffa6f.png)

`continueUrl`が設定されていることがわかる。

この値を使えば、アクションURLのリンク先でも使いたい`URL`が取り回せる。

注意点としては、`actionCodeSettings`の`url`の値は、Firebase Authentication側で、ホワイトリストに入っているホストでなければならない。
target="_blank"には気をつけよう

# 経緯
aタグにtarget="_blank"をつけると危険だよと言われたので、忘れないうちにメモメモ。

# 危険な理由

## 「リンクを開いた先のページでのJavaScriptによって、開いた元のページを操作できてしまう」
大抵のブラウザでは、 target=blank_によって"別タブで開かれたページ"が手前に表示され、 "元のページ"は裏に残る。
"別タブで開かれたページ"にて、

```
window.opener.location="./hogehoge.html"
```

が実行されると、裏で"元のページ"が画面遷移される。
オリジンが違ったとしても、リンクをたどってきたユーザを任意のサイトに誘導することが可能。

※ ```window.opener```は、"別タブで開かれたページ"を開いた"元のページ"への参照を返すらしい。。。
[window.opener](https://developer.mozilla.org/ja/docs/Web/API/window.opener)


## フィッシング詐欺攻撃の例
[リンクのへの rel=noopener 付与による Tabnabbing 対策](https://blog.jxck.io/entries/2016-06-12/noopener.html)

## ESLint(eslint-plugin-react)でもエラーになるみたい
[reactでaタグの中にtarget='_blank'を書いたらESLintに怒られた話](https://qiita.com/togana/items/e739e1ec943862a71757)


# 対策

## 「```target="_blank"```に対して```rel="noopener noreferrer"```を付与」

### ```noopener```とは

"元のページ"の```target="_blank"```に対して```rel="noopener"```と付与することで、
"別タブで開かれたページ"にて、```window.opener```で参照できなくなり、"元のページ"のlocationの変更などを抑止することが可能である。
これにより、"別タブで開かれたページ"では、以下のようなJavaScriptのエラーが表示される。

```
Uncaught TypeError: Cannot set property 'location' of null
```

現在、未対応のブラウザもある
https://caniuse.com/#feat=rel-noopener


### ```noreferrer```とは

現在、```noopener```未対応のブラウザもあるので、
その代替として ```noreferrer```を指定することで同じ挙動が実現できる。
https://caniuse.com/#feat=rel-noreferrer

## Babelで自動付与
毎回記述するのも面倒だし忘れそうなので、自動付与するのもあり。

[BabelPluginによりリンクへrel=noopenerを自動的に付与する](https://qiita.com/akameco/items/d13d5e24b096b77ad152)



# Google Analyticsへの影響
現状では、クロスドメイン対応していても問題なし。_gaパラメータも問題なく付与されている。

# 参考
[リンクを作る時の target="_blank" の危険性](http://yoru9zine.hatenablog.com/entry/2017/03/17/230729)

かなり参考になりました。
【SpringBoot】ファイルとその他データを同時にPostする【Axios】

# やること
画像などのファイルとJSONにしたデータなどを`axios`を使って同時にPOSTし、Spring側ではオブジェクトへのマッピングとバリデーションをやります。
同じようなやり方で、Spring側でパースできるデータなら何でも同時に送ることができるはずです。

# 実行する
## Java側
エンドポイントは以下の通りです。
`@RequestPart`を使うのがキモです。
整数値とファイルとJSONのオブジェクトを受け取り、それぞれに関して出力を行います。

```java:エンドポイント
@PostMapping("/api/sample")
public void sample(
        @RequestParam("intValue") Integer intValue,
        @RequestPart("file") MultipartFile multipartFile,
        @RequestPart("jsonValue") @Valid SampleObject sampleObject,
        BindingResult bindingResult
) {
    if(bindingResult.hasErrors()) {
        //エラー処理
        System.out.println(bindingResult.getAllErrors());
    }

    System.out.println(intValue);
    System.out.println(multipartFile.getOriginalFilename());
    System.out.println(sampleObject.getName());
}
```
受け取るオブジェクトは以下の通りです。

```java:オブジェクト
@Getter @Setter
public class SampleObject {
    @NotBlank
    private String name;
    @NotNull
    private String description;
}
```

## JS側
POSTするコードは以下の通りです[^indent]。
`new Blob`で`type : 'application/json'`を指定することがキモです。
送る内容についてはコメントを参照してください。

```javascript:POST
postSample (file) { //ファイルは引数で渡してもらう
  const sampleObject = { //JSONにするオブジェクト
    name: 'name',
    description: null //descriptionをnullにすることでバリデーションに引っ掛ける
  }

  const formData = new FormData()
  formData.append('file', file)
  formData.append('jsonValue', new Blob([JSON.stringify(sampleObject)], {type : 'application/json'}))
  formData.append('intValue', '1') //intValueは1を指定

  axios.post('/api/sample', formData)
}
```

## 実行結果
送信したのは1.pngというファイルです。エラー含めちゃんと処理できていることが分かります。

```bash
[Field error in object 'jsonValue' on field 'description': rejected value [null]; codes [NotNull.jsonValue.description,NotNull.description,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [jsonValue.description,description]; arguments []; default message [description]]; default message [must not be null]]
1
1.png
name
```

# 失敗するコード
`type : 'application/json`を指定しなければ`org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported requestpart`と怒られてしまいます。
`application/octet-stream`というのは送信方法が指定されていないという意味で、ここにJSONを指定してやることでちゃんと動くようになります。

[^indent]: 2スペースインデントセミコロンレススタイルです。
anyenvからndenvが消えた

anyenvのデフォルトnodeバージョン管理がnodenvになりました。2018年までの記事ではndenvやnenvをinstallしている例も見られますが、現在は使えません。したがって、

```sh:anyenv.sh
anyenv install -l
```

で出てくる*env一覧にnenvやndenvは登場しません。
解決法は二つあります。

- nodenvにする
- カスタマイズしてnodenv以外を使う

オススメは前者です。なぜなら、ndenvは2018年をもってdeprecatedになり、nenvも長い間アップデートがないためです。

後者を選び、別のnodeバージョン管理(ndenvとかnとかnodeenvとか）を入れたい人は、
https://github.com/anyenv/anyenv-install
を見て、自前でカスタマイズを行うことが可能です。
Google Colab で Rubyを動かしてみた


## Google Colaboratory とは
[Google Colaboratory](https://colab.research.google.com) はクラウドで実行できる無料のJupyter環境です。ColaboratoryはPython2, Python3に対応していますが、カスタムでインストールすることでRubyも動かすことができたので紹介します。


## Rubyを動かす準備
まず、Python2 または Python3 で下記をコピー&ペーストして、RubyやIRubyをインストールします。

```jupyter
!apt-get install ruby-dev
!sudo apt install libtool libffi-dev ruby ruby-dev make
!sudo apt install libzmq3-dev libczmq-dev
!gem install ffi-rzmq
!gem install specific_install
!gem specific_install https://github.com/SciRuby/iruby
!iruby register
!jupyter kernelspec install ~/.ipython/kernels/ruby
```

必要に応じて、使いたいGemをインストールすることができます

```jupyter
!gem install awesome_print
!gem install pry
!gem specific_install https://github.com/SciRuby/daru
!gem specific_install https://github.com/SciRuby/daru-view
!gem install numo-narray
!gem install rumale
```

インストールが終了するまで待ちます。

## Ruby用のノートブックをアップロードする
`ファイル`から`ノートブックをアップロード...`を選択して、下記の[ipynbファイル](https://gist.githubusercontent.com/kojix2/044593c675b56a26c266ade47f1ffca3/raw/3b28855e4d95797b5dd6a553a061f7196d4c3aea/ruby.ipynb)をアップロードします。kernelspecで、Rubyを使うように設定してあります。[^1]

```json:Ruby.ipynb
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "ruby.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "ruby",
      "display_name": "ruby 2.5.1"
    }
  },
  "cells": [
    {
      "metadata": {
        "id": "BpxZ_k6Qv84W",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "puts \"hello world\""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}
```

これで、Rubyが動作する環境が構築できました。

## 実際に動かしてみた

Daru::Viewを利用してグラフを描いてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144608/95f547f8-b7e5-4ade-99be-6f05354b2183.png)

```ruby
require 'daru'
require 'daru/view'
require 'open-uri'

url = "https://vincentarelbundock.github.io/Rdatasets/csv/fpp2/arrivals.csv"

df = Daru::DataFrame.from_csv url
Daru::View.plotting_library = :googlecharts

Daru::View::Plot.new(df,
  type: :area,
  title: "International Arrivals to Australia",
  hAxis: {title: "1981Q1 - 2012Q3"},
  vAxis: {title: "千人"},
  height: 450,
  isStacked: true
).show_in_iruby
```

このようにして、一応Rubyが動くようになりますが、シンタックスハイライトや、インデントなどまだまだ不十分なところもあります。公式でRubyに対応してくれるともっと便利になりそうですね。
この記事は以上です。

## いつもRubyを動かすには
今のところ、私はGoogle ColabをRubyで使うために次のようにしています。rubyinit.pynb などの名前で上記のスクリプトをGoogle Driveにノートブックを保存しておいて、これを実行します。そのあとRubyのノートブックを開きます。もっと適切な方法もあるかもしれません。コメントなどで教えてくださると幸いです。

## 参考資料
[Google Colab で Julia を使ってみた](https://qiita.com/ueuema/items/ca1b326f5df10a4203bd)

[^1]: この方法でGoogle Colaboratory上でさまざまな言語を動かすことができるかもしれません。
Mysql2::Error: Can't create table 'studyprojects_development.users' (errno: 150)の原因

#概要
```rails g model``` でモデルを作成したあとに、```rails db:migrate```を実行するとエラーが出た。

```
Mysql2::Error: Can't create table 'studyprojects_development.users' (errno: 150)
```

#原因

```group:references``` というように外部キーを指定していたがまだ他のモデルでgroupを作成していなかった。

#解決策

一度、```rails destroy model モデル名(最初の文字は小文字でいい)``` でモデルを消したあと、groupモデルを作成し、```rails db:migrate``` をした後に、最初のモデルを作り直して解決。
OpenCVのarucoの四角

opencvのarucoで角の対応関係をよく忘れるので備忘録

---

```python
import cv2
dic = cv2.aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

img = cv2.imread('sample.png')
corners, ids, _ = aruco.detectMarkers(frame, dic)
```

idsには検出したマーカーのidが入っている。
このリストの順に、cornersに四角の位置が格納されている。

例えば、0番のマーカーの四角を知りたければ

```python
corners[list(ids.flatten()).index(0)][0] #マーカー0番の四角
```
で取得できる

四角は左上から時計回りに格納されている。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/114953/971271ad-ad38-2cfb-4eb7-f703ce6510a8.png)

つまり、

```python
# マーカー0番の左上
corners[list(ids.flatten()).index(0)][0][0]
# マーカー0番の右上
corners[list(ids.flatten()).index(0)][0][1]
# マーカー0番の右下
corners[list(ids.flatten()).index(0)][0][2]
# マーカー0番の左下
corners[list(ids.flatten()).index(0)][0][3]
```

そして、これで取得できる位置は[x, y]の順で格納されている。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/114953/b9da1857-b2a2-a485-2074-86d61d5acd7b.png)
AWS LAMBDA で AWS_ACCESS_KEY_ID の環境変数を使うとエラーになる

こちらのエラーがでて、時間無駄にしてしまったのでメモ

```
An error occurred: ScreenshotLambdaFunction - Lambda was unable to configure your environment variables because the environment variables you have provided contains reserved keys that are currently not supported for modification. Reserved keys used in this request:AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: XXXX).
```

こちら README.md にも書いてありましたね。

> ## Credentials
> _We recommend using a tool like [AWS Vault](https://github.com/99designs/aws-vault) to manage your AWS credentials._
> 
> You must configure your AWS credentials either by defining `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environmental variables, or using an AWS profile. You can read more about this on the [Serverless Credentials Guide](https://serverless.com/framework/docs/providers/aws/guide/credentials/).
```
2015年度東大理系数学第5問をpythonでどうしても解きたい。

#はじめに
2019年も1ヶ月が過ぎ受験シーズンに迫ってきた。
Atcoderを始めて2週間が過ぎ、毎日過去問をあさる日々。
せっかく受験シーズンに迫ってきたので競プロの基本問題っぽい受験数学の問題をpythonで解きたいと思った。

ぱっと思いついたのが僕が大学受験をした年のあの有名な2015年度東大理系数学の第5問。
<br>

```math
mを2015以下の正の整数とする。{}_{2015}C_mが偶数となる最小のmを求めよ。
```
<br>

これをpythonで解いてみよう。

受験会場では合否を分けた1問だったらしい。


ちなみに答えはm = 32

#解

組み合わせ(combination)は

```math

{}_nC_r = \frac{n!}{(n-r)!r!}

```
で表される事を用いてまず自分なりに書いてみる。

まあ上の式をそのままぶちこむだけ。

```python:2015_C_m
def f(n):
    if n == 0:
        return 1
    else:
        return n * f(n - 1)

for i in range(1, 2016):
    if f(2015) / (f(2015 - i) * f(i)) % 2 == 0:
                  print(i)
                  break
else:
                  print("no answer")
```

###結果１

<font color="Red">RecursionError: maximum recursion depth exceeded in comparison</font>

のエラーが出た。

問題に対する解として間違ったコードは書いていないつもりだったが、どうやら再帰の回数の上限を超えてしまったらしい。

再帰の上限のデフォルトは1000とのこと。
このコードだと2000回以上再帰しているのでアウト。

これを解消するために

```python
sys.setrecursionlimit(limit)
```

これで再帰の深さを設定する。

<br>
これらを考慮してもう一度書いてみた。

```python:2015_C_m
import sys
sys.setrecursionlimit(3000)

def f(n):
    if n == 0:
        return 1
    else:
        return n * f(n - 1)

for i in range(1, 2016):
    if f(2015) / (f(2015 - i) * f(i)) % 2 == 0:
                  print(i)
                  break
else:
                  print("no answer")
```

最初の2行以外何も変えていない

###結果2
```
6
```

！？

間違ってる。（答えは32）


いろいろ調べた結果、型変換による精度落ちから誤差が生じているせいらしい。
<br>
11行目の

```python
if f(2015) / (f(2015 - i) * f(i)) % 2 == 0:
```
の箇所でint型からfloat型へ型変換が行われ、floatの仮数部（23ビット）よりint（32ビット）の方が大きいため値によっては精度落ちが発生してしまうらしい。
参照：http://akademeia.info/index.php?%A5%B3%A5%F3%A5%D4%A5%E5%A1%BC%A5%BF%A4%CE%B8%ED%BA%B9

実際、このコードで2015_C_6を計算してみると
92274542271702512
という値になる。

正しくは、
92274542271702505　
(https://keisan.casio.jp/exec/system/1161228812 による計算結果)

の為、+7だけ誤差が生じている。


<br>
他にもいろいろな種類の誤差があるらしいが、極端に大きいまたは小さい値や、それら同士の演算の際には誤差が生じるケースがあることを頭に入れておいて間違いなさそうだ。
<br>

とりあえず整数値だけを扱うために11行目を

```python
if f(2015) // (f(2015 - i) * f(i)) % 2 == 0:
```

に変えてあげて実行してみると
###結果3

```
32
```
となり所望の結果が得られた。


<br><br><br>
いや待てよ、
誤差が怖いなら素直にやるより、もっと小さな値だけの演算だけを使うコードを書けばいいじゃないか。

#解2

```python:2015_C_m
def f(n):
    li = []
    while True:
        for i in range(2, n+1):
            if n % i == 0:
                n = n // i
                li.append(i)
                break
            else:
                continue
        else:
            break
    return li

for i in range(1, 2016):
    a = 0
    b = 0
    for k in range(1, i+1):
        a += f(2016 - k).count(2)
        b += f(k).count(2)
    if a > b:
        print(i)
        break
else:
    print("no answer")
```
<br>

関数f(n)でnの素因数をひとつずつぶちこんだリストを返し、
分子の持つ素因数2の数が、分母の持つ素因数2の数を超えた時点で出力して終了。

結果はもちろん32。

最小に書いたコードが2015!という大きな値を扱うのに対し、このコードは扱う整数値の最大値が2016とかなり小さくなるので、なんか優しげである。
<br><br>

#結論
テスト期間中に考えることではない。（単位やばいです。）
<br>

#参考
https://atcoder.jp/
http://d.hatena.ne.jp/aldente39/20110713/1310559234
http://akademeia.info/index.php?%A5%B3%A5%F3%A5%D4%A5%E5%A1%BC%A5%BF%A4%CE%B8%ED%BA%B9
https://keisan.casio.jp/exec/system/1161228812
https://math.nakaken88.com/problem/tokyo-u-r-2015-5/
[備忘録]これから俺が読んでおきたい技術書

- 個人レベル
    - C言語は割と
    - java半年
    - これからグラフィックもやる
    - ちょこっと設計に携わったことがある
    - ちょっと上のレベルのWeb記事や会話に混ざると頭の上に？マークがでてくる

---

- オブジェクト指向が何たるかを知らないので
[オブジェクト指向でなぜつくるのか 第2版](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654)

- 設計は必要
[はじめての設計をやり抜くための本 概念モデリングからアプリケーション、データベース、アーキテクチャの設計まで](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E3%82%84%E3%82%8A%E6%8A%9C%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%AC-%E6%A6%82%E5%BF%B5%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%8B%E3%82%89%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%BE%E3%81%A7-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E9%81%93%E5%A0%B4-%E5%90%89%E5%8E%9F-%E5%BA%84%E4%B8%89%E9%83%8E/dp/4798117064/ref=pd_sim_14_1?_encoding=UTF8&pd_rd_i=4798117064&pd_rd_r=909fa143-9ac7-11e8-ba0f-c9711bf3ec79&pd_rd_w=hw462&pd_rd_wg=jiy2Q&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=053a78c4-e34f-47d4-9426-4d23f47a211d&pf_rd_r=HGHCT73M6B8EX3KXVGFA&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=HGHCT73M6B8EX3KXVGFA)

- 基礎はこれで行けるらしい API周りは古い
[OpenGLプログラミングガイド 原著第5版](https://www.amazon.co.jp/OpenGL%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AC%E3%82%A4%E3%83%89-%E5%8E%9F%E8%91%97%E7%AC%AC5%E7%89%88-OpenGL%E7%AD%96%E5%AE%9A%E5%A7%94%E5%93%A1%E4%BC%9A/dp/4894717239/ref=cm_cr_arp_d_product_top?ie=UTF8)

- おすすめ的な
[ゲームエンジン・アーキテクチャ 第2版](https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%83%BB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E7%AC%AC2%E7%89%88-%E3%82%B8%E3%82%A7%E3%82%A4%E3%82%BD%E3%83%B3%E3%83%BB%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%83%BC/dp/4797377488)

---
あまりこういうの読んだことがなかった
いい機会だし書いておく
Node.js+Expressなサイトをwebpackしてみた

MEANスタックのA(=Angular)はビルドするとwebpackされます。
N(=Node.js)、E(=Express)はそのままではwebpackされません。webpackするといいことがあると言うことなのでやってみます。

# webpack関連のパッケージのインストール
webpackするには、以下のパッケージのインストールが必要になります。
> npm install webpack webpack-cli --savedev
> npm install webpack webpack-cli -g
> npm install webpack-node-externals --save

# webpack.config.jsの作成
プロジェクトのルートに、webpack.config.jsを作成する。
- 余計な警告が表示されてないように、webpack-node-externalsをrequireしている。
- .envに、NODE_ENVを定義し、dotenvでロードし、modeにprocess.env.NODE_ENVを指定している(開発環境ではdevelopment、本番環境ではproductionとなる)
- webpackの結果は、dist/serverにserver.jsとして出力される。

```javascript:webpack.config.js
const path = require('path');
const nodeExternals = require('webpack-node-externals');
const dotenv = require('dotenv');

dotenv.config();

module.exports = {
    mode: process.env.NODE_ENV,
    entry: './src/server/www.ts',
    target: 'node',
    node: {
        __filename: false,
        __dirname: false
    },
    externals: [nodeExternals()], 
    devtool: 'source-map',
    module: {
        rules: [
            {
                enforce: 'pre',
                loader: 'tslint-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    emitErrors: true
                }
            },
            {
                loader: 'ts-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    configFile: 'tsconfig.json'
                }
            }
        ]
    },
    resolve: {
        extensions: [ '.ts', '.js' ]
    },
    output: {
        filename: 'server.js',
        path: path.resolve(__dirname, 'dist/server')
    }
};
```

# webpackでビルドされるように構成
package.jsonのscriptのbuild周りを以下のようにする

```json:package.json
  "scripts": {
    "start": "node ./dist/server/server.js",
    "build": "npm run lint-ng && npm run build-ng && npm run build-ts",
    "build-ts": "webpack --config webpack.config.js",
    "build-ng": "ng build --ts-config ./src/app/tsconfig.json",
    "lint-ng": "ng lint",
   }
```

# さて、herokuで動作確認
上記でローカルでは、NとEがwebpackされ、動作も確認できた。
念のため、herokuでも動作を見ておこうと、デプロイしたところ、webpackされている様子がない。
ググって見ると、herokuでwebpackするには、一手間かける必要があるんだとか。

## 環境変数「NPM_CONFIG_PRODUCTION」の設定
herokuでは、通常、devDependenciesで指定されているパッケージはインストールされない。
こうなるとwebpackが動作しないので、環境変数「NPM_CONFIG_PRODUCTION」を「false」にしておこう。

## herukuのビルド後の動作指定
herokuでビルドが完了した後に、webpackが動作するように、package.jsonのscriptに以下のものを追加する。

```json:package.json
  "scripts": {
    "heroku-postbuild": "webpack -p"
  }
```

これで、herokuでもwebpackできる。