OmniAICreator/Qiita-1.07M huggingface dataset:
C# 値の入出力について

##入力
ユーザーからの入力を受け取りたい場合は、Console.ReadLineを使います。

例：文字列を一行読み込む
string str = Console.ReadLine();

例：整数を読み込む
int n = int.Parse(Console.ReadLine());

例：実数を読み込む
double d = double.Parse(Console.ReadLine());
と簡単なものはあるが一体入力と出力だけでどれくらいあるか見てみた。

**Read()**
概要：標準入力ストリームから次の文字を読み取る。
戻り値：
入力ストリームの次の文字。または次の文字がない場合は-1。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。

**ReadLine()**
概要：標準入力ストリームから次の1行分の文字を読み取る。
戻り値：
入力ストリームの次の行。または次の行がない場合はNULL。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。
・System.OutOfMemoryException:返却された文字列にバッファーを割り当てるには、メモリが不足しています。
・System.ArgumentOutOfRangeException:次の文字行の文字数がSystem.Int32.MaxValueを超えています。

##出力
**Write(string value)**
概要：指定した文字列値を標準出力ストリームに書き込む。
**Write(int value)**
概要：指定した32ビット符号付き整数値のテキスト形式を標準出力ストリームに書き込む。
**Write(uint value)**
概要：指定した32ビットなし付き整数値のテキスト形式を標準出力ストリームに書き込む。
**Write(long value)**
概要：指定した64ビット符号月整数値のテキスト形式を標準出力ストリームに書き込む。
**Write(ulong value)**
概要：指定した64ビット符号なし整数値のテキスト形式を標準出力ストリームに書き込む。
**Write(bool value)**
概要：指定したBoolean値のテキスト形式を標準出力ストリームに書き込む。
**Write(char value)**
概要：指定したUnicode文字値を標準出力ストリームに書き込む。
**Write(decimal value)**
概要：指定した System.Decimal 値のテキスト形式を標準出力ストリームに書き込む。
**Write(float value)**
概要：指定した単精度浮動小数点値のテキスト形式を標準出力ストリームに書き込む。
**Write(double value)**
概要：指定した倍精度浮動小数点値のテキスト形式を標準出力ストリームに書き込む。
パラメーター：
value:書き込む値。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。

**Write(object value)**
概要：指定したオブジェクトのテキスト形式をを標準出力ストリームに書き込む。
パラメーター：
value:書き込む値またはNULL。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。


**Write(char[] buffer)**
概要：指定した Unicode 文字配列を標準出力ストリームに書き込む。
パラメーター：
buffer:Unicode文字配列。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。

**Write(char[] buffer, int index, int count)**
概要：指定した Unicode 文字の部分配列を標準出力ストリームに書き込む。
パラメーター：
buffer:Unicode文字の配列。
index:buffer内の開始位置。
count:書き込む文字数.

例外処理：
・System.ArgumentNullException:bufferはnullです。
・System.ArgumentOutOfRangeException:indexまたはcountが0未満です。
・System.ArgumentException:indexとcountの合計が指定する位置は、buffer内ではありません。
・System.IO.IOExcetption:I/O エラーが発生しました。

**Write(string format, object arg0)**
概要：指定した書式情報を使用して、指定したオブジェクトのテキスト表現を標準出力ストリームに書き込む。
パラメーター：
format:複合書式指定文字列
arg0:formatを使用して書き込む最初のオブジェクト。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。
・System.ArgumentNullException:formatはnullです。
・System.FormatException;formatの書式指定が正しくありません。

**Write(string format, object arg0, ～ object arg3)**
概要：指定した書式情報を使用して、指定したオブジェクトのテキスト表現を標準出力ストリームに書き込む。
パラメーター：
format:複合書式指定文字列
arg0:formatを使用して書き込む最初のオブジェクト。
 ↓
arg3:formatを使用して書き込む3番目のオブジェクト。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。
・System.ArgumentNullException:formatはnullです。
・System.FormatException;formatの書式指定が正しくありません。

**Write(string format, params object[] arg)**
概要：指定された書式情報を使用して、指定したオブジェクトのテキスト表現を標準出力ストリームに書き込む。
パラメーター：
format:複合書式指定文字列
arg:formatを使用して書き込むオブジェクトの配列。

例外処理：
・System.IO.IOExcetption:I/O エラーが発生しました。
・System.ArgumentNullException:formatまたはargがnullです。
・System.FormatException;formatの書式指定が正しくありません。


メッチャあった。。簡単な入出力だけでどんだけ～
参考資料
・C#の絵本
・Visual Statioのメソッド参照先
safari + vueで"Total canvas memory use exceeds the maximum limit"対応

safari + iPad OS 13で、"Total canvas memory use exceeds the maximum limit"くらいました。

こちらの記事を参考に解決。
https://qiita.com/minimo/items/b724c6793f45aca5e6f5
> safari(iOS12)で"Total canvas memory use exceeds the maximum limit"が出る場合の対処法

vueでtemplateで記載されたcanvasが解放されない場合があったので、beforeDestroyで解放してあげる。

```
  beforeDestroy() {
    const canvas = this.$refs["my_canvas"] as HTMLCanvasElement;
    canvas.width = 0;
    canvas.height = 0;    
  }

```
Linuxコマンドとディレクトリ構造

#Linuxコマンド備忘録

今日、習ったLinuxコマンドとディレクトリ構造をまとめます.

