OmniAICreator/Qiita-1.07M huggingface dataset:
【大田区】特別定額給付金の申請処理の状況を確認する


# 概要
大田区のHPで[特別定額給付金のオンライン申請状況](https://www.city.ota.tokyo.jp/cyuumokujoho/infection/kyufu/teigakukyuuhuonlinejokyo.html)を確認できるようになりました。
オンライン申請している場合、受付番号から自分の申請状況を知ることができるため、BeautifulSoupを使用して
申請状況等の情報を取得してみます。


# HPの更新日時の取得

更新日時は、Last-Modifiedレスポンスヘッダーから取得することができます。

```
print(res.headers['Last-Modified'])

# 出力　Mon, 25 May 2020 08:49:00 GMT
```

# 申請の処理状況の取得

申請状況は、id="main"内のul、liタグから取得できます。select()で指定することで申請状況を含んだ一覧を取得できます。

オンライン申請済みの場合、受付番号が発行されているため、自分の番号と比較して現在の状況を知ることができます。

<img width="1260" alt="申請状況.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/d3be302c-3482-338c-fb0e-251752015891.png">


```
import requests, bs4
import re

res = requests.get('https://www.city.ota.tokyo.jp/cyuumokujoho/infection/kyufu/teigakukyuuhuonlinejokyo.html')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.content, "html.parser")
elements = soup.select('#main ul li')

kyufu = 0
next = 0
for element in elements:
    text = element.getText()
    
    if '申請件数' in text:
        print(text)
    if '給付決定状況' in text:
        print(text)
        kyufu = re.findall('[0-9]+', text)[0]
    if '次回決定予定' in text:
        print(text)
        next = re.findall('[0-9]+', text)[0]

number = 200503009999999
if int(kyufu) > number:
    print("申請処理状況は、給付決定状況になりました。")
elif int(next)  > number:
    print("申請処理状況は、次回決定予定になりました。")
else:
    print("申請処理状況は、審査待ちです。")
```

```
# 出力
申請件数 23,848件
給付決定状況　受付番号200502004219879 まで　給付決定
次回決定予定　受付番号200506012800746 まで　決定予定

申請処理状況は、次回決定予定になりました。
```

# 振込日の状況の取得
申請日から振込日の目安も出されています。申請状況と同じように、id="main"内のpタグから取得できます。

<img width="1260" alt="給付状況.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/a6cfdb0e-8e45-38da-e87a-f79ec891d623.png">




```
elems = soup.select('#main p')

print(elems[4].getText().replace('。5', '。\n5'))
```

```
# 出力
5月1日（金曜日）申請分：26日（火曜日）までに、振込みを完了します（入力誤り等があった申請を除く。以下同じ。）。
5月2日（土曜日）申請分：26日（火曜日）、29日（金曜日）、6月2日（火曜日）に振込みします。
5月3日（日曜日）申請分：6月2日（火曜日）から振込みを開始します。
5月4日（月曜日）申請分：6月2日（火曜日）から振込みを開始します。
5月5日（火曜日）申請分：6月2日（火曜日）から振込みを開始します。
5月6日（水曜日）申請分：6月2日（火曜日）から振込みを開始します。
5月7日（木曜日）申請分：6月5日（金曜日）から振込みを開始します。
5月8日（金曜日）以降の申請分も、順次振込み予定です。注意：振込み予定は目安です。進捗状況や入力誤り等により、時間がかかる場合がありますのでご了承ください。
```


# 参考
[【Python】ウェブサイトの最終更新日を取得](https://qiita.com/KanikaniYou/items/839c182621227f528f8c)
[10分で理解する Beautiful Soup
](https://qiita.com/Chanmoro/items/db51658b073acddea4ac)
【Javascript】 Timestamp を yyyy/MM/dd HH:mm:ss 形式で 時刻に変換する

## コード

```javascript:timestampToTime.js
// 引数 timestamp の単位はミリ秒であるとする
const timestampToTime = (timestamp) => {
  const date = new Date(timestamp * 1000);
  const yyyy = `${date.getFullYear()}`;
  // .slice(-2)で文字列中の末尾の2文字を取得する
  // `0${date.getHoge()}`.slice(-2) と書くことで０埋めをする
  const MM = `0${date.getMonth() + 1}`.slice(-2); // getMonth()の返り値は0が基点
  const dd = `0${date.getDate()}`.slice(-2);
  const HH = `0${date.getHours()}`.slice(-2);
  const mm = `0${date.getMinutes()}`.slice(-2);
  const ss = `0${date.getSeconds()}`.slice(-2);

  return `${yyyy}/${MM}/${dd} ${HH}:${mm}:${ss}`;
}

timestamp = 100000000; // 1億
console.log(timestampToTime(timestamp));
```

## 実行

```shell
node timestampToTime.js
```

## 実行結果
```shell
1973/03/03 18:46:40
```

## 参考サイト
- [JavaScriptで日付や時間の0詰めを実装する](https://tagamidaiki.com/javascript-0-chink/)
SECCON Beginners CTF 2020 Writesup

SECCON　Beginners　CTF2020に参加したのでWritesupを記載します
スコアサーバー
https://score.beginners.seccon.jp/challenges

# Welcome
![welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156890/d1097510-269c-bcaa-1e6e-187171328ad3.png)
問題文に記載がある通り、SECCON BeginnersのDiscord チャンネルにアクセスするとフラグがある。

![welcome_flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156890/71e8c952-c988-26b2-36eb-4340e37bb8c9.png)


FLAG:ctf4b{sorry, we lost the ownership of our irc channel so we decided to use discord}

# emoemoencode
絵文字を基にフラグを推定する。
最初の3文字がctfに変換されると仮定して、絵文字を数字に変換すると以下のようになる（pythonのordを使用）
🍣 127843　⇔　c 99
🍴　127860  ⇔　t 116
🍦　127846  ⇔　f 102
となるように、絵文字を数字に変換後、127744を引いたものを再度英字に変換するとフラグが取得できる。

回答コード

```py
question="🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽"
result=""

for q in question:
   result=result+chr(ord(q) -127744)

print(result)
```

FLAG:ctf4b{stegan0graphy_by_em000000ji}


# mask
ファイルをダウンロード後、実行すると以下のように使い方が示される

```py
./mask 
Usage: ./mask [FLAG]
```

```py
./mask 　a
Putting on masks..
a
a
Wrong FLAG. Try again
```
正しいフラグを入力するとクリアできるようだ
該当ファイルをIDA もしくはgidra　で開くと、以下の2つを満たす文字列であることが分かる

１.引数で渡した文字列と0x75の文字列との論理和を取得し、その結果が"atd4\`qdedtUpetepqeUdaaeUeaqau"となること
2.引数で渡した文字列と0xebの文字列との論理和を取得し、その結果が"c\`b bk\`kj\`KbababcaKbacaKiacki"となること

![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156890/302c2b96-f71e-0545-50ba-6934a21df85f.png)

回答コード

```py
v1="atd4`qdedtUpetepqeUdaaeUeaqau"
v2="c`b bk`kj`KbababcaKbacaKiacki"
result=""

for i in range(len(v1)):

 count=0x00
 while(1):
  result_v1= chr(0x75 & count)
  result_v2= chr(0xeb & count)
  if result_v1 == v1[i] and result_v2==v2[i]:
   result=result+chr(count)
   break
  else:
   count=count+1

print(result)
```
ctf4b{dont_reverse_face_mask}

# Spy
実在する従業員を特定できればフラグが得られるようだ。
与えられたコードを確認すると、
１．従業員のIDがDB内に存在しないと、エラーを返す
２．従業員のIDがDB内に存在するならば、パスワードのハッシュを計算してあっていないとエラーを返す

```py

   if not exists:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))

        # auth.calc_password_hash(salt, password) adds salt and performs stretching so many times.
        # You know, it's really secure... isn't it? :-)
        hashed_password = auth.calc_password_hash(app.SALT, password)
        if hashed_password != account.password:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))
