OmniAICreator/Qiita-1.07M huggingface dataset:
submitボタンごとにActionメソッドを分ける方法

## 概要
入力フォームを作る際に、複数のsubmitボタンがあったので、その処理をつくったときのメモ。
今回、セレクター属性を作成して、アクションメソッドにその属性を設定しました。

###環境
C# 7.3
ASP.NET MVC　5.2.7

## 参考
今回以下のページを参考にしました。
https://www.it-swarm.dev/ja/html/aspnet-mvc%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E9%80%81%E4%BF%A1%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%87%A6%E7%90%86%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%E3%80%82/958193564/

##方法
ModelsフォルダにMultipleButtonAttributeクラスを作成。

```C#:MultipleButtonAttributeクラス
using System;
using System.Web;
using System.Web.Mvc;
using System.Reflection;

namespace InputForm.Models
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class MultipleButtonAttribute : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }

        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            var isValidName = false;
            var keyValue = string.Format("{0}:{1}", Name, Argument);
            var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

            if (value != null)
            {
                controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
                isValidName = true;
            }

            return isValidName;
        }
    }
}
```

```C#:CSHTML
@using (Html.BeginForm())
{
    <form> 
    	<input type="submit" name="action:Cancel" value="キャンセル">
    	<input type="submit" name="action:Save" value="保存">
    </form>
}
```

```C#:コントローラー
//ビュー表示用
public ActionResult Input(InputContents input)
{
    ViewBag.SelectOptions = new SelectListItem[]
    {
        new SelectListItem(){Value="1",Text="text1"},
        new SelectListItem(){Value="2",Text="text2"},
        new SelectListItem(){Value="3",Text="text3"}
    };

    return View(input);
}
//キャンセルボタンが押されたときに呼び出される
[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(InputContents input)
{
    return View("Input", input);
}
//保存ボタンが押されたときに呼び出される
[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(InputContents input)
{
    return View("Input", input);
}

```
コントローラーには上記のsubmitを受け取るアクションメソッド、Cancel、Saveとともに、Inputというビューを表示させるための、アクションメソッドがあります。

## 最後に
この記事の趣旨とは異なってしまうのですが、ASP.NETではアクションメソッドでViewを返す際、アクションメソッドを明示しない場合、そのアクションメソッドと同じ名前のcshtmlファイルを探すことをしらずに詰まってしまいました。この記事の記載内容は参考にしたページとほとんど同じなのですが、Viewに返すアクションメソッドを明示的に指定してあります。
動的計画法について（トップダウン方式、メモ化、一次元）

paizaとかAtCoderとかやっていると、プログラムとして書けているはずなのに処理時間が遅くてアウト、というのが結構あって、この動的計画法について学んで、処理速度の向上を図ろうと思っているのですが、なかなかに理解しづらいので、少しずつ言語化していきます。

# 動的計画法の定義
- 帰納的な関係の利用
- 計算結果の記録

を満たすアルゴリズムの総称だそうです（Wikipedia）。とりあえずは適用条件等は省略します。
もう少しわかりやすくいうならば、漸化式の形で帰納的な関係を記述し、ここの計算結果について記録しておいて、その結果を参照しながら計算することによって、計算量を減らす手法ですね。

うん、全くもってわかりやすく言えてない。具体例（ベタなフィボナッチ数列）いきましょう。
フィボナッチ数列とは、a[0]=a[1]=1,a[n]=a[n-1]+a[n-2]で表される漸化式の一般解ですね。
（前二つの和によってその項の値が決まる）

#普通に書いた時
```ruby:fib.rb
def fib(n)
  if n <=1
    return 1
  else
    fib(n-1)+fib(n-2)
  end
end

n=gets.chomp.to_i
puts fib(n)
```

こんな感じ。これだと計算量はO(2^n)となり、nに代入する値が小さければ問題ないが40くらいからしんどくなる。
#動的計画法（トップダウン）を用いた時
```ruby:fib2.rb
@dp=[]
def fib2(n)
  if n <= 1
    return 1
  else
    if @dp[n]
      return @dp[n]
    else
      @dp[n] = fib2(n-1)+fib2(n-2)
    end
  end
end
n=gets.chomp.to_i
puts fib2(n)
```
@dpという配列（nがキーのハッシュのようなイメージで使う）を用意して、計算結果をこの配列に格納していきます。
計算時にはこの配列から値を参照して計算することで計算量がO(n)となり、計算量がガクッと減ります。
これならnに10000とかを代入しても一瞬です。

###補足
配列を定義するときはインスタンス変数で。

#最後に
なかなか理解が追いついてないのでおいおい学習しながら小出しにアウトプットしようと思います。

#参考記事
https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95
https://www.jabba.cloud/20161020172918/
OpenFlowを使ったSDN(Software-Defined Networking)ー柔軟な制御機能

応用情報技術者平成30年秋期 午前問35

OpenFlowを使ったSDN(Software-Defined Networking)の説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/14704d3b-cdf4-e4c6-df6e-7d666e6a2400.png)


１、OpenFlowとは、
既存のネットワーク機器がもつ制御処理と転送処理を分離したアーキテクチャです。制御部をネットワーク管理者が自ら設計・実装することで、ネットワーク機器ベンダの設定範囲を超えた柔軟な制御機能を実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2d6df6c2-912a-3818-b24f-00fa589304fb.png)


２、SDN(Software-Defined Networking)とは、
このOpenFlow上でソフトウェア制御による動的で柔軟なネットワークを作り上げる技術全般を意味します。SDNを用いると、物理的に接続されたネットワーク上で、 別途仮想的なネットワークを構築するといった柔軟な制御が可能になります。


３、ネットワーク仮想化の説明
単一の物理サーバ内の仮想サーバ同士が，外部のネットワーク機器を経由せずに，物理サーバ内部のソフトウェアで実現された仮想スイッチを経由して，通信する方式

４、ASN.1(Abstract Syntax Notation One)の説明
プロトコルの文法を形式言語を使って厳密に定義する，ISOで標準化された通信プロトコルの規格


ーーーーーーーーーーーーーーーーーーーーー
補足

ONF(Open Networking Foundation)が標準化を進めているOpenFlowプロトコルを用いたSDN(Software-Defined Networking)の説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b170193c-a91b-89be-9a17-728537f33df2.png)


１、SNMP(Simple Network Management Protocol)の説明
管理ステーションから定期的にネットワーク機器のMIB(Management Information Base)情報を取得して，稼働監視や性能管理を行うためのネットワーク管理手法


２、ルーティングの説明
データ転送機能をもつネットワーク機器同士が経路情報を交換して，ネットワーク全体のデータ転送経路を決定する方式


参照：

https://www.ap-siken.com/kakomon/29_haru/q34.html

https://www.ap-siken.com/kakomon/29_aki/q35.html
windowsでiverilog その73

#概要　

windowsでiverilogやってみた。
serialの受信、書いてみた。

#サンプルコード


```

module UART_RX(input clk, input rst, input rx, output reg [7:0] get_data);
	parameter rate_div = 1302;
	reg [15:0] cnt_p;
	reg [15:0] cnt_n;
	reg out_p;
	reg out_n;
	reg [4:0] state;
	reg [2:0] clk_cnt;
	reg [2:0] get_startbit;
	assign uart_rx_clk = out_p ^ out_n;
	initial
	begin
		cnt_p = 16'd1;
		cnt_n = 16'd1;
		out_p = 0;
		out_n = 0;
	end
	always@(posedge clk)
	begin
		cnt_p <= cnt_n + 16'd1;
		if (cnt_n == rate_div)
		begin
			cnt_p <= 16'd1;
			out_p <= ~out_p;
		end
	end
	always@(negedge clk)
	begin
		cnt_n <= cnt_p + 16'd1;
		if (cnt_p == rate_div)
		begin
			cnt_n <= 16'd1;
			out_n <= ~out_n;
		end
	end
	initial
	begin
		get_data = 0;
		state = 0;
		clk_cnt = 0;
		get_startbit = 1;
	end
	always@(posedge uart_rx_clk)
	begin
		if (!rst)
		begin
			state <= 0;
			get_data <= 0;
			clk_cnt <= 0;
			get_startbit <= 1;
		end
		else
		begin
			get_startbit <= {get_startbit[1:0], rx};
			if (state == 0)
			begin
				if (get_startbit == 3'b000)
				begin
					state <= 5'd1;
				end
			end
			else if (state <= 5'd8)
			begin
				if (clk_cnt == 3'd3)
				begin
					state <= state + 5'd1;
					clk_cnt <= 0;
					get_data[state - 1] <= rx;
				end
				else
				begin
					clk_cnt <= clk_cnt + 1;
				end
			end
			else if (state == 5'd9)
			begin
				if (clk_cnt == 3'd3)
				begin
					state <= 0;
					clk_cnt <= 0;
				end
				else
				begin
					clk_cnt <= clk_cnt + 1;
				end
			end
		end
	end
endmodule

module test();
	reg clk;
	reg rst;
	reg rx;
	wire [7:0] get_data;
	UART_RX u(.clk(clk), .rst(rst), .rx(rx), .get_data(get_data));
	initial
	begin
		clk <= 0;
		rst <= 1;
		rx <= 1;
		#100
			rst <= 0;
		#100
			rst <= 1;
		#100
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			$finish;
	end
	always
	begin
		#1
			clk <= 1;
		#1
			clk <= 0;
	end
	initial
	begin
		$monitor("%b %b %b", rst, rx, get_data);
	end
endmodule






```

