OmniAICreator/Qiita-1.07M huggingface dataset:
エクセルで世界の経済データをダウンロード

今回はエクセルで金融・経済データを取得します。

FREDのホームページに行きます。

https://fred.stlouisfed.org/

つぎのような画面が現れます。エクセルでダウンロードロードするアドインを取得します。赤い丸のtoolを開けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/e3424e7d-4e84-7aa1-f446-a409aadbcd6a.png)

つぎはアドインファイルのダウンロードです。ダウンロードフォルダーにfred.zipが落ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/55c72d4d-fa2f-3a4e-d15a-963b4e4893a4.png)

fred.zipを解凍します。解凍ソフトが必要ですが、一般にはクリックすると回答するはずです。しないときは解凍ソフトを取得してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/2f860baf-c092-15fb-03e2-72be9799bcfa.png)


解凍するとデスクトップにfredのフォルダーができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/85c11463-76da-f5ff-7f02-9a474c372e50.png)



エクセルのファイルをクリックするとファイルが開いて、マクロを有効にするか無効にするかを聞いてきます。

有効にします。このボックスが出てこないときは[問題解決](https://www.fastclassinfo.com/entry/macro_yukouka)

をクリックして解決策を探してみてください。EXCELのバージョンによって答えが違います。また、それでもうまくいかない場合には、解凍ホルダー内にあるfredのエクセルのアドインファイルのプロパティを開きます。詳細設定を開け、特別な制限が掛かっていないかをみます。掛かっていればそれを外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/69c44afd-5184-7a16-db91-6a8636430c9a.png)


ここまでくれば安心です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/5f257573-6f8a-5bd1-36c8-b37a71f6524c.png)

メニューのFREDをクリックします。

リボンが開くのでBrows Popular US dataをクリック、メニューが現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/afa654db-91f7-d9b2-e67c-deb8c8c6734c.png)

ドル円を選んで、データをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/d76bc89a-6098-df2a-5807-64dd5dd4571e.png)

取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/685ea691-2fa6-3b4a-bc90-721a7e8abb6d.png)

# 特にシステムトレードに興味のある方

システムトレードってなに？ https://qiita.com/innovation1005/items/2b5a291b98ebf39dfd8b

リスクマネジメントって何？ https://qiita.com/innovation1005/items/8419cda5d57f9f7b1a85



# 予測に興味のある方

 予測について　https://qiita.com/innovation1005/items/76d8a93c261e7d357ab8

# 経済データのダウンロード

https://qiita.com/innovation1005/items/edcf78cbf89477b3b0a7

# 外国為替に興味のある方

外国為替レートについて　https://qiita.com/innovation1005/items/f5cef6f6e3d1c97d17d1

# 高頻度取引について

グロスマン・ミラーモデル(翻訳) https://qiita.com/innovation1005/items/8f3da94f6af3e05fa461

# 人工知能関連

誰でもわかるニューラルネットワーク：アプリのように動かす人工知能ーテンソルフロープレイグラウンド　https://qiita.com/innovation1005/items/e269d8bac3032e34fd15

誰でもわかるニューラルネットワーク：正則化をテンソルフロープレイグラウンドで試してみた　https://qiita.com/innovation1005/items/e6f035d74675d94744c8

# 参考
「Python3ではじめるシステムトレード」(パンローリング)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/b25ae90a-3500-6f80-b08e-0014b362c4eb.png)
pandasを使ってCSVファイルを読み込んでみる。

# csvファイルを読み込みたい
　人間誰しも一度はcsvファイルを読み込みたい時があるので、今回はpythonのモジュールで、データ解析ツールの一つであるpandasを用いてcsvファイル読み込む簡単なプログラムを試作してみました。

# 動作の概要

　ファイル名を入力すると、同じ階層にある対応したデータファイルを読み込んでくれるようにしました。(本当はドラッグアンドドロップでちょちょいとデータ読み込みをしたかったのですがいきなりは難しそうなので……。)
　データの形としては、カンマ区切りでn行2列(nは任意)、1行目は各列のカテゴリ名となっていることを想定しており(以下の図を参照のこと)、各カテゴリ名をstringとして、1列目と2列目をそれぞれlist形式で読み込むようにしました。
![csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481391/28691bfb-49c8-d435-178f-5ea79c03aba1.png)

　データの読み込みにはpandasのread_csvを使用しました。こちらはカンマ区切りのcsvファイルを読み込むことができ、さらには1列目をheaderとして認識してくれる便利なものとなっています。
　ついでに、存在しないファイル名を入力してしまった場合にエラーメッセージを表示してプログラムを停止するようにもしてみました。このために、osモジュールのpath.exists()を使用しています。こちらは入力したファイルやディレクトリが存在していればTrueを返してくれます。

# プログラムの実装
　さて、実際のプログラムは以下となります。応用を考えてオブジェクト指向のプログラムとしてみましたがいかがでしょうか。


```python:csv_reader.py

import pandas as pd
import sys
import os

class csv_reader:
    #オーバーライドを前提としたread()メソッド
    def read(self,inputs):
        return 

class xy_csv_reader(csv_reader):
    def read(self,inputs):
        #インプットされた文字列をinputsに格納
        self.inputs = inputs

        #ファイルの存在を確認し、存在しなければエラーメッセージを表示しプログラムを終了。
        if not os.path.exists(self.inputs +".csv"):
            sys.exit('wrong name of csv')

        #ファイルの存在が確認できたら、pandasでデータの読み込み
        else:
            df = pd.read_csv(self.inputs +".csv")

            #ちゃんと読み込めたかデータを表示する。無くてもよい。
            print(df,"\n")
            
            #データの要素を格納し、返す
            xname = df.columns[0]
            yname = df.columns[1]
            list_x = df[xname].values
            list_y = df[yname].values
            return xname, yname ,list_x, list_y

```


# 実際に動かしてみよう

　せっかく作ったので動かしてみましょう。以下のようなテストプログラムで、先ほどのtest3.csvファイルを読み込んでみます。

```python:test.py

from csv_reader import *

#ファイル名を入力する
csvname = input('please input name of csv file> ')

#xy_csv_readerクラスのオブジェクトを生成
csv_reader = xy_csv_reader()

#データの読み込みを実行
xname, yname, list_x, list_y = csv_reader.read(csvname)

print(xname)
print(yname)
print(list_x)
print(list_y)

```


　上記のテストプログラムを実行すると、コンソールに以下のように表示されるので、ここでtest3と入力してみます。

<img width="314" alt="csv2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481391/c4e209fb-bea9-df66-64fe-145aa6236a5e.png">

　すると結果は以下のように表示されました。pandasで読み込んだ結果の一行目がheaderになっていること、データが正しく読み込まれていることが分かりました。やったね。

<img width="268" alt="csv3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481391/f7a3a66d-7644-4665-a1e9-f40ad953b31f.png">


　ちなみに、存在しないファイル名を入力すると以下のようになりました。こちらも、どうやら正しく動作しているようです。

<img width="315" alt="csv4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481391/300a6e42-645a-1b9d-8aa2-eff1ca92d732.png">

#感想と今後
　今回は、主にpandasを使用してcsvファイルを読み込む簡単なプログラムを作製しました。オブジェクト指向も取り入れてみたので、少しはステップアップできたかなと思っています。今後は、データの読み込み方のバリエーションを作ることや、読み込んだデータを使用してデータ分析ができるプログラムに拡張などをしていきたいと思います。
メモ「Automate the Boring stuff -chapter2 Flow control」

#Boolean values, comparison operators, and Boolean operators

```
Operator  Meaning
==  Equal to
!=  Not equal to
<  Less than
>　　Greater than
<=　　Less than or equal to
>=　　Greater than or equal to

Python considers the integer 42 to be different from the string '42'
```