```

ご丁寧にも実行にかかった時間を出力するようなコードが記載されているので、存在する従業員の場合には時間がかかることが仮定される。従業員のIDをすべて入力し、かかった時間が多い従業員のみ特定すると以下のフラグが得られた。
ctf4b{4cc0un7_3num3r4710n_by_51d3_ch4nn3l_4774ck}


# R&B 
ダウンロードしたファイルを確認すると、暗号化した結果と方式が記載されたファイルが渡される。
方式に関しては、
１．FORMATの文字列がRの場合、FLAG文字列をROT13したもの先頭にRを付与する
２．FORMATの文字列がBの場合、FLAG文字列をBASE64したもの先頭にBを付与する
３．それ以外の場合、何もしない

なので復号するときは逆をすればよく、以下を暗号化された文字列に適用する。
１．FLAGの文字列の先頭がRの場合、Rを取り除き、残りをROT13する
２．FLAGの文字列の先頭がBの場合、Bを取り除き、残りをBASE64する

ctf4b{rot_base_rot_base_rot_base_base}


#感想
最低限の人権は得られたが。
個人的にはCryptの問題に少し手をつけたかったが
Poetry入門 インストールから実行、バージョン管理まで

#はじめに

備忘録としてPoetryの使い方を残します。

# インストール

```bash
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
```

# コマンド一覧

個人的に使いそうなコマンドを載せます。

### Poetryのアップデート

```bash
poetry self update
```

### プロジェクトの作成

```bash
poetry new <project-name>
```

### パッケージのインストール

```bash
poetry add <package-name>
```

### パッケージのアンインストール

```bash
poetry remove <package-name>
```

### パッケージ一覧を表示

```bash
poetry show
```

### 仮想環境内でのコマンドの実行

```bash
poetry run <commands...>
```

`python`でファイルを実行

```bash
poetry run python <file-name>
```

### 仮想環境内でシェルを立ち上げる
```bash
poetry shell
```

`$SHELL`に従ってシェルを立ち上げます

# インストール後の始め方

インストール直後の場合、パスを通すために`source`するか、シェルを再起動します

プロジェクト内に、仮想環境が作られるようにします

```bash
poetry config virtualenvs.in-project true
```

このコマンドはインストール後に、1回すればOK

サンプルプロジェクトを作成します

```bash
poetry new poetry-sample
```

プロジェクトディレクトリに移動

```bash
cd poetry-sample
```

追加したいパッケージをインストール
ここでは、`numpy`をインストール

```bash
poetry add numpy
```

`poetry-sample`ディレクトリで、sample.pyを作成

```python:sample.py
import numpy as np

x = np.array([1, 2, 3])
print(x)
```

仮想環境内でシェルを立ち上げます

```bash
poetry shell
```

スクリプトを実行

```bash
python sample.py
```

または仮想環境でシェルを立ち上げずに、直接コマンドを実行して実行できます

```bash
poetry run python sample.py
```

以上のような流れで、プロジェクトの作成、パッケージの追加、プログラムの実行を行えます

スクリプトは`poetry-sample`内になくても実行はできます

# Pythonのバージョンの管理

`pyenv`を併用して行う方法です

Python3.7.0を例とします

まず`pyenv`で3.7.0がインストールされていなければインストールします

```bash
pyenv install 3.7.0
```

プロジェクト内のローカルのバージョンを変更します

```bash
pyenv local 3.7.0
```

コマンドで仮想環境を構築します

```bash
poetry env use 3.7.0
```

これでプロジェクト内のPythonのバージョンは3.7.0になります

# 最後に

とても便利なのでこれから使っていきたいです。
正規表現の基礎

###概要
irbを使って正規表現について見ていきます。
<br><br>

`irb`

```irb
irb(main):001:0> name = "taro"
=> "taro"
irb(main):002:0> name.sub(/taro/,"kotaro")
=> "kotaro"
```
subメソッドを使ってtaroという文字をkotaroに置き換えています。
第１引数に置き換えたい文字列を指定し、第２引数に変換後の文字列を記述します。

<br>

```irb
irb(main):004:0> name.match(/taro/)
=> #<MatchData "taro">
irb(main):005:0> name.match(/bob/)
=> nil
```
matchメソッドを使って引数に指定した文字列が含まれているかをチェックしています。
含まれていた場合は指定した文字列がMatchDataオブジェクトとして返り値で返ってきます。
含まれていなかった場合はnilが返ってきます。
<br>

```irb
irb(main):006:0> array = name.match(/taro/)
=> #<MatchData "taro">
irb(main):007:0> array[0]
=> "taro"
```
MatchDataオブジェクトは配列なので、上記のようにすると値を取得することができます。
<br>

```irb
irb(main):008:0> phoneNumber = "080-1234-5678"
=> "080-1234-5678"
irb(main):009:0> phoneNumber.gsub(/-/,"")
=> "08012345678"
```
電話番号のハイフンを取り除きたい場合ですが、subメソッドを使ってしまうと最初のハイフンしか置換されないので、gsubメソッドを使いましょう。gとはグローバルマッチで、指定した文字列が複数含まれている場合全て置換してくれます。
<br>

```irb
irb(main):010:0> myPassword = "Taro0123"
=> "Taro0123"
irb(main):012:0> myPassword.match(/[a-z\d]{8,10}/i)
=> #<MatchData "Taro0123">
irb(main):013:0> myPassword.match(/[a-c\d]/i)
=> #<MatchData "a">
irb(main):014:0> myPassword.match(/[a-c\d]{8,}/i)
=> nil
```
・[a-z]は、a~zの文字がいずれか１個にマッチ
・\dは、数字にマッチ
・{8,10}は、直前の文字列が少なくとも８回、多くても１０回出現するものにマッチ
・iは、大文字と小文字を区別しないで検索する
という意味です。
<br>

```irb
irb(main):015:0> myAddress = "yey@gmail.jp"
=> "yey@gmail.jp"
irb(main):016:0> myAddress.match(/@.+/)
=> #<MatchData "@gmail.jp">
irb(main):017:0> 
```

メールアドレスのドメインを取得する場合
.は、どの１文字にもマッチ
+は、直前の文字の１回以上の繰り返しにマッチ
という意味を持ちます。
ですので@.+　とすると
@から始まり、全ての文字にマッチ、それを繰り返す。ということになるので
@以降のドメインが取得できます。



この記事を読んでいただきありがとうございました。
Excelでこんなことやってたよなー、をPythonに置き換える　その3

今日はデータサイエンスチックな標準化。とはいうもののこれまでは単に比較しやすかったので処理してた。
エクセルではSTANDARDIZE関数でやるけど、pythonだとどうなるのか調べてみた。

## 標準化とは？
単位とか平均値の違うデータ同士を比べやすくするための処理。
値から平均を引いて標準偏差で割ると算出できます。例えば

```
A　：　６００００
　平均　　　＝　４8０００
　標準偏差　＝　８０００

B　：　８００００
平均　　　＝　６７０００
標準偏差　＝　９５００
```

みたいなとき、パッとどっちが相対的に順位高いのかわからないとき

```
Aの標準化　＝　（６００００　ー　４8０００）　／　8０００　＝　1.5
Bの標準化　＝　（８００００　ー　６７０００）　／　９0００　＝　1.4
```
とすると比較しやすいよねってやつです。
有名なのは、偏差値ですね。
偏差値は、元の点数を標準化して、点数（＝Z値）を１０倍して５０足したものです。



## 標準化

```Python
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
df_sc = sc.fit_transform(df)
```
一瞬のできごとでした。
StandardScalerの引数はcopy、with_mean、with_std、全部TrueでOK。
もうちょっと何かするときにFalseにするみたいだけど今はいいや。誰か教えてください！

なんか悔しいので、自分でコード書いたらどうなるか頑張ってみた。


## 標準化を自力で

```Python
import math

def standardize(X):
 mean = sum(X) / len(X)
 var  = sum([(mean - XX) ** 2 for XX in X ]) / len(X)
 std  = math.sqrt(var)
 z    = [XX / std for XX in [XX - mean for XX in X]]
 return [mean, var, std, z]

mean, var, std, z = standardize(X)