#実行結果


```


1 1 00000000
0 1 00000000
1 1 00000000
1 0 00000000
1 1 00000000
1 1 00000001
1 0 00000001
1 1 00000001
1 1 00000101
1 0 00000101
1 1 00000101
1 1 00010101
1 0 00010101
1 1 00010101
1 1 01010101
1 0 01010101
1 1 01010101
1 0 01010101


```

以上。
windowsでiverilog その72

#概要　

windowsでiverilogやってみた。
serialの受信、書いてみた。

#サンプルコード


```


module getc(input clk, input rst, input ack, input rx, output reg [7:0] char, output reg gotten);
	wire [1:0] sum01 = past7[0] + past7[1];
	wire [1:0] sum23 = past7[2] + past7[3];
	wire [1:0] sum45 = past7[4] + past7[5];
	wire [2:0] sum03 = sum01 + sum23;
	wire [2:0] sum46 = sum45 + {1'b0, past7[6]};
	wire [3:0] sum06 = sum03 + sum46;
	wire mj = ~| sum06[3:2];
	reg [3:0] state;
	reg [4:0] next;
	reg [6:0] past7;
	reg last_clk,
		clk_buf;
	reg [12:0] cnt2 = 0;
	reg up;
	wire rclk16;
	assign rclk16 = up;
	always @(posedge clk)
	begin
		if (cnt2 == 326)
		begin
			cnt2 <= 0;
			up <= 1;
		end
		else
		begin
			cnt2 <= cnt2 + 1;
			up <= 0;
		end
	end
	always @(posedge clk)
	begin
		clk_buf <= rclk16;
		last_clk <= clk_buf;
		if (clk_buf & ~last_clk)
		begin
			past7 <= {past7[5:0], ~rx};
			case (state)
			4'd0:
			begin
				if (~mj)
				begin
					next <= 5'd24;
					state <= 4'd1;
				end
				else if (ack)
				begin
					gotten <= 1'b0;
				end
			end
			4'd1,
			4'd2,
			4'd3,
			4'd4,
			4'd5,
			4'd6,
			4'd7,
			4'd8:
			begin
				if (|next)
				begin
					next <= next - 5'd1;
				end
				else
				begin
					char <= {mj, char[7:1]};
					state <= state + 4'd1;
					next <= 5'd15;
				end
			end
			4'd9:
			begin
				if (|next)
				begin
					next <= next - 5'd1;
				end
				else
				begin
					state <= 4'd0;
					gotten <= 1'b1;
				end
			end
			default:
				state <= 4'd0;
			endcase
		end
	end
endmodule

module test();
	reg clk;
	reg rst;
	reg ack;
	reg rx;
	wire [7:0] char;
	getc u(.clk(clk), .rst(rst), .ack(ack), .rx(rx), .char(char), .gotten(gotten));
	initial
	begin
		clk <= 0;
		rst <= 1;
		ack <= 0;
		rx <= 1;
		#100
			rst <= 0;
		#100
			rst <= 1;
		#100
			rx <= 1;
		#10400
			ack <= 1;
			rx <= 0;
		#10400
			ack <= 0;
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			$finish;
	end
	always
	begin
		#1
			clk <= 1;
		#1
			clk <= 0;
	end
	initial
	begin
		$monitor("%b %b %b %b %b", rst, ack, rx, char, gotten);
	end
endmodule




```

#実行結果


```


1 0 1 xxxxxxxx x
0 0 1 xxxxxxxx x
1 0 1 xxxxxxxx x
1 1 0 xxxxxxxx x
1 1 0 xxxxxxxx 0
1 0 1 xxxxxxxx 0
1 0 1 1xxxxxxx 0
1 0 0 1xxxxxxx 0
1 0 0 01xxxxxx 0
1 0 1 01xxxxxx 0
1 0 1 101xxxxx 0
1 0 0 101xxxxx 0
1 0 0 0101xxxx 0
1 0 1 0101xxxx 0
1 0 1 10101xxx 0
1 0 0 10101xxx 0
1 0 0 010101xx 0
1 0 1 010101xx 0
1 0 1 1010101x 0
1 0 0 1010101x 0
1 0 0 01010101 0
1 0 1 01010101 0
1 0 1 01010101 1
1 0 0 01010101 1


```

以上。
windowsでiverilog その71

#概要　

windowsでiverilogやってみた。
serialの受信、書いてみた。

#サンプルコード


```



module rs_rx(input clk, input rst, input rx, input rx_RD, output reg [7:0] out, output reg rx_RDY = 0);
	parameter cnt = 13'd5207;
	reg rx_EN;
	reg [15:0] rx_time_cnt;
	reg rxd_d1,
		rxd_d2,
		rxd_d3,
		rxd_chg;
	reg [3:0] rx_cnt;
	reg [7:0] rx_tmp;
	always @(posedge clk or negedge rst)
	begin
		if (rst == 1'b0)
			rx_time_cnt <= 12'd0;
		else
			if ((rx_cnt == 4'd0) && (rxd_chg == 1'b1))
				rx_time_cnt <= 12'd0;
			else if (rx_time_cnt == cnt)
				rx_time_cnt <= 12'd0;
			else
				rx_time_cnt <= rx_time_cnt + 12'd1;
	end
	always @(posedge clk or negedge rst)
	begin
		if (rst == 1'b0)
			rx_cnt <= 4'd0;
		else
			if (rx_cnt == 4'd0)
				if (rxd_chg == 1'b1)
					rx_cnt <= 4'd1;
				else
					rx_cnt <= 4'd0;
			else if (rx_time_cnt == cnt)
				if (rx_cnt == (4'd9))
					rx_cnt <= 4'd0;
				else
					rx_cnt <= rx_cnt + 4'd1;
			else
				 rx_cnt <= rx_cnt;
	end
	always @(posedge clk or negedge rst)
	begin
		if (rst == 1'b0)
		begin
			rxd_d1 <= 1'b1;
			rxd_d2 <= 1'b1;
			rxd_d3 <= 1'b1;
			rxd_chg <= 1'b0;
		end
		else
		begin
			rxd_d1 <= rx;
			rxd_d2 <= rxd_d1;
			rxd_d3 <= rxd_d2;
			if ((rxd_d2 == 1'b0) && (rxd_d3 == 1'b1))
				rxd_chg <= 1'b1;
			else
				rxd_chg <= 1'b0;
		end
	end
	always @(posedge clk or negedge rst)
	begin
		if (rst == 1'b0)
			rx_tmp <= 8'd0;
		else
			if (rx_time_cnt == {1'b0, cnt[11:1]})
				rx_tmp <= {rxd_d2, rx_tmp[7:1]};
			else
				rx_tmp <= rx_tmp;
	end
	always @(posedge clk or negedge rst)
	begin
		if (rst == 1'b0)
		begin
			out <= 8'd0;
			rx_EN <= 1'b0;
		end
		else
			if ((rx_cnt == 17'd9) && (rx_time_cnt == {1'b0, cnt[11:1]} + 12'd1))
			begin
				out <= rx_tmp;
				rx_EN <= 1'b1;
			end
			else
			begin
				out <= out;
				rx_EN <= 1'b0;
			end
	end
	always @(posedge clk)
	begin
		if (rx_EN)
			rx_RDY <= 1;
		else
			if (rx_RD == 1)
				rx_RDY <= 0;
	end
endmodule

module test();
	reg clk;
	reg rst;
	reg rd;
	reg rx;
	wire [7:0] char;
	rs_rx u(.clk(clk), .rst(rst), .rx(rx), .rx_RD(rd), .out(char), .rx_RDY(rdy));
	initial
	begin
		clk <= 0;
		rst <= 1;
		rd <= 0;
		rx <= 1;
		#100
			rst <= 0;
		#100
			rst <= 1;
		#100
			rx <= 1;
		#10400
			rd <= 1;
			rx <= 0;
		#10400
			rd <= 0;
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			rx <= 1;
		#10400
			rx <= 0;
		#10400
			$finish;
	end
	always
	begin
		#1
			clk <= 1;
		#1
			clk <= 0;
	end
	initial
	begin
		$monitor("%b %b %b %b %b", rst, rd, rx, char, rdy);
	end
endmodule





```

