OmniAICreator/Qiita-1.07M huggingface dataset:
Python: URLエンコード: リンクを貼るためにhttp://を避けて変換する

# はじめに
本コードはクリップボードにコピーされたテキストファイルを”http://”を避けてURLエンコードしてクリップボードにコピーし直すというものです。

1. URLをクリップボードにコピー
1. 本コードを実行
1. クリップボードに変換後の内容が入っている

という趣旨です。

# ところで
2つ目の投稿。2021-05-18時点でPython歴3週間です。改善点等があればご指摘いただければ助かります。投稿のお作法さえもまだまったく分からない状態です……。

Macユーザー向けにAutomatorでの方法も記載しておきました。

# きっかけ
知識の亡者として知られる、とあるお髭のハンガリー研究者と語り合っているうちに、ハイパーリンクをコピペで貼り付け用にWikipediaのURLをパーセントエンコードする時に、“//”の部分などもエンコードされてしまい甚だ迷惑。Googleマップも文中に日本語が入ってハイパーリンクが千切れてしまうという話題になりました。

そして、ググってみてもいくつかの記事で方法の指南はあるものの、正直言って私には難しすぎる……それなら、QuickBasic以来プログラミングなんてしたこともなかったのに、なぜか文法が異常に頭に入りやすく、しかもネットに例文が恐ろしいほどあるPythonで作ってしまおうと思ったというわけです。

# 前準備
Pythonとモジュールのインストール方法等は別途、お調べいただければと思います。必要なモジュールは

```python:モジュール.py　(1)
import pyperclip
import urllib.parse
```

を使用しましたので、```pip install [モジュール名]```で必要なものをインストールしましょう。

# ソースコード
必要なものをインストールした後で、下記のコードを作成します。

## Python3編
普通にPython3を使っていらっしゃる方は、こちらがよろしいかと思います。

```python:url_en.py　(2-1)
import pyperclip
import urllib.parse

if len(pyperclip.paste()) == 0:
	pass
else:
	str_raw = pyperclip.paste()
	str_enc = urllib.parse.quote(str_raw, safe='/:=@,.!?')
	pyperclip.copy(str_enc)
```

## Python2.7編
```python:url_en.py　(2-2)
import urllib
import urlparse

text = raw_input()

if len(text) == 0:
	pass
else:
	str_raw = text
	str_enc = urllib.quote(str_raw, safe='/:=@,.!?')
	print(str_enc)
```

## Automatorに入れ込む
### アプリ編
1. Automatorで新規作成「アプリケーション」を指定。
1. クリップボードの内容を取得
1. シェルスクリプトを実行：シェルを“/usr/bin/python”に指定
1. 「[Python2.7編](https://qiita.com/ekemtt/items/b52e9902199dd5be86d2#python27編)」のソースコードをシェルの入力欄にコピペ
1. クリップボードにコピー
1. 適当な名前で保存。
1. 実行ファイルにしたい場合は保存時や「書き出す...」で設定可能。

### サービス編
テキストを選択した時に現れる「サービス」を利用したものです。

1. Automatorで新規作成「クイックアクション」を指定。
1. ワークフローが受け取る現在の項目：テキスト
1. 検索対象：すべてのアプリケーション
1. 「選択されたテキストを出力で置き換える」にチェック
1. シェルスクリプトを実行：シェルを“/usr/bin/python”に指定
1. 「[Python2.7編](https://qiita.com/ekemtt/items/b52e9902199dd5be86d2#python27編)」のソースコードをシェルの入力欄にコピペ
1. 適当な名前で保存。あまり長いとメニュー欄が邪魔になります。

#Pythonista3[^1]編
Pythonista3ではモジュールpyperclipが使用できないため、違うモジュール(clipboard)を使用します。

```python:url_en.py　(2-3)
import clipboard
import urllib.parse

if len(clipboard.get()) == 1:
	pass
else:
	str_raw = clipboard.get()
	str_enc = urllib.parse.quote(str_raw, safe='/:=@,.!?"\'')
	clipboard.set(str_enc)
```

# 終わりに
GoogleMapでも変換の検証済みです。なお、iPhoneアプリ版Wikipediaは「共有」のメニューでコピーした場合、複数のリンクを記事があるため[^2]、Pythonista3版も考えざるをえませんでした……。

# 謝辞
早速のご教示ありがとうございます。

[^1]: iOS用Python実行アプリ（有料）
[^2]: 位置情報などが設定されている場合にそうなる
【Ruby】標準入力で得た値をハッシュに格納する

こんにちは！

Paizaを受講している中で、残しておこうと思った事を纏めます。
完全私用の備忘録ですが、皆様の役に立てれば、それはそれで幸いです。


今日の問題では、（paizaラーニングの方です）

**標準入力で得た値をどうしてもハッシュにしたい！！**
という願いを叶えたく、調べたり答えを見て学習しました。

ではいきましょう

## 問題

以下の形式で標準入力から値が渡されます

```ruby
5
A 1
B 2
C 3
D 4
E 5
# 1行目は何組の値が渡されるかの指標、
# 文字列と数値の間には半角スペース、各行で改行コードが1つ含まれています
```

**これをハッシュにしたい！！**
というものです

では、やっていきましょう

```ruby
# まず1行目の値を受け取る
n = gets.chomp.to_i

# 空ハッシュをinputと定義しておく
input = {}

(0..n).each do
  # まずは文字列として、配列で受け取ります
  lines = gets.chomp.split(' ')

  # ここでinputハッシュのキーバリューを定義していく！！
  input[lines[0]] = lines[1].to_i
end
```

それぞれの値を確認してみましょう！


```ruby
print lines
=> ["A", "1"]["B", "2"]["C", "3"]["D", "4"]["E", "5"]

print input
 => {"A"=>1, "B"=>2, "C"=>3, "D"=>4, "E"=>5}
```

できた！！
これでまた幅が広がりますねぇ:older_man:

Ruby初学者のみなさんは「 puts 」を習うと思いますが、
**配列のまま確認したい**なんて場合は、「 print 」がおすすめです

意識してなかったのに**多重配列になっていた**なんてこともあると思います
ネットで得た情報は鵜呑みにせず、目視確認していきましょうね

ではまた！！
UIViewにアニメーションを追加してみる

## 準備

背景が青色のボタンを配置します。

```swift
import UIKit

class ViewController: UIViewController {

    let button = UIButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        setupButton()
        // Do any additional setup after loading the view.
    }

    func setupButton() {
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)
        NSLayoutConstraint.activate([
            button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -80),
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
        button.backgroundColor = .blue
        button.setTitle("ボタン", for: .normal)
        button.addTarget(self, action: #selector(ButtonTapped), for: .touchUpInside)
    }
}
```

このボタンにアニメーションを施していきます。

## 段階1 addTargetでボタンが押された時にコンソールに出力する

のちにaddTargetで指定するための関数を作成します。

```swift
@objc func buttonTapped() {
        print("ボタンが押された")
}
```

`UIButton.addTarget(target: Any, action: Selector, for: UIControl.Event)`を使い、ボタンが押された時に`buttonTapped`が実行されるようにしま

す。指が離れた時に実行されるよう`.touchUpInside`を指定します。

```swift
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
```

段階2以降は`buttonTapped()`の中身を変更し、アニメーションを施していきます。

## 段階2 1秒かけてy座標を10下げる

`withDuration`はアニメーションにかける時間を指定します。

```swift
@objc func buttonTapped() {
        UIView.animate(withDuration: 1.0, animations: {
            self.button.center.y += 10
        })
}
```

なお、ボタンは押して

## 段階3 ボタンが押されてから1秒後に0.5秒かけてボタンを大きくする

`delay`はアニメーションが開始されるまでの時間を指定します。

```swift
@objc func buttonTapped() {
        UIView.animate(withDuration: 0.5, delay: 1.0, animations: {
            self.button.transform = CGAffineTransform(scaleX: 2, y: 2)
        })
}
```

## 段階4 段階2->段階3を連続で行う

`completion`にアニメーション終了後に実行する関数を指定できます。ここにアニメーションを指定することで、二つのアニメーションを連続で行うことができます。

```swift
@objc func buttonTapped() {
        UIView.animate(withDuration: 1.0, animations: {
            self.button.center.y += 10
        },completion: { _ in
            UIView.animate(withDuration: 1.0, animations: {
                self.button.transform = CGAffineTransform(scaleX: 2, y: 2)
            })
        })
}
```

## 段階5 段階4を応用して拡大/縮小を行う

```swift
@objc func buttonTapped() {
        UIView.animate(withDuration: 1.0, animations: {
            self.button.transform = CGAffineTransform(scaleX: 2, y: 2)
        },completion: { _ in
            UIView.animate(withDuration: 1.0, animations: {
                self.button.transform = CGAffineTransform(scaleX: 1, y: 1)
            })
        })
}
```
【ServiceNow】継承元に影響を与えずにUIアクションの設定を変更する方法

# 概要
インシデント等のテーブルを継承してカスタムテーブルを作成する場合、同様にしてUIアクションも継承されていますが、要件の中で、このUIアクションは必要がないから非表示にして欲しいという要件があると思います。

継承元に影響を与えるため、非表示にしたいUIアクション自体に設定を加えることはできません。
影響を与えないためには、非表示にしたいUIアクションのアクション名と同名のUIアクションを作成することで、そのカスタムテーブルで設定を上書きすることができます。

## この記事でできること
継承元に影響を与えずに、UIアクションの設定を変更できる。

# 環境、使用する物
- Version：Quebec
- 言語：日本語
- UIアクション

# 実践！
今回は、全てのテーブルが継承しているグローバル[global]テーブルで管理している【削除】ボタンをインシデントテーブルで非表示にします。

### UIアクション[sys_ui_action]でglobalの削除を検索する。
画像の３レコード目の削除がフォーム上で表示される削除のUIアクションです。
アクション名は**【sysverb_delete】**ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/6db435e4-1b20-4482-1069-9af082768259.png)

### インシデントテーブルでUIアクションを作成する
画像ではアクション名の入力と【フォームボタン】フィールドのチェックを外しています。同名のアクション名を入力することにより、継承元のUIアクションをインシデント内限定で上書きすることになります。今回あくまでフォーム上での削除ボタンを非表示するだけなので、他の設定はいりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/8fb586aa-bf10-667d-5db1-872d42946726.png)