```
一応これでできた、でもこれだと複数列を一気に標準化できないのかな。
素直にStandardScalerを使えばいいか。


## まとめ
標準化って分析ではよく使うので、少しデータサイエンスっぽいことになって面白かった。
sklearnは機械学習に欠かせないライブラリなんですね。それも知れたのでよし。
JavaScriptの様々なメソッド

#forEach文
配列に対してよく使われます。繰り返し処理のことです。

```javascript
配列.forEach( コールバック関数 )
```
※コールバック関数
これは配列の中にある各要素に対して行う処理のことです

```javascript
配列.forEach( function(value, index) {
} )
```
第二引数のindexを省略した場合
配列の各要素（value）だけ取り出すということになります。

# Array.prototype.slice.call()
これは単純です。引数の中にあるオブジェクトを配列に変換してくれます。

```javascript
line = Array.prototype.slice.call(obj)
```
これは引数にあるobjをまず配列に変えています。
配列に変えた上で、その配列を変数lineに代入しています。

#indexOf()
これも配列に対して使うもので引数の中に書かれているものが南蛮めに書かれているのか知りたいときに使います。
ベイズ統計の勉強しようね　ベイジアンネットワークを構築してみた

Neticaを使ってベイズ統計の視覚化をする

実装環境
Netica Windows limited version

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641728/3ea440de-6b2a-5616-91db-28e02d29f5fb.png)

Examples　Animal.dne

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641728/2810c160-be35-3358-06fb-0b01c3b68477.png)

さてWarmbloodはデフォルトでYes80%  No20%
これをNoに決めてしまうとAnimalの割合はどうなるか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641728/9bf60ab8-b0fe-de5a-e6fb-e1fab562b0ff.png)

 P(Animal|!WarmBlooded) = Turtle 100%になる。元々は20％の値しかなかったのに。

では　Yesになると
P(Animal|!WarmBlooded) = Monkey,Penguin,Platypus,Robin 各25％になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641728/c414a999-3fa1-9f33-23b5-cfa263cf766d.png)


相互作用の持つ確率同士が片方が決まることによって、もう片方の確率に影響が出てしまう。
これがベイジアンネットワークの本質である。

そしてその利点とは一つの精度や確率を更新・改善できるという点である。

現実的な例を挙げると、コロナウイルス罹患率と検査精度が挙げられる。
もうすでに陽性が出てる患者に対して再検査をするとその検査精度が上がるという話。
また発熱や重症化している人に対して検査をすれば、テストの精度は上がるという話。
韻を扱いたいpart5

##__内容__
前回グラフを作れたので、クラスタリング等を行ってみる。
また、韻の捉え方を拡張する。「eい」→「ee」,「oう」→「oo」と変換し、変換後に母音が一致したものも「韻」と捉える。これはカタカナ英語や子供の間違えやすい日本語を参考にした。「ei」と表記しないのは「えき」が「ええ」にはならないということだ。「い」と「う」は母音単体ではないといけない。（「れいぞうこ」が「れえぞおこ」）

##__グラフの操作__

```python
import networkx as nx
import matplotlib.pyplot as plt
import community

G = nx.Graph()
G.add_weighted_edges_from(edge_list)
#クラスタリング
partition = community.best_partition(G, weight="weight")
#コミュニティごとにノードを分けてリストにする。[[コミュニティ０のノードリスト],[コミュニティ１のノードリスト]…]
part_sub = [[] for _ in set(list(partition.values()))]
for key in partition.keys():
    part_sub[partition[key]].append(key)
#各コミュニティで固有ベクトル中心性が最大となるノードをリストに格納
max_betw_cent_node = []
for part in part_sub:
    G_part = nx.Graph()
    for edge in edge_list:
        if edge[0] in part and edge[1] in part:
            G_part.add_weighted_edges_from([edge])
    max_betw_cent_node.append(max(G_part.nodes(), key=lambda val:
                                 nx.eigenvector_centrality_numpy(G_part, weight="weight")[val]))
    
print([dic[i] for i in max_betw_cent_node])
#モジュラリティ指標
print(community.modularity(partition,G))
```

クラスタリングし、コミュニティ毎に固有ベクトル中心性が最大となるものを求めた。良い分割が出来ていれば、それぞれをtarget_wordとした時に、良い結果が得られると思われる。エッジの重みに使っている部分に閾値を設けることで重みに差が付くようにしてみる等を検討する。
##__韻の捉え方の拡張__

```python
from pykakasi import kakasi
import re

with open("./gennama.txt","r", encoding="utf-8") as f:
    data = f.read()
    
kakasi = kakasi()
kakasi.setMode('J', 'K')
kakasi.setMode('H', 'K')
conv = kakasi.getConverter()
text_data = conv.do(data)