## 目次
* [動作環境](#動作環境)
* [ディレクトリ構造](#ディレクトリ構造)
* [コマンド](#コマンド)

---------------------------------------
## 動作環境
`ホストOS : macOS Mojave 10.14.6`
`ゲストOS : centOS Linux7 Kernel 3.10.0-1127.e17.x86_64`

## ディレクトリ構造
| ディレクトリ | 格納されているもの |
|:--|:--|
| bin | 必要不可欠（Essential）な基本コマンド。バイナリの略 |
| sbin | 管理（システム系）コマンド |
| usr | 各種コマンドやドキュメント |
| home | 一般的にはユーザのホーム。MacではUsers |
| var | 頻繁に更新されるデータ。logとか |
| etc | 設定ファイル |
| lib | ライブラリ |
| dev | デバイスファイル |
| media | リムーバブルメディアのマウントポイント |
| mnt | マウントポイント。Macの場合Volumes |

### usrディレクトリ

| ディレクトリ | 格納されているもの |
|:--|:--|
| bin | ほとんどの基本コマンド |
| sbin | 必要不可欠でない（Non-essential）管理コマンド |
| local | ユーザがインストールしたコマンド。だからHomebrewとかここなのね |
| share | 共有ファイル |


## コマンド

| コマンド | 説明 | オプション |
|:--|:--|:--|
ls	|ディレクトリ情報の表示	|-a システムファイル表示 <br>-l ロングフォーマット<br>-d 指定のディレクトリ情報のみ表示
cd	|ディレクトリの移動	
cp	|ファイルのコピー|	-i インタラクティブモード<br>-p ファイルの属性を維持<br>-R 丸ごとコピー<br>-v コピーされたファイル名の表示
mv|	ファイルの移動 |ファイル名の変更にも使えます。mv 元ファイル名 新ファイル名	
rm	|ファイルの削除	|-r ディレクトリとディレクトリ内の全てのファイルを削除。確認なしに全部消えちゃうので要注意です！
cat	|テキストファイルの内容を表示	|-n 行数表示
touch	|ファイルのタイムスタンプの変更。|ファイルが存在しない場合は空ファイルが作られる	
mkdir	|フォルダ作成	|-p 入れ子のフォルダを一気に作成
man	|マニュアルの表示	
whatis	|コマンドの簡単な説明を表示	
which	|コマンドの保存先を調べる	
type	|コマンドの保存先を調べる	|-a 全ての保存先を表示
apropos	|コマンドをキーワードで検索	
find	|ファイルの検索。find ディレクトリ名| -name ファイル名で検索できる。<br>※いろいろ便利な使い方があるので別途記事にします	-name ファイル名<br>-typeタイプ（d: ディレクトリ、f: ファイル、l: シンボリックリンク）<br>-mtime 変更日時（-3で3日前から現在、+3で3日前よりも前）<br>-sizeサイズ
cal	|カレンダーの表示	例）| cal 11 2018
date	|日付の表示	
pwd	|いまいるディレクトリの表示<br>（print working directory）
【Ruby on Rails】ストロングパラメータとは何か？　また記載方法は？


＊プログラミング超初学者のため、間違いは指摘頂けると大変ありがたいです。

# 記事の目的

Ruby on Railsでアプリケーション開発を行う際、何かと出てくるこいつ。
調べてわかった気になっては毎回わかってなくて悩まさせれたので、備忘のためにまとめておくものです


# 1.ストロングパラメータとは

「パラメータを受け取る際に、指定したキーを持つパラメータしか受けとれない様に制限できるもの」

端的にいうと上記の通りです。目的としてはセキュリティ向上のため、といった所でしょうか。


# 2.もうちょっと具体的に

「指定したキーを持つ」という制限がないとどうなるのでしょうか。
例えばユーザー登録機能を実装していて、登録時に名前、とメールアドレスを求められたとします。
この場合、こちら側が保存したいのは「userテーブルのnameカラム、emailカラムの情報」なのでしょう。

なのでフォームから送られてきたパラメータをうまくnameとemailカラムに保存される様に処理を行います。
ざっくり言うとこんな感じです。
この保存処理の際、簡単にいうと「指定したカラムの情報以外はうけつけませんからね」というのがストロングパラメータです。

例えば登録を行うユーザーに悪意があり、開発側がユーザー登録時に登録されたくないカラムのデータを送ってきた場合等を想定すると必要性がわかります。

善意のユーザーであれば「nameとemailを登録してね」という指示にはそれしか入力してこないでしょうが、悪意あるユーザーであれば「ついでに他人のアカウント情報を閲覧できる権限も自分のレコードに追加しておくね」とかができてしまうわけです。

仮にそんなことをやってきたとしても、ストロングパラメータで「いやnameとemail以外は知らんし」と言っておけば跳ね除けられるわけですね。強い。確かにストロング。


#3 各種メソッドを含めた書き方と考え方

### 3-1 基本的な書き方

MVCの流れの中で、それぞれのメソッドがどういう役割を果たしているのか記載していきます。


これはチャットシステムでのメッセージ送信時のcreateで使おうとしてる例です。

```ruby:message_controller.rb
private
  def message_params
    params.require(:モデル名).permit(:カラム名1,:2,,,).merge(カラム名: 追加したいデータ値)
  end
```
それぞれの中身について説明していきます。




### 3-2 require(:モデル名) メソッド

ここにはモデル名を記載します。**なんの？**、という所なんですが、考え方としては**今回登録したいのはどのテーブルのレコードなの？**という見方です。
今回はmessageをcreateしようとしてるので、キーとしてmessageモデルを使用するわけです。
僕は最初モデル名と丸暗記していて、複数のモデル情報を受け取るパラメータで両方ここで指定するもんだと思ってました。
あくまでこのアクションでcreateしたいテーブルを管轄するmodelを指定するわけですね。
これを踏まえ、上記のコードは

```ruby:message_controller.rb
private
  def message_params
    params.require(:message).permit(:カラム名1,:2,,,).merge(カラム名: 追加したいデータ値)
  end
```
と記載することができます。




### 3-3 .permit(:カラム名1,:カラム名2,,,)　メソッド

こちらがストロングパラメータの説明で記載した、**「どの値を許可して受け入れるか」**を記載する箇所ですね。
根幹の機能ですしpermitって英語なのでめちゃくちゃわかりやすいかと思います。
今回、メッセージを受け取るにあたっては文章の内容をcontentとして受け取るか、画像がアップロードされた場合はimageとして受け取るかの二つのみを指定したいと思います。

踏まえて表記すると、コードは以下の通りになります。

```ruby:message_controller.rb
private
  def message_params
    params.require(:message).permit(:content, :image).merge(カラム名: 追加したいデータ値)
  end
```



### 3-4 .merge(カラム名: 追加したいデータ値)　メソッド

ここです。ここが個人的に**おお確かにだ**となりました。プチアハ体験。
今回のメッセージテーブルには、誰が投稿したメッセージかを識別する「user_id」カラムが存在します。
当然、メッセージをcreateする際にそちらにもデータを保存したいのですが、その値は別にフォームでユーザーに記入してもらうわけではありません（ユーザーからフォームにのっとってパラメーターで送信されてきるわけではありません）

僕らがログイン情報から引っ張ってきて登録すればいいわけです。
この考え方自体は別にストロングパラメータとは関係ありません。
ありませんがストロングパラメータはそもそも**「パラメータで受け取った値をどの程度許可するのか？」**という処理ですから、パラメータ外の値を受けいれることはできないんじゃ？というのが僕の素朴な疑問でした。

ちゃんとあるんですね、mergeメソッドが。
まとめてしまうとmergeメソッドは、「直接的にユーザーから受け取ったparamsにないが、レコード作成時に追加したい値はmergeメソッドで追加しとくと合わせてそれも処理しちゃうよ」ってことですね。

ほんとメソッドってすごい。痒いところに手が届く。

そんなこんなを踏まえてログインユーザーのidを追加する様にコードを記載すると

```ruby:message_controller.rb
private
  def message_params
    params.require(:message).permit(:content, :image).merge(user_id: current_user.id)
  end
```

となるわけです（gem deviseを使用しています)



# まとめ

ストロングパラメータは、セキュリティ向上の観点から受け取るパラメータの種別を指定するもの。
**require → どのテーブルに関する情報？**
**permit → 受け取りたい値の指定は？何を?**
**merge → 他から追加しときたい値は?どこに何を?**

という感じで指定することができる。

いざ文にするとあやふやなことばっかだ、、、ご指摘いただければ幸いです、、、
MyBatisで忘れがちなこと個人的なまとめ

[MyBatis](https://mybatis.org/mybatis-3/ja/index.html)は比較的自由にSQLが組めて便利なORマッパーなので個人的にはよく使うが、たまに使うと忘れがちなことが色々あるのでその際の備忘録としてまとめてみました。

#ヘッダ明細型のデータを扱う
## SELECT系
ヘッダテーブルと明細テーブルでが紐づいているデータを1つのmapperでとってくるときのMyBatisの設定ファイルとSQLの書き方。
→ [MyBatisでヘッダ明細型のデータを扱う](https://kumasoft.blogspot.com/2020/04/mybatismaster-detail.html)

ページネーション用にデータをとってくるときなど行範囲を指定して取得するが、MyBatisのAPIでやろうとすると想定外の行が返ってくる、その回避方法。
→ [MyBatisでヘッダ明細型のデータを扱う（行範囲を指定）](https://kumasoft.blogspot.com/2020/04/mybatismaster-detail.html)

## INSERT系
ヘッダテーブルと明細テーブルでが紐づいているデータを1つのmapperで書き込むときのMyBatisの設定ファイルとSQLの書き方。
→ [MyBatisでヘッダ明細型のデータをINSERTする（自動採番もする）](https://kumasoft.blogspot.com/2020/06/mybatisinsert.html)

#そのほか
他にも順次追記していきます。
php.iniの上限値をなくす

#php.iniのmemory_limitについて
phpで一回の処理でデフォルトの上限値を超えると,

```
 Allowed memory size of 268435456 bytes exhausted
```
こんな感じのエラーが出ます。
なので、/usr/local/etc/php/php.iniを開いて、

```
memory_limit = 256M　//この部分を変える
```
```
memory_limit = -1
```

`-1`にすると処理の上限を外せるみたいです。
【Python】Pythonを始めるにはまずはPythonをしっかり使えるようにしないとね

# 結論

MacにPythonをインストールして、Pythonを使えるようにする。
MacはPython２系が元々インストールされているが今回はPython３系をインストールする。

## 背景

Pythonを始めるにはまずはPythonを使えるようにしなければならない。プログラミングを始めるにあたって一番はじめにつまずくのが環境構築。これからPythonを始めたいと思っている人の参考になるように手順を書きたいと思ったため。初心者向けのため仮想環境にインストールするなど複雑なことは考えない。

## 全体の流れ

① コマンド操作を覚える
② Pythonをインストールする


## コマンド操作を覚える

Pythonをインストールする前にMacのコマンド操作を覚えること。
これが少しできるだけでプログラミングも楽しくなる。

```
ls　　　　# フォルダ内を表示する
ls -a　　# 隠しファイルも含めファイルやフォルダを全て表示する
cd　　　　# フォルダを移動する
pwd　　　# フォルダのパスを表示する
touch　　# 空のファイルを作る
mkdir　　# フォルダを作る
mv　　　　# フォルダ・ファイルを移動する
cp　　　　# コピーする
rm　　　　# ファイルを削除する
rm -r　　# フォルダを削除する
open　　　# ファイルを開く

```

とりあえずこれだけ覚えておけばなんとなく操作できると思う。

## Pythonをインストールする

1. 公式サイトからPythonをダウンロードする。

https://www.python.org/downloads/

無事にインストールできたら下記のコマンドをターミナルに入力する。
インストールしたPythonのバージョンが表示されればOK。

```
python3 --version

```

2. PATHを設定する（PATHを通す）

.bash_profile（ホームディレクトリの直下に隠しファイルになっている）を確認する。
下記のような内容が記載されているはず。なければファイルを作成し、同じように書く。（PATHを通す）

```
# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

```

.bashrcに下記を記載する。なければファイルを作成し、同じように書く。

```
alias python=python3
alias pip=pip3

```

さらに、.bash_profileに下記を追記する。

```
#.bashrc読み込み用
source ~/.bashrc

```

これでPATHを通すことができた。
MacではPython２系がインストールされているので、PATHを通すと今後の開発がスムーズになる。
いちいちPython３を入力しなくてもPythonで実行できるようになる。

## まとめ

プログラミングではじめにつまずくのが環境構築だ。PATHを通すっていうところでつまずくと思う。今回は細かい内容は書いていないが、とにかく手順どおりにやってみてほしい。これができれば、Pythonを始められる。


## 参考にした情報

- [Macのターミナルコマンド一覧（基本編）](https://qiita.com/ryouzi/items/f9dee1540a04a0bfb9a3)
- [【Python3】まっさらなMacにPythonの最新バージョンをインストールする手順まとめ](https://tipstour.net/python3-install-on-mac)
Emacs内部でshellを複数起動する

emacs内でshellを起動する際に

`M-x shell`

で起動していましたが、これでは単一shellしか開けません。

<img width="359" alt="スクリーンショット 2020-05-28 18.28.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/da85e78d-0ac2-301a-8ede-cb6a0e0eb855.png">


複数のshellを開きたい場合は

```
C-u M-x shell
```

👆上記を実行すると
`Shell buffer (default *shell*<2>):` などと表示されるので、選択します。
`*shell*<2>`のバッファ名で開きます。

<img width="283" alt="スクリーンショット 2020-05-28 18.31.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/7b4ad26e-0c7f-d9e3-f9df-3587206104eb.png">

2つ以上のshellを開くことができました👏
(画像は4つ目のshellです)
Django GirlsチュートリアルでつくったものでDockerfile作成

# 環境
macOS

# Dockerfileの作成

[Django Girlsチュートリアル](https://tutorial.djangogirls.org/ja/)でつくったもの

```console
$ ls 
blog            manage.py        myvenv 
README.md        db.sqlite3        mysite            requirements.txt
```

[Docker Hub](https://hub.docker.com/)で使いたいイメージを探します。
公式のものなど、なるべく信頼できるイメージをつかいます。

元になるイメージはpython:3.7-slim-busterを選びました。
Django起動時に打ち込んでいるコマンドを
Dockerfileに書き込んでいきます。

```
$ vi Dockerfile 
```

```Dockerfile
FROM python:3.7-slim-buster 
COPY . /app/ 
WORKDIR /app 
RUN pip3 install -r requirements.txt 
RUN python3 manage.py collectstatic --noinput 
CMD python3 manage.py runserver 0.0.0.0:8000
```

# Dockerの構築

任意でイメージ名やタグなどの指定をして
buildしてみます。

```console
$ docker build -t [イメージ名]:[タグ] . 
例えば 
$ docker build -t djangogirls:0.1.0 .
```

イメージの一覧を表示させます。

```console
$ docker images 
REPOSITORY        TAG          IMAGE ID             CREATED              SIZE 
djangogirls              latest        53a38ee83c1a      24 minutes ago 
```

## ローカルで何か走っていないか確認👀

**Dockerを走らせる前に**
心当たりがある場合は、ローカルで何か走っていないか確認します。
※特にローカルで走らせているものがなければ、以下読み飛ばしてもOKです。

```console
$ ps -ef | grep runserver 
  502  2437   479   0 土02PM ttys000    0:00.60 /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python manage.py runserver 
  502  2438  2437   0 土02PM ttys000   58:01.79 /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python manage.py runserver 
  502 26677 13920   0  3:55PM ttys003    0:00.01 grep runserver
```

大まかに書くと

```
2437（子:Django）    479（親:shell） 
2438（子:Python）　  2437（親:Django） 
26677 13920 => いま検索したgrepコマンドが走っているので無視
```

shellは殺さず、2437を殺せば親のDjangoもろとも子の2438も死ぬので
ローカルで走りっぱなしでいたDjangoのrunserverをkillします。

```
$ kill 2437
```

killできたか確認。

```console
$ ps -ef | grep runserver 
  502 26680 13920   0  3:55PM ttys003    0:00.01 grep runserver
```

# Docker run

Dockerを走らせます。
※`djangogirls`は`Docker ID`でもOK。

```console
$ docker run -it --rm -p djangogirls
```

下記にアクセス

http://127.0.0.1:8000/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/665612d9-d275-27b4-3b2a-594636f37f9e.png)

できた👏

# Tips (.dockerignore)
全体的に重かったので.dockerignoreを作成し、無視するファイルを指定します。

```
$ vi .dockerignore 
```

```config:.dockerignore
myvenv 
db.sqlite3
```

`myvenv`は仮想環境なので不要です。
`db.sqlite3`はDockerに乗せるには今後重くなる可能性が高いので
もしデプロイする際にはMySQLなどを使っても良いかもです。
ちなみにDBをignoreで無視するとDockerを走らせた際に赤文字で

<font color="#ff0000">
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, blog, contenttypes, sessions. 
Run 'python manage.py migrate' to apply them.
</font>

このようにDBに問題ありなどと表示されます。
あえてignoreしている場合はスルーです。
Flask基本メモ

# はじめに
　私は、時々Flaskを使うのですが、使い方をよく忘れてしまうので、ここにメモをしておきます。

# レスポンスを受け取るまで
## インストール
　まず、Flaskをインストールします。以下のコマンドを打ち込むだけで良いです。

```shell
$ pip install Flask
```

## ファイル
　次に適当にサーバの動作を行うファイルを作ります。以下に示すのは、必要最低限の動作を行うものです。

```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "hello"

if __name__ == "__main__":
    app.run(debug=True)
```

## サーバの稼働
　そして次のコマンドをこのファイルが存在するディレクトリ上で打ち込みます。

```shell
$ python app.py
```

これで`http://localhost:5000`にアクセスするとhelloと帰ってくるようになりました。

# 基本の関数の使い方
## @app.route(URL, methods)
 これはその後に来る関数をリクエストが来た際に走らせるようにするラッパーです。リクエストを受け取る場合は必ず使います。引数はそれぞれ、
URL: リクエストを受け取るURLのroute
methods: リクエストのメソッド
使い方としては以下のようなものがあります。また、URLから直接変数を得る方法などもあります。

### 基本的な使い方
```python
# http://localhost:5000/hogeにGETリクエストを送ることで動く
@app.route("/hoge", methods=["GET"])
def hoge():
    # ここで処理が行われる
```

### URLから変数を取得する
FlaskではURLの文字列をデータとして取り込むことができます。例えば以下の例では、`http://localhost:5000/hoge/fuga`に対してGETメソッドを送ると、「hello! fuga」と返ってきます。

```python
@app.route("/hoge/<text>", methods=["GET"])
def hello(text):
    return "hello! " + text
```

## app.run(host, path, debug)
　ここではアプリの稼働を行います。それぞれの引数は、
host: アプリを稼働するipアドレス、デフォルトはlocalhost
port: アプリにアクセスできるポート、デフォルトは5000
debug: Trueの時はアプリ稼働時にデバッグ出力を行う

これらを使って、変更を加えるとしたら、以下のような感じになります。

```python
app.run(host="0.0.0.0", port=8080, debug=True)
```

 hostを上のように設定しておくことで、外部のデバイスからでもこのコードを走らせているPCのアドレスが分かれば、アクセスできるようになります。

# jsonの取り扱い
## リクエストで受け取る方法
　リクエストでjsonを受け取る時には、jsonモジュールを使用します。

```python
from flask import Flask
import json

@app.route("/", methods=["POST"])
def hoge():
    req_data = json.loads(request.data)
    return req_data["hoge"]
```

 json.loads関数を用いることで、jsonのデータを配列や辞書などのpythonで扱える形に変換しています。

## レスポンスで出力する方法
　レスポンスにjsonを含める場合には、Flaskのjsonify関数を使用します。

```python
from flask import Flask, jsonify

@app.route("/", methods=["GET"])
def hoge():
    res_data = {"json_data": "hogehoge"}
    return jsonify(res_data)
```
　基本的にはデータをjsonifyで包んで送るだけです。

# 最後に
　何か間違いや、足りない部分などがあれば教えていただけるとありがたいです。また、質問なども受け付けます。
ラズベリーパイ４でarduinoの開発環境を立ち上げた話

#ラズベリーパイ４でArduinoIDEを立ち上げた話

ラズベリーパイでArduinoIDEを使用したので方法を共有します

使用機材
ラズベリーパイ４　SDカード　汎用PC(windows)　USメモリ

まずはラズパイ用のOSを用意しました。
今回は2020/05/28現在最新であるbusterベースのraspbianを使用しました。

rasbianを用意した後ラズベリーパイを立ち上げて初期設定をしました
sshとvnc接続も有効にしておいた方が良いかもしれません。
この時点でraspbianをアップデートします。

コードリポジトリにもArduinoIDEが入っているようなのですが、
バージョン管理が面倒なので[公式サイト](https://www.arduino.cc/en/Main/Software)からダウンロードしました

ArduinoIDEの種類を選択するためにカーネルを確認しました
```$uname -a```
で確認すると
```Linux raspberrypi4.19.97-v7l ```
なので32bitで動いていることが確認できるのでArduinoIDEは
Linux ARM 32 bits
をダウンロードしました

WindowsPCから圧縮ファイルのままUSBメモリを使用してラズベリーパイに移動させました
ラズベリーパイでは/optに置きました

解凍用ソフトをラズベリーパイにインストールしました
```$sudo apt install xz-utils```
この解凍ソフトを利用して圧縮ファイルを解凍しました
```$sudo tar -C /opt -xf arduino-1.8.12-linuxarm.tar.xz```
※微妙にコマンドが間違っていたので訂正しました
シンボリックリンクarduinoを作成しました
```sudo ln -s Arduino-1.8.12 arduino```

ここからArduinoIDEをインストールしていきました
```$cd Arduino```
```$sudo ./install.sh```
```$./install.sh```
ここでエラーが出たがインストールできました
インストールが終了したらデスクトップにショートカットができました
メニューバーのプログラミングにもArduinoが表示できるようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/0f99643a-d349-5c36-43fe-822fbc5f9954.png)

今回はオリジナルボードに書き込みを行うために
スイッチサイエンス社の[FT231XS](https://www.switch-science.com/catalog/2499/)使用しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/a0340017-e949-9dae-f0fd-83171609a18c.png)

windowsで使用する際にはドライバソフトが必要そうなのですが
ラズベリーパイで使用する際にはドライバは不要でした
シリアルポートを確認すると
/dev/ttyUSB0
というポートを確認することができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/26b92ebc-3a86-eda4-3c2f-f9fbdc14a263.png)
WindowsではCOMという形で表示されますので少しだけ表示方法が違います

弊社オリジナルボードと接続して/dev/ttyUSB0のポートを指定すると
問題なく書き込むことができました

coming soon
EC-CUBE4で会員登録時にポイントを付与するカスタマイズ方法

以下のようにEventを作成することで会員登録時にポイントを付与するカスタマイズが可能です。

作成するファイル
`app/Customize/EventListener/EntryEvent.php`


```php:app/Customize/EventListener/EntryEvent.php
<?php


namespace Customize\EventListener;


use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Customer;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class EntryEvent implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    /**
     * EntryListener constructor.
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function onFrontEntryIndexComplete(EventArgs $eventArgs)
    {
        /** @var Customer $Customer */
        $Customer = $eventArgs->getArgument('Customer');

        // ポイントをセット
        $Customer->setPoint(100);

        // データベースに永続化
        $this->entityManager->persist($Customer);
        $this->entityManager->flush();
    }

    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'onFrontEntryIndexComplete',
        ];
    }
}
```
2層ニューラルネットワークでKaggle Titanicを解く

「[ゼロつく](https://www.amazon.co.jp/dp/4873117585)」を半分くらい読んでKaggle Titanicできそうだなと思ったのでNotebookを作ってみた。
機械学習で有名な手法であるディープラーニングを学ぼうとする人の足がかりになるといい。ディープラーニングとは層の多い（深い）ニューラルネットワークであるので、最も層の少ないニューラルネットワークはその基礎になる。

# コード解説
ノード数を入力層（第0層）で4、中間層（第1層）で30、出力層（第2層）で2としたニューラルネットワークhttps://www.kaggle.com/yusukemigitera/2layernet を解説する。

## ライブラリのインポートとデータ取得
```
import numpy as np
```
2層ニューラルネットワークを作るのにはNumpyのみを使う。

```
train = pd.read_csv("../input/titanic/train.csv")
test = pd.read_csv("../input/titanic/test.csv")
```
Kaggleの提供データはこのような階層に収められている。

## 欠損データの補完
以下のページを参考にして、ほぼ同じコードでデータの欠損値を補完した。
[【Kaggle初心者入門編】タイタニック号で生き残るのは誰？](https://www.codexa.net/kaggle-titanic-beginner/)
学習、推論で利用するデータの項目もこのページと同じPclass（チケットクラス）、Sex（性別）、Age（年齢）、Fare（料金）の4項目にした。

## 使う関数の定義
中間層の活性化関数として使う`sigmoid(x)`
出力層の活性化関数として使う`softmax(x)`
損失関数として使う`cross_entropy_error(y, t)`
数値微分のための`numerical_gradient(f, x)`
を定義している。
「ゼロつく」で紹介されたコードが公開されているhttps://github.com/oreilly-japan/deep-learning-from-scratch からコピーした。

## 2層ニューラルネットワークのクラス
`__init__(self, input_size, hidden_size, output_size, weight_init_std=0.01)`
重み（とバイアス）の初期値を正規分布の乱数（と0）で設定する。

`predict(self, x)`
入力データ`x`（行列）に対して`a = Wx +b`を計算し、活性化関数を通してから次の層へ渡す。
2層なのでこれを2回繰り返す。

`loss(self, x, t)`
`predict(self, x)`で推論した値と目標値との交差エントロピー誤差を返す。

`numerical_gradient(self, x, t)`
クラスの外で定義した`numerical_gradient(f, x)`を`W1`, `b1`, `W2`, `b2`で適用する。

## 学習
```
iters_num = 100  # 繰り返しの回数を適宜設定する
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.5 # 学習率
```
ハイパーパラメーターの設定。

```
network = TwoLayerNet(input_size=4, hidden_size=30, output_size=2)
train_loss_list = [] # これは損失関数の値が順調に減っていっているか確かめるため
```
インスタンスを作るときにノード数を設定する。

```
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
```
ミニバッチ学習のためランダムに(batch_size)個のデータを取り出す。

```
    # 勾配の計算
    grad = network.numerical_gradient(x_batch, t_batch)
    #grad = network.gradient(x_batch, t_batch)
    
    # パラメータの更新
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]
    
    loss = network.loss(x_batch, t_batch)
```
行列の偏微分で勾配を求め、その値に学習率を掛けたもので重みとバイアスの値を更新する。
勾配を用いて更新することにより、極小値から離れた傾きの大きな座標では大きく値を更新し、極小値に近い傾きの小さな座標では小さく値を更新することができる。

## 推論
```
y = network.predict(x_test)
```
テスト用データを`network.predict()`に入れるだけ。残りの処理は提出用にデータを整えている。
この辺はもう少しきれいな書き方があるかもしれない。

## CSVとして出力
右上のSave VersionボタンからSave & Run All (Commit)を選び保存する。
そのNotebookのページに移り、OutputからSubmit to competitionを押すと提出が完了しスコアが出る。

# 評価
![スクリーンショット 2020-05-28 20.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501205/8535f0ec-6e53-50d8-bdde-d9ef950e90ad.png)

簡単な作りとはいえスコアは低かった（正解率 64%）。重みの初期値を乱数で設定しているため同じコードでも出るスコアにはばらつきがある。
使う関数やハイパーパラメーター、重みの初期値などを変えれば改善できるかもしれない。
Nanについての備忘録。

#はじめに
これは自分用の備忘録なのでご了承を。

#Nanについて
Nanは不動点少数における考え方であり、異常な数値であることを表している。
欠損値という名前がついておるようだ。
イメージは、エクセルで式を計算したときにでるエラーでいいかな。
Noneではないことに注意する。

#Nanの性質
Nanには重要な性質がある。
性質には、以下のものがある。

・Nanを含む四則演算の結果はNanが返ってくる
・Nanの比較演算子は必ずFalseとなる

通常の計算とは結果が異なるため、注意が必要。

#numpyのisnan()関数
numpyに入っているisnan()はNanがあるかどうかを判定する関数。
そのため、if文などでこれを使うと、Trueが返ってくる。

#nansum()関数
欠損値を含む計算はNanが返ってきてしまうのだ。
けど、Nanを含む数値群を計算したい！という場合はnansum()を使う。
これを使うことで、Nanを除いた値の合計が計算される。
便利ねーーー。

#nan_to_num()関数
Nanを別のものに変えたいーーって時のための関数。
デフォルトでは、0に変更されて元のndarrayは変更されないみたい。
第一引数で変更する配列を指定して、第二引数で元の配列を保持するか指定、第三引数で置換する文字、数字を指定。
[VSCode] launch.jsonとtasks.jsonは使わない

# はじめに
VSCodeでC++の`ビルド＆デバッグ`するために、律儀に`launch.json`と`tasks.json`を書いてたんだけど、`CodeRunner`っつう拡張機能を使えば、もう書かなくていいんだ。

**CodeRunner**
https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner

# CodeRunnerとは

コマンドラインで行えるコマンドを言語ごとに割り当ててショートカットキーで簡単実行できちゃう拡張機能

複数のコマンドを続けて実行する時に特に威力を発揮する




## 設定

実行対象のファイル上でショートカットキー(`Ctrl+Alt+N`)を押すとCodeRunnerが実行される

```json:settings.json
{
  "code-runner.runInTerminal": true,
  "code-runner.executorMap": {
    "javascript": "node",
    "php": "C:\\php\\php.exe",
    "python": "python",
    "perl": "perl",
    "ruby": "C:\\Ruby23-x64\\bin\\ruby.exe",
    "go": "go run",
    "html": "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",
    "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
    "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
    "cpp": "g++ $fullFileName && ./a.out"
  }
}
```
Vue.jsでinputフォームの文字数制限をする

## 今回のゴール
- Vue.jsで実装するinputフォームで入力できる文字数を制限し、特定の文字数以上は入力できないようにする

## 実際のコード
### サンプル
CodeSandboxに実際に動くもの作りました。
https://codesandbox.io/s/input-form-chara-limit-o9qp1?fontsize=14&hidenavigation=1&theme=dark

``` vue
<template>
  <div id="app">
    <p>5文字以上入力ができないinputフォーム</p>
    <input type="text" v-model="inputText">
    <p>{{ inputText }}</p>
  </div>
</template>

<script>

export default {
  data() {
    return {
      inputText: ""
    };
  },
  watch: {
    inputText(inputText) {
      this.inputText = this.charaLimit(inputText);
    }
  },
  methods: {
    charaLimit(inputText) {
      return inputText.length > 5 ? inputText.slice(0, -1) : inputText;
    }
  }
};
</script>
```


watchによってv-modelで文字列`inputText`が新しく入力された時に、methodの`charaLimit`が動くようにします。
`cahraLimmit`では`inputText`が5文字より多い場合は文字列の末尾を削除し、そうでなければ入力された文字列をそのまま
returnして`inputText`に代入するようにします。

`inputText`が入力される度に文字列の末尾を削除するので実質的に、文字列が5文字より多い場合は`inputText`に値が入らなくなります。

## 所感
入力された文字のバリデーションは正規表現に任して、入力文字数は`slice`で対応すると簡単でした。

## 参考
- [Array.prototype.splice() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
- [フォーム入力バインディング — Vue.js](https://jp.vuejs.org/v2/guide/forms.html#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88)
- [算出プロパティとウォッチャ — Vue.js](https://jp.vuejs.org/v2/guide/computed.html)
【AWS】S3ストレージの種類についてのアウトプット

# はじめに
現在、AWSソリューションアーキテクトの学習をしております。
今回は、S3ストレージの種類(ストレージクラス)についてアウトプットしていきます。

# S3ストレージの種類

## S3標準

アクセス頻度の高いデータ向けのストレージクラス。

**特徴**

- イレブンナインの高い耐久性(99.999999999%の耐久性)
- オブジェクト作成時にデフォルトで選択されている


**用途**

- アクセス頻度が高いデータ(配信画像・映像、分析データなど)

## S3 Intelligent-Tiering

アクセス頻度を自動判別し、最もコスト効率のよいストレージクラスに自動的にデータを移動させるストレージクラス。

**特徴**

- 「高頻度」と「低頻度」のアクセス階層が組み込まれている
- 連続で30日アクセスされていないオブジェクトは自動的に「低頻度」のアクセス階層へ移動
- モニタリングと自動化のために料金が発生

**用途**

- アクセスパターンが変化するデータ
- 不明な存続期間が長いデータ


## S3標準-低頻度アクセス(S3標準 - IA)

アクセス頻度は低いものの、必要となった際にすぐに取り出せる必要があるデータに最適なストレージクラス。


**特徴**

- S3標準と同じ耐久性と性能
- S3標準よりも利用料は安い
- データを取り出すのに料金がかかる

**用途**

存続期間が長く頻繁にアクセスされないデータ

## S3 1ゾーン - 低頻度アクセス(S3標準 - IA)

複数のアベイラビリティーゾーンへの複製が不要なデータの保存に最適なストレージクラス。

**特徴**

- 一つのアベイラビリティーゾーンにデータが保存される
- 他のストレージクラスと比べて可用性は低い
- 「S3標準-低頻度アクセス」よりもコストを20%削減することができる

**用途**

- アクセス頻度が低いデータ(S3標準-IA)と同様
- 存続期間が長い重要性の低いデータ

## S3 Glacier

長期保管するデータ等、アーカイブ用途で利用するストレージクラス。

例えると、バックアップテープを別サイトに保存しておくといった感じになります。

**特徴**

- データ取り出し手続きが必要(数分～数時間)
- ストレージクラスの中で最もコストが低い
- 耐久性はイレブンナイン(99.999999999%)

**用途**

アクセス頻度が低いデータの長期保存


# S3ストレージクラス比較

|特徴  |S3標準  |S3 Intelligent-Tiering  |S3標準-IA |S3標準 1ゾーン - 1A  |S3 Glacier |
|---|---|---|---|---|---|
|耐久性:99.999999999  |〇  |〇  |〇  |〇  |〇  |
|複数アベイラビリティーゾーン  |〇  |〇  |〇  |×  |〇  |
|可用性設計  |99.99%  |99.9%  |99.9%  |99.5%  |99.99%  |
|取り出し料金  |なし  |なし  |発生  |発生  |発生  |
|取り出し手続き  |なし  |なし  |なし  |なし  |必要  |

# 用途まとめ
|ストレージクラス  |用途 |
|---|---|
|S3標準 |アクセス頻度の高いデータ(例:モバイルやゲームのアプリケーション、コンテンツ配信等)  |
|S3 Intelligent-Tiering  |未知のアクセスパターンのデータ、アクセスパターンが変化するデータ  |
|S3標準-IA  |アクセス頻度は低いが、必要に応じて取り出しが必要なデータ  |
|S3標準 1ゾーン - 1A  |オンプレミスデータ、容易に再作成可能なデータのセカンダリバックアップ  |
|S3 Glacier  | データのアーカイブ用 |

# 参考記事
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
[AWS CLIからS3ストレージクラスを操作する](https://dev.classmethod.jp/articles/manage-s3-storage-class-with-aws-cli/)
snowpack + scssからsnowpack CLIを知る

# snowpack + scss環境の構築

※この記事は手探りでsnowpack環境を構築しており、ベストなやり方ではない可能性があります

## 前提

snowpackの[公式](https://www.snowpack.dev/#create-snowpack-app-(csa))より、app-template-blankのテンプレートを使用しております

```zsh
npx create-snowpack-app app-blank01 --template @snowpack/app-template-blank
```

## Sass環境を整える

[公式](https://www.snowpack.dev/#sass)にある通りsnowpack.config.jsonのscriptに`"build:scss": "sass"`のbuildコマンドを追加します。

[sass](https://sass-lang.com/install)をインストールします

```zsh
$ npm install -D sass
```

## snowpack CLIについて

### コマンド
snowpackにはデフォルトでコマンドが用意されています（2020.05.24時点）

- `snowpack dev`
- `snowpack build`
- `snowpack install`

`dev`

一時的な開発環境を用意するためのコマンドです。開発する際はこのコマンドを実行するのが良いと思います。devコマンドは不要なBindをせずに素早く起動するように工夫されております。詳しくは[公式](https://www.snowpack.dev/#snowpack-dev)をご確認ください

`build`

バンドルされていないproduction用のファイルをbuildディレクトリにコピーします。これらはParselを通して実施されます。詳しくは[公式](https://www.snowpack.dev/#snowpack-build)をご確認ください

`install`

installコマンドはdev,buildコマンドに含まれているので自ら実施することはないでしょう。詳しくは[公式](https://www.snowpack.dev/#snowpack-install)を見てほしいのですが、使用しているESModuleを`web_modules`にインストールしています。これによりwebからimportできるようになっています。

### スクリプト

snowpack.config.jsonを見るとpackage.jsonと同じようにscriptが設定されています

```snowpack.config.json
  "scripts": {
    "mount:public": "mount public --to /",
    "mount:src": "mount src --to /_dist_"
```

snowpackのCLIには下記のTypeがあります。詳しくは[公式](https://www.snowpack.dev/#all-script-types)を確認してもらいたいので、ここでは簡単に紹介します

- build
- run
- mount
- proxy

`build`

build時に実行したいコマンドを設定することができます。`run`時には実行されません

`run`

起動時に１回だけコマンドを実行します。lintやscssなどを設定するのに最適です

`mount`

ビルド時にファイルのマウント先を設定するのに使います

`proxy`

Proxyを設定することが出来ます。開発時にAPIリクエストでのCORSを対策するなどに便利です。これはProductionビルド時には適用されません


## scssファイルを作成する

scssのトランスパイルを設定するために、`src`ディレクトリにscssファイルを作成します。ここでは`index.scss`とします

```src/index.scss
body {
  color: red;
}
```
※scssファイルの中身はエラーが出なければなんでも構いません

## snowpack + scss

snowpack.config.jsonにスクリプトを設定します。
上記の説明からrunコマンドに設定を書を書くと以下のようになります

```snowpack.config.json
  "scripts": {
    ...
    "run:scss,scss": "sass src/index.scss public/index.css",
    "run:scss,scss::watch": "$1 --watch"
  }
```

追加した１行目は、sassコマンドを実行しその出力をpublicディレクトリに指定しています。
２行目は、１行目のコマンドに対してsassの`watch`オプションを指定しています。

`::`

２行目のコマンドにある`::`と`$1`の詳細な説明は[公式](https://www.snowpack.dev/#script-modifiers-(%22%3A%3A%22))をご確認ください。
簡単に紹介すると、１行目のコマンドへのアドオンになり、`$1`は1行目のコマンドに置換されます。つまり以下のようになります。

```
sass src/index.scss public/index.css --watch
```

## 試してみます

ここまで設定したら`package.json`のスクリプト`start`を実行してみてください

```zsh
$ npm start
```

`npm start`は、`snowpack dev`を実行しています。
ブラウザが立ち上がったら、`src/index.scss`を変更してみてください。変更が確認できれば完成です。
JavaScriptを用いて非同期通信実装②

#とうとうajaxを使うよ
根幹であるajaxを使います。
そもそもどんなタイプがあるのかみていきます。
**type:HTTPの通信方法を書く。GETかPOSTの２種類しかありません。
url:リクエストを送信する先のURLを記述する。
data:サーバーに送信する値を記述する
dataType:データ送信される型を指定する**

```javascript
$.ajax({
      type: 'POST',
      url: '',
      data: ,
      dataType: 'json'
    })
```
データタイプは今回非同期通信なのでjsonを指定しています。
これが非同期通信で忘れてはならない手順です。
次はdoneとfailについて書きます。
Ruby と Python で解く AtCoder ARC080 D シミュレーション

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder Regular Contest D - Grid Coloring](https://atcoder.jp/contests/arc080/tasks/arc080_b)*
<font color="green">Difficulty: 855</font>

今回のテーマ、シミュレーション

内容は難しいところはないと思いますが、実装に手間がかかりそうな問題です。

```exsample2
1 2 2 3 3
4 4 4 4 3
5 5 5 5 5
```
与えられた数値で上から順に左右に塗りつぶせばOKです。
# Ruby Array
```ruby.rb
h, w = gets.split.map(&:to_i)
_ = gets.to_i
a = gets.split.map(&:to_i)
m = Array.new(h){Array.new(w, 0)}
y, x, lr = 0, 0, 1
a.each_with_index do |n, v|
  n.times do
    m[y][x] = v + 1
    x += lr
    if x == w
      y += 1
      x = w - 1
      lr = -1
    elsif x < 0
      y += 1
      x = 0
      lr = 1
    end
  end
end
h.times do |i|
  puts m[i].join(' ')
end
```
```join.rb
  puts m[i].join(' ')

  puts m[i] * ' '
```
最近知ったのですが、`join`は上記の様に書くこともできます。
# Ruby Class
```ruby.rb
class MASS
  def initialize(h, w)
    @h = h
    @w = w
    @m = Array.new(@h){Array.new(@w, 0)}
    @x = 0
    @y = 0
    @LR = 1
  end
  def draw(v, n)
    n.times do
      @m[@y][@x] = v + 1
      @x += @LR
      if @x == @w
        @y += 1
        @x = @w - 1
        @LR = -1
      elsif @x < 0
        @y += 1
        @x = 0
        @LR = 1
      end
    end
  end
  def out
    @h.times do |i|
      puts @m[i].join(' ')
    end
  end
end

h, w = gets.split.map(&:to_i)
_ = gets.to_i
a = gets.split.map(&:to_i)
m = MASS.new(h, w)
a.each_with_index do |v, i|
  m.draw(i, v)
end
m.out
```
今回の問題では、あまり有効ではないのですが、学習を兼ねて`class`を使用してみました。
コード長が倍近くになりましたが、実行時間は変わらないようです。
# Python
```python.py
from sys import stdin

def main():
    input = stdin.readline
    h, w = map(int, input().split())
    _ = int(input())
    a = list(map(int, input().split()))
    m = [[0] * w for _ in range(h)]
    x, y, LR, v = 0, 0, 1, 0
    for n in a:
        v += 1
        for _ in range(n):
            m[y][x] = str(v)
            x += LR
            if x == w:
                y += 1
                x = w - 1
                LR = -1
            elif x < 0:
                y += 1
                x = 0
                LR = 1
    for i in range(h):
        print(" ".join(m[i]))
main()
```
***Python*** のコード長が長いのは、半角スペースもカウントしているからでしょうか。

||Ruby Array|Ruby Class|Python|
|:--:|:--:|:--:|:--:|
|コード長 (Byte)|392|631|603|
|実行時間 (ms)|17|18|25|
|メモリ (KB)|2428|3836|3828|
# まとめ
+ ARC 080 D を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった
【GCP】役割の設定

https://cloud.google.com/billing/docs/how-to/billing-access?hl=ja
ここにそれぞれの役割がでている

お支払い→請求先アカウント管理→右上の管理→ここから登録できる

請求先ユーザで新しいアカウント登録してみた。
ログインし直すと、確かに作成したプロジェクトは確認できなかった。

![Screenshot from 2020-05-28 18:54:27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/799c5334-0b53-46cf-44bc-afec98c31bf0.png)


作成することは可能。

アップグレードしようとするとエラーになる。
※ちなみにアップグレードについては以下を参照
https://qiita.com/Brutus/items/22dfd31a681b67837a74

![Screenshot from 2020-05-28 18:56:44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5d8bf7ae-4081-2d14-fb60-196211ddf3fb.png)


お支払いから請求先アカウントを閲覧する権限もないので、エラーになってる。

あと、重要なのは、追加した請求先ユーザが作成したプロジェクトは
請求先アカウント管理者からはみれない	

![Screenshot from 2020-05-28 18:55:27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/41bbe3ea-d710-c37a-5c88-670385e07313.png)


でも、お支払いからプロジェクトがあることは見える。

![Screenshot from 2020-05-28 19:04:16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3309e6d9-32e7-bf92-1811-cfa53e410b14.png)


プルジェクトの管理は完全に分かれていることを理解する。
ロシア農民の掛け算をJavaScriptでやってみた

# ロシア農民の掛け算

いわゆる「ロシア農民の掛け算」をJavaScriptで実装してみました。

動作原理は、ネット上にもいろいろ詳しい解説がありますが、下記のような感じです。

1. 例題：34227 * 36070

2. 片方を２倍、片方を半分にする。
&nbsp;&nbsp;34227 * 36070 
= (34227 * 2) * (36070 / 2) 
= 68454 * 18035

3. 2.を繰り返していくのが基本だが、半分にする方の数が奇数だった場合はそのままでは半分にならないので、以下のように変形する。
&nbsp;&nbsp;68454 * 18035 
= 68454 * (1 + 18034) 
= 68454 + 68454 * 18034 
= 68454 + ((68454 * 2) * (18034 / 2)) 
= 68454 + 136908 * 9017

4. 136908 * 9017 の部分を3.と同様の手順で変形する。
&nbsp;&nbsp;136908 * 9017
= 136908 + 136908 * 9016
= 136908 + 273816 * 4508

5. 今度は 273816 * 4508 を2.と同様の手順で変形する。
&nbsp;&nbsp;273816 * 4508
= (273816 * 2) * (4508 / 2)
= 547632 * 2254

6. 半分にする方の数が 1 になるまで、2. 3. を繰り返す。

7. 変形後の式は足し算のみになっているので、足し算を実行する。
68454 + 136908 + 1095264 + 2190528 + 4381056 + 35048448 + 70096896 + 1121550336 
= 1234567890

![ロシア農民の掛け算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/a2d931ee-17eb-e34d-e3c3-79f1b7603bfa.png)

#ソース

```html:RussianPeasant.html
<html>
<head>
  <meta http-equiv="Content-Type" context="text/html; charset=UTF-8" />
  <meta charset="UTF-8" />
  <title>ロシア農民の掛け算。</title>
<script>

function doCalc() {
	var txtN1 = document.getElementById("txtN1");
	var txtN2 = document.getElementById("txtN2");
	var n1, n2, strResult;
	var vWork = [];
	var vOut = [];

	n1 = parseInt(txtN1.value, 10);
	n2 = parseInt(txtN2.value, 10);

	vOut.push("  " + n1 + " * " + n2);

	while (1) {
		if (n2 <= 1) { break; }

		if (n2 % 2 == 0) {
			n2 = n2 / 2;
		} else {
			strResult = "= ";
			for (let i = 0; i < vWork.length; i++) {
				strResult += vWork[i] + " + ";
			}
			vOut.push(strResult + n1 + " + " + n1 + " * " + (n2 - 1));
			n2 = (n2 - 1) / 2;
			vWork.push(n1);
		}

		n1 = (n1 * 2);

		strResult = "= ";
		for (let i = 0; i < vWork.length; i++) {
			strResult += vWork[i] + " + ";
		}

		if (n2 == 1) {
			vOut.push(strResult + n1 + " * " + n2);
			vOut.push(strResult + n1);
		} else {
			vOut.push(strResult + n1 + " * " + n2);
		}
	}

	var nResult = 0;
	for (let i = 0; i < vWork.length; i++) {
		nResult += vWork[i];
	}
	nResult += n1;
	vOut.push("= " + nResult);

	document.getElementById("result").innerHTML = vOut.join("\n");
}

</script>
</head>
<body>

<h2>ロシア農民の掛け算。</h2>
5桁 * 5桁 まで<br />
<input type="text" id="txtN1" value="34227" maxlength="5" size="7" oninput="value = value.replace(/[^0-9]+/i,'');" /> ×
<input type="text" id="txtN2" value="36070" maxlength="5" size="7" oninput="value = value.replace(/[^0-9]+/i,'');" />
<input type="button" value="計算" onclick="doCalc()" /><br />
<br />

<textarea id="result" rows="50" col="20" style="width:700px;height:400px;">
</textarea>

</body>
</html>

```
IT用語何それ選手権

##IT用語についてまとめてみる
文系出身の私が何それと思ったIT用語をまとめてみた。

##エビ、エビデンス
「証拠」のこと。

例文)
お客さんにエビ出しといてー。
意味)
お客さんに証拠を出しておいてね。

##RDP
「リモートデスクトップ」のこと。

例文)
RDPして、起動時間確認してみて。
意味)
リモートデスクトップして稼働時間を確認してね。

##cmd
「コマンドプロンプト」の略称。
コマンドを用いてPCの設定や操作等を行うためのツール。

例文)
cmdでpingは通るの？
意味)
コマンドプロンプトでpingコマンド発行して疎通できてるの？

##ホワイトリスト
アプリケーションの実行やWebサイトへのアクセスなどを制御する中で、安全だから許可してもいいよという接続をリストにしたもの。

例文)
ホワイトリスト追加しよっか。
意味)
安全な接続だからリストに入れましょう。

もっと他にもいろんな用語があるので思いついたら更新します。
ワンクリックでライブリロードを可能にするVScode拡張「LiveServer」のご紹介

FIRST PLAN株式会社のフロントエンドエンジニアtakeです。

**ピザは野菜が入っているので実質サラダです。**

さて、今回は私が普段から愛用しているVScodeの便利拡張を一つご紹介いたします。

#こんなやつ
[![Image from Gyazo](https://i.gyazo.com/886413298cc98eeb90dc693ac43da520.gif)](https://gyazo.com/886413298cc98eeb90dc693ac43da520)

#解説
御覧の通りファイルの変更を自動で反映してくれる便利な拡張機能です。
毎回リロードする手間が省けるので開発効率アップ。

普段の開発ではwebpack-devserverを使う方も多いかと思いますが、ちょっとしたものであれば環境構築の手間が省けるこちらで十分です。

ダウンロードは以下のURL、またはエディタの拡張機能から「Live Server」と検索してインストールします。
https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

※インストールが完了したらリロードして、拡張機能が有効になっているか確認してください。

今回は`index.html`の雛形ファイルを作り以下のコードで実行しました。

```html:HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>
```

使い方は、フォルダを開いてエディタ上の「Go Live」ボタンを押すだけ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642041/19c6d13d-82cb-0489-3388-4bb1802f1ac6.jpeg" width="800">

するとLive Serverがローカルサーバーを立ててくれ、自動でブラウザが起動します。
以降はライブリロードを自動で行ってくれます。

試しに`<h1>Hello, World!</h1>`の部分を`<h1>Hello Qiita!</h1>`に書き換えてみます。

すると・・・

[![Image from Gyazo](https://i.gyazo.com/886413298cc98eeb90dc693ac43da520.gif)](https://gyazo.com/886413298cc98eeb90dc693ac43da520)

変更が自動で反映されています！

**注意点**：
Live ServerはデフォルトでSassやTypeScriptをサポートしていません。
もし使用したい場合は別途でLive Sass Compiler等をインストールする必要があります。

#設定について
`setting.json`からデフォルトで起動するサーバー等の設定を変更できます。
作者のGithubに色々と載っているので、よければカスタマイズしてみてください。

**Github**
https://github.com/ritwickdey/vscode-live-server
Rubyでリスキーダイスを作ってみた

rubyの練習でハンターハンターに登場するリスキーダイスを作ってみた。
1から20の数字があり20が大凶です。

```ruby
def risky_daice
  array = []
  puts '何回振ろうかな'
  stop = gets.to_i
  puts 'ダイスを振るよ'
  while true
    deme = rand(1..20)
    num = array.push deme
    if deme == 20
      puts deme
      puts 'あーあ出ちゃった'
      p "#{num.count}回目で大凶がでた"
      break
    elsif num.count == stop
      puts deme
      puts 'そこでやめ'
      p "#{num.count}回振れたよ。また挑戦してね"
      break
    else
      puts deme
    end
  end
end
risky_daice
```
```ruby
-> % ruby risky_daice.rb

何回振ろうかな
20
ダイスを振るよ
16
12
4
1
12
8
18
19
15
2
16
5
3
5
5
3
20
あーあ出ちゃった
"17回目で大凶がでた"
```
本番の前に振るといいことあるかも？
VuexFireでバインドしたデータをcomputedやmethodsで使う

Nuxt.js+Firebaseの勉強を始めたばかりです。

前回： [Nuxt.js ＋ Firebase ＋ VuexFireでデータ表示をソートする](https://qiita.com/_takahito/items/eab37afc0397eb8ab394)

# やりたいこと
Vuexfireでバインドしたデータをcomputedやmethodsで使いたいです。

Webページにリストボックスを用意しています。リスト項目の内容をFirestoreで管理します。itemsへの設定はcomputedで行います。

# 環境

- Firebase 7.3.0
- Vue CLI 4.0.5
- Nuxt.js 2.10.2
- VuexFire 3.2.0

# 失敗したこと

例えば、Firestoreの構成は次のようにしておいて、

コレクション|ドキュメント| フィールド
:----------|:----------|:----------
pages      |(document) | title

pages/index.vueの `cumputed` で `...mapGetters({ pages: 'getPages' })` としておいたとします。 `template` の中で下記コードを書けばtitleフィールドのデータが表示されますよね。

```
<v-flex v-for="(page, i) in pages" :key="i"
        xs12 sm4 mb-2 pa-2>
  <v-card>
    <v-card-text>
      {{page.title}}
    </v-card-text>
  </v-card>
</v-flex>
```

ネットで調べると同様の記事が多く出てきますので、フロント技術に疎い私でもコピペすれば期待通り動かすことができました。

だから私は最初、computedやmethodsで利用するときも下記のようなコードで利用できるのではないかと考えました。しかしこれは失敗でした。

```:これではうまくいきません
for (let page in this.pages) {
  console.log(page.title);
}
```

この例では、pageには 0,1,2.. が入っているので、 `this.pages[page].title` でデータを取り出します。

```:これはうまくいきます
for (let page in this.pages) {
  console.log(this.pages[page].title);
}
```

# 私が実装したこと

コレクション|ドキュメント| フィールド
:----------|:----------|:--------------
categories |(document) | A001: カテＡ<br>A002: カテＢ<br>A003: カテＣ

```pages/index.vue
<template>
  <v-layout justify-center align-start row wrap>
    <v-flex xs12 sm9 mb-2 >
      <v-card>
        <v-card-text>
          <v-select
            v-model="selectedCategories"
            item-text="label"
            item-value="value"
            :items="categoriesList"
            label="カテゴリーを選んでください"
            return-object
          />
        </v-card-text>
      </v-card>
    </v-flex>
  </v-layout>
</template>

<script>
import { mapGetters } from 'vuex';
import { db } from '../plugins/firebase';

export default {
  data () {
    return {
      selectedCategories: { label: 'カテＡ', value: 'A001' },
    }
  },
  computed: {
    ...mapGetters({ categories: 'getCategories' }),
    categoriesList: function () {
      let arr = [];
      
      for (let i in this.categories) {
        let doc = this.categories[i];
        let keys = Object.keys(doc);
        for (let j in keys) {
          let key = keys[j];
          arr.push({ label: doc[key] , value: key });
        }
      }
      
      return arr;
    },
  },
  mounted () {
    this.$store.dispatch('setCategoriesRef', 
                         db.collection('categories'));
  },
}
</script>
```

```store/index.js
import { vuexfireMutations, firestoreAction } from 'vuexfire';

export const state = () => ({
      categories: [],
    });

export const mutations = {
      ...vuexfireMutations
    };

export const getters = {
      getCategories: (state) => {
        return state.categories;
      },
    };

export const actions = {
      setCategoriesRef: firestoreAction(({ bindFirestoreRef }, ref) => {
        bindFirestoreRef('categories', ref);
      }),
    };
```
Qiskit作業ログ

#Qiskitのインストール
[リンク](https://qiskit.org/documentation/locale/ja/install.html)を参考に, まずはQiskitのインストール.

```bash:仮想環境を作ってQiskitのインストール(ついでにpipもupgrade)
$ python -m venv qiskit
$ pip install --upgrade pip
$ pip install qiskit
```

[自分のアカウント](https://quantum-computing.ibm.com/account)から"Copy Token"でAPIキーを入手.
以下を`python`で行い、ローカル環境にAPIキーを登録.


```python:APIキーの登録
from qiskit import IBMQ
IBMQ.save_account('自分のAPIキー')
```

これで, `~/.qiskit/qiskitrc`にAPIキーの情報が登録される.

#Qiskitの事始め

[Quantum Native Dojo](https://dojo.qulacs.org/ja/latest/notebooks/3.2_Qiskit_IBMQ.html)に従って, チュートリアルを進める.

```python:自分のアカウント情報のロード
from qiskit import IBMQ, QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
from qiskit.qasm import pi
from qiskit.tools.visualization import plot_histogram, circuit_drawer
import numpy as np

provider = IBMQ.load_account()
```

以下のwarningが出てくるが、問題無いようなので進める.

```bash:WARNINGメッセージ
~/.pyenv/versions/3.8.1/lib/python3.8/site-packages/qiskit/providers/ibmq/ibmqfactory.py:192: UserWarning: Timestamps in IBMQ backend properties, jobs, and job results are all now in local time instead of UTC.
  warnings.warn('Timestamps in IBMQ backend properties, jobs, and job results '
```

```python:histogramをプロットする
plot_histogram(result.get_counts(qc))
```
以下のエラーが出たので, ```pip install matplotlib```

```bash:ImportError
~/.pyenv/versions/3.8.1/lib/python3.8/site-packages/qiskit/visualization/counts_visualization.py", line 104, in plot_histogram
    raise ImportError('Must have Matplotlib installed.')
```

エラーは消えたが描画できない。
python上で, 一から書いていけば```plot_histogram(result.get_counts(qc)).show()```)で描画される。
保存するのが手っ取り早そうなので、とりあえず以下で対処。

```python:plotの保存(Figとして格納されている)
fig = plot_histogram(result.get_counts(qc))
fig.savefig("example01.png")
```
【jQuery】ぺージのスクロールボタンを作りたい

ページの一番上や、特定の位置にスクロールさせるボタンを設置する際の
簡潔な手順をご紹介。

# 1. htmlでボタンを準備
今回はフッターの中に設置しました。


```html:sample.html
<div class="footer">
  <div class="footer__btn">
    Page Top
  </div>
</div>
```

# 2. 位置を固定する
スクロール中に隠れないように、「z-index」も調整しておきます。

```css:sample.css
.footer__btn {
  cursor: pointer;
  height: 80px;
  width: 80px;
  z-index: 10;
  position: fixed;
  bottom: 20px;
  right: 32px;
  background-color: red;
  line-height: 80px;
  text-align: center;
  font-size: 20px;
}
```

# 3. jsを準備する
ボタンのクリックイベントによって、ページの最上部までスクロールさせます。

```js:sample.js
var scrollTop = window.pageYOffset ;     //スクロール量を取得
  $(".footer__btn").on("click", function(){   //クリックした時に発火
    $( 'html,body' ).animate( {scrollTop:0}, 'slow' );  //ゆっくり一番上までスクロールさせる
  })
  $(".gy-btn").on('click', function(){
    $( 'html,body' ).animate( {scrollTop:1500}, 'slow' );
  })
```
___________________________
ヘッダーのボタン等で指定位置までスクロールさせたい場合は
scrollTopの値を変更します。

```js:sample.js
var scrollTop = window.pageYOffset ;     
  $(".other-btn").on('click', function(){
    $( 'html,body' ).animate( {scrollTop:1500}, 'slow' );
  })
```

_______________________________
以上で終了です。
ご覧いただきありがとうございました。
Git 使いそうなコマンド

# git clone

## クローンのときにリポジトリのフォルダ名を除外

```bash
git clone https://xxx.jp/git/project/repositoryname.git /opt/prj/app
git clone https://xxx.jp/git/project/repositoryname.git /opt/prj/app/
```

上記のように**末尾の引数にディレクトリを指定**するとリポジトリのフォルダが作られずに済む
末尾のスラッシュの有無はどちらでもよい


# 直前のコミットを修正(上書き)したい

```bash
git commit --amend
```

※pushする前のコミットを修正したいときのみ使用できる

## このコマンドの利点

もしこのコマンドが無かったら、コミットしなおした分、コミットの数が増える。
しかしこのコマンドは**直前のコミットを上書きするような形なので(コミットIDは変わる)、コミットの数が増えない**


## コマンドを使うタイミング

- 間違えてコミットしてしまった
- 作業し忘れたファイルの編集を行う
- 作業し忘れたファイルをaddする(追加し忘れたファイルもここでadd)
- **このタイミングで使う**

## このコマンドができないこと

**すでにコミットしたファイルを省くことはできない。**


## 直前のコミットのメッセージだけ変更したい

```bash
git commit --amend -m "コミットメッセージを変更しました"
```

■ 修正前のコミットメッセージの一部を変えたい場合
-mオプションを省いて実行することで、**修正前のコミットメッセージが入力された状態で**エディタが開く。
一文字だけ変えたい、等の場合はこちらの方が楽。

## 直前のコミットメッセージのままコミット修正をしたい

```bash
git commit --amend --no--edit
```

# git merge

```bash
git merge --abort
```
マージしたらコンフリクトが起きてたため取り消したい

# git reset
参考
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe

## hardオプション
```bash
git reset --hard HEAD
```
- リセットする対象は今いるブランチの最新の状態
- HEADの位置はそのまま
- インデックスとワーキングツリーが1つ前のコミットの状態に戻る


```bash
git reset --hard HEAD^
```
- リセットする対象は最新(直前)のコミット
- HEAD・インデックス・ワーキングツリーが1つ前に戻る
【備忘録】vmのwebclientで操作できない問題

##vmのwebclientで操作できない問題
chromeでwebclientに接続して、ログインすると以下のエラーが出力されて操作ができない

原因: Error: [$rootScope:inprog] http://errors.angularjs.org/1.3.2/$rootScope/inprog?p0=%24digest

ログイン => エラー => リロード => ログイン => エラー => リロード のループとなり、ESXi ホストの管理操作を行えなかった。

##解決策
firefoxを使えば回避できた。
chrome driverのバージョンエラー"Message: session not created: This version of ChromeDriver only supports Chrome version 81"について

環境：
mac OS Catalina
バージョン.10.15.4



chrome driverを毎日稼働させいますが、
ある日から突然下記のエラーメッセージが出て稼働しない現象が発生しました。

```zsh
Message: session not created: This version of ChromeDriver only supports Chrome version 81
```

原因として、
chrome driverが最近アップデートされversion.83に自動更新されていたことでした。

対応策として、
chromeのバージョンをダウングレードするということで、
アプリケーションをversion.81を再度インストールしましたが
自動更新され同じことの繰り返しの結果になりました。

なので、chromedriver側を変更することにしました。
しかし、一筋縄ではなかったので忘備録として記載します。

コマンドで、下記を入力してインストールし
version.83に更新されたことを確認しましたが改善されず。
```zsh
　pip3 install --upgrade pip chromedriver-binary
```

chromedriverの公式サイトからインストールしても改善されず。
[https://chromedriver.chromium.org/](https://chromedriver.chromium.org/)

結果として、homebrewを利用してインストールしたことを思い出し、
下記を実行

```zsh
brew tap homebrew/cask
brew cask install chromedriver
```

すると、メッセージで
"インストールしてるよ！！”って出るので、

```zsh
brew cask reinstall chromedriver
```
再インストールを実行しました。

そして、
seleniumを使用しようとしたら、
「"chromedriver"は開発元を検証できないため開けません。」
と表示されたので、
https://qiita.com/apukasukabian/items/77832dd42e85ab7aa568
こちらを参照させて頂き、無事解決しました。

その後は無事稼働しました。