* The == operator (equal to) asks whether two values are the same as each other.

* The = operator (assignment) puts the value on the right into the variable on the left.

##Binary Boolean Operators

```
Expression　　Evaluates to...
True and True　　True
True and False　　False
False and True　　False
False and False　　False

The or operator evaluates an expression to True if either of the two Boolean values is True. If both are False, it evaluates to False
```

#Flow Control Statements > if, else, and elif`

`while Loop Statements`
The while loop keeps looping while its condition is True

`break Statements`

`continue Statements`

`for Loops and the range() Function`

```
print('My name is')
for i in range(5):
    print('Jimmy Five Times (' + str(i) + ')')

The above program works as same as following one.

print('My name is')
i = 0
while i < 5:
    print('Jimmy Five Times (' + str(i) + ')')
    i = i + 1

---

for i in range(12, 16):
    print(i)
->12, 13, 14, 15

for i in range(0, 10, 2):
    print(i)
->0, 2, 4, 6, 8

for i in range(5, -1, -1):
    print(i)
->5, 4, 3, 2, 1, 0
```

#Importing Modules

`Ending a Program Early with sys.exit()`
Windows Terminal のひとつのタブに複数のターミナルを使う

## きっかけ
ひとつのタブに複数のターミナルが使えそうなのだが、それを操作するショートカットキーがわからなかったから調べた。

## 設定方法
profile.json に下記のキーバインドを追加します。
分割は Terminator と同じにし、フォーカス移動は ctrl + alt　+ [up/right/down/left] に、サイズ変更は shift + alt + [up/right/down/left] にしています。

```json
{
    "globals" : 
    {
        "keybindings" : 
        [
           {
                "command" : "splitVertical",
                "keys" : ["ctrl+shift+e"]
            },
            {
                "command" : "splitHorizontal",
                "keys" : ["ctrl+shift+o"]
            },
            {
                "command" : "moveFocusUp",
                "keys" : ["ctrl+alt+up"]
            },
            {
                "command" : "moveFocusDown",
                "keys" : ["ctrl+alt+down"]
            },
            {
                "command" : "moveFocusLeft",
                "keys" : ["ctrl+alt+left"]
            },
            {
                "command" : "moveFocusRight",
                "keys" : ["ctrl+alt+right"]
            },
            {
                "command" : "resizePaneUp",
                "keys" : ["shift+alt+up"]
            },
            {
                "command" : "resizePaneDown",
                "keys" : ["shift+alt+down"]
            },
            {
                "command" : "resizePaneLeft",
                "keys" : ["shift+alt+left"]
            },
            {
                "command" : "resizePaneRight",
                "keys" : ["shift+alt+right"]
            },
        ]
    }
}
````

## 感想
X Window System を導入し、 Window Manager は i3 で、 ターミナルはTerminator を使っていたが、 Windows Terminal だけで済むようになった。

大きく異なることは、 i3 は、 layout を指定できるので再現しやすいこと。

しかし、頻繁に再起動することはないので、それほど苦労ではない。逆にメモリや CPU のリソースが減るメリットの方が大きかった。

## 訂正というか背景の説明
読み返したら意味が分からない。ということで記憶を頼りながら。
Windows に、 VcXsrv という X Server を導入して i3 というウィンドウマネージャーを使い、Windows というより Linux として使っていた。
で、タイル１枚１枚に rxvt-unicode を使っていた。メモリ消費量が少ないし Demon mode でバックグランドで動かせるから。が、Terminator を全画面表示して、その中で複数のターミナルを使う運用になった。
移行した理由は、もう忘れました。

そして、 Windows Terminal なら、i3 はいらないし WSL の中にターミナル入れる必要がなくなった。とうぜん、VcXsrv もいらない。

たぶん、そんな背景だったはず。ちなみにマシンは Windows tablet で、１０インチのやつを使っていたはず。

以上です。

## 参考
[ Feature Request: Split windows #532 - comment-520295395](https://github.com/microsoft/terminal/issues/532#issuecomment-520295395)
Github使い方、メモ

https://tsuyopon.xyz/
web白熱教室の課題の提出方法
1.課題のページに飛ぶ。
2.GitHubの課題レポジトリに行く。
3.自分のアカウントにForkする。
4.保存したいところを開いてcloneする。
5.code .　レポジトリをベースにvscodeが開く。
6.ターミナルを開く。
7.git branch
自分のローカル環境にあるブランチの確認
8.git checkout -b　develop
9.git branch 　developになってるか確認
10.HTMLの編集
11.git　status　変更したファイルの一覧を確認
12.git　diff　変更したファイルのソースコードを確認
13.git　commit　-m　origin　develop
（修正した場合）　git commit -m "コミットメッセージ"
fix：バグ修正
add：新規（ファイル）機能追加
update：機能修正（バグではない）

14.git push -u origin develop
15.PullRequestする　　
matser　自分　←　develop　自分　
16.PullRequestをMergeする　


![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504345/2d46b3ff-fd71-8b6d-f6ec-58ac3ed71893.png)

web上でdeleteしたとき、画像のようなエラーがでた。
non-fast-forward　エラー
https://help.github.com/ja/articles/dealing-with-non-fast-forward-errors

git pull origin develop としたらどうでしょう？
(git push origin develop と同じ要領でpushではなくpullをする)

Please specify which branch you want to merge with.
「どのブランチをマージしたいか特定しろ」と書いてあるので、
ブランチを特定する必要があるということがわかります。
そして、その後に「git pull <remote> <branch>」 と書いてあり、
既にレビュー提出で git push -u origin develop を経験していることから、 origin develop で、GitHubのレポジトリに対してdevelopブランチをpushするということは、理解されているかなと思います。
そして、今回の場合pullを使いましたが、pullはpushとは逆の動作で、
リモートからローカルに反映されていない分を取り込む、つまりマージすることを意味します。
そして、どのブランチの内容を取り込むかというしていで、 origin develop を実行しました。
origin の意味については、39回のオンライン講義でも話していますが、レポジトリのURLのショートカットになります。
crosstool-ng-1.19.0ビルド時に必要なパッケージ

crosstool-ng-1.19.0.tar.bz2
の場合以下が必要になります．


[EXTRA]    Patching 'gmp-5.1.1'
[EXTRA]    Patching 'mpfr-3.1.2'
[EXTRA]    Patching 'mpc-1.0.1'
[EXTRA]    Patching 'binutils-2.22'
[EXTRA]    Patching 'gcc-4.8.1'
[EXTRA]    Patching 'newlib-1.20.0'
[EXTRA]    Patching 'gdb-6.8a'

apt-get build-essentialなど基本的なパッケージをいれて，それでも足りなければ[ここから](https://ftp.gnu.org/gnu/)とってきましょう．

```
sudo aptitude -y install build-essential vim emacs git \
  mercurial python3 python2.7 python-dev libzip-dev \
  automake libncurses5-dev gperf bison flex gawk \
  libtool libexpat-dev expat