###確認
ヘッダーに削除ボタンが無くなってますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/7138bc39-ea52-04e6-da3b-237b9c61f293.png)



# 結論
UIアクションのアクション名と同名のUIアクションを作成することで、そのUIアクションを上書きすることができます。
これにより、継承元及び他のテーブル内の設定に影響を与えずに変更したいテーブル固有の設定に上書きすることができます。
VPCフローログを設定してみた

## 目次

VPCフローログは VPC、サブネット、ネットワークインタフェースごとにキャプチャが可能です。
今回はVPCのキャプチャを行います。

1. 実施環境準備
2. cloudwatchでロググループの設定
3. フローログの設定
4. 確認

## 1. 実施環境準備

VPC・サブネットインターネット・ゲートウェイを作成し、インターネットゲートウェイをアタッチ・ルートテーブルに追加を行いました。
また、 [こちら](https://qiita.com/miyuki_samitani/items/61e1548cb61f4053e78d) を参考にEC2インスタンスを作成

作成できました。

![2021-05-171インスタンス _ EC2 Management Console - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/d037d821-64c2-6a89-a801-c21d44895c49.png)


ログインも出来ました。

```
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ 
```

## 2. cloudwatchでロググループの設定

- cloudwatchでロググループを作成

![2021-05-171CloudWatch Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/071ecc71-a141-860d-90f6-18b568fc6a40.png)


- ロググループの設定を記載

今回はロググループ名だけ記載し、作成を行います。

![2021-05-172CloudWatch Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/192adecd-7750-49ad-0e3f-f2a289b46895.png)


- ロググループが作成されました。

![2021-05-173CloudWatch Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f648c292-e13c-9599-01ad-729ac6f9d2ac.png)


## 3. フローログの設定

- フローログの作成

VPCから対象のVPCをクリック、フローログを作成し次に進みます。

![2021-05-171お使いの VPC _ VPC Management Console - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/49e70c02-39f3-0c9b-a741-ec0799e1692a.png)

- フローログの設定を記載

名前と送信先ロググループ、IAMロール以外はデフォルト設定です。
名前は任意の名前を、
送信先ロググループは先程↑で作成したロググループを選択、
IAMロールは、 `アクセス許可を設定` → 別タブでIAMロールの作成が出るので許可 → IAMロールの選択 を行います。

![2021-05-174無題 - ペイント 2021-05-17 22.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/27b336b0-7083-316e-9f8c-c3d0837cd5a4.png)

- フローログが作成

フローログが作成されました

![2021-05-175お使いの VPC _ VPC Management Console - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/37200813-11df-9548-0c82-46458f344eae.png)

## 4. 確認

- ロググループから確認

cloudwatch > ログ > ロググループ > ログストリーム にて、ログが出ています。

![2021-05-176CloudWatch Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/52948946-da17-2b56-9088-1741a6c2945c.png)


- 詳細

詳細はログイベントから見ることが出来ます。

![2021-05-178CloudWatch Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/2d687eeb-e08d-bce0-aee2-19431037018e.png)

## 削除

今回はVPCから作成したので、以下を削除します。

- VPC
	- VPCの削除
	- サブネットの削除
	- インターネットゲートウェイの削除
	- (VPC削除しないのであれば、VPCのフローログ設定の削除も必要)
- EC2
	- EC2インスタンスの削除(ボリュームも一緒に)
	- 新規に作ったならセキュリティグループ
- cloudwatch
	- ロググループの削除
- IAM
	- IAMロールの削除(flowlogsRole)

案外忘れがちなのが、途中で作成したIAMロールなので、こちらもきちんと削除しないといけないです。
他忘れてたら指摘ください。
【AWS】EC2にSSH接続する

#プログラミング勉強日記
2021年5月18日

#SSHとは
　SSHはSecure Shellの略で、ネットワークに接続された機器を遠隔で操作して管理するためのツール。SSHは、クライアントとリモートマシンの間の通信を暗号化するプロトコル。SSHコマンドを使ってLinuxサーバーの操作を行える。SSHクライアントでは、SSHによる遠隔操作を支援するコマンドプロンプトタイプのソフトウェア。

```:基本的な書式
ssh[オプション]ホスト名[コマンド]
```

#SSH接続
　EC2インスタンスに接続するためには、基本的にLinuxであればSSHプロトコルを利用してEC2インスタンスに安全な接続を実施する。この接続にはクライアント側でSSHソフトウェア、EC2インスタンス側でSSHサーバーとしてのソフトウェアを設定する。そのときにはポート22番のプロトコルの場所を指定して接続する。

#EC2にSSH接続する方法(Windows)
　WindowsからSSH接続するためには、まずTera TermやputtyなどのSSHのクライアントソフトをインストールする必要がある。(私はTera Termで行った)

　まずTera Termを起動すると接続設定画面が出てくる。`ホスト`にEC2インスタンスのグローバルIPアドレスかDNS名を指定し、OKをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8c9e4746-01b0-64fe-2064-d042a7aa107d.png)

　初めてEC2インスタンスに接続する場合はSECURITY WARNINGが出てくる。指定したホストのサーバーが本当に正しいか判別するためのもので、EIPを使いまわす場合は`このホストをknown hostsリストに追加する`のチェックを外して`続行`を押す。

　次にユーザ認証画面に遷移するので、`ユーザ名`にアクセスするユーザ名を入れる。(`パスフレーズ`はデフォルトのキーであればそのまま)　`RSA/DSA/ECDSA/ED25519鍵を使う`を選択して`.pem`ファイルを指定して`OK`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/aec46350-efb4-7407-0916-a7b40c5a9d4a.png)
固有値分解はそもそも何のためにするのか？

某DL〇資格試験なんかそうですが、以下の文言が天下り的に示されることがあります。
「正方行列Aを正則行列Pと対角行列Λを用いて$ A=PΛP^{-1} $と表す」
いわゆる「固有値分解」というやつです。
ここでは、
**なぜこんな分解をするのか？**
このまことに**都合のいい「正則行列P」「対角行列Λ」とは一体何なのか？**
について、書きたいと思います。

※本稿では、$ A=PΛP^{-1} $を満たすPとΛが存在する正方行列Aのみを考えます。
※Λは「ラムダ」です。「A」と似ていて混同しやすいですが敢えて使用します。


### 固有値分解をしたい理由

ズバリ、**Aのk乗 $ A^{k} $ を簡単に計算したい**からです。
では$ A^{k} $の計算は、どういう場合に必要なのでしょう？
分かりやすいのは、時系列データです。
$ \boldsymbol{x}(t)=A\boldsymbol{x}(t-1) $
のように、ステップ毎の変化が行列Aであらわされる場合です。
この場合、既知の初期値 $ \boldsymbol{x}(0) $ を用いて、時刻t＝kの時の値は
$ \boldsymbol{x}(k)=A^{k}\boldsymbol{x}(0) $
と表せます。
この$ A^{k} $をお手軽に計算したいわけです。

### Aの累乗計算が簡単になる理由

とりあえずここでは、$ A=PΛP^{-1} $となる都合のいい「正則行列P」「対角行列Λ」が既知であるとします（これらが何であるかは後述します）。

$ A=PΛP^{-1} $ であることから、左右からそれぞれ$ P^{-1} $、$ P $をかけると、
$ P^{-1}AP=Λ $ となります。

