OmniAICreator/Qiita-1.07M huggingface dataset:
【TypeScript】 基本的な型 


#はじめに
TypeScriptについて勉強をしているので、アウトプットとして数回に分けて投稿していきます。

#Boolean
最も基本的なデータ型である``Boolean型``はtrue/falseを指定します。

```JavaScript
let isFinished: boolean = false;
```

#Number
数値は``number型``、``hex型``、``binary型``、``octal型``、``big型``が用意されています。

```JavaScript
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let big: bigint = 100n;
```

#String
文字列に対しては``string型``を用います。

```javascript
let color: string = "blue";
color = 'red';
```
#テンプレートリテラル
バッククウォート``(`)``で文字列を囲み、``${}``を使って式を記述します。

```javascript

let fullName: string = `Taro`;
let age: number = 33;
let sentence: string = `Hello, my name is ${fullName}. I'll be ${age + 1} years old next month.`;
```


#Array
配列を書く方法は2つあります。

```javascript

let list: number[] = [1, 2, 3];
```

```javascript

let list: Array<number> = [1, 2, 3];
```

#Tuple
``Tuple型``は複数の値を保持する配列に対し、型の順序を制限することのできる型です。
以下の例では0番目にstring型、1番目にnumber型しか置けない様に制限しています。

```javascript

let color: [string, number]
vote = ['red', 100];     // OK
vote = ['green', 200];   // OK
vote = ['yellow', 300];  // OK
vote = ['AAA', 'BBB'];   // Error
```

#Enum

デフォルトでは、各要素の値として先頭から順番に 0、1、2 という連番の整数値が内部的に割り当てられます。

```javascript

enum Sports {
  Soccer,   //= 0
  Baseball,  //= 1
  Basketball   //= 2
}

console.log(Sports.Soccer);  //=> 0
console.log(Sports[Sports.Baseball]);  //=> Baseball
```

#Any

``any型``の値はどんな型とも相互変換可能であり、実質TypeScriptの型システムを無視することに相当します。
どんな値でも代入可能であるため、なるべく使用しないことが望ましいとされています。

```javascript

const age: any = 23;
const name: string = age;
```

#Void
``Void型``はreturn時に値を返さないことを示します。

```javascript

function foo(name: string): void {
  console.log(`Hello, ${name}`);
}
```

#Never
``Never型``はreturnすることがない関数を示します

```javascript

function error(msg: string): never {
  throw new Error(msg);
}
```
#Void型とNever型の違い
・**``Void型``**　→　returnされる値がないことを意味する(呼び元には必ず帰ってくる)
・**``Never型``**　→　return自体がされない


#Object
object型は「プリミティブ以外の値の型」(number, string, boolean, bigint, symbol, null, undefined以外の型)です。
JavaScriptにはオブジェクトのみを引数に受け取る関数があり、そのような関数を表現するための型です。

```javascript

declare function create(o: object | null): void;

// OK
create({ prop: 0 });
create(null);

create(42); //エラー：Argument of type '42' is not assignable to parameter of type 'object | null'.

```

#参照

[TypeScript Documentation:BasicTypes](https://www.typescriptlang.org/docs/handbook/basic-types.html)
[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a)
[Node.js] response.writeHeadとresponse.setHeaderって何が違うの？

# はじめに
Node.jsを勉強していて、setHeaderとwriteHeadって何が違うの...？となったのでソースコードなどから調べてみました。

# setHeaderのソースコードを見てみる
setHeaderの実装部分を示します。setHeaderはheadersに名前と値を格納しているだけということがわかります。
headersに値を格納しているので、例えばgetHeader(name)によって値を取得することができます。

```javascript
OutgoingMessage.prototype.setHeader = function setHeader(name, value) {
  if (this._header) {
    throw new ERR_HTTP_HEADERS_SENT('set');
  }
  validateHeaderName(name);
  validateHeaderValue(name, value);

  let headers = this[kOutHeaders];
  if (headers === null)
    this[kOutHeaders] = headers = ObjectCreate(null);

  headers[name.toLowerCase()] = [name, value];
};

```
(https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js)

# writeHeadのソースコードを見てみる
writeHeadの一部を抜き出したものを示します。
this[kOutHeaders]がtruthyな値かどうかで場合分けがされています。this[kOutHeaders]はヘッダーの名前と値をキャッシュしているデータになるので、setHeader()などでキャッシュされているかどうかで分かれることになります。
setHeader()が呼び出されていた場合、writeHeadの内部でもsetHeader()が実行され、writeHeadの引数で指定した名前と値もキャッシュされます。
一方、setHeader()が呼び出されていない場合、引数で指定した名前と値をheadersに格納するだけとなります。

```javascript
  let headers;
  if (this[kOutHeaders]) {
    // Slow-case: when progressive API and header fields are passed.
    let k;
    if (ArrayIsArray(obj)) {
      if (obj.length % 2 !== 0) {
        throw new ERR_INVALID_ARG_VALUE('headers', obj);
      }

      for (let n = 0; n < obj.length; n += 2) {
        k = obj[n + 0];
        if (k) this.setHeader(k, obj[n + 1]);
      }
    } else if (obj) {
      const keys = ObjectKeys(obj);
      for (let i = 0; i < keys.length; i++) {
        k = keys[i];
        if (k) this.setHeader(k, obj[k]);
      }
    }
    if (k === undefined && this._header) {
      throw new ERR_HTTP_HEADERS_SENT('render');
    }
    // Only progressive api is used
    headers = this[kOutHeaders];
  } else {
    // Only writeHead() called
    headers = obj;
  }

```
(https://github.com/nodejs/node/blob/299984561eff45bddc5bb802e5b22d47277e5ca5/lib/_http_server.js)

# 具体例
setHeaderを使っている場合は、console.log(res.getHeader("content-Type"));が実行されると
content-Type':'text/html; charset=UTF-8と表示されます。

```javascript
"use strict"
const http = require("http");
const server = http.createServer((req, res) => {
    res.setHeader('Set-Cookie', "accessed_date=" + Date.now() + ";");

    res.writeHead(200, {
        'content-Type':'text/html; charset=UTF-8'
    });

    res.end();
    console.log(res.getHeader("content-Type")); // => 'content-Type':'text/html; charset=UTF-8'
});

const port = 8000;
server.listen(port, () => {
    console.info("listening on" + port);
})
```

setHeaderを使っていない場合undefinedと表示されます。

```javascript
"use strict"
const http = require("http");
const server = http.createServer((req, res) => {
    res.writeHead(200, {
        'content-Type':'text/html; charset=UTF-8'
    });

    res.end();
    console.log(res.getHeader("content-Type")); // => undefined
});

const port = 8000;
server.listen(port, () => {
    console.info("listening on" + port);
})
```

# まとめ
- setHeaderを使うと値をキャッシュすることができる
    - 　例えばgetHeaderなどで値を取り出すことができる
    - 　setHeaderの実行後はwriteHeadでも値のキャッシュが行われるようになる
- writeHeadだけを使うと値のキャッシュなどが行われない
    - その分、処理は早くなる
Bootstrapでアコーディオン 


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="momonoki1990" data-slug-hash="LYRELpm" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Bootstrapでアコーディオン ">
  <span>See the Pen <a href="https://codepen.io/momonoki1990/pen/LYRELpm">
  Bootstrapでアコーディオン </a> by 熊瀬川直也 (<a href="https://codepen.io/momonoki1990">@momonoki1990</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

* BootstrapはCSS・JSどちらも読み込む(https://getbootstrap.jp/)
* 全体を```ul```で囲み、親+子の1セットを```li```で囲む(この辺はアコーディオンとは直接関係ないのでなんでもよし)
* 子要素に```class="collapse"```をつけてつぶす。また、```id="target1"```もつけておく
* 親要素に```data-toggle="collapse" data-target="#target1"```をつける。「トグル(スイッチ)」とは一般的に切り替えスイッチのことで、ここでは「開閉を切り替えるためのスイッチ」かな。
* ```data-toggle="collapse"```を指定することでその要素がアコーディオンを開閉するためのスイッチとなる。
* ```data-target```で開閉対象を指定する。子要素のidをセットする。```#```をつけるのを忘れず。
* ```data-target```にセットするidは固有にすること。子要素すべてに同じidを付与(この時点で問題だが)してそれをセットすると、一つのボタンを押すことで全てが開閉してしまう。
* 親要素に付加する```aria-expand="false" aria-controls="target1"```はどちらも読み上げブラウザに付加情報を与えるもので、```aria-expand```は開閉状態、```aria-controls```は開閉対象を示す。
* 矢印は```position: absolute```で浮かせて、```position: relative```をセットした親要素に対する相対位置で位置を定める。

## 参考
とほほのBootstrap 4入門
http://www.tohoho-web.com/bootstrap/collapse.html
Ruby で解く AtCoder ARC109 B 二分探索

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Regular Contest B - log](https://atcoder.jp/contests/arc109/tasks/arc109_b)*
<font color="brown">Difficulty: 524</font>

今回のテーマ、二分探索

入力例 1の説明で AtCoder らしい`ミスリード`がありますが、n + 1 の長さの丸太で 1 ～ k までの短い丸太をつくればヨシ！
# Ruby
```ruby.rb
n = gets.to_i
m = (1..).bsearch { _1 * (_1.next) / 2 > n.next } - 1
puts n - m + 1
```
```bsearch.rb
m = (1..).bsearch { _1 * (_1.next) / 2 > n.next } - 1
```
二分探索です。1 ～ k までの短い丸太の長さの合計は、`k * (k + 1) / 2` で求めます。`bsearch`はブロック内の条件が`true`になった最初の値を返しますので、`-1` します。

```range.rb
(1..Float.INFINITY)
(1..nil) # Ruby 2.6 以降
(1..)    # Ruby 2.7 以降
```
終端を持たない範囲オブジェクトの指定方法です。AtCoder の環境は`Ruby2.7`ですので、いずれの書き方でもヨシ！

# 類題　C - Buy an Integer
*[AtCoder Beginner Contest C - Buy an Integer](https://atcoder.jp/contests/abc146/tasks/abc146_c)*
<font color="brown">Difficulty: 741</font>

```ruby.rb
a, b, x = gets.split.map(&:to_i)
y = (1..).bsearch { _1 * a + _1.to_s.size * b > x }
if y.nil?
  puts 0
elsif y > 1000000000
  puts 1000000000
else
  puts y - 1
end

```
こちらは`B - log`に比べ、範囲オブジェクトより低い場合と高い場合がありますので少しだけ難しくなっています。

||B - log|C - Buy an Integer|
|:--:|:--:|:--:|
|コード長 (Byte)|84|174|
|実行時間 (ms)|62|61|
|メモリ (KB)|14428|14400|
# まとめ
+ ARC 109 B を解いた
+ Ruby に詳しくなった

参照したサイト
*[instance method Range#bsearch](https://docs.ruby-lang.org/ja/latest/method/Range/i/bsearch.html)*
*[class Range](https://docs.ruby-lang.org/ja/latest/class/Range.html)*
welcartで自動生成される会員Noの変え方

#自己紹介
ホームページ制作＆スキルシェアをしている3児の母です。

今回は、wordpressで簡単にECサイトが作れるwelcartを使っていた時に、お客様より顧客情報のナンバリングを変えたい！とリクエスト頂いたので、備忘録しておきます。
会員Noという箇所の変更方法になります。

#phpmyadmin
まずはphpmyadminへログインします。
wordrpessをインストールした時に自動発行したデータベースのユーザー名とパスワードが必要になります。

分からない場合、実はwp-config.phpファイルに書いてあります。
ファイルマネージャーやFTPからwordpressが入っている階層へ以下のようなファイル一覧が出てくるので、この中の【wp-config.php】をクリックすると、データベースユーザー名、パスワードという記述欄があるので、phpmyadminのログイン時にデータベースユーザー名、パスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/cf3b85cb-742f-fbc1-04e5-62ecb12cc39d.png)

#必ずバックアップを取ってから
データベースをいじるので、必ずバックアップを取ってから作業を進めましょう。
エクスポートという項目があるのでエクスポートしておきます。
今回、新規構築だったのでこの作業は飛ばします。

#変える値
wp_usces_member
の中に会員情報が入っています。こちらを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/7e7ae0c1-8814-de49-c4be-f97f7c638f47.png)

#操作
操作という箇所で変える事が出来ます。今回はユーザーIDの自動発行規則だったので【AUTO_INCREMENT】という箇所を修正しました。
最後の3という数字は、テストユーザーが既に2人まで数値が配置されていて、次の登録で本来であれば3番になるので3になっています。
次に登録した方のユーザーIDがどんな見え方にしたいかという文字列を入れておきます。

実際に、この値を変えてユーザー登録をするとよくわかると思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/d3b7a8ce-206d-4bc8-c7b3-e8509efd9b3f.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/ab073f8a-0595-23bb-8d2b-e44038b5c973.png)


ちなみに、修正前は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/9f066987-eab2-5581-d7a8-0d29a0ad7afb.png)