sudo apt-get install texinfo
sudo apt-get build-essential
sudo apt-get install gcc 
sudo apt-get install libtool-bin
sudo apt-get install python-dev
sudo apt-get clean
sudo apt-get autoremove //容量を確保するため
```
CentOS 7にPHP 7.3をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS7にPHP7.3をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2021-12-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php73 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
... 略

# yum install -y --enablerepo=remi-php73 php which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.3.10 (cli) (built: Sep 24 2019 09:20:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.3.10
Release     : 1.el7.remi
Size        : 10 M
Repo        : installed
From repo   : remi-php73
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
Laravel6系で始めるか、Laravel5系を使うべきか迷う人へ

最近、新しくLaravel 6がリリースされました。

これまで『5.1』『5.2』等で刻んでいた中、『6.0』が出たのは大きな変更に思えます。 

Laravel 6.0がリリースされたばかりで記事や書籍などが出揃っていないため、Laravel 6.0を採用するのは時期尚早なのでしょうか。 

結論から言うと、**Laravel 6.0はLaravel 5.8と大きな違いはありません**。これまでのバージョンアップと同程度の差なので、Laravel5系の書籍や記事の情報はそのまま使うことができます。

## 注意
この記事はLaravel 6.0がリリースされた2019年9月時点での事情を説明しています。

## ■結論
1. Laravelのバージョンは6.0以降[セマンティックバージョニング](https://semver.org/lang/ja/)が採用された
2. Laravel 6.0は実質5.9なので、変更の差は今までのバージョンアップと一緒(今回言いたいこと)
3. Laravel 6.0を使うといいよ(LTS等、理由の詳細略)


## なぜ迷うのか
たぶん、この記事を見た人は、きっと不安に思っていると思います。

『Laravel 6系の記事まだ少ない』  
『出版されてる本、Laravel 6系対応のはまだない』  
『Laravel 5系ならいろいろ本あるし安心』

この『Laravel 5系』という言葉に、誤解があり、それを解くのが今回の記事の目的です。

## 6.0は実質5.9
今回のバージョンアップ、『一番上の数値が増えたから、きっといっぱい変わったんだろう』。

いいえ、違います。そんなに大きな違いはありません。  
以下は詳細に読む必要はありませんが、ちらっとリリースノートを見てください。  
項目少なくないですか？

■リリースノート
https://readouble.com/laravel/6.0/ja/releases.html

■アップグレードガイド
https://readouble.com/laravel/6.0/ja/upgrade.html

ここで重要なのが、『セマンティックバージョニングに変わった』という点です。

## Laravel 6.0から、番号の付け方変わった
簡単にいうと、

Laravel 5.1->5.2->5.3

が

Laravel 6->7->8

ってバージョンアップに変わります。

## つまり。
Laravel 6.0は実質Laravel 5.9だよ！

Laravel 6系の本がない・・・って思っても、Laravel 5.7とか5.8使ってた知識で、だいたい使えるよ！

## どうでもいい話。
https://github.com/laravel/laravel/blob/5.8/composer.json#L13

https://github.com/laravel/laravel/blob/master/composer.json#L13

セマンティックバージョニングになったから、composer.jsonも『^』の書き方になりましたね！

これはテンション上がりますよね(*‘ω‘ *)
jsのビルドで「Can't resolve 'regenerator-runtime/runtime'」が出た時の対策

# 「Module not found: Error: Can't resolve 'regenerator-runtime/runtime'」が出た

**async/await**を使っているコードをビルド（babelをかけたら）したら
以下のようなエラーとなる場合がある。

```
Module not found: Error: Can't resolve 'regenerator-runtime/runtime' in xxx
```

## 対策案その1 **core-jsとregenerator-runtime**を導入する

**Babel 7.4.0**以降を使っているなら、

2つのnpmモジュール**core-js**と**regenerator-runtime**をインストール

```
npm install core-js@3 regenerator-runtime
```

**async/await**を使っているソースコード(.js)でいまインストールしたモジュールを**import**する

```js
import "core-js/stable";
import "regenerator-runtime/runtime";
・・・以下略・・・
```

## 対策案その2　**@babel/polyfill** を導入する

**@babel/polyfill**をインストール

```
npm install --save-dev @babel/polyfill
```

**async/await**を使っているソースコード(.js)で **import "@babel/polyfill"** する

```js
import "@babel/polyfill";
・・・以下略・・・
```

<font color=red>[babel公式](https://babeljs.io/docs/en/next/babel-polyfill.html)によると、**@babel/polyfill**は **Babel 7.4.0**で deprecatedとなっているので注意</font>

## 対策案その3　対象ブラウザを変更する


＜**変更前**＞古いブラウザを対象にした**@babel/preset-env**の設定

**※targetsに注目**

```js:webpack.config.js抜粋
{
 test: /\.js$/,
 exclude: /(node_modules|bower_components)/,
 use: [
  {
   loader: 'babel-loader',
   options: {
    presets: [
     [
      '@babel/preset-env',
      {
       'modules': 'false',//commonjs,amd,umd,systemjs,auto
       'useBuiltIns': 'usage',
       'targets': '> 0.25%, not dead',
       'corejs': 3
      }
     ]
    ]
   }
  }
 ],
}, 
```

＜**変更後**＞新しいブラウザを対象にした**@babel/preset-env**の設定

**※targetsに注目**

```js:webpack.config.js抜粋
{
 test: /\.js$/,
 exclude: /(node_modules|bower_components)/,
 use: [
  {
   loader: 'babel-loader',
   options: {
    presets: [
     [
      '@babel/preset-env',
      {
       'modules': 'false',//commonjs,amd,umd,systemjs,auto
       'useBuiltIns': 'usage',
       "targets": {
        "browsers": [
         "last 1 Chrome version",
         "last 1 Firefox version",
         "last 1 Edge version",
         "last 1 Safari version",
         "last 1 Opera version"
        ]
       },
       'corejs': 3
      }
     ]
    ]
   }
  }
 ],
},
```

（対策その２のほうは、babelの目的から考えると、本末転倒かな。）
Cloud9でRailsのAPIの開発環境を構築



# はじめに
Cloud9でRailsのAPIサーバの開発環境を構築する手順の忘備録になります．

次のような方におすすめです．

- Cloud9にRailsのAPIサーバを構築したい
- React+RailsやVue+Railsの開発環境が欲しい
- Herokuなどの他のサービスを通さずにアプリを公開したい


# なぜ書いたのか

RailsのみならCloud9のプレビュー機能が使えます．（[参考サイト](https://remonote.jp/aws-cloud9-ruby-on-rails)）
ただ，プレビューはあくまでもプレビューであり，ネットに公開されているわけではありません．
そしてAPIサーバは外部からアクセスできる必要があり，プレビュー機能では開発環境の役目を果たすことができません．

そこで，Cloud9上でネット公開されるRailsのAPIサーバの構築を試みました．
他に同様の記事が無く苦戦したので忘備録として残しておきます．

基本的な流れだけのせて，他の記事をリンクを載せて端折らせていただきます．

# Cloud9の環境構築

AWSのアカウントを作成します．
そして，安全に操作できるようにユーザを作成し，Cloud9の環境を構築します．
[初めてのAWS Cloud9導入](https://qiita.com/tu-kun/items/d7b4f1fa19cc93bc5b75)

# Rails APIサーバのセットアップ

rvmなりrbenvなりでRubyのバージョンを指定し，Railsをインストールします．

```sh
# rvmの場合．(rvmはデフォルトで入ってる)
rvm install "rubyのバージョン"
rvm use "rubyのバージョン"

