OmniAICreator/Qiita-1.07M huggingface dataset:
お買い物プログラム

>RPG の道具屋での買い物をシミュレートしてみましょう。
具体的には、最初の所持金と注文履歴から、最終的な残金を計算します。
ただし、注文時に所持金が足りない場合、その注文は無視されます。
入力例 1 では、お金の単位を G として、ある道具屋での単価が下の表のようになっています。

>>薬草　= 10G
せいすい = 100G
木の棒 = 50G

>ここで、初期の所持金が 300 G であり、注文履歴が

>>1. やくそう 5 個
2. せいすい 3 個
3. きのぼう 1 個
4. せいすい 1 個
5. やくそう 3 個

>であるため、残金は次のように計算できます。

>>1. やくそう 5 個を買える所持金があるので、残金は 300 - 10 × 5 = 250 G
2. せいすい 3 個を買える所持金はないので、残金は 250 G
3. きのぼう 1 個を買える所持金があるので、残金は 250 - 50 × 1 = 200 G
4. せいすい 1 個を買える所持金があるので、残金は 200 - 100 × 1 = 100 G
5. やくそう 3 個を買える所持金があるので、残金は 100 - 10 × 3 = 70 G

>よって、最終的な残金は 70 G です。
このような計算をシミュレートするプログラムを作成してください。


getsに入力されるのは以下の意味をもった数です。

```
3 #=> アイテム数
10 100 50　#=>  アイテムの値段
300 5 #=> 所持金　買い物をする回数
1 5 #=> 商品番号　買う商品の個数
2 3 #=> 〃
3 1 #=> 〃
2 1 #=> 〃
1 3 #=> 〃
```

完成したコードがこちら

```
N = gets.to_i
price = gets.chomp.split(" ").map(&:to_i)

a = gets.chomp.split(" ").map(&:to_i)
shopping = a[1]
money = a[0]

shopping.times do
 order = gets.chomp.split(" ").map(&:to_i)
 order_amount = order[1]
 order_index = order[0] - 1
 total_price = order_amount * price[order_index]

 if money >= total_price
   money -= total_price
 else
 end
 
end

puts money
````

##解答のポイント

- price（商品の値段）とorder_index（商品番号）を結びつける。

そのまま引数に指定するだけだと[１]を取得してしまうため、予め−１をすることで[０]から取得できるようにする。
文系がAI領域に無手で挑む~PART9~ 　あいつ・・kaggle始めるってよ

# 記事を書こうと思ったきっかけ
**conpass**にて参加可能な「はんなりkaggle部」というイベントに参加してきましたので、感想というほどのものでもありませんが、少し共有させて下さい。(著者は江戸っ子３代です。てやんでぇです。)

![スクリーンショット 2021-03-29 22.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/230cd233-d20b-ac61-4b49-d766e1e38ad8.png)


# 本記事の結論を急に言う
こういうイベントがあるのを知らない人には、早く広まればいいなーって思いました・・・。
そして参加を悩んでいる人はもう参加しちゃえばいいと思います。

https://hannari-python.connpass.com/event/206908/

# この記事の読者対象者
- kaggleに興味を持ち始めた方
- 一緒に勉強したい仲間が欲しい方
- kaggleに関して質問してみたい方

上記の方はピッタリだと思います！
(この記事の読者対象者というよりは、イベントの対象者という感じでしょうか・・・？)

# 実際空気どんな感じだったの？
はい、そうですよね。

基本はゆる〜い感じでまったりしやすいなーと個人的に感じました。

流れはですね、ZOOMで行っていただくのですが、画面はオフです。あとは

①最初３人ずつくらい４グループに分かれてブレイクアウトルーム内にて自己紹介をし
②メインルームで「もくもく」やる感じです
③最後に学習共有したい人はして
④ZOOM内で２次会とかやってらっしゃるみたいです。(23時以降ですかね。)

**前回は「もくもくする」のもルームを分けてやったそうですが、色々良い感じにするために、今回はこういう形にしたそうです。**

# 何より誰でも参加できるのがいいんだ
正直技術レベルは関係ないと思います。誰でも参加出来ると思います！

喋ってもいいですし、喋らなくていいあたりが、自由さを与えてもらってる感じです。

# 是非参加に悩んでいる方には・・・
気軽に参加して欲しいです(それは私が言っていいのかは知りませんが。。。笑)
ためらわずに参加して、ご自身のきっかけにして欲しいです。

あとあと、こんな初学者オススメの記事も教えて頂きました〜。

https://www.kaggle.com/learn/overview

https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0

# 毎度言うてますが・・・
初学者の方、文系で数学全然わかんないのに機械学習始めてしまった方！など、一緒に頑張っていければと思ってます〜。

拙い文章ですが毎度読んで頂きありがとうございます。それではまた！！
Power Automate DesktopでWebのUI要素有無を判断すると何かと便利！

#はじめに

本記事は、[前回の記事「Power Automate Desktop のWebUI要素を自作し、動的に活用する」](https://qiita.com/MiyakeMito/items/cb2d193bb64152ce26be)を基に記載しています。
上記記事で、UI要素を動的に利用すること前提となりますので、ご承知ください。


#動的なUI要素の指定

目的のWebページに対し、指定するUI要素の有無が判断できると、

######テーブルに対し行数や列数を意識せずにデータを取得する

といったことが可能となります。

[前回の記事](https://qiita.com/MiyakeMito/items/cb2d193bb64152ce26be)では、テーブル構造を取得する際、UI要素を動的に設定することで実現可能と記載しました。
※スクレイピング機能による『テーブルまるっと取得』（勝手に命名しました）を行うと方法もあります

あらかじめ列数と行数を指定し、ループ処理で取得することになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4f1128fd-cab0-eba9-8cfa-73f7c438a8c7.png)
このの表の場合は、4列×3行ですね。

|発着 |金額|乗換|早楽安|
|:-|-|-|----------:|
| 06:59→12:435時間44分 | 5,720円| 乗換：4回|早安|
| 06:59→13:136時間14分 | 5,720円| 乗換：4回|安|
| 08:07→13:435時間36分 | 5,720円| 乗換：3回|楽安|

なので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/36f779fc-f2d5-bc73-a27b-330a0cdb5169.png)

このような処理になります。

ですが、

####列数や行数が変動するようなテーブルを相手にする場合は、動的にループ回数を変える必要があります。
#####（または列数や行数を数えるのが面倒な場合も）


このような場合は、『Webページに次が含まれる場合』アクションを利用することが有効です。
このアクションは、「指定したUI要素が存在するか？」をチェックできますので、列や行の末端を検知可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0c3488c3-86d7-fd0d-5064-ee7e202cbc09.png)

下記のように構築すると、テーブルの行数や列数をフローへ設定する必要がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/aa2bf07f-d017-aafe-72e8-61452f8af51e.png)
UI要素より値を取得する前に、『Webページに次が含まれる場合』アクションで、UI要素の存在チェックをします。
存在しない場合＝「１行の末端にたどり着いた」や「テーブルの末端にたどり着いた」と判断しループを抜けます。

UI要素には下記のように、ループのIndexを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/9e561d99-dd21-b59b-ba0e-94831630687b.png)

#まとめ
『Webページに次が含まれる場合』アクションを活用することで、
・Webページの動作によるレイアウトの変化
等への対応が可能となります。

連続処理できそうだけど・・・Webの仕様が割と鬼畜！といった場合の解決の糸口になると思います。
【SpringBoot】で簡単なアプリを作ってみよう！(2/3) ~画面表示~

この記事は以下の続きです。
[SpringBoot2で簡単なアプリを作ってみよう！(1/3) ~環境設定~](https://qiita.com/nmaolks/items/63be973c604a20cecdaa)

第２回目は画面表示をしていきます！

## 画面を表示する
パスについてですが、前回も載せておりますが戻って確認するのも面倒だと思うのでこちらにも載せておきます。
![スクリーンショット 2021-03-27 22.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234354/6cb66866-8397-a71e-4fb1-8140fd4a0b37.png)


#### HTMLを作成する

"xmlns"で名前空間を宣言することによりThymeleafタグを使用することができるようになります。
（\<th:xxx>)←こんな感じのタグを使います。

```html:productManage.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>商品管理</title>
</head>
<body>
	<p>商品管理</p>
	<table>
		<tr>
			<th>商品名</th>
			<th>商品数</th>
		</tr>
	</table>
</body>
</html>
```

#### コントローラを作成する
次にコントローラのパッケージ、ファイルを作成します。
```@Controller```をつけることによってDIコンテナに登録することができます。
(DIについてはまた別の記事を書こうと思ってます。)
```@GetMapping```でGETリクエストを受け取りHTMLを返しています。

```java:AdminController.java
@Controller
public class AdminController {