#実行結果


```


1 0 1 xxxxxxxx 0
0 0 1 00000000 0
1 0 1 00000000 0
1 1 0 00000000 0
1 0 1 00000000 0
1 0 0 00000000 0
1 0 1 00000000 0
1 0 0 00000000 0
1 0 1 00000000 0
1 0 0 00000000 0
1 0 1 00000000 0
1 0 0 00000000 0
1 0 0 01010101 0
1 0 0 01010101 1
1 0 1 01010101 1
1 0 0 01010101 1


```

以上。
サブネットに割り当てるネットワーク機器のIPアドレス

応用情報技術者平成30年秋期 午前問34

あるサブネットでは，ルータやスイッチなどのネットワーク機器にIPアドレスを割り当てる際，割当て可能なアドレスの末尾から降順に使用するルールを採用している。このサブネットのネットワークアドレスを 10.16.32.64/26 とするとき，10番目に割り当てられるネットワーク機器のアドレスはどれか。ここで，ネットワーク機器1台に対して，このサブネット内のアドレス1個を割り当てるものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e169dd1f-f99e-9a98-0162-171073b37c03.png)


１、ネットワークアドレス、ブロードキャストアドレス、ホストアドレス

例として、
192.168.1.0～255の256個（サブネットマスクは255.255.255.0/24）のブロックが割り当てられている場合、
先頭の192.168.1.0がネットワークアドレス、
末尾の192.168.1.255がブロードキャストアドレス、
残りの192.168.1.1～254がホストアドレスとなる。
※**頭のx.x.x.0と末尾のx.x.x.255がホストアドレスとして使わないです。**

２、当該質問に、サブネットワークアドレスは10.16.32.64
末尾(64)の２進数は、
0100 0000

つまり、使えるネットワークアドレスは、
0100 0001(65) ~ 0100 1110(126)
ですね。
最後から数えて、１０番目は、１１７ですね。


参照：
IPアドレス、サブネットマスク、ネットワークアドレス
https://qiita.com/lymansouka2017/items/fca60d544a2c682c0c46

https://www.ap-siken.com/kakomon/30_aki/q34.html
Pythonでスクレイピング

[BeautifulSoupの準備](https://qiita.com/h1r0_1126/items/0989a2daf169c19adada)はこちら

最近モチベーション上がらなくて、上げるためにとりあえず書くことにしました。
本当に基礎の基礎なので悪しからず

とりあえず、BeautifulSoupを実行してみます。

```
from urllib.request import urlopen
from bs4 import BeautifulSoup

# 取得するページ
html = urlopen('http://www.pythonscraping.com/pages/page1.html')
bs = BeautifulSoup(html.read(), 'html.parser')
# h1タグを返す
print(bs.h1)
```

2行目の
```
from bs4 import BeautifulSoup
```
部分でBeautifulSoupをインポートする。
実行結果は下記となる。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/8b4f607e-5b30-f860-5b8e-3aec73300cc2.jpeg)

http://www.pythonscraping.com/pages/page1.html
上記ページのh1タグだけ取得できることがわかる。

次回はちゃんとした内容で投稿します。
#参考文献
PythonによるWebスクレイピング(オライリー・ジャパン)
[Bitrise]2FAが有効になっているアカウントでAppStoreConnectにアップロード

BitriseでAppStoreにアップロードする時、2FA(二要素認証)が有効化されていると、メールアドレスとパスワードの２つだけではアップロードできません。
2FAをせずにAppStoreConnectと通信するためにはもう１つ情報が必要になります。
何度か調べたりしていたので、メモ。

## Appleアカウントの設定

- https://appleid.apple.com/account/home にログイン
- 「セキュリティ」セクションで、「App 用パスワード」の下の「パスワードを生成」をクリック
- 生成された文字列をコピー

## Bitriseの設定

- Workflow Editorを開く
- `Secrets`タブでkeyが`APPSTORE_CONNECT_APP_PASSWORD`(例)とvalueとして先ほどコピーした文字列を入力
    - AppStoreConnect用メールアドレスとパスワードはすでに設定しているとします
- `Deploy to iTunes Connect - Application Loader`ステップの中の`Application Specific Password`の項目に先ほど設定した`$APPSTORE_CONNECT_APP_PASSWORD`と入力

これで2FAアカウントを使い、BitriseからAppStoreConnectにアップロードできます。


## 参考
https://support.apple.com/ja-jp/HT204397
https://bannzai.hatenadiary.jp/entry/2019/10/22/005621
Linux tar xz のコマンドメモ

# tar.gz
圧縮
tar -zcvf xxxx.tar.gz directory
解凍
tar -zxvf xxxx.tar.gz
# tar.bz2
圧縮
tar -jcvf xxxx.tar.bz2 directory
解凍
tar -jxvf xxxx.tar.bz2
# tar.xz
圧縮
tar -Jcvf xxxx.tar.xz directory
解凍
tar -Jxvf xxxx.tar.xz
# tar
圧縮
tar -cvf xxxx.tar directory
解凍
tar -xvf xxxx.tar
# zip
圧縮
zip -r xxxx.zip directory
解凍
unzip xxxx.zip
【Laravel】predisのインストール方法