以下、Λの累乗を計算していきます。
$ Λ=P^{-1}AP $
$ Λ^{2}=(P^{-1}AP)^{2}= (P^{-1}AP)(P^{-1}AP)=P^{-1}A(PP^{-1})AP=P^{-1}A^{2}P $
$ Λ^{3}=(P^{-1}AP)^{3}= (P^{-1}AP)(P^{-1}AP)(P^{-1}AP)=P^{-1}A(PP^{-1})A(PP^{-1})AP=P^{-1}A^{3}P $
：
**$ Λ^{k}=P^{-1}A^{k}P $**
となります。
**$ Λ $は対角行列なので、 $ Λ^{k} $の計算は容易**です。
ここで、左右からそれぞれ$ P $、$ P^{-1} $をかけると、
**$ PΛ^{k}P^{-1}=A^{k} $**
となります。
まともに$ A^{k} $を計算するより、こちらの方がずっと楽でしょう。

### 「正則行列P」「対角行列Λ」の正体

前掲の通り、$ A=PΛP^{-1} $を満たすPとΛが存在することを前提とします。

正方行列Aの形状をn行n列とします。
当然、Pもn行n列の正方行列です。
Pを縦ベクトル$ \boldsymbol{p_i} $を使って記述すると（iは列番号:1～n）、
$ P=( \boldsymbol{p_1}, \boldsymbol{p_2}, … , \boldsymbol{p_n} ) $

対角行列Λの形状もn行n列で、

```math
  Λ = \left(
    \begin{array}{cccc}
      λ_{11} & 0 & \ldots & 0 \\
      0 & λ_{22} & \ldots & 0 \\
      \vdots & \vdots & \ddots & \vdots \\
      0 & 0 & \ldots & λ_{nn}
    \end{array}
  \right)
```
と記述できます。

前掲の通り$ P^{-1}AP=Λ $であり、この左から$ P $をかけると、
$ AP=PΛ $
$ A( \boldsymbol{p_1}, \boldsymbol{p_2}, … , \boldsymbol{p_n} )=( \boldsymbol{p_1}, \boldsymbol{p_2}, … , \boldsymbol{p_n} )Λ $
これを列ごとに見ると（iは列番号:1～n）、
$ A\boldsymbol{p_i}=λ_{ii}\boldsymbol{p_i} $
となります。

ここまで来るとピンと来ると思います。
**$ λ_{ii} $はAの固有値、$ \boldsymbol{p_i} $はAの固有ベクトル**なのでした。
つまり、
「正則行列P」・・・Aの固有ベクトルを横に（列方向に）並べた行列
「対角行列Λ」・・・Aの固有値を↑と同じ横方向の順番で対角要素として並べた対角行列
これが、文字「λ」とか、Aと形が似ていて紛らわしい文字「Λ」を敢えて使用した理由です。

### まとめ

「正方行列Aを正則行列Pと対角行列Λを用いて$ A=PΛP^{-1} $と表」したいのは、
**$ PΛ^{k}P^{-1}=A^{k} $　の形に持ち込んで、$ A^{k} $を容易に計算したい**から。
そしてこの「正則行列P」「対角行列Λ」の正体は、
「正則行列P」・・・Aの固有ベクトルを横に（列方向に）並べた行列
「対角行列Λ」・・・Aの固有値を↑と同じ横方向の順番で対角要素として並べた対角行列
なので、（あとはいつもの）Aの固有値と固有ベクトルの算出、をすればよい。
METEORスコアの算出方法


METEORスコアの算出方法はズバリ
$MeteorScore = F_{mean}(1-p)$で計算されます

簡単にスコアの計算方法を述べると、$F_{mean}$でCandidateとReferenceのuni-gram適合度を調べ、$(1-p)$で語順が異なっていたり、単語を羅列しただけのもののMETEORスコアを小さくする役割がある。

## F_meanとは

$F_{mean}=\frac{10PR}{R+9P}$で表される数式です

$P$はPrecision、$R$はRecallを表します

precisionは、下記の式で定義されます
$p_n= \frac{\Sigma_{C\in \{Candidates\}} \Sigma_{n-gram \in C} RefCount(n-gram)}{\Sigma_{C'\in \{Candidates\}} \Sigma_{n-gram' \in C'} Count(n-gram')}$
この定義を簡単に言うと、candidateに含まれるn-gramがReference文中に観測される数とcandidateに含まれるn-gramの数の比率を表します。


Recallは、下記の式で定義されます
$r_n= \frac{\Sigma_{C\in \{Candidates\}} RefCount(uni-gram)}{\Sigma_{C'\in \{References\}} Count(uni-gram')}$
この定義を簡単に言うと、candidateに含まれるn-gramがReference文中に観測される数とreferenceに含まれるn-gramの数の比率を表します。このRecallで、どの程度Candidate (モデルが生成した出力)がReference (答え)と適合しているかを表す。

## p (penalty)とは
pは以下の式で定義されます
$Penalty = 0.5*(\frac{\sharp chunks}{\sharp unigrams_{matched}})^3$

この式によりチャンクの数が多いとPenaltyは最大で0.5になります。
チャンクの数が少ないとPenaltyの値は小さくなる。
tmux(v3.2)のコピー時にmacosのクリップボードにコピーする

"tmux copy clipboard macos"でググったところ、以下の記事が出てきた。

https://qiita.com/upinetree/items/cd80bc7865c52091be10