	@GetMapping("/")
	public String index(Model model) {
		return "productManage";
	}
}
```
ここまできたら画面を確認してみましょう。

下記URLで画面が表示されるはずです。
http://localhost:8080/

### ◇画面イメージ
![スクリーンショット 2021-03-28 13.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234354/723bcfe7-e248-525c-b847-c9da5c250e4c.png)

↓第3回はこちら
[SpringBoot2で簡単なアプリを作ってみよう！(3/3) ~DB操作~](https://qiita.com/nmaolks/items/c2329ace699e10ebf908)
勉強メモ20_SVNの勉強（つどつど更新）

### 1 svn diffコマンドの比較結果が見にくい場合、比較結果をサクラエディタに貼り付け、検索の以下↓↓正規表現を使って見やすくする

サクラエディタで以下、正規表現を使って検索
正規表現：^[+-][^+-].*
または　　^[^+-].*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/9b94bb65-da2c-8df0-a53f-8b8fccd4cb36.png)

### 2 SVNリポジトリーに登録されているファイル一覧から対象ファイルをsvn deleteでファイル削除し、ツリーを表示する

```shell
$ cd /home/rinchome/
$ cat SvnDeleteFileList.txt
/usr/paypayApuri/controller/AAACont.java
/usr/paypayApuri/logic/AAALogic.java

$ cd /usr/paypayApuri/
$ cat /home/rinchome/SvnDeleteFileList.txt | xargs svn delete
$ svn commit -m '削除コミット実施'
$ svnlook tree /usr/paypayApuri/

```

### 3 ログを表示とか差分を表示とかよく使う機能は、コンテキストメニューに追加しておく

SVNをインストールすると、マウスの右クリックで以下のように「メインコンテキスト」と「サブメニュー」と「メニュー」の構成になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/f2a60cdf-6a51-ec06-38b8-ad23bee49cd9.png)
以下のように設定のコンテキストメニューから、ログ表示とか変更をチェックとかのチェックボックスにチェックをいれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/a6c94783-236b-9797-c16f-12f17db3db47.png)
以下のように追加されるのを確認済み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/c89ff47d-ef37-2e6b-dd33-9c494bc659fe.png)
【At Corder】【初心者】Welcome to AtCoder をRuby で解いてみた


#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:


https://atcoder.jp/home

#問題 Welcome to AtCoder
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。

入力は

```
a
b c
s
```
出力は
a+b+cとｓを空白区切りで1行に出力

入力例

```
1
2 3
test
```

出力例

```
6 test
```

#回答

```rb
a = gets.to_i  
b,c=gets.chomp.split(" ").map(&:to_i);
s = gets.chomp

print("#{a+b+c} #{s}\n")

```

#解説
get メソッドは入力を文字列で受ける。改行も含める。

.chompは改行をはずす

.to_iは数値オブジェクトに変換

二行目　入力を配列に格納(to_iなので数値として保存)

split(sep = $;, limit = 0)は第 1 引数 sep で指定されたセパレータによって文字列を limit 個まで分割し、結果を文字列の配列で返します。ブロックを指定すると、配列を返す代わりに分割した文字列でブロックを呼び出します。(今回はlimitはない)

#感想
なにを使って入力を受けるのか、データ型はなにか、など基本的なことを押さえていないと入力を受け付けることすらできない。
コツコツ理解していこう:muscle:


<a id="#reference"></a>
# 参考文献
- [IT女子のHappy × IT日記　-getsとgets.to_iの違い-](http://itgirl.hatenablog.com/entry/2016/05/25/212505)
- [【Ruby】paizaで頻出メソッドまとめてみた - Qiita](https://qiita.com/umaibou1126/items/cd9192aa008e386d96de)
- [Ruby 3.0.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/String/i/split.html)
Deno Deployをやってみた

ツイッター見てたら流れてきたのでやってみた

# Deno Deployとは？

>Deno Deploy is a distributed system that runs JavaScript, TypeScript, and WebAssembly at the edge, worldwide. The service deeply integrates the V8 JavaScript runtime with a high performance asynchronous web server to provide optimal performance without unnecessary intermediate abstractions.
https://deno.com/deploy

google翻訳
> Deno Deployは、 JavaScript、TypeScript、およびWebAssembly を世界中のエッジで実行する 分散システム です。このサービスは、 V8 JavaScriptランタイムを高性能非同期Webサーバーと緊密に 統合して、不要な中間抽象化なしで最適なパフォーマンスを提供します。

どうやら**今日**発表されたDeno用の公式ホスティングサービス(？)のようです！
githubに限らず、web上にあるJavaScriptとTypeScriptのコードからサーバーが建てられると。
公式ドキュメントは[こちらに](https://deno.com/deploy/docs)。

まだベータ版のようですが、さっそく試しに使ってみたいと思います。

# ① プロジェクト名を決める

ここで入力した名前が初期ドメインになります。（後から変更可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/e271ddc4-d0a4-8714-46e1-1a6c3b6c5882.png)

# ② githubでリポジトリを作成

今回は試すだけなので、リクエストヘッダをそのままJSONで返すサーバーを建ててみたいと思います。
新しいリポジトリを作成して、公式ドキュメントを参考にコードを書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/00ec16b6-e636-6172-2901-3c5ddbc4926e.png)

# ③ githubのURLをコピペ

「githubからデプロイ」と「URLからデプロイ」の2種類あるみたいですが、ここではgithubからデプロイを選んで、URLをコピペしてきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/dd2d4137-f514-595b-636a-828561e88d39.png)

# ③ githubと連携させる
githubアプリと連携しますか？みたいなダイアログが出てくるので、許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/51f4ba50-e2e4-581b-8138-1faede572f20.png)


# ④ デプロイ完了
デプロイしたプロジェクトには、「Visit」というリンクから飛べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/7cef435e-5d31-4a0c-09c3-b46e6221588e.png)

ここまで10分弱ですが、無事デプロイできました！
[こちら](https://nkth-deno-deploy-test.deno.dev/)で公開中です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/812ad5b3-8881-e929-6364-4c8322e9a28e.png)


# 料金は…？
[こちらのページ](https://deno.com/deploy/docs/pricing-and-limits)にある通り、ベータ期間中は無料で使用でき、ベータ期間が終わると、詳細な価格が発表されるとのこと。

　

最後に、公式ドキュメントからDeno Deployの特色を引用して終わります。（google翻訳）
> - Web上に構築：ブラウザーと同じように、fetch、WebSocket、またはURLを使用します
> - TypeScriptおよびJSXの組み込みサポート：タイプセーフコード、およびビルド手順なしの直感的なサーバー側レンダリング
> - Web互換のESモジュール：明示的なインストールを必要とせずに、ブラウザーと同じように依存関係をインポートします
> - GitHubの直接統合：ブランチにpushし、デプロイされたプレビューを確認し、mergeして本番環境にリリースします
> - 非常に高速：1秒未満で展開し、ユーザーの近くでグローバルにサービスを提供
> - URLからデプロイ：URLだけでコードをデプロイします
> - CloudflareWorkers®と互換性のあるAPI：既存の大規模なエコシステムの恩恵を受けられます

>https://deno.com/deploy/docs
ラグランジュの未定乗数法 - 幾何的イメージプロット

# 概要

* ↓の動画の最後の方で$\lambda$を変化させたときのグラフの話があったが、頭の中でイメージしきれなかったのでプロットした
* [【ラグランジュの未定乗数法】あの計算の意味、説明できますか？【幾何的イメージも解説】#094​ #VRアカデミア](https://www.youtube.com/watch?v=2-E4XiHQEcM)
* プロットした[ノートブックはココ](https://github.com/kzy611/qiita/blob/master/method_of_Lagrange_multiplier_plot.ipynb)

# プロット

今回、最小値を求める$f(x)$、拘束条件$g(x)$、$F(x, y, \lambda)$（動画と同じ）

```math
\begin{align}
f(x) &= x^2 + y^2 \\
g(x) &= x + y - 1 = 0 \\
F(x, y, \lambda) &= f(x) - \lambda g(x) \\
&= (x^2 + y^2) - \lambda (x + y - 1)
\end{align}
```

* $\lambda$を変化させたときの$z = F(x, y, \lambda)$を$0 \leq x \leq 1$、$0 \leq y \leq 1$でプロットすると以下のようになる
* 確かに、$\lambda = 1$のときに拘束条件を満たす線上で接平面が水平になってそう

| $\lambda$ | グラフ |
|:---------:|:------:|
| 0.0       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/afdccab2-f301-9eee-5c05-1b1a6194048d.png)|
| 0.2       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/ebc51096-065e-3d4a-e6fa-3d2907ae7cab.png)|
| 0.4       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/21d4d7e9-4210-0b99-a740-6ca0a9119683.png)|
| 0.6       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/3cac3110-c6a3-151e-445b-8a83197c2b1f.png)|
| 0.8       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/ef981d84-8016-b283-87b0-ecc6031353b5.png)|
| 1.0       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/9e4ea145-0b12-115b-edfe-76b34e083805.png)|
| 1.2       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/77792dc8-5898-858e-ac76-b9633513c354.png)|
| 1.4       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/4c2ebb57-9e74-957d-dd9f-4c8984f555d3.png)|
| 1.6       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/5ccde810-6a01-836f-7d74-a039eaad74ee.png)|
| 1.8       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/45a56d6d-6ff2-72fd-97e5-faa964d32aab.png)|
| 2.0       |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/2719a691-3569-12a7-7aae-eec4807679a9.png)|
Laravelで複雑なValidationをやりたい時のFormRequest

# 概要

DB接続なども織り交ぜた複雑なValidationをやりたい時、最近忘れがちなので備忘録として。

## 前提

- Laravel5.5~6.xで確認

## 実装

```HogeRequest.php
.
.
.

class HogeRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }


    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'fuga_id' => [
                'required',
                function ($attribute, $value, $fail) {
                    // ここにロジックを書く
                    $fuga = Fuga::find($this->input('fuga_id'));

                    if ($fuga !== null) {
                        return $fail('fugaをすでにしています');
                    }
                },
            ],
        ];
    }
```

## 解説

- rulesに`function ($attribute, $value, $fail) {}`を使用することで、複雑なValidationを表現できる
- `$this->input({$name})`で値を取得できる
- `return $fail({$message})`でValidation失敗時のメッセージを返却できる

## 参照

すみません。ブックマークし忘れてしまいました...
【C#】staticっていつ使えばいいの？何がいいの？

# staticいつ使えばいいんですか？
積極的に使う気が起きなかったが、上司のソースコードを見ると各所に散見されたので
いつ使えばいいのか？どんなメリットがあるのか？という観点で調べた。
[1. staticとは](#1-staticとは)
[2. staticは何がいいのか](#2-staticは何がいいのか)
[3. staticの良くないところ](#3-staticの良くないところ)
[4. いつ使えば良いのか](#4-いつ使えば良いのか)
[5. staticの書き方](#5-staticの書き方)
[6. まとめ](#6-まとめ)
[7. 参照](#7-参照)

### 1. staticとは
+ 修飾子。
+ 静的クラス・メンバーの宣言で使う。
    + 静的クラスの場合メンバーも静的にする。
    + 静的クラスの場合コンストラクターを含めることはできない。
+ メモリを静的に確保する。  

> メンバ変数にstaticをつけた場合、その変数がメモリ上のどこに配置されるかが固定される。
メモリ上の位置が固定されるということはどこからでもこの変数にアクセスできるということです。
[https://qiita.com/suin/items/0897adc7dc653b9c20de]



### 2. staticは何がいいのか
  + インスタンス化するより処理が早くなる。というかインスタンス化は相対的にメモリを圧迫する。
  + インスタンスメンバーが追加されない保証がされる。  
  > 「静的クラスを使用する利点は、インスタンス メンバーが誤って追加されないことをコンパイラで確認できるという点です。 
  コンパイラによって、このクラスのインスタンスを作成できないことが保証されます。」

  + staticにするとインスタンス参照せずに直でメンバーへアクセスできる。  
  + クラス唯一のものであればstaticとするという使い方ができる。

  下記のPersonクラスではnameやageはPerson毎に変わるが、scientifiName(学名)は必ずホモサピエンスとなるのでstaticとしている。これによりインスタンス化されて  

  例）

  ```C#
  class Person
  {
    public string name; // インスタンス化したPersonごとに変わる。
    public int age;     // 同上。
    public static string scientificName;// インスタンス化してもPersonは皆ホモサピエンスで変わらない。
  }

  Person p = new Person()
  p.name = "安倍 晋三"; 
  p.age  = 66;
  Person.scientificName = "Homo Sapiens";
  ```



### 3. staticの良くないところ
  + どのクラスからでもアクセスできてしまう為副作用が起こりうる。
    （副作用：関数が終了した後に影響が残ること。この場合呼び出され値を変更されるなど。)

  + Singletonパターンを採用した方がいいケース
  [同様の質疑](https://teratail.com/questions/36721)がありました。  
  そもそもSingletonパターンとは
  [[C#]Singletonパターン実装方法（備忘録](https://qiita.com/prozolic/items/9bd5b62f82194d7636f7)
[C# での Singleton についてまとめ](https://saiya-moebius.hatenadiary.org/entry/20091017/1255799846)
  
  

### 4. いつ使えば良いのか
  + 共通のメソッドを定義する場合
  + 共通のプロパティを定義する場合
  + 複数クラス間で共通のプロパティを共有したい場合

  とは言え、副作用を考えると極力使いたくないしオブジェクト指向的でないと思います。
  しかし、上記例のようにクラス唯一の変数であり、


### 5. staticの書き方
  ```C#
  static 型名 フィールド名
  // 例
  public class MyBaseC
  {
      public struct MyStruct
      {
          public static int x = 100;
      }
  }
  ```
クラスをstaticにした場合はスコープ内のメンバーもstaticとしなければならない。

##### アクセスする方法
  + 完全修飾名 (`MyBaseC.MyStruct.x`) を使用。
  （同じスコープからその静的メンバーにアクセス可能でない限り）
##### これはできない
  + 静的なローカル変数化 (つまり、メソッドのスコープで宣言された変数) 。

### 6. まとめ
静的メンバーはアプリケーション起動時にメモリを確保し
、終了までメモリの割り当てが変更されない。
故にどこからでもアクセスできるようになる。  

共通して使うメソッドや、クラス内で唯一の変数などに使う。  
メソッドは特別staticにする利点は見つからなかった。変数はインスタンス化することで、本来一つしかないはずの情報が複数作られるのを防ぐことができる。  

しかし、副作用があるため代替方法があるなら検討すべき。


間違いやツッコミあったら教えてください👨

### 7. 参照
[静的クラスと静的クラス メンバー](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members)
[PHP: 静的メソッドは何のためにあるか？](https://qiita.com/suin/items/0897adc7dc653b9c20de)
[わい、static変数とstaticメソッドについて熱く語る](https://qiita.com/Nekonecode/items/19f3a261a8391853ddec)
[プログラミング序論 11.記憶クラスとスコープ]
(http://www.ibe.kagoshima-u.ac.jp/edu/gengo0/p11.html#:~:text=%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E9%A0%98%E5%9F%9F%EF%BC%9A,%E3%81%A7%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)
Ajaxを簡単に実装するための覚え書き

Ajaxで何か送信するときのための覚え書き

```javascript
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
    if (req.readyState == 4) { // 通信の完了時
    if (req.status == 200) {
        // 通信の成功時
    }
    }else{
        // 通信中の処理
    }
}
req.open('POST', '送信先URL', true);
req.setRequestHeader('content-type','application/x-www-form-urlencoded;charset=UTF-8');
req.send('hoge=&example='); 
```
【Kotlin 初学者】setの使い方

# setについて
KotlinではSetter,Getterを省略してくれますすが、今回はカスタムして書いてみます。

```
var text: String = ""
  set(value) {
    field = value
    if(field == "name"){
      binding.text = ""
    } else {
      ""
    }
  }