#eイ→ee,oウ→ooのように変換したテキストを得る
def expansion(text_data):
    #最後の文字次第だが、i,uの余分が出ることを長さを合わせることで解決
    text_data_len = len(text_data)
    #いい椅子や、そういう噂のような「い、う」の連続への対処。
    text_data = text_data.replace("イイ", "イi").replace("ウウ","ウu")
    text_data = text_data.split("イ")
    new_text_data = []
    kakasi.setMode('K', 'a')
    conv = kakasi.getConverter()
    for i in range(len(text_data):
        if len(text_data[i]) > 0:
            if ("e" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "e")
            else:
                new_text_data.append(text_data[i] + "i")
            
    text_data = "".join(new_text_data).split("ウ")
    new_text_data = []
    for i in range(len(text_data):
        if len(text_data[i]) > 0:
            if ("o" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "o")
            else:
                new_text_data.append(text_data[i] + "u")

    return "".join(new_text_data)[:text_data_len]

print(expansion(text_data))
```

まず、データをカタカナへ変換し、「イ、ウ」で分割、直前の文字の母音によって処理を変更する、という方針でやっていたがなかなか苦労した。データの最後が「イ、ウ」の場合や、それ以外の時は「iu」が残る。引数のデータと長さが変わらないようにすることで対処したが、`print`してみると「i」が最後に残っていた。「イイ、ウウ」という連続出現を想定していなかった。やはり、やってみるとすんなりはいかないものだし、やらないと気付かないことが多い。
##__今後の方針__
（カタカナ変換データ、母音だけ残したデータ、拡張したデータ）それぞれで一致部分をスコア化し、（子音の一致、母音の一致、響きの一致）を捉えようと思う。長音、撥音、促音の一致を見ることは不要と判断した。
つまり、これまでのことを一度まとめてみる。N-gramもスペース分割部分も考慮すべきと思うし、一致部分の見方にも問題有りと思っている。現状最良の方法をまとめ、入力データをなにかしら用意して検証していきたい。
C# 勉強(4) ファイル入力２


テキストファイルを読み込んで、特定店舗の行のみ出力する。

```c#
:Program.cs
using System;
using System.IO;
using System.Text;

namespace List094
{
    class Program
    {
        static void Main(string[] args)
        {
        //    var filePath = @"C:\Example\Greeting";
            string filePath = "Sales.txt";
            string[] lines = File.ReadAllLines(filePath,Encoding.UTF8);
            foreach(var line in lines){
                string[] items = line.Split(',');
                Sale sale =new Sale{
                    ShopName = items[0],
                    Product =items[1],
                    Amount =int.Parse(items[2])
                };
                if(sale.ShopName=="浅草店")
                    Console.WriteLine("{0}  {1}  {2}",sale.ShopName,sale.Product,sale.Amount);
            }
        }
    }
}
```
クラス
----------------------------------

```c#
:Sales.cs
using System;

namespace List094 {
    public class Sale{
        public String ShopName { get; set; }
        public String Product { get; set; }
        public int Amount { get; set; }
    }
}
```
ゼロから始めるLeetCode Day36「155. Min Stack」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day35「160. Intersection of Two Linked Lists」](https://qiita.com/KueharX/items/f9c01184085586fbe491)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。

# 問題
難易度はeasy。
Top 100 Liked Questionsのeasyはこれが最後の問題になります。

問題としては、push,pop,top,getMinという関数を持つMinStackクラスを実装してくださいというものです。

なお、それぞれの関数の仕様は以下の通り。
>push(x) -- Push element x onto stack.
pop() -- Removes the element on top of the stack.
top() -- Get the top element.
getMin() -- Retrieve the minimum element in the stack.

>Input
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

>Output
[null,null,null,null,-3,null,0,-2]

>Explanation
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // return -3
minStack.pop();
minStack.top();    // return 0
minStack.getMin(); // return -2

使用例は以上です。
Stackについては多くのプログラマーが知っていると思うのでここでは触れません。


# 解法



```Python
class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        

    def push(self, x: int) -> None:
        minElement = self.getMin()
        if minElement == None or x < minElement:
            minElement = x
        self.stack.append((x,minElement))

    def pop(self) -> None:
        self.stack.pop()
        

    def top(self) -> int:
        if len(self.stack) == 0:
            return None
        else:
            return self.stack[len(self.stack) - 1][0]

    def getMin(self) -> int:
        if len(self.stack) == 0:
            return None
        else:
            return self.stack[len(self.stack) - 1][1]
        


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
# Runtime: 72 ms, faster than 38.62% of Python3 online submissions for Min Stack.
# Memory Usage: 17.9 MB, less than 5.36% of Python3 online submissions for Min Stack.
```

スライスが便利、かと思いきや普通に他の言語でも普通に似たような実装になりそうですね・・・
何にせよstackを実装してみるのは面白いので書いてみることをお勧めします。


今回はこんな感じで。お疲れ様でした。
Nuxt.js ＋ Firebase ＋ VuexFireでデータ表示をソートする

Nuxt.js+Firebaseの勉強を始めたばかりです。
FirestoreのデータをWebページに表示できるようになりました。

前回： [FirebaseのセキュリティルールをWHEREのように使えると思っていた](https://qiita.com/_takahito/items/4430ad530f37b9e86e11)

# やりたいこと

Firestoreのデータを取得してWebページに表示するためにVuexFireを利用しています。今回は、画面の表示内容をソートしたいです。

# 環境

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

# 順序の設定はorderByを使う

Firestoreの構成は次の通りです。

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

サブコレクションをtitleの降順にするため、 `.orderBy('title', 'desc')` としています。

- ~/pages
    - index.vue
- ~/store
    - index.js

```pages/index.vue
    <v-flex
      v-for="page in pages"
      xs12 mb-2>
      <v-card>
        <v-card-text>
          {{page.title}}
        </v-card-text>
      </v-card>
    </v-flex>

  computed: {
    ...mapGetters({ pages: 'getPages' }),
  },
  mounted () {
    let userID = this.$store.getters['auth/getUid'];
    this.$store.dispatch(
      'setPagesRef',
      db.collection('notes').doc(userID)
      .collection('pages').orderBy('title', 'desc'));
  },
```

```store/index.js
import { vuexfireMutations, firestoreAction } from 'vuexfire';
import createPersistedState from "vuex-persistedstate";

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

export const mutations = {
      ...vuexfireMutations
    };

export const getters = {
      getPages: (state) => {
        return state.pages;
      },
    };

export const actions = {
      nuxtClientInit ({ commit, state, dispatch }, { req }) {
        createPersistedState()(this);
      },
      setPagesRef: firestoreAction(({ bindFirestoreRef }, ref) => {
        bindFirestoreRef('pages', ref);
      }),
    };
```
JavaでintとIntegerの違い

# 読者
* Java覚えたて
* Android開発者
* Javaの復習

# JavaでintとIntegerの違い
**`intとIntegerの違い`**について掘り下げます。

* intとは？
    * -2147483648～2147483647の範囲にある整数値を保持するための32ビットの変数型
    * nullは利用不可
    * プリミティブ型
* Integerとは？
    * –2147483648～2147483647の範囲にある整数値を保持する変数型
    * nullは利用可能
    * オブジェクト型(クラス型)

Integer型はint型のラッパーであり、int型を操作するためのメソッドが用意されている。


# 利用例
たとえば、int型からString型へキャスト(型変換)したい場合などで利用されます。

```Java
int price = 100;

// int -> Integer
Integer priceRap = price;

// Integer -> String
System.out.println("price : " + priceRap.toString());

// Doubleにしたい
Double priceDouble = priceRap.doubleValue();

// Doubleにして税金計算とか？
Double per = 1.1;
System.out.println("Payment amount : " + (priceDouble * per));
```

# なぜ？
なぜ、intとIntegerなどが別れて存在しているのかというと、コンピューターはint型などのプリミティブ型を処理します。

WebAPIのJSONでもプリミティブ型を利用して、オブジェクト型は送信しません。

データを加工したり、保存したり、何かしら操作したい場合にInteger型が必要になってきますので、必要に応じて使い分けてください。
何となく理解するSwiftのアンダースコア

## はじめに
Swiftをやっていて「何やねんこれは」となり、最初は放置していましたが、
最近何となしにわかり始めたので書きました。

## 値の破棄
Swiftでは変数名にアンスコを使用することで代入する値を破棄することができます。

例えば、nilチェックするけど別にそれ自体を何か他で使用することがないときとか。
for-inで回すけど特にループ変数は使うことがないとか、そんなときに使います。
以下、SceneDelegate.swiftに初期で記されてあるものです。

```Swift
guard let _ = (scene as? UIWindowScene) else { return }
```

ダウンキャストのチェックはするけど以降で別に使用しないので、アンスコで破棄しています。
とりあえず、変数名にアンスコを見かけたら「他のところで使わんのやね」でおkと思います。

## 引数名の省略
Swiftでは関数を呼ぶ際には通常ラベル名もしくは引数名を記す必要がありますが、
アンスコをラベルに使用することで値のみの記載で呼び出せるようになります。

```Swift
// 引数名のみ
func sumNum(x: Int, y: Int) -> Int {
	return x + y
}

sumNum(x: 1, y: 2) // 3
```

```Swift
// ラベル
func sumNum(num1 x: Int, num2 y: Int) -> Int {
	return x + y
}

sumNum(num1: 1, num2: 2) // 3
```

```Swift
// アンスコ
func sumNum(_ x: Int, _ y: Int) -> Int {
	return x + y
}

sumNum(1, 2) // 3
```

## おわりに
まだまだ理解不足なところだらけなので、コメント欄で補記していただいたり、
追加のリクエストくださると嬉しいです。
品質の高いドキュメンテーションのポイント

開発や営業、様々なシーンでドキュメントを書く必要はある。
ドキュメントなしにして良いものはできない。

最低限、注意しておきたいポイントを自戒の念も込めて書き出しておく。

## 読みやすさ

読みにくいドキュメントは途中で読むのを断念してしまう。
せっかく時間をかけて書いても、読まれなければ意味がない。

* 誤字脱字がある
* **てにをは**が不適切
* 日本語としておかしい
* ルールがない
* 文章ばかり
* 複雑な図表がある

## 理解しやすさ

理解しにくいドキュメントは読んだ気になっても本質が伝わらない。
しっかりと読んだと思っても、後になって矛盾に気づく。

* 主観が多い
* 曖昧な表現が多い
* 理解しきれていない事をわかったように書く
* コピペしてそのまま
* 結論が無い
* 一文が長い
* 事実と意見と評価(良い、悪いのような表現)が混ざっている
* 専門用語が多い
* 一貫性がない

## 納得しやすさ

納得できないドキュメントは承認されない。
読み手を意識していないことで、期待を裏切ってしまう。

* 目的と背景を説明せず、伝えたいことだけ書く
* 誰向けのドキュメントか定義していない
* 読み手のスキルレベルと合っていない

## レビューしてない

よいドキュメンテーションは人の目に触れて、フィードバックを受けることでより良くなる。
一方的なドキュメンテーションにならないよう、コミュニケーションにより品質を保つ**意識**が大事だ。
MQL5-基本関数と"Hello, World!" 2

##　はじめに
この記事は以下リンクのYoutubeビデオを翻訳したものになります。よければそちらもご覧ください。
>https://www.youtube.com/watch?v=zYdt_HnGaFY&list=PLV8YK-9p3TcOmgAFIjntw-GxOJoHp9xwc&index=3

前回記事 は以下です。
>https://qiita.com/James_KW/items/575eb6cfc6d64180f003
本記事の内容はこの記事の続きになります。

##　追加された関数の説明
前回記事にてテンプレートで追加された関数について説明する。関数って何というプログラミング初心者は、「文字を表示する」とか「買い注文を入れる」とか何かするための物と思ってください。


```cpp
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
```
ちなみに//とするとコメントになり、//以降は読み込まれない。好きにメモを残しましょう。

さてこのOnInitはこのエキスパートアドバイザをチャートに適用した時に一度だけ実行される。
一行目の冒頭部分にある

```cpp
int OnInit()
```

のintの部分は変数としてint型(整数型)を返すという意味である。

次の関数にうつる。

```cpp
void OnDeinit(const int reason)
  {
//---
   
  }
```

この関数はこのエキスパートアドバイザが閉じられるときに一度だけ実行される。ここはエキスパートアドバイザをとじてクリーンアップするのに便利である。
一行目頭の"void"はどの値も返さないという意味である。

```cpp
void OnTick()
  {
//---
   
  }
```

この関数は、チャート上で値段が変わったときに実行される。上記の2つと違って複数回実行される。

##  Hello, world! 今何時?
ではここから実際にコーディングを進めていく。今回は以下のような内容のコードを書く。

・チャート上に"Hello, world"と出力する。
・Hello, worldの隣に現在の時刻を出力する。

まず、OnTick関数だけを残して、それより上の関数をすべて消してしまう。今回は使わないので問題はない。チャート上に文字を出力するために今回はcomment関数を使う

```cpp
Comment("内容")
```

この関数はチャートの左上にユーザー指定の内容を出力するというものである。ではHello,worldと出力するために、OnTick関数の中に以下のように書く。

```cpp
void OnTick()
  {
   Comment("Hello, world");
  }
```

この状態まで行ったら、コンパイルしてストラテジーテスターで実際に実行してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/b63943b0-3d9a-e970-f92b-2e2c584245cb.png)

コンパイルは上図の[コンパイル]のボタン。ストラテジーテスターでの実行は、上図の緑色の再生ボタンのようなもの。実はそのすぐ隣の青色再生ボタンもストラテジーテスターによる実行になるのだが、細かい違いはそのうち。。。

もし、この二つの再生ボタンがグレーアウトしていて押せない場合は、一番最初のテンプレートを作成する際に、名前を変更するときに、"Expart¥"を消してしまっていないか確認しよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/46060f05-0863-4c6a-d3d2-29ba79777355.png)

ここまでうまくいっていると、チャートが新しく表示されて、エキスパートアドバイザの適用するかどうか問われて[OK]を押すと、チャート左上にComment関数で表示させた内容、ここでは"Hello,world"と表示されるはずである。さてこの次に、このHello,worldの隣に現在時刻を表示させる。以下のようにOnTick関数の中身を変更しよう。

```cpp
void OnTick()
  {
   Comment("Hello, world",TimeLocal());
  }
```

変更したら、ここからさらに同様にコンパイルして実行しよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/6cdb088c-76bc-578e-5d03-d21cd3ce2fbc.png)

うまくいけば、上図のように現在時刻も表示されるはずである。
バブルソートでソートされる様子を可視化する

# 概要
バブルソートでソートされる様子を `matplotlib` を使って描画してみました
※jupyter notebook上に貼り付けて実行してください

```bubble_sort.py

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

list_a = [5,7,4,5,1,2,3,2,9,1,4]

left = np.arange(1, len(list_a) + 1)
height = list_a

plt.bar(left, height)
plt.show()

for i in range(len(list_a)):
    for j in range(0, len(list_a) - i - 1):
        if list_a[j] > list_a[j + 1]:
            list_a[j], list_a[j + 1] = list_a[j + 1], list_a[j]
    
    height = np.array(list_a)
    plt.bar(left, height)
    plt.show()
```
JSONファイルの日本語を表示する

# 問題
Pythonのrequestsで日本語が含まれているJSON形式のデータを取得時の文字化け問題

# 解決策

下記の行を追加したら日本語が正しく表示されました〜

```
r.headers = {"Content-Type": "application/json; charset=utf-8"}
```

こんな感じ↓

```python
r = requests.get(url)
r.headers = {"Content-Type": "application/json; charset=utf-8"}
datas = r.json()
print(datas)
```
コマンドで、Githubへ最初のpushを行うまで

ローカルで作ったプロジェクトを最初にプッシュするまで

# 1、Githubでリポジトリの作成
下記のとおり作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274063/8820864f-fffc-c36a-99bb-231fdbfc1ea5.png)

# 2、初期化
cd で対象のフォルダ下まで移動して、下記

```
$ git init

# 初期化しました。と表示されます。
Reinitialized existing Git repository in /Users/hogehoge
```

# 3、待機用リポジトリに追加
同じく対象のフィルダ下で。

```
$ git add -A
```

# 4、コミット

```
$ git commit -m "first commmit"
```
# 5、プッシュ
Github上でリポジトリのURLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274063/619bb54e-d902-1983-27ce-0e5b490e0448.png)

同じく対象のフィルダ下で下記の通りプッシュ（URLの箇所は変更してください）

```
$ git remote add origin git@github.com:kaijuayako/sample.git
$ git push -u origin master
```

完了！
【Gradle】Springbootのプロジェクトを作る際に調べた依存ライブラリについて

##Gradleとは
「Apache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システム」
参考: [Gradle入門 - Qiita](https://qiita.com/vvakame/items/83366fbfa47562fafbf4)

SpringbootのプロジェクトでGradleを使った為、躓いた内容のについて記述。

ざっくりとGradleとは必要なファイルを作ってビルド作業を行うと、プロジェクトに必要なファイルやソースを自動的に組み立ててくれるツール。


###依存ライブラリについて

Gradleのビルドは、gradleコマンドで実行して。そのgradleコマンドはカレントディレクトリのbuild.gradleファイルを参照してビルドを行ってくれる。
build.gradleファイルにはざっくりとSpringプロジェクトで使うためのライブラリを使う為に宣言する場所がある。
依存関係はdependenciesブロック内で定義することができる。

###Gradle依存関係の書き方について

```build.gradle
dependencyManagement { 
    dependencies { 
        compile group:'org.springframework', name:'spring-core', version:'4.0.3.RELEASE' 
    } 
}
```
また、下記の様にショートカット形式を使うこともできる。

```build.gradle
dependencyManagement { 
    dependencies { 
        compile 'org.springframework:spring-core:4.0.3.RELEASE' 
    } 
}
```
どちらの構文でも、この構成により、すべての依存関係（直接または推移的）spring-coreがバージョンを持てる。（compileコンフィグレーションは孫以降の依存関係にも伝播する為、今は推奨されていないみたいです。）


###今回躓いた所
依存ライブラリの内容があまりわからず調査するのに苦労した為、箇条書きで下記に記述。


```
implementation 'org.springframework.boot:spring-boot-starter-web'
```
Web アプリを作る場合は、 spring-boot-starter-web モジュールを使用する。
Spring MVCを使用してRESTfulアプリケーションを含むWebを構築するためのスターター。

```
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
```
Spring Data JPAを使用するためのスターター。SpringではDBにJPAを利用するがこれはSpringbootからJPAを利用するための機能を提供する。DBを利用するなら必須

```
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation "org.thymeleaf:thymeleaf-spring4:3.0.11.RELEASE"
implementation "org.thymeleaf:thymeleaf:3.0.11.RELEASE"
```
テンプレートエンジンの設定
Thymeleafビューを使えるMVC Webアプリケーションを構築するためのスターター
下2行はspring-boot-starter-thymeleafのツリー下にあるのだが、バージョンを変更する必要があったので記述。

```
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
```
自動リソース管理、getter、setter、equals、hashCodeおよびtoStringの自動生成してくれる。


```
developmentOnly 'org.springframework.boot:spring-boot-devtools'
```
クラスパス変更時に自動再起動してくれる(ホットリロード機能)
デフォルトでは、変更を保存すると、Eclipseでこれが自動的に行われる。

```
runtimeOnly 'com.h2database:h2'
```
組み込みとしてもサーバとしても使えるJava製のデータベーH2のライブラリ

```
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter'
```
MyBatisのためのスターター

```
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
```
注釈が付けられたアイテムから独自の構成メタデータファイルを簡単に生成できる(Gradle 4.6以降ではannotationProcessorと宣言する)

```
]providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
```
Tomcatを組み込みサーブレットコンテナーとして使用するためのスターター。
spring-boot-starter-webによって使用されるデフォルトのスターターサーブレットコンテナ

```

testImplementation('org.springframework.boot:spring-boot-starter-test') {
	//JUnit4以前のグループを除外
	exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
```
JUnit、Hamcrest、Mockitoなどのライブラリを使用してSpring Bootアプリケーションをテストするためのスターター


各ライブラリのバージョン設定についてはGradleコマンド「gradle dependencies」で依存ツリーを確認しながらライブラリの宣言を行って下さい。
今後、修正箇所があれば適宜更新します。
ルークよ git push --force を使わないでおくれ… git push --force-with-lease を使っておくれ…

# まとめ

- `git push --force` ではなく `git push --force-with-lease` を使おう
- `--force-with-lease` オプション付き push を alias 登録しておくと便利

# そもそも git push --force とは

`git push --force` は強制pushのためのコマンド。いったんリモートにpushしたコミットを **なかったことにする** 場合に使われる。たとえば、次のような場合:

- 間違ってpushされたコミットを、リモートのlogから消し去る場合
- GitHub Actions動作確認用にpushされた実験的なコミットを、あとで消す場合

# --force-with-lease を使おう

過ちを正すため、時には力も必要だが、大きすぎる力には危険が伴う。`git push --force` は、気づかないうちに他人のコミットを巻き込んでしまう可能性がある。自分が fetch したあとに、誰かがコミットを push している場合が、そうだ。そのとき、このコマンドは誰かのコミットを闇に葬ってしまうのだ。

そこで `git push --force-with-lease` を使う。このオプションは、fetch 後にブランチが更新されている場合、force-pushを失敗させる。これで、うっかり他人のコミットを消し去ってしまう心配が減るだろう。

以下のようにエイリアスを設定しておくと、オプションを覚える必要がなくなって、便利:

```
git config --global alias.pushf "push --force-with-lease"
```

# 参考

- [git push --force でなく git push --force-with-lease を使う](https://ohbarye.hatenablog.jp/entry/2016/04/04/235819)
- [push --force-with-lease by default](https://stackoverflow.com/questions/30542491/push-force-with-lease-by-default)

# 追記 (2020-05-26 22:37)

ほぼ同内容のQiita記事がすでにありました:

- [git push -f をやめて --force-with-lease を使おう](https://qiita.com/wMETAw/items/5f47dcc7cf57af8e449f)
【学習メモ】AWS（EC2インスタンスの設置）

##1.目標成果物
<img width="665" alt="スクリーンショット 2020-05-25 21.58.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/549011f2-d0b6-3325-177f-80800b404f1c.png">

##EC2とは？
Elastic Compute Cloud、AWSクラウド上の仮想サーバーのこと。EC2インスタンスとも。

特徴
数分で起動し、1時間または秒単位で従量課金
サーバーの追加・削除、マシンスペック変更も数分で可能
OSより上のレイヤーについて自由に設定可能

##2.サーバー構築の作業手順
**1.EC2インスタンスを設置する**←今回はここ
2.Apacheをインストールする
- SSHでサーバーにログイン
- Apacheをインストール
3.ファイアウォールを設定する


##３.EC2インスタンス設置手順の確認
1.AMIの選択
2.インスタンスタイプの選択
3.インスタンスの詳細の設定
4.ストレージの追加
5.タグの追加
6.セキュリティグループの設定
7.SSHキーペアの設定


**AMI**
インスタンス起動に必要な情報が入ったOSのイメージ。サーバーのテンプレのようなもの
<img width="605" alt="スクリーンショット 2020-05-25 22.02.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/de8713b8-96d5-ab46-3b56-657a74cd754a.png">

**インスタンスタイプとは**
サーバーのスペックを定義したもの

m5.xlarge
m:インスタンスファミリー
5:インスタンス世代（バージョン的な）
xlarge:インスタンスサイズ

**ストレージとは**
サーバーにくっつけるデータの保存場所。EC2のストレージには２種類ある。

<img width="697" alt="スクリーンショット 2020-05-25 22.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/a3df365e-1760-e3a6-9b60-6172475949a1.png">

##4.いざ、構築へ

<img width="714" alt="スクリーンショット 2020-05-25 22.11.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/cdf12451-ad5f-5743-34a0-0fce726119fe.png">

自動割り当て
インターネット経由でアクセスできるグローバルIPアドレスをつけるかどうか選べる
→インターネットからアクセスできる状態にしたいので、「有効」を選択

配置グループ
複数のEC2インスタンス間の通信を高速化するためのグループ
→1つしかしないのでチェックなしでOK

順に進めていく。
<img width="723" alt="スクリーンショット 2020-05-25 22.12.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/77d5078e-9932-7408-30ff-fb850e74bd8f.png">

<img width="727" alt="スクリーンショット 2020-05-25 22.22.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/76dff15a-ea15-e199-09cf-7ff175dc2535.png">

<img width="698" alt="スクリーンショット 2020-05-25 22.22.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/328bd8c3-b3d6-0dd0-28a9-07cbf17080f8.png">

<img width="761" alt="スクリーンショット 2020-05-25 22.22.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/e72af9ed-7497-350e-46f6-9dfc70bf9694.png">

<img width="763" alt="スクリーンショット 2020-05-25 22.30.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/d4c9e27e-00b7-83bb-1a37-be346f970f35.png">


<img width="757" alt="4njDv.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/9a4e0889-2472-3623-b509-b33d906a624a.png">


<img width="763" alt="スクリーンショット 2020-05-25 22.31.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/fc94de68-3247-eeb9-7b2f-e804358ad615.png">


<img width="762" alt="スクリーンショット 2020-05-25 22.33.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/52be4e7c-7601-576a-5eea-8323a784b9ca.png">

起動を押すと、キー作成の画面が出るので、キーを新規作成する。SSHの作業になるのだが、そこは次回に回す。

次回は、

###サーバー構築の作業手順
1.EC2インスタンスを設置する
**2.Apacheをインストールする**
**- SSHでサーバーにログイン**
**- Apacheをインストール**
3.ファイアウォールを設定する
PowerShell はどうして Bash よりも取っつきにくいのか

## 理由

**学習コストが低い**。

Bash は UNIX哲学の流れを汲んでストリームはすべてテキストで統一しているから、
テキストの抽出・加工方法さえ覚えれば、 **仕様を一々調べなくて済む**

表示されたテキストを見れば、取り出したい情報がどこにあるかは一目瞭然
(洗練されたGUIもそういう特性を持つ)

### PowerShell が素晴らしい理由と取っつきにくい理由

**素晴らしいところ**

* ストリームにオブジェクトを流せる
  * 特定の条件のフィルター、フィルター後の情報表示を比較的きれいに実装できる
* 例外処理も書きやすい

**取っつきにくいところ**

* 流すオブジェクトの仕様を一々調べなくてはならない

## 最後に
UNIX哲学とストリームにオブジェクトを流す仕組みがあるが、両者の利点を兼ね備えるものは、ストリームに json を流す処理系だろう。

```
テキスト寄り
↑
Bash / Sed / Awk

JMSPath などを使った処理系 ... 構造化したテキスト(JSON)を連携
 
Ruby ... 比較的テキストを簡潔に処理するメソッドチェーンあり

PowerShell
↓
オブジェクト寄り
```
QGISを使ってshpファイルの文字化けを直す方法

今回は『QGIS』を使って文字化けを直す方法をご紹介します。

shp(シェープファイル)を使って、ジオメトリを可視化する機会が多いんですが、日本語名が含まれるときはガッツリ文字化けしていることが多いのでメモ。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/12246415-4a67-3a95-402c-dd274ae22701.png)
#QGISをインストール

文字化けを直すにあたり、『QGIS』を使って編集します。
https://www.qgis.org/ja/site/forusers/download.html から、『QGIS』をDLしてください(WindowsもMacも同様です)

↓OSGeoではないので、ご注意ください
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/2588a6db-2ab9-27f3-f8e7-b61dd92edb56.jpeg)
#文字化けを直す
インストールが完了したらQGISを起動し、shpファイルをドラック＆ドロップでファイルを開きます
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/247df8c4-ba69-922a-08fa-42864d5a7250.jpeg)
次に、画面上のメニュー欄の「レイヤタブ」の「レイヤプロパティ」を選択します。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/7a41d4d0-4f26-58b2-8c4a-3beed0440a21.jpeg)
「データソースエンコーディング」を「UTF-8」から「Shift_JIS」へ変換し、OKをクリック。

ちゃんと直っているか確認します。同じく上メニューの「レイヤ」の「属性テーブル」をクリック。

↓日本語がちゃんと表示されていたら成功です
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/9011b790-6f3a-189e-b87a-d8c808fcc444.jpeg)
最後に、レイヤ→名前をつけて保存→ファイル名を指定して赤枠内をクリックして完了です。

ここでは、<b>エンコーディングを「UTF-8」にして下さい。「Shift_JIS」では文字化けのままです。</b>
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/637e0fa8-5005-0349-582d-0b7cfdbabc6b.jpeg)
今回は、esriジャパンの「全国市区町村データ」を使用しました。

#関連リンク
▷esriジャパン(https://www.esrij.com/)
▷QGISホームページ(https://www.qgis.org/ja/site/index.html)
【Swift】TableViewで必要なメソッド

##セルの数を決めるメソッド

```
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return セルの数(chatArray.count)
 }
```

##セルに値を設定するメソッド（以下はチャットアプリ用）
```
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //セルを取得する
    let cell = tableView.dequeueReusableCell(withIdentifier: “ID", for: indexPath) as! CustomCell
    //セルに表示する値を設定する
    cell.messageLabel.text = chatArray[indexPath.row].messsage
    cell.userNameLabel.text = chatArray[indexPath.row].sender
    cell.iconImageView.image = UIImage(named: "")
    return cell
}
```
##セルのセクション数を決めるメソッド
```
func numberOfSections(in tableView: UITableView) -> Int {
        return セクションの数
}
```

##セルの高さを決めるメソッド
```
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
         return view.frame.size.height/6
}
```

##セルがタップされて時に呼ばれるメソッド
```
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
}
```
【言語処理100本ノック 2020】第4章: 形態素解析

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第4章: 形態素解析」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/06/092159

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
Node.js 12+なら標準入力が超簡単に読める

# `process.stdin`は`for await...of`でループできる

Node.js 12から`stream.Readable`が非同期反復オブジェクト(Async Iterable)になりました。

当然`process.stdin`もAsync Iterableなので、`for await...of`文でループできます。

```js:nl.js
(async () => {
  const buffers = [];
  for await (const chunk of process.stdin) buffers.push(chunk);
  const buffer = Buffer.concat(buffers);
  const text = buffer.toString();
  const lines = text.split(/\r?\n/);
  lines.forEach((line, index) => console.log('%d: %s', index + 1, line));
})();
```

補足ですが、文字エンコーディングを指定したい場合は、事前に`setEncoding(encoding)`で設定します。

```js
(async () => {
  process.stdin.setEncoding('utf8');
  let text = '';
  for await (const chunk of process.stdin) text += chunk;
  console.log('%s', text);
})();
```


# `@moneyforward/stream-util`を使えば、さらに簡潔に

`@moneyforward/stream-util`を使うと、さらに簡潔になります。

まずは、インストールを。

```sh
npm install @moneyforward/stream-util
```

## テキストとして一括取得するなら`stringify`

`@moneyforward/stream-util`の`stringify`を使えば、ごく簡潔に文字列にできます。

```js
const { stringify } = require('@moneyforward/stream-util');

