OmniAICreator/Qiita-1.07M huggingface dataset:
(自分用)Flask_6(pythonからdbを開く、Mysql基本(phpMyAdmin))

- 今回はFlaskと騙りながら全くFlaskに触らん

# 項目
1. pythonからdbを開く
2. phpMyAdminでdbを作成
3. dbからデータを取り出してみる

# 1.pythonからdbを開く
- phpMyAdminの中の`mydb`と言うデータベースの中に、`players`というテーブルがあるとする↓<br>
<img width="207" alt="db.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649647/f1a06ced-7c3e-0e01-d1be-1cd77f5e7ab7.png">

```python:python
import pymysql

print("動いてる")

connection = pymysql.connect(
    host="localhost",
    db="mydb",
    user="root",
    password="",
    charset="utf8",
    cursorclass=pymysql.cursors.DictCursor
)

sql = "SELECT * FROM players"
cursor = connection.cursor()
cursor.execute(sql)
players = cursor.fetchall()

cursor.close()
connection.close()

for player in players:
    print(player["name"])
```
(ちょっと長くて読みにくい)

- これでplayersに入ってる`nameカラム(列)`をprintしている
- `import pymysql`でpython内でMySQLを使える様にして...
- `connection = pymysql.connect()`で`connection`にSQLへの接続情報を入れてるぽい<br><br>
 - `host="localhost"`でMySQLを動かす環境を決めている(自分のpcならローカル、AWSとかのサーバでも良い)<br>
 入れるのはホスト名とか調べれば出てくる気がする
 - `db="mydb"`でそのMySQLの中のdbを選択し
 - `user="root"`でルートユーザがMySQLに接続しますよと
 - `password="",charset="utf8",`パスワードは無し、文字コードはutf-8で読み込んでね
 - `cursorclass=pymysql.cursors.DictCursor`でDictionary形式で読み込める様になっている、Dictionary形式については調べてくれ!
<br><br>
- `sql = "SELECT * FROM players"`で`sql`という変数の中に実行したいSQLを入れて
- `cursor = connection.cursor()`で、`connection`に入れた接続情報を`.cursor()`によって`cursor`に入れて...
- `cursor.execute(sql)`の`.execute(sql)`で、`cursor`に入った接続情報によって接続されたdb内で`sql`に入ったコマンドを実行する
- `cursor.close()`、`connection.close()`この辺はなんか動かしてたのを閉じてる
- その後は読み込んだ情報を`player`に入れて、その中の`name`ってkey(Dictionary形式的な意味で)がついたデータをprintしている

```bash:ターミナル
$ cd <作業ファイルがあるディレクトリ名>
$ python <作業ディレクトリ名>
```
でターミナルとかに実行結果が正常に出れば完了

# 2.phpMyAdminでdbを作成
- インストールとかは省く、いつか書くかもしれない
<img width="589" alt="スクリーンショット 2020-06-22 6.45.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649647/d6f97980-f062-bf59-d1f0-6e718d542ac9.png">

- 普通にこうすればOK
- 文字コードは`utf8 general ci`が良いらしいが果たして...

# 3.dbからデータを取り出してみる
```sql:sql
-- 全てのデータを取り出す
SELECT * FROM players;

-- 一部のカラムだけ取得する
SELECT name, level FROM players;

-- 一部の行だけ取得する
SELECT * FROM players WHERE level >= 7;

-- 複数の条件を組み合わせる
SELECT * FROM players WHERE level >= 7 AND job_id <> 6;

--条件指定とカラム選択を組み合わせる
SELECT name, level FROM players WHERE level >= 7;
```
- **全てのデータを取り出すについて**
  - `SELECT *`により全てのカラムを指定し(`*`で全部ってなるよ)
  - `FROM players;`で、「どこから?」「playersから」と言っている
- **一部のカラムだけ取得するについて**
  - `SELECT`の後にカラム名を入れる事で取り出すカラムが選択可能(ここでは`name`と`level`)
- **一部の行だけ取得するについて**
  - `FROM ~~`の後に`WHERE`と条件式を入れる事で、任意の行が取り出せる
  - `WHERE`は`AND`や`OR`を使って複数の条件式を適用出来る

```sql:使える条件式一覧
a = b
a < b
a > b
a <= b
a >= b
a <> b -- aとbが違うということ
```

# 4.終わりに
- そろそろAWS借りたり環境整えたりでWEBアプリ作るぞー！！！！
qdmail_receiver.phpを利用されている方のアドバイスお願いします。

qdmail_receiver.phpをご利用の方へ

phpで受信メールをDBに取り込みたいと考えています。
2008年頃にリリースされているqdmail_receiver.phpがとても使いやすいようです。
php5バージョンが勇士によって開発され、php7へ対応させるtipも見つけました。

https://cyber-tenchou.com/tips/20180627/
では、
「まず必要となるphpファイルqdmail_receiver.phpは、Qdmailシリーズのgithub版です。PHP5.4対応からダウンロードする。qdmail_receiver.phpは、PHP5.4までしか対応していないので、これをPHP7.1に対応させるためにQdmailをPHP7.0に対応させるのREADME.mdを参考にしてコードを少し修正。」
という説明と共に、三カ所の修正をすることで、利用できるとのことです。

実装してみましたが、動きが見えません。

サンプルコードは、
http://hal456.net/qdmail_rec/sample1
ここに掲載されているものです。

エラーも出ないし、何から手を付けて良いのかさっぱり分かりません。
なので、こちらに掲載させていただきましたが、読まれる方もきっとアドバイスのしようがないかと思います。

PHP7.0版を作って試しましたし、Xサーバーでｐｈｐのバージョンを5.4.16に下げてみて試しましたが、何も起こりませんでした。

同じ苦労をされた方からのアドバイスあれば、よろしくお願いします。

目的は、
pop3でメールを受信し、
送信者、受信者、件名、本文、添付ファイル
を抽出し、mysqlのデータベースに保存したい
ということです。他の方法があれば教えていただければ幸いです。


テストを実行するには、こちらのtest.phpをお試しください。
test.php
※マークダウンで記述してみたのですが、乱れてしまう上、一部のコードが表示されませんでした。なので、消さざるを得ませんでした。テストしやすくできればよかったのですが。


その際に、includeするqdmail_receiver.phpは、以下のとおりです。
php7.0 対応のqdmail_receiver.phpです。
PHP5.4対応のgithub版をベースとして、
781行目と、
1210行目と、
1312行目に修正入っています。
コメントを入れてありますので、元のコードも分かると思います。

qdmail_receiver.php
※マークダウンで記述してみたのですが、乱れてしまう上、一部のコードが表示されませんでした。なので、消さざるを得ませんでした。テストしやすくできればよかったのですが。
vistaでquartus その9

#概要

vistaでquartusやってみた。
zundokoやってみた。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/26831752-449b-ccb9-7424-afb254631195.png)


#サンプルコード


```
module test2(input clk, input rst, output tx);
	localparam NEXT = 4'b0000;
	localparam DONE = 4'b1111;
	reg [7:0] r;
	reg [3:0] n;
	reg [7:0] char;
	reg [3:0] state = NEXT;
	reg send = 0;
	reg [23:0] cnt;
	wire clk2 = cnt[13];
	tx1 tx1(.clk(clk), .rst(rst), .send(send), .data(char), .tx(tx), .ed(ed));
	always @(posedge clk)
	begin
		cnt <= cnt + 1'b1;
	end
	always @(posedge clk2)
	begin
		send <= 0;
		if (ed)
		begin	
			if (rst == 0)
			begin
				state <= NEXT;
				r <= 234;
				n <= 0;
			end
			else if (state == NEXT)
			begin
				r <= r * 5 + 1;
				state <= 1;
			end
			else if (state != DONE)
			begin
				if (n == 4)
				begin
					case (state)
					1:
					begin
						char <= "d";
						state <= state + 1;
					end
					2:
					begin
						char <= "o";
						state <= state + 1;
					end
					3:
					begin
						char <= "k";
						state <= state + 1;
					end
					4:
					begin
						char <= "o";
						state <= state + 1;
					end
					5:
					begin
						char <= "k";
						state <= state + 1;
					end
					6:
					begin
						char <= "i";
						state <= state + 1;
					end
					7:
					begin
						char <= "y";
						state <= state + 1;
					end
					8:
					begin
						char <= "o";
						state <= state + 1;
					end
					9:
					begin
						char <= "s";
						state <= state + 1;
					end
					10:
					begin
						char <= "i";
						state <= DONE;
					end
					endcase
				end
				else if (r < 127)
				begin
					case (state)
					1:
					begin
						char <= "z";
						state <= state + 1;
					end
					2:
					begin
						char <= "u";
						state <= state + 1;
					end
					3:
					begin
						char <= "n";
						state <= state + 1;
					end
					4:
					begin
						char <= " ";
						n <= n + 1;
						state <= NEXT;
					end
					endcase
				end
				else 
				begin
					case (state)
					1:
					begin
						char <= "d";
						state <= state + 1;
					end
					2:
					begin
						char <= "o";
						state <= state + 1;
					end
					3:
					begin
						char <= "k";
						state <= state + 1;
					end
					4:
					begin
						char <= "o";
						state <= state + 1;
					end	
					5:
					begin
						char <= " ";
						n <= 0;
						state <= NEXT;
					end
					endcase
				end
				send <= 1;
			end
		end
	end
endmodule




```