gem install rails -v "railsのバージョン"
```

RailsアプリをAPIモードで作成します．

```sh
rails new "アプリ名" --api
```


# CORSの設定

他のオリジンからアクセスを許可するために，コメントアウトを外してあげます．
そして，originsに，フロントのオリジンを指定します．

```config/initializers/cors.rb
# 'rails new'の直後はコメントアウトされてる
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'hoge.fuga.example.com' #ここをフロントのオリジンに変える
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```

また，rack-corsがGemfileでコメントアウトされているので外します．

```Gemfile
gem 'rack-cors'
```
gemを追加したので，インストールします．

```.sh
bundle install
```


# ネットワークの指定

Cloud9が動いているEC2インスタンスへは初期設定ではインターネットからアクセス出来ません．
そのため，[「AWS 実行中のアプリケーションをインターネット経由で共有する」](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html#app-preview-share)に従って，EC2にアクセス出来るようにします．

アカウントを作成したばかりなら，必須なのはセキュリティグループの設定ぐらいだと思います．
書いてありますが，ポート番号は8080~8082のどれかです．

# Railsの起動

railsを起動します．
バインドとさきほどのポート番号を指定します．

```
rails s -p "ポート番号" -b 0.0.0.0
```

# ブラウザで表示

「ネットワークの指定」の手順で実行した

```sh
curl http://169.254.169.254/latest/meta-data/public-ipv4
```

で得られるIPアドレスにポート番号をくっつけてブラウザで表示します．(例: `256.1.2.3:8081`)


すると，いつもの画面が出てくるはずです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233276/07cb03e3-3b76-0455-28ff-d078e53c7db1.png)

これはブラウザで表示していますが，APIモードで動いているはずです．

# 終わりに

かなり省略しましたが，大まかな流れは合ってると思います．

ネットワークの設定までは順調だったのですが，バインドのところでつまずきました．
Cloud9だとポートやバインドは指定せずとも動くので甘えてました．

以上の手順で，最大3つのアプリまで一つのインスタンス上でネット公開できます．
そのため，RailsとReactやVueなどを同時に公開することも可能です．

Rails+Reactで動くことを確認しました．
ぜひ，試してみてください．
Command 〜 failed with a nonzero exit code

Xcodeで開発をしていたら必ず目にするこのエラー。
ビルド時に起こりうるエラー。

- Command CompileXIB failed with a nonzero exit code
- Command CompileStoryboard failed with a nonzero exit code
- Command PhaseScriptExecution failed with a nonzero exit code
- etc.

何かしらに失敗したらしいけど、なんで！！！
非常に困るエラー。専門的には自分は分からないですが、対処法をいくつか記載します。

## 直近Xcode11.0で私が直面したエラー

ライブラリのxibファイルにて。

エラー:
`Command CompileXIB failed with a nonzero exit code`

色々試しましたが、全く解決せず。それもそのはずでした。

Xcode11.1 Release Notes
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_1_release_notes

> Resolved Issues
> Fixed a crash that sometimes occurred when compiling XIB files in iOS projects that backwards deploy to iOS versions earlier than 13.0. (55271752)

Xcode11.0では、iOS13.0よりも古いやつでデプロイされたXIBファイルは、クラッシュすることがあるだと。。

つまりXcode11.0では無力でした :innocent: 
Xcode11.1にしたら直りました。
古いライブラリを使っていた自分が悪いということでしょう。
あと、Release Noteをちゃんとチェックするのは大事だと改めて思いました。

## 基本の対処法

基本はクリーン系で直ります。以下を試しましょう。

- XcodeでClean Build Folder
- /Library/Developer/Xcode/DerivedDataの削除
- Xcodeの再起動
- Simulatorでアプリアンインストール、再起動

## PhaseScriptExecution

これはXcodeがKeyChainにアクセスできなくて起きている可能性があります。
KeyChainのロックON/OFFをしてみましょう。

参考: https://qiita.com/kamata1729/items/885ae2cf2a9b06594adf

## まとめ

まだまだ他のケースが見つかれば追記していきます。

## その他参考資料

- https://stackoverflow.com/questions/46690619/build-fails-with-command-failed-with-a-nonzero-exit-code
SGD Regressorでn次関数が予測できるか？

## やったこと

[scikit-learnのアルゴリズム選択マップ](https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)の中の一つである`SGD Regressor`を実装すると同時に、どれくらい複雑なデータに対応できるのかを検証してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/b3511680-2c0b-30c6-73b0-2fe130eeaf2f.png)

## n次関数の予測(n: 1~10)

データ数が100,1000,1000000ごとにSGD Regressorの精度を調べてみた

### 結果

4次関数から、大きな誤差が目視できるようになったが、9次関数でも大きな特徴は捉えていた(山と谷の位置は一致していた)
ただし、これはn次関数のnの値が大きくなればなるほど、Yの値は大きくなるので、元データに対する誤差の割合は一定なのかもしれない。(後日検証します)
赤色が予測結果で、青色が正解データです。

#### 1次関数
`y = a * b`
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/dcbd2165-e68b-5128-db70-ccbe5dfff54f.png)


#### 2次関数
`y = axx + bx + c`
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/2a82916d-77cb-3413-6e20-1e0801cc8b94.png)

#### 3次関数
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/b840450a-62cb-da10-09b2-61854fae7a87.png)

#### 4次関数以下順番に
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/a4625a48-5339-19f1-4736-bdcda10d70a3.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/f7642340-5094-1316-1f20-848b4eb15a6e.png)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/10a28d2b-1738-cb92-9433-6c3421b30f31.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/58f74e81-25b8-d238-9b77-2458a10f1f4c.png)

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/3b89b7b5-bc01-a681-1fbb-c1b5e38f97e8.png)

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/ce161add-585c-22b6-e469-cd515e6d2a3d.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183842/cb2c526c-31d5-bd54-5fa6-3c4c76893ae6.png)

## ソースコード

[colaboratoryのリンク](https://colab.research.google.com/drive/1dW5TfyePowP_iSX1ourxx94NnhK9TQUf)
[pdf](https://drive.google.com/file/d/13_-sF0di8Vr8EGpCfvCVzwn__VsdJypL/view?usp=sharing)
PostgresSQL  vscode拡張機能

# PostgresSQLのGUIの拡張機能の追加の仕方

#LiveShare
1. live share
2. live share chat
3. live share audio

## 順序
1. live shareでコラボレーション開始()
2. URL送信
3. 相手はjoinする
4. chatは自動的に立ち上がる。audioはjoinで開始する
5. portの共有はホスト側がshared serversを押して、ポート番号を入力
[Mac] Android Studioの日本語表示

# はじめに
MacでAndroid Studioを日本語表示にする方法について書きます。

# 1.Pleiades（プレアデス）のダウンロード
## 1-1.サイトにアクセスし、ダウンロードする
下記のURLにアクセスし、Pleiadesをダウンロードする。
[Pleiadesのリンク先](http://mergedoc.osdn.jp/)
※Pleiades:有志の方が翻訳してくださっている翻訳パッケージです。

<img width="1260" alt="スクリーンショット 2019-09-27 20.06.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492712/3a081218-a30f-2d5e-bac7-a8caee435d7f.png">

## 1-2.ダウンロードファイルの解凍
zip を解凍し、setup.app でインストーラーを起動する。
セキュリティダイアログが表示される場合は、右クリックから "開く" で起動できる。

<img width="449" alt="スクリーンショット 2019-09-27 20.16.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492712/37e1c953-c070-1b8f-2de5-bb9d94748140.png">

## 1-3.Pleiadesの日本語プラグインのセットアップ
「選択」で、Android Studioを選び「日本語化する」をクリックする

<img width="841" alt="スクリーンショット 2019-09-27 20.24.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492712/29906fa9-33b3-0c42-a6c2-4a7fbf174edb.png">

完了の表示が出るので、「OK」をクリックする
<img width="421" alt="スクリーンショット 2019-09-27 20.27.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492712/5ee5ac81-558b-82a3-dd54-769ffd692c82.png">

# 2.Android Studioを起動し、日本語表示になっているか確認する
日本語表示になりました
<img width="662" alt="スクリーンショット 2019-09-27 20.31.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492712/c06e7a13-caa9-ac01-ef85-9582368c7102.png">
DynamoDBとRDBMS

#はじめに
学生アルバイトのsosonoです。
プロジェクトでAmazon DynamoDBを使用する予定になり、今まで使用していたRDBMS（PostgreSQL）との違いが気になったのでまとめてみました。

#NoSQLとRDBMS


<b>DBMS</b>
データベース管理システム。DBを構築するために必要なDB運用、管理のためのシステム、またそのソフトウェアのこと。

- <b>RDBMS</b><br>
リレーショナルデータベース管理システム。構造化クエリ言語（SQL）を使用する。有名どころはMySQLやPostgreSQL、SQLite。Rは関係という意味を持ち、データ＝表の「関係モデル」が基礎。

- <b>NoSQL</b><br>
Not only SQLの略であり、NoSQLデータベースシステムとなる。例としてAmazon DynamoDBなど。キーと値のペア、ドキュメントストレージといった、データ管理のための「新しいモデル」が基礎になっている。RDBMSの弱点を補うような立ち位置。

# 比較

- <b>ワークロード</b>
    - RDBMS
        - アドホッククエリ、データウェアハウス、オンライン分析処理、etc
    - DynamoDB
        - SNS、ゲーム、IoT関連、メディア共有、etc
        - 単純なデータ構造で、データ数が多いものに向いている

- <b>データモデル</b>
    - RDBMS
        - 実装やパフォーマンスをあまり気にせず柔軟に設計できる。が、テーブル、列、行といった明確な構造（スキーマ）が必要。
    - DynamoDB
        - スキーマレス。テーブル毎に、PrimaryKeyが必要になる。JSONドキュメントを含む構造化データまたは半構造化データを管理可能。

- <b>データアクセス</b>
    - RDBMS　
        - SQLを使用。テーブルを連結した複合的な検索も可能。柔軟に使えるが、比較的高コストで、トラフィック量によってはスケールがうまくいかない可能性もある。読み書きは遅い。
    - DynamoDB
        - SQLは使えない。AWSマネジメントコンソール、AWS CLIを使用してDB自体を操作。AWS SDKを活用すれば、PHP、JavaScript、Python、Ruby等からアクセスできるようになる。読み書きは速い。

- <b>パフォーマンス</b>
    - RDBMS
        - 開発者、データベース管理者が別だったりと、パフォーマンス向上のためにはクエリやDBの構造を最適化する必要がある。
    - DynamoDB
        - パフォーマンスはハードウェアなどに依存する。マネージド型であるため、実装の詳細から離れ、堅牢な設計を比較的簡単に行える。

- <b>拡張性</b>
    - RDBMS
        - データ構造はあらかじめ定義されており、高コスト。　
    - DynamoDB
        - シンプルなデータ構造のため、自由に拡張できる。前提として、テーブルは少ない方が優れたものとされる、というのがある。

# 実際のコードで比較


- RDBMS
    - 作成時に,テーブルの列、データ型全て、プライマリーキー等を定義する必要があった（ALTER TABLE使えば変更はできる）
    - 自分的には見慣れた記述方法です。

```sql