const text = stringify(process.stdin);
console.lot('%s', text);
```

## 行ごとに逐次処理するなら`transform.Lines`

`@moneyforward/stream-util`の`transform.Lines`を使えば、行ごとにループして逐次処理が簡潔にできます。

```js
const { transform } = require('@moneyforward/stream-util');

let count = 0;
for await (const line of process.stdin.pipe(new transform.Lines())) {
  console.log('%d: %s', count++, line);
}
```

# 参考

- [Streams Compatibility with Async Generators and Async Iterators | Stream | Node.js v12.x Documentation](https://nodejs.org/docs/latest-v12.x/api/stream.html#stream_streams_compatibility_with_async_generators_and_async_iterators)
- [for await...of - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for-await...of)
- [@moneyforward/stream-util  -  npm](https://www.npmjs.com/package/@moneyforward/stream-util)
Githubでプルリクをするとき"There isn't anything to compare"といわれたときの対処法

### 問題
プロジェクトも終わりが見えてきて、制作中のbranchをmasterとmergeしたいとき。
まず制作中のbranchからpull requestをします。（Github上で行えます）
ところがどっこいこのようなメッセージが出てきました。

```
There isn’t anything to compare. master and edit_branch are entirely different commit histories.
```
**masterとedit_branch(制作branch)は全く異なるコミットを持つものです。比較できません。**
というような訳かとおもいます。

もっというと、この二つはそもそも何の関係性も持たないので、remote(Github上)では、比較するなんてことはできません。ということのようです（間違っていたらご指摘ください…）。

###解決策
remote上で、edit_branchのmasterは、これよ〜と知らせるためにターミナルで以下を打ち込みます。

```
git branch --set-upstream-to=<remote>/<branch> master
//例
git branch --set-upstream-to origin/edit_branch master
```

これでedit_branchとmasterの関係性が構築できました。
あとは以下を叩きます。

```
git checkout edit_branch
git pull
git checkout master
git pull
git merge edit_branch
git push origin master
```

この順でmergeまで完了しました。

ちなみに

```
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxx/xxx.git'
hint: Updates were rejected because the tip of your current branch is behind
```

ということが起きるかもしれません。

わたしは以下のように強制的にpushしてしまいましたが…

```
git push -f origin master
```

もっといい方法があればぜひ教えていただきたいです！
備忘録でした。
swift 日記 20200525

こんばんは。

今日は、じゃんけんアプリの作成のstepの1つを実施しました。

やったこと
 1, Labelの配置(前回のおさらい)
 2, Buttonの配置
 3, Imageviewの配置
 4, Buttonの文字サイズ変更、背景変更
 5, 画面全体の背景変更

![スクリーンショット 2020-05-25 22.31.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642569/0823256b-6888-ef4c-eac5-2f2dc73d5385.png)
PowerShellでグループの説明を更新する


## 概要
GUI だと説明欄を更新すればよいが PowerShell だと意外と情報がなく悩む。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/f4c49b60-0665-b16a-569a-f599722868c2.png)

## 48文字以内

```powershell
Get-LocalGroup -Name 'Users' | Set-LocalGroup -Description '123456789012345678901234567890123456789012345678'
```

**実験: 49文字以上で `Set-LocalGroup`を実行してみる**

GUIなら普通に入力できても、親父にもぶたれたことがなくても、怒られる。
だって、 `Set-LocalGroup` はそういう仕様だから。

```console
PS C:\Users\WDAGUtilityAccount> Get-LocalGroup -Name 'Users' | Set-LocalGroup -Description '1234567890123456789012345678901234567890123456789'
Set-LocalGroup : パラメーター 'Description の引数を確認できません。引数の文字の長さ 49 が長すぎます。引数の文字の長さが "48" 文字以下になるように短くして、コマンドを再実行してください。
発生場所 行:1 文字:60
+ ... roup -Description '1234567890123456789012345678901234567890123456789'
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Set-LocalGroup]、ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SetLocalGroupCommand