#Predisとは？
[こちらのサイト](https://weblabo.oscasierra.net/php-predis-1/)によると
「Predisはオープンソースの Redis クライアントライブラリで、MITライセンスのもとで公開・開発されています。

Predis を利用するメリットとしては、PredisはピュアPHPのライブラリであり、特別な設定などが必要ないことがあります。 Composer などのパッケージ管理ソフトウェアでインストールすることができます。」

#前提条件
PHP -v7.2
Laravel -v5.5
Amazon linux
mysql -v5.5

#インストール方法
下記内容でpredisライブラリをインストールしようとした。

```
#プロジェクトのディレクトリに移動
$ cd /var/www/html/laravel-sample
#predisインストール
composer require predis/predis
```

そうすると`composer require predis/predis`で、下記エラーが発生

```
Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

[ErrorException]                                   
proc_open(): fork failed - Cannot allocate memory
```
どうやらメモリが不足していてるらしい。

[proc_open(): fork failed - Cannot allocate memory の解決法](https://qiita.com/oitakazuki/items/9093d9ca4a341d2d6c4b)の記事によると下記コマンドでスワップファイル領域を確認とのこと。

```
$free -m
              total        used        free      shared  buff/cache   available
Mem:            983         109         707           7         166         725
Swap:             0           0           0
```
下記コマンドでスワップファイルの領域を作成。

```
#swap用のファイル作成
$ sudo /sbin/mkswap /var/swap.1
mkswap: /var/swap.1: パーミッション 0644 は安全な値ではありません。 0600 をお勧めします。
#パーミッションを600に変更
$sudo chmod 600 /var/swap.1
$sudo /sbin/mkswap /var/swap.1
$sudo /sbin/swapon /var/swap.1
```

準備を整えてpredisインストールコマンドを打つ。

```
$ composer require predis/predis
```

その際下記のような警告文が出てくるが、[Laravelでcomposer updateするとPackage jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.](https://qiita.com/nasubi987/items/8c49bc3e5ec0df45f776)の記事によると警告解消に向けて対応中で、今の所放置していいそうだ。

```
Package jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.
Package jakub-onderka/php-console-highlighter is abandoned, you should avoid using it. Use php-parallel-lint/php-console-highlighter instead.
Package jeremeamia/SuperClosure is abandoned, you should avoid using it. Use opis/closure instead.
Package mtdowling/cron-expression is abandoned, you should avoid using it. Use dragonmantank/cron-expression instead.
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
```

参考
https://weblabo.oscasierra.net/php-predis-1/
https://qiita.com/oitakazuki/items/9093d9ca4a341d2d6c4b
https://www.checksite.jp/ec2t2-add-swapfile/
https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors
https://qiita.com/nasubi987/items/8c49bc3e5ec0df45f776
AWS上にサーバーを作る（序章）

# 序章について
この記事を書くに至った経緯を掲載しておきます。
## こういう人向け
僕は今までパブリッククラウドと呼ばれるクラウドサーバーの類は使ったことがない。
なぜなら料金が「使った分だけ:scream:」という青天井の料金体系なので、

* 会社では・・・不明瞭な料金のせいで「・・・で、結局月々いくらかかんの？」に回答できなく予算を通せず
* 個人では・・・操作ミスで巨額の支払いが来るのが怖くて申し込みすらできず

たぶんこういう人って多いはず。
そして、外部公開用のサーバーは星の数ほどあるけれど、社内向けあるいは外から見られては困るサーバー（開発用途、テスト用途、勉強用なので自己資金）を作ってみたい人いきたいと思いますので、用途にマッチしている人。
そんな人に読んでもらえるとありがたいです。
## スキルについて
僕はこんなレベルの人間です。

* オンプレでサーバーを作ったことがある
* VirtualBox、KVM、vmware ESXiで仮想マシンを作ったことがある
* レンタルサーバー会社で借りた共用レンタルサーバーを使ったことがある
* レンタルサーバー会社で申し込んだVPSをベースにサーバーを作ったことがある
* 業務で扱うサーバーOSはWindows ServerとCentOS
* Raspberry Piを使ってWebサーバーを立ててみたことがある
* 自宅にRaspberry Piを使ってドメインコントローラーを立てて運用したことがある
* HTML、PHP、MySQLあたりならかろうじて触ったことがあるけど難しいのはNG
* 家のルーターはコンシューマー向けのものから勉強も兼ねて中古のYAMAHAのRTXで運用を始めた
* 自宅にリモートアクセスVPNで接続できる仕組みを勉強用に構築してみた
* 「エンタープライズ向けのPCはやっぱりWindowsだろ」って思ってる
* 「流行りのAWS使いたいなー／触ってみたいなー」って思ってる

要するに、AWSやAzureという名前は知ってるけど、EC2とかVPCはよく知らないレベルからのスタートです。
あ、嘘です。AWSが提供するDNSサービス、「Route 53」は、月々の運用料金が缶ジュース1本分という記事を見たので、勉強用にお名前ドットコムで取得したドメインと同じく勉強用にさくらインターネットで立てたVPSの紐づけ用に2ホスト利用させていただいていました。
ちなみに本当に毎月缶ジュース1本分（2ホストで利用料1.00USD+税金0.10USD＝1.10USD）です。（公開サーバーだけど誰もアクセスしに来ないし。。。）

## 目標とするゴール地点
### 何を作るか
一応目標が必要ですね。
今回、僕は勉強用に自費でサーバーを立ててみるので、なるべく性能よりもコスト優先で設計していきたいところ。もちろん無料枠をなるべく使っていきたい。
#### OSのチョイス
Windows Serverはライセンス料金がおそらく上乗せされるのと、GUIがあるので、必然的にスペックを上げなければならないので、ここは**Linux**択一です。
#### 公開？非公開？
今回は勉強用、かついろんな人がアクセスしてしまうと料金があがってしまうので、**非公開**択一です。公開用サーバーを立てたい人は、たぶん探せばいっぱい情報あると思います。
#### 非公開であるが故？？
どうせ非公開にするならば、拠点間VPN（自宅とAWS間をVPNでつなげる）もできるかな？？
### 作る物の宣言

**「僕は勉強のため、**

* **初めてAWSのサービスを使い**
* **自宅からVPNでのみアクセスできる**
* **ランニングコストのかからない**

**サーバーをインターネット上に立てます！！」**
## 次回の内容
実際にAWSのサービスを見てみましょうかねー

To be continued...
Python3でUTC（整数秒）

Python3で現在時刻のUTC秒を取得する方法を探そうとしたら、あまりそのものズバリじゃない、情報が盛りだくさんのが多いなぁ、と思ったので。

- ズバリのプログラム

```python
import time

x = int(time.time())
print(x)
```

- 実行結果

```text
1598166633
```

- 確認用サイト
[時刻変換ツール](http://kujiira.com/tools/date)

- 確認用コマンド(`date -r`)

```zsh
% date -r 1598166633 
2020年 8月23日 日曜日 16時10分33秒 JST
```
- 長いプログラム

```python
import time

utc_float = time.time()
print("utc_float: " + str(utc_float) + " " + str(type(utc_float)))
utc_int = int(time.time())
print("utc_int: " + str(utc_int) + " " + str(type(utc_int)))
```

- 実行結果

```text
utc_float: 1598167452.5028915 <class 'float'>
utc_int: 1598167452 <class 'int'>
```
クリックイベントでタブの切り替えをするときにハマったこと

#背景
クリックしたときにタブの切り替えはできたが、肝心な内容がもともと両方とも表示されてしまっている
タブの切り替えだけ反映されても意味がないのだ...。💧

#仮説
jqueryの記述に問題があると仮説を立てた。


#実装開始
調べてみると、show、hide、toggleというものを見つけた。

でも、よくよく考えてみるとこれらはクリックしたときに起こるイベントだから意味ないような...。

ということで、もっと調べてみると、cssのdisplay:none;と言うものを発見。

```haml

      %ul.container-body
        %li.container-body__item.show
          %p お知らせはありません
        %li.container-body__item
          %p やることはありません
```

```scss
      .container-body {
        width: 100%;
        &__item {
          display: none;
        }
        .show {
          display: block;
        }
```

こんな感じで、showになっている箇所はdisplay: block;で表示させ、隠したい箇所(showではない所)はdisplay: none;を付与してあげることで実現することができた。
スマホ(Android)をPCにつないでブラウザの要素の検証をする

# はじめに
デプロイしたWEBサイトをスマホ(Android)で表示するとどうしても思ったデザインにならないので
どうにかしてスマホで開いているブラウザをDevtool(F12ツール)で見れないか調べてたらChromeなら見れました。
忘れないようにメモ。

**Android 端末のリモート デバッグを行う**
https://developers.google.com/web/tools/chrome-devtools/remote-debugging?hl=ja

# 手順
- スマホの設定から「開発者向けオプション」→「USBデバッグ」を有効にする
- スマホをPCにUSB接続
- chrome://inspect/#devices　にアクセス
- 「Device」と「Remote Target#LOCALHOST」が表示される
- **初めての接続の場合はスマホのドライバがPCにインストールされる**
- **スマホ側にデバッグを許可しますか？的なポップアップが出るので許可を選択**
- しばらくすると「Remote Target#LOCALHOST」の下にスマホ側Chromeで表示しているタブの一覧が表示される

# 気を付けること
手順通りならchrome://inspect/#devices　にアクセスすると「Remote Target#LOCALHOST」には接続してるデバイスの情報が表示されるはずですが太字の部分が原因で表示されず戸惑いました。

# おわりに
PCからDevtoolでCSSを見てみるとデプロイしたはずのデザインが反映されていませんでした。
結果的にただキャッシュが効いてしまっていただけでした。。
ということでブラウザの閲覧履歴の削除から「Cookieとサイトデータ」と「キャッシュされた画像とファイル」にチェックを入れて削除。
時間かかりそうだったので過去24時間にしましたがそれでも数分かかりました。
Android Studio で Material Icon をさっくり取り込む

## はじめに

- Android Studio 3.4 の機能で`Resource Manager`が追加されています。
- この`Resource Manager`を利用する事で、Material Icon をアプリにお手軽に取り込む事ができます。

- Resource Managerに関する詳しい説明は[こちら](https://developer.android.com/studio/write/resource-manager?hl=ja)


## 順序

#### Step1：準備
- Android Studio 4.0 を利用してアプリケーションを作成

#### Step2:Resource Manager を開く
- Android Studio 4.0 であれば、画面左端に縦書きで`Resource Manager`という選択エリアがあります。
- 無ければメニュー -> `Tools` -> `Resource Manager` を選択
- これで今のアプリ内で利用しているリソース一覧が表示されます。

![スクリーンショット 2020-08-23 15.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/cd79031f-d23b-62c6-c6a5-77760098f751.png)


#### Step3:**＋**ボタンからリソースを追加
- 左上**＋**ボタンからリソースの追加が行えます。
- 今回は画面解像度を気にしなくていい`Vector Assets`として取り込む手順にしてみます。
- `＋`から`Vector Assets`を選択すると`Configure Vector Asset`が表示されます。

![スクリーンショット 2020-08-23 16.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/ba1e9ded-265a-3c4f-5fde-dbd7994e3130.png)

#### Step4:取り込みたいIconを選択
- `Asset Type`は`Clip Art`を選択
- `Clip Art`ボタンを選択する事で、Material Iconの一覧から取り込むことが可能です。
- 使用したいアイコンを選び、サイズを指定することで利用する事ができます。

![スクリーンショット 2020-08-23 16.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/61132a4c-6970-8e33-d216-10a10cf1c820.png)

あとは、利用したい箇所に`ImageView`に入れるとか、いろいろ利用してください。
Material Icon は Apache License 2.0.のライセンスとなっていますので、リリースの際は決め事にしたがっておきましょう。

## まとめ

- 簡単にMaterial Iconを取り込むことが出来ます。
- 個人開発の場合、ちょっと画像を入れたいけど良いサイズがとか・・・、というプログラミング以外のところで悩む事が多かったりします。
- Material Icon の表現をうまくつかって良いアプリを作っていきたいですね。
【Node.js】nvmを使ったnode.jsのバージョン管理

node.jsのバージョン管理(nvm)メモ

###動作環境
* macOS Catalina 10.15.6
* shell zsh

## インストール

```
% command -v nvm
```


インストールされている場合は```nvm```が帰ってくる

```
% command -v nvm
nvm
```


```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | zsh
```
インストール
[GitHub(nvm-sh/nvm)](https://github.com/nvm-sh/nvm)最新バージョンの確認



```~/.zshrc
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
```

これを```zshrc```追加して```% source ~/.zshrc```

## nvmコマンド




#### *1.現在利用しているバージョンを確認*

```

% nvm current
```

#### *2.利用可能なバージョン一覧を表示*

```
nvm ls-remote
```

#### *3.インストール済のバージョンを確認*

```
% nvm ls
```
#### *4.エイリアスの設定を確認*

```
% nvm alias
```

#### *5.特定バージョンのインストール*

```
% nvm install バージョン
```
#### *6.利用するバージョンを変更*

```
% nvm use バージョン
```
#### *7.デフォルトバージョンを変更*

```
% nvm alias default バージョン
```
#### *8.最新のLTSをインストール*
```
nvm install --lts
nvm use --lts
```

##確認

```nvm
//現在利用のnode.jsバージョン確認//
% nvm current
v12.18.3

//エイリアス確認//
% nvm alias
default -> lts/* (-> v12.18.3)
node -> stable (-> v12.18.3) (default)
stable -> 12.18 (-> v12.18.3) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/erbium (-> v12.18.3)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.22.0 (-> N/A)
lts/erbium -> v12.18.3

//v10.22.0をインストール//
% nvm install lts/dubnium
Downloading and installing node v10.22.0...
Downloading https://nodejs.org/dist/v10.22.0/node-v10.22.0-darwin-x64.tar.xz...
############################################################################################# 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v10.22.0 (npm v6.14.6)

//v10.22.0がインストールされているか確認//
% nvm alias
default -> lts/* (-> v12.18.3)
node -> stable (-> v12.18.3) (default)
stable -> 12.18 (-> v12.18.3) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/erbium (-> v12.18.3)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.22.0  　　　//←←ここが変更//
lts/erbium -> v12.18.3

//利用するバージョンをv10.22.0に変更//
% nvm use lts/dubnium
Now using node v10.22.0 (npm v6.14.6)

//バージョンが変更されたことを確認//
% nvm current
v10.22.0
```
シェルで画像ファイルの作成日時を撮影日時に変える（Mac）

スマホなどで撮影した画像をPCに取り込んだとき、取り込み日時がファイルの作成日時として設定されてしまい、撮影日時順で並べ替えができなくて不便だったりするので。

```bash
$ find . -maxdepth 1 -name '*.jpeg' -print0 | xargs -0 -I @ sh -c "sips -g creation '@' | sed -e '1d' |  awk '{print \$2,\$3}' | sed -E 's/([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\\1\\2\\3\\4\\5.\\6/g' | xargs -I TS touch -t TS '@'"
```

これでカレントディレクトリの `*.jpeg` ファイルすべての作成日時を撮影日時に変更することができる。もっと短く書ける方法が知りたい・・・。

以下、解説。

## 撮影日時の取得
まずはすべてのJPGファイルの撮影日時を取得してみようと思った。

```bash
$ for file in `find . -maxdepth 1 -name '*.jpeg'`; do
  sips -g creation "$file" | sed -e '1d'
done
```

これで概ねOKなのだけど、ファイル名にスペースが含まれていると、forに渡されるときにファイル名が分割されてしまう。たとえば、 `IMG_1234 (1).jpeg` というファイルがあると、次のように別々に処理されることになる。そして警告がでる。

```bash
sips -g creation "IMG_1234" | sed -e '1d'
sips -g creation "(1).jpeg" | sed -e '1d'
```

すこし調べたところ、`for`をつかっている限りこれは解消できなそうだったので、`xargs`を使った方法を模索する。 `find`の出力をスペースではなくnull文字区切りにし、`xargs`側もnull文字を区切りとして認識するようオプション指定。`xargs`で実行するコマンド内にパイプが含まれているので`sh -c`でコマンド実行する。

```bash
$ find . -maxdepth 1 -name '*.jpeg' -print0 | xargs -0 -I @ sh -c "sips -g creation '@' | sed -e '1d'"
  creation: 2000:01:02 11:22:33
  creation: 2000:01:02 11:22:44
  creation: 2000:01:02 11:22:55
  ...
```

## `touch`の仕様に合わせて日付フォーマット変更
ファイルの作成日時変更には`touch`をつかう。作成日を変更前より未来の日時に変更することはできないみたいだけど、画像ファイルの作成日時が撮影日時より過去になっていることはないはずなので実用上問題はないと思う。

日時は、次のような`yyyyMMddHHmm.ss`形式でなくてはならないけれど、`sips`コマンドは撮影日時を`2000:01:02 11:22:33`みたいな形式で出してくるので、フォーマットの変換が必要。

```bash
$ touch -t 200001021122.33 IMG_1234.jpeg
```

`sed`で正規表現をつかって次のように書いてみた。ここがもう少しシンプルになればよいのだけど。

```bash
$ echo -n '  creation: 2000:01:02 11:22:33' | awk '{print $2,$3}' | sed -E 's/([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\1\2\3\4\5.\6/g'
```

これを`sh -c`の中に組み込み。バックスラッシュはエスケープが必要になる。

```bash
$ find . -maxdepth 1 -name '*.jpeg' -print0 | xargs -0 -I @ sh -c "sips -g creation '@' | sed -e '1d' |  awk '{print \$2,\$3}' | sed -E 's/([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\\1\\2\\3\\4\\5.\\6/g'"
```

最後に`touch`。パイプで送られてくる文字列をタイムスタンプとしてオプションに指定する必要があるので、ここでも`xargs`を使う。下記のような感じ。

```bash
$ echo '200001021122.33' | xargs -I TS touch -t TS IMG_1234.jpeg
```

これも`sh -c`の中に組み込むと、最初に紹介したコマンドが完成する。

```bash
find . -maxdepth 1 -name '*.jpeg' -print0 | xargs -0 -I @ sh -c "sips -g creation '@' | sed -e '1d' |  awk '{print \$2,\$3}' | sed -E 's/([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\\1\\2\\3\\4\\5.\\6/g' | xargs -I TS touch -t TS '@'"
```

## `touch`でうまくいかないときのための`SetFile`利用バージョン

```bash
find . -maxdepth 1 -name '*.jpeg' -print0 | xargs -0 -I @ sh -c "sips -g creation '@' | sed -e '1d' |  awk '{print \$2,\$3}' | sed -E 's/([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\\2\\/\\3\\/\\1 \\4:\\5:\\6/g' | xargs -I TS SetFile -d 'TS' '@'"
```
スイッチングハブ(レイヤ2スイッチ)、ブリッジ、ゲートウェイ、リピータ、ルータ

応用情報技術者平成30年秋期 午前問32

CSMA/CD方式のLANで使用されるスイッチングハブ(レイヤ2スイッチ)は，フレームの蓄積機能，速度変換機能や交換機能を持っている。このようなスイッチングハブと同等の機能をもち，同じプロトコル階層で動作する装置はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0ef78797-27a0-c469-c52f-87f8ed0a4a60.png)


１、レイヤ2スイッチは、
その名称の通りOSI基本参照モデル第2層のデータリンク層で動作するネットワーク機器です。これと同じ動作を行う機器は、同じくデータリンク層を認識し、通過するフレームのヘッダ上の内のMACアドレスに基づいて、転出するポートを判断するブリッジ(Bridge)です。

なお、レイヤ2スイッチは各種機能をハードウェア機構で実現するのに対し、ブリッジはソフトウェアの機能として実現する点で異なります。

２、ゲートウェイは、
OSI基本参照モデルの全階層を認識し、主に4層より上で異なるネットワーク間の変換を行う通信機器です。

３、リピータは、
OSI基本参照モデル第1層の物理層で接続し、データ伝送中に弱くなった電気信号を増幅することで、データの伝送可能距離を延長するLAN間接続装置です。

４、ルータは、
OSI基本参照モデルの第3層のネットワーク層で接続し、通過するパケットのIPアドレスを見てパケットを最適な経路に中継する通信装置です。

５、レイヤ７から、レイヤ１に行って、下層は上層のヘッダを付いている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/94887ffd-f007-efd9-fa8d-c548b8d97af7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3dd45f48-05dd-0eee-e0cf-fd191cd97452.png)

６、CSMA/CD方式は、Carrier Sense Multiple Access with Collision Detectionの略で、日本語に訳すと「搬送波感知多重アクセス／衝突検出方式」となります。

７、CSMA/CAは Carrier Sense Multiple Access/Collision Avoidance（搬送波感知多重アクセス／衝突回避方式） の略称

参照：
https://www.ap-siken.com/kakomon/24_haru/q32.html

OSI参照モデルまとめ
https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999

イーサネットで使用されるメディアアクセス制御方式であるCSMA/CD
https://qiita.com/lymansouka2017/items/4aa45fd146ce070569bb
【Ruby/Rails】スレッドエラー(ThreadError)をリトライする機構

# 概要

`Thread.new()`を使いマルチスレッド処理してたところ、Herokuにてリソース不足エラーが発生。

```
can't create Thread: Resource temporarily unavailable (ThreadError)
```

スレッドエラーのハンドリングと、ベストエフォートでスレッドを使うリトライ機構を作成した。

<br>

ちなみにHerokuで実行できるプロセス・スレッド数はかなり限られているので、ローカル環境との差異に注意。

https://devcenter.heroku.com/articles/limits#processes-threads

2020/08現在

```
free, hobby and standard-1x dynos support no more than 256
standard-2x and private-s dynos support no more than 512
performance-m and private-m dynos support no more than 16384
performance-l and private-l dynos support no more than 32768
```

<br>

ローカル環境がMacOSであれば、`sysctl kern.num_taskthreads`というコマンドで1プロセスあたりの最大スレッド数が調べられる。

```shell
$ sysctl kern.num_taskthreads
kern.num_taskthreads: 4096
```


# 注意

通常より少し負荷がかかったらスレッドが不足するような処理は、まず設計ミスしている可能性が高い。

別サーバーに処理を委譲できないか、APIの仕様的に少ないリクエスト数で済ませる方法はないかなど、立てなければいけないスレッドの数を減らす方法を先に考える。


# コード

```ruby
def retry_threads(times: 3)
  try = 0
  begin
    try += 1
    Thread.new { yield }
  rescue ThreadError
    sleep(1 * try)
    retry if try < times
    raise
  end
end
```

使えるスレッドがない場合、数秒待ちリトライする。

1回目のリトライでは1秒、2回目のリトライでは2秒...と待ちの秒数を可変にし、タイムロスを防ぐ。

待ち時間をマイクロ秒にして、細かくリトライを管理するやり方もあり。

<br>

実際の使用方法

```ruby
def heavy_task(url)
  # 重い処理
end

# urls = ["...","...",...]
threads = []
urls.all each do |url|
  threads << retry_threads{ heavy_task(url) }
end
threads.each(&:join)
```

# ベンチマーク

このリトライ機構で、スレッドを立てる許容度が実際どれぐらい上がったのか調査した。

## 条件
- 10秒かかる処理がリトライ対象
- 1秒づつリトライ待ち時間を増やす
- リトライは3回まで
- ローカル環境で実行(MacOS Catalina)
  - 最大スレッド数: 4096
- 処理できたタスク数をベンチマークの値にする

## 計測コード
```ruby
def heavy_task
  sleep(10)
end

def retry_threads(times: 3)
  try = 0
  begin
    try += 1
    Thread.new { yield }
  rescue ThreadError
    sleep(1 * try)
    retry if try < times
    p $count
    raise
  end
end

def no_retry_threads()
  begin
    Thread.new { yield }
  rescue ThreadError
    p $count
    raise
  end
end

$count = 0

# retryなし
loop do
  no_retry_threads{ heavy_task }
  $count += 1
end

# retryあり
loop do
  retry_threads{ heavy_task }
  $count += 1
end
```

## 結果

ローカル環境(最大スレッド数: 4096)で、10秒かかるタスクを処理した数の値。

|  リトライなし  |  リトライあり  |
| ---- | ---- |
|  4094  |  212888  |

# 参考
- [class Thread](https://docs.ruby-lang.org/ja/latest/class/Thread.html)
- [Ruby で例外を捕捉して一定回数 retry するメソッド](https://qiita.com/key-amb/items/668fe2e76c43010192a8)
- [Maximum Number Of Threads (Linux/MacOS) + OutOfMemory unable to create new native thread](https://whiteboardtalks.com/maximum-number-of-threads-linux-macos-outofmemory-unable-to-create-new-native-thread/)
- [プロセスとスレッドの違いとは？](https://yakst.com/ja/posts/39)
  - 1プログラムに1プロセス、1プロセスにつき1以上のスレッドを持つことが可能
B+木インデックスでDBの検索効率

応用情報技術者平成30年秋期 午前問29

"部品"表のメーカコード列に対し，B+木インデックスを作成した。これによって，検索の性能改善が最も期待できる操作はどれか。ここで，部品及びメーカのデータ件数は十分に多く，"部品"表に存在するメーカコード列の値の種類は十分な数があり，かつ，均一に分散されているものとする。また，"部品"表のごく少数の行には，メーカコード列にNULLが設定されている。実線の下線は主キーを，破線の下線は外部キーを表す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3fbf2713-157b-2529-ad93-6fe583f76810.png)


１、B+木インデックスは、
木の深さが一定で葉のみが値をもつ平衡木を用いたインデックスで、RDBMSのインデックス法として現在最も普及しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7646f6c1-a742-fb64-ca3d-109dfc3a861f.png)


B+木は、根および節にはキー値の範囲と下層のブロックへのポインタ、葉にはキー値と表内の行の位置情報と前後の葉へのポインタが格納されていて、根から節をたどっていくことで目的のデータを検索します。すべてのキー値が同じ深さにあるので、データ量が増加してもパフォーマンスの低下が少なく、どのキー値に対してもランダム検索や範囲検索、挿入・更新・削除を効率よく行える特徴を持ちます。また葉に含まれている前後の葉へのポインタによって一致検索だけでなく、"<"，">"，"BETWEEN"などの範囲検索を効率よく行えます。

しかし
・データの分布に偏りがある
・NULL値
・否定を含む
検索条件では効果を発揮できません。

なぜ上記検索条件であると効果を発揮できないとは、全てスキャンするですからね。
連続な範囲を確定できれば、効果を発揮できるとこのとですね。


参考：
https://www.ap-siken.com/kakomon/23_aki/q32.html
vue.js 日付指定ライブラリ　vuejs-datepickerで選択可能日付を制限する

#本記事について
vuejs-datepicker のライブラリ取得方法等、基本的な情報については省略します。

今回はvuejs-datepickerで選択できる日付を制限する方法を記載します。

#vuejs-datepickerで選択可能日付を制限する

テンプレートに、```:disabled-dates="disabledDates"```を設定

```
<template>
...
  <datepicker :disabled-dates="disabledDates"></datepicker>
...
</template>
```

script内で、```disabledDates```を指定する

```
<script>
  data() {
    return {
    　disabledDates: {
      　to: new Date(), 　　// 本日以前の日付は選択不可
    　　from: new Date(), 　　// 本日以降の日付が選択不可
    　　days: [6, 0], 　　// 曜日指定（この場合、土曜日・日曜日選択不可）
    　　daysOfMonth: [29, 30, 31], 　　// 各月の２９、３０、３１日が選択不可
    　　dates: [ 　　　　　　　　　　　// 選択不可の日付を複数指定
      　　new Date(2020, 8, 23),
      　　new Date(2020, 8, 24),
      　　new Date(2020, 8, 25)
    　　],　　　　　　　　　　　　　
    　　ranges: [{                  // 選択不可の期間を指定
      　　from: new Date(2020, 9, 1),
      　　to: new Date(2020, 9, 15)
    　　}],
      }
    }
  }
</script> 
```

参照：https://www.npmjs.com/package/vuejs-datepicker
クリックイベントで<label> と チェックボックス、テキストを動的に生成する【JavaScript】



#今回、実装したかったのはコチラ
<b>[実装デモ](https://okinawandream.github.io/label/)
:point_up::point_up::point_up:

- 当初、```<input type= checkbox>```と```<label>テキスト</label>```が別々に生成され、紐付けもされず苦労した。

- そこでまず、 ```<label>```に```<input>```を追加 

- 次に```<input>```に```<textnode>```を追加

- 出来上がった```<label>```を ```<li>```に追加するという手順を踏んで実装。

***



#【HTML】

```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>To do リスト</title>
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <div class="To-do-list">
      <h1>To do リスト</h1>
      <h2 id="today"></h2>
      <input type="text">
      <button>追加</button>
      <button id="done">完了</button>
      <ul>
        <!-- <li><label><input type="checkbox">買い物</label></li>
        <li><label><input type="checkbox">読書</label></li>
        <li><label><input type="checkbox">犬の散歩</label></li> -->
      </ul>
    </div>
    <script src ="js/main.js"></script>
  </body>
</html>
```
#【CSS】

```css

body {
  background: #a1d8e2;
}

h1 {
  font-size: 20px;
}

h2 {
  font-size: 15px;
}

.To-do-list {
  width: 500px;
  margin: 20px ;
}

ul {
  margin-top: 30px;
  padding: 0;
}

li {
  list-style: none;
  user-select: none;
}

input[type='checkbox'] {
  margin-right: 15px;
}
```



#【JavaScript】

```javascript
'use strict';

{
 //------------------------------今日の日付を取得-------------------------------------//

  let date = new Date();
  let month = date.getMonth() + 1;
  let year = date.getFullYear();
  let day = date.getDate();

  document.getElementById("today").textContent = `${year}年${month}月${day}日`;
//-----------------------------------End-----------------------------------------//

  //====================== クリックイベント 追加＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝=============//
  document.querySelector('button').addEventListener('click', () => {
    const li = document.createElement('li');
    const text = document.querySelector('input'); //html内のinput を選択
    const label = document.createElement('label');
    const input = document.createElement('input');//新たにinputを生成
    input.type = 'checkbox';

    const ul = document.querySelector('ul');
    li.appendChild(label);
    label.appendChild(input);
    label.appendChild(document.createTextNode(`${text.value}`));
    ul.appendChild(li);//labelにinputを追加した後、textnodeを追加。
                       //その出来上がったlabelをliに追加してulに追加するということを実行
    text.value = '';
    text.focus();
  });
//======================================End==========================================//

//||||||||||||||||||||||||| クリックイベント 削除|||||||||||||||||||||||||||||||||||||||||||//

  document.getElementById('done').addEventListener('click', () => {
    const fineshed = document.querySelectorAll('li')[0];
                                          //完了ボタンをクリックしたら、一番上のliが削除される
    fineshed.remove();
  });
}
//||||||||||||||||||||||||||||||||||End||||||||||||||||||||||||||||||||||||||||||||||//

```
DRY原則とCoC

【概要】
----------------------------------------
<b>1.DRY原則とは</b>

<b>2.CoCとは</b>

<b>3.DRY原則とCoCはどこで使うか</b>

<b>4.学んだこと</b>





1.DRY原則とは
----------------------------------------
"全ての知識はシステム内において、単一かつ明確な、そして信頼できる表現になっていなければならない"という原則です。

端的にいうと"重複させない"ということです。
ただ、絶対に守らなければならない訳ではないです。

保守性や可読性が損なわれることがあればDRY原則は避けても構わないということです。またテストコードについては必ずしも守らないといけないと言うこともありません。
</br>
2.CoCとは
----------------------------------------
"設定よりも規約を優先する"というルールです。

例えばコマンドでモデルのファイルを作る際に、"rails g model"と打ちます。そうするモデルに生成されます。これは"Rails"に則ったルールを利用して作成しています。1から自分自身でファイルを作るのではなく規約を優先したのです。
</br>
3.DRY原則とCoCはどこで使うか
----------------------------------------
DRY原則は以下の例がわかりやすいです。

```ruby:（１）DRY原則ではない
pass_students = 0
students = []

 student = {}
 student[:name] = gets.chomp
 puts "友達の名前"
 student[:score] = gets.to_i
 students << student
if student[:score] >=80
 puts "#{student[:name]}さんは合格"
 pass_students += 1
else 
 puts "#{student[:name]}さんは不合格"
end

 student = {}
 student[:name] = gets.chomp
 puts "友達の名前"
 student[:score] = gets.to_i
 students << student
if student[:score] >=80
 puts "#{student[:name]}さんは合格"
 pass_students += 1
else 
 puts "#{student[:name]}さんは不合格"
end

```

```ruby:（２）DRY原則
2.time do
 pass_students = 0
 students = []
  student = {}
  student[:name] = gets.chomp
  puts "友達の名前"
  student[:score] = gets.to_i
  students << student
 if student[:score] >=80
  puts "#{student[:name]}さんは合格"
  pass_students += 1
 else 
  puts "#{student[:name]}さんは不合格"
 end
end
```
これは一目瞭然です！
（２）の方が端的にまとめられ、冗長にもなっていないですし
保守性・可読性が上がっています。

CoCは、さきほども言った通り"rails g model" やアクションを設定するとhtml.erbが設定されることもそうです。
</br>

4.学んだこと
----------------------------------------
DRY原則を調べていくと、単純に繰り返しを避けるのではなく、システム/ソフトウェアの重複を避ける解釈がなされていました。OAOO原則はコードの重複を避ける意味合いです。
第1、第2、第3正規形

応用情報技術者平成30年秋期 午前問28

第1，第2，第3正規形とそれらの特徴a～cの組合せとして，適切なものはどれか。
　・どの非キー属性も，主キーの真部分集合に対して関数従属しない。
　・どの非キー属性も，主キーに推移的に関数従属しない。
　・繰返し属性が存在しない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0c90cd6c-942c-abd7-5c03-9d889f1f57de.png)


第1、第2、第3正規形の条件は以下の通りです。ここで、関数従属とは一方の属性集合の値 (の集合) がもう一方の属性集合の値 (の集合) を一意に決定する関係のことをいいます。
・第1正規形
　　全ての属性が単一値である状態

・第2正規形
　　第1正規形を満たし、かつ、主キーに部分関数従属する(主キーの真部分集合に関数従属する)属性が存在しない状態

・第3正規形
　　第2正規形を満たし、かつ、主キーからの推移的関数従属が存在しない状態

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足
第3正規形であることの効果又は影響に関する記述として，適切なものはどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8cdbcc2c-fd2b-25a7-3400-b9e28c60bd06.png)

・第3正規形は、第2正規形である表に対して、主キー以外の属性によって一意に決まる属性を別表に移すことで得られます。これによりデータの冗長性が排除され、第2正規形における行の挿入・削除および更新時の異常が発生しなくなります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/238cbb8d-849d-0faa-690e-86f408c7ace2.png)


正規化の段階について、ちょっと復習しましょう：
・第1正規形
　集団項目や繰り返し値を排除する。全ての属性が単一値をもつ状態。

・第2正規形
　主キーの一部分である属性に、関数従属している属性を別表に移す。全ての属性が単一値をもち、主キーからの部分関数従属がない状態。

・第3正規形
非キー項目に関数従属している項目を別表に移す。全ての属性が単一値をもち、主キーからの部分関数従属がなく、かつ、主キーからの推移的関数従属がない状態。


・"受注明細"表には、繰り返し項目がありません。⇒第1正規形の条件を満たす。
・主キーの一部分に関数従属する属性もありません。⇒第2正規形の条件も満たす。
・非キー項目である"商品コード"に関数従属している商品名が別表に移されていないため、⇒第3正規化までは行われていません。



参照：

https://www.ap-siken.com/kakomon/24_haru/q27.html

https://www.ap-siken.com/kakomon/29_aki/q27.html

https://www.ap-siken.com/kakomon/29_haru/q27.html
GoogleCloudPlatformの仮想マシン上に構築したMinecraft Server (Bedrock版)のバージョンアップ手順

# はじめに
統合版Minecraftを複数人でプレイするために、GoogleCloudPlatformのVMインスタンスにサーバー(ubuntu)を構築した。バージョンアップデート時の作業手順を毎回忘れるので、この記事にまとめておく。

# 環境・バージョン
Minecraft Server (Bedrock)：1.16.1.02→1.16.20.03
OS：ubuntu 1804 (GoogleCloudPlatform)

# 1. SSHでVMに接続
今回はブラウザのコンソールから接続
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/0256657d-fbf4-c15b-04d9-d411c7e18b42.png)

# 2. minecraft用ディレクトリに移動
cdコマンドでマイクラサーバーのディレクトリに移動
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/db8752c3-525e-65be-0df6-b701f3f6e969.png)
(任意)心配な場合はディレクトリをコピーしてバックアップを取るのもよし

# 3. 3つのファイルをバックアップコピー
以下の3つのファイルをバックアップコピー

 * permissions.json
 * server.properties
 * whitelist.json
 
```
$ cp server.properties server.properties.bk
$ cp permissions.json permissions.json.bk
$ cp whitelist.json whitelist.json.bk
```

# 4. 公式ホームページから最新版のServer(Bedrock)用ファイルダウンロードリンクをコピー
※2020年8月23日現在、[日本語用ページ](https://www.minecraft.net/ja-jp/download/server/bedrock)からだとリンクが設定されておらず、ダウンロードできないので注意

[公式ホームページのダウンロード用ページ](https://www.minecraft.net/en-us/download/server/bedrock)にて、以下の赤枠の部分から最新版のサーバー用ファイルのパスをコピー
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/f8884c99-a423-6eea-addf-174a3e3214c7.png)

# 5. コピーしたリンクからファイルをダウンロードし展開
ここではwgetコマンドでリンク先からファイルをダウンロード

```
$ wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.16.20.03.zip
```

そしてunzipでダウンロードしたファイルを展開。ファイルはすべて上書きでOK

```
$ unzip bedrock-server-1.16.20.03.zip
```

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/247ee49e-0f38-d953-1b5f-e240869f1e96.png)

# 6. 3.でコピーした3つのファイルを元に戻す
```
$ mv server.properties.bk server.properties
$ mv permissions.json.bk permissions.json
$ mv whitelist.json.bk whitelist.json
```

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/210eb85a-af8b-b696-8df9-b63786279ede.png)

# 起動確認
```
$ screen -S bds ./bedrock_server
```

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/cd652101-8502-369f-855d-c3c9a3a97f08.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/44410066-a51b-2a28-87ca-dca3b23a9678.png)