* 手元にインストール済みのバージョン3.2では、上記の方法ではうまくいかず、マニュアルを見たところより簡単に設定可能になっていた。
  * [Clipboard · tmux/tmux Wiki](https://github.com/tmux/tmux/wiki/Clipboard)

前提となる状態があるようだが、手元ではデフォルトで設定済みだった。(`set-clipboard`オプション, `Ms`機能)

前提がクリアできていれば、.tmux.confに以下を追加し、tmuxを再起動すればよい。
* https://github.com/tmux/tmux/wiki/Clipboard#how-to-configure---tmux-32-and-later

```
set -s copy-command 'pbcopy'
```
Bootstrap5 : バージョン4からの変更点をまとめてみた

おなじみBootstrapの最新バージョン「**Bootstrap5**」正式版がついにリリースされたようです！前々からBeta版のリリースが行われていたためそろそろかと思っておりましたがついに・・🔥

https://twitter.com/getbootstrap/status/1390032190369505284

こちらの記事では**既存のバージョン「4」からの変更点**をまとめてお伝えできればと思います。

また、今回ご紹介する変更点を**コードを書きながら体験できないか**と思い、自分の運営しているプログラミング学習レッスンプラットフォーム「Donbler」で**Bootstrap５変更点ハンズオンレッスン**を作ってみました！無料ですのでぜひこちらも試してみて下さい👇

https://donbler.com/lessons/58

# 変更点1: IE非対応化
バージョン5からIEがサポート外となりました。またEdge Legacyなどバージョンの古いブラウザも合わせてサポート外となります。

# 変更点2: 脱jQuery！
Bootstrap4に含まれていたjQueryに依存したコンポーネントは今回のバージョンアップに伴い生のJSで書き直されたようです。これによりBootstrap自体の大幅な軽量化が実現されるとのこと！！

# 変更点3: Gutterユーティリティの登場
元々あったグリッドシステムを補足するユーティリティとして追加されたようです。並べられたコンテンツの余白を設定するために用います。

# 変更点4: CSSのカスタムプロパティが使用可能に
IEのサポートを終了することにより、IEで利用できないため使えなかったCSSカスタムプロパティ(CSS変数)が使用可能になります。

# 変更点5: SVGアイコンの追加
今まではFont Awesomeが使われがちでしたが今回のバージョンから専用のSVGアイコンが追加されます。ちなみに以下リンクからBootstrapの利用有無問わず利用可能なようです！！使いたいアイコンを選択しSVGをダウンロード、iタグコピー、svgタグコピーのいずれかの方法を選択することで使用することが出来ます。

https://icons.getbootstrap.com/

# 変更点6: Floating Labelの登場
こちらは以下のページの`Example`を参照いただいた方が早いかもしれません・・(雑な書き方ですみません！)
イケてるフォームがこれで実装できるようになります！

https://getbootstrap.com/docs/5.0/forms/floating-labels/

# 変更点7: ブレークポイントの追加
Bootstrap4までのブレークポイントは以下の4つでした。

- 576px :Small
- 768px :Medium
- 992px :Large
- 1200px :Extra large

ここにさらにExtra extra largeのブレークポイントが追加されます！Class infixは`xxl`です。1400px以上に対応します。

# さいごに
いかがだったでしょうか？私個人的にはjQuery脱依存化、IE非対応化をはじめ、よりBootstrapが使いやすく、親しみやすくなる変更がなされたのかなと感じております。各種参考リンク・上でお貼りしたハンズオンレッスン等を使い、よりバージョン5の理解を深めていただけると幸いです！(私自身もより深く学ばないとなと思います！)
基本的かつ簡単なSQL構文をまとめてみた

##はじめに
構文を1行で書けるものは1行で書いてしまっているので、見にくい部分もあるかもしれませんが、ご容赦ください。
##データの取得
SELECT ✳︎(カラム名) FROM テーブル名
✳︎は全部のカラムを指す。カラムを指定することで、特定のカラムのデータを取得できる。
##データの追加
INSERT INTO テーブル名 VALUES ('1', '太郎', 'こんにちは', '2021/05/18')
VALUES後の値は設定しているカラムの左から順番に入れたい値を入れていく。
##データの更新
UPDATE テーブル名 SET カラム名 = 値, カラム名 = 値  WHERE id = 1
WHERE以降は更新したいレコードの条件をつける。
##データの削除
DELETE FROM テーブル名 WHERE 条件
条件に合致したものを削除するというもの
##検索の絞り込み
###AND,OR
SELECT * FROM テーブル名 WHERE 条件 AND　条件
SELECT * FROM テーブル名 WHERE 条件 OR　条件
ANDは「〜かつ〜」
ORは「〜または〜」
###比較演算子
「=」　等しい
「<」　右辺の方が大きい
「>」　左辺の方が大きい
「<=」　左辺は右辺以下
「>=」　左辺は右辺以上
「<>」　等しくない
###NULL判定
・NULLの場合
SELECT *　FROM テーブル名　WHERE カラム名 IS NULL
・NULLじゃない場合
SELECT * FROM テーブル名 WHERE カラム名 IS NOT NULL
###LIKE
・パターン文字
「%」　任意の0文字以上の文字列
「_」　任意の1文字
・「1月」の前後に0文字以上の文字列がついている日付カラムの値のレコードの指定
SELECT * FROM テーブル名 WHERE 日付 LIKE '%1月%'
・「1月」の後ろに1文字ついている日付カラムの値のレコードの指定
SELECT * FROM テーブル名 WHERE 日付 LIKE '1月_'
###BETWEEN~AND
・ある範囲内に値が収まっているかの判定
SELECT * FROM テーブル名 WHERE お金 BETWEEN 1000 AND 30000
###IN/NOT IN
・指定のカラムの値が指定の値のいずれかと合致する所を抽出する。
SELECT * FROM テーブル名 WHERE カラム名 IN (値1,値2,値3,・・・)
・指定のカラムの値が指定の値のいずれとも合致しない所を抽出する。
SELECT * FROM テーブル名 WHERE カラム名 NOT IN (値1,値2,値3,・・・)
##検索結果の加工
###DISITINCT
・重複行を除外する
SELECT DISTINCT　ユーザー名 FROM テーブル名
###ORDER BY
・結果を並べ替える
SELECT * FROM テーブル名　ORDER BY 金額 DESC
DESC：降順　ASC：昇順（デフォルト）
##結合
###内部結合
SELECT カラム名1, カラム名2, ... FROM テーブル名１
INNER JOIN テーブル名2 ON 結合の条件
・ベースとなるテーブルから条件にマッチしないものは削除される
###外部結合
SELECT カラム名1, カラム名2, ...,FROM テーブル1 
LEFT(RIGHT) OUTER JOIN テーブル名2 ON 結合の条件
※LEFT OUTER JOIN: 左側のテーブルを軸にして外部結合を行う方法
※RIGHT OUTER JOIN:右側のテーブルを軸にして外部結合を行う方法
・ベースとなるテーブルから条件にマッチしないものはNULL表示される
TailwindCSS + CSS Modulesでダークモードを扱う

ここではTailwindCSSの`@apply`ディレクティブをCSS Modulesで使ったとき、ダークモードを実現する方法を紹介します。

## `dark:`プリフィックスはCSS Modulesでは効かない

TailwindCSSでは`dark:`プリフィックスをつけると、ダークモード時のスタイルになります:

```html
<header class="bg-gray-50 dark:bg-gray-800">
                          ^^^^
```

普通のHTMLやReactの`className`でこれを使う分には問題ありません。ところが、上の`class`属性の中身をCSS Modulesにそのまま持っていっても、うまくいきません:

```scss:Header.module.css
.header {
  @apply bg-gray-50 dark:bg-gray-800; // うまくいかない
}
```
```Header.jsx
import style from "./Header.module.css";
function Header() {
  return <header className={style.header} />
}
```

## `:global()`を使うことで解決する

CSS Modulesでダークモードを効かせるには、`:global()`を用います。

```scss:Header.module.css
.header {
  @apply bg-gray50;
}

:global(.dark) .header {
  @apply bg-gray-800;
}
```

この`:global()`が使われたスタイルは次のようにコンパイルされるので、名前の衝突の心配もありません:

```css
.dark .global_header__2Vhcm {
    --tw-bg-opacity: 1;
    background-color: rgba(30, 41, 59, var(--tw-bg-opacity));
}
```
文字列補間($)の挙動

# 概要
文字列補間で文字列結合を行おうとした

# 環境
・Windows10
・framework 4.5.2

# コード

```c#:Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";

    var s = string.Format($"{s1}:{s2}");

    Console.WriteLine(s);
}
```

# 実行結果

単純に2つの文字列を`:`で結合して`{str:ss}`の結果を得ようとした。

が、

```bat
ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。
```

の例外が。。

どうも`{`が入っていると再評価されるようで展開に失敗していた模様。

# 改善

引数を指定する形に変更

```c#:Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";

    var s = string.Format("{0}:{1}", s1, s2);

    Console.WriteLine(s);
}
```

無事結合した結果`{str:ss}`が取得できました。

~~再評価されるとは知らなんだ。。~~
@lensouko さんのコメントより、内部の`{s1}:{s2}`が先に展開されてその後`string.Format("{str:ss}");`になるってことで理解できました。

# 展開された文字列に対し`string.Format`できるか

先に展開されるのなら、展開された文字列に対して`string.Format`できるか試してみました。


```c#:Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";
#pragma warning disable CS0219 // 変数は割り当てられていますが、その値は使用されていません
    var strss = @"I an strss!";
#pragma warning restore CS0219 // 変数は割り当てられていますが、その値は使用されていません

    var s = string.Format($"{s1}{s2}");

    Console.WriteLine(s);
}
```

そんなにうまい話はなかった。

```bat
ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。
```
ファイルの絶対パスをターミナルから取得するコマンド

# はじめに
ファイルの絶対パスを知りたいときに毎回取得方法を調べていたので、備忘録的に残します。

# コマンド
ターミナルから実行する

``find `pwd` -name "ファイル名"``

```
$ find `pwd` -name "hoge.html"
```

ファイル名にワイルドカードを指定することも可能。
以下を実行すると html ファイルの全ての絶対パスが出てくる

```
$ find `pwd` -name "*html"
```

当然ですが、たくさん該当ファイルがあるとめっちゃ出てきます。

# 参考
ありがとうございました！

https://staffblog.amelieff.jp/entry/2018/05/30/094427
歯の無い番犬に歯を生えさせるテクニックⅠ はめ込み方式＋多発明一出願戦略

歯の無い番犬に歯を生えさせるテクニックその１です。
特許出願（原出願）から何世代も分割を繰り返すことにより、被疑侵害品を見つけて特許権侵害訴訟を提起した段階でも分割特許出願が特許庁に係属している状態にしておきます。
裁判中において、下図のように被告が特許との相違点を主張しますので、その相違点を特許請求の範囲に記載した分割出願を行います。その分割が特許になれば、被告はぐうの音も出なくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461483/e1f0eaa8-58f3-5fa3-1e7d-061a00a53422.png)
これを可能にするためには、何年にも亘って分割に次ぐ分割を行って訴訟の時点まで分割出願を特許庁に係属させておく必要があり、分割のネタ切れを回避するべく、多数の発明を一出願中に盛り込んでおく必要があります。
Android用アプリをビルドする

#課題
アプリの修正を誰かに依頼し、git経由で納品されたものをビルドしてアップしたい。

#手順
使用するものは「AndroidStudio」、「git(bitbucket,githubなど)」
1. gitに納品されたものをAndroidStudioにクローン
2. 署名済みapkファイルの作成
3. GooglePlayConsoleへアップロード

###1.gitに納品されたものをAndroidStudioにクローン
<dl>
<dt> git(bitbucket)上の操作</dt> 
<dd> ・gitを開き、対象のリポジトリを選択</dd>
<dd> ・「クローンの作成」をクリックして、URLをコピー</dd>
<br>
<dt> AndroidStudio上の操作</dt>
<dd> ・起動後、「Get from Version Control」をクリック</dd>
<dd> ・gitで作成したクローンを貼り付けて実行</dd>
</dl>

