OmniAICreator/Qiita-1.07M huggingface dataset:
アクセシビリティ試験実施のウェブページ数って、結局何ページが妥当なの？

## 結論

対応レベル | ページ数（代表するウェブページ + ランダムに選択したウェブページの合計）
--- | ---
少しやる | 11ページ
本格的にやる | 25ページ
顧客要求ありでやる | 40ページ

* 少ないページでも、やらないよりやった方が良い。
* 代表するウェブページ + ランダムに選択したウェブページ 混在の場合、WAICのJIS X 8341-3:2016 試験実施ガイドラインでは、40～50ページと言われているけど、実例からは~~40ページ~~最大217ページが1例あった。他は多くても40ページだった。

## ガイドライン

### JIS X 8341-3:2016 試験実施ガイドライン
https://waic.jp/docs/jis2016/test-guidelines/201604/

**表1. 「b)ランダムに選択する場合」の試験対象ページ数の目安**

選択するページ数	| 説明
--- | ----
10ページ以下	| 試行的な試験であり、合否を判定するのには少ない
11〜24ページ	| 合否判定に要する最低限のページ数
25〜39ページ	| 合否判定に要する標準的なページ数
40ページ以上	| 合否判定に十分なページ数

> d) ウェブページ一式を代表するウェブページとランダムに選択したウェブページとを併せて選択する場合
> 両方を合わせて、合計40～50ページ程度を試験対象にするとよい。

### JIS X 8341-3:2016 対応度表記ガイドライン
https://waic.jp/docs/jis2016/compliance-guidelines/201603/

**表1 表記の相違点**

表記	| ウェブアクセシビリティ方針の提示又は公開	| 目標とする適合レベルの達成基準の試験結果	| 追加表記事項
--- | ---- | ---- | ----
準拠	|必須	|試験を実施し、達成基準を全て満たしていることを確認	|なし
一部準拠	|必須	|試験を実施し、達成基準の一部を満たしていることを確認	|今後の対応方針<br>部分適合に関する記述（適用する場合）
配慮	|必須	|試験の実施の有無、結果は問わない	|目標とした適合レベル又は参照した達成基準一覧

## アクセシリビティ試験結果の実例