無事にサーバーに接続成功！バージョンアップ完了！
Mod計算

応用情報技術者平成30年秋期 午前問27

自然数を除数とした剰余を返すハッシュ関数がある。値がそれぞれ571，1168，1566である三つのレコードのキー値を入力値としてこのハッシュ関数を施したところ，全てのハッシュ値が衝突した。このとき使用した除数は幾つか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/def91252-b16f-c771-4e80-d712f85a29a0.png)


計算としては、仮に除数が x とすると、
571　Mod　x　＝　1168　Mod　x　＝　1566　Mod　x　ですね。


選択肢で一個ずつで計算したらいいですけど、
ただ計算は面倒ので、下記は、ちょっと計算しやすい方法かなと思います。

仮に　571/x = a あまり Y
1168/x = b あまり Y
とすると、
571=ax+Y
1168=bx+Y
(b-a)x=1168-571=597
b-aはある自然数ですね。なので、597÷選択肢が割り切れるが答えですね。

念のため、1566も上記1168のように計算すると、万全ですね。


参照：
https://www.ap-siken.com/kakomon/30_aki/q27.html
Blender2.8背景画像が見えない

VRChatをはじめてアバター作りを始めました。初めての事ばかりで苦戦しています。

#下絵を見ながら作りたいのにオブジェクトが邪魔で下絵が見えない
自分のモデリング力では下絵なしでは無理です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696509/15cdb941-8a60-2658-841e-66d276c304b7.png)