###2. 署名済みapkファイルの作成
<dl> 
<dt> AndroidStudio上の操作</dt>
<dd> ・ブランチやHEADが自分のビルドしたいものになっているか確認</dd>
<dd> ・メニューバーの「build」→「Generate singed Bundle/APK」をクリック</dd>
<dd> ・小ウィンドウの中で「Android App Bundle（aabファイル※1）」を選択</dd>
<dd> ・すでに作成済みのkey情報を入力</dd>
<dd> ・「BuildVariants」を「release」にして実行</dd>
</dl>
※1.aabファイルとはアプリに必要なすべてのコードとリソースを含むファイルのこと。
　端末や設定ごとにapkファイル（androidのファイルのこと）を作るのではなく、
　googleがユーザーの端末や設定を判別して自動的にaabファイルから
　ユーザーにあったapkファイルを生成してくれる。

###3.GooglePlayConsoleへアップロード
<dl>
<dt>GooglePlayConsole上の操作</dt>
<dd> ・ログイン後、「全てのアプリ」ページ一覧から対象のアプリを選択</dd>
<dd> ・左メニューの「製品版」→「新しいリリースを作成」をクリック</dd>
<dd> ・「追加する Android App Bundle と APK」にある「ファイルを選択」ボタンをクリックし作成したaabファイルを選択」</dd>
<dd> ・あとはナビゲーション通り必須項目を入力していく</dd>
</dl>
Django REST Framework で画像を返す API を作成

# はじめに