CREATE TABLE Music (
    Artist VARCHAR(20) NOT NULL,
    SongTitle VARCHAR(30) NOT NULL,
    AlbumTitle VARCHAR(25),
    Price FLOAT,
    Tags TEXT,
    PRIMARY KEY (Artist, SongTitle)    
);
```

- DynamoDB
    - RDBMSとは全く違う感じの記述です。基本的にはキーと値から成っています。
    - KeySchema（属性）はプライマリーキーに使用、AttributeDefinitionsはKeySchema属性のデータ型と言ったように、基本的な考え方はRDBMSのそれと変わりません。

```


{
    TableName : "Music",
    KeySchema: [       
        { 
            AttributeName: "Artist", 
            KeyType: "HASH", 
        },
        { 
            AttributeName: "SongTitle", 
            KeyType: "RANGE" 
        }
    ],
    AttributeDefinitions: [
        { 
            AttributeName: "Artist", 
            AttributeType: "S" 
        },
        { 
            AttributeName: "SongTitle", 
            AttributeType: "S" 
        }
    ],
}
```
※RDBMSのコードと特に互換性はありません。

#展望

- シンプルで初歩的なコードの紹介でしたが、大きな違いがありました。一例として、PHPでDBにアクセスする時でもRDBMSとNoSQLでは記述量などに大きな変化があります。また整理がついたらまとめていきます！！

[参考：AWS公式サイト]https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.CreateTable.html
【Unity】PUN2でRpcTarget.AllBufferedとかOthersBufferedが仕事してない時に見るメモ

#はじめに
ここへたどり着いたということは、
PhotonのRpcTarget.AllとRpcTarget.AllBufferedの違いは分かっているということでしょう。
分かっていない方は以下のブログ推奨です（PUN2の記事ではないですが、内容的には同じです）。
[【Unity】僕もPhotonを使いたい #08 RPC() PhotonTargets編 ](https://www.urablog.xyz/entry/2016/09/20/225916#PhotonTargetsAllBuffered)

RpcTarget.○○Bufferedを使うと、後からルームに入室した人にもデータを送信してくれます。
が、この情報だけを見てドツボにハマってしまったのでメモ。

##Sceneをまたぐときはちょっと特別
単刀直入に言うとここの内容です。
[【Unity】僕もPhotonを使いたい #13 isMessageQueueRunning ](https://www.urablog.xyz/entry/2016/10/02/103935)
私はここを見る前に、よっしゃRPC使ったるでー！と先走ってしまい、
いや、Buffered動かないやんけ・・・と、同じ目に遭遇してしまった・・・。

上記のリンク先と少しだけ違うのが、PUN2では
>PhotonNetwork.IsMessageQueueRunning


IsのIが大文字になってます。

#最後に
内容の無い記事になっていますが、
載せたリンク先はPUN2のワードで検索をかけると出会えない可能性があるので、
PUN2を使っている人が検索をかけそうなワードを散りばめているつもりです。
というのは建前で、忘れたころの自分が検索かけそうなワードを散りばめています。
CentOS 7にPHP 7.2をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS7にPHP7.2をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php72 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
... 略

# yum install -y --enablerepo=remi-php72 php which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.2.23 (cli) (built: Sep 25 2019 07:38:48) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.yz.yamagata-u.ac.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.yz.yamagata-u.ac.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.yz.yamagata-u.ac.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.2.23
Release     : 1.el7.remi
Size        : 10 M
Repo        : installed
From repo   : remi-php72
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
プログラミングを基礎から勉強中


＜プログラムが動く仕組みをざっくり＞
入力をプログラムで処理して、出力する。
入力・処理・出力はセットで考える。

＜言語の種類について＞
プログラミング言語を一つ覚えると、ほかの言語は覚えやすい。
なので一つを深掘りして学ぶことが良い。
ライブラリー（拡張機能）を使うことによってSwiftや
Java,JavaScriptでもWebアプリは作成可能。
Pythonで作ると非常に簡単にディープラーニングが作れる。

＜Pythonとは＞
AIが得意、TensorFlowなど
バージョンは3.xを使う。2.xはノンサポート
https://www.python.org/

下記をインストール。Docker
　Windows or Mac OSに応じてインストール。
デフォルトのままnextを押していけばOK.アカウント登録が表示されたら
適当にアカウントを作成してください。
https://www.docker.com/products/docker-desktop

DockerQuickstartTerminal（旧バージョン）は不要でターミナルに統合されている。
Dockerのアイコンが表示されている。
うまくインストールできない人（おそらくOSが古い）はDocker ToolBoxを
インストールしてください。
https://docs.docker.com/toolbox/overview/
vimで英語を読み書きするぷらぎんを作った

* 2024/12/19

コノ 記事デ 紹介シタ ぷらぎん 古イ
コッチ 使ウ 良イ

https://github.com/uesseu/nin-english.vim

# 動機
オレ　英語　ニガテ。　英語　ヨム　ツライ。　英語　カク　デキナイ。
辞書　ヒク　メンドウ。　ドコマデ　ヨンダ　ワカラクナル…。

# 何をしたのか
以下を実装した

- 英単語の補完
- 英単語のhelp
- 英語のシンタックスハイライト

他にもそういうぷらぎんはあるのですが、
既存の英和辞典のぷらぎんとの違いは、シンタックスハイライトとオムニ補完。
あと、単語の表示の仕方。

下記はvimのwikipedia記事の英語版の冒頭。
![Vimのwikipedia記事](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139153/4b992b40-6eb9-da9d-08a0-c10d557be215.png)


# 必要物品とインスコ
- 当ぷらぎん
- 辞書ファイル

ぷらぎんは何らかの方法でインスコしてください。
僕はvimplug使ってるので下記です。他の人は読み替えて下さい。

```vim
Plug 'uesseu/nin-english-vim'
```

辞書ファイルは下記を使います
https://kujirahand.com/web-tools/EJDictFreeDL.php

ダウンロードして解凍して好きな所に置いて下さい。

# 設定
何がなくとも辞書の場所を指定してあげる必要があります。
おもむろに.vimrcを編集します。

```vim
let g:nin_english#dict = "path/to/dictionary"
```

シンタックスハイライトがうるさいと思うなら、下記を0に設定して下さい。

```vim
let g:nin_english#hilight = 1
```

# はじめる
下記で始めます
:EnglishInit

# 辞書引き
下記のキーで辞書を引きます。
K
便利です。

# オムニ補完
下記のキーで普通に補完します。
Ctr-x Ctr-o
で辞書を検索してくれます。一回目はちょい遅いですが、二回目から速くなります。

# シンタックスハイライト変じゃね？
変だよ。だって、構文解析とかしてないもん。
あくまで自分のために書いたものだしね。

# 今後
とりあえず衝動的に作ったので、オムニ補完周りを改善したり、
お作法に則った書き方に変えていきたいね。

# オレ　英語ノ　ぷらぎん　ツクッタ
ぷらぎん　デキタ
ナノニ　俺　エイゴ　ヨメナイ
根本的ニ　アタマワルイ　カナシイ…
【Python】ABC - 089 - Hina Arare

# 問題
袋に$N$個ひなあられが入っているときに、桃色を'P'、白色を'W'、緑色を'G'、黄色を'Y'としたときに袋の中に桃色、白色、緑色の3種類が入っている場合は'Three'、桃色、白色、緑色、黄色の4種類が入っている場合は'Four'と出力する問題。（今回はこのどちらかになることがわかっている）

# 方針
袋の中の要素の集合を数えて、要素数を数えればよい。

```python
N = int(input())
S = list(input().split())
if len(set(S)) == 3:
    print('Three')