#設定がありました
- オブジェクトモード
- シーンコレクションで背景画像をクリック
- オブジェクトデータプロパティ
- 深度をデフォルトに設定

目が見えた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696509/853fbf2b-8c07-0a3c-221a-5613c3650206.png)


#ほかにも前・後の設定がありました
前
背景画像がオブジェクトの前に見える

後
背景画像がオブジェクトの後ろに見える
AWS FireLens 用 fluentd コンテナの開発時のみ <source> を追加する

# 問題

FireLens でユーザー独自の fluentd を使う場合、設定ファイルに以下のような &lt;source&gt; セクションが自動で追加される。

```conf:fluent.conf
<source>
  @type unix
  path /var/run/fluent.sock
</source>
<source>
  @type forward
  bind 127.0.0.1
  port 24224
</source>
```

設定ファイルに上記のような記述が既にされていた場合、重複が生じてしまい以下のようなエラーが発生してしまう。

```text
[error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: Address in use - bind(2) for "0.0.0.0" port 24224>
```

fluentd コンテナをローカル環境などで開発する段階においては、何らかの &lt;source&gt; がないと入力が得られずテストができないため、ECS で動かすタイミングで上記エラーに遭遇することがある。

# 対応策

1. 開発時だけ設定ファイルに &lt;source&gt; を入れて、開発が終わったら消す
  - 愚直なパターン。