PS C:\Users\WDAGUtilityAccount>
```

## 48文字より大きいとき

```powershell
[adsi]"WinNT://$env:COMPUTERNAME/Users,group" | ForEach-Object {$_.Description = '1234567890123456789012345678901234567890123456789'; $_.SetInfo()}
```

**実行例**

```console
PS C:\Users\WDAGUtilityAccount> [adsi]"WinNT://$env:COMPUTERNAME/Users,group" | ForEach-Object {$_.Description = '1234567890123456789012345678901234567890123456789'; $_.SetInfo()}
PS C:\Users\WDAGUtilityAccount> Get-LocalGroup -Name 'Users'

Name  Description
----  -----------
Users 1234567890123456789012345678901234567890123456789


PS C:\Users\WDAGUtilityAccount>
```

## 最後に
何の意味があるのかは聞かないでください。
これを求めて検索した人が意味があることを知っています。

## 参考

* [How to save changes to Windows group using WMI and Powershell - Stack Overflow](https://stackoverflow.com/questions/24055490/how-to-save-changes-to-windows-group-using-wmi-and-powershell)
[Rails]テーブルのカラム追加、型変更、型確認方法、カラムの型の種類

# こんな時
あ。追加でカラム欲しいな。
あ。型変更したいな。
カラムの型を簡単にさっと見たいな。
型っていっぱいあったよな、どれがなんだっけ。

# 記載事項
1.カラム追加方法
2.カラムの型変更方法
3.ターミナルでの型確認方法
4.カラムの型の種類（毎回ここに[Rails](https://railsdoc.com/migration)見に行ってるので、Qiitaに持ってきます。）


# １.カラム追加方法

```ruby:ターミナル
rails g migration Addカラム名Toテーブル名 カラム名:データ型