#まとめ
意外に簡単に出来ます！でも、phpMyadminはwordpressの情報も全て入っているので、気を付けて操作を進めてくださいね。
firebaseコマンドが実行できない時の対処法

###1.firebaseコマンドを実行 

firebase loginコマンドを実行するが、反応しない状態↓

```
masahiro@MacBook-Air chatbot % firebase login
zsh: command not found: firebase
```

###2.PATH を通すコマンドを入力
export PATH=$PATH:`npm bin -g`を実行

```
masahiro@MacBook-Air chatbot % export PATH=$PATH:`npm bin -g`
(not in PATH env variable)
```
###3.再度firebaseコマンドを実行

firebase loginを実行→login完了できていることを確認

``` 
masahiro@MacBook-Air chatbot % firebase login
Already logged in as ○○○○@gmail.com
```

# まとめ

パスが通っていないことが原因でした。
パスが通っていないことによるエラーは上記以外でも発生するので、パスの設定を変更しようと思います。
AWSのLightsailでLet’s Encryptの証明書が自己証明書化して、どハマりした件

## 状況と症状
   - 初めてLightsailを借り、apacheをセットアップし、慣れた手つきでターンッ！と、3つのドメイン（2つはサブドメイン）の証明書をLet's Encryptで発行
   - サブドメインのURLには、普通にHTTPSでアクセスできるのに、なぜかメインのドメインだけ自己証明書となり、警告表示。原因不明のオレオレ証明書無間地獄が始まる :fire: 
   - 焦って、証明書のdeleteとかrevokeとかいろいろやっても、メインのドメインは相変わらず自己証明書のままで1〜2時間泣かされる…