1. Dockerfile の ARG などを活用して、開発ビルド時のみ &lt;source&gt; を入れるようにする
  - 開発以外のときは &lt;source&gt; が入らないように RUN をうまいこと書く。
1. `@type file` など重複しない type で代用する
  - ファイルなど別の type 経由でデバッグする方法。
1. 別のコンテナから起動して、コンテナ上で設定ファイルに &lt;source&gt; を追加する
  - 後述。

1 に関しては手間がかかってしまうほか、設定の消し忘れで FireLens のエラーを誘発してしまう恐れが常につきまとう。
2./3. は、開発用のロジックがプロダクション環境にも含まれてしまう問題がある。これをどう捉えるかは人次第だが、個人的には若干の気持ち悪さが残る。

# 主題: 別のコンテナから起動させる

4 の方法について: 基本的には 1. と似たアプローチだが、これをコンテナという仮想環境上で行う点が違いとなる。

```Dockerfile:Dockerfile
FROM <開発中のコンテナ>

# localhost を listen する設定を追加
RUN sed -e '1i<source>' \
        -e '1i  @type forward' \
        -e '1i  port 24224' \
        -e '1i  bind 0.0.0.0' \
        -e '1i</source>' \
        -i <設定ファイルへのパス>
```

上記をビルドして実行すれば、fluentd 本体の設定ファイルには手を加えることなく、ローカル開発時のみ &lt;source&gt; を追加することができる。これにより fluent-cat で自由にデバッグ入力が可能となる。