else:
    print('Four')
```
FireStore上のドキュメントをorderbyでソートする時、ソート対象フィールドがdocumentに無いと結果に入らない

ちょっと嵌ったので。備忘も兼ねて

``` javascript
db.collections('hoge').orderBy('fuga').get().then(query => {
  query.forEach(doc => {
     //fuga　fieldを持っていないドキュメントはそもそも入らない
  })
})

```
まぁ[公式](https://firebase.google.com/docs/firestore/query-data/order-limit-data?hl=ja)にきちんと書いてあるんですが。

# 教訓
スキーマレスでもこういうところは気を付けましょう。
#Github のレビューのコツ – Viewed / Outdated / Show Comments / Resolve Conversation を使い分ける

# Viewed

ファイル単位で「見た！」とマークをつけて、ファイルを丸ごと、閉じた状態にできる。

あと、進捗バーにも反映される。これは自分だけのレビュー状態の管理なので、他の人には影響しない。

Viewedの状態はGithubが記憶してくれるので、ページを移動したりしても、保持される。

![image](https://user-images.githubusercontent.com/13635059/65755674-88c7b980-e14e-11e9-98c4-dd9a42ab111e.png)

# Outdated

レビュー指摘した行に対して修正、変更があった時に、Gitが勝手にコメントを閉じてくれる。僕らは何もする必要はない。

![image](https://user-images.githubusercontent.com/13635059/65755233-ab0d0780-e14d-11e9-9d20-d52b1f30ba9a.png)

# Resolve 

レビューコメントをつけた行に対して、git的に変更があったわけではなく、Outdatedにならなかった。だけど問題は解決してるよ！とかいう時に、このボタンを押して解決済みにする。

自分にも、相手にも、他の人から見ても「閉じた状態」になる。

解決済みの問題は開いたままだとノイズになるので、どんどんResolveしていこう！気分も良いでしょ？

![image](https://user-images.githubusercontent.com/13635059/65755310-d55ec500-e14d-11e9-9011-8d538d0df431.png)

# Show Comments 

チェックを外すと一時的に、そのファイルについたレビューコメントを全て見えなくして、ファイルだけを見ることができる。

コメントがノイズになって、コードをうまく読めない時におすすめ。

だがファイル単位でコメントを消していなければいけないのと、Githubが状態を覚えてくれていないので、あまり役立たない感じはする。

![image](https://user-images.githubusercontent.com/13635059/65755605-6a61be00-e14e-11e9-86c4-8c2b4e909428.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWS IoT EnterpriseでJobcanの打刻ができる出勤ボタンをつくった


## 背景

- AWS LambdaがRubyの対応したので、自分で作成して使ってみたかった
- Amazonがダッシュボタン事業から撤退してしまうので、その弔いとして
- ジョブカンで打刻するのが億劫だなと感じていた

## 構成

構成としては以下の図のような構成になっています。

![slack-jobcan.002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227429/825d6149-01a5-0697-108b-187bd49fc89e.png)


参考にしたのは、このブログのリンクでpythomで自分が実現したいことを達成していたので、90%くらいはここから真似してきました。

[物理出勤ボタンを作った](https://uskey.hatenablog.com/entry/2018/10/17/115728)

こちらのブログだとpythonで書かれていたのですが、今回使いたかったのはRubyなので、Rubyで書きました。

## 手順

- Amazon IoT Enterprise をAmazonで購入
    - 2500円します。
    - 実験としてはいいけど、高いな。。。

[AWS IoT エンタープライズボタン – IoT をシンプルに。](https://www.amazon.co.jp/dp/B075FPHHGG/ref=cm_sw_em_r_mt_dp_U_BdruDbJ04D0EV)

- Amazon IoT Enterpriseをセットアップ
    - アプリをダウンロード
    - バーコードを読み込んで、デバイスを登録する
    - デバイスとWifiを繋げる
- Amazon IoTをセットアップ
    - プロジェクトを作成
    - デバイステンプレートを作成
- Labda のセットアップ
    - 関数を作成
- SlackのAPI token とチャンネルのIDの獲得
    - ここから獲得
- コードの記述
    - slack-ruby-clientというgemを使う
    - 以下のようなコードを書きます
   
```ruby
require 'slack-ruby-client'

def hello(event:, context:)
  Slack.configure do |config|
    config.token = ENV['SLACK_API_TOKEN']
  end
  client = Slack::Web::Client.new
  client.chat_command(channel: ENV['SLACK_CHANNEL'], command:'/jobcan_touch')