## 解決した手段と原因
  - こちらの[記事](https://teratail.com/questions/34560)を見つけて、どうも、勝手にAWSが自己証明書を発行してくれているらしいと推測（オレオレ証明書のCommonNameは「ip-1xx-2x-1-2xx.ap-northeast-1.compute.internal」というAWSのAZ臭あり:smiling_imp:） 
  - そこでとうとう、apacheの /etc/httpd/conf/httpd.confにて、ServerNameにメインのドメイン名を書いていることが怪しいと思いたち、IPアドレスに変えてみる
  - 無事、メインのドメインURLを叩いても、オレオレ証明書ではなく、Let's Encryptの証明書で表示された
    
## 結論
- Apacheの設定について、もっと勉強しよう自分　（Nginxももっと勉強しますはい）
- ServerNameにドメイン名を記載すると、EC2やLightsailではSSLでハマることがある

夜中に焦りまくって苦しんだので、同じ苦しみにある人に役に立てばこれ幸いにて :waxing_gibbous_moon: 

もう疲れたよパトラッシュ
Java printf()メソッド

#１，printf()　メソッドは、フォーマットに用いるメソッドです。
#２，ソースコード
```java:Main.java
public class Main {

	public static void main(String[] args) {

		System.out.printf("%d This is a format String ", 123);

		boolean myBoolean = true;
		char myChar = '@';
		String myString = "hiro";
		int myInt = 50;
		double myDouble = 1000;

		System.out.printf("%b", myBoolean);
		System.out.printf("%c", myChar);
		System.out.printf("%s", myString);
		System.out.printf("%d", myInt);
		System.out.printf("%f", myDouble);

		System.out.printf("Hello %10s", myString); //
		System.out.printf("Hello %-10s", myString); //

		System.out.printf("You have this much money %.2f", myDouble);
		System.out.printf("You have this much money %.1f", myDouble);
		System.out.printf("You have this much money %f", myDouble);

		System.out.printf("You have this much money %+f", myDouble);
		System.out.printf("You have this much money %020f", myDouble);
		System.out.printf("You have this much money %,f", myDouble);

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
Java メソッド（method）の作り方とオーバーロード

#１，Javaではクラスメソッドをオリジナルで作ることができます。
<font color="Red">**※一つ一つルールをしっかり覚える必要があります。**</font>
#２，ソースコード
>ルール１，static を必ずつける

```java:Main.java
public class Main {

	public static void main(String[] args) {

		String name = "hiro";
		int age = 21;

		hello(name, age);

		int x = 3;
		int y = 4;
		int ans = add(x, y);
		System.out.println(ans);

	}

	public static void hello(String name, int age) {
		System.out.println("Hello " + name);
		System.out.println("You are " + age + " years old.");
	}

	public static int add(int x, int y) {
		int ans = x + y;
		return ans;
	}

}
```
>ルール２，オーバーロードをする場合は同じメソッド名にし、異なるパラメーターを書く

```java:Main.java
public class Main {

	public static void main(String[] args) {

		int a = add(1, 2);
		System.out.println(a);
		int b = add(1, 2, 3);
		System.out.println(b);

	}

	public static int add(int a, int b) {
		System.out.println("This is overloaded method #1 ");
		return a + b;
	}

	public static int add(int a, int b, int c) {
		System.out.println("This is overloaded method #2 ");
		return a + b + c;
	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
Java Wrapperクラス

#１，Wrapperクラスの紹介です。
Wrapperクラスは、プリミティブ型のデータを参照型と同じような扱いにできるクラスです。
これによって、参照型に含まれているメソッドが使えるようになります。

#２，ソースコード
```java:Main.java
public class Main {

	public static void main(String[] args) {
		
		
		// primitive    // Wrapper
		// ---------    // -------
		// boolean      // Boolean
		// char         // Character
		// int          // Integer
		// double       // Double

		Boolean a = true;
		Character b = '@';
		Integer c = 123;
		Double d = 3.14;
		String e = "hiro";

		if (a == true) {
			System.out.println("This is true");
		}

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
pythonメモ


```python
#!/usr/bin/env python3

# YYYYMMDD Get
import datetime
today = datetime.date.today()
yyyymmdd = today.strftime('%Y%m%d')
yyyymmddhhmmss = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

# ファイルの定義
dir = '/opt/script/log'
file = '/opt/script/log/hoge.txt'
filecopy = file + '-' + yyyymmddhhmmss
filegz = filecopy + '.gz'

#--- Function ----------------------------------#
# File Copy
def func_file_copy(file, filecopy):
    print('func_file_copy')
    import shutil
    shutil.copyfile(file, filecopy)

# File Gzip
def func_gzip(file, filegz):
    print('func_gzip')
    import gzip
    import shutil
    with open(file, 'rb') as f_in:
        with gzip.open(filegz, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)

# File Delete
def func_delete_file(file):
    print('func_delete_file')
    import os
    os.remove(file)

# File List
def function_file_list():
    print('function_file_list')
    import os
    from operator import itemgetter
    global filelists

    filelists = []
    for l_file in os.listdir(path=dir):
        base, ext = os.path.splitext(l_file)
        if ext == '.gz':
            l_file_full = dir + '/' + l_file
            filelists.append([l_file_full, os.path.getctime(l_file_full)])
    filelists.sort(key=itemgetter(1), reverse=True)
    for name in filelists:
        print(name)

def function_file_list_delete():
    MAX_CNT = 3
    for i,file in enumerate(filelists):
        if i > MAX_CNT - 1:
            print('{}は削除します'.format(file[0]))
            filedelete = format(file[0])
            func_delete_file(filedelete)

def function_file_truncate(file):
    open(file, 'w').close()

#--- Main --------------------------------------#
func_file_copy(file, filecopy)
func_gzip(filecopy, filegz)
func_delete_file(filecopy)

print('--- Before ------------------------------')
function_file_list()
print('-----------------------------------------')

function_file_list_delete()

print('--- After -------------------------------')
function_file_list()
print('-----------------------------------------')

function_file_truncate(file)
```
GitLabでのコンフリクト解消をWebUIで実施するときの元ブランチへの影響

## 用語
・取り込み元ブランチ(release/2)
・取り込み先ブランチ(release/1)

## 事象
release/2からrelease/1のマージを実施中コンフリクトが発生したため、WebUIでのコンフリクト解消を実施しました。
release/2のブランチも保護しており、取り込み後も残す運用をしていました。
コンフリクト解消後、取り込み元のブランチのコミット履歴を見てみると
```Merge branch release/1 into release/2```と呼ばれるコミット履歴が増えており、release/2にrelease/1の内容が含まれていた。

## 原因
![3E221BC8-EF41-4617-80C0-76571695CB39_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917548/9dd64f92-8112-8adb-6062-a1b7e9999cb7.jpeg)

コンフリクト解消画面のインタラクティブモードではコンフリクト発生箇所しか表示されていないが、commit messageには
```Merge branch release/1 into release/2```
と書かれており、ここで、release/2ブランチがコンフリクト箇所以外にもrelease/1の内容を取り込んでしまう:frowning2:
(元々マージ後はマージ元ブランチは削除されるため、このような仕様になっているのだろうか。。)

## じゃあどうすればよかったのか
release/2のブランチにコンフリクト箇所のみ修正するには、gitlabの機能を使ってコンフリクト解消するのではなく、
release/2のブランチで修正を別途実施後、再度マージの確認を実施すればよかった。


## 上記事象が発生したときの対応策
元ブランチを残すときにこの事象が発生してしまった時の対応策としては、取り込み先から取り込み元のブランチのマージ
(今回でいう Merge branch release/1 into release/2)
が発生した場合にはそのコミット履歴をrevertすれば元のブランチは取り込み前にソース上は戻ります。
AWS EducateでだってWordPressを動かしたい！

# 初めに
おい、AWSならLightsailでWordPressの環境作れば良いじゃん！ってなりそうですよね？ところがどっこい、何とAWS Educateでは使えないようなのです…という訳で、EC2で環境構築を行いました。因みに、何故動かしたいかというととある脆弱性の検証をしようと思ったからです。こちらは、はてなブログの方に載せたいと思います。ご興味のある方はそちらをどうぞ。(https://zuck3r.hatenablog.com/)

# 本題
それでは、まずどのようなシステムを組んだのか紹介したいと思います。
OS：Ubuntu18.04
サーバー：apache
DB：mariadb
言語：php7.2
ソフトウェア：WordPress

### 実際に構築してみる
ここからは構築の解説に入りたいと思います。

#### １．インスタンス周りの設定
まずはインスタンスの作成とセキュリティグループの追加。特にいう事は無いかなと。開けるポートに関しては80番ですよね。後は、sshポート。これは元から空いてた気もします…脆弱な環境で敢えて構築する場合は接続を許すIPをホワイトリストに登録してあげましょう。

#### ２．Apacheの導入
以下のコマンドを用いて動かしてみて下さい。

```
$ sudo apt install apache2
$ sudo systemctl start apache2
```
こちらでインストール。一先ず作成したインスタンスのIPアドレスをURL欄に入力して、以下の画面が開いたらOK。
![Apache Default Page.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455271/5c2b1d89-202c-fc55-d620-cc56e2e41362.png)
という訳で、Apacheのインストール完了！

#### ３．DBと言語周りの環境構築
こちらは以下のコマンドで、PHPとmariadb等に必要なパッケージをインストール

```
$ sudo apt -y install php7.2 php7.2-mysql php7.2-cli
$ sudo apt -y install mariadb-server mariadb-client
#年の為起動コマンドを送っておく
$ sudo systemctl start mariadb
```
お次はDBの設定をします。以下を入力しましょう。パスワード、ユーザー名はそれぞれ変更をお願いします。

```
$ sudo mariadb
MariaDB [(none)]> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';
MariaDB [(none)]> FLUSH PRIVILEGES;
```
ちなみに一番最後の *FLUSH PRIVILEGES;* は、権限の反映というものでGRANTやREVOKEなどを使用して間接的に権限テーブルを変更した場合は、別にしなくても問題無いようです！

#### ４．WordPressのインストール
それでは、以下のコマンドを実行してください。これで最新版のWPを取ってくることが出来ます。

```
$ cd /var/www/html/
$ sudo wget https://ja.wordpress.org/latest-ja.tar.gz
$ sudo tar xvf latest-ja.tar.gz
$ sudo chown -R www-data:www-data .
```
ここまで出来たら、後はブラウザで IPアドレス/wordpressに接続して初期設定を行うだけなのですが折角なので、展開してるインスタンスのIPアドレスに接続したらWPが開くように設定を弄りましょう。触るのは以下のファイル、変更箇所を載せておきます。

```
$ cd /etc/apache2/
$ sudo vi apache2.conf 
-------------------------------------------
  170	<Directory /var/www/html/wordpress>
  171		Options Indexes FollowSymLinks
  172		AllowOverride None
  173		Require all granted
  174	</Directory>
--------------------------------------------
$ cd sites-available/
$ sudo vi 000-default.conf 
--------------------------------------------
  11   ServerAdmin webmaster@localhost
  12   DocumentRoot /var/www/html/wordpress
--------------------------------------------
```

これでブラウザのアドレスバーにインスタンスのIPアドレスを入れることによって、恐らくWordPressに接続できると思います。最後に、初期設定をしたらWordPressを動かせます。パスや、ユーザー名は先ほどのdb設定で作ったやつです。
![https___qiita-image-store.s3.amazonaws.com_0_122952_e2a57068-9ca9-de5a-9db6-273de5a97770.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455271/aa6c8794-cec4-70af-3d44-87f98bd5b8fa.png)

# 最後に
まさかの、Educateではlightsailは使えないという事で驚きましたが上手い事WPを起動させることが出来ました。これで、この後したい脆弱性の検証をする事が出来そうです。
Java Stringクラス

#１、Stringクラスには、様々な便利機能があるのでその方法を紹介します。

#２，ソースコード

```java:Main.java
public class Main {

	public static void main(String[] args) {

		String name = "hiro";

		boolean result = name.equals("hiro"); // true
		int result = name.length(); // 4
		char result = name.charAt(2); // r
		int result = name.indexOf("h"); // 0
		boolean result = name.isEmpty(); // false
		String result = name.toUpperCase(); // HIRO
		String result = name.toLowerCase(); // hiro
		String result = name.trim(); // hiro
		String result = name.replace("o", "a"); // hira

		System.out.println(result);

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
Java 乱数の生成　java.util.Random

#１，乱数の生成方法
>➊Random random = new Random();

>➋int x = random.nextInt(6) + 1; // int型

>➌double y = random.nextDouble(); // double型

>➍boolean z = random.nextBoolean(); // boolean型

#２，ソースコード

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

public class Main {

	public static void main(String[] args) {

		Random random = new Random();

		int x = random.nextInt(6) + 1;
		double y = random.nextDouble();
		boolean z = random.nextBoolean();

		System.out.println(x);
		System.out.println(y);
		System.out.println(z);

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
[Python] *args, **kwargsって何？ -引数の*(アスタリスク)-

## はじめに
以下のsample.pyのfunc()のように引数に\*args, **kwargsと書かれることがなにかと多いが何のことかを備忘録がてらまとめる。

```python:sample.py
def func(*args, **kwargs):
    ...
    return hoge
```
まず、args, kwargsとは

- args -> arguments
- kwargs -> keyword arguments

のことである。
argumentは引数という意味であり、keywordは解説するまでもないであろう。
これらの解説の前にPythonの引数について確認をする。

## Pythonの引数について
```python:arguments.py
def func(a, b, c, d=1, e=2, f=3):
    return
```
Pythonの関数には呼び出し時に変数を指定しなくても引数にデフォルトで値を設定する機能(アノテーション)がある。
※上の関数のd, e, fがそれに当たる

また、デフォルト値を設定する変数はデフォルト値を設定しない変数よりも後に配置する必要がある←重要

関数の実際の実行の仕方は以下のようになる。

```python:
>>>func(1, 1, 1) # a=1, b=1, c=1, d=1, e=2, f=3
>>>func(1, 1, 1, 2) # a=1, b=1, c=1, d=2, e=2, f=3
>>>func(1, 1, 1, e=10) # a=1, b=1, c=1, d=1, e=10, f=3
>>>func(1, 1, 1, 5, 6, 7) # a=1, b=1, c=1, d=5, e=6, f=7
>>>func(1, 1, 1, d=5, e=6, f=7) # a=1, b=1, c=1, d=5, e=6, f=7
```
では本題の\*args, **kwargsに移る。

## *argsについて
*argsにはデフォルト値が設定されていない引数の中で明示的に定義されていないものがタプル型として入る。
言葉よりも実際に確認した方がわかりやすいかと思う。

```python:args.py
def func(a, b, *args):
    print(a)
    print(b)
    print(args)

>>>func(1 ,2 ,3 ,4 ,5)
1
2
(3, 4, 5)
>>>func(1, 2)
1
2
()
```
関数funcは2つの引数a, bと*argsを取っており、引数の1つ目がaに2つ目がbに入り、残りがタプル型としてargsに入っているわけである。
引数を2つしか取らない場合はargsは空のタプルとなる。

## **kwargsについて
**kwargsにはデフォルト値が設定されている引数の中で明示的に定義されていないものが辞書型として入る。
これも言葉よりも実際に確認した方がわかりやすいかと思う。

```python:kwargs.py
def func(a=1, b=2, **kwargs):
    print(a)
    print(b)
    print(kwargs)

>>>func(a=1 ,b=2, c=3, d=4, e=5)
1
2
{'c': 3, 'd': 4, 'e': 5}
>>>func(1, 2)
1
2
{}
```
関数funcは2つの引数a, bと**kwargsを取っており、引数の1つ目がaに2つ目がbに入り、残りが辞書型としてkwargsに入っているわけである。
引数を2つしか取らない場合はkwargsは空の辞書となる。

## \*argsと**kwargsの合わせ技
まずはデフォルト値を設定する変数はデフォルト値を設定しない変数よりも後に配置する必要があるということを思い出す。
この規則により、引数の中でデフォルト値が設定されているものとされていないものの境目が決まる。
この境目を基準に、境目より前のデフォルト値が設定していないものが\*argsにタプル型として入り、境目より後のデフォルト値が設定されているものが\**kwargsに辞書型として入る。

```python:args_and_kwargs.py
def func(*args, **kwargs):
    print(args)
    print(kwargs)

>>>func(1, 2, a=3, b=4, c=5)
(1, 2) #args
{'a': 3, 'b': 4, 'c': 5} #kwargs
```
以下のようにもできる

```python:
def func(a, b, *args, c=1, d=2, **kwargs):
    print(a)
    print(b)
    print(args)
    print(c)
    print(d)
    print(kwargs)

>>>func(1, 2, 3, d=4, e=5)
1 #a
2 #b
(3) #args
1 #c : default
4 #d
{'e': 5} #kwargs
```
## <参考>*単独で引数にとる場合
\*以後の引数はデフォルト値を設定したものか**kwargsしか取れなくなる。
\*argsと同時には使えない。

```python:
def func(a, b, *, c=1, d=2, **kwargs):
    print(a)
    print(b)
    print(c)
    print(d)
    print(kwargs)

>>>func(1, 2, d=4, e=5)
1 #a
2 #b
1 #c : default
4 #d
{'e': 5} #kwargs
```
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～jQuery × axios編～

#制作環境

Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
axios : 0.19
Vue : 2.5.17
XAMPP
PHP : 7.4.3
Visual Studio Code

#はじめに

この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。


前回のつづきになります。

#関連記事

[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～事前準備編～](https://qiita.com/Charry/items/737085257784bd9fb6e2)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～JavaScript編～](https://qiita.com/Charry/items/f605cbb686e8c0796450)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～jQuery編～](https://qiita.com/Charry/items/74c66aea1a82070a6d3d)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～JavaScript × axios編～](https://qiita.com/Charry/items/ffd6db72de2c2be96e43)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～Vue.js × axios編～](https://qiita.com/Charry/items/7e932ce730a4d4c7e737)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～JavaScript × FetchAPI編～](https://qiita.com/Charry/items/8297146146a6b729c8f6)
[Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ～jQuery × FetchAPI編～](https://qiita.com/Charry/items/9f22f61e5ef455b83ecb)

#今回作成するもの

<font color="blue">axiosを利用し非同期通信を行い、自動で仕入れ先が入力される機能を実装します。</font>


##以下作成条件

* <font color="red">基本的な記述にはjQueryを使用し通信にはaxiosを使用します。</font>
* 数字が4桁入力されたら自動で仕入れ先を検索し、反映します。
* 検索するのにクリック操作を必要としません。`input`に入力されたら検索します。
* スクリプトの読み込みには`Laravel-mix`を使用します。
* 前回作成した`test.js`を編集して使用するで、必要なら`test4.js`等コピーを作成してバックアップしてください。

#スクリプトの作成

`resorces>js`内の`test.js`を開き、以下のように記述します。
<font color="red">前回の内容は全て削除してください。</font>

```JavaScript:test.js
// ここから先は前回のjQuery編の記述と同じため詳細は割愛します。
$(function() {

    $('#code').on('input', function() {
        let traderCode = $('#code').val();

        if (traderCode.length < 4) {
            return;
        }
// ここまでは前回のjQuery編の記述と同じ

        // アクセス先のURLを作成し、urlに代入します。
        let url = '/form_search?trader_code=' + traderCode;

        // ここから先は前回のJavaScript × axios編の記述と同じため詳細は割愛します。
        axios.get(url).then(function(response) {
            let data = response.data;
        // ここまで前回のJavaScript × axios編の記述と同じ

            // 受け取ったデータ(検索結果)を仕入れ先のvalueに反映します
            $('#supplier').val(data[0].trader_name);
        })
    })
})
```

#コンパイル

ターミナルを起動し、以下を実行してください。
<font color="red">※node.jsが必要です。インストールされていない方は、インストールを行ってください。</font>

node.js
https://nodejs.org/ja/

```PHP
npm run dev
```

#確認

その他の内容は前回と変わらないので、ここまでできたら動作を確認してください。


以上です。
次回に続きます。
Java Mathクラス　Math.sqrt

#１，平方根の作成方法
>➊Math.sqrt

#２，ソースコード

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

public class Main {

	public static void main(String[] args) {

		double x;
		double y;
		double z;

		Scanner scanner = new Scanner(System.in);

		System.out.println("Enter side x : ");
		x = scanner.nextDouble();
		System.out.println("Enter side y : ");
		y = scanner.nextDouble();

		z = Math.sqrt((x * x) + (y * y));
		System.out.println("The hypotenuse is : " + z);

		scanner.close();

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
＜AWS＞VPCのDNS ホスト名を『有効』にするということ

#背景
以前、EC2から同じサブネット内のEC2に秘密鍵を指定して「ssh」コマンドを実行した際、下記のようにエラーが出力され、SSH接続できないということがありました。

```
$ ssh -i id_rsa [ユーザー名]@[ホスト名]
ssh: Could not resolve hostname [ホスト名]: Name or service not known
```
接続先へは公開鍵を配置していて、セキュリティグループにも問題がない状態です。
結果的に、VPCのDNS ホスト名を『有効』にすることで解決したのですが、それまで全くこの機能について意識できていませんでした。
この記事で、VPCのDNS ホスト名を『有効』にするのとしないのとではどう違うのか、簡単に整理します。
#DNS ホスト名が『無効』の場合
![20201128①_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/effe14dd-c041-628b-0778-a191b68a05ee.png)
まず、VPCを作成すると、デフォルトではDNS 解決のみ『有効』になっており、DNS ホスト名は『無効』になっています。
この状態だと、ホストアドレス「.2」が割り当てられたDNSサーバー（Amazon Route 53 Resolver）はVPCに存在するのですが、名前解決ができません。
そのため、EC2①からEC2②に秘密鍵を指定して「ssh」コマンドを実行しても、エラーになってしまいます。
#DNS ホスト名が『有効』の場合
![20201128②_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/f0f9466d-6a48-00a9-495f-5a2a69ef9833.png)
VPCのDNS ホスト名を『有効』にすると、DNSサーバー（Amazon Route 53 Resolver）が機能し、名前解決を行ってくれるので、秘密鍵を指定して「ssh」コマンドを実行すると、EC2①からEC2②にSSH接続することができます。
#参考ドキュメント
以下、この記事を書く際に使用した公式ドキュメントです。
・[Amazon DNS サーバー（Amazon Route 53 Resolver）](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#AmazonDNS)
・[VPC での DNS の使用](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)
・[IPv4 用の VPC とサブネットのサイズ設定](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-sizing-ipv4)
cronの概要、設定方法

## 経緯と目的
開発業務の中でバッチ処理のトリガーとしてcronを扱う事となったため、事前調査と備忘録を兼ねて記事を作成する。

## cronとは？
UNIX系OSで利用されているジョブ（スクリプト）を自動実行するための常駐プログラム（デーモンプロセス）の一種。
設定したスケジュールに従ってプログラムを自動的に起動してくれる。
## crontabコマンド
設定するには`crontab`（“cron table”の略）コマンドを実行して任意の日時や処理を入力する。
その内容は`crontab ファイル`に保存され、デーモンの一種である`crond`（“cron daemon”の略）によってファイルに入力した内容に従ってプログラムを実行される。
#### ファイルの内容を表示

```
crontab -e
```
#### ファイルを表示

```
crontab -l
```
#### ファイルの内容を全削除 （※全削除なので要注意！）

```
crontab -r
```
## cronの設定
#### 基本構成

```
* * * * * <実行コマンド>
```
#### 日時設定
それぞれの`*`（アスタリスク） は下記の役割となっており、値を入力する事で実行の日時を指定する事ができる。

```
分（0-59） 時（0-23） 日（1-31） 月（1-12） 曜日（0-7　0→日、1→月、2→火、3→水、4→木、5→金、6→土、7→日） <実行コマンド>

59 04 10 * * <実行コマンド>    # 毎月10日の午前4時59日にコマンドを実行
15 * * * * <実行コマンド>      # 毎時15分になると実行
02 4 * * * <実行コマンド>      # 毎日AM 4:02 に実行
```
#### 繰返し設定
「/」を入れることで、繰り返したい間隔を設定。

```
*/1 * * * * <実行コマンド>    # 毎分0秒で1分おきにコマンドを実行
```
#### 複数の値を設定
「,」で区切ることで、複数の値を設定。

```
00,30 7 * * * <実行コマンド>    # 毎日AM 7:00とAM 7:30に実行
```
#### 実行範囲を設定
「-」で指定することで、実行範囲を設定。

```
00 7-9 * * * <実行コマンド>    # 毎日AM 7:00 8:00 9:00 に実行
```
Java GUIからの入力　javax.swing.JOptionPane

#１，GUIからの入力の方法
>➊String name = JOptionPane.showInputDialog("Enter your name");

>➋int age = Integer.parseInt(JOptionPane.showInputDialog("Enter your age"));

>➌double height = Double.parseDouble(JOptionPane.showInputDialog("Enter your height"));

#２，ソースコード

```java:Main.java
import javax.swing.JOptionPane;

public class Main {

	public static void main(String[] args) {

		String name = JOptionPane.showInputDialog("Enter your name");
		JOptionPane.showMessageDialog(null, "hello" + name);

		int age = Integer.parseInt(JOptionPane.showInputDialog("Enter your age"));
		JOptionPane.showMessageDialog(null, "you are " + age + " years old");

		double height = Double.parseDouble(JOptionPane.showInputDialog("Enter your height"));
		JOptionPane.showMessageDialog(null, "you are " + height + " cm tall");

	}

}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
デフォルトのflutter_appをステート管理方法別にブランチにしてGithubに置いてみた

# モチベーション
* 基礎の基礎のおさらいをしようということで、いろんなステート管理手法を比較可能なように、**すべて別ブランチにして1つのリポジトリに置いてみました**


## 各種アーキテクチャでflutter_appを書き直してみたの巻

## ChangeNotifierProvider
* [change_notifierブランチ](https://github.com/hummer98/flutter_app/blob/change_notifier/lib/main.dart) 
  [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/master...change_notifier)
  * オーソドックスなアレ

## ChangeNotifierProvider + BuilderでRebuildを局所化
* [change_notifier_and_builderブランチ](https://github.com/hummer98/flutter_app/blob/change_notifier_and_builder/lib/main.dart)
  * 力技だがBuilderでRebuildスコープを縛るのはわりと簡単
  * [(change_notifierとのdiff)](https://github.com/hummer98/flutter_app/compare/change_notifier...change_notifier_and_builder)
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/master...change_notifier_and_builder)


## ValueNotifier + ValueListenableBuilder
* [value_notifier_and_value_listenable_builderブランチ](https://github.com/hummer98/flutter_app/blob/value_notifier_and_value_listenable_builder/lib/main.dart)
  * よくわっかんね...
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/value_notifier_and_value_listenable_builder...change_notifier_and_builder)

## どこでも安心のReaviceXシリーズ、RxDart(BehaviorSubject)
* [rxdart_behavior_subjectブランチ](https://github.com/hummer98/flutter_app/blob/rxdart_behavior_subject/lib/main.dart)
  * 安心と安全のRxDart
  * StreamControllerだるいのがよくわかる
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/rxdart_behavior_subject...change_notifier_and_builder)


## RxDart + 生Provider
* [rxdart_and_raw_providerブランチ](https://github.com/hummer98/flutter_app/blob/rxdart_and_raw_provider/lib/main.dart)
  * BehaviorProviderを生Providerに追い出した
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/rxdart_and_raw_provider...change_notifier_and_builder)

## React界からの刺客、flutter_hooks
* [flutter_hooksブランチ](https://github.com/hummer98/flutter_app/blob/flutter_hooks/lib/main.dart)
  * 圧倒的記述量の少なさだが、全面書き換えっすね...
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/flutter_hooks...change_notifier_and_builder)

## 最新鋭ステート管理、flutter_hooks + riverpods
* [flutter_hooks_and_riverpodsブランチ](https://github.com/hummer98/flutter_app/blob/flutter_hooks_and_riverpods/lib/main.dart)
  * この記述量でRebuildスコープまで絞れる...**人類の科学はここまで来た**
  * [(masterとのdiff)](https://github.com/hummer98/flutter_app/compare/flutter_hooks_and_riverpods...change_notifier_and_builder)

## 総評
* blocはオワコンなので放置
* あらためて眺めると、`flutter_hooks`なんかはたしかに便利ではあるのだが、Rebuildの最適化をするには、結局のところBuildContextと戦う点ではそこまで劇的な変更ではなさそう。
* まぁちょっとは便利になっているけど、結局は**Rxが強いのでは？**
* 個人的には`ChangeNotifier`よりは生`Provider`に`ValueStream`生やすほうが好き
Java モニターからの入力　java.util.Scanner


#１，モニターに入力した文字列や数値を出力する方法
>➊Scanner scanner = new Scanner();

>➋String name = scanner.nextLine(); // 文字列の入力

>➌int age = scanner.nextInt(); // 数値の入力

#２，ソースコード（モニターから入力して、モニターに出力）



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

class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("What is your name?");
        String name = scanner.nextLine();

        System.out.println("How old are you?");
        int age = scanner.nextInt();
        scanner.nextLine();

        System.out.println("What is your favorite food?");
        String food = scanner.nextLine();

        System.out.println("Hello " + name);
        System.out.println("You are " + age + " years old");
        System.out.println("You like " + food);
    }
}
```

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
【JMH】JMH Gradle Pluginでkotlin-reflectを入れているとjmhJarがCould not expand ZIPで落ちる問題への対処【Kotlin】

# TL;DR
- `JMH Gradle Plugin`（`me.champeau.gradle.jmh`）で`kotlin-reflect`を入れていると`jmhJar`が`Could not expand ZIP '${キャッシュのファイルパス}/kotlin-reflect-1.4.20.jar'.`というようなエラーメッセージを吐いて落ちる
  - 一番下の`Caused by`は`org.gradle.api.file.DuplicateFileCopyingException: Encountered duplicate path "META-INF/versions/9/module-info.class" during copy operation configured with DuplicatesStrategy.FAIL`
- `tasks` -> `jmhJar`で`META-INF/versions/9/module-info.class`を`exclude`すれば状況は改善する
  - 原因は`Java 9`以降向けのモジュールシステム関連？

# 状況
冒頭に書いた通り、`kotlin-reflect`を入れていると`jmhJar`が`Could not expand ZIP '${キャッシュのファイルパス}/kotlin-reflect-1.4.20.jar'.`として落ちるようになりました。

# 対処
以下のように、`tasks` -> `jmhJar`に`META-INF/versions/9/module-info.class`を`exclude`する設定を追加した所正常に動作するようになりました。
ここで指定しているファイルは、`kotlin-reflect`の`jar`に含まれているものです。

```kotlin:build.gradle.kts
// 略

tasks {
    jmhJar {
        exclude("META-INF/versions/9/module-info.class")
    }

    // 略
}
```

原因は正直よく分かっていませんが、`META-INF/versions/9/module-info.class`は`Java 9`以降向けの内容で、今回触っていたプロジェクトは`Java 8`向けだったため、無くても困らないかなとは思っています。
【React】state を使ってみる ~ React Hooks/useEffect ~

# はじめに

React を習得するまでの軌跡をメモっていく備忘録的な記事です。

## state を使って１秒毎にカウントアップするタイマーを作る

~~~jsx:index.js
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';

const Timer = () => {
  const [time, setTime] = useState(0);

  // クリーンアップ関数を登録（return）する
  useEffect(() => {
    const timerId = setInterval(() => setTime(time + 1), 1000);
    return () => clearInterval(timerId);
  });

  return(
    <p>
      {time}
    </p>
  )
};

ReactDOM.render(
    <Timer />,
  document.getElementById('root')
);
~~~

## まとめ

import React, { useEffect } from 'react';を書くとuseEffectが使えるようになる。