また、上記例では forward type を指定したが、sample (dummy) type を指定することで fluent-cat が不要になる。
https://docs.fluentd.org/input/sample

リポジトリにしたのでよければどうぞ。
https://github.com/tsubasaogawa/aws-firelens-fluentd-dev-kit

# むすび

本手法の欠点として、FROM で fluentd コンテナを指定している都合上、 fluentd コンテナにビルドが生じるたびに本コンテナのビルドも必要になる。頻繁に fluentd コンテナをビルドするような開発スタイルだと、多少の手間がどうしても発生してしまう。

願わくば FireLens 側でエラーの発生を避ける方法があればこんなことをせずに済むのだけど、なにかご存知な方教えてください。
Vue CLI にreset.scssを入れた。

# ビューが崩れるのでreset.scssを入れたい。
#### 色々調べてみたが App.vue の style でimport するのが簡単。<br><br>他にもやり方はあるが、今回はこの方法でやってみる。<br><br>src に css フォルダーを作成し、reset.scss を入れる。<br><br>あとは App.vue の style タグで import するだけ。
```vuejs:src/App.vue
<style lang="scss">
@import "./css/reset.scss";     <!-- 左の記述を追加 -->
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  
}
</style>
```
#### 変な所についていた margin が消えたので reset.scss が効いていることが確認できた。<br><br>他にも npm でインストールするやり方などあるので、次回はそちらを試してみたい。<br><br><br><br>参考記事:[【Vue CLI】普通の外部CSSをcomponent全体に反映させたい](https://nekorokkekun.hatenablog.com/entry/2019/07/30/222507)