[Django REST Framework で API 作成](https://qiita.com/honda28/items/a179c26c2cf147a247dd)で、データベースの情報を返す Web API を作成した。今回は、画像データを返すような API を作成する。[Djangoで画像を配信できるwebAPIを作る](https://qiita.com/Ajyarimochi/items/b7278c357b2ffca183b5)を参考にした。

# アプリの作成

アプリを作成して、画像処理ライブラリである pillow をインストールする。アプリの名前は app とした。

```
$ python manage.py startapp app
$ pip install pillow
```

# モデルの定義

models.py にて、画像ファイルを扱うモデルを定義する。画像ファイルを扱うには ImageField というフィールド型を使用する。ImageField を使用する際に pillow が必要となる。
ここでは、タイトルと画像を持つ Image という単純なモデルを作成した。

```python:models.py
from django.db import models

# Create your models here.
class Image(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.title
```

# 設定

settings.py にて MEDIA_ROOT と MEDIA_URL という項目を定義する。これらはそれぞれ以下のような意味合いを持つ。

- MEDIA_ROOT : 管理画面からアップロードしたり、モデルを save した際にファイルが配置される配信先。デフォルトはベースディレクトリの直下。
- MEDIA_URL : URL リクエストの起点となるアドレス。

ここでは、以下のように設定している。

```python:config/settings.py
...
from pathlib import Path

...
INSTALLED_APPS = [
    ...
    'app.apps.AppConfig',
]

BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = os.join(BASE_DIR, 'media')
```

（作成したアプリをプロジェクトに含めるため INSTALLED_APPS に app.apps.AppConfig を追記することも忘れずに。）

# URLConf の追加

上記で設定した静的ファイルを扱うために、以下のように config/urls.py に追記する。

```python:config/urls.py
...
from django.conf import settings
from django.contrib.staticfiles.urls import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    ...
]

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```

# モデルの有効化

新しくモデルを定義したので、makemigrations および migrate を実行し、モデルを有効化する。

```
$ python manage.py makemigrations app
$ python manage.py migrate
```

# 動作確認

すべて設定できたため、動作確認を行う。まず MEDIA_ROOT と モデルの定義で指定したディレクトリ（本記事では /media/images に相当する）に画像を置く。次に、開発用サーバーを `python manage.py runserver` で立ち上げ、[http://localhost:8000/media/images/example.png](http://localhost:8000/media/images/example.png) にアクセスすると、画像が表示されることが確認できる。

# おわりに

画像を返す API を作成した。次の記事では React で作成したフロントエンド側から API をたたいて画像を取得し、表示させてみる。
日本の特許権は歯の無い番犬

アメリカなどに比べ、日本では特許権侵害訴訟での原告勝訴率が低く、仮に勝訴しても損害賠償額が低額で代理人費用も賄えない場合もあります。近年の特許権侵害訴訟に関連する記事を見ても、事前交渉においてゼロ円でライセンス提供を要求されたとか、係争中にもかかわらず被告物件の実施を拡大させたとか、散々な記事が目につきます。日本の特許権は「歯の無い番犬」になっているのではないかと思えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461483/77c58de6-5555-07fe-20d8-50de0f0526e1.png)
会社経営者は、自社のリスクを最小限に抑えることが務めですので、特許権者との交渉に応じるよりも無視したほうがリスクが低ければ、当然無視する決断を行うのであり、この経営者の判断をとがめることはできません。
改善策としては、「歯の無い番犬」に歯を生えさせるしかありません。
次回以降、「歯の無い番犬」に歯を生えさせる方策（テクニック）を投稿します。
MySQL 主なコマンド

#背景
MySQL を操作するようになって使用する主なコマンドを振り返ってみました。


１　MySQLにrootユーザーで接続する

```
mysql -u root -h localhost
```


２　データベース一覧を確認する

```
show databases;
```

３　データベースに接続する

```
use データベース名;
```

４　テーブルの構造を見る（カラム名、データ型など）

```
desc テーブル名;
```


５　MySQLバージョン確認をする

```
mysql> select version();
```

#ユーザー関連

６　testユーザーをパスワードtestで作成する

```
Create user test@localhost identified by ‘test’
```

７　test ユーザーの設定されている権限を確認する

```
show grants for test@localhost;
```

使用するコマンドを適宜追加していこうと思います。
Redashにてプルダウンのフィルターを作る   ~BigQueryのpublic-dataを使って実践~

# 1.はじめに
最近インターンでSQLを書き始め、可視化ツールとしてRedashを使い始めました。

RedashはSQLが書けさえすれば、あとはGUIでプロットをいい感じに作ることができるので大変便利です。この便利な機能より便利に使えるようになりたいです。

私自身SQL駆け出しということもあり日々の業務から発見したtipsなどを残していければと考えています。

# 2.Redashのプロットにプルダウンのフィルターを付けたい！
イメージ的にはこんな感じのプダウンフィルターをプロットにくっつけたいです。

![messageImage_1620902022851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763695/92a80170-6991-7d37-9f9d-d494e85ca708.jpeg)


今回はこのRedashにてフィルターをくっつける方法をメモしていきます。

# 3.使うデータ
今回はBigQueryのpublic-dataである「Google Analytics Sample」のデータを使っていきたいと思います。GCPのアカウントを持っていれば誰でもこのデータを使うことができます。
詳細はここ[^1]

# 4.Redashでプルダウンフィルターを出現させる方法
## __filterを使う

```sql
SELECT os AS os__filter
```
みたいな感じで
’作成したいフィルター名__filter’
とすると以下のようにフィルターが出現します。
実装の詳細は下で！

### *「__filter」のアンダーバーは「2つ」

# 5.注意点　
## BigQureyでは「::」がサポートされていないことに注意！

公式サイト[^2]を見ると以下のような書き方をしてもフィルターが出現すると書かれています。

```sql
SELECT os AS 'os::filter'
```

しかし
> Note that you can use __filter or __multiFilter, (double underscore instead of double quotes) if your database doesn’t support :: in column names (such as BigQuery).

とあるようにBigQueryでは「::」がサポートされていないらしいです。

私はこのことに気づかずひたすらに「::」を使ってフィルターで出てこず時間を使ってしまったので皆さんもお気を付けください...

BigQueryを使う際には「__filter」か「__multiFilter」を使いましょう。

# 6.実際にSQLを書いてRedashで可視化する

RedashとBigQueryの接続などはできているという前提で、下記のようなコードでフィルターを出現させる練習をしてみました。（とりあえず練習ということで期間は適当に持ってきました）

今回はデータ内の「visits」というカラムを日時別、Os別で集計したいと仮定して「Os」に関するフィルターを出現させます。（Os別に日別の訪問者数を集計したい！）

以下が実装のコードです。

```sql
SELECT PARSE_DATE("%Y%m%d", date) AS dt,
       lower(device.operatingSystem) AS os__filter,
       sum(totals.visits) AS visits
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE _table_suffix BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 60 MONTH)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 48 MONTH))
  AND device.operatingSystem !='(not set)'
GROUP BY dt,
         os__filter
ORDER BY dt,
         os__filter
```

可視化した結果はこんな感じ

![ll.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763695/3706d6d1-f12e-37bd-62f0-2b673e7c3a5e.jpeg)

参考になれば幸いです。

# 7.最後に
今回はRedashにてフィルターを出現させる方法について追っていきました。

これまではplolyやggplotを使ってデータの可視化を行ってきましたがRedashが便利すぎて感動しています笑。BIツールって偉大ですね。より便利な使い方を模索していきたいです。

今後も自分自身が引っ掛かったところなどをまとめていければと思っております。

間違い等ございましたらご指摘いただけると幸いです。


[^1]: https://console.cloud.google.com/marketplace/product/obfuscated-ga360-data/obfuscated-ga360-data?filter=solution-type:dataset&filter=category:advertising&q=search&project=august-clover-294002&hl=ja&supportedpurview=project

[^2]: https://redash.io/help/user-guide/querying/query-filters
Google Colaboratory上のR環境でsfパッケージやspdepパッケージをインストールする方法について

Google Colaboratoryの環境上でRを動かすことができることについては、一般にも情報が広まりつつあると思う。

そこで、これにsfパッケージやspdepパッケージをいれてshpファイルなどを利用したいと思ったが、何故か通常のinstall.packagesを実行すると、次のようなエラーメッセージを返されてうまく行かない。

```r
“installation of package ‘units’ had non-zero exit status”
```

どうも、unitsパッケージのインストールが上手く行かない結果、このエラーが返されるようなのだが、色々試して（直接unitsパッケージの中身をlibフォルダに追加するなど）みてもうまくいかない。

結論からいうと、次の形でsystemコマンドから直接ライブラリを書き込ませることでinstall.packagesのエラーに対応できた。

```r
system('sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable')
system('sudo apt-get update')
system('sudo apt-get install libudunits2-dev libgdal-dev libgeos-dev libproj-dev')
install.packages('sf')
install.packages("spdep")
library(sf)
library(tidyverse)
library(spdep)
```

あとはなにか、適当なshpファイルを読み込ませて、アウトプットさせて図として保存してみる。

```r
map <- read_sf("map.shp")
plot(st_geometry(map))

geo <-ggplot(map)+
	geom_sf(aes(fill=v1))
ggsave(file="geo.png", plot=geo)
```

こんな形で、地図データをアウトプットが可能となる。
![geo (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504024/11280b58-6907-6f03-ee07-5c00d525e9c9.png)
static メソッド、非 static メソッドについて

***
###■　static 修飾子とは
static 修飾子とは、インスタンスを通してではなく、クラス（属するクラス、そうでないクラスともに）から直接呼び出すことができるようになる修飾子

Java のクラスが持つことができるメソッドは主に2つ、static メソッド（クラスメソッド）と非 static メソッド、（インスタンスメソッド）である

インスタンスメソッドは、その振る舞いを持っているインスタンスを生成して呼び出す、言わばインスタンスに動いてもらう、というイメージだが、クラスメソッドはその名の通りクラスに直接属している（クラスの持ち物）

クラスメソッド内ではインスタンスに属するもの（インスタンスの持ち物）は一切参照できない、つまりインスタンスのフィールド、メソッド、同一クラス内の非 static なメソッド、this、super は使用できない（自クラスのインスタンスを生成して使用することは可能）　static フィールドや他の static メソッド、引数を利用する

クラスの持ち物であるため、呼び出すときは原則として クラス名. static メソッド名 と指定する（その static メソッドを宣言しているクラス内、およびサブクラス内であればクラス名は不要）

######■　注意点
・インスタンスメソッドと同じシグネチャにはできない
・アクセス修飾子はインスタンスメソッドと同じにする
・ abstract にできない
・継承されない（static メソッドはオーバーライドできない）
Laravelで、メソッドの返り値に対して呼び出したメソッドをモックする方法

#環境
Laravel8系
php 7.3

#伝えたいこと
タイトル何言ってんだと思われたと思います。
語彙力がなくてごめんなさい。

要は、インスタンスのメソッドをモックするのは出来るけど、インスタンスのメソッドの戻り値に対してメソッドを呼び出したとき、そのメソッドをモック出来なくて困ったけど出来たよ、という報告です。ますます伝わらないかも。

```php:コントローラー
class SampleController extends Controller
{
    public function hoge()
    {
        $user = app(User::class)->find(1);

        $someMethod = user->someMethod();    //このsomeMethod()をモックしたい
　   }
}
```

こんな感じに、Userクラスのインスタンスにfindメソッドを呼び出し、それに対して呼び出したsomeMethodをモックしたいとき、どうするか？です。



```php:テスト
use App\Models\User;
use Mockery\MockInterface;

class SampleControllerTest extends TestCase
{
    public function test_for_hoge()
    {
        $mock = $this->mock(School::class, function (MockInterface $mock) {
       
            $mock->shouldReceive('find->someMethod')->once()->andReturn('fuga');
        });

        //以下テスト処理
    }
}
```

上のような感じで、```shouldReceive()```の中に```find->someMethod```とすることで、メソッドを2連続で呼んだ場合をモック出来ました。

そんなん知ってるよ、って話かもしれませんが、ググっても出てこなくて手間取ったので報告します。
ありがとうございました。
AWS（EC2）にデプロイをして、SSL化するまでに参考にした記事を紹介します

AWSへデプロイをして、SSL化を行った際に参考にした記事を共有させていただきます。
これからAWSへのデプロイを考えてる方の参考になったら嬉しいです:relaxed:
（RDSは使用してません。）

【デプロイ】
以下の動画を参考に作業を進めました。

https://youtu.be/DYoXhTUfm98


2点ほど躓いた点があり、解決するために参考にした記事も載せさせていただきます。
1. MySQLのインストール
動画内で選択されているEC2インスタンスがなかったため、「AmazonLinux2」を選択しました。
こちらのインスタンスにはデフォルトではMySQLが入っていないため、下記に記事を参考にインストールしました。

https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06



2.Nginxのインストール
こちらもAmazon Linux2にはnginxのyumが無いので、下記の記事を参考にインストールしました。

https://qiita.com/tamorieeeen/items/07743216a3662cfca890


【SSL化】
・ドメインの取得は、下記の記事を参考にしました。（※取得するのにお金がかかります！）

https://qiita.com/nakanishi03/items/25278fb4dfad60ebfac4

※最初の設定ではドメインの契約が自動更新になっているため、自分で設定変更する必要があります。
↓自動更新の解除手順

https://www.onamae.com/guide/p/19

・SSL化は下記の記事を参考にしました。

https://dev.classmethod.jp/articles/aws-web-server-https-for-beginner/

※サブネットが2つ必要なため、追加でもう1つ作成する必要があります。


僕自身分からないことがたくさんありながら作業を進めたため、他にもっと良い手順もあると思いますが、1つの参考として役に立ててもらえたら嬉しいです  
こういった投稿は始めてのため、何か不適切な点がありましたら修正いたしますので、ご意見いただけると嬉しいです:bow_tone1:
saasを導入するコマンド

saasをインストールして

```
npm install sass-loader node-sass --save-dev
```

style タグに以下のように記述します

```
<style scoped lang="scss">
```

nodeのバージョンが関わるエラーが発生した場合は、バージョンを下げる必要があります。
以下のサイトを参考にして、バージョンを管理する必要があります。

＊Module build failed: TypeError: this.getResolve is not a function

https://qiita.com/gosairei1207/items/95454ec5a396bd5f05fd

＊Node Sass version 5.0.0 is incompatible with ^4.0.0. 」エラー発生

https://zakkuri.life/npm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%80%8Cnode-sass-version-5-0-0-is-incompatible-with-4-0-0-%E3%80%8D%E3%82%A8%E3%83%A9%E3%83%BC%E7%99%BA%E7%94%9F/
manimの作法 その56

#概要

manimの作法、調べてみた。
AnimatedStreamLines、使ってみた。

#サンプルコード

```
from manimlib.imports import *

def joukowsky_map(z):
	if z == 0:
		return 0
	return z + fdiv(1, z)

def derivative(func, dt = 1e-7):
	return lambda z: (func(z + dt) - func(z)) / dt

def cylinder_flow_vector_field(point, R = 1, U = 1):
	z = R3_to_complex(point)
	return complex_to_R3(derivative(joukowsky_map)(z).conjugate())

class test(Scene):
	def construct(self):
		self.add_vector_field()
		self.begin_flow()
		self.add_circle()
		self.wait(5)
	def add_vector_field(self):
		vector_field = VectorField(cylinder_flow_vector_field, )
		for vector in vector_field:
			if get_norm(vector.get_start()) < 1:
				vector_field.remove(vector)
		vector_field.set_fill(opacity = 0.75)
		self.modify_vector_field(vector_field)
		self.add_foreground_mobjects(vector_field)
	def begin_flow(self):
		stream_lines = StreamLines(cylinder_flow_vector_field, colors = [BLUE_E, BLUE_D, BLUE_C], start_points_generator_config = {
			#	"delta_x": 0.125,
			#	"delta_y": 0.125,
		}, virtual_time = 5, )
		self.add(stream_lines)
		for stream_line in stream_lines:
			if get_norm(stream_line.points[0]) < 1:
				stream_lines.remove(stream_line)
		self.modify_flow(stream_lines)
		stream_line_animation = AnimatedStreamLines(stream_lines)
		stream_line_animation.update(3)
		self.add(stream_line_animation)
	def add_circle(self):
		circle = Circle(radius = 1, stroke_color = YELLOW, fill_color = BLACK, fill_opacity = 1, )
		self.modify_flow(circle)
		self.add_foreground_mobjects(circle)
	def modify_flow(self, mobject):
		pass
	def modify_vector_field(self, vector_field):
		pass





```

#生成した動画

https://www.youtube.com/watch?v=zzleRbwv1tM

以上。
manimの作法 その55

#概要

manimの作法、調べてみた。
AnimatedStreamLines、使ってみた。

#サンプルコード

```
from manimlib.imports import *

class test(Scene):
	CONFIG = {
		"vector_field_config": {
			"length_func": lambda norm: 0.1 + 0.4 * norm / 4.0,
			"min_magnitude": 0,
			"max_magnitude": 3,
		},
		"stream_lines_config": {
			"start_points_generator_config": {
			#	"delta_x": 0.125,
			#	"delta_y": 0.125,
			},
			"virtual_time": 1,
			"min_magnitude": 0,
			"max_magnitude": 3,
		},
	}
	def construct(self):
		def func(point):
			return 3 * sigmoid(point[0]) * RIGHT
		vector_field = self.vector_field = VectorField(func, **self.vector_field_config)
		circle = Circle(color = WHITE)
		slow_words = TextMobject("Slow flow in")
		fast_words = TextMobject("Fast flow out")
		words = VGroup(slow_words, fast_words)
		for word, vect in zip(words, [LEFT, RIGHT]):
			word.add_background_rectangle()
			word.next_to(circle, vect)
		div_tex = TexMobject("\\text{div}\\,\\textbf{F}(x, y) > 0")
		div_tex.add_background_rectangle()
		div_tex.next_to(circle, UP)
		self.add(vector_field)
		self.add_foreground_mobjects(circle, div_tex)
		self.begin_flow()
		self.wait(2)
		for word in words:
			self.add_foreground_mobjects(word)
			self.play(Write(word))
		self.wait(8)
	def begin_flow(self):
		stream_lines = StreamLines(self.vector_field.func, **self.stream_lines_config)
		stream_line_animation = AnimatedStreamLines(stream_lines)
		stream_line_animation.update(3)
		self.add(stream_line_animation)





```

#生成した動画

https://www.youtube.com/watch?v=vvJ-pm1R_o8
以上。
manimの作法 その54

#概要

manimの作法、調べてみた。
AnimatedStreamLines、使ってみた。

#サンプルコード

```
from manimlib.imports import *

def cylinder_flow_vector_field(point, R = 1, U = 1):
	z = R3_to_complex(point)
	return complex_to_R3(derivative(joukowsky_map)(z).conjugate())

def four_swirls_function(point):
	x, y = point[:2]
	result = (y ** 3 - 4 * y) * RIGHT + (x ** 3 - 16 * x) * UP
	result *= 0.05
	norm = get_norm(result)
	if norm == 0:
		return result
	return result

class test(Scene):
	CONFIG = {
		"func": cylinder_flow_vector_field,
		"flow_time": 15,
	}
	def construct(self):
		lines = StreamLines(four_swirls_function, virtual_time = 3, min_magnitude = 0, max_magnitude = 2, )
		self.add(AnimatedStreamLines(lines, line_anim_class = ShowPassingFlash))
		self.wait(10)



```

#生成した動画

https://www.youtube.com/watch?v=4VDKSpqAGjk

以上。
Homesteadの時刻を変更してアプリの動作確認をする設定

# VirtualBox上で動いているHomesteadの時刻を変更してアプリの動作確認をする設定
Homestead上で動くアプリを作っていて、３ヶ月後の動作確認をしたい。
そんなときHomestaed環境の時刻だけdateコマンドで変更すれば、動作確認ができる。と、思ったが。数秒後には自動的に補正されて正しい時刻になってしまう。

そこで、こんな bashのスクリプト を作った。


```bash
sudo service vboxadd-service stop
timedatectl set-ntp 0
systemctl stop chrony.service
date -s "07/01 13:00 2021"
sudo hwclock --set --date "1 Jul 2021 13:00"
```

関係ありそうな設定を一通り行って、なんとか自動補正されない状態にできた。


正しい時刻にするときにはVirtualBoxを再起動すると元に戻る。

注：決して本番環境で実行しないでください。
rails-ujs　が原因　（No route matches [GET] 　エラー）get じゃなくて　deleteしたいねん。

## 内容
Rails-ujsとはなんなのか

## Rails-ujsとは
Railsの一部のRESTfulな動作や非同期な処理などを実現するために、JavaScriptの送信に関する処理などが書かれたライブラリ！

例えば、Viewヘルパーの form_with の remote: true オプションだったり、 link_to の method: :delete などのオプションを「それっぽく動くように」動作させられるようになる。

https://www.inodev.jp/entry/2019/12/03/234210

## どこにあんの

```js:app/javascript/packs/application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
Turbolinks.start()
ActiveStorage.start()
```
これが
ここで呼ばれている

```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>RailsPractice</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>
    <%= render "shared/header" %>
    <%= render "shared/flash_messages" %>
    <%= yield %>
  </body>
</html>
```

``` erb:この部分
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

なので、
`app/views/admin/layouts/application.html.erb`
のようなファイルを作った場合は

```erb
<%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
この辺をしっかり書いてあげようねって話でした
RiverpodでStateNotifierProviderを使うときは、0.14系からの記事を参照しましょう

FlutterのState管理の定番になりつつあるRiverpodですが、0.14系からStateNotifierProviderの呼び出し方が変わったのはご存知でしょうか。

0.14がリリースされたのは2021/04/04なのですが、検索してみると0.13系までの情報がかなり多かったので、整理してみました。

## 公式の移行案内
基本的には公式に0.13から0.14への移行案内が書いてあるので、こちらを参照しましょう

beforeとafterを読めばわかるはずです。


https://riverpod.dev/docs/migration/0.13.0_to_0.14.0/


## 新規の方向けへ
これからRiverpodでStateNotifierを使ってみる方だと、公式の移行の解説だけだとわかりにくいかもしれないので、サンプルコードを用意しました。
コピペして色々いじってみるといいかもしれません。

1. providerの初期化
2. StateNotifierからstateの値を取得して、Widgetで表示する。
3. StateNotifier内のメソッドを呼び出す。

1, 2, 3の順に理解していくとわかりやすいはずです。


```dart
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

/// intがstateの型
class Counter extends StateNotifier<int> {
  Counter() : super(0);

  void increment() {
    this.state = this.state + 1;
  }
}

/// 1. providerの初期化
/// StateNotifierProviderに<StateNotifier, stateの型>になるように型引数を渡す。0.13系までは型の指定が不要だった。
final counterProvider =
    StateNotifierProvider<Counter, int>((refs) => Counter());

class ExampleScreen extends HookWidget {
  @override
  Widget build(BuildContext context) {
    /// 2. StateNotifierからstateの値を取得して、Widgetで表示する。
    /// StateNotifierからstateの値を取り出す時は、providerをそのまま指定する。0.13系まではprovider.stateだった。
    ///
    /// 値が変更されたら再描画されるように、HookWidget + useProviderを使う。
    final count = useProvider(counterProvider);

    return Scaffold(
      body: Center(
        child: Text(
          count.toString(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () => handlePress(context),
      ),
    );
  }

  void handlePress(BuildContext context) {
    /// 3. StateNotifier内のメソッドを呼び出す。
    /// StateNotifierの取得は、provider.notifierを指定する。0.13系まではproviderだけだった。
    ///
    /// メソッド呼びだしは、context.readでStateNofierを取得して呼び出すと楽
    /// useProviderやwatchはbuild直下じゃないと使いづらい
    /// (それ以外にもレンダリングとか色々理由あるけど)
    context.read(counterProvider.notifier).increment();
  }
}


```
WebView2 を Visual Studio 2017 Expressで利用できるまで

## Download

https://developer.microsoft.com/ja-jp/microsoft-edge/webview2/#download-section

* Evergreen 

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6effd282-cf4b-69fb-c38d-cfc22d32d38d.png)
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/66725fc3-7344-4dca-f076-c2e853234b88.png)