URL | 代表するウェブページの抽出数 | ランダムページ数 | 合計 | 満たしている適合レベル
--- | -------------------------- | -------------- | ---- | ----
千葉市 |
[千葉市：JIS X 8341-3:2016に基づくアクセシビリティ試験結果（平成30年度）](https://www.city.chiba.jp/front/accessibility_test_2018.html) | 15 | 25 | 40 | AA準拠
横浜市内の組織 | 
[ウェブアクセシビリティ方針について - 横浜市緑の協会のご案内公式サイト - 公益財団法人 横浜市緑の協会](http://www.hama-midorinokyokai.or.jp/kyokai/accessibility.php) | 20 | 10 | 30 | AA準拠
[ウェブアクセシビリティ方針｜みどりアートパーク-横浜市緑区民文化センター- 公式サイト](http://midori-artpark.jp/webaccessibility.php)  | 16 | 0 | 16 | AA準拠
[ウェブアクセシビリティ試験結果 - 横浜関内ホール 公式サイト](http://kannaihall.jp/webaccessibility/webaccessibilitylist.php) | 22 | 0 | 22 | AA準拠
[秀峰会が運営する横浜市地域ケアプラザのウェブアクセシビリティ試験結果 - 横浜の介護サービスは社会福祉法人 秀峰会](https://shuhokai.or.jp/newslist/accessibility-list.php) | 9 | 0 | 9 | AA準拠
三重県内の組織 | 
[平成30年度 ウェブアクセシビリティ試験結果 - ウェブアクセシビリティ方針 - 地方独立行政法人三重県立総合医療センター Mie Prefectural General Medical Center](https://www.mie-gmc.jp/content/page.php?no=20190325133529) | 40 | 0 | 40 | AA準拠
企業|
[ウェブアクセシビリティポリシー - 株式会社NTT西日本アセット・プランニング（NTT西日本AP）](https://www.ntt-ap.co.jp/webaccessibilitypolicy/)  | 6 | 0 | 6 | AA準拠
[ウェブアクセシビリティ試験結果–2020年3月｜ウェブアクセシビリティ｜日産スタジアム](https://www.nissan-stadium.jp/accessibility/accessibility-check-202003.php) | 15 | 25 | 40 | AA一部準拠
[JIS X 8341-3:2016に基づく試験結果（2020年4月1日公開）） - ウェブアクセシビリティ方針 - Panasonic](https://www.panasonic.com/jp/webaccessibility/results/2020/0820.html) | 15 | 0 | 15 | A一部準拠
その他|
[アクセシビリティ方針 - 理科ねっとわーく](https://rika-net.com/about/accessibility.php) | 17 | 0 | 17 | AA準拠
[ウェブアクセシビリティ検証結果 - 内閣府](https://www.cao.go.jp/notice/cao_webaccessibility.html) | 40 | 0 | 40 | AA準拠
[厚生労働省ウェブアクセシビリティ試験結果｜2020年09月｜厚生労働省](https://www.mhlw.go.jp/stf/accessibility/kekka_202009.html) | 217 | 0 | 217 | AA準拠
[2019年度 JIS X 8341-3:2016 適合証明書（総務省）](https://www.infocreate.co.jp/jis-db/a11y2019/cover.html)<br>[総務省｜総務省ウェブアクセシビリティ方針](https://www.soumu.go.jp/menu_kyotsuu/policy/webaccessibility/index.html)<br>※ 2019年10月時点 | 300(※)| 0 | 300 | A一部準拠
Error: A JNI error has occurred, please check your installation and try again

#Error: A JNI error has occurred, please check your installation and try again

指定されたコンパイラー準拠は1.5ですが、JREは〜みたいなエラー

参考
https://qiita.com/ponsuke0531/items/fb59a387cbbd8bb387fd

Javaコンパイラのバージョンが問題だった。

プロジェクトを右クリック→プロパティー→
左側のJavaコンパイラーを選択→コンパイラー準拠レベル：を選択

JREのレベルに合わせる。
（11）など
変更することで今回は対応。
[ServiceNow] 同じチョイスリストを複数フィールドで使用する方法

#概要
同じチョイスリストを複数のフィールドで利用したい場合があります。
本記事ではその方法について、説明します。

結論から言うと、ディクショナリ定義にある、Choice Table と Choice Filed という項目で、使いたいチョイスリストが定義されているフィールドを指定することで、同じチョイスリストを使うことができます。

#設定手順
Problem テーブルに新規に Category (内部名: u_category) というフィールドを追加し、そこのチョイスリストとして、Incident テーブルの Category (内部名: category) にすでに定義されているチョイスリストを使いたい場合を例に取り、手順を説明します。
以下、英語モードで行うことを前提に説明しています。

1 System Definition > Tables に行き、Problem テーブルを検索して、開きます
2 Columns セクションの Table Columns リストの歯車マークをクリックし、Column name, Choice, Choice table, Choice field の4つを表示するカラムとして追加します。
3 Column name を「u_」で検索し、u_category というフィールドを追加していないことを確認します。
4 「Insert a new row」の部分をダブルクリックして、行を追加し、以下の値を入れていきます。

| 項目 | 値 |
|:-:|:-:|
|Column label  | Category  |
|Type  | Choice  |
| Choice table  | incident  |
| Choice field  | category  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/9b57ba8d-4627-1e50-51e2-6e35da3b2506.png)
5  Problem テーブルのレコードを Save し、Column name、Choice にそれぞれ適切な値が自動的に入ることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/d585aca3-49a9-6066-341a-27515bfe46c8.png)
6 Related list にある、「Show form」から、Problem フォームを開き、メインセクションの最下部に追加されている Category フィールドのチョイスリストが、Incident の Category と同じものになっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/c9220553-46dd-fc11-d3cd-782af149abc8.png)
以上です。

#補足
###補足1
Madrid 以降で開始したインスタンスですと、「Problem Management Best Practice - Madrid」というプラグインがデフォルトで Install されており、この場合、Problem テーブルにデフォルトで Category (内部名: category) というフィールドが存在しますので、本手順を試してみる時は間違わないようにしてください
###補足2
Type を Choice ではなく、String にしても動きますが、その場合、その場合、Choice に「Dropdown with -- None --」が自動的に入らないので、こちらも設定する必要があります
###補足3
リスト画面上ではなく、Dictionary 定義のフォーム画面上でも Choice table, Choice field の設定は可能ですが、デフォルトの UI Policy で表示、非表示が制御されています。
私が試したところでは、以下の手順でフォーム上でも入れることができました。
Type を Choice にし、Advanced view にした後、Choice List Specification セクション内の Choice で「-- None --」を選択すると、Choice table フィールドが出てくるので、設定。
その後、Choice を「Dropdown with -- None --」に設定すると、Choice table が消え、Choice field が出てくるので、設定。
###補足4
Problem テーブルにさらに、Subcategory (内部名 u_subcategory) を追加し、Incident の Subcategory と同じチョイスリストを使うように設定した後、Problem の u_subcategory の Dictionary 定義で、Dependent field として、u_category を選択することで、Dependent Value の設定も Incident のものと同様にできることを確認しました。
k8s で  Warning  FailedCreatePodSandBox　でハマったときの備忘録

はまりました、、

## 出たエラー

作ったクラスターに何かdepolymentを作る時に、

```
ContainerCreating
```

状態でストップし、

```
kubectl describe pod <pod name> 

```

とすると、

以下のようなエラーが吐き出されていた、

```
Events:
  Type     Reason                  Age                From               Message
  ----     ------                  ----               ----               -------
  Normal   Scheduled               30s                default-scheduler  Successfully assigned kube-system/coredns-f9fd979d6-9gqqt to linux
  Warning  FailedCreatePodSandBox  27s                kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "de129c92e3eb25049f135c10d868da7e7f8dc1cf7f36a6a5dd92591b1ecfd54c" network for pod "coredns-f9fd979d6-9gqqt": networkPlugin cni failed to set up pod "coredns-f9fd979d6-9gqqt_kube-system" network: error getting ClusterInformation: Get https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes"), failed to clean up sandbox container "de129c92e3eb25049f135c10d868da7e7f8dc1cf7f36a6a5dd92591b1ecfd54c" network for pod "coredns-f9fd979d6-9gqqt": networkPlugin cni failed to teardown pod "coredns-f9fd979d6-9gqqt_kube-system" network: error getting ClusterInformation: Get https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")]
  Normal   SandboxChanged          11s (x3 over 26s)  kubelet            Pod sandbox changed, it will be killed and re-created.
```

ちなみにこの時、

```
kubectl get pods --namespace=kube-system
```

を実行した際、`coredns` pods が同様に`ContainerCreating`
でストップしていました。

```

このエラーは、結局
https://www.jianshu.com/p/3a46fff9d21d
これを見て解決した、


```
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
```
Power AutomateからMicrosoft TeamsにBotとしてメッセージを送信する機能でHTML形式が使えなくなったのかも

#背景
**Power AutomateからMicrosoft TeamsにFlow botとしてメッセージを送信する機能**ですが、従来はテキスト内でHTML形式での記述が出来たのですが、正しく動かなくなったのでちょっと調べてみたメモになります(2020/10/05現在)。
ちなみに、以下の機能のことで、「preview」なので機能が変更になっても文句は言えないですね(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/ee10e77e-6a9e-bb41-42ac-850b3d4961d0.png)

#Teamsでの見え方の変化
**HTML形式で送れなくなった例(2020/10/05現在)**
HTMLタグがそのまま表示されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/57fcd083-a119-1a27-e5c9-38d723bb5eb4.png)

**Markdown形式で試してみた例(2020/10/05現在)**
Markdown形式で正しく動きました。試しに、ボールドを使ってみてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/51818cfd-ea76-140a-0595-d12e44683f46.png)

**従来は、HTLM形式でこんな感じに見えていたという例**
HTMLタグが正しく認識されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/a4b38cba-9bb6-3a1e-1cea-fc00faa1b7ea.png)

# 解決策
「Markdown形式を使いましょう！」ということだと思います。

```:例
イベント まで、残り **12** 日です。
```

尚、その他で良く使っていた機能としてメンション機能があるのですが、こちらは従来通りの記述方式でメンション機能が正しく動くようです。

```:例
<at>xxxx.xxxx@xxxx.xxxx.xx</at>
```

ちなみに、Power Automateではこんな感じに記述しています。参考まで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/80b92f22-c1f9-4db4-26f2-c504aea09f04.png)

# その他
おそらく、Message Card形式になった為、その他の機能を整合性を取るような形での変更だと思いますが、どこかにドキュメントがあると助かるのですが。。。という感じです（どなたか見つけたら教えて下さい）。

ちなみに、Power AutomateからMicrosoft TeamsへBotで投稿する方法を以下で綺麗に纏めてくれている方がいるので、とても参考になるのですが、ここの一部が変更になったのかもという認識です。
https://qiita.com/tfunakoshi/items/76029bcc8ac1d4d9bd71
CocoaPods で追加するライブラリの Deployment Target を書き換える

Xcode 12 から Deployment Target が iOS 9 以上になりました。CocoaPods で追加するライブラリにも適用され、iOS 9 未満をサポートするものがあれば、適宜アップデートが必要になります。しかしながら、すべてのライブラリが対応済みではない事態も考えられます。その場合は `Podfile` でライブラリそれぞれの Deployment Target を 9 以上になるように書き換えます。



```ruby:Podfile
def change_deployment_target_for_xcode12(installer)
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 9.0
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
      end
    end
  end
end

target 'app' do        
  # ...
  post_install do |installer|
+   change_deployment_target_for_xcode12(installer)
  end
end
```


`if` により既に対応済みのライブラリならば、影響しないようにしています。
PhytoMine-Pythonで特定の植物種の遺伝子配列データを効率よく取得する方法

[前回](https://qiita.com/MTNakata/items/fefd107f745e8f69e995)、PhytoMine-Pythonで遺伝子情報を取得する方法を紹介しました。
今回、PhytoMine-Pythonで遺伝子の配列を取得する簡単な方法がわかったので備忘録として。

#### 1. PhytoMineの[DataSources](https://phytozome.jgi.doe.gov/phytomine/dataCategories.do)にアクセス

![スクリーンショット 2020-10-05 12.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/775f354f-6446-d587-8e92-8a652053e709.png)

#### 2. 取得したい配列へのリンクにアクセス

今回は[Proteins](https://phytozome.jgi.doe.gov/phytomine/aspect.do?name=Proteins)を選択。

![スクリーンショット 2020-10-05 12.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/141866e3-7ceb-7451-c6cf-3f312c9a9380.png)

#### 3. 配列を取得したい植物種のリンクを選択

今回は[ポプラ（Populus trichocarpa）](https://phytozome.jgi.doe.gov/phytomine/results.do?trail=%7Cquery)を選択。

![スクリーンショット 2020-10-05 12.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/b7d904d6-e025-a325-0a89-e2898a6a7e2a.png)

#### 4. 右上のGenerate Python Codeをクリック

すると、Pythonコードが出てきます。このコードをコピペで使うことができます。python2用になっているので、print文の書き換えが必要ですが、それ以外はそのまま使えるようです。

![スクリーンショット 2020-10-05 12.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/dc1cea0a-3997-c2c5-1566-c7e772d6260e.png)

以下は、指定した植物種のデータをcsv形式で保存する用に改変したものです。

```python
import pandas as pd
from intermine.webservice import Service
service = Service("https://phytozome.jgi.doe.gov/phytomine/service")
query = service.new_query("Protein")
query.add_constraint("organism.shortName", "=", "P. trichocarpa", code = "A")

seq_df = []

for row in query.rows(size=size):
    seq_df.append(row)

seq_df = pd.DataFrame(seq_df,columns=row.keys())
seq_df.to_csv("20201005_Proteins_Top20.csv")
```

こんな感じで保存されます。

![スクリーンショット 2020-10-05 12.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/61942389-9080-174c-8fdf-09a5fb911f9c.png)

今回はお試しなので最初の20遺伝子のみ保存するようにしていますが、原理的には全ての遺伝子を一括で保存できるはずです。

ちなみに、プルダウンで他の言語も選択できます。

![スクリーンショット 2020-10-05 12.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204284/a3da67de-eeb0-4864-da14-df455241b816.png)
空ディレクトリ自動作成スクリプトをPythonで書いてみた

# 理由
東工大の講義は全七回行われる。
そこで講義開始前からファイルを綺麗に整理するために、科目ごとにファイルを作り、その中に第1回から第7回までの空のディレクトリを作成している。これまでは手作業で空ファイルを作っていたのだが、少し面倒くさかったのでこのスクリプトを書いてみた。
凄く単純で書き終わるのに初心者プログラマーの僕でも1時間かからなかったが、将来自分がどれくらい進歩しているかを知ることができるようにしたいので、こちらの記事を投稿することにした。

# 使ったライブラリ
- os

# コード
### main.py

```
"""
第一回から第七回までのフォルダーの作成
"""

import os

import make_folders


QUARTER = input("何QUARTERですか？ -1 2 3 4-")
TOP = fr"C:\Users\Kenta Kubota\OneDrive\ドキュメント\{QUARTER}Q"

def main():
    make_folders.make_new_quarter_folder(TOP)
    make_folders.make_new_lecture_folder(TOP)

if __name__ =="__main__":
    main()
```

### make_folders.py
```

import os

def make_new_quarter_folder(top):
    def make_new_lecture_name_folder():
        lecture_folders = input("授業の科目を下のように全角スペースを空けて書いてください。\n\
            自動車工学　応用数値計算法　etc").split("　")
        if not lecture_folders == []:
            for lecture_folder in lecture_folders:
                new_folder = top + "\\" + lecture_folder
                os.mkdir(new_folder)

    if not os.path.exists(top):
        os.mkdir(top)
        make_new_lecture_name_folder()
    elif os.listdir(top) == []:
        make_new_lecture_name_folder()


def make_new_lecture_folder(top):
    for root, dirs, files in os.walk(top):
        if root[:37] == r"C:\Users\Kenta Kubota\OneDrive\ドキュメント":
            print(root)
            if dirs == [] and root != top:
                print('ディレクトリーない')
                for i in range(1, 8):
                    print(root, "ディレクトリ作ります")
                    new_folder = root + "\\" + f"第{i}回"
                    os.mkdir(new_folder)
```
# 得た知識
- pythonによるファイルの操作
- r(row)とf(format)を同時に文字列の前に置きたいとき、rfでもfrでもどちらでもよい。

# 問題
- r"〇〇\"というように最後に\があるとEOLが出る。

# 作ってみた感想
以前東工大のWi-Fi、および東工大ポータルへの自動ログインスクリプトを書いたことがある。そのときはウェブスクレイピングの知識が得られた。今回はそれとはまったく別のファイル操作の知識、経験が得られた。ただ本を読んで知識を頭に入れるだけの勉強よりもはるかに効率がいいことがこれらの経験からわかる。これからも拙くてもいいからどんどんスクリプトを書いていって、1年後、2年後に周りを驚かせられるようなものを作れるようになりたい。
jsを用いてリアルタイムで入力値を取得する

<h2>はじめに</h2>
<p>　値が入力される度に、ページをリロードせず値を確認したい。そんな時に有効なのが...　<strong>oninput</strong>　！
<br>
<br>
　本記事において、oninputを簡単な実用例を挙げて説明します。
</p>

<h2>oninputについて</h2>
<p>
　時間、金額、数量などを、ページのリロードを行わずに和、積等を求めることができるイベントハンドラです。
<br>
　テキストボックスに値が入力されると同時に発火するため、コピーしてきた数値をペーストした際にも発火します！使い方としては非常に簡単な上、使える場面も多いので覚えておいて損のない機能です。
</p>

<h2>簡単な実用例</h2>
<p>php側で入力欄と戻り値を表示する位置を用意し、入力された数値2つをそのまま表示、和を求める機能を作ります。</p>

```php:sample.php

//入力欄
<input type="number" id="sample1" value="">
<input type="number" id="sample2" value="">

//入力欄1の値表示位置
<h6 id="numOfSample1"></h6>
//入力欄2の値表示位置
<h6 id="numOfSample2"></h6>
//入力欄1,2の和表示位置
<h6 id="numOfSampleSum"></h6>
```

<p>
入力されたタイミングで発火->入力値の取得->和の算出->それぞれの値を表示
<br>
上記の順でJava scriptを組み立ててゆきます。
</p>

```javascript:samplejs.js
window.onload = function(){
    var total = 0;
    //sample2に値が入ったときに発火
    document.getElementById("sample2").oninput = function(){
        //入力値の取得
        var num1 = document.getElementById("sample1").value;
        var num2 = document.getElementById("sample2").value;
        
        //和の算出
        total = parseInt(num1) + parseInt(num2);

        //入力値及び和の表示
        document.getElementById("numOfSample1").innerHTML = num1;
        document.getElementById("numOfSample2").innerHTML = num2;
        document.getElementById("numOfSampleSum").innerHTML = total;
    }
}
```

<p>　入力欄1を入力後、入力欄2を入力する場合のみを想定しています。入力の順番を問わず出力させることも難しくないので、挑戦してみてください。
</p>

<h2>おわりに</h2>
<p>　最後までお読みいただきありがとうございます。
<br>
今回のコードは入力値とその和を表示するだけの非常に単純な構造ですが、oninput基本の形になるので条件分岐等活用すれば様々な場面で使えるかと思います！今後も初心者の私が躓いた内容を中心に記事を書いていく予定なので、今後も何卒よろしくお願いいたします:grin:</p>
自分の投稿のリンク集

## メモ: たまに見返す

* [Windows 10, XP, 7 のチューニング - Qiita](https://qiita.com/tukiyo3/items/06de0acf40504280a2d2)
* [100年有効な自己署名https鍵をOpenSSLコマンドで作る (新Edge, Chrome対応, subjectAltName) - Qiita](https://qiita.com/tukiyo3/items/221ae4ae4ac7b34dd2b8)
* [Windows 10 でssh接続を改善する - Qiita](https://qiita.com/tukiyo3/items/5c0a19b4c1f9e89100d2)
* [不要なログを削除 - Qiita](https://qiita.com/tukiyo3/items/7e80615e4f554ceb50a4)

----

## 頑張ったもの

### docker

* [(docker) XRDP + 日本語入力可能なUbuntuイメージ作りました (Raspberry Pi 3以降にも対応)
](https://qiita.com/tukiyo3/items/e8064461d98e51aa0f5f)
* [Qiitaっぽいpotmumのdockerイメージ作った - Qiita](https://qiita.com/tukiyo3/items/f894b40b4af4dc87c4b5)
* [dockerでKVM (ennweb/kvm) - Qiita](https://qiita.com/tukiyo3/items/3054f1ad2f744b42d33d)

### HA

* [2台でHA構築 (CentOS7) - Qiita](https://qiita.com/tukiyo3/items/24eec798393cac3cdca3)


## 自分の投稿じゃないけどメモ

* [qrcp](https://www.moongift.jp/2020/10/qrcp-wifi%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf%e9%96%93%e3%81%a7%e8%bb%a2%e9%80%81/)
* [Virtual Machines - IE](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)
* [色々な会社のエンジニア向け新人研修資料 - Qiita](//qiita.com/ok2/items/04086f7ee7bde6ab57b9)


### WSL2にdockerインストール

```sh
wsl --install
wsl --set-default-version 2
```

https://www.docker.com/products/docker-desktop

```
うまくいかない場合は
wsl --shutdown
wsl --update
OS再起動
```

explorer から `\\wsl$` でWSL2内のファイルにアクセスできる。
HKEY_CLASS_ROOT や HKEY_CURRENT_USER へ書き込みできない対処例 (.NET Framework)

#はじめに
現在のユーザーで書き込み権限はあるはずのレジストリへ、Microsoft.Win32.Registry 系統のレジストリ操作で書き込み失敗した場合の確認事項です。
（[CreateSubKey](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.win32.registrykey.createsubkey) も同様）

次のようなコードで [System.UnauthorizedAccessException](https://docs.microsoft.com/ja-jp/dotnet/api/system.unauthorizedaccessexception) 例外が発生してしまう場合...

```csharp:sample.cs
Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("*\\shell\\test").SetValue(null, "自作アプリで開く");
```

#解決例
次のとおり [OpenSubKey](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.win32.registrykey.opensubkey) メソッドの第二引数に true を指定します。

```csharp:sample.cs
Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("*\\shell\\test", true).SetValue(null, "自作アプリで開く");
```

[OpenSubKey(String)](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.win32.registrykey.opensubkey?#Microsoft_Win32_RegistryKey_OpenSubKey_System_String_) は「**サブキーを読み取り専用で取得します**」でした。
Lightbend Academyの講座が無償／有償にわかれます

リアクティブシステムを構築するためのツールキット 「[Akka](https://www.lightbend.com)」 の開発元でおなじみの [Lightbend社](https://www.lightbend.com) が提供しているオンライントレーニングサービス [Lightbend Academy](https://academy.lightbend.com) の講座が、無償で提供されるものと有償で提供されるものにわかれるとのメールが来ていました。

```
The response has been so good, in fact, that we have decided to move to a hybrid free/premium model
starting Oct 15, 2020, instead of reverting back to our original subscription-only offering. 
```

そもそも、Lightbend Academy を受講するにはすべて有償だったのが、2020年5月頃から期間限定で無償で受講できるように公開されていました。
無償期間は延長、延長で来ていましたが **すべての講座を無償で受講できるのは 2020/10/14 で終了** になりそうです。

### 今後も無償で受講できる講座

- Getting Started with Lightbend Academy
- Lightbend Scala Language - Professional
- Lightbend Reactive Architecture (1) - Introduction to Reactive
- Lightbend Reactive Architecture (2) - Domain Driven Design
- Lightbend Reactive Architecture (3) - Reactive Microservices
- Lightbend Reactive Architecture (4) - Building Scalable Systems
- Lightbend Reactive Architecture (5) - Distributed Messaging Patterns
- Lightbend Reactive Architecture (6) - CQRS & Event Sourcing
- Monitoring Akka with Lightbend Telemetry
- Lightbend Data Engineering - Cloudflow Principles
- Lightbend Data Engineering - Data Principles
- Lightbend Java Language - Futures
- Lightbend Java Language - Lambdas
- Lightbend Lagom for Java - Hello World

リアクティブアーキテクチャの理論を学べるコース（1-6）が無償になったのはうれしいポイントですね。
これらのコースはクラウド上で安全かつスケーラブルなシステムを構築するためのヒントが盛りだくさんなので本当におすすめです。

### 2020/10/15以降は有償になる講座

- Lightbend Akka for Java - Professional
- Lightbend Akka for Scala - Professional
- Lightbend Akka Cluster - Fundamentals
- Lightbend Akka Cluster - Sharding (Java)
- Lightbend Akka Cluster - Sharding (Scala)
- Lightbend Akka Streams for Java - Professional
- Lightbend Akka Streams for Scala - Professional

すでに修了しているコースについては、2020/10/15以降も修了したステータスは残るとのことですが、講座の内容を見返すことができるのかはわからないですね...

また、受講を開始しているがまだ修了していない講座については、2020/10/15までに完了させないと続きを受講できなくなる、とのこと。


というわけで、有償化されるなかに気になる講座がある方は今すぐ受講を開始しましょう！！
Windows 10 でssh接続を改善する

Windows 10 20.04 (20H1)標準のOpenSSHは以下エラーが出て接続ができないことがある。

> warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)

解決策は、最新の OpenSSH をインストールし利用する。

## Win32-OpenSSH

Download

* https://github.com/PowerShell/Win32-OpenSSH/releases

### インストール

* 実行ファイル
    * `C:\a\OpenSSH-Win64\` に展開
* .ssh/config
    * $HOME/.ssh/config に保管する。

### PowerShell からの利用

```sh:管理者権限で実行
Set-ExecutionPolicy Unrestricted
```

```sh:編集
New-item –type file –force $profile
notepad $Profile
```

```powershell:$profile
function ssh() {
	c:\a\OpenSSH-Win64\ssh.exe $args
}
function scp() {
	c:\a\OpenSSH-Win64\scp.exe $args
}
```

### 動作確認

```
# バージョンが8.1であることを確認。
ssh -V
```

## Git for Windows 付属の OpenSSHを使う場合

```powershell:$profile
function ssh() {
	c:\PROGRA~1\Git\usr\bin\ssh.exe $args
}
function scp() {
	c:\PROGRA~1\Git\usr\bin\scp.exe $args
}
```

`Program Files`が空白が混ざっているため、`PROGRA~1`に書き換えた。
短縮名の確認は`dir c:\ /x`でわかる。

----

## ssh-agent

* ssh鍵のパスワードを記憶してもらえる。

![agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/bc93eb2b-248b-d565-4039-98c290d6ec47.png)

## windows 10 の .ssh/config で使えないもの

```
ControlMaster
ControlPath
ControlPersist
GSSAPIAuthentication
```

## ～.conf を結合して config を作る君

```sh:sshconfig.sh
set -e
sshconfig() {
	cat *.conf > ../config
}
sshwinconfig() {
	sed \
	 -e 's/ProxyCommand ssh /ProxyCommand C:\\a\\OpenSSH-Win64\\ssh.exe /' \
	 -e 's/ControlMaster/# ControlMaster/' \
	 -e 's/ControlPath/# ControlPath/' \
	 -e 's/ControlPersist/# ControlPersist/' \
	 -e 's/GSSAPIAuthentication/# GSSAPIAuthentication/' \
	 ../config > ../config.win
}
sshconfig
sshwinconfig
```
AWS VPC周りの用語まとめ NATゲートウェイ、ネットワークACL...

# はじめに
今回はAWSのVPCに関する用語を解説していきます！

youtubeでは図解で説明しているので、気になる方はそちらも確認ください！

[【YouTube動画】AWS VPC周りの用語編 VPC NAT ネットワークACL](https://youtu.be/m1XknpF5x5s)
[![【YouTube動画】AWS VPC周りの用語編 VPC NAT ネットワークACL](https://img.youtube.com/vi/m1XknpF5x5s/0.jpg)](https://www.youtube.com/watch?v=m1XknpF5x5s)




# VPCとサブネットマスク
VPCとは、Virtual Private Cloudの略で、AWSが提供する仮想ネットワークです。
サブネットはVPCを切り分けた領域です。

[参考]
[Amazon VPC とは?](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html)

# NATゲートウェイとインターネットゲートウェイ
NATゲートウェイはプライベートIPをグローバルIPに変換するのに使用します。そのため、グローバルIP (Elastic IP) を取得しておく必要があります。

対して、インターネットゲートウェイは仮想ネットワークからインターネットに接続するのに使用します。インターネットの出入り口です。

[参考]
[【図解/AWS】インターネットGWとNAT-GWの違い〜各メリット、パブリックサブネットとは〜](https://milestone-of-se.nesuke.com/sv-advanced/aws/internet-nat-gateway)

# ルートテーブル
ルートテーブルは送信元と送信先をみて、どこに通信を流すか制御します。

例えば、サブネットからインターネットに向かうときは、NATゲートウェイに通信を流す。NATゲートウェイからインターネットに向かう時は、インターネットゲートウェイに通信を流すなどです。

# リージョンとAvailability Zone
リージョンは地理的に独立したAWSリソース群のことです。
Availability Zoneは災害などでシステムが落ちるのを防ぐために、リージョン内で独立して置かれている場所のことです。

[参考]
[リージョンとゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)

# セキュリティグループとネットワークACL
セキュリティグループはインスタンス単位のファイアウォールで、ネットワークACLはサブネット単位のファイアウォールです。前者は通信の許可のみ、後者は通信の許可と拒否を設定できます。

他にもセキュリティグループはリクエストパケットを記憶するが、ネットワークACLは記憶しないという違いがあります。そのためネットワークACLを使用するときは、ネットワーク外からVPC内へ通信がきた時はEphemaralポートなどでポートを明示的に空けておく必要があります。

[参考]
[なぜネットワークACLでなくセキュリティグループで細かいトラフィック制御を行なうのか](https://dev.classmethod.jp/articles/why-i-prefer-sg-to-nacl/)

# まとめ
今回AWS VPC周りの用語について解説しました。
実際に使う時に、軽く頭に入れておくと理解しやすいと思います！！

感想や質問などあれば、ぜひコメントください！
[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
メールサーバのvar領域不足

（過去対応メモ）
以下のようなエラーが出る。

```
Out: 452 4.3.1 Insufficient system storage
```

メールサーバ側の空き容量が足りなくてメール受信に失敗している？
SMTPエラーメッセージを見てみると、以下の2種類がある。
[1]：
452 4.3.1 Insufficient system storage
[2]：
warning: not enough free space in mail queue: 157245440 bytes < 1.5*message size limit

/var の領域が逼迫していて main.cf で設定している message_size_limit の1.5倍の値よりも
/varの空き容量が少なくなっていて、メールの配送に失敗しているように見える。

```
# grep limit /etc/postfix/main.cf
message_size_limit = 104857600
```
157245440(この時点の/varの空き) よりも 104857600 * 1.5(message_size_limit) の方が大きい。
とりあえず /var を拡張したら復旧した。
TinyTinyRSSをCent OS 8にインストールしてみた

#目次
-経緯
-準備
-インストール
-使ってみる

#経緯
初投稿です。Qiitaには大変お世話になっているので、少しでも恩返しなど。
ニーズがあるのかどうかはさておき・・・

自宅サーバをCent OS 8にしたのでTinyTinyRSSをインストールしようとしたら、いつの間にか公式がdocker推奨になっていました。
今までdockerは使ってなかったんだけど、試しにインストールしてみたら以前より超絶 楽になっていたので、自分用メモとご紹介。
#準備
公式ドキュメントは https://tt-rss.org/wiki/InstallationNotes
今回は Static: uses pre-built images provided via Docker Hub って方でインストールします。
#インストール
リポジトリの追加

```
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

docker-ceのインストール

```
dnf install docker-ce --allowerasing
```

gitがまだの人は入れましょう。

```
dnf install git
```

ttrss-docker を ~/ttrss-dockerにクローン。ここから先の作業はこのディレクトリで行います。

```
git clone https://git.tt-rss.org/fox/ttrss-docker-compose.git ttrss-docker && cd ttrss-docker
```

自分用の設定ファイルを作ります。

```
cp .env-dist .env
```

.envを編集。以下の2点だけでok。

```
#SELF_URL_PATH=http://localhost:8280/tt-rss
SELF_URL_PATH=http://サーバ名orIPアドレス:8280/tt-rss

#HTTP_PORT=127.0.0.1:8280
HTTP_PORT=8280
```

/usr/local/bin/docker-composeをいじります。実行権は手作業でつけるようです。

```
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

checkout

```
git checkout static-dockerhub
```

docker起動

```
systemctl start docker
docker-compose pull && docker-compose up
```

ここまでで設定は完了。

#使ってみる

先ほど.envに設定したアドレスにアクセスしてみて問題なければ完了。
http://サーバ名orIPアドレス:8280/tt-rss
デフォルトIDとパスワードはadmin/password。起動したらちゃんと変更しましょう。

docker-compose upだとフォアグラウンドでログが流れ続けるのでCntl-Cで止めて、バックグラウンドで起動しましょう。

```
docker-compose start
```

ついでにdockerの自動起動の設定も忘れないように。

```
systemctl enable docker
```

なお、一旦起動してしまえばdocker-compose.yml内のrestart指定が
> restart: unless-stopped

なので、rebootしても再起動するようです。
但し、明示的にstopした場合は起動が必要です。

以上です。
Grafana vs. AppDynamics

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c9aff9af-8467-72cb-1ed6-1a684883f7a5.png)

#Grafanaとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/f0307d79-11f8-a525-58a3-862822219cf5.png)

Grafanaは、1つの統合ダッシュボードですべてのメトリックを表示および分析できる視覚化ツールです。 Grafanaは、GraphiteやPrometheusなどの任意のソースからメトリックを取得し、そのデータを表示して、ダッシュボードで直接データに注釈を付けて理解できるようにします。 Grafanaダッシュボードは、ヒストグラムやヒートマップから世界地図まで、さまざまな方法で情報を視覚化できるように設計されています。 Grafanaには、Slack、PagerDutyなどを介して通信できるアラート機能もあります。 ダッシュボードは、分析を容易にする何百ものプラグインで共有、ダウンロード、または拡張できます。 Grafanaはオープンソースであり、サービス化されたGrafanaは[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20AppDynamics)を通じて利用できます。

ご不明な点がございましたら、[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20AppDynamics)して直接お問い合わせください。


#AppDynamicsとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/639764ce-7651-e530-9629-aca43e4c9c77.png)

AppDynamicsは、異常のリアルタイム検出を提供するように設計されたアプリケーションパフォーマンス監視ツールです。 クラウドベースまたはサーバーベースの両方のアプリに適用でき、アプリのパフォーマンスがビジネスメトリクスにどのように影響するかを確認するためにも使用できます。 Business iQと呼ばれるAppDynamicの機能を使用すると、アプリのパフォーマンス、ユーザーエクスペリエンス、ビジネスの成果を相互に関連付けることができます。 AppDynamicのエンドユーザー監視ツールを使用すると、チームはフロントエンドとバックエンドのパフォーマンス監視間の接続を確認できます。 インフラストラクチャの監視により、インフラストラクチャがアプリのパフォーマンスにどのように影響するかを可視化できます。 AppDynamicは、3段階の価格設定を備えた独自のサービスです。 最初の段階はアプリのパフォーマンスの監視のみであり、2番目の段階はフルスタックの可視性であり、3番目の段階はBusinessiQをもたらします。

#いつGrafanaを使用すべきか？

次の場合はGrafanaを使用してください…

- 美しく、シンプルで、注釈付きのグラフが必要
- メトリックまたはログの複数のソースがあり、それらを1か所で確認する必要がある
- ダッシュボードを組織全体で共有する必要がある
- 特定のチームのニーズに基づいて情報を再編成する必要がある
- 使いやすいクエリビルダーが必要
- イベントのアラートが必要

#AppDynamicsをいつ使用するべきか？

次の場合はAppDynamicsを使用してください…

- 監視する必要のあるアプリがあります。
- アプリを最適化する方法を探しています。
- アプリの異常がどこにあるか知りたい。
- どの異常が実際にユーザーエクスペリエンスに影響を与えるかを特定したい。
- 異常がどれだけのコストをかけているかを追跡できるようにしたい。

#価格比較

- Grafanaはオープンソースであり、無料です。
- マネージされたGraphiteとPrometheusを含む、MetricFireによるビジネス対応のGrafana as a Serviceは、月額99米ドルからです。
- AppDynamicsの開始価格は年間3300米ドルです。

#重要なポイント

- Grafanaは、さまざまなコレクター、エージェント、ストレージエンジンと統合できます。
- Grafanaはオープンソースであり、無料です。
- AppDynamicsは、アプリサービスによって定義されるビジネスを対象としています。

Grafana as a Serviceをよりよく理解し、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20AppDynamics)が監視環境にどのように適合するかを確認してください。  Grafanaで何ができるかについて質問や無料トライアルへのお問い合わせなどがある場合は、是非、[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20AppDynamics)してください。
VPSを借りる [PostgreSQL] #4

#PostgreSQL
[※How to Install PostgreSQL on CentOS 8](https://linuxize.com/post/how-to-install-postgresql-on-centos-8/)

```sh
DOMAIN=yourdomain

PORT=5432
DATABASE=yourdb
USERNAME=yourname
PASSWORD=yourpass

sudo dnf install @postgresql postgresql-contrib

sudo postgresql-setup --initdb --unit postgresql
sudo systemctl enable --now postgresql

sudo -u postgres -i psql -c "ALTER ROLE postgres WITH PASSWORD '$PASSWORD';"

sudo -u postgres -i psql -c "CREATE ROLE $USERNAME WITH LOGIN PASSWORD '$PASSWORD';"
sudo -u postgres -i psql -c "CREATE DATABASE $DATABASE;"
sudo -u postgres -i psql -c "GRANT ALL PRIVILEGES ON DATABASE $DATABASE TO $USERNAME;"

sudo -u postgres tee /var/lib/pgsql/.pgpass << EOF
*:$PORT:*:postgres:$PASSWORD
*:$PORT:$DATABASE:$USERNAME:$PASSWORD
EOF

sudo chmod 600 /var/lib/pgsql/.pgpass

sudo cp -p /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.origin
sudo sed -i -e "s/^local\s.*all\s.*all\s.*peer/local   all             all                                     md5/g" /var/lib/pgsql/data/pg_hba.conf
sudo diff -u /var/lib/pgsql/data/pg_hba.conf.origin /var/lib/pgsql/data/pg_hba.conf

sudo systemctl restart postgresql

sudo -u postgres -i psql -U $USERNAME -d $DATABASE -c "CREATE TABLE staff (id CHAR(4) NOT NULL, name TEXT NOT NULL, age INTEGER, PRIMARY KEY (id));"
sudo -u postgres -i psql -U $USERNAME -d $DATABASE -c "INSERT INTO staff VALUES (1, 'Yamada Taro', 26);"
sudo -u postgres -i psql -U $USERNAME -d $DATABASE -c "INSERT INTO staff VALUES (2, 'Suzuki Hanako', 21);"
sudo -u postgres -i psql -U $USERNAME -d $DATABASE -c "SELECT * FROM staff;"

sudo dnf install php-pgsql

sudo tee /var/www/$DOMAIN/public_html/dbtest.php << EOF
<?php
  \$db = pg_connect("dbname=$DATABASE user=$USERNAME password=$PASSWORD");
  if(!\$db){
    echo "Error: Unable to open database.<br />\n";
    exit;
  } else {
    echo "Opened database successfully.<br />\n";
  }

  \$result = pg_query(\$db, "SELECT * FROM staff"); 
  if(!\$result) {
    echo "Error: Unable to select table.<br />\n";
    exit;
  }

  while (\$row = pg_fetch_row(\$result)) {
    echo "\$row[0], \$row[1], \$row[2]<br />\n";
  }

  pg_close(\$db);
?>
EOF

curl https://$DOMAIN/dbtest.php
```

[VPSを借りる [VPS、SSH、Nginx] #1](https://qiita.com/u4xi/items/850b98f56d058b552ab0)
[VPSを借りる [HTTPS] #2](https://qiita.com/u4xi/items/f373f21cb7e1b670eaff)
[VPSを借りる [PHP] #3](https://qiita.com/u4xi/items/064f3d9506aab31a0b29)
Visualforceのエラー「Attribute "rendered" was already specified for element "apex:variable".」

Visualforceの実装で以下エラーが出ました。

`Attribute "rendered" was already specified for element "apex:variable".`


結果的には

```
<apex:variable 
	var="productName" 
	value="商品名" 
	rendered="{!Product.Name == null" 
/>
```

このrenderedの箇所

```
"{!Product.Name == null" 
```

ここに閉じ括弧が漏れていたのが原因でした。
Visualforceのエラーは行数が出ないから些細なところほど突き止めるのが一苦労ですね。
計算化学.comで広告が被って見づらいのでChrome拡張で見やすくした。

#概要

[計算化学.com](https://computational-chemistry.com/top/)は、計算化学のまとめサイトとしていろいろな情報が載っていて重宝する。しかし、レイアウトがよくないのか、GoogleAdsenseの広告が記事にかぶってしまい非常に見づらい。
そのため、Javascriptでレイアウトを修正して記事を見やすくした。
![bbc77518c48279b77acb2e927afb3fc7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673297/778d4c8d-1228-9522-889b-7521a587e1f4.gif)


##動作環境
- GoogleChrome

##やりかた（自動化されない）
このコードをコピペしてブックマークする。

```js
javascript:var elem = document.getElementById('secondary');elem.setAttribute('style','width: 400px; margin-right: 10px;');
```
Command + D -> その他　-> urlに上記コードをコピペ、名前は自分でわかりやすいものを指定。
（今回は名前をccmodiとした。computational chemistry modifyの意。）

![2020-10-05 11.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673297/5887b16d-d8ce-7195-6853-480688d24be2.png)

### つかいかた
計算化学.comのページにアクセスして、見づらいと思ったら、ブックマークバーにあるこのリンクを押す。
すると、広告が被らなくなる。
（~~本当はJavascriptを自動で実行できるようにしたかったが、やり方がわからなかったので保留しました。わかる方は教えていただけるとありがたいです。~~ →自動化しました！）

##やりかた（自動化済み）
Chrome拡張にすることで自動化しました。

```json:manifest.json
{
    "name": "Computer Chemistry Modify",
    "version": "1.0.0",
    "manifest_version": 2,
    "description": "計算化学ドットコムのレイアウトを直すクローム拡張です",
    "content_scripts": [{
      "matches": ["https://computational-chemistry.com/*"],
      "js": [
        "ccmodi.js"
      ]
    }]
  }
```

```js:ccmodi.js
var elem = document.getElementById('secondary');elem.setAttribute('style','width: 400px; margin-right: 10px;');
```

フォルダにこの2つのファイルを入れて、[拡張機能](chrome://extensions/)->「パッケージ化されていない拡張機能を読み込む」から、ファイルが入ったフォルダを選択。（拡張機能をいれるときは画面右上のディベロッパーモードをオンにする）

![スクリーンショット 2020-10-13 10.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673297/b624036f-9479-e703-9b8b-2239d938bc97.png)


これで、計算化学.comのドメインにあるページを読み込んだときに自動でレイアウトが直される。（めでたしめでたし）

##謝辞
自動化については、@ramenhaoishii さんのコメントを参考にさせていただきました。他にコメントをくださった方もありがとうございます！
また、クローム拡張の自作については[Chrome拡張の作り方 (超概要)](https://qiita.com/RyBB/items/32b2a7b879f21b3edefc)を参考にさせていただきました。
セグメンテーション・マスクの境界を滑らかにする

背景との境界のカクカクを滑らかにします。iOSで使えるフィルターで実現できます。

機械学習のセマンティックセグメンテーションは、出力サイズが512,512程度なので、拡大してマスク画像として用いると、オブジェクトのエッジ境界がカクカクしてしまいます。
![２２２２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/610f66c8-a050-51e1-9cd2-e254e783a36f.png)

中央値フィルターという平滑化フィルターを用いることで、境界を滑らかにできます。
![２２２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/60c0c4d2-5a93-1217-eabc-144c4d6858c2.png)

*中央値フィルターとは？：ピクセル値を、その周りのピクセル値の中央値に変えるフィルターだそうです。*

iOSではMPSImageMedianフィルターが使えます。

#使い方
このフィルターを、拡大後のマスク画像に適用すると、エッジがスムースになります。
引数の「kernelDiameter」は、中央値をとる対象の周囲のピクセルの直径で３以上の奇数を指定する必要があります。

```swift

func edgeSmoothing(cgImage image:CGImage) -> CGImage {
    let commandBuffer = self.commandQueue!.makeCommandBuffer()!
    let median = MPSImageMedian(device: self.device as! MTLDevice, kernelDiameter: 15)
    // kernelDiameter：中央値をとる対象の周囲のピクセルの直径

    let textureLoader = MTKTextureLoader(device: self.device as! MTLDevice)
    let options: [MTKTextureLoader.Option : Any]? = nil
    let srcTex = try! textureLoader.newTexture(cgImage: image, options: options)

    let desc = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: srcTex.pixelFormat,
                                                        width: srcTex.width,
                                                        height: srcTex.height,
                                                        mipmapped: false)
    desc.pixelFormat = .rgba8Unorm
    desc.usage = [.shaderRead, .shaderWrite]

    let medTex = self.device!.makeTexture(descriptor: desc)!

    median.encode(commandBuffer: commandBuffer, sourceTexture: srcTex, destinationTexture: medTex)

    #if os(macOS)
    let blitCommandEncoder = commandBuffer.makeBlitCommandEncoder()!
    blitCommandEncoder.synchronize(resource: medTex)
    blitCommandEncoder.endEncoding()
    #endif

    commandBuffer.commit()
    commandBuffer.waitUntilCompleted()

    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGImageAlphaInfo.noneSkipLast.rawValue
    let bytesPerRow = lapTex.width * 4
    let bitmapContext = CGContext(data: nil,
                                  width: medTex.width,
                                  height: medTex.height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: bytesPerRow,
                                  space: colorSpace,
                                  bitmapInfo: bitmapInfo)!
    medTex.getBytes(bitmapContext.data!,
                    bytesPerRow: bytesPerRow,
                    from: MTLRegionMake2D(0, 0, medTex.width, medTex.height),
                    mipmapLevel: 0)
    return bitmapContext.makeImage()
}
```

🐣

****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Hacktoberfestの炎上＆感動：１０月でなんでくそプルリクエストそんなに多いの？

# Hacktoberfestはたのしいぞい！

みなさん、お疲れ様です！

Hacktoberfestが知っていますか？
[Hacktoberfestとは、DigitalOceanという会社のFOSSを活躍しようのイベントです。](https://hacktoberfest.digitalocean.com/)

アイデアは簡単：HacktoberfestにGithubアカウントを連携したら、だれかのプロジェクトに４つの改善プルリクエストを作ったら、無料Tシャツとステッカーをもらいます。　めっちゃかっこいいイベントでしょ？ナーディーオタク系無料👕をもらいたいでしょ？

今年は、炎上になりました。

![photo_2020-10-03_20-49-52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/8f9c17bb-63d2-f0b9-e0d8-9d1dd53cd727.jpeg)

## 炎上：コメントでも👕をもらう？！　

原本はこの英語で書いた記事です：

https://joel.net/how-one-guy-ruined-hacktoberfest2020-drama

まあ、英語は怖い方が多いと思いますので、こちらにまとめます。

なにがあったのは、一つの人気インドのユーチューバーは「やあ、プルリクエストはめっちゃ簡単じゃ！　ドキュメントでも四つを修正いただいたら、このかっこいい👕をもらうぞ！！」というビデオを作っていました。
内容はありがたいですね：Hacktoberfestに登録、Githubに登録、プロジェクトを探し、プルリクエストを出すやり方を教えました。

問題だったのは、プルリクエストでした。　変更の内奥だったのは、だれかがのスタータープロジェクトを取って、ただに「and An Amazing Project」（めっちゃかっこいいプロジェクト）を付けました。

まあ、結果のは、今月は謎のプロジェクトに「improve docs」系のプルリクエストが出しました。

![m5hnyO6ES.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/f3979eec-64ef-1ac5-9e9d-40531098cc00.png)

![photo_2020-10-04_15-37-43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/47e825a5-2e28-3a5f-ccbb-9013e2839bc2.jpeg)

[ちょっと大変ですねｗ](https://twitter.com/shitoberfest)

## 俺の感動：他の人に手伝うは楽しい！！

マジで、「Hacktoberfest」は楽しいだと思います。
仕事しながら学んだこと、他の人のプロジェクトでもう見た問題が出たを気付いて、「あ、こっちが知ってるぞ、これをやったら簡単に解決ができるぞ」と言ったら、俺のエゴのかっこよくさがMAXになります。
プルリクエストを出して、「ああ、ありがとうございました！！」とマージしたら、心が温かめる。

今週末、俺のHacktoberfestで投稿したこと：
・Pythonのチャットボットの起動をしてみて、実装とDocsを違ってPRに注意しました。
・NeosVRをエストニア語化にしました
・シカゴでツールを借りるサービスのホームページにアドミン画面はアドミンだけが使えるようにしました
・同じサイトでサインインしたら、サインインボタンを隠しました。

正直言うと、俺はその👕を狙いましたから、このPRを作りました。
やっぱり👕より、もらった経験、できた部分をリリースされて、感謝の言葉を聞いて心を温かめる感は一番うれしかった。

みなさん、ぜひ、このHacktoberfestにも参加してみてください！！

![photo_2020-10-04_23-31-58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/220687ab-d33a-caa7-f677-5732c7a524ae.jpeg)

![photo_2020-10-04_16-21-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/499108d8-ef65-2a6f-131b-5af06ce24adb.jpeg)


**やっぱり、開発とは他の人の問題の解決だね！**
【rails c】KeyError: Factory not registered: "○○"エラー→bin/spring stopコマンドで解決

#エラーが起きた状況

- Rails6.0.0を使用。
- モデルのテストコードを行うため、FactoryBotというダミーデータ作成のためのgemを利用。
- 必要なgemのインストール、フォルダやファイルの作成後、ちゃんとダミーデータが作られるか確認しようと、ターミナルコマンドにおいて「rails c(console)」を実行したところ、エラー発生。
- 念のため、FactoryBotを確認するも、記述誤りは無し。
- 考えられる原因として、昨日VSコードのバージョンアップあり。


# エラー内容
```terminal
# コンソールを立ち上げるコマンドを実行
f.〇〇@〇〇noMacBook-Air chat-app % rails c　
Running via Spring preloader in process 63751
Loading development environment (Rails 6.0.3.3)

# 今回確認したかったユーザーモデルが作成されるか実行
[1] pry(main)> FactoryBot.create(:user)
KeyError: Factory not registered: "user"
from /Users/〇〇/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch'
Caused by KeyError: key not found: "user"
from /Users/〇〇/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch'

# 他のルームモデルもエラーになるか実行
[２] pry(main)> FactoryBot.create(:room)
KeyError: Factory not registered: "room"
from /Users/〇〇/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch'
Caused by KeyError: key not found: "room"
from /Users/〇〇/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.3/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch'
```

#解決方法
```terminal
# 一回、抜ける
[3] pry(main)> exit

# コンソールを実行すると動いている「スプリング」を止める
f.〇〇@〇〇noMacBook-Air chat-app % bin/spring stop
Spring stopped.

# 止まっているかステータスを確認する
f.〇〇@〇〇noMacBook-Air chat-app % bin/spring status
Spring is not running.

# もう一度、コンソールを立ち上げる
f.〇〇@〇〇noMacBook-Air chat-app % rails c
Running via Spring preloader in process 64116
Loading development environment (Rails 6.0.3.3)

# 再度、確認したかったモデルを入力　→　ダミーができた！！！
[1] pry(main)> FactoryBot.create(:user)
   (0.6ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
   (0.2ms)  BEGIN
  User Exists? (3.9ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'edmond@yahoo.com' LIMIT 1
  User Create (0.5ms)  INSERT INTO `users` (`name`, `email`, `encrypted_password`, `created_at`, `updated_at`) VALUES ('木村', 'edmond@yahoo.com', '$2a$12$vk2T9O8uxroggw9vLTSqVOd6J5CVlkOI1018qCLc7jv9rAnyfgYc.', '2020-10-05 01:38:08.395976', '2020-10-05 01:38:08.395976')
   (2.0ms)  COMMIT
=> #<User id: 4, name: "木村", email: "edmond@yahoo.com", created_at: "2020-10-05 01:38:08", updated_at: "2020-10-05 01:38:08">
```

#まとめ
- Railsに標準で導入されている「spring」というGemがバックグラウンドで作動していて、稀にロードエラーを起こす.
- 解決方法としては、一度作動を停止する。springの再起動は、railsコマンドと同じタイミングで行われる。
lsyncdが落ちる

（過去対応メモ）
lsyncdが以下のようなエラーを吐いて落ちることがある。

```
Thu May 18 23:11:32 2017 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches
```

lsyncdがディレクトリを監視するのに使っているinotifyというLinuxの機能があり、
そいつが監視できるディレクトリ数の上限を超えてしまったので監視できず落ちたらしい。

現在の設定値の確認

```
# cat /proc/sys/fs/inotify/max_user_watches
（恐らくデフォルトは 8192）
```

設定値を変更

```
# echo 163840 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
```

再起動時に反映されるように設定

```
# vi /etc/sysctl.conf
------------------------------------
fs.inotify.max_user_watches = 163840
------------------------------------
```
JavaFXでtextFieldのフォーカスアウトイベントを実装する

## やりたいこと
- TextField コンポーネントからフォーカスアウトしたときのイベントを実装したい。
- フォーカスアウト時に文字を自動で置き換えたい。

## やったこと
`inintialize()` の中で `focusedProperty()` に対して `addListener()` でイベントを追加することで、フォーカスアウト時のイベントを追加することができました。

```java
textField1.focusedProperty().addListener(new ChangeListener<Boolean>() {
    @Override 
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue,
        Boolean newPropertyValue) {
            if (!newPropertyValue) {
                textField1.setText(textField1.getText().replaceAll("髙", "高"));
            }
        }
    }
);
```

## バージョン情報
```
jdk 1.8.0_144
```

## 参考
- http://blog.livedoor.jp/tkarasuma-ext1/archives/2414063.html
- http://nobotta.dazoo.ne.jp/blog/?p=1569
JavaScriptで様々なモザイク処理

#はじめに
四角形以外のモザイクってどんな感じになるんだろうって思ったので作ってみました。
#イメージ
三角形によるモザイク
![triangle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/0aa1288a-3c91-9244-e0af-26d075a4351e.png)
六角形によるモザイク
![hexagon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/1fcd3833-29e9-c98d-c801-cb990da78777.png)
八角形と四角形によるモザイク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/5feea919-e3d3-b208-9b2c-eb5f36425451.png)
円によるモザイク(隙間も平均化)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/32c1e2f5-4b06-24e5-044f-08a0120b85d3.png)
四角形によるモザイク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/6aed6480-2d60-d256-7a08-be0f8af287ae.png)

#プログラム
codepenに書きました。
処理自体は割といい加減なので、適当に直して使ってください。
<p class="codepen" data-height="299" data-theme-id="light" data-default-tab="js,result" data-user="olj611" data-slug-hash="zYqgXqJ" style="height: 299px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Polygon Mosaic">
  <span>See the Pen <a href="https://codepen.io/olj611/pen/zYqgXqJ">
  Polygon Mosaic</a> by Shinichiro Maki (<a href="https://codepen.io/olj611">@olj611</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
G検定/E資格を取得してから今までを振り返る（CDLE LT会#1 発表）

- 私がG検定、E資格を取得してからのキャリアをどう歩んだのかを振り返り、その経緯をお伝えしています。
- G検定、E資格を取得してからのキャリアをどう考えたらいいのか、悩んでいる方の参考になれば幸いです。

##Youtube
CDLE LT会#1の動画は[こちら](https://www.youtube.com/watch?v=LQOINkrhvXc)からご視聴ください。

##投影資料
SlideShareにて発表資料を公開しています。[こちら](https://www.slideshare.net/ssuser0d76f8/200824-cdle-lt1-ge)をご覧ください。

##お知らせ
- 他の発表者の資料は[こちら](https://jdla.connpass.com/event/185123/presentation/)にあります
- CDLE関連のイベントは、[JDLAのconnpass](https://jdla.connpass.com/)をご覧ください
Laravelアプリで画像をS3に保存するように変更したらハマった話

#Laravelアプリで画像をS3に保存するように変更したらハマった話

##環境
Heroku
AWS(S3で画像を保存)
PHP 7.3
Laravel 8.8.0
MySQL 5.6.47
HTML
CSS
Blade

##背景
元々、Laravel8で作ったアプリのデプロイは、全ての機能をHerokuでデプロイしていました。しかし、投稿画像が一定時間を超えると画像がリンク切れを起こします。これはHerokuの仕様です。
この問題を解決すべく、画像の保存場所をAWSのS3に変更しました。環境変数の設定などを行い（これは、「Heroku Laravel S3」などでググれば出てきます）、いざ画像を投稿しようとしたら以下のようなエラーが出ました。

####①これで画像を投稿しようとすると……
![V-Lifeイベント作成ページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644353/7ab48e33-a6f9-2fe4-3b01-52cc65d26953.png)
####②こうなる
![スクリーンショット 2020-10-04 6.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644353/c1dce933-0e69-49eb-94a3-11cb5a98723a.png)
長い……。ちなみに画像なしでの投稿は問題なく行えます。画像を投稿するときだけこうなります。

####③とりあえず日本語にしてみる
![スクリーンショット 2020-10-04 6.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644353/0992f07c-c7e4-5ccf-e09f-1d9a7b84f57a.png)
日本語にしても焼け石に水。地道に解読します。
注目すべきは4行目の**403Forbidden**という記述。

##403Forbiddenとは
Forbiddenとは「**禁止する**」という意味の英語。
403Forbiddenは、「*何らかの理由でサイトが閲覧できない、もしくは禁止されている状態ですよ*」というエラーです。
つまり、パーミッション（アクセス権限）の設定で弾かれている可能性が高いです。

##仮説
エラー文の3行目には「AWS HTTPエラー」と書かれています。
つまり疑うべきはAWSのパーミッションです。（今回はS3）

##S3(AWS)のパーミッション
S3のパーミッションは、バケットの「アクセス権限」というタブで設定できます。
![スクリーンショット 2020-10-05 10.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644353/6f66ac2a-9f55-f55d-a32d-e08eedea54cd.png)
画像のように上の二つのチェックを外します。
全部外してもいいですが、**アクセス権限を緩めるということはそれだけセキュリティが脆くなる**ということなので、最低限に留めておくことに越したことはないでしょう。
したがって下の二つはブロックしたままにします。

ちなみに、下二つの選択肢にあるバケットポリシーとは「*Access Policy Language (APL) を使用してストレージへのアクセス可否を定義するもの*」です。どんなアクセスを許可し、どんなアクセスを禁止するかをコードで定義することができます。
アクセスポイントポリシーはそこから派生したもので、文字通りどこからのアクセスなら許可を通すかなどを決められるものです。（例えば、VPC内からのみアクセスを許可するなど）
いずれも今回は使っていない（特別な設定をしていない限りは使っていないはず）ので、ブロックしたままにします。

上二つの選択肢の違いは「*新しい*」と「*任意の*」の部分ですが、任意のだけを許可した場合はこれまで投稿した画像にアクセスはできますが、**新規投稿ができなくなります。**
したがって今回は上の二つを外します。

##結果
無事に投稿ができました。
![スクリーンショット 2020-10-05 10.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644353/4e2327e0-5186-34f6-4915-f1d907ecb9fa.png)

##ご挨拶
最後までご覧いただきありがとうございます。少しでも参考にして頂けたら嬉しいです。私自身プログラミング歴が約半年と短いため、至らない点も多いと思います。ご指摘などがございましたら、コメントにてご教示頂けたら幸いです。
Vue.js + TypeScript でコンポーネントをインポートしようとしたら Cannot find module と言われてしまった

Vue.js + TypeScript でページを作っていたら以下のようなエラーに遭遇したので、そのときの対処メモ。
改めて見てみるとめっちゃ恥ずかしい凡ミスなのですが、またやりそうなのでここにメモっておくことにします。

## なにがおこっていたのか？

Vue.js のプロジェクトであるコンポーネントを読み込んだところ以下のようなエラーになりました。

```
Cannot find module '@/components/Modules/SomeModule' or its corresponding type declarations.
```

機械翻訳してみると、コンポーネントが見つからないか、対応する型宣言が必要みたいなエラーのようです。

## 解決方法

で、この内容で検索するとよく出てくるのが、↓のような内容の`shims-vue.d.ts` を作れというもの。

```ts:shims-vue.d.ts
declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}
```

ところがすでにこれは作成済みだし、エラーになっているのもある程度出来上がってきたサイトの1ページ、1箇所のみ。
別のページでも読み込んでるはずなのにそちらではエラーになってないということから、タイポか何かか？とも思ったのですが、
パスの指定は IDE のパス補完機能をつかいつついれたのでその可能性も低そう。。

で、とりあえず正しく読み込めている方のファイルと並べて import 文や Components の中身などを見比べてみたところ、違いがあったのは１箇所。

こっちが正しい方で

```ts
import SomeModule from '@/components/Modules/SomeModule.vue'
```

こっちがだめだったほう

```ts
import SomeModule from '@/components/Modules/SomeModule'
```

どうやら、import する際に**拡張子「.vue」まで含めないとエラーになってしまう**ようでした。

意外とIDEの自動補完とかに頼り切ってると逆に見落としがちかも。。
「もっとプログラム脳を鍛える数学パズル」_Q02 (code:Ruby) -> Rust

[「もっとプログラマ脳を鍛える数学パズル」](https://www.shoeisha.co.jp/book/detail/9784798153612)をRustで書き直すのは、ボケ防止にちょうど良いかもしれない、と思った。

# Q02山手線でスタンプラリー

本書出版時(2018年)は29駅。2020年になって、駅の数が増えて30駅になっている。

## Ruby

```ruby:q02.rb
N = 29

a, b = 1, 17

n = (a - b).abs

puts (1 << (n - 1)) + (1 << (N - n - 1)) - 1
```

## Rust

```rust:main.rs
fn main() {
    println!("{}", q02(29, 1, 17));
}

pub fn q02(num_of_stations: i64, entraining_point: i64, exit_station: i64) -> i64 {
    let passing_stations = (entraining_point - exit_station).abs();

    return (1 << (passing_stations - 1)) + (1 << (num_of_stations - passing_stations - 1)) - 1;
}

```

何の苦労もなく、そのままビットシフトできる。

試しに、29駅では36863のところ、30駅にしてみたら(`q02(30,1,17)`)答えは40959と出た。