end
```

- 詳しいコードは以下のGithubから確認してください。

[https://github.com/knsg16/slack-jobcan](https://github.com/knsg16/slack-jobcan)

- コードをAWS Lambdaにアップする
    - zip形式のフォルダを作成
    - 当該ファイルをLambdaにアップする
    - Lambdaにテストイベントを作成して、テスト
- 完成
    - お疲れ様でした！！

## トラブルシューティング

- ステルスの社内WIFIにAmazon IoT Enterpriseを接続できない。。。
- rubyのversionを2.5.0にきっちり揃えないといけなかった。。。
- 普通にwebhookでは、コマンドをAPIで叩くことができなかった。かつ、非推奨のレガシートークンを使用しなければならなかった。。。
- lamdaにアップするためにファイルをzipにする時のファイル構成
Mac に pyrealsense2 をインストールする

# 前置き
RealSense を Python で動かすプログラムを書く際に、import pyrealsense2 で詰まったので、Mac に pyrealsense2 をインストールする方法をメモとして残しておきます。

# 環境構築

```
$ brew install libusb pkg-config
$ brew install homebrew/core/glfw3
$ brew install cmake
$ git clone https://github.com/IntelRealSense/librealsense.git 
$ cd librealsense
$ mkdir build && cd build
$ cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -DBUILD_PYTHON_BINDINGS=true -DPYTHON_EXECUTABLE:FILEPATH=/usr/local/bin/python3 -G "Unix Makefiles"
```

**cmake -DPYTHON_EXECUTABLE:FILEPATH=/usr/local/bin/python3** の
**/usr/local/bin/python3** は環境に合わせるために

$ which python3 で確認したものに置き換えて下さい。
その後、下記を実行します。

```
$ make
$ sudo make install
```
上記の環境構築が完了した後、

```
$ cd /usr/local/lib && ls
```
を実行すると、
<img width="299" alt="スクリーンショット 2019-09-27 19.07.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242339/000c807c-0aaa-d35b-10a8-d0f3fcec06ee.png">
上記のように、新しくファイルが作成されていることが確認できると思います。

# シンボリックを作成する
このままではpyrealsense2を使用することができないので、環境にシンボリックを作成します。

```
$ cd /usr/local/lib/python3.6/site-packages
$ ln -s /usr/local/lib/pyrealsense2.cpython-37m-darwin.so pyrealsense2.so
$ ln -s /usr/local/lib/pybackend2.cpython-37m-darwin.so pybackend2.so
```

cd **/usr/local/lib/python3.6/site-packages** は

```
$ python3
>>> import site; site.getsitepackages()
```
で確認したものに置き換えて下さい。

また、cpython-〇〇m-darwin の〇〇は環境によって変わるので、ファイル名を確認して変更して下さい。

# pyrealsense2 の確認

```
$ python3
>>> import pyrealsense2
>>>
```

# import 時にエラーが発生した場合
/usr/local/lib にある cpython-〇〇m-darwin の〇〇が CMake 時に指定したPython のバージョンと一致していないかもしれません。
その場合は、Finder で pyrealsense を検索し、Python のバージョン と一致する cpython-〇〇m-darwin が存在するパスを見つけ、/usr/local/lib の代わりにそちらを使用してください。(画像の場合、**/usr/local/lib/python3.8/site-packages/pyrealsense2**)
![pyrealsense.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242339/532db454-66e6-ce9e-3e69-54147c9c160c.png)

# 参考
[Mac + Python で Intel RealSense D415 を使用する](https://qiita.com/mizumasa/items/c6ca2c73fa86c9a5a39c)
ASO- App Store Optimization

![app-optimi-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452054/96bdb271-69ef-c556-a785-60c0628ff69e.png)

App store optimization services, this is another optimization services like SEO. In App store optimization, apps are optimized in such a way that they should top the list in play store or app store. App stores these days have million of apps. They have app for almost everything and a user prefer apps because they are easy to use and are very quick.
 
<b>Why app store optimization is needed?</b>

Suppose there is an E-commerce website, which deals in clothing range. They will ask a digital marketer for their website design and after website, next step will be giving SEO services. Now, when <b><a href="https://www.acsiustechnologies.com/seo-company-india.html">SEO India</a></b> has been done website with the help of key words will stay on top and now this E-commerce website sees that consumer are moving towards handy and mobile friendly thing that is better than any website, which we call an ‘application’. Now website is on top but our application which is more likely to be used is buried somewhere in the app store. So, fir that it needs app store optimization services and these services are highly recommended and also are in the high demand. 

<b>How to do app store optimization and which is the right company who do this?</b>

<b><a href="https://www.acsiustechnologies.com/app-store-optimization.html">App Store Optimization Services</a></b> require a perfect keyword research, app title, app description, reviews, logos, screenshot and publisher’s name.

This might sound easy but it is not. Everything in this needs a perfect optimization and it needs timely development. ACSIUS technology is one shop for all these things. They have SEO, Website development and what not.
Ruby on Rails コンテンツの一覧を昇順／降順 にするメソッドとkaminari ページネーションの実装

# 初めに
Ruby on Railsで作成しているブログのコンテンツ一覧などの昇順/降順にするメソッドとページネーションを実装するためのgem kaminariの実装メモです。

# 降順/昇順にするにはorderメソッドを使う
+ ```order```メソッドは、テーブルから取得してきたインスタンスたちを並び替えるメソッドである。

昇順の場合

```ruby:contents_controller.rb
# 省略
def index
  @contents = Contents.all.order("id ASC")
end
```
降順の場合

```ruby:contents_controller.rb
# 省略
def index
  @contents = Contents.all.order("id DESC")
end
```
+ ```all```メソッドを利用した場合、通常であればレコードはid順に取得されるが、上記のように```order```メソッドの引数として(“id DESC”)とすれば、レコードを逆順に並び替えられる。

+ また、```order```メソッドを利用する場合は、以下のように```all```メソッドを省略することができる。

```ruby:contents_controller.rb
# 省略
def index
  @contents = Contents.order("id DESC") # allメソッドを省略できる
end
```
# ページネーション(kaminari)の実装
+ kaminariをいうGemの一種をインストールすることによって実装可能。

#### 1. Gemfileの最後の行にkaminariを追記

```ruby:Gemfile
# (省略)
gem 'kaminari'
```
#### 2. bundle installを実行
```ruby:ターミナル
bundle install
```

+ 必ずローカルサーバーを再起動することを忘れずに。

# kaminari:pageメソッド
+ kaminariを導入すると、モデルクラスにpageメソッドが定義される。
+ このメソッドは、ページネーションにおけるページ数を指定する。
+ ビューのリクエストの際に```params```中にpageというキーが追加されて、その値がビューで指定した番号になる。よってpageの引数は```params[:page]```となる。

# kaminari:perメソッド
+ ```per```メソッドもpageメソッドと同様に、kaminariを導入することで使えるメソッドである。
+ 1ページあたりに表示する件数を指定する。
+ ```per```メソッドに引数をして渡した数字が、ページネーションが実装されたビューで1ページあたりに表示する件数になる。

上記２つのメソッドは以下のような記述方法になる。

```ruby:sample_controller.rb
変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page].per（ここに1ページで表示したい件数を入力)
```
contentsコントローラーのindexアクションに今度は投稿日時の降順で記述し、さらにページネーションを導入した記述をしてみると以下のようになる。

```ruby:contents_controller.rb
# 省略
def index
  @contents = Contents.order("created_at DESC").params[:page].per(5)
end
```
#  kaminari:paginateメソッド
+ ページネーションのリンクを表示したいときに使用するメソッド。
+ kaminariをインストールすると利用できます。paginateメソッドの引数は、コントローラで定義した変数を指定する。

viewには```<%= paginate(@contents) %>```と記述すればよい。

```ruby:contents.html.erb
<div>
  <% @contents.each do |content| %>
    # 省略
  <% end %>
  <%= paginate(@contents) %>
</div>
```

# 最後に
gemを入れると使える便利なメソッドがどんどん増えてとても便利。
積極的に使っていこうと思った。
esxi vmdkの高速コピー

自分用めも

# esxi vmdkの高速コピー

vmdkを普通にコピーすると重いので

copy先のディレクトリを作っておく


```

vmkfstools -i ../../esxdata20190524/es-lab-v7-2/es-lab-v7-2.vmdk /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/es-lab-v7-2.vmdk