#　postsテーブルにstart_timeカラムをtime型で追加
rails g migration AddStartTimeToPosts start_time:time

#　マイグレーションファイルが作成される
#　create    db/migrate/~~~_add_start_time_to_posts.rb
```

ファイルを編集。
他にもカラム追加したかったので追加。
null: falseもつけて、空のデータは保存不可にします。

```ruby:~~~_add_start_time_to_posts.rb
class AddStartTimeToPosts < ActiveRecord::Migration[5.2]
  def change
    add_column :posts, :start_time, :time, null: false
    add_column :posts, :end_time, :time, null: false
    add_column :posts, :golf_place, :string
    add_column :posts, :min_member, :integer, null: false
    add_column :posts, :max_member, :integer, null: false
  end
end
```

rails db:migrateして終了！！

```ruby:ターミナル
rails db:migrate
```

# ２.カラムの型変更方法

```ruby:ターミナル
rails g migration change_data_カラム名_to_テーブル名

# postsテーブルのdateカラムの型を変更
rails g migration change_data_date_to_posts

# マイグレーションファイルが出来る
# db/migrate/~~~_change_data_date_to_posts.rb
```

マイグレーションファイルを編集します。

```ruby:~~~_change_data_date_to_posts.rb
# change_column :posts, :カラム名, :型
# dateカラムをdate型に変更したかったのです。