fun test(){
  type = "name"
  // typeの中に文字列が入ってるのでsetが実行される
}
```
通話機能 OverconstrainedError Deviceidの解決方法


はじめまして、プログラミング初心者のコージです。今回はデバイス選択通話機能を実装するうえで苦労したOverconstrainedError　Deviceidの解決方法を忘備録として残しておきます。
苦労したとはいってもコードの改変はたった１行です笑

```ruby:call.js
      let audioId = $('#audioSource').val();
      let videoId = $('#videoSource').val();
      let constraints = {
          audio: {deviceId: {exact: audioSource}},　<-ここの記述を変更
          video: {deviceId: {exact: videoSource}} 
```


```ruby:call.js
      let audioId = $('#audioSource').val();
      let videoId = $('#videoSource').val();
      let constraints = {
        audio: {
            deviceId: audioId　<-exactを削除
           },
        video: { 
            deviceId: videoId　<-exactを削除
           }
```

まさかこれだけで３日苦しんだエラーが解決するとは、、、😭
Chromeでこの形式で指定できるようになったのはごく最近らしいです。上が以前の指定形式らしい。
古いから制約に引っ掛かるのかな？

全てのコードを見たい方はgithubのapp->javascriptからどうぞ
 ビデオ通話機能を実装したwebアプリケーションのコード: [circlefriends](https://github.com/kokou2727/circlefriends.git) 

#以上
twitter: [@siron_www](https://twitter.com/siron_www) 日常のこともつぶやいてるので友達感覚でフォローしてください😁
Rustにおける所有権の話

# 概要
Rustの中心的な機能として**所有権**があります。
今回は、その所有権について深堀りしていきます。

# 所有権について
## プログラムとメモリ
* プログラム実行中では、実行時にメモリを管理する必要があります。
* 例えばJavaですと、定期的に使用されていないメモリを検索するガベージコレクションみたいなのがあったり、CやC++では、明示的にメモリを確保したり、解放したりしないといけません。

**Rustでは、これを所有権という機能で管理します**

## 所有権とは？
* まず、型のインスタンスを作成し、変数に束縛するとメモリリソースが作成されます。
* そのライフタイムに渡って、Rustコンパイラが検証します。
* 束縛された変数は、リソースの所有者となります。これが所有権となります。

**所有権によるメリット**

* どの部分のコードが、どのヒープ上のデータを使用しているかを把握できる
* ヒープ上の重複するデータを最小化できる
* メモリ不足にならないようにヒープ上の未使用のデータを排除できる

## ちなみにスタックとヒープとは何か？
* スタック領域とヒープ領域を一言で表すなら、プログラムの中で一時的に使用するメモリです。

### スタック
* コンパイラやOSが自動的に割り当て、解放を行います。
* そのため、プログラムのタスクやスレッド、関数内の変数やアドレスに対して割り当てられます。

### ヒープ
* ヒープでは、メモリ領域を動的に確保、解放を繰り返すことができます。
* また、メモリが必要になった際に確保を行う為、不要になった際には解放するという処理を自分自身で行わないといけません。
* このヒープ領域は、プログラム実行時にOSからソフトウェアに対して一定量のヒープ領域が確保されます。

### 比較
* スタックでは、使用するサイズが決定しているので、使いまくるとスタックがオーバーフローが発生する可能性があります。
* ヒープでは、使用するサイズとタイミングは、アプリケーションで決定できるというメリットがあります。

## 所有権のルール
**所有権のルールは下記の3つです。**

* Rustの各値は、所有者と呼ばれる変数と対応します。
* どんな時でも、所有者は一つです。
* 所有者がスコープから外れたら、値は破棄されます。

---
## 例

* 下記の例ですと、Fooという構造体をインスタンス化して、変数fooに束縛してメモリリソースを作成しています。
* この時の変数fooが、所有者です。

```Rust
struct Foo {
    x: i32,
}

fn main() {
    let foo = Foo { x: 13 };
}
```

---

## 所有権とスコープ

* Rustでは、スコープと呼ばれる概念があります。
* スコープとは、要素が有効になるプログラム内の範囲のことを指します。
* また、スコープの終わりをリソースの解放の場所として使用します。

例:

```Rust
struct Foo {
    x: i32,
}

fn main() {
    let foo_1 = Foo { x: 13 };
    let foo_2 = Foo { x: 26 };

    println!("{}", foo_1.x);

    println!("{}", foo_2.x);
    // foo_2 はここでドロップ
    // foo_1 はここでドロップ
}
```

[実行結果]

```
❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.25s
     Running `target/debug/variables`
13
26
```

* 上記で**foo_2**が先にドロップするのですが、これは何故でしょうか？
* 答えは、スタックにあります。
* スタックでは、LIFO方式となるため、この場合は**foo_2**が先にドロップするのです。

### 構造体のドロップ

* 構造体のドロップは少し変わっていて、構造体がドロップされた場合、まず構造体自体がドロップされ、次にその子要素が個別に削除されます。

例:

```Rust
struct Bar {
    x: i32,
}

struct Foo {
    bar: Bar,
}

fn main() {
    let foo = Foo { bar: Bar { x: 13 } };
    println!("{}", foo.bar.x);
    // foo が最初にドロップ
    // 次に foo.bar がドロップ
}

```

# まとめ

* Rustでは、所有権という機能によりメモリ管理を行っています。
* メモリを所有している変数がスコープを抜けたら、メモリは自動的に返還される。この仕組みは、今まで無かった(ガベージコレクタがある言語では、使用されないメモリを検知して片付ける。CやC++のような言語では、メモリがもう使用されないことを見計らって、明示的に返還するコードを呼び出す必要がありました。)
 
# 参考文献
* [THE BOOK 4章](https://doc.rust-lang.org/book/)
* [Tour of Rust](https://tourofrust.com/)
プログラミングスクールの後半で考える、デザインについて

40代DTPデザイナーが、ゼロからプログラミングスクールに通ってみて
思ったことは、やっぱり、自分の得意分野って何？ってこと。

ゼロからスタートのプログラミングは、
どうしても脳がついていかない事が多くて
同じクラスの20代がグングン成長していく中、
適正もダイレクトに感じてしまう。というか、わかっちゃう。

嬉々として長時間のプログラミングに挑むクラスメイト。
エンジニアとしてプロダクトへのこだわりを見せる先輩たち。

20代なら、なりふり構わず集中できるかもしれない。
勢いで覚えていけるかもしれない。
でも、脳が追いつかない40代は、純粋にキーボードを叩き続けられるか否かで
ストレートにエンジニアへの道を目指すべきか、ちょっと考えちゃう時がある。

だから、デザインとかけ合わせる方法を選びました。
単純に美しいものは、世の中に溢れてる。
使いやすくシンプルなものも、すでにある。
自分だけの経験と、自分だけの感性を活かしたものを作りたい。

40代からは、得意 × 個性 × 経験 × プログラミング！！

今、この時代に、自分を深く見つめて再起動。
スクールに通えて、ホントに良かったと思います。
Railsコンソールを使ってレコード登録を行う方法


こんにちは、たにーです。

Railsのコンソールでadminレコードを作成したい場面がありましたので、
備忘録として記述します。

#rails console(コンソール)とは
rails の環境を読み込んだ状態でrubyコードを実行できるツールです。
他にも作成している rails アプリケーション内で定義したメソッドや読み込んでいる gem も実行することができます。


役立つ場面
- いろんなメソッドを試しながら実装したいとき
- エラーが起こったが原因がわからないとき

詳しくは今回書きませんが、
エラーが起きた際には、非常に役立つので覚えて損はありません。


#実際にコンソールで登録してみよう

まずは、コンソールを立ち上げます。

```terminal:terminal
 $ rails c
   Running via Spring preloader in process 6516
   Loading development environment (Rails 5.2.4.5)
   [1] pry(main)> 
```

```rb:terminal
   [1] pry(main)> モデル名.create(カラム名："カラムの値")
```


```rb:terminal
   [1] pry(main)> Admin.create!(email:"test1@gmail.com", password:"123456", )
      (0.1ms)  begin transaction
     Admin Exists (0.2ms)  SELECT  1 AS one FROM "admins" WHERE "admins"."email" = ? LIMIT ?  [["email", "tesrt1@gmail.com"], ["LIMIT", 1]]
     Admin Create (4.8ms)  INSERT INTO "admins" ("email", "encrypted_password", "created_at", "updated_at") VALUES (?, ?, ?, ?)  
         [["email", "test1@gmail.com"], ["encrypted_password", "$2a$12$gtXWZK10cp32d99s7zfnjO9OT19Q4FLT0nJPdTwVMKOTcnZXMtt6q"], 
         ["created_at", "2021-03-29 09:41:14.618946"], ["updated_at", "2021-03-29 09:41:14.618946"]]
      (5.3ms)  commit transaction
    => #<Admin id: 1, email: "test1@gmail.com", created_at: "2021-03-29 09:41:14", updated_at: "2021-03-29 09:41:14">
```

Createと出ており、無事idも付与されているのが分かります。
念の為、adminモデルに保存されているか確認しましょう。

```rb:terminal
   [2] pry(main)> モデル名.all
```

コントローラーの書き方と同じです。


```rb:terminal
   [2] pry(main)> Admin.all
     Admin Load (0.2ms)  SELECT "admins".* FROM "admins"
   => [#<Admin id: 1, email: "tesrt1@gmail.com", created_at: "2021-03-29 09:41:14", updated_at: "2021-03-29 09:41:14">,
   [3] pry(main)> 
```

確認できましたね。

終了するときは quitまたはexitでコンソールを閉じることができます。

#rails consoleの表記違い

あれ？私のと表記が違う？という方もいるのではないようでしょか？
通常であれば、、下記の表記だと思われます。

```rb:terminal
   [1] irb(main)>
```

私のは、irbではなく、pryになっていたかと思います。

```rb:terminal
   [1] pry(main)>
```

##irbとは

「Interactive Ruby」の略で、対話形式でプログラムを実行できるようになるコマンドです。 

##pry(プライ)とは？
標準のirbよりも機能的にすぐれた対話型ツール。

**なので、よほどの理由がない限り標準のirbでconsoleを使用するよりもpryを使用すべき。**

#pryの導入

至って簡単です。
gemを導入するだけです。

```rb:Gemfile
gem 'pry-rails'
```

その後は、budle installを実行。

```rb:terminal
 $ bundle install
```

これで、コンソールの表記は変わっていると思います。

参考文献でpryの使い方も書いてあり、

- **show-model(s)** (モデルのデータタイプを確認できる。)
- **show-routes**　（早くルートを確認できる。）

は使えそうなので、今度試してみます。

以上、たにーでした。

# 参考文献

https://pikawaka.com/rails/pry

https://techacademy.jp/magazine/7151#:~:text=rails%20console(%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)%E3%81%A8%E3%81%AF,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

https://www.sejuku.net/blog/29910
【Python】CellIsRuleオブジェクト、FormulaRuleオブジェクトを使用して特定のセルや行の表示形式を変える。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、条件付き書式に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/294b3de4-f922-a298-7e06-3dfa91125236.png)

上記のようなブック「商品リストを」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/ee719bfb-f4af-2bd8-0f78-1bd7ab6ad781.png)

この様な表に変更したいです。
ここでのポイントは

1. 原価率が55％以下の場合は文字を青色に変更
1. 製造元が業者Ｂの行を灰色にする

# CellIsRuleオブジェクト
```python
CellIsRule(operator='条件', formula=[値],
           font=Fontオブジェクト,
           border=Borderオブジェクト,
           fill=PatternFillオブジェクト)
```

条件を満たしたセルの書式を変更するには、まず、条件付き書式を作成します。
作成には上記のCellIsRuleオブジェクトを使います。

operator引数に条件を設定し、
その条件はformula引数に記述した値に適用されます。

operator引数の条件は以下の通りです。

- greaterThan：より大きい
- greaterThanOrEqual：以上
- lessThan：より小さい
- lessThanOrEqual：以下
- equal：等しい
- notEqual：等しくない
- between：値の間
- notBetween：値の間以外

font、border、fillの各引数には条件を満たした際に設定する書式を
Fontオブジェクト等で設定します。

CellIsRuleオブジェクトを作成したら、どのセルに設定するのかを
Worksheetのconditional_formatting.addメソッドで設定してあげます。

```python
ws.conditional_formatting.add('条件付き書式を設定するセルの範囲',
                              CellIsRule)
```

# FormulaRuleオブジェクト

```python
FormulaRule(formula=[数式],
            font=Fontオブジェクト,
            border=Borderオブジェクト,
            fill=PatternFillオブジェクト)
```

CellIsRuleオブジェクトに似ていますが
より詳細な条件指定や、行全体の書式変更時に使います。
数式を使用することが違うところでしょうか。

どのセルに設定するのかは、CellIsRuleオブジェクトの時と同様
Worksheetのconditional_formatting.addメソッドで設定してあげます。

# 最終的なコード

```python
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.formatting.rule import CellIsRule, FormulaRule

wb = load_workbook('商品リスト.xlsx')
ws = wb.active

# フォントの設定
blue_font = Font(color='0000ff', bold=True)

# セルの色を設定
gray_fill = PatternFill(bgColor='C0C0C0', fill_type='solid')

# フォントを変更する範囲と条件式
cell_rule = CellIsRule(operator='lessThanOrEqual',
                       formula=[0.55], font=blue_font)

# セルの色を変更する範囲と条件式
formula_rule = FormulaRule(formula=['$H3="業者Ｂ"'], fill=gray_fill)

ws.conditional_formatting.add('G3:G24', cell_rule)
ws.conditional_formatting.add('B3:H24', formula_rule)

wb.save('商品リスト_条件追加.xlsx')
```

# 余談①
今回、PatternFillオブジェクトのfill_type引数を「solid」にしていたので
fgColor='C0C0C0'と記述していたのです。
そうすると何故か、セルの色が白色になってしまったのです。

bgColor='C0C0C0'に変更すると指定通りの灰色になってくれました。

念のため、ほかのパターンも試してみましたが
そちらはちゃんと指定通りに色づけしてくれます。

今後は

```python
PatternFill(fgColor='C0C0C0', bgColor='C0C0C0', fill_type='solid')
```

のように、どちらも同じ色を指定してあげると間違いがないようです。

# 余談②
条件付き書式はセルではなく、シートを対象に設定しています。
Excelの「ホーム」→「条件付き書式」→「ルールの管理」で確認する事が出来ます。

意外とこの設定、地味に面倒くさいのですよね・・・。
毎回だとなおさら。プログラムは偉大ですね。
Pythonの比較演算子

どんなプログラミング言語にもある比較演算子。いろんな比較演算子があるのでまとめてみました。![名称未設定.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281105/87649125-ee8b-0b1d-7f90-7f354a24f26b.jpeg)

以上です！
wordpress 固定ページをテストモード（非公開）にする方法

固定ページは「公開状態」を「パスワード保護」に設定することができる。
しかし、パスワードで保護されるのは、管理画面の本文に書いた部分だけ。
（つまり、テンプレートの<?php the_content(); ?>に表示される部分だけ）

本文だけではなくてページ全体に、手っ取り早くアクセス制限を掛けたい場合、wordpress管理画面にログインした場合のみにページを表示させる方法が使えたのでメモ。

```php:page-xxx.php
<?php
/*
 Template Name: XXX
*/
if (!is_user_logged_in()){
    header( "location: " . home_url() );
}
?>
```
固定ページのテンプレート名に続けて上記の通り記載すると、管理画面にログインした場合のみページが表示される。
管理画面にログインしていない場合はトップページへ飛ばされる。

固定ページに専用のテンプレートが用意されている場合は有効かと。
Cisco AnyConnectでVPN接続した際、WSL2でインターネットにアクセスできなくなった場合の対処法

# 発生事象

Windows環境において、Cisco AnyConnectを用いてVPN接続した場合、WSL2のLinuxディストリビューションからDNSで名前解決ができなくなり、インターネットにアクセスできない事象が発生するケースがあります。

当記事ではその際の対処法を示します。

なお、以下の環境において有効であることを確認しています。

- Windows 10 (OSビルド：19042)
- Ubuntu 20.04 (Linuxディストリビューション)
- AnyConnect 4.9.01095

# 対処法

AnyConnectでVPN接続したときや、WSL2のLinuxディストリビューションを起動・再起動した都度、以下を実行する。

1. (未接続の場合)AnyConnectでVPN接続する
1. ホスト(Windows)側で、管理者権限でPowerShellを起動し、以下のコマンドを実行する

    ```PowerShell
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
    ```

1. Linuxディストリビューション側で、以下リンク先の``wsl-fix-resolvconf.sh``を実行する（実行するとsudoが求められるので、実行ユーザのパスワードを入力する）
[Gist / wsl-fix-resolvconf.sh](https://gist.github.com/nfekete/7a277bf9e25e89e1c8bfb8b64dcc08ed)



# 参考

以下のページを参考にしました。

- [WSL2 issues – and how to fix some of them](https://sysblog.dk/?p=254)
- https://github.com/microsoft/WSL/issues/4277#issuecomment-745622486
- [Gist / wsl-fix-resolvconf.sh](https://gist.github.com/nfekete/7a277bf9e25e89e1c8bfb8b64dcc08ed)
Redmine 4.1.1から4.2.0にアップデートする

# 概要
以前に[Redmine 4.1.1をインストール](https://qiita.com/papillon/items/deb6cd528a2d5ef4615b)し利用したが、Redmine 4.2.0が先日リリースされた。継続的な運用のためには、アップデート作業は避けて通れないので、アップデート手順のメモを残す。

# 手順
どこでもいいが、Redmine 4.2.0のパッケージをダウンロードしてきて展開する。

```
# cd /usr/local/src
# wget https://www.redmine.org/releases/redmine-4.2.0.tar.gz --no-check-certificate
# tar xvzf redmine-4.2.0.tar.gz
# mv redmine-4.2.0 /var/www/
```

Redmineのディレクトリの所有権を**apache**に変更する。後で思わぬ不具合に引っかかりやすいので、先に**production.log**を作成、apacheで書き込みできるようにしておく。

```
# touch /var/www/redmine-4.2.0/log/production.log
# chown -R apache:apache /var/www/redmine-4.2.0
```

現在のRedmineから設定をコピーする。

```
# cp /var/www/redmine-4.1.1/config/configuration.yml /var/www/redmine-4.2.0/config/
# cp /var/www/redmine-4.1.1/config/database.yml /var/www/redmine-4.2.0/config/
```

事故防止のため、Apache httpdを停止してサービスを利用できないようにする。DBとファイルのバックアップもここでやっておく。

```
# systemctl stop httpd
```

Redmineにアップロードされたファイルなどをコピーする。

```
# 'cp' -ra /var/www/redmine-4.1.1/files /var/www/redmine-4.2.0/
```

利用しているプラグインがあればコピーする。**view_customize**を利用しているため、コピーしている。

```
# cp -ra /var/www/redmine-4.1.1/plugins/view_customize /var/www/redmine-4.2.0/plugins/
```

fcgiで動作させていたので、その設定をこちらでも行う。

```
# cd /var/www/redmine-4.2.0/public
# cp dispatch.fcgi.example dispatch.fcgi
# cp htaccess.fcgi.example .htaccess

# cd /var/www/redmine-4.2.0
# gem install fcgi
# echo "gem 'fcgi'" >> Gemfile.local
```

Redmineを動作させるためのパッケージ導入やDBのマイグレーションなど。

```
# bundle install --without development test --path vendor/bundle
# bundle exec rake generate_secret_token
# bundle exec rake db:migrate RAILS_ENV=production
# bundle exec rake tmp:cache:clear RAILS_ENV=production
```

httpdの設定で参照しているRedmineのディレクトリを変更する。

```
# vi /etc/httpd/conf.d/redmine.conf
```

```diff:/etc/httpd/conf.d/redmine.conf
-    DocumentRoot /var/www/redmine-4.1.1/public
+    DocumentRoot /var/www/redmine-4.2.0/public
-    <Directory /var/www/redmine-4.1.1/public>
+    <Directory /var/www/redmine-4.2.0/public>    
```

httpdを起動して完了。

```
# apachectl configtest
# systemctl start httpd
```
新卒入社1年未満でメーカからIT業界に転職する話

# 自己紹介
　始めまして。@Yuki-TUです。簡単に私の経歴を述べておくと、私は、2020年4月に大手メーカーの新入社員として入社し、2021年3月に自社開発のweb開発会社に内定を頂くことができました。一番初めの会社に入社する前は、プログラミングを通して新しい技術開発、特に人工知能に関しての仕事をしたいと思い、そのメーカの長期インターンシップを経験しました。そこでは、比較的新しいことをやっており、入社後も、うちの部署を希望したら、配属してあげるよと言われていたので、ここだ！思い、入社を決意。入社してからは、新しい技術を学ぶぞ！と意気込んでいましたが、結果、希望部署に行けず。。。あれ？約束が違うぞ？と思い、問い合わせても、適性を見ての判断という事でした。同世代の友人はweb系でバリバリ実力をつけており、わずか数カ月でその差は明らかでした。私が配属された部署は主に、会社の備品やソフトウェアを管理する仕事をする部署に配属されました。少なくても3年は今の部署にいることになっており、3年もたてば、技術力は天と地の差になると思い、早急に転職を決意し動き始めました。しかし、新卒入社一年未満の転職は本当に大変なものでした。

# web業界へ転職にあたって大変でだなと思った点
- コロナの時期で転職する人が増えており募集に対して応募が多い
- 経験年数が一年もない、かつメーカーの職であったため、技術力、学んだことなど自己PRをすることがない

　転職にあたって大変だなって思ったことを2点あげました。
　1点目は、「コロナの時期で転職する人が増えており募集に対して応募が多い」という事です。選考する人数が多いため、選考結果を出すのに1カ月程度待たされることもありました。
　2点目は、「経験年数が一年もない、かつメーカーの職であったため、技術力、学んだことなど自己PRをすることない」という事です。これが、やはり転職にあたり一番大変となる理由でした。転職にあたり職務経歴書を書くのですが、今の会社で学んだことがほとんどなく書くことがない。。。状態になりました。
ですので、書類選考で落とされる、または、応募先の会社から返事が来ないことがほとんどでした。7社くらいは、書類選考で落ちました。

# 転職にあたってやったこと
- ポートフォリオを作成する
- その会社が求めていることを学ぶ

やったことは大きく分けて2点あります。
　1点目は、ポートフォリオを作成することです。最近ではポートフォリオを提出させる会社が増えているので、当たり前かもしれませんが、これは本当に大事であると思います。私は、React, TypeScript, firebase, docker, githubを使用したwebアプリを開発しました。そして、アプリ、github等を見てもらいました。作るにあたって大事だなと思った事は、実際の会社で開発する環境に近づけてアプリケーションを作ることです。例えば、開発フローはgitflowでissueを発行して開発しているか、CI/CDを導入しているか、eslintや命名規則などコーディングルールを決めているかなどです。会社側はそういう部分を見ていると感じました。
　2点目は、その会社では、今後どのような技術を求めているかをリサーチし、それを学んでいく姿勢があるかを面接でいえることが大事であると感じました。私が内定頂いた会社では今後は人工知能を取り入れたいとのことでしたので、大学時代人工知能を学んでいたこと、今後ポートフォリオにも人工知能を取り入れたいとアピールをさせて頂き、良い印象を頂くことができました。


# 転職するために大事であると思ったこと
　いざ、転職活動をしていて大事だなって思ったことは2点あります。それは、

- 人脈
- やる気
- 目に見える成果を残す

の3点であると思います。
　まず、人脈なのですが、これが一番大事であると思います。私はweb系業界で働いている友人がいたため、web開発などあまり経験がなかったのですが、ポートフォリオを作成することができました。また、最近では紹介制度などもあり、紹介で会社に入社することもできます。私自身、友人の紹介で会社に勤めさせていただくことになりました。しかし、友人の紹介だからと言って、決して面接が緩くなったり、選考免除になることはないです。友人の紹介でも落ちる人は多いと話も聞きましたので、紹介だから適当に受けることが無いように気を付けてください。
　2点目はやる気です。1年で転職となるとやはり、会社で得られた知識は乏しいです。なので、休みの日、プライベートでプログラミングやweb系の勉強をして、3点目の目に見える成果（ポートフォリオ、github, qiitaなど）に残すことが大事です。それは、仕事外でも学ぶことに対するやる気があるという証拠になります。

ぜひ以上の3点でweb業界へ転職を成功させてください！応援しております。

# 面接で質問された事項
- 弊社のどこに魅力を感じて応募しましたか？
- なぜ１年で転職しようと考えましたか？
- 現会社に勤めるに至った経緯はなんですか？
- 弊社に入社したらどんなことをやりたいですか？
- 現会社で学んだことは何ですか？
- 自分の短所長所は何ですか？
- 会社に対してこれだけは譲れないもの（技術、待遇面など）なんですか？
- 自分が望まない部署に配属されたらどうですか？
- 弊社に入って習得したいことは何ですか？
- アルバイトは何をやっていましたか？
- 今まで学んできたプログラミング技術は何ですか？
Pythonの算術演算子

今日初めてPythonに触れたので今日学んだことをまとめていきます
全てのプログラミング言語で算術演算子というものがあります。簡単にいうと足し算引き算とかです。下にまとめておきました。

![名称未設定.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281105/d06e37d0-c09d-8736-c521-168e99d7caa7.jpeg)

何かと便利なんですけど忘れそうなのでまとめておきました！

因みにpythonでは複素数の表記もできます。例えば、4+5iを書きたいときは4+5jというふうにiでなくjを使って表します。上記の演算も同様にできます！
Windows ではファイルのタイムスタンプを更新する

Windows の場合はコマンドが無く、GUI からの更新もできません。

なので PowerShellを管理者として実行し使うことになります。



更新日時の変更
PS> Set-ItemProperty "C:\foo.txt" -Name LastWriteTime -Value "2021/03/29 20:30:00"


作成日時の変更
PS> Set-ItemProperty "C:\foo.txt" -Name CreationTime  -Value "2021/03/29 20:30:00"
LoRaをざっくり説明すると…。

# LoRaとは
LoRa：400~1000MHzあたりの超波長を使ってデータを通信する技術でLPWA（Low Power Wide Area）の一種。フランスで最初に開発され、現在ではアメリカのSemtech社がLoRa通信をするためのチップを専売している。

# LoRa通信はIoTに最適
BluetoothやLTE, Wifiに比べて使っている波長が長いため、LoRa通信の特徴として以下のような特徴が挙げられる。

## デバイス電力消費量が低い
LoRa通信はデータ送信をしている時以外はデバイスとゲートウェイは接続をしていない。データを送信するときだけLoRaチップが動く。データの送信は双方向可能で、例えばクラウドからデータを送りたい場合は決まった時間にLoRaチップを数秒間だけ起動させてその間にクラウドからデータを送信するという仕組みになっている。データ送信は意外と電力を消費するのでマイコンのDeepSleepだけだと消費電力が抑えきれない。LoRaとDeepSleepを実装したデバイスだとボタン電池で長期間動いたり太陽電池で半永久的に動くようになる。

## 遠くまで届く
超波長を使っているので送れるデータ量が少ない分、エネルギー(dBm)の減衰が少ない。結果として同じエネルギーで電波を送信した場合に他の通信技術に比べて長距離まで届く。通信技術にはLink Budgetという概念がある。これはわかりやすく例えると遠くから人が何かを言った時に距離が遠かったり間に遮蔽物があるとその人の言ったことがわからなくなる現象と一緒で、ある程度の距離や直線的な見通しの良さが求められるということだが、この距離がLoRaは他の通信技術に比べて圧倒的に長い。
　例えば下記の動画9分頃のテストだと（実際の計測データではなく理論的な値）、LTEだと100kmしか届かないのに対しLoRaだと10倍の1000km届く計算になっている。

※ちなみにセンサー機器でよく見るぶっといRG-58ケーブルは仮にケーブル長が10メートルあたり8dBmの減衰となるので、ケーブル長が200メートル以上だとデータ通信ができないということになる。

https://www.youtube.com/watch?v=hMOwbNUpDQA&ab_channel=AndreasSpiess

## ただやりとりできるデータ量が少ない
これも物理的な性質によるものなのでどうやっても改善はできないのだが、LoRaの場合最大で50kbpsくらいしかでない。さらにそれを複数のデバイスで食い合うので、1デバイスあたり数bpsになるケースもある。ただIoTの場合やりとりするデータはごくごく微量なので問題にならない。ちなみに熟練者のモールス信号が20bpsなので、数bpsと言ったらそれよりも少ない。


### 導入例①
例えば個人的にLoRaを使ったIoTをやりたい場合を考える。大体Wifi✖︎ラズパイで結果を自作のWebアプリやAWSのS3でホストしたWebサイトに表示させたいというのが、初手だと思う。ただそこに「Wifiが届かない距離にデバイスを置きたい」とか「デバイスがコンセントの届く範囲外でモバイルバッテリーを頻繁に取り替えるのが面倒」とかいう問題が出てくる。そこでその人が次にとるべき一番簡単な手は、

①LoRaチップを内蔵したボードを2つ買う（センサー用とゲートウェイ用）

②Arduino IDEでLoRa通信用のスケッチを二台の機器にフラッシュする

③センサーデバイスを所定の場所においてゲートウェイ用デバイスは自宅のWifiが届く範囲に置いてゲートウェイ用デバイスでクラウドにデータを送信

ということになる（もちろんゲートウェイ用デバイスはWifi機能を備えている必要がある）。当たり前かもしれないが、LoRaを使うのに必要な費用はこの場合Semtech社のチップ代だけで、比較的安くLPWAの強みを自分のIoTに導入できる。

参考：

https://randomnerdtutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/

### 導入例②
個人がLoRa通信を趣味で行う場合は上記の例でいいのだが、デバイス数が増えてセキュリティもしっかりした本格的なゲートウェイを導入しようとなるとLoRaWANが必要になる。LoRaWANはLoRaAllianceという団体が標準化したLoRa通信でLoRaWANを利用するには事業者のLoRaWANゲートウェイを料金を払って使うか自分でゲートウェイを立てるかのどちらかになる。後者で有名なのがスイス初のオープンソースTTN（The Things Network）だ。個人がいわばボランティアでたてたゲートウェイを繋いでLoRaネットワークを作っており、無料だが、日本でのカバー率は下記のように狭いので、自分でゲートウェイを立てる必要があるかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001699/614c436e-cbea-6925-1c32-b9994456f297.png)

参考：

https://www.youtube.com/watch?v=ZFVA6cQyheY&ab_channel=AndreasSpiess

ちなみにヨーロッパは以下。LoRa発祥のフランスやTTN発祥のスイス、オランダあたりはかなりネットワークが発達している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001699/2e0209be-8c92-bd25-b7f1-379bd9803a0b.png)


# さいごに
こういった低レベルの技術の話は調べるのも、読み応えある記事を書くのも難しいが、少しでも知識の整理に役立てば幸いだ。


# おまけ
下の動画の[19:41](https://youtu.be/62Q477mH_u4?t=1181)あたり、村田製作所のLoRaチップ（動画当時最小）を備えたRAMが20KBの極小モジュールをスタートアップの人が説明している（5行ほどの軽いJavaScriptと行っているのでおそらくMongooseOSか）。こういうデバイスからするとFreeRTOSなんかは高級なプログラムなんだろう。IoTは奥が深い…。
※ちなみにそのチップはおそらく[これ](https://www.murata.com/ja-jp/products/info/connectivitymodule/lpwa/2016/0719)。

https://www.youtube.com/watch?v=62Q477mH_u4

# 参考文献(記事内で紹介していないもの)
https://monoist.atmarkit.co.jp/mn/articles/1709/19/news004.html

https://www.sigfox.com/en/coverage

https://www.thethingsnetwork.org/map

https://www.link-labs.com/blog/sigfox-vs-lora#:~:text=LoRaWAN%20looks%20at%20a%20wider,same%20for%20SigFox%20and%20LoRaWAN.
chromeコンソールから要素単位でスクリーンショットを撮影する

#概要
要素ごとにスクリーンショットを撮影したい場合に、一度画面全体を撮影してからトリミングするということをしていたのですが、Chromeのコンソールから要素ごとにスクショが取れる機能があるみたいなのでその方法をメモします。

chrome86から対応しているみたいです。

#方法

コンソールを開く => 要素(Elements)タブをクリック => 撮影したい要素で右クリック => Capture node screenshot 

で画像を保存できます！
【PHP】確認画面で画像を保存せず表示

#はじめに

ユーザー新規登録で確認画面に遷移した際に、`戻るボタン`を押すと画像だけが残ってしまう問題が発生しました。
![confirm_disp_before.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/0feb051a-d15a-a928-7f72-da82feca1d32.gif)
こちらは確認画面で画像をフォルダに保存していたため、起きてしまいました。
![confirm_disp_after.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/099b47e1-7523-5ae0-25b7-73edab617084.gif)
そこで確認画面で画像を一時的にセッションに保存し、登録確定された場合のみ保存される上記動作画面のような処理を実装します。

#実装方法
##画像情報をセッションに保存

```user_add.php
<h2>新規登録</h2>
<form method="post" action="user_add_check.php" enctype="multipart/form-data">
<input type="text" name="name" class="user_name_input" placeholder="ユーザー名">
<input type="password" name="pass" class="user_pass_input" placeholder="パスワード">
<input type="file" name="image" id="my_image" accept="image/*" multiple>
<input class="btn btn-outline-info" type="button" onclick="history.back()" value="戻る">
<input class="btn btn-outline-dark" type="submit" value="登録">
</form>
```
今回は、このような登録画面で実装します。

```user_add_check.php
<?php
session_start();
$_SESSION['image']['data'] = file_get_contents($_FILES['image']['tmp_name']);
$_SESSION['image']['type'] = exif_imagetype($_FILES['image']['tmp_name']);
?>
<img src="image.php">
<form method="post" action="user_add_done.php">
<input type="hidden" name="name" value="<?= $user_name ?>">
<input type="hidden" name="pass" value="<?= $user_pass ?>">
<input type="hidden" name="image_name" value="<?= $user_image['name'] ?>">
<input type="button" class="btn btn-outline-info modal_close" onclick="history.back()" value="戻る">
<input type="submit" class="btn btn-outline-dark" value="OK">
</form>
```
確認画面で画像を出力するため、一時的にセッションへ保存して表示します。

```php
<?php
session_start();
$_SESSION['image']['data'] = file_get_contents($_FILES['image']['tmp_name']);
$_SESSION['image']['tmp'] = exif_imagetype($_FILES['image']['tmp_name']);
?>
<img src="image.php">
```
確認画面での表示のため`$_SESSION['image']['data']`に画像データを渡します。
`$_SESSION['image']['tmp']`は後ほど、確認画面で画像を表示の際にmimeタイプ取得のため用います。

セッションに保存した情報を元に、画像を表示するファイルを作成します。

```image.php
<?php
session_start();
switch ($_SESSION['image']['type']) {
    case IMAGETYPE_JPEG:
    header('content-type: image/jpeg');
    break;
    case IMAGETYPE_PNG:
    header('content-type: image/png');
    break;
    case IMAGETYPE_GIF:
    header('content-type: image/gif');
    break;
    }
echo $_SESSION['image']['data'];
?>
```
セッションから画像情報を出力します。

これで画像を確認画面で表示することができ、
`戻るボタン`を押しても保存される問題はございません。

```user_add_done.php
$user_image = $_POST['image_name'];
file_put_contents('./image/'.$user_image,$_SESSION['image']);
```
最後に登録を確定した場合に、画像を指定のファイルに保存するようにします。

#参考URL

https://teratail.com/questions/66833

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12141865207?__ysp=56K66KqN55S76Z2iIOeUu%2BWDjw%3D%3D
[Kotlin]glide 備忘録

https://github.com/bumptech/glide


Gradleに

```Kotlin:Gradle
dependencies {
  implementation 'com.github.bumptech.glide:glide:4.12.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}
```
を追加。

```Kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {

    private val image = "https://cdn.pixabay.com/photo/2018/05/03/21/49/android-3372580_960_720.png"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val imageOne = findViewById<ImageView>(R.id.image_one)
        val imageTwo = findViewById<ImageView>(R.id.image_two)
        val imageThree = findViewById<ImageView>(R.id.image_three)

        Glide.with(this)
                .load(image)
                .into(imageOne)

        Glide.with(this)
                .load(image)
                .fitCenter()
                .circleCrop()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageTwo)

        Glide.with(this)
                .load(image)
                .override(300,400)
                .centerCrop()
                .into(imageThree)
    }
}
```
こんな感じで書ける。

```Kotlin
Glide.with(this)
    .load(image)
    .into(imageOne)
```
これは単純にimageのURLを読み込んで、その中身をactivity_main.xmlのid:imageOneに入れる処理。

```Kotlin
Glide.with(this)
    .load(image)
    .fitCenter()
    .circleCrop()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(imageTwo)
```
これはimageOneの処理に加えて、

画像を丸くする処理
画像を真ん中に合わせる処理
全ての解像度のリソースをキャッシュさせる処理
を追加したもの。

```Kotlin
Glide.with(this)
    .load(image)
    .override((width)300,(height)400)
    .centerCrop()
    .into(imageThree)
```
これはimageOneの処理に加えて、画像の処理を追加したもの。
丸みを帯びず、縦長になる感じ。

```Kotlin
Glide.with(this)
    .load(image)
    .circleCrop()
    .into(imageThree)
```

だと画像は丸くなるが、
ここに

```Kotlin
.override(width, height)
```
を書くとcenterCropが無視される？っぽい。
[c#]preview言語バージョンを使う方法

Visual Studio 2019を使用しています。

![スクリーンショット (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252667/b1525a87-099d-0dca-bf5f-96232ff656ac.png)
Assembly-Csharpを右クリックします。

![スクリーンショット (58).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252667/ff61d591-055d-a2f8-2078-06041c540b5a.png)
プロジェクトのアンロードを選択します。
(アンロード‥‥ロードの逆てきなやつ)

![previewに書き換える.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252667/18461a28-bd32-3a7a-463e-043fc2f823c9.png)

先頭の方にある`<LangVersion>Latest</LangVersion>`を`<LangVersion>preview</LangVersion>`に書き換えます。

![スクリーンショット (56).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252667/f2094c56-a8ec-8680-f1de-65bbf3d55741.png)
プロジェクトの再読み込みをして、完了です。
Macで使うアプリ

# もともとWindowsユーザー
参画中のPJでWindows環境も使えないことも無いのだけど、PCのスペックが全然追いついてなかった。
→ じゃぁPC貸してあげる
→ あ、でもMacしかないから

ということで、かれこれ1年位のMacユーザーになった。

# Macでのプログラミング文化
↓のようなWiwndows環境との違いを感じていた。

- 結構ターミナルを使う
    - vimmerが多い？
    - 私はIDE派なので、全然ターミナルは使いこなせない
    - それでも開発で最低限必要なコマンドくらいは使う
- 未だにディレクトリの開き方を知らない
    - Windowsだと、Explorerでドライブのトップから辿るのは結構普通
    - MacのFinderがそれに当たると思うが、絶対パスを指定できるUIではない
    - `⌘ + スペース` のSpotlightでパスを指定すれば絶対パスで開けないこともない
- なんかデスクトップには何も置いちゃいけなそうな雰囲気を勝手に感じている
    - Windowsだと、右クリックするだけでテキストファイルが作れてたので、結構デスクトップにテキストファイルとか置いてた
    - Macの場合、右クリック（本来は`⌃ ＋ クリック`だろうけど、Windows共用マウスだと右クリックができる）ではフォルダしか作れない
        - 結果、ファイルがあまり作られない

# 自分的に入れとかないといけないアプリ
あまり悠長に色々なアプリを入れる余裕はなかったが、それでも最低限これはないと何もできないというアプリをメモる。
ここに上げたものをインストールすれば、明日PCがなくなってもだいたい今くらいのレベルで作業できるだろう・・・。

- Slack
    - https://slack.com/intl/ja-jp/
    - 言わずとしれた連絡手段
    - これがないと仕事のつながり２年分がなくなったも同然
- fzf
    - https://github.com/junegunn/fzf
    - ターミナル上で`⌃ ＋ r`で、過去のコマンドをサジェストできるツール
    - `history | grep xx`でも良いのだけど、打つのが長いので、これ入れて超改善
    - もはやこれ無しでターミナル触れる自信がない
- SourceTree
    - https://www.sourcetreeapp.com/
    - ターミナル派では無いので、gitコマンドは覚えてられない（コマンド３つくらいしか覚えてない気がする）
    - GUIでお手軽にgit操作
    - Windowsでもこれはないと何もできない
- Clipy
    - https://clipy-app.com/
    - コピペの履歴を３０個ほど保持
    - Windowsのときはそれほどこういうツールはなくてよかったのに、ここ最近はこれがないと捗らない
    - Qiitaに @econa77 というアカウントで開発者さんがいらっしゃるのは面白い
- Postman
    - https://www.postman.com/
    - HTTPリクエストのテストに使うツール
    - WindowsのころはChromeの別の拡張使ってたけど、今はこれ
- DBeaver
    - https://dbeaver.io/
    - DBクライアントツール
    - 開いているテーブルの外部結合をER図で表示する機能とかもある
    - Eclipseベースっぽくてちょっと重いと思うが、高機能なので重宝してる（PJのほかメンバーは結構違うのを使ってる）
- P4Merge
    - https://www.perforce.com/ja/zhipin/helix-core-apps/merge-diff-tool-p4merge
    - WinMergeの代わりに使おうとしているDiffツール（まだ感触わからない）
        - 軽く触った感じだとWinMergeには及ばない雰囲気
    - ダウンロードにはユーザー登録が必要なのがちょっとやだ
    - SourceTreeで外部マージツールに指定しようと使ってる
- Docｋer Desktop
    - https://www.docker.com/products/docker-desktop
    - ローカルの実行環境はこれが入ってる前提
    - もはや参画中のPJ関係なく、コーディングする上ではこれがないとちょっと辛いなぁ
- IDE
    - PyCharm
        - https://www.jetbrains.com/ja-jp/pycharm/
        - Pythonの開発はこれに限る
        - 無料版のまま使ってるが、ごくごくたまに「この機能は有償版にしか無いのかぁ」はあるけど、だいたい問題ない
    - VSCode
        - https://azure.microsoft.com/ja-jp/products/visual-studio-code/
        - Python以外はこれを使ってる
        - rubyの拡張がオカシイけど、まぁ今メインではないので我慢
        - だいたいSwaggerの編集はこれ

# 最後に
本稿は、今後追記があるかも。
Windowsのころは気になったツール何でもかんでも入れてたけど、借り物PCだし、余計なものは極力入れるべきじゃないと考えるとこのくらいで済むものなのだなと感慨深い。
暗号化、デジタル署名、SSL通信

#暗号化技術
暗号化とは、中身を見てもわからない形へと変換すること

#公開鍵暗号方式
暗号化に使う鍵と復号に使う鍵が別物

**特徴**
・秘密鍵と公開鍵はペア
・暗号化は、公開鍵
・復号化は、秘密鍵で行う

公開鍵を配布して「自分に送ってくる時はこの鍵を使って暗号化してください」とする。
暗号化されたデータは、それとペアになる秘密鍵でしか復号化できない。

**メリット**
・データの安全性の高さ
・公開鍵の管理も容易

**デメリット**
・暗号化、復号が複雑で処理時間がかかる

#デジタル署名
公開鍵暗号方式技術を応用し、改ざんされていないか、誰が送信したものかを確認できるようにする
ハッシュ化という手法で短いデータを作成しそれを暗号化することをデジタル署名

#ハッシュ化
ハッシュ化は、ルールに基づき別の値に変えること
ある特定の文字列や数字の羅列を一定のルール（ハッシュ関数）に基づいた計算手順によって別の値（ハッシュ値）に置換

**ハッシュ化が適するシーン**
「その値を元に戻す必要性がないシーン」。代表的な例が『パスワードの保管』

**暗号化が適するシーン**
暗号化が適するシーンはハッシュ化の逆で、「その値を元に戻す必要がある」場合


#SSL(HTTPS)通信
HTTPSで配信するには、SSLサーバー証明書をサーバーにインストールしておく必要がある
SSlサーバ証明書は3または4階層からできており、その最上位の階層にあるのがルート証明書
ルート証明書はWebブラウザにあらかじめ登録されていて、サーバーから送られてくる証明書と照合する
照合した結果、ルート証明書にある認証局の署名が一致すれば、信頼できる証明書と判断する

**SSL通信の仕組み**
**①SSLサーバー証明書と公開鍵を送る**
  サーバーがHTTPSでの接続リクエストを受けると、はじめにSSLサーバー証明書をクライアント側に送る
  SSL証明書には公開鍵が含まれる

**②共通鍵生成**
　サーバー側のルート証明書とブラウザに登録されているルート証明書照合
　照合できたら、クライアントは共通鍵を生成

**③共通鍵を公開鍵で暗号化して送る**
　サーバー側は送られてきた公開鍵をい秘密鍵で復号し、共通鍵を取り出す
　これでサーバーとクライアントの両方に共通鍵を持つことができる

**④SSL通信開始**
　共通鍵を使って暗号化通信を開始する