```

でコピーする
[.]とかはエラーになったのでちゃんとパスを書かないとだめっぽい。


ほかのファイルはcpで普通にコピーするこんな感じ

```
cp -p es-lab-v7-2.nvram /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
cp -p es-lab-v7-2.vmdk /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
cp -p es-lab-v7-2.vmsd /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
cp -p es-lab-v7-2.vmx /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
cp -p es-lab-v7-2.vmxf /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
cp -p vmware.log /vmfs/volumes/59633b52-d8f1fd43-17ed-0025226f4f5e/es-lab-v7-2/.
```
VagrantのProvisionでバックグラウンドでファイル実行

## 概要
vagrant up時にバックグラウンドでファイル実行させたい時用のメモです。
vagrantのprovision時のバックグラウンドでのファイル実行はシェルのコンテキストで実行されるので、バックグラウンドで実行するためには、シェルのプロセスから切り離さないといけないとのことです。[公式](https://www.vagrantup.com/docs/cli/ssh.html#background-execution)より
上の公式ではnohupが例に挙げられてます。


## 結論
```
COMMAND > /dev/null 2>&1 & disown
```
起動によるstdoutのアウトプットがある場合は、これもターミナルに送られるため、/dev/nullに送ってdisownすることで起動が可能となります。

## 参考
https://unix.stackexchange.com/questions/134924/i-am-using-why-isnt-the-process-running-in-the-background
木の巡回配列から二分木を生成する

## 概要
二分木の深さ優先探索(DFS)には先行順巡回：pre-order, 中間順巡回：in-order, 後行順巡回：post-orderの[３通りの方法](https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)#%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2)がありますが、そのうち中間順巡回と先行（後行）順巡回の2つの配列が与えられれば、対象となる二分木を生成することができます。本記事ではin-orderとpost-orderの配列から二分木を生成する方法を紹介します。


## 方針
まず、pre-orderの場合は先頭の要素、post-orderの場合は最後尾の要素がrootになることに着目します。また、in-orderの配列をrootの要素の位置で分割した場合、左側の部分配列はrootの左の部分木、右側の部分配列はrootの右の部分木のそれぞれのin-orderになります。そこで下記の手順を再帰的に繰り返すことで、二分木を生成することができます。

1. post-orderの配列の最後尾をrootの値として取り出す
2. in-orderの配列を、rootの値の位置を中心に分割する
3. 左右に分割したin-orderの配列と、最後尾を除いたpost-orderの配列からsub-treeを生成し、それぞれrootの子ノードにセットする

## 実装例
```python
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def buildTree(self, inorder, postorder):
        # post-orderの最後尾をrootの値として取り出す
        rootVal = postorder.pop()

        # in-orderの配列を分割するため、rootValのindexを取得する
        rootIdx = inorder.index(rootVal)

        root = TreeNode(rootVal)

        # in-orderの配列をrootIdxを中心に分割し、左右の部分木を再帰的に生成する
        if len(postorder) > 0 and rootIdx < len(inorder) - 1:
            root.right = self.buildTree(inorder[rootIdx+1:], postorder)
        if len(postorder) > 0 and rootIdx > 0:
            root.left = self.buildTree(inorder[:rootIdx], postorder)

        return root
```

## 実行
```python
# 下記のような二分木を生成する
#    3
#   / \
#  9  20
#    /  \
#   15   7

inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]

root = Solution().buildTree(inorder, postorder)
```
GET /dana-na/../dana/html5acc/guacamole/../../../../../../etc/passwd?/dana/html5acc/guacamole/ HTTP/1.1とはなんだったのか

# なぜこの記事を書いているのか

ある日管理しているサーバに不審なリクエストがあり、Zabbixが検知。
調べてみるとある脆弱性を突いた(大規模な)攻撃である事が分かった。
ただし、調べる過程で日本語の情報がなく、海外サイトの翻訳を余儀なくされたので、今後同様のリクエストを受け取った誰かには簡単にいち早く安心できる情報を手に入れて欲しい。

# このリクエストは何か

https://twitter.com/XMPPwocky/status/1164875682553290753
最初に見つけたのはTwitterの投稿で、ここではPulseSecureにバグがあって情報取得される攻撃っぽい事を理解。
弊社ではVPNクライアントにPulseSecureを使っている事もあり、影響を受けるのか引き続き調べる。

https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-004411.html
こちらはJVNで公開されている脆弱性情報。
タイトルがPulseSecureではなく、PulseConnectSecureになっている。
調べてみるとどうやらPulseConnectSecureはVPNのアクセスポイントに使われるソフトウェアらしい。
で、あれば今回アクセスのあったサーバは**ただのWebサーバだったので**問題ないと判断。
弊社のVPNを管理している部門に問い合わせ、アクセスポイントも問題のないバージョンである事も確認でき、一安心。

# 意外と危険だったというお話

https://badpackets.net/over-14500-pulse-secure-vpn-endpoints-vulnerable-to-cve-2019-11510/
こちらのサイトで本件が詳しく記載されていたので、一部を引用する。
読み辛いのでGoogle翻訳結果も併記する。

原文
> On Thursday, August 22, 2019, our honeypots detected opportunistic mass scanning activity from a host in Spain targeting Pulse Secure “Pulse Connect Secure” VPN server endpoints vulnerable to CVE-2019-11510. This arbitrary file reading vulnerability allows sensitive information disclosure enabling unauthenticated attackers to access private keys and user passwords. Further exploitation using the leaked credentials can lead to remote command injection (CVE-2019-11539) and allow attackers to gain access inside private VPN networks.

Google翻訳
`2019年8月22日木曜日に、ハニーポットは、CVE-2019-11510に対して脆弱なPulse Secure「Pulse Connect Secure」VPNサーバーエンドポイントを対象としたスペインのホストからの日和見的な大量スキャンアクティビティを検出しました。この任意のファイル読み取りの脆弱性により、認証されていない攻撃者が秘密鍵とユーザーパスワードにアクセスできるようにする機密情報の開示が可能になります。漏洩した資格情報を使用したさらなる悪用により、リモートコマンドインジェクション（CVE-2019-11539）が発生し、攻撃者がプライベートVPNネットワーク内にアクセスできるようになります。`

原文
> Using data provided by BinaryEdge, we scanned 41,850 Pulse Secure VPN endpoints to ascertain which were vulnerable. On Saturday, August 24, 2019, our scans found a total of 14,528 Pulse Secure VPN endpoints vulnerable to CVE-2019-11510. No sensitive information was disclosed or recorded during our scans as we simply sent a HEAD HTTP request (unlike a GET request that downloads a file) to confirm the arbitrary file reading vulnerability was possible.

Google翻訳
`BinaryEdgeから提供されたデータを使用して、41,850 Pulse Secure VPNエンドポイントをスキャンして、どちらが脆弱かを確認しました。 2019年8月24日土曜日、当社のスキャンにより、合計14,528個のPulse Secure VPNエンドポイントがCVE-2019-11510に対して脆弱であることが判明しました。任意のファイル読み取りの脆弱性が発生する可能性があることを確認するためにHEAD HTTPリクエスト（ファイルをダウンロードするGETリクエストとは異なります）を送信したため、スキャン中に機密情報は開示または記録されませんでした。`

引用元には国別の脆弱性を持ったエンドポイントの数が表で記載されていて、それによると調査した段階ではアメリカに5010件、日本国内には1511件存在していたらしい。
今回アクセスを受けたのは私が見ているサーバの中では1台だけだが、無差別にリクエストを送っているのであれば、偶然被害を受けたエンドポイントも存在しそう。
また、この脆弱性を突いた攻撃方法は脆弱性の概念実証コードとしてWeb上に公開されているため悪用しやすい。
現に後日同様のリクエストが管理している別のサーバ宛てに届いていた。

今後も公開されているコードを悪用したリクエストは誰かの所に届くかもしれないが、そのサーバがPulseSecureのアクセスポイントでないのであれば、情報取得されていないと安心できる。といいなぁ。