class ChangeDataDateToPosts < ActiveRecord::Migration[5.2]
  def change
    change_column :posts, :date, :date
  end
end

```

rails db:migrateして終了！！

```ruby:ターミナル
rails db:migrate
```

# ３.カラムの型確認方法

ターミナルでコンソールを使います。

```ruby:ターミナル
rails c
```

```ruby:ターミナル
# モデル名.columns_hash['カラム名'].type

pry(main)> Post.columns_hash['date'].type
=> :date
```
dateカラムはdate型と確認出来ましたね。


# ４.カラムの型一覧
最後にカラムの型一覧です。

[カラムの型]
- データ方	説明
- string	文字列
- text	長い文字列
- integer	整数
- float	浮動小数
- decimal	精度の高い小数
- datetime	日時
- timestamp	より細かい日時
- time	時間
- date	日付
- binary	バイナリデータ
- boolean	Boolean型

元ソース　[Rails](https://railsdoc.com/migration)


ありがとうございました！！
【Rails】コメントされると投稿が削除できない！？

# 投稿の経緯
Twitter、FbのようなSNSを作成中のことです。
投稿機能に削除ボタンを付けたのですが…**投稿が消せない！！**

もっと細かく言うと、ただの投稿は消せる。
投稿に写真を載せたり（postモデルとimageモデルで分けている場合に限る）
投稿にコメントをされたりすると消せなくなる。。

**【本日の登場人物】**
（親）postモデル　→投稿を保存するモデル
（子）imageモデル　→投稿に紐づく画像を保存するモデル
（子）commentモデル　→投稿に対するコメントを保存するモデル

つまり、**postモデル**にネストしている**子モデル（imageモデル、commentモデル）**に値が入るとpostレコードを削除できなくなってしまう訳ですね。

実際のコードを見てみましょう。
# 実際のコード
```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :comments
  has_many :images
end
```
何の変哲もないpostモデルのアソシエーションですね。
ただ、このままだと、子モデルに値が入ると親モデルが消せなくなります。
なぜなら、親が消えてしまったら、**子の親がいなくなってしまう**から。。当たり前ですね笑

つまり、**親を削除した時に、子も一緒に削除される設定**をしてしまえばいいんです。
# 解決策
モデルで**「dependent: :destroy」**を設定してあげましょう。
dependent…翻訳すると「依存」ですね。イメージ湧きやすいかと思います。

これをアソシエーションの時に設定されたモデルは、そのクラスが削除されると、一緒に削除されるようになります。
何言ってるかわからないですね、実際に下に書いてみます。
# 解決後のコード
```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :comments,  dependent: :destroy
  has_many :images,    dependent: :destroy
end

```
何となくわかりましたかね？
**Postクラス** で **imageモデル** と **commentモデル**に設定していますね。
postモデル（投稿)が削除されるとアソシエーションで**dependent: :destroy**を設定されたモデル（画像、コメント）も一緒に削除される訳ですね。
# 注意点
これに関して注意してもらいたいことがあります。
実はこの**dependent: :destroy**って子モデルを削除するための設定じゃないんです。
#### アソシエーションを削除するための設定なんです。
例えば、commentモデルに以下のとおり記載してみます。

```ruby:comment.rb
belongs_to :post, dependent: :destroy
```
こうなってしまうと、コメントを削除したら**投稿まで削除**されてしまいます。

もう一度いいます。
**アソシエーションの時に設定されたモデルは、そのクラスが削除されると、一緒に削除されるようになります。**

# まとめ
今回も私の拙い説明を最後まで読んでいただきありがとうございました。
間違いや補足がありましたらコメントいただけると嬉しいです。

どんどはれ。
Firebase hosting に GitHub Actionsから自動デプロイしてみる

## はじめに

最近CI/CDとか自動デプロイって流行ってますよね。一体どんなもんなのかやってみたい。。。
ということで趣味で運用しているポートフォリオ（静的Webページ）のデプロイ作業を自動化してみます。

## やること

①自分用のポートフォリオページを編集
↓
②GitHubにプッシュ
↓　**ここを自動化したい**
③Firebaseへデプロイ



## まずはFirebaseのCI用の認証トークンを取得

管理したいプロジェクトに移動して

```
firebase login:ci
```
を実行します。

するとブラウザのログイン画面が表示されるので、
プロジェクトの登録されているアカウントでログインします。

画面に”Woohoo! Firebase CLI Login  Successful"と表示されればokです！
firebase-toolsが入っていない人は実行できないのでnpmで入れましょう。


先ほどのコマンドラインには発行されたトークンが出てきますのでこれを控えます

```
+  Success! Use this token to login on a CI server:
1//xxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzhoge
```



## トークンをGitHubのSecret変数に追加

プロジェクトページの”Settings”からその中の”Secrets”を開きます（ナビゲーションバーの下部にあります）
その中のNew Secretからトークンを登録できます。

![Secret.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/dfe711a6-093e-08dc-b255-83bb25c1d74f.jpeg)

Name→**FIREBASE_TOKEN**
Value→**（発行されたトークン）**
を追加してあげます


環境変数のようなものでActions実行時に参照します

## Actionを定義

次に "Actions" → "Set up a workflow yourself" を開き、以下を貼り付けます


```:main.yml
name: deploy_to_firebase_hosting

on:
  push:
    branches:

      - master

jobs:
  deploy_to_firebase_hosting:

    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout the repository
        uses: actions/checkout@master
      
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
```
masterブランチにプッシュされたら Firebase deploy のコマンドを実行する、という内容ですので必要に応じて書き換えてください



ここまでくれば準備完了です。
実際に自動デプロイされるか試してみましょう



## GitHubにプッシュしてみる

適当に修正後コミットしてmasterブランチにプッシュしてみましょう。
実行結果は"Actions"から確認できます。

緑のチェックがついていれば正常終了です。
デプロイの内容がFirebaseに反映されているはずです![workflow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/0f2a9f00-621d-c3f9-a76d-e7dab4109418.jpeg)


## 感想

無事デプロイされていました。
ビルドやテストもできるようですね
便利だ。。。自動化ってすばらしい！

一度設定してしまえばあとはプッシュするだけでおｋです
環境気にせずに作業できます。簡単にできますのでぜひ試してみてください！