.Net Framework SDK 4.8

https://dotnet.microsoft.com/download/dotnet-framework/net48

## Visual Studio 2017 Express で利用できるように

https://web.biz-prog.net/readme/webview_new.html

> VisualStudio2017でNuGetを使う関係上、 パッケージ管理方法をpackages.configではなくPackageReferenceを使用する必要があります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/934ad4f4-321d-b11b-b6cb-27f6fe9f1638.png)


> 「パッケージの管理」の「既定のパッケージ管理形式」を"PackageReference"に設定してください。

> ビルド時に使用する.NET Frameworkが4.6.2以降になっている必要があります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3c47e377-2e4c-03d5-d4e2-b8d6b909f754.png)

* `プレリリースを含める`にチェックを入れておかないとwebview2がツールボックスに表示されなかった。(2021/5/18時点)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/2035682c-7c7d-f911-8a1e-949bfc46139b.png)



## メモ: OSと最初から入っている.NET Frameworkバージョン

https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

.NET Framework 4.6.2 は `Windows 10 ver 1607`以降に含まれている。
.NET Framework 4.8 は  `Windows 10 ver 1903`以降に含まれている。


## Visual Studio 2017のC#でページにアクセス

https://web.biz-prog.net/readme/webview_new2.html#initwait

* webview2に名前を`web`と付けて配置、
* ボタンを一つ追加。

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3d25ceec-d001-610f-5068-f62c45a01876.png)