以上。
初心者によるプログラミング学習ログ 352日目

#100日チャレンジの352日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
352日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日1日でやったこと⇩<br>●ブログ1記事作成<br>●プログラミング学習352日目　2.0h<br>・架空LP18日目1.0h(<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>)<br>・ipad版の制作物部分作成<br>・Udemy:フロントエンド講座1.0h<br><br>いろんな用事と雑務と疲れがたまっていて日曜なのにほぼ勉強できず<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1274796471104094208?ref_src=twsrc%5Etfw">June 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【C#/UWP】UWPの勉強を今から始めるのは待った方がいいのか？

最近、モダンなUIのWindowsアプリケーションが作りたくてUWPの勉強を始めました。
XAMLを使った設計思想や、Win32アプリケーション(WinForms)との仕様のギャップに苦しんだりしながら、色々調べていくうちに、こんな記事を見つけました。

[UWPアプリの洗練されたUIをWin32アプリでも ～Microsoft、「WinUI 3 Preview 1」を発表](
https://forest.watch.impress.co.jp/docs/news/1255558.html)

>***二分されたWindows開発の世界を再編・融合させる「Project Reunion」***
　Windows開発の世界はWindows 8のリリース以降、レガシーなWin32とモダンなUWP/XAMLに二分されている。UWP/XAMLアプリは美しいユーザーインターフェイスと現代的なセキュリティモデルを備えていたが、自由度に勝るWin32が好まれることも少なくなく、移行はなかなか進んでいない。先進的な機能はUWP/XAML/WinRTから導入されることが多いにもかかわらず、レガシーなWin32からは活用が難しいという点も課題となっていた。
>
　そこで同社は「Project Reunion」という取り組みを発表し、その両者の再融合を図ろうとしている。
>
「WinUI 3」はその最初のピースで、UWP/XAMLからUIレイヤーであるXAMLを切り離し、Win32アプリに解放する。逆にWin32からUWP（.NET）にもたらされるのが、「Chromium」ベースの新しい「Microsoft Edge」コントロール（WebView2）だ。この「WebView2」コントロールもOSとは切り離されており、特定のバージョンのWindowsに依存しない仕組みになっている。
>
　このように、OSに統合された古いAPIを切り離して新しいAPIに再編し、「NuGet」パッケージとして個別に導入できるようにするのが「Project Reunion」の意味の1つだ。これから開発される新規アプリは、「Project Reunion」を通じてWin32/UWP APIにアクセスすることになるだろう。C++、.NET（WPF/WinForms/UWP）、React Nativeのいずれの開発フレームワークからも統一的にアクセスできるほか、既存のアプリに最新の機能を導入したり、アップデートする際にも「Project Reunion」は役立つ。

公式ドキュメントにもありました。
https://docs.microsoft.com/ja-jp/windows/apps/winui/winui3/

![20200622_043915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358498/9770541c-0c7b-522c-b9e2-253b409f0332.png)
※`WinUI3.0 Preview1`は、v16.7から利用できるようです。（2020/06/22 現在の VisualStudio2019は、v16.6.2）

もしかしなくても近いうちにWinFormsアプリケーションで、Win10のモダンなUIを使えるってことですね。
***なんというタイムリーな！そして俺得な！***

UI目的でUWPを勉強し始めましたが、タイミングが悪かったようです。
いやむしろ、このタイミングで勉強を始めたからこそ知れた情報だったので良かったというべきだ！(/・ω・)/

なんにせよ気が付けてよかった:sunny:
MacでWindows製ゲーム(.exe)をプレイする方法について(結論:Parallels入れてください)

## 概要

Macで.exe拡張子のゲームを起動したい諸兄は多いと思うので、自分が試行錯誤して色々うまくやっているものを共有したいと思う

これを知っていればMacしか持っていない人でも安心してゲームがプレイできる

## おすすめする

- Parallels Desktop(VirtualBoxより軽い、Macのフォルダをそのまま共有して使える)
- RPGツクールのwwwフォルダがある作品に限り、CORS無効フラグを使って起動したChromeでindex.htmlを開く

## おすすめしない

- VirtualBox(重すぎる)
- EasyWine(Catalina以降で動作しない。サポート終了)

## 起動RTA

- Win10のisoをダウンロード
  - [Windows 10 のディスク イメージ (ISO ファイル) のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10ISO)
- BootCampの設定を行う
  - 右上の検索バーからBootCampを入力
- Parallels Desktopインストール、設定を行い起動
  - [Windows for Mac のダウンロード - Parallels Desktop 15 無償トライアル | Parallels](https://www.parallels.com/jp/products/desktop/trial/)
- 重いゲームをやるなら先にメモリ設定をデフォルトから緑色の範囲内で最大にする、そしてMac側のアプリケーションを可能な限り落とす
- 共有フォルダからWinにコピーし(しなくてもいい)起動

## Macのまま起動路線

### EasyWine

- Wineを使いやすくしたやつ 作者が情弱にしびれを切らしてサポート終了している
- Catalina以降のOSで動かないのでおすすめしない

### Unity製ゲーム

- フォルダ配下にhtmlが用意されているものがあればCORS無効でいける
  - よくわからんがセーブはされているらしい、ローカルストレージ？

### RPGツクール作品

- wwwフォルダがある新しいものであれば、wwwフォルダ配下のindex.htmlを開くことでゲームをプレイできる。セーブデータはChromeのローカルストレージに保存される(20個までしかセーブできない、注意。しかも削除できないくさい)
  - さらに言うとセーブデータは全ゲーム共通らしいのですぐスロットがいっぱいになって死ぬ
- 余談だがPixijsで動いているらしい(console.logの出力で確認できる)

Enigma VB Unpackerというやつで巨大なexeしかないファイルを解剖できるが、仮想化のほうが実行早いしそもそもこのツールもexeなので知らなくていいだろう

## 仮想Windows路線

### Parallels Desktop

[Windows for Mac のダウンロード - Parallels Desktop 15 無償トライアル | Parallels](https://www.parallels.com/jp/products/desktop/trial/)

- Virtual Boxと似た間隔で動かせてしかも動作がめちゃくちゃ軽快なすごいやつ
- BootCampの設定がしてあればそのままそれを流用して秒で環境が出来上がる
- Macのファイルを共有できてすぐWin側に移せる
- 今の所色々なゲームを起動しているが(Unity製の重いもの含め)カクつくことは殆どない

微妙なところ

- 普通にすごいのでお金がかかります。インストールして15日間無料です 試してみよう

### Virtual Box

重い
何をしても重い
IE検証すらまともにできない

### BootCamp

- MacにプリインストールされているWindowsを起動できるようになるすごいやつ
- Win10などの試用版のisoを公式サイトからアカウント認証してダウンロードすればある程度使える
- デフォルトの状態だと色々アレで使えない印象

微妙なところ

- デフォルトでインターネットが接続できない状態(Wi-Fiも使えない)なのでサポートソフトウェアをMacから外付けHDDやUSBに移し(USBフォーマットによっては無理)Windowsにしてから外付けからもってきてインストールが必要
- MacとWin間でファイルを共有できない
- 再起動が必要。だるい


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

### CORS無効でChromeを開く方法

参考リンク
[javascript - Disable same origin policy in Chrome - Stack Overflow](https://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome)

- 既にChromeを開いている場合はCmd+Qで閉じる。
- ターミナルから以下のコマンドを入力する(コピペなので、カスタマイズはできると思います)

```
open /Applications/Google\ Chrome.app --args --user-data-dir="/var/tmp/Chrome dev session" --disable-web-security
```

### RPGツクール作品でやたらLoadingエラーが発生する

- Windowsから来た「①」などのテキストがが「㈰」のような曜日に文字化けしている可能性が高いです。
- 以下を参照の上、内部フォルダを確認しaudio配下などの該当名称を置換すればある程度は動きます。
- エラーでパスは出ていると思うので、ある程度はこちらで修正できます。
- 手動でやりたくないから、そのうちNodeでスクリプト書くかも

[Windowsからやってきた(日)とか(月)とか(祝)の文字化けを、正しい番号で解釈するための一覧表 | kotaログ](https://www.kotalog.net/archives/4339)

### 古いRPGツクール作品が起動しない

- 古い作品はランタイムパッケージ(RTP)が必要
- ググってもリンクをたらい回しにされてよくわからない、古いものは削除、リンク切れになっている
- Internet ArchiveでDLリンクを直打ちしてそこそこ古い日付にすればDLできるよ
ここで差がつく cmake TIPS

タイトルが調子いけど、ひさびさにCMakeについて調べたついでのメモ代わりとして。
全部知ってたとか言わないで。

## cmake コマンドの実行

### ビルドシステムの生成 (`cmake ..`) **from 3.13**

`-S` と　`-B` オプションで、ソースツリーとビルドツリーの場所を指定できる。
`mkdir build;cd build; cmake ..` とかしなくていい。
ビルドツリーで指定したディレクトリが存在しない場合は自動的に作成される。

```bash
$ cmake -S <ソースツリー> -B <ビルドツリー>
```

_CI script ならこちらのほうが好まれそう_

### ビルドの実行 (`--build` オプション)

ビルドシステムに依存せずに、ビルドを実行できる。

```
$ cmake --build <ビルドツリー>
```

ビルドスクリプトなどでこの記述にしておくとビルドシステムを透過的に扱える。

_ターミナルで実行している場合は、`make` って叩いたほうが速いけどね_


### インストール先の変更 (`--install` と `--prefix` オプション)  **from 3.15**

`--install` オプションで、`make install` 相当のことができる。さらに `--prefix` オプションで CMAKE_INSTALL_PREFIX を上書きできる。

```
$ cmake --install <ビルドツリー> --prefix <インストールprefix>
```

_あの長い変数名を打たなくていいし、何よりビルドからやり直さなくていい。_

### ビルド時の実行コマンドを表示する

実行されるコマンドを確認したい場合、以下の2つの方法がある（Makefileのみで実機確認）

**方法1.** cmake コマンドでのビルドシステム作成時に`-DCMAKE_VERBOSE_MAKEFILE=1`を指定する。

```
$ cmake -B build -DCMAKE_VERBOSE_MAKEFILE=1
```

[この記事にあるように](https://qiita.com/termoshtt/items/539541c180dfc40a1189#further-reading) CMakeファイルに直接`set()` コマンドで記述してもよい。

**方法2.** make時に `VERBOSE`環境変数を設定する。(値はなんでもいい）

```
$ VERBOSE=1 make
```

### `find_package()` コマンドがパッケージを見つけてくれない

cmake コマンドでのビルドシステム作成時に `-DCMAKE_FIND_DEBUG_MODE=1`を指定すると、以下のコマンドの検索履歴が表示される。

- find_program()
- find_library()
- find_file()
- find_path()
- find_package()

## CMakeLists.txt の記述

### `find_package()` を `project()` の前に書かない



[StackOverflow: CMake on Linux: “target platform does not support dynamic linking”](https://stackoverflow.com/a/25844355/13115475)

_実機検証中に「お前のプラットフォームは実行時リンクをサポートしてないぞ」とか怒られてハマった。_

## 便利モジュール

### CMakeプロジェクトをダウンロード (`FetchContent`)　from 3.11

[FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) モジュールでは、GitなどのSCMや、httpでtar.gzで取得した CMakeプロジェクトを、**CMakeLists.txtで扱える形で(ここ重要)** CMakeLists.txtの中で利用できる。

> 似たような[ExternalProject](https://cmake.org/cmake/help/latest/module/ExternalProject.html) というモジュールが以前からあったけど、こちらはダウンロードしたファイルを CMakeLists.txt で扱えなかった（cmake コマンド実行時にはまだダウンロードされていない）ため、正直「**これ何に使うんだろう**」とか「**調査に費やした時間を返して**」とか思っていました。


`add_subdirectory("${foo_SOURCE_DIR}")`と実行すれば、fooプロジェクトのターゲットがそのまま使える。

_これが欲しかったんですよ。_
UiPath Dictionary型変数を使用したワークフロー開発（２）

#1.はじめに
[前回の記事](https://qiita.com/masaru9624/items/4bb469180430bbd76977)の続きです。
**DictionaryからDataTable化**する方法を解説していきます。

DictionaryからDataTableへ変換する機会が多いと思われますので、別のワークフローファイル（Xamlファイル）から、当該ワークフローを呼び出して使用した方が良さそうです。今回は、呼び出し元のワークフローからDictionaryを入力引数として受け取り、DataTableへ変換の上、出力引数としてDataTableを返す、という部品にすることを前提に解説します。

#2.ワークフロー図
UiPath Studioで作成するワークフローの引数、変数、シーケンスを以下に示します。

引数
<img width="739" alt="2020-06-22_02h03_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/5bc89a47-4b78-6beb-ff8a-588c19dec93d.png">
変数
<img width="737" alt="2020-06-22_02h04_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/3bdb663a-8c9b-ed8c-4805-cd3c5eb09faa.png">
シーケンス
![ディクショナリ_データテーブル変換部品.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/7bc90c29-e1e4-b1c5-d9fd-cef7d67c1352.jpeg)
#3.解説
##3.1 空のデータテーブルを作成
空のデータテーブルを新たに作成します。このデータテーブルは出力引数とします。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/68fd07c7-515c-b6ca-841d-44486886b53f.png)
##3.2 データテーブルにヘッダー（列名）を追加
出力引数「データテーブル」に対し、「繰り返し(コレクションの各要素)」を使用し、入力引数「ディクショナリ」のKeysの数だけ、ヘッダー（列名）を追加します。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/a357b254-c650-b8d3-63d2-2f6bec8919bb.png)
##3.3 データテーブルに属するデータレコード（Row）を作成
データテーブルに属する、新たな変数「データレコード」を作成します。
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/71a995d1-9ad2-65b7-b642-a2579935e562.png)
##3.4 データレコードの各列に値を代入
変数「データレコード」に対し、「繰り返し(コレクションの各要素)」を使用し、入力引数「ディクショナリ」のValuesの数だけ、値を代入します。列の位置は、インクリメント（カウントアップ）します。
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/67f72004-0c41-1faa-be6d-e5c7149677a0.png)
##3.5 データレコードをデータテーブルへ追加
値が格納された変数「データレコード」を、出力引数「データテーブル」へ追加します。
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526899/62e255b4-cbde-6234-e4a5-30e4a1c3a8c1.png)
#4.最後に
以上が、**DictionaryからDataTable化**する方法となります。
このような処理は何度も使用することになると思いますので、開発工数やテスト工数を削減するためにも、Xamlファイルのまま他のワークフローから呼び出すか、ライブラリ化することをおすすめします。

次回は、DataTableをCSV化し、マージ（統合）する方法について、解説したいと思います。
docker-compose up -d でsh: 0: Can't openと出たときに解決した時の備忘録。

docker-composeでシェルを動かす時にsh: 0: Can't openと出てきた時に確認する事

qiita記事[Vue.js & Django を Docker と組み合わせてSPA+APIサーバー環境をつくる](https://qiita.com/masa0209/items/50375039719def0df3b5)
今回はこの記事を参考にしてdockerを使って環境構築を進めていきます。

そこでタイトルの通り　sh: 0: Can't open　というerrorが頻発したのでそれの解決方法をまとめていきます。

1. そもそもdokercontainerに起動するファイルが入っていない。
2. volumesのパスが間違っている。


のどちらかだと思います。

1.そもそもdokercontainerに起動するファイルが入っていない。

原因の確認方法として

```
$ docker ps -a
```
でコンテナidを確認

```
$ docker commit -m exited コンテナid　sh
```

でコンテナ名を取得

```
$ docker run --rm -it コンテナ名　sh 
```

でコンテナ内に移動

移動後

```
$ ls
```

コマンドでファイルを確認。

で自分が移したいファイルがちゃんとコンテナ内にあるか確認。移っていなかったら、dockerfileを再確認。

２. volumesのパスが間違っている。

```docker-compose.yml
---------以下略---------
volumes:
      - docker-compose.ymlから移したいファイルの相対パス:dockercontainerの絶対パス
-----------------------
```
ここの設定がまちがえていると動きませんでした。

自分の場合は

```docker-compose.yml

version: '3'

services:
  
  front:
    build:
      context: .
      dockerfile: ./Dockerfile/front/Dockerfile
    command: sh /app/start.sh
    volumes:
      - ./front:/app/:cached
      - ./front/node_modules:/app/node_modules
    ports:
      -  "8080:8080"
```
このようなファイルを作って動かしていましたがエラーの連続でしたが
volumesのfrontの部分を自分の作ったアプリケーションと同じ名前にしたら問題なく動きました。
VirtualBox＋Vagrant＋AnsibleでLaravel開発環境を構築その弐

環境を作る度に色んなサイト見て調べてって・・・大変なので、コピペできるように纏めました。
ですが、別のミドルウェアなどに入れ替えたくなりました。

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# VM環境
* CentOS 7.x
* Nginx 1.x
* ~~PHP（PHP-FPM）7.3.x~~ → <font color="blue">PHP（PHP-FPM）7.1.x</font>
* ~~MariaDB 10.3.x~~ → <font color="blue">MySQL5.7.x</font>
* ~~Laravel 6.x~~ → <font color="blue">Laravel5.x</font>
* ~~リポジトリ~~ →　<font color="blue">要らない</font>
 * ~~Bitbucket~~
* IPアドレス
 * 192.168.56.105
* ユーザー/パスワード
 * root/vagrant
 * vagrant/vagrant
* VM名
 * CentOS7

# やること
* Ansibleで自動構築

# 前提
まずは下記従って環境構築する
[VirtualBox＋Vagrant＋AnsibleでLaravel開発環境を構築その壱](https://qiita.com/_bobtabo_/items/28741feef5a29e7f0275)

# VagrantのBox再作成
```
$ cd ＜Boxを作成したディレクトリ＞
$ vagrant halt
$ vagrant destroy
$ vagrant box remove CentOS7
$ rm -f CentOS7.box
$ rm -fdR .vagrant
$ vagrant package --base CentOS7 --output CentOS7.box
$ vagrant box add CentOS7 CentOS7.box
```

# Ansibleで自動構築
新たに設定ファイル作りました！
https://github.com/bobtabo/ansible2

# 環境の構築
```
$ rm -fdR ansible
$ git clone https://github.com/bobtabo/ansible2.git ansible
$ vagrant up
```
※参考
[【Ansible】Mysql5.7でrootユーザのパスワードを再設定etc...](https://qiita.com/da-sugi/items/03cf3a1bc434137f4c30)

# 動作確認
```
sudo vi /private/etc/hosts
★下記を点線内に編集
192.168.56.105 laravel6.local
---
192.168.56.105 laravel5.local
---
:wq
```

ブラウザで確認
http://laravel5.local/
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/3f735218-18a5-d1c0-d8dc-c433bf65cad7.png)
Twelve Factor APPについてのまとめ（後半）

# はじめに
https://qiita.com/ggg-mzkr/items/4576fe2815c36a4c30e9 の続きです。

# VII. ポートバインディング
* 外部のWEBサーバーを使用せず、WEBサーバー自体もアプリケーションに含める
* サービスの公開はポート単位で行えるようにする

PHPのアプリケーションはWEBサーバーとしてApacheやnginxを用いることが多いと思います。しかしそのようなアプリケーション外部のWEBサーバーを利用せず、アプリケーション単体でサービスが完結するようにするべきです。具体的な方法としては、PythonではTornado、RubyではThin、JavaやではJettyなどのWEBサーバーライブラリを依存関係に含めるなどをします。
このようにすることで、ポート単位でサービスが公開できるようになり、**アプリケーションが他のアプリケーションのバックエンドサービス**になることもできるようになります。 

# VIII. 並行性
* アプリケーションはステートレスなプロセスをにするべきである

負荷に対応する際、スケールアップをしようとすると、大きなコストがかかります。プロセスをステートレスな物にしておくことで、スケールアウトが容易になり、並列性を高めることができます。アプリケーションのプロセスの管理は、OSのプロセスマネージャーを用いて管理するべきです。

# IX. 廃棄容易性
* 起動・終了が即座に行えるべきである
* プロセスがクラッシュした場合にも対処できるように設計すべきである

アプリケーションの起動や終了が即座に行えると言うことは、アプリケーションのデプロイや、スケールアウト、スケールインのアジリティが高くなることに直結します。また、アプリケーションが終了の命令を受け取った時、何もせずすぐに終了するのでは無く、処理中のリクエストを返したり、ジョブをキューに戻すなど、終了しても問題ない状態になってから終了するべきです。

# X. 開発/本番一致
* 開発環境と本番環境のギャップをできる限り小さくする

伝統的なアプリケーションでは、開発環境と本番環境の間には、異なるツールが用いられる、編集されたコードがデプロイされるまでには長い時間がかかる、コードを書いていない人がデプロイを行う、と言うようなギャップがありました。Twelve Factor APPでは、使用するツールはできるだけ本番環境と一致させ、コードを書いた人が数分から数時間のうちにデプロイを行い、本番環境での動作をモニタリングします。
開発で使用されるツールの違いは、フレームワークなどが吸収してくれたりもしますが、わずかな非互換性の違いで本番環境では動かない、と言うこともあります。このようなことを考えると、多少手間でも本番環境と同じツールを用いた方が結果的には楽だったりします。

# XI. ログ
* ログはストリームとして標準出力に書き出す

ログは一般的にログファイルへ書き出されることを想像しますが、これは出力フォーマットの一つにすぎません。ログはアプリケーションのイベントを示しています。アプリケーション自体はこのイベントをストリームとして単に標準出力へ書き出すに留めます。このようにすることで、環境によってファイルへリダイレクトすることもできますし、ログ解析システムへ送ることもできるようになります。


# XII. 管理プロセス
 * 管理タスクのためのコードはコードベースへ含める
 * 管理タスクの実行はアプリケーションの依存に含まれていないツールを用いない

管理タスクとは、データベースのマイグレーションや、一回限り実行するスクリプトなどのことです。当たり前のことですが、これらを行うためのコードはコードベースへ含めるべきです。また、管理タスクをする時は、アプリケーションの依存に含まれていないけどこのライブラリ使っちゃおう！みたいなことをしてはいけません。もし使うのならば、そのライブラリも依存関係宣言マニフェストへ追加するべきです。
phpとjsの配列の型判定の違い

## phpの配列の判定
gettypeを使えば簡単に判定できる

```php5
$array1 = [1,2,3];
echo gettype($array1); // array
```

# jsの配列の判定

間違い. typeofを使うと判定はできるが、配列がオブジェクトになってしまう

```js
let array2 = [1,2,3];
console.log(typeof this.array2); // Object
```
正解. instanceofを使って、正誤を判定する

```js

let array3 = [1,2,3];
console.log(this.array3 instanceof Array); // true
```
何か間違いやアドバイスがあれば教えてもらえると幸いです。
自分が必要だと思ったvimコマンド集（随時編集予定）

# 自分が必要だと思ったvimコマンド集（随時編集予定）

# カーソル移動

| コマンド| 内容  |
|-----------|----------------|
0 | 行頭移動
$ | 行末移動
% | 対応する括弧に移動
V | 行単位の選択をするビジュアルモードに入る
Ctrl-v | 矩形選択をするビジュアルモードに入る
C | カーソル位置から行末まで削除して, インサートモードに入る
D | カーソル位置から行末まで削除
I | 行頭からインサートモードに入る
A | 行末からインサートモードに入る
>> | インデントを追加
<< | インデントを削除
= | 選択行のインデント修正
Ctrl-a | カーソル行上で, カーソル以降の最初に出現した数字をインクリメント
Ctrl-x | カーソル行上で, カーソル以降の最初に出現した数字をデクリメント
r[文字] | カーソル上の文字を[文字]に置換

# 中
| コマンド| 内容  |
|-----------|----------------|
ciw | カーソル位置にある単語を1つ削除して, インサートモードに入る
ci" | カーソル位置にあるダブルクォートを1つ削除して, インサートモードに入る
ci( | カーソル位置にある丸括弧を1つ削除して, インサートモードに入る
cit | HTMLタグの内部を削除して、インサートモードに入る
yiw | カーソル上の単語をコピー

# 選択
| コマンド| 内容  |
|-----------|----------------|
viw | カーソル上の単語を選択。
vi" | ダブルクォーテーションの内部を選択。
vit | HTMLタグの内部を選択。
GitBucketでプルリクエストテンプレートを設定する方法

# 動機
仕事でGitBucketをチームで運用しプロジェクト管理しているのですが、プルリクの概要メッセージルールがメンバーに浸透せず整いませんでした。(ルールドキュメントが別の場所にあるため)
そこでテンプレートを導入し、ある程度整えられないか検討しました。

# 簡単な検証環境(GitBucket準備)
自宅で検証するため、簡単に確認できるGitBucket環境を作りました。
前提条件として、dockerがインストール済とします。

~~~
docker run -d -p 8080:8080 gitbucket/gitbucket
~~~

- http://localhost:8080
- アカウントはroot/root

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/b665fe20-b45f-3486-6d8f-d9179589e069.png)

- 簡単に環境ができました。ポチポチとリポジトリを作っていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/7bed9b9c-dd88-0075-b818-40cd1ac4316c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/5ef27700-5ff9-9a90-d915-4218bf8012c1.png)

# プルリクエストのテンプレート作成
ファイル名を`pull_request_template.md`とし、ルートディレクトリに配置します。
**この名前と配置場所がポイントです。**
今回は[テンプレートサンプル](https://raw.githubusercontent.com/Covid-19Radar/Covid19Radar/master/.github/PULL_REQUEST_TEMPLATE.md)として`Covid-19Radar/Covid19Radar/`を参考にしてみました。

- GUIからサクッとmasterに追加してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/14610945-26a4-4faf-066c-1d6b4f8a90c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/0dd828d4-8d41-daff-b8fe-ef580e202b09.png)

# プルリクエストを作成しテンプレートを確認。
なにか適当なブランチをpushしプルリクエストを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/1cfef100-8ba5-ed67-ae55-f6970f9db928.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/8228265f-b713-0d74-9e17-7589508962cb.png)

- 無事テンプレートが生成されていました！プレビューで見てみるといい感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/a13616c9-7e8c-55f0-c7e2-8270e7fc7254.png)


- 検証から、プルリクエストテンプレートの導入はとてもハードルが低いことがわかりました。
- 品質向上にじわじわと効果がでると思いますので是非お試しくださいませ。



# 参考資料
https://help.github.com/en/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository
とりあえずblenderをインストールしてpythonで動かせるようになるまで

# blenderを使っていろいろ3Dモデルを作ってみたい

ただ、この際なのでpythonである程度自動でモデリングできたら楽しそうだななんて思いながら、blenderとpythonを導入してみる、メモ書きです。


## 環境
* macOS Catalina 10.15.2
* blender 2.83  

マシンスペック

* MacBook Air (13-inch, 2017)
* プロセッサ 1.8 GHz デュアルコアIntel Core i5
* メモリ　8 GB 1600 MHz DDR3
* グラフィックス Intel HD Graphics 6000 1536 MB

## blenderインストール

以下Blenderの公式HPから直接インストール。今まで2.79を用いていましたが、それに上書きをする形で2.83の最新verをインストールしています。

https://www.blender.org

## blenderを起動

blenderを起動します。そのままアプリケーション開いてもいいのですが、どうせなのでterminal上で開けるように設定しました。

blenderが存在するのはMacOSの場合、以下のパスになります。

```shell
/Applications/Blender.app/Contents/MacOS/Blender
```

ここにパスを通していつでも呼び出せるようにしました。
ちなみに、そのほかの初期設定ファイルやアドオンもContents直下のscriptsなどに入っています。

![スクリーンショット 2020-06-21 23.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522246/59a903f5-e20e-0f3e-0217-352a9db9c877.png)

こんな感じの画面が表示されました。
Blenderはデフォルトでは英語ですが、日本語に変更することもできます。
Edit → preferences → interface → Translation → Language

## blenderでpython

blenderもCUIで起動できたので、次にblender上でpythonを動かしてみる。
![スクリーンショット 2020-06-21 23.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522246/b7e4b911-0ebc-f0c1-8460-57bacfd592df.png)

タブの一つである「scripting」を選択することで、モデルのビュー画面は左上に、コンソール画面とエディタ画面が表示されました。

このコンソールにpythonのコマンドを打ち込むことでblenderをpythonで操作することができます。

試しに以下のコマンドでそれっぽく海の原型を作ってみました。

```python
import bpy

# オブジェクトの除去
bpy.ops.object.delete(use_global=False)
# 新規オブジェクト作成、これはplane (平面)
bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD')
# オブジェクトにモディファイアとしてOceanを追加
bpy.ops.object.modifier_add(type='OCEAN')
```

![スクリーンショット 2020-06-22 01.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522246/7fbd4b74-77b1-a970-9e5f-2f62c5e5b1e4.png)

これだけだと手動でモディファイア追加した方が早いですね……
まだまだ先は長そう。
## 参考

https://docs.blender.org/api/current
https://qiita.com/yassyskywalker/items/18e8541079bfae2af0e7
文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #4 Rails風味のRuby

#第4章 Rails風味のRuby
##4.1 動機
ヘルパーを作成する。いまのところヘルパーがなにかまったくわかっていない。
とりあえずヘルパーを作成すると、コードがシンプルになるっぽい。

**BEFORE**
><title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>

**AFTER**
><title><%= full_title(yield(:title)) %></title>

##4.2 文字列とメソッド
ここではrails consoleでいろいろな動きを試している。
簡単な計算や文字列の結合などだ。

`puts`は文字列を出力したいときに使うらしい。
（ちなみに「put」の三人称単数現在形ではなく、「put string」の略らしい。）

そして、`print`も同様に文字列を出力するときに使う。
`puts`との違いは改行コードが挿入されるかどうかっぽい。

演習。

>city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
>>割愛

>先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
>>割愛

>上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
>>タブの特殊文字は「\t」っぽい。

>タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
>>割愛

次に、各メソッドを使っていく。

`length`は文字列の文字数をカウントする。
`empty?`は空かどうかを返す。
`to_s`はオブジェクトを文字列に変換する。

演習。

>"racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
>>"racecar".length

>reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。
>>"racecar".reverse

>変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
>>s == s.reverse

>リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
>>nil


railsコンソールでは、メソッドの定義もできるらしい。

>リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。
>>\>>def palindrome_tester(s)
>> if s==s.reverse
>>  puts "It's a palindrome!"
>> else
>>  puts "It's not a palindrome."
>> end
>>end
=> :palindrome_tester

>上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。１つ目は回文である、２つ目は回文でない、という結果になれば成功です。
>>palindrome_tester("racecar")
=>It's a palindrome!
=> nil

>>palindrome_tester("onomatopoeia")
=>It's not a palindrome.
=> nil

>palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
>>palindrome_tester("racecar").nil?
=>It's a palindrome!
=> true

##4.3 他のデータ構造

`split`は文字列を自然に変換した配列を得ることができる。もしくは任意の文字で区切ることができる。

いろいろなメソッドが紹介されているが、メソッドには二種類あるらしい。

- 破壊的メソッド
- 非破壊的メソッド

だ。

非破壊メソッドは、メソッドを加えた文字列を変形することはない。破壊メソッドは変形する性質をもっているようだ。
見分け方は「!」がついているかどうか。

演習。

>文字列「A man, a plan, a canal, Panama」を ", " で分割して配列にし、変数aに代入してみてください。
今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。
>>`a = "A man, a plan, a canal, Panama".split(',')`
`s = a.join`

>変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと１行でもできます)。リスト 4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。
>>`s.split(' ').join`
`s.downcase`

>aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから７番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)
>>`('a'..'z').to_a[6]`
`('a'..'z').to_a[-7]`

ここまではなんとなく理解したが、4.3.3の演習は難しすぎて回答を見た。
難しいというよりかは、「ハッシュ」「キー」のような言葉に対して不慣れすぎるだけだとは思う。
あとは、文法が頭に入っていないのでさっと出てこないので、理解まで遠いように感じる。

##4.4 Rubyにおけるクラス

ここでは「クラス」や「インスタンス」といった単語が出てくる。
これらについて調べても「ふ〜ん」という感じで、理解した感じはしない。
とりあえず、読み進めていくが、Rubyにおけるオブジェクトはすべて`BasicObject`を継承しているらしいことだけは理解した。
また、Railsでは組み込みクラス（もともと用意されているクラス）は変更可能とのことらしい。

読み進めていくが、まったくおもしろくないので飛ばすことにする...。
先に進めてみて、困ったらまた読み返す。

とりあえずコミットして終了した。
（小ネタ）今更言うほどでもない数値→アルファベットの簡単な変換方法（Java）

# TL;DR
数値をcharにキャストすることで、簡単にアルファベットに変換できる

# 実践
### 具体的なコード１
```java:Main.java
public class Main {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 26; i++) {
            System.out.print((char) (97 + i) + " ");
        }
    }
}
```

### 具体的なコード２
```java:Main.java
public class Main {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 26; i++) {
            // こんな書き方もできる **
            System.out.print((char) ('a' + i) + " ");
        }
    }
}
```

### 出力結果
```
a b c d e f g h i j k l m n o p q r s t u v w x y z
```

# 応用
[ABC171C] (https://atcoder.jp/contests/abc171/tasks/abc171_c) 様から引用
> ロジャーは、彼のもとに突如現れた 1000000000000001匹の犬をすべて飼うことを決意しました。
犬たちにはもともと 1から 1000000000000001までの番号がふられていましたが、ロジャーは彼らに以下のルールで名前を授けました。
1,2,⋯,26番の番号がついた犬はその順に a,b,...,z と命名されます。
27,28,29,⋯,701,702番の番号がついた犬はその順に aa,ab,ac,...,zy,zz と命名されます。
703,704,705,⋯,18277,18278番の番号がついた犬はその順に aaa,aab,aac,...,zzy,zzz と命名されます。
18279,18280,18281,⋯,475253,475254番の番号がついた犬はその順に aaaa,aaab,aaac,...,zzzy,zzzz と命名されます。
475255,475256,⋯番の番号がついた犬はその順に aaaaa,aaaab,... と命名されます。
(以下省略)

```java:Main.java
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);

        long n = sc.nextLong(); //例: 18277
        StringBuilder ans = new StringBuilder();

        // 26で割った余りをアルファベットに変換することで、後ろから文字列を決めていく
        while (n != 0) {
            // // ここは何故n--する必要があるのか理解しきれていないので、誰か親切な方教えていただけると助かります。。
            // 2020/06/22 追記
            // n % 26 = 1の時にa、... n % 26 = 25の時にzに変換されるようにしたいが、
            // このままだとn % 26 = 1のときにbになってしまうため、n--する。
            n--;
            // loop1 18276
            // loop2 701
            // loop3 25

            // 数値をcharにキャストすることでアルファベットに変換
            ans.append((char) ('a' + n % 26));
            // loop1 18276 % 26 = 24 => y 
            // loop2 701 % 26 = 25 => z 
            // loop3 25 % 26 = 25 => z 

            n /= 26;
            // loop1 702 
            // loop2 26
            // loop3 0 -> 終了
        }

　　　　 // 逆順に文字列を作っていたため、reverse();
        ans = ans.reverse();

        System.out.println(ans); // zzy
        sc.close();
    }
}


```

# あとがき
C問題が解けそうで解けなくて悔しかったので。
次回は頑張ります。
macOSでbashをアップデートする

# 概要
- macOSのbashのバージョンは3.x系から更新されていない ( macOS 10.15.5 )
- macOSのログインシェルにbashを使用し続けると、以下のようなコメントが表示される
  - このコメントを消すには `BASH_SILENCE_DEPRECATION_WARNING` に `1` を設定すればいい

```
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

- コメントを消すことでも今まで通りにつかそうだが、バージョンが古いことなどもあるので、新しいバージョンを使用する
  - brewなどからも新しめのbashをインストールできるみたいだが、今回はソースコードからビルドして利用する

# 必要なもの
- c言語をビルドすることのできる環境

# ソースコードの取得ととインストール
[GNUのページ](https://www.gnu.org/software/bash/) のダウンロード欄からリンクに飛び、バージョンを選んでダウンロードする

tar.gz のファイルを入手できるので解凍する

```
$ tar zxvf bash-5.0.tar.gz
```

解凍されたディレクトリに移動してビルドしてテスト、インストールする

```
$ ./configure
$ make
$ make tests
$ make install
```

installが完了すると以下のコマンドでバージョンを確認できるようになる

```
$ /usr/local/bin/bash --version
// インストールしたバージョンが表示される
```

# デフォルトシェルの変更
`/etc/shells` にこのpathを追加する

```
sudo sh -c "echo '/usr/local/bin/bash' >> /etc/shells"
```

デフォルトのログインシェルを変更する

```
$ chsh -s /usr/local/bin/bash
```

# 参考記事
https://qiita.com/key-amb/items/d053ed80590697435650
https://qiita.com/bo-san/items/1b920793aff499667011
GAS 複数のExcelをまとめてスプレッドシートに変換する。

# この記事について
GASを使って複数のExcelファイルをスプレッドシートへ変換する方法についてのメモです。
変換すると、レイアウトが崩れたり、".xlsm"形式のファイルの変換の場合、マクロが使えなくなったりするので、ご利用は自己責任でお願いします。

## フォルダとファイルを準備する。

下記のフォルダを用意します。excelfile変換前フォルダにテスト用にExcelをいくつか格納しておきます。

- excelfile変換前フォルダ
    - 変換前のExcelファイルが保存してあるフォルダ
- excelfile変換済フォルダ
    - スプレッドシート変換後のファイルをプログラムが格納するフォルダ


> excelfile変換前フォルダ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/c790d1ee-fc11-2794-aeb0-6a5028ee24ca.png)



## コード



```javascript
/*
フォルダ単位でまとめて変換する。
*/
const sourceFolderId = 'フォルダID';
const destFolderId = 'フォルダID';
    
function myFunction() {
    // Excelファイルが入っているフォルダをidによって取得
    const sourceFolder = DriveApp.getFolderById(sourceFolderId);
    // Excelファイルたちを変数に保存
    const excelFiles   = sourceFolder.getFiles();
    // 変換されたファイルが格納されるフォルダをidによって取得
    const destFolder   = DriveApp.getFolderById(destFolderId);
    // Excelファイルをイテレートして順にスプレッドシートに変換
    while(excelFiles.hasNext()) {
        var file = excelFiles.next();
        convertToSpreadsheet(file, destFolder);
    }
}

function convertToSpreadsheet(file, folder) {
    // 各種オプションを設定
    // mimeTypeをスプレッドシートにすることで変換される
    options = {
        title: file.getName(),
        mimeType: MimeType.GOOGLE_SHEETS,
        parents: [{id: folder.getId()}]
    };

    // Drive APIへfileをPOSTする
    Drive.Files.insert(options, file.getBlob())
}
```



## 結果
excelfile変換済フォルダを見てみるとファイルが新しくできています。
拡張子は「.xlsm」となっていますが、ファイルアイコンはスプレッドシートのアイコンになっており、ファイルのプロパティを確認するとスプレッドシートとなっていることが確認出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/19a26936-ddbb-a1eb-b267-14b1be867748.png)



# ファイルを変換した後スプレッドシートとして操作したい。

変換後のファイルIDを取得して操作するには、ファイルを保存したところで変数に入れるとファイル情報のオブジェクトが返ってくるので、その中のidプロパティからファイルidを取得する。


```
var file = Drive.Files.insert(options, file.getBlob());
let sp = SpreadsheetApp.openById(file.id).getSheets();

```
[python] 多次元配列のN次元M番目の要素でソートする方法

#はじめに
本日のテーマはこちらの問題から学んだこと。

[ABC 128 　B-Guidebook](https://atcoder.jp/contests/abc128/tasks/abc128_b)

配列のソートの応用技について学びました。
初心者の方は「多次元配列（リストの中にリスト）をソートしたらどんな順番になるんだっけ？」って疑問に思いませんでしたか？
今回はそれを解き明かしていきます！

#考え方
今回の問題は入力で与えられる「市名」「点数」「順番」を多次元配列で保持します。辞書順で「市名」の若い順、その中でも「点数」の高い順で出力しなければならないので、２次元配列の１番目で昇順、２番目で降順したリストの「順番」を出力すればよいですね。
ポイントはオプション引数keyにラムダ式でソートしたい要素指定を行うこと。
ソートのキーが複数あり、且つ、各々で昇順・降順が異なる場合は下図の例のようにマイナスをつけて反転させるテクニックがあります。覚えておくと使えそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/1a901f7d-ae1a-f1c1-46d3-efaf9e5ddd14.png)
Railsで電話番号(固定電話・携帯電話)を正規表現で表し、バリデーションとテストを書いてみた

## はじめに
電話番号のバリデーションをするために電話番号を正規表現で表してみた。

正規表現については下記を参考にしてください。<br>
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
[Ruby | Rubular で ruby の正規表現を検証しながら作成 #ruby #正規表現](https://qiita.com/tbpgr/items/6fe1762cdbaccf26c571)
[Rubular](https://rubular.com/)(正規表現を検証しながら確認できます)
## 電話番号の前提条件
電話番号には様々な組み合わせ(桁数・ハイフン・括弧)があるが今回は下記を前提として表現する



・固定電話
　・全部で10桁
　・頭が0
　・末尾は4桁
　・ハイフンや括弧が入る可能性がある（なくても良い）

・携帯電話
　・全部で11桁
　・1,3桁目は0
　・2桁目は5-9
　・ハイフンや括弧が入る可能性がある（なくても良い）

これらを満たす電話番号のパターンは大きく分けて下記ようになる。（0は固定でxには任意の数字が入る）
・固定電話(10桁)

0x-xxxx-xxxx
0xx-xxx-xxxx
0xxx-xx-xxxx
0xxxx-x-xxxx

・携帯電話(11桁)
050-xxxx-xxxx
060-xxxx-xxxx
070-xxxx-xxxx
080-xxxx-xxxx
090-xxxx-xxxx


## 正規表現で表す(コピペでOK!!)

**固定電話：<font color="Red">\A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z**</font>
**携帯電話：<font color="Red">\A0[5789]0[-]?\d{4}[-]?\d{4}\z**</font>
<img width="800" alt="正規表現_Rubular.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/5bf11a56-88a1-c9ce-7887-b3deb55e9a93.png">


## 正規表現の解説
\A: 頭文字を表す
\d{n}: n桁の数字
[-(]?: "-"もしくは"("が入る　(どちらもない場合もある)
|: or
\z: 最後の文字

読みやすくするために、下記のように区切ってみた。
(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})　が長くてわかりにくくしていので "|"で改行した。

【固定電話】
<img width="800" alt="正規表現_固定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/c3446c1b-ff48-b5dd-d1cf-61accf76050f.png">

【携帯電話】
<img width="470" alt="正規表現_携帯.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/6f95886f-83f1-7d05-dd8f-60a4de66dd42.png">

## Rspecでのバリデーションとテスト
ここまでを考慮して電話番号のバリデーションとテストを書いてみた。

```rb:User.rb
class User < ApplicationRecord
  VALID_PHONE_NUMBER_REGEX = /\A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z|\A0[5789]0[-]?\d{4}[-]?\d{4}\z/
  validates :phone_number, presence: true, format: { with: VALID_PHONE_NUMBER_REGEX }
end
```

```rb:user_spec.rb
RSpec.describe User, type: :model do
  before do
    stub_const('VALID_PHONE_NUMBER_REGEX', \A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z|\A0[5789]0[-]?\d{4}[-]?\d{4}\z)
  end
  
  context 'フォーマット' do
    let(:user) { FactoryBot.create(:user) }  # 別ファイルでUserのFactoryBotを作成しています。

    it 'phone_numberのフォーマットが適切であること' do
      expect(user.phone_number).to match(VALID_PHONE_NUMBER_REGEX)
    end
  end
end
```

@jnchitoさんに頂いたコメントを参考に下記を追加しました。(2020/6/22)

```rb:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    phone_number { "0#{rand(0..9)}0#{rand(1_000_000..99_999_999)}" }
    # 1,3桁目が0, 全部で10-11桁の電話番号を生成
  end
end
```
numpyで行列の内積を求めてみた

#行列の内積を求める
（ a行 b列 )×（ b行 c列 ）＝（ a行　c列 ）という計算になる。
<img width="699" alt="スクリーンショット 2020-06-22 0.12.02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/e1d6488d-3e30-fa2b-4cba-939f564da663.jpeg">

ではこの計算をNumpyでしてみるとどうなるのか
ソースコードは以下の通りです。
####サンプルコード
```Python:matrixInnerProduct.py
# 乱数を発生させて（５行３列）×（３行４列）
#                  = （５行４列）の行列を求める
import numpy as np

a = np.random.randint(0, 14, size=(5, 3))
b = np.random.randint(0, 14, size=(3, 4))
print(a)
print(b)

print("内積の計算結果：")
c = np.dot(a,b)
print(c)
```
####出力結果
```Python:Anser
[[ 4  4  5]
 [ 7  6  5]
 [ 9  6 13]
 [ 5  8  7]
 [ 4  9  4]]
[[ 3  1  3  2]
 [ 1  3  6 10]
 [13  2  4  2]]
内積の計算結果：
[[ 81  26  56  58]
 [ 92  35  77  84]
 [202  53 115 104]
 [114  43  91 104]
 [ 73  39  82 106]]
```

#まとめ
数学式については何かと便利なPython
上手に使っていきたい

・ちなみに参考サイト
[データサイエンス力を飛躍的に向上させるNumPy徹底入門](https://deepage.net/features/numpy/)
InteliJでscssを使用する


### Sass / SCSSのインストール﻿
`npm install -g sass`

### コードをCSSにコンパイルする﻿

ファイルウォッチャーを作成する﻿

*基本的にはここの設定はなくても動いてるはず！！

1. 設定/環境設定ダイアログ ⌘,で、ツールのファイル監視をクリックします。開くファイルウォッチャーページには、すでに構成されているファイル監視のリストが表示されます。

2. Add button をクリックするか、⌘Nを押します。使用するツールに応じて、リストからLess、Sass、またはSCSSの事前定義テンプレートを選択します。

3. プログラムフィールドで、選択した事前定義テンプレートに応じてコンパイラアーカイブへのパスを指定します。

## 参考記事
https://pleiades.io/help/idea/transpiling-sass-less-and-scss-to-css.html#
Pythonの浅いコピー深いコピーを軽く整理

# 浅いコピー、深いコピーについて

```
>>> import copy
>>> l1 = [1, [2, 3]]

>>> l2 = l1
# 浅いコピー
>>> l3 = copy.copy(l1)
# 深いコピー
>>> l4 = copy.deepcopy(l1)

# l1とl2は同じ
>>> l1 is l2
True
>>> l3 is l1
False

# l1[1]とl3[1]は同じ(浅いコピーなので)
>>> l1[1] is l3[1]
True
>>> l1[1] is l4[1]
False

>>> l1.append(4)
>>> l1[1].append(4)
>>> l2
[1, [2, 3, 4], 4]
>>> l3
[1, [2, 3, 4]]
>>> l4
[1, [2, 3]]
```

# 関数の引数、デフォルト引数について
Pythonの関数は参照を渡しているので可変型を渡す時は注意しましょう。
また、デフォルト値に可変型を使う場合も注意しましょう。・・・怖いですね。

```
>>> def f(a, b=[]):
...   a.append(0)
...   b.append(0)
...   return a, b
...
>>> x = [1, 2]
>>> f(x)
([1, 2, 0], [0])
# pythonでは引数の参照がコピーされるので引数の内容を書き換えれる
>>> x
[1, 2, 0]
# デフォルト引数に可変型を使用するとデフォルト値を変更出来てしまう
>>> f(x)
([1, 2, 0, 0], [0, 0])

```
You must use Bundler 2 or greater with this lockfile.　解決法

# はじめに
既存railsアプリをDockerに切り替える時に起きた問題になります。
正確には下のコマンドのようにビルドしようとした時に起きる問題です。
`$ docker-compose build`

## 発生したエラーメッセージ
```
$ docker-compose build
・
・
・
Step 9/10 : RUN bundle install
 ---> Running in 11137a2dced0
You must use Bundler 2 or greater with this lockfile.
ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 20
```
## はまったこと
You must use Bundler 2 or greater with this lockfile.
(このロックファイルではbundler2以上を使用する必要がある)
と言われているのにbundlerのバージョンは2以上を使用しているという件。

ここで本気ではまりました。
bundlerの2.0.1がよくなかったらしいです。
なので、バージョンを下げて行います。
1系のbundlerをインストールします。

## 解決するために行う手順
* **bundle install**の前にまずはバージョン指定をしてbundlerをインストールするように書く

```docker:dockerfile
RUN gem install bundler -v 1.3.0
RUN bundle install
```
* Gemfile.lockを空にする
* `docker-coompose build`を行う
これでエラーを解決できました。

## 振り返り
**You must use Bundler 2 or greater with this lockfile.**
今回はこのメッセージに振り回されました。
解決策を見つけるのに時間がかかったため、記事にしたいと思い作成しました。
色々とググることでありつけたので、もっとググり力と問題解決力をつけて成長できるように頑張ります。

## 解決するにあたってお世話になったサイト
[②Dockerを初めて導入してRails sする (2020.4時点)](https://qiita.com/SakagamiKeisuke/items/d64ee54c22378223659a#6build%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7-image%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B)
Goのプロジェクトでもタスクランナーとしてnpmを使う

[Go](https://golang.org/) のタスクランナーとして [npm](https://www.npmjs.com/) を使ってみたら案外よかった。Go に限った話ではないけど、Go が特に開発ツールチェーン周りの管理がしにくいので噛み合いやすいのではないかと思う。

[npm](https://www.npmjs.com/) は [Node.js](https://nodejs.org/ja/) 用のパッケージマネージャだが、[npm-scripts](https://docs.npmjs.com/misc/scripts) という簡易なタスクランナー機能がついている。また、Node.js 用の便利な開発ツールをそのまま利用できて、開発ツールのインストールも一括で管理できる。

## npm をタスクランナーとして使う利点

- Node.js のインストールだけで利用できる
- 簡易なタスクランナーが利用できる
- **Node.js 用の開発ツールが利用できる**
    - husky + lint-staged, Prettier, etc
- 開発ツールのインストールが 1 コマンド (`npm install`) で完了する

## 導入手順

### npm のインストール

[Node.js](https://nodejs.org/ja/) をインストールすれば npm も標準で付属する。

### package.json の作成

npm で管理したいプロジェクトに `package.json` を作成する。

```json-doc:package.json
{
  "name": "go-project",
  "private": true,
  "scripts": {
    "test": "go test -v ./...",
    // ...
  }
}
```

`"scripts"` フィールドに `"スクリプト名": "コマンド..."` の形でタスクを書くと、`npm run スクリプト名` の形で実行できる。

### Node.js 用の開発ツールの追加

Node.js 用の開発ツールといえど、JavaScript 以外でも使える便利なツールが多数存在する。`npm install -D パッケージ名` でパッケージの追加ができる。下記の点に注意する。

- `node_modules` を `.gitignore` に追加
- `package-lock.json` も必要なファイルなので git 上にコミット

`package.json` に追加したパッケージは、別環境でも `npm install` で一括インストールできるようになる。

#### [husky](https://www.npmjs.com/package/husky) + [lint-staged](https://www.npmjs.com/package/lint-staged)

husky はコミットフックを管理できるようにするツール、lint-staged は git でステージングされているファイルに linter を走らせるためのツール。

```console
$ npm install -D husky lint-staged
```

設定は package.json に書く (別ファイルにもできる)。

```json-doc:package.json
{
  // ...
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.go": "go fmt"
  }
}
```

上記のようにするとコミット前の go のソースコードに自動で `go fmt` できる。

#### [Prettier](https://www.npmjs.com/package/prettier)

[Prettier](https://prettier.io) といえば JavaScript 用のフォーマッタだが、それ以外のファイルタイプのフォーマットにも対応している。

- Markdown
- JSON
- YAML

```console
$ npm install -D prettier
```

上記の husky、lint-staged と組み合わせればコミットフックで上記ファイルのフォーマットもできる。

```json-doc:package.json
{
  // ...
  "lint-staged": {
    "*.go": "go fmt",
    "*.{md,yml,json}": "prettier --write"
  }
```

#### その他

他にも導入すると便利かもしれないツール。マルチプラットフォームで動作するようにさせるものも多い。参考: [npm-scripts で使える便利モジュールたち - Qiita](https://qiita.com/mysticatea/items/12bb6579b9155fd74586)

- [commitlint](https://github.com/conventional-changelog/commitlint)
    - コミットメッセージの linter
- [cross-env](https://github.com/kentcdodds/cross-env)
    - マルチプラットフォームで環境変数を設定しつつ npm-scripts を使えるようにする
- [rimraf](https://github.com/isaacs/rimraf)
    - マルチプラットフォームの `rm -rf`
2020/06/22 Nuxt.js勉強

https://qiita.com/otagaisama-1/items/50e240bee686dd823934

https://qiita.com/HeRo/items/56308a38388a05bdd550

https://www.atmarkit.co.jp/ait/articles/1809/13/news031.html

■コマンドプロンプトでファイル作成
https://win.just4fun.biz/?%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA0%E3%81%AE%E7%A9%BA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95

https://www.k-tanaka.net/cmd/type.php

https://www.k-tanaka.net/cmd/rd.php

■コマンドプロンプトでファイル編集、起動
https://knowledge.reontosanta.com/archives/391
Railsでgroup_by

#グループIDをメンバーの多い順に並び替える

| group_id| user_id | 
|--------:|--------:|
| 1       |       1 |
| 1       |       2 |
| 1       |       3 |
| 2       |       2 |
| 3       |       1 | 
| 3       |       3 |


```ruby

groupsHash = groups.group(:group_id).order('count(user_id) desc').count(:user_id)
#=> {1=>3, 3=>2, 2=>1}
```

ここから人数が2人以上のグループidの配列を取得する

```ruby

ids = groupsHash.filter_map{ |group| groupsHash[0].to_i if groupsHash[1] >= 2}

#=> [1, 3]
```
C++によるプログラミング技法_引数を一つだけ引き取るコンストラクタを宣言する場合、explicitキーワードを使用する

#1 はじめに
　今回は、オブジェクト作成時に特定のコンストラクタを非明示的に起動する事を妨げる手段として、explicitキーワードを紹介したいと思います。

#2 望まない型変換の例
　以下に、explicitキーワードを使用しないArrayクラスの例を示します。


```Array.cpp
struct Array
{
  int m_Size;
  Array(int size):m_Size(size){}; //引数を一つ引き取るコンストラクタ
  //do something[...]
};

// Arrayのヘルパー関数
void CheckArraySize(const Array& array, int size);
```

上記に示したArrayクラスは引数を一つ受け取るコンストラクタが宣言されています。これは以下のような呼び出しが可能です。

```example.cpp
Array a{10};  // 1.Array::Array(10)と等価
Array a = 10; // 2.Array::Array(10)と等価
```
上記に示した方法は一例ですが、どちらも同じオブジェクトを作成できます。
特に2の方法非明示的変換といわれ、以下のようなヘルパー関数を用いた際に以下のような呼び出しを可能にするため、可読性を下げる要因を引き起こす可能性があります。

```UseHelperFunc.cpp

CheckArraySize(10, 10);　
```
上記のような、混乱を招く事を防ぐための方法として、コンストラクタにexplicitキーワードを付与します。

```AddExplicit.cpp
struct Array
{
  int m_Size;
  explicit Array(int size):m_Size(size){}; //引数を一つ引き取るコンストラクタ
  //do something[...]
};

// Arrayのヘルパー関数
void CheckArraySize(const Array& array, int size);

```

explicitキーワードを付与する事で、以下のようなコンストラクタの生成を防ぐことができます。

```example.cpp

//B b1 = 1; NG:explictキーワードにより非明示的な変換ができないため 
//CheckArraySize(100, 100); NG:explictキーワードにより非明示的な変換ができないため 

```

以上より、引数を一つだけ引き取るコンストラクタを宣言する場合、explicitキーワードを使用するのはとても有用です。

#最後に
 とりあえず、引数を一つ受け取るコンストラクタには積極的にexplicitを付与するのがいいみたいです。次回はpimplイディオムというのを知ったのでそれを紹介できたらなとおもいます。
[Curl] Windows でCLIでWeb APIを叩く

# この記事の目的
curlの備忘録。随時更新予定。





# 良く使うオプション

```bash
# HTTPリクエストメソッドの指定（-X）
> curl -X "GET" "targetURL"

# HTTPヘッダに引数の情報をセットする。（-H, –head）
# windowsの場合は、シングルクォーテーションでパラメータを渡すとエラーになる場合がある。
> curl -H "Authorization: Bearer ${apikey}"

# クエリパラメートをセットする（-d）
> curl -X "POST" -d "{キーバリューデータ}" "targetURL"

# データをセットする。（-F）上と同じだけどファイルをアップロードしたい場合はこちら。
> curl -X "POST" -F "{キーバリューデータ}" "targetURL"

```



# windows環境でのCurl

windowsでcurlする場合、Set-ExecutionPolicy（Powershell）の事前設定と文字化けについて対処する必要がある。


- cmd（コマンドプロンプト）
    - 文字化けするから`chcp 65001`コマンドを打つ
- powershell
    - `Set-ExecutionPolicy bypass`にしておく。管理者権限にて。
- windows Terminal
    - powershellと同じ。
- git Bash
    - 問題なくそのまま使える。

## Powershell(windows terminal)でcurlを使うときの注意
powershellでcurlと入力して呼び出されるのはcurlではない。
実際に呼び出されるのは、curlというキーワードにエイリアスされた`Invoke-WebRequest`というコマンドである。
似て非なるコマンドなので、そのまま使うと渡したオプションによっては、`Invoke-WebRequest`で対応していないためエラーになる。

下記のコマンドを使ってエイリアスを削除することで"curl"でcurlを呼び出す。などの対応が必要。

```
> del alias:curl
```


### 参考サイト
- [PowerShell コンソール内で curl や wget が実行できないとお嘆きのあなたへ](https://devadjust.exblog.jp/22690878/)
- [Windows 環境における curl コマンド利用のまとめ (平成最終版)](https://qiita.com/yamachan360/items/8c928738289cd518eec8)





# 使用例
## LINEにメッセージを送る。

```
> apikey="あなたのtoken"
> message="hello!!!"
>
> curl -X "POST" -H "Authorization: Bearer ${apikey}" -F "message=${message}" https://notify-api.line.me/api/notify
```
Rubyの配列操作

#map
人数が5人以上のgroupのidを配列で返すイメージ

```ruby

ids = groups.map{ |group| group.id if group.count >= 5}

#=> [1, 2, nil, 4, ・・・]
```

条件に当てはまらない要素はnilになる

#.reject(&:blank?)
配列からnilと空文字を無くす


```ruby

ids = groups.map{ |group| group.id if group.count >= 5}.reject(&:blank?)

#=> [1, 2, 4, ・・・]
```

#filter_map
上記をまとめて。Ruby2.7から利用可能


```ruby

ids = groups.filter_map{ |group| group.id if group.count >= 5}

#=> [1, 2, 4, ・・・]
```

#join
連結した文字列を返す。引数に入れた文字列を挟み込みことができる

```ruby
['A','B','C'].join
#=> "ABC"

['A','B','C'].join('|')
#=> "A|B|C"
```