```diff:MainWindow.xaml.cs
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using System.Windows;
  using System.Windows.Controls;
  using System.Windows.Data;
  using System.Windows.Documents;
  using System.Windows.Input;
  using System.Windows.Media;
  using System.Windows.Media.Imaging;
  using System.Windows.Navigation;
  using System.Windows.Shapes;
  
  namespace WpfApp1
  {
  	/// <summary>
  	/// MainWindow.xaml の相互作用ロジック
  	/// </summary>
  	public partial class MainWindow : Window
  	{
  		public MainWindow()
  		{
  			InitializeComponent();
+ 			InitializeAsync();
  		}
+
+ 		async void InitializeAsync()
+ 		{
+ 			await web.EnsureCoreWebView2Async(null);
+ 		}
+ 
+ 		private void Button_Click(object sender, RoutedEventArgs e)
+ 		{
+ 			web.CoreWebView2.Navigate("http://yahoo.co.jp");
+ 		}
  	}
  }
```

> await web.EnsureCoreWebView2Async

がないとエラーになることがある。
ExecJS::ProgramError がGemfileにcoffee-script-source ver1.8 を追加しても解消されない。

現場で使えるRuby on Rails5速習実践ガイドを進めていて、P.99の　`http://localhost:3000/` にアクセスするところで　ブラウザ上に`ExecJS::ProgramError`が表示されました。

解消するまでに苦労したので、記録しておきます。

### エラー内容(ローカルホストアクセス時のrails serverログ)
```shell
Started GET "/" for ::1 at 2021-05-18 01:20:01 +0900
   (0.4ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  ↳ /Users/{ユーザ名}/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.5/lib/active_record/log_subscriber.rb:98
Processing by TasksController#index as HTML
  Rendering tasks/index.html.slim within layouts/application
  Rendered tasks/index.html.slim within layouts/application (17.5ms)
Completed 500 Internal Server Error in 1558ms (ActiveRecord: 0.0ms)


  
ActionView::Template::Error (TypeError: Cannot read property 'version' of undefined):
     5:       | Taskleaf
     6:     = csrf_meta_tags
     7:     = csp_meta_tag
     8:     = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
     9:     = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    10:   body
    11:     .app-title.navbar.navbar-expand-md.navbar-light.bg-light
  
(execjs):1:213
(execjs):19:14
(execjs):1:40
app/views/layouts/application.html.slim:8:in `_app_views_layouts_application_html_slim___1532042825703924558_70301116723620'
```

# 試したこと（解消せず）
#### Nodeコマンドの確認
Node -v でバージョンが表示されるよう設定したが解消せず。

#### npm install eslint
「TypeError: Cannot read property 'version' of undefined」で検索して最初にヒットしたため実行したが解消せず。

#### Gemfileにcoffee-script-sourceを追加し、update

```
bundle update coffee-script-source
```
上記コマンドを実行したが解消せず。

#### サーバ再起動、PC再起動
解消せず。

# 解消した方法

``` 
bundle update execjs
bundle update autoprefixer-rails
```

# 原因

特定できず。（心当たりある方、ご教授ください。）

# 注意点
`bundle update` でも解消しましたが、以下の注意点があるようです。

> 引数なしで行うと、それまでインストールされたgemのバージョン、つまりGemfile.lockを無視して、リモートで利用> 可能な最新のgemをinstallしてきて、依存関係の解決を行うことになります。

>全てのgemに対して行う結果、相当数のgemのバージョンが変更されるので、今まで開発していたアプリケーションの挙動が変わってしまう可能性があります。

> 何の考えも無しにbundle updateを行うのはやめましょう！

そのため、開発の初段階である以外は、引数なしで実行するのは避けた方がよさそうです。



# 参考資料

https://www.oiax.jp/rails/zakkan/fix_exec_js_program_error_on_windows.html

「Windowsで...」とありますが、macでも同様の事象でしたので、参考にいたしました。

https://qiita.com/Momozono/items/7ec77eff34a525d6511d
【初心者向け】Qiitaに投稿するときの心構え

※05/21　誤記修正、内容追加

今回は技術面のお話ではなく、(特に初心者に向けて)Qiitaに記事を投稿するときの心構えのようなものを書きます。
(Qiitaに限らず投稿全般になるかもですが…)
※あくまで個人的なものですが参考として、
　「こんな考え方があるんだなー」と思いながら見ていただければ幸いです。

# ・この記事を書いた理由
##「技術を学んだ人の次の一歩としてアウトプットを勧めるため」
身に着けた技術をアウトプットすることで自分の中で理解が深まります。
なので(アウトプットの一環として)Qiita記事を投稿する、という一歩を踏み出していただければと考えました。
特に今の時期は、新入社員の方は入社して一か月が過ぎるという時期であり、
技術や知識を再確認して盤石にできるのではないでしょうか。

##「Qiita記事を書く人が増えると、情報も増えるため」
Qiitaに投稿される記事が多ければ多いほど、自分が探している情報が見つかる可能性上がります。
似たような情報でも数が多ければクリティカルに欲しい情報が見つかるかもしれません。

##「書くことをためらっている人もいるのではと思ったため」
どうせ書いても見られないだろうなと思っている人、逆に不特定多数の人に見られるのがいやだなと思っている人、
両方とも少なからず一定数はいると思います。
でも投稿してみたいな、という気持ちが少しでもある方の人の助けになればとも考えました。

# ・心構え
##「書きたいことを書く」
これは大前提です。
自分がアウトプットしたい技術(および技術に準ずるものでもOK)を書いてください。
(興味なく、知らない技術について書くのはつらいと思います…)

##「文章の練習の一環と思って書く」
私の場合、文章を書くのが苦手なのでこのような考えにもなります。
また、イラスト等の入れ方を考えることも出来ます。
さらに書くのがうまい人を参考にまねして書くという練習もできます。

##「ネタについてはほかの人と重複してもよいから書く」
さすがに書く人全員が一言一句同じになるとは思えません。
載せる用のプログラムも個人で変わってきます。
自分が書かなくても似たような情報はたくさんあると思いますが書いてみましょう。

同じような記事が多いとはいえ、まるパクリはダメです(全コピペとか)。

##「調べてから(実行してから)書く」
記事の確度を上げるためにやりましょう。
自分が学んだ技術・知識で今、頭にあるものが絶対とは限りません。
(間違った情報を投稿しないようにするための確認です)
実際にエラーが出た、こういう動きをした、等の実機確認、
あるいは、別サイトでや書籍等で「自分の知識を裏付けられる記載があるな」、と比較をしたうえで
結論を出し投稿しましょう。

##「コメントで何が来ても対応できるように覚悟する」
これが一番ネックかもしれません。
何が来ても、…は言い過ぎですが、
(コメントが来るとして)以下のような分類になるのではないでしょうか。
その分類ごとにどう対応するべきか大まかにですが書いてみました。

####「記事のここが間違ってるよ」
正しい指摘であることを確認(間違った指摘でないことを確認)したうえで記事を訂正。
(修正する場合は「コメントにて指摘があったため修正」と入れておくとよい)
もちろんコメントの指摘が間違っている場合は情報元ソースを出して返答する。
(「実機確認したところ以下の動作をしたため記事にこう書かせていただきました」等)
どうしても真偽がわからない場合は考えてどのように対処するか答えを出す。
(「～のような事象もありここで記載した動きと一致しないこともあるようです」等の文言を入れる対応とか)

####「この記事役に立ったよ」
好意を素直に受け取ります。コメントでありがとうございます等返してもいいかも。

####「(暴言等)」(ないとは思いますが…)
利用規約の禁止事項に抵触しますのでQiita運営に連絡を。

-----------------------------------

思いつく限りのものを書いてみました。
なおQiitaより以下記事も出ておりますので参考にしてみてください。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

https://help.qiita.com/ja/articles/qiita-article-guideline

----------------------------
※読ませていただいたコメントより、重要事項であると考え以下2つの記事を追記させていただきます。

https://help.qiita.com/ja/articles/qiita-community-guideline

https://help.qiita.com/ja/articles/qiita-question-guideline

↑下の記事は自分が"コメントを送りたい"と思った際に一読し、コメントを書く参考にしてみてください。


この記事でQiita記事を書く人が増え、将来的に良い記事を書く人が増えていけばいいなと思います。