OmniAICreator/Qiita-1.07M huggingface dataset:
応用カリキュラム 03 読みやすいコードを書く

##良いコードの要素

-  命名規則
-  コードのレイアウト
-  コメント

命名規則に関しては今までノータッチだったな・・・
他の開発者の期待に合わせる。。。ふむ。
英語の知識が必要。これは深くてまとめられんのでリンク。
[モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](https://qiita.com/jnchito/items/459d58ba652bf4763820?utm_content=bufferf91b0&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)

##英語の勉強
- set
- add
- render 変換、編集結果
- import
- fetch データベースから情報を取得
- modify(edit) 部分修正
- apply 適用する
- remove データを取り除く。アクセス権のない場所へ移動。元に戻せない処理のみに限らない。
- is

##コードのレイアウト

- 整列 スペースを使って「=」などの位置を揃えて可読性を上げる。
- 一貫性 似たようなフォーマットは同じフォーマットでの表示をする
- ブロック化 同じ系統の変数などをグループ化する

レイアウトは何とな〜くやってく感じでいっかな〜

##リファクタリング
処理を変えずに、冗長なコードを削除したり、改善したりすること。

- 読み手の理解がしやすくなる
- 修正がしやすくなる

要素が非常に多い。なるべくコードを短くする。

#参考

モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう - Qiita
[https://qiita.com/jnchito/items/459d58ba652bf4763820?utm_content=bufferf91b0&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer](https://qiita.com/jnchito/items/459d58ba652bf4763820?utm_content=bufferf91b0&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
【初学者向け】config/deploy.rb に環境変数を仕込む方法

Capistrano + unicorn を用いた自動デプロイで好きな環境変数を
デプロイ先のサーバーにも、githubにも記載なしで送り込む方法です。
basic認証のアカウント名とパスワード設定など、環境変数を使う際にご活用ください。

```config/deploy.rb
set :default_env, {
  （デプロイ先での環境変数名）: ENV["デプロイ元の端末の環境変数名"],
 例：
 BASIC_AUTH_PASSWORD: ENV["BASIC_AUTH_PASSWORD"]
}
```

上記の記載をすることで、bundle exec cap production deployをすると
デプロイ端末の環境変数の値がデプロイ先の環境変数の値になります。

#### 同じ環境変数をデプロイ先で設定していた場合、上記の記述の値が優先されますのでご注意ください。
【Xcode】何も書いていないのにUITestが失敗する

この間、Xcodeでユニットテストを試そうと思ったら何も書いていないはずのUITestでエラーが起きて必ず「TestFailed」になる現象が起きた。

サードパーティのライブラリを導入しているプロジェクト限定で発生した。
あくまで今回の自分の場合ですが、対処方法をメモしておきます。

## :bomb: 原因
~~Podfileの「UITest」部分に問題があった。~~

~~***UITestでは画面描画が行われるので、画面描画に関わるライブラリはインストールされている必要がある***らしい。何もテストを書いていないとしても。~~

~~自分の場合は***「PopupDialog」***というポップアップを表示するライブラリだった。~~

~~逆にSwiftLintやR.Swiftなど画面描画と関係ないものはPodfileのUITest部分に書く必要はないみたい。~~ 

### :bomb: 追記
指摘を頂き気付きましたが上記は自分の勘違いだったようで、正しくはUITestでは別アプリから本体アプリを起動させているので、本体とは別にライブラリのインストールが要求される事は無いはずのようです。  
    
実際の原因は、UITestのtargetに記述してある「inherit! :search_paths」が不要でした。

こちらのStackOverflowの記事に参考になりそうな事が書いてありました。
[What does inherit! :search_paths do?](https://stackoverflow.com/questions/37060065/what-does-inherit-search-paths-do)  

inherit! のオプション 「:complete（デフォルト）、:none、:search_paths」がそれぞれどういうものか理解しておく必要がありそうです。

## :man_tone3: 対処方法
Before

```
target 'omikuji' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for omikuji
  pod 'PopupDialog', '~> 1.1'
  pod 'SwiftLint'
  pod 'R.swift'

  target 'omikujiTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'omikujiUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

After

```
target 'omikuji' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for omikuji
  pod 'PopupDialog', '~> 1.1'
  pod 'SwiftLint'
  pod 'R.swift'

  target 'omikujiTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'omikujiUITests' do
    # inherit! :search_paths // 不要
    # Pods for testing
  end

end
```
Metal: Error creating pipeline stateエラーについて

# はじめに
Unityの勉強をしていた時にMacOSを「Catalina」に上げた途端、iPhone実機での確認ができなくなりました。

# エラー内容
以下のエラーが発生して、画面が真っ青な状態で動かない状況がおきました。

````
Metal: Error creating pipeline state (Sprites/Default): Compiler encountered an internal error
````

# 現象時のバージョン
Unity 2019.2.12f1
Mac 10.15.1（19B88）
XCode 11.2.1 (11B500)
iOS 13.2

なお、Unityで確認できる2系のバージョンは全て確認しましたがどれもダメでした。
2.1、2.5、2.11...

MacOSも「10.15.0」でもダメでした。
※XCode 11.2.0はiPhone申請ができないバグバージョンなので注意してください。

# 解決策
Unityのバージョンをあげる。
正規版バージョンでは解決できませんでした。

2019.3.0b11

こちらのベータ版バージョンで確認できました。

# 蛇足
ビルド設定の`Code Signing Identify`が`iOS Developer`になっていなくて実機転送ができないという初歩的な罠にも引っかかりました・・・。
※XCodeでプロジェクトを作った時は初期値なのですが、Unityでプロジェクトを作るとこの部分が違うんですね・・・。（恥

# 参考
参考にしたのはこちらです。

stack overflow
[Unity application doesn't run on iOS due to Shader warning and Compiler failed with XPC_ERROR_CONNECTION_INTERRUPTED](https://stackoverflow.com/questions/58534265/unity-application-doesnt-run-on-ios-due-to-shader-warning-and-compiler-failed-w)
無料で使える為替取得APIメモ

無料でCORS対応してるのが意外と無かったので色々試してみた。

## ❌OANDA
- APIキー必要（デモ口座開設=無料）
- Qiitaで為替APIで検索したらよく出てくるやつ
- なんかcurl一発みたいなサンプルがググって１０秒で出てこなくて面倒になってきてやめた

## ❌http://api.aoikujira.com/kawase/json/usd
- 登録不要
- CORS非対応

## ❌https://www.gaitameonline.com/rateaj/getrate
- 登録不要
- CORS非対応

## ❌http://data.fixer.io/api/latest?access_key=XXX&symbols=USD,JPY
- APIキー必要（無料プランあり）
- CORS対応OK
- 無料プランだと https 非対応！

## ~~✅~~→❌https://api.exchangeratesapi.io/latest
- ~~登録不要~~ →2020年08月時点では誰でも使えたが2021年4月現在ではいつの間にかAPIキーが必要
- CORS対応OK
- ~~https対応OK~~ → 無料プランでは https 利用不可
- API提供元の組織は[欧州中央銀行(ECB)](https://www.ecb.europa.eu/)。正確性/安定性/継続性など色んな意味で理想的。今後も安心して使えそう

~~こいつが欲しかった！~~ → オワタ(ﾉД`)ｼｸｼｸ

```js
await fetch("https://api.exchangeratesapi.io/latest", {mode:"cors"}).then(r=>r.json())
```

2021年4月現在は以下のレスポンスが返ってきており登録が必要な模様

```json
{
  "success": false,
  "error": {
    "code": 101,
    "type": "missing_access_key",
    "info": "You have not supplied an API Access Key. [Required format: access_key=YOUR_ACCESS_KEY]"
  }
}
```

一応試しに登録してみたがFreeプランだと以下が返ってくる。駄目だコレ…。

```json
{
  "error": {
    "code": "https_access_restricted",
    "message": "Access Restricted - Your current Subscription Plan does not support HTTPS Encryption."
  }
}
```
RHEL CPU/メモリ確認方法

#Linux RedHat CPU/メモリを確認するには？
##catコマンドの利用
Linux RedHat7.7のCPU/メモリを確認する為には、catコマンドを利用します。
実行コマンドは下記の通りです。
設定値を確認するには基本的にcatコマンドを利用します。

```
# cat /proc/cpuinfo
# cat /proc/meminfo
```

/procの中には、カーネルに関するよく使用される情報がディレクトリ配下として入っています。

# 引用
Redhat Enterprise Linux 4 リファレンスガイド
>http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-proc-directories.html

RedHat7.6の時と基本的にコマンドの変更はありませんでした。
最後までご覧いただきありがとうございました！
【Kotlin/Android】switch(トグル)を非活性にする

 - switchをクリックしたら、３秒間の間クリックできないように実装しました。  
 - isClickableが正しいです。  
 - isEnableは３秒間の間、意図していないのに色が濃いグレーになってしまいます。
 ※isClickableのグレーは、自分で指定した温度です。
 <img width="589" alt=" 2019-11-19 16.11.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275576/2d4429de-9225-a164-6eaa-def293a82385.png">

```MainFragment.kt
val switch: Switch = view.findViewById(R.id.main_switch)
// switchの最小の長さを設定しています。
switch.switchMinWidth = PhoneInfo.getPhoneWidth(this.context) / 6
switch.isChecked = true
switch.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
// ONのとき
switch.isClickable = false
Handler().postDelayed({ switch.isClickable = true }, Constants.CLICKABLE_TIME)
} else {
// ONのとき
}
```
```main_fragment.xml
<!-- themeでswitchの色を設定しています -->
<Switch
android:id="@+id/main_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:theme="@style/CustomSwitch"></Switch>
```
```styles.xml
<resources>
<style name="CustomSwitch" parent="Theme.AppCompat.Light">
<!--ボタンON時のボタンの通り道・ボタンとタッチフィードバックカラー-->
<item name="colorControlActivated">@color/switch_on_color</item>
<!--ボタンOFF時のボタンの通り道-->
<item name="android:colorForeground">@color/switch_off_color</item>
<!-- OFFボタンを押したときのタッチフィードバックカラー -->
<item name="colorControlHighlight">@color/switch_off_color</item>
</style>
</resources>
```
Reactでstorybook起動時にJavaScript heap out of memoryが出たけど解決した話

# 起きたこと
storybook-cliでstorybook起動すると、以下のエラーが出た。

```
<--- Last few GCs --->

[88509:0x10264e000]  3090375 ms: Mark-sweep 1400.2 (1456.1) -> 1392.7 (1438.6) MB, 2595.6 / 0.0 ms  (+ 0.1 ms in 211 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 2619 ms) (average mu = 0.110, current mu = 0.009) alloc[88509:0x10264e000]  3091708 ms: Mark-sweep 1399.9 (1438.6) -> 1398.6 (1441.6) MB, 1066.4 / 0.0 ms  (+ 237.0 ms in 115 steps since start of marking, biggest step 8.9 ms, walltime since start of marking 1331 ms) (average mu = 0.080, current mu = 0.023) all

<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x2c4a8b5be3d]
Security context: 0x3b6807a1e6e9 <JSObject>
    1: getMembers(aka getMembers) [0x3b68e8af6ee1] [/Users/xxx/src/github.com/xxx/xxxx/node_modules/react-docgen/dist/utils/getMembers.js:~43] [pc=0x2c4ab62e217](this=0x3b680b0826f1 <undefined>,/* anonymous */=0x3b68a3874f79 <NodePath map = 0x3b68dca0b9f1>,/* anonymous */=0x3b680b0828c9 <true>)
    2: getPropType(aka getPropType) [0x3b68e8...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003c597 node::Abort() [/Users/xxx/.nvm/versions/node/v10.15.3/bin/node]
 2: 0x10003c7a1 node::OnFatalError(char const*, char const*) 
...

```

メモリが足りないのかと思い、 `--max-old-space-size` オプションで8GBのメモリを使うよう設定しても、8GB使い切って上記のエラーが出た。

# 解決方法

```
PropTypes.arrayOf()
```

のように `PropTypes.arrayOf`を引数なしで使っている箇所があった。引数指定すれば上記エラーが出なくなった

```
// 修正後
PropTypes.arrayOf(PropTypes.any)
```

# 関係ありそうなパッケージのバージョン

```
"@storybook/cli": "^5.2.6",
"prop-types": "^15.7.2",
"eslint-plugin-react": "^7.12.4",
"react": "^16.8.6",
```

# 詳しい原因について
未調査
[ Android ] プルダウンの実装方法

今回はAndroidにおけるプルダウンの表示の仕方を記す。

##プルダウンとは
複数の候補から選択する際、よく見かける。以下がその例である。
 ![スクリーンショット (153).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/7029d629-5b1a-4ec1-f5a3-00f34e519258.png)

##実装
実装方法は簡単である。まずxmlファイルにSpinnerを追加する。もちろん幅や高さは好きにしてよい。

~~~xml
<Spinner
    android:id="@+id/spinner"
    android:layout_width="149dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="100dp"
    android:layout_marginTop="10dp" />
~~~

次にjavaファイルにプログラムを書く。
こちらではArrayAdapterクラスを用いて、Adapterを生成する。

~~~java
<Spinner
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
~~~

次にAdapterにプルダウンの選択肢を追加する。

~~~java
adapter.add("A型");
adapter.add("B型");
adapter.add("AB型");
adapter.add("O型");

~~~

そしてSpinnerにAdapterをセットしてプルダウンの完成である。

~~~java
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
~~~

##サンプル
プルダウンで選択した後、ボタン押下により、選択した内容が表示されるプログラムを実装してみた。

activity_main.xml

~~~xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="149dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="100dp"
        android:layout_marginTop="10dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="100dp"
        android:layout_marginTop="10dp"
        android:text="選択した血液型表示" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

~~~

MainActivity.java

~~~java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.textView);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adapter.add("A型");
        adapter.add("B型");
        adapter.add("AB型");
        adapter.add("O型");
        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setAdapter(adapter);

        final Button imageProductButton = (Button) findViewById(R.id.button);
        imageProductButton.setOnClickListener((View view2) -> {
            String selected = (String) spinner.getSelectedItem();
            textView.setText(selected);
        });
    }
}

~~~

##結果
成功である。
![スクリーンショット (155).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/451ec7bc-c3f8-61ad-d220-dbebff6941d8.png)
AIソフトウェア工学の資料まとめ

## **この文書の説明**

[AI応用システムの安全性・信頼性を確保する新世代ソフトウェア工学の確立(科学技術振興機構 研究開発戦略センター)](https://www.jst.go.jp/crds/pdf/2018/SP/CRDS-FY2018-SP-03.pdf)の概要です

## **本文**

### AIソフトウェア工学とは

- 従来の演繹型システムとは異なる帰納型システムの安全性・信頼性を確保できる方法論・技術体系である

### AIソフトウェア工学に対する二つのアプローチ

- １：実践から得られる知見の体系化⇒産業界を中心に自ずと進んでいく
- ２：理論・原理に関わる学術研究のアプローチ⇒本書のターゲット

### 重要な技術的課題（詳細はドキュメント参照）

- １：機械学習自体の品質保証
- ２：全体システムとしての安全性確保
- ３：ブラックボックス問題への対策
- ４：問題を効率よく解く工学的な枠組み

### システム開発のパラダイム転換

![img01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/2e2ca818-d272-0adb-a01c-fa37088cd760.png)

### 従来の考え方が通用しなくなる例（産業課題）

- V字モデル（ウォーターフォール開発）
- システムの機能（仕様）が、抽象度の高いレベル（上位）から具体的なレベル（下位）へと階層的に分解できることを想定している
- しかし、機械学習のCACE(Change Anything Change Everything)という性質によりその想定が成り立たない

![img02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/08b6ddc9-c5b9-a340-0d83-396932c416a6.png)

### システム安全性が脅かされる例（社会課題）

- Adversarial Examples 攻撃
  - 人間には判別できないがAIには影響を与えるようなデータを使って誤認識を意図的に起こさせる行為（adversarial attack などで検索すると出ます）
- Microsoft Tay 公開停止
  - 悪意のある者が学習に関与することで不適切なシステムが出来上がる例
- 訓練データに潜む差別・偏見
  - 訓練データを作る段階で作業者の差別・偏見が含まれてしまうこと

### AI適用産業における品質保証の重要性

- 主に「ミスの深刻性」「AI寄与度」「環境統制困難性」の三要素が重要な観点

![img03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/96faf339-1684-606d-0410-2acf612a1e25.png)

### 業界・研究コミュニティの動向

![img04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/118033d7-c82b-2c3b-2ad3-512830b036d1.png)

### 日本のAI戦略・政策との関連
  
- 日本が掲げる「Society5.0」を成し遂げる為に二つの政策がある
  - 「人間中心のAI社会原則検討会議」：AIの社会的・経済的・倫理的・法的な課題を含むAIへの要請を検討
  - 「人工知能技術戦略会議」：AI技術そのものの研究開発を推進
- AI応用システムをどのように作れば良いかというソフトウェア工学的な観点の開発方法論・技術体系の研究開発を推進する為の政策が必要である

![img05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/ec550902-9aa3-c1de-7d39-88e797116135.png)

### AIソフトウェア工学の進歩による科学技術上の効果

- 新しい学問分野の創出
- 既存のソフトウェア工学を拡張する

![img06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181972/98da3e6b-de07-bcc4-413d-6e2595e62d4d.png)

### 具体的な研究開発課題

- AIソフトウェア工学の体系化
- データ集合に着目した機械学習の品質（精度・公平性等）の理論やテスト手法
- 従来型と機械学習型の混在システムの全体としての安全性評価法やリカバリー処理設計法
- システム動作の解釈性向上（事故発生時の原因理解や設計時・利用時の動作予測の容易化）
- 「機械学習（ボトムアップ）と記号推論（トップダウン）を統合した効率的な問題解法

※第４章は省略
TypeScriptのEnumでvaluesみたいなリストを取得する

TypeScriptのEnumは便利で好きだけど、valuesみたいなenumのリストを取得できない...
でも、`Object.entries()`を使えばいいらしい。
毎回検索するので、自分用の備忘用。


```typescript
enum FOO_TYPE {
  TYPE_FOO = "foo",
  TYPE_BAR = "bar"
}

const fooTypes: FOO_TYPE[] = Object.entries(FOO_TYPE).map(([_, value]) => value);

console.log(fooTypes);
// => [ 'foo', 'bar' ]
```

便利(*´ω｀*)

# 参考にしたサイト様
- [TypeScriptのEnumのループはObject.entries()で実現可能 - Qiita](https://qiita.com/wildmouse/items/96ec2a5892e88ea4aec6)

## こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで♪
FlaskのrequestでBooleanをGETする

# 環境
- python 3.7.0
- Flask 1.0.2
 
# まずSOURCE
bool型の`is_hoge`をrequestで受けとって返すだけのAPI

```python:hoge.py
from flask import Flask, request
app = Flask(__name__)

@app.route("/", methods=['GET'])
def hello():
    is_hoge = request.args.get('is_hoge', type=bool)
    return f'{ is_hoge }'

if __name__ == "__main__":
    app.run()
```

# 期待値
- `true`を送ったら`True`
- `false`を送ったら`False`
- `0`を送ったら`False`

# 実行結果
- `true`を送った場合
<img width="888" alt="スクリーンショット 2019-11-19 15.21.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/2c3306fa-ad4a-4826-afc7-330d278c779c.png">
- `false`を送った場合
<img width="894" alt="スクリーンショット 2019-11-19 15.21.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/100332a7-e9a7-e22a-bcdb-d82a874ac4fb.png">
- 0を送った場合
<img width="895" alt="スクリーンショット 2019-11-19 15.21.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/95a493fc-f9ab-9423-4477-f0adcdace333.png">

なんと言う事でしょう。全ての結果として`True`が返って来てしまいました。
新米ペーペーの考察としては全て文字列として捉えられてしまい`True`が返って来たんだと思います。

# なんとかBooleanとして使えるようにしたい
pythonには[`strtobool()`](https://docs.python.org/ja/3.7/distutils/apiref.html)と言う便利な関数があるそうで、これを使ってやって行きます。

```python:converter.py
from distutils.util import strtobool

def convert_to_bool(target_object, default_val):
    if target_object is None:
        return default_val
    try:
        return strtobool(target_object)
    except:
        return default_val
```
引数で持って来た値が`None`の時や例外が発生した場合には`default_val`を返すようにしました。

```python:hoge.py
    is_hoge = converter.convert_to_bool(request.args.get('is_hoge'), False)
```

# 再度実行
- `true`を送った場合
<img width="898" alt="スクリーンショット 2019-11-19 15.50.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/03ff43d8-2df0-fe93-175c-d8ed7cbcb8ef.png">

- `false`を送った場合
<img width="894" alt="スクリーンショット 2019-11-19 15.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/607c30d4-1e1d-1bfe-441a-9195c48a9653.png">

- `0`を送った場合
<img width="893" alt="スクリーンショット 2019-11-19 15.48.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535421/b8b2a64a-9ea3-e691-3b7a-0d9e25965fd7.png">

0と1が返って来るようになりました。数値の真偽値の判別であれば0はFalse, 0以外はTrueとなるので問題無いと思います！

# あとがき
初めての投稿ですので、至らぬ点があればご教示して頂ければ幸いです。
Nuxt.jsでBasic認証が設定されているサイトでもPWAの検証をする

## Basic認証でのPWAの問題

manifest.jsonが401なります。
console.log見ると出てきます。

## 対策

manifest.jsonをBasic認証から除外する。
がもっと簡単な方法がNuxt PWA公式ドキュメントにもっと簡単な方法が。

```nuxt.config.js
{
  manifest: {
    crossorigin: 'use-credentials'
  }
}
```

[Nuxt PWA公式ドキュメント](https://pwa.nuxtjs.org/modules/workbox.html#hooking-on-service-worker-registration-life-cycle)に明記してあります。
RxDataSourcesを利用してeditActionsForRowAt機能を実現する(後)



この[前の記事](https://qiita.com/ENIX/items/557a025a89d9c21f0224)「RxDataSourcesを利用してeditActionsForRowAt機能を実現する」
の追記として、今度は、checkEditの条件判断を実現する案について、述べたいと思う。

色々、インタネット上の記事を調べてみたが、やっぱり、tableViewのCell毎に条件判断に使われる変数を定義して、判断に使うのが、実現しやすいことではないかと思って実装して見た。

###### 1. まず、EventCellのファイルでviewModelを変数を定義する

```swift:EventCell.swift

class EventCell: UITableViewCell {

private var viewModel = EventCellViewModel() {
        didSet {
            self.updateUI(viewModel: viewModel) // viewModel更新があるとUI更新を行う
        }
    }
//... ...
   override func awakeFromNib() {
        super.awakeFromNib()
    }
//... ...
}
```
###### 2. EventCellのviewModel設定、取得メソットを実装する

```swift:EventCell.swift
extension EventCell {
    public func configure(viewModel: EventCellViewModel) {
        self.viewModel = viewModel
    }

    public func getViewModel() -> EventCellViewModel {
        return viewModel
    }
}
```
###### 3. ViewControllerのtableview DelegateメソットeditActionsForRowAt()に以下の様実装する

```swift:EventListViewController.swift
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
       guard let cell = tableView.cellForRow(at: indexPath) as? EventCell else {
            return []
        }
      let viewModel = cell.getViewModel()
        guard viewModel.event.canEditable else {
            return [] // can't edit
        }
       //... ...
       // ここからはActionを実装登録して置く

}

```

以上、簡単な工夫になりますが、参考にいただけると、大変ありがたいです〜〜

>iOS、Androidアプリの制作なら、https://origon.co.jp にお任せください
>信頼且つ満足できる製品を納品いたします
【機械学習】clf は classifier (分類器)の略

機械学習やってるとよく clf って名前の変数名出てきますよね。

なんの略か気になったので、調べてみたところ、classifier (分類器) の略みたいです。

> The clf (for classifier) estimator instance is ~~~
（[scikit-learn.org](https://scikit-learn.org/stable/tutorial/basic/tutorial.html)より引用）
強化学習１４　PendulumをChainerRLでやった。

強化学習１３まで終了していることを前提にします。
強化学習１３のjupyter　notebookでPendulum-v0を入れると、、、。ダメです。
ChainerRL/GitHubのサンプルを見ます。
https://github.com/chainer/chainerrl/tree/master/examples/gym

train_dqn_gym.pyそのもののほうがいい結果でした。
書き直し（11月26日）
強化学習２０に飛んでください。
AmazonConnectにて、着信順にオペレータに繋ぐ際にハマったポイント

# 概要
AmazonConnectの問い合わせフローを作成していた際、着信順に電話を取ることができないという問題が発生したので問題点と解決策を記載します。
また、解決策を行ったことで変更される点についても記載します。

# やりたかったこと
・AmazonConnectのある電話番号にかけてきた人に対して、オペレータに空きがある場合と無い場合で違う音声アナウンスを流したい。
　　空きがある⇒「オペレータにおつなぎいたします」 + コール音　  ・・・①
　　空きがない⇒(「少々お待ちください」 + 保留音)をループさせる　・・・②

・電話をかけてきた順にオペレータに繋ぎたい

# 発生した問題
問題Ⅰ. 
オペレータを1人のみAvailableにしてA,B,Cの順番で連続してかけたところ
　A⇒①のアナウンス
　B⇒**①のアナウンス**
　C⇒②のアナウンス
が流れた。

・**オペレータ1名のため、①のアナウンスは2名に流れてほしくない**

問題Ⅱ.
オペレータに繋がれた順番がA⇒C⇒Bとなった。
・**着信順がA→B→Cなのでその通りにオペレータに繋ぎたい**

# 問題発生時のフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/c305b616-c2d7-7eb4-9ca8-0114407b5593.png)

・一番左の赤枠にてキューを確認し、オペレータの空き情報を確認している。
・真ん中の赤枠にて、「オペレータにおつなぎいたします」の音声を流している。
・「customer queue」ではコール音をオペレータが電話応答を取るまで流し続けている。
・「customer queue busy」では「少々お待ちください」 + 保留音を流している。

※顧客キューフローはキューに転送した後、オペレータがコールを取るまで流れるフローです。
※顧客キューフロー内で再生する音声はループ処理されます。

# 原因
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/4f004c94-231d-269f-24fe-402f1acb5f96.png)

問題Ⅰ. 
この問い合わせフロー内でプロンプト再生を行っている場合、音声が終了するまで処理が先に進みません。
つまり、キューに登録されません。

**Aさんが電話をかけ、「オペレータにおつなぎいたします」を聞いている間にBさんが電話をかけた場合、Aさんはまだキューに登録されていないため、Bさんに①のアナウンスが流れることになりました。**

問題Ⅱ.
次にAさんがキューに登録された後、Cさんが電話をかけた場合、オペレータに空きがないため、Cさんに②のアナウンスが流れます。
**しかし、②のアナウンスは「顧客キューフロー」で再生しているため、Cさんは音声を聞く「前に」キューに登録されました。**
その後、音声を聞き終わったBさんがキューに登録されたため、オペレータへの着信順がA⇒C⇒Bとなりました。


**「オペレータにおつなぎいたします」**は一度以上流す必要がないため、問合せフローに記載していましたが、その結果上記のような問題につながった結果となりました。

# 解決方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/b274071f-2dfe-da2d-4a48-8f8d7e9111fe.png)

・「customer queue」では**「オペレータにおつなぎいたします」**＋コール音を流す。
・「customer queue busy」では「少々お待ちください」 + 保留音を流している。


①のアナウンスも②のアナウンスも顧客キューフローで再生することで、下記のことから問題を解決できます。
・空き状態を確認してから、キューに転送されるまでの時間も短縮でき、問題Ⅰを解決できる。
・①と②の間でキューに入れられるまでにかかる時間差をなくすことができ、問題Ⅱを解決できる。

# 上記方法で変更になる点
顧客キューフローにて流す音声については、必ずループして流すという処理になります。
そのため、オペレータが受電するまで、「オペレータにおつなぎいたします」＋コール音が**ループ**して流れることになります。
「オペレータにおつなぎいたします」を一度しか流したくない場合には注意が必要です。
コール音をとても長い音声ファイルにするなどの対応を行う必要があります。

# まとめ
キューの状態を確認して分岐させる場合には、途中で音声再生は行わないようにするのが吉です。
音声再生がキューに入った後でもよいなら、「顧客キューフロー」を活用しましょう。
またその際には、音声がループ再生されることを意識した設定が必要となります。
#VsCode のファイル内置換 - Replace - で Enter / Command + Enter のショートカットが効かないのだが？

上の欄 Findではなくて、 下の欄 Replaceに カーソルがある必要があるようだ。

![image](https://user-images.githubusercontent.com/13635059/69099430-10baa780-0a9e-11ea-87fa-bfabd4ab0b5a.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2741








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[漏洞预警]CVE-2019-12409/Apache Solr由于错误配置JMX RMI导致远程代码执行

### 漏洞描述
近日安全研究人员`JanHøydahl`披露了`Apache Solr`的8.1.1和8.2.0发行版中的默认配置文件`solr.in.sh`,在其配置文件中`ENABLE_REMOTE_JMX_OPTS`字段默认配置不安全.如果使用受影响版本中的默认配置,那么将启用JMX监视服务并将对公网监听一个18983的RMI端口,且无需进行任何身份验证,配合JMX RMI将会导致远程代码执行.
### CVE编号
CVE- 2019-12409
### 漏洞威胁等级
高危
### 影响范围
8.1.1和8.2.0
### 简单分析
我们可以使用自带的`Jconsole`访问JMX服务

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d2201190-08eb-e630-8ffa-95bdc22b6712.png)

而JMX RMI远程代码成因主要是由于远程客户端可以创建`javax.management.loading.MLet MBean`,并使用它通过任意URL创建新的MBean,滥用MBean即可造成远程代码执行.

攻击过程一般如下

- 1.启动托管MLet和含有恶意MBean的JAR文件的Web服务器
- 2.使用JMX在目标服务器上创建`MBeanjavax.management.loading.MLet`的实例
- 3.调用MBean实例的`getMBeansFromURL`方法，将Web服务器URL作为参数进行传递。JMX服务将连接到http服务器并解析MLet文件
- 4.JMX服务下载并归档MLet文件中引用的JAR文件，使恶意MBean可通过JMX获取
- 5.攻击者最终调用来自恶意MBean的方法

这个攻击思路来源于`n0tr00t`参加阿里的一次CTF大赛.我们除了可以使用msf攻击JMX RMI,还可以使用mjet

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/1e3f88c7-1cae-ac9a-0288-cb0577b36b08.png)
### 修复建议
修改`bin/solr.in.sh`配置文件中`ENABLE_REMOTE_JMX_OPTS`为`false`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a2b4314d-9ced-a613-9e63-431f60b057bb.png)
### 时间轴
[0] 2019/11/18 NVD发布该漏洞
[1] 2019/11/19 亚信安全网络攻防实验室研究并复现该漏洞发布漏洞预警
### Reference
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12409
https://nosec.org/home/detail/2544.html
https://www.n0tr00t.com/2015/04/17/JMX-RMI-Exploit-Demo.html
https://github.com/mogwailabs/mjet
オークファンのご紹介

# はじめに
オークファンで開発部長をしている @gakkie と言います。
今年も、去年に引き続き、AdventCalendarに参加してみました。

当社は、グループ会社含めて4社あり、複数のサービスを40人くらいで見ています。
サービスごとにいろんな技術スタックがあり、オールドスタイルのPHPもあればKotlinでサーバを書いてるチームもあります。

少しずつ紹介していければと思いますので、どうぞよろしくお願いいたします。

# オークファングループの紹介

決算資料より、オークファングループは何をする会社なのか、と主要サービスを紹介します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80151/2d24e8be-ae8e-9123-a8c6-e860623ad7f8.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80151/b602bb68-75e5-7b39-2831-3b6a9c8b6c7d.png)


# 利用技術

先に記載したとおり、複数の会社、サービスがあり、利用している環境や技術も多岐にわたります。
主なものを紹介すると、

## 開発環境
* InteliJ、PhpStorm
* Vagrant、Docker
* Mac、Windows

## 言語
* PHP、kotlin、Java、Python、Ruby、Perl、Go

## DB
* MySQL、PostgreSQL、SQL Server、DB2
* Redis、memcached
* ElasticSearch、Solr

## インフラ
* AWS、Azure、DC、IDCF、さくら

## その他
* backlog
* AdobeXD
* GoogleDrive
* Kibela
* PlantUML
* SharePoint
* trello
* Redmine

他にもいろいろあります。

# もし気になることがあれば
今回のAdventCalendarで気になることがあれば、いつでもご連絡ください。
また、当社に興味を持っていただける方がいらっしゃれば、お気軽にお話だけでも聞きに来てください！
GradleでTestタスク実施と同時にJacocoでレポートを出力する

# 前書き

Gradle で Test タスクを実施したら、自動的に Jacoco でカバレッジレポートを出力してくれたらいいなー
を満たすための build.gradle の設定になります。

個人的に Java & SpringBoot で開発することが多いため、build.gradle にはその設定が含まれていますが、Test タスク → Jacoco レポート出力を満たすためだけであればそのあたりの設定は不要です。
なお、ここで上げている build.gradle は [Spring Initializr](https://start.spring.io/) で生成したプロジェクトの雛形を元に編集しました。


# 環境

* Gradle
* Java 8
* Jacoco
* JUnit (spring-boot-starter-testに含まれるものを使用)

なお、動作確認は以下の環境下で行いました。

* Javaの文字コード：UTF-8
* OS: Windows 10, Mac 10.15.1 (Catalina) 

# build.gradle

```groovy
plugins {
	id 'org.springframework.boot' version '2.2.1.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
	id 'jacoco'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	maven {
		url "https://plugins.gradle.org/m2/"
	}
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

// コンパイル時に使用する文字コードをUTF-8で固定する
tasks.withType(AbstractCompile).each { it.options.encoding = 'UTF-8' }
tasks.withType(Test) {
	systemProperty "file.encoding", "UTF-8"
}

// testタスクの後にjacocoTestReportタスクを実施する
test.finalizedBy jacocoTestReport

// jacocoのレポートから除外するクラスファイル。ここに除外したいクラスを列挙する
def coverageExcludeFiles = [
		// 内部クラスやLambda匿名クラスを排除
		'**/*$*.class',
		'**/*$lambda$*.class',
]

// jacocoTestReportタスク。前述の「jacocoのレポートから除外するクラスファイル」の設定を組み込んだタスクにしています。
jacocoTestReport {
	reports {
		html.enabled = true
	}
	afterEvaluate {
		classDirectories = files(classDirectories.files.collect {
			fileTree(
					dir: it,
					exclude: coverageExcludeFiles)
		})
	}
}
```

# 補足

`gradle test` or `./gradlew test`
を実施するとjacocoでカバレッジレポートを出力してくれます。
なお、上記の設定を行うと、
`gradle build` or `./gradlew build`
を行ってもTestタスクの直後にJacocoでカバレッジレポートが出力されます。
使い勝手は善し悪しがあると思いますが、CIで毎回カバレッジレポートを出したい！といったときにちょっとだけ便利になるかもしれません。

当然ではありますが、`jacocoTestReport`タスクを個別に実施してもレポートは出力されますが、カバレッジレポートの出力元となるTestタスクを実施しないと意味はないです。

また、build.gralde 内で文字コードをUTF-8で固定していますが、この記述がないとWindows環境ではカバレッジレポートに出力されるソースコードの日本語文字列が文字化けしました。ソースコードがUTF-8で記載かつWindows環境の場合はご参考にしてください。
Fail2banの概要


ウェブサーバを立ち上げ、サイト開設するじゃないですか。
数日後、アクセスログを見るじゃないですか。
下のようなありさまじゃないですか。

* サイトへのアクセスログ : ゼロ
* 不正アクセスを試みるログ : たくさん

そう、僕が開設したのは、サイトではなかったのです。

ただの攻撃対象だったのです。。

お・わ・り （ゝω・）v

🐟 ... 🐟 ... 🐟 ...

このままでは悲しいので (というか、このまま放置すると、致命的な被害を被るおそれもありますので)、Fail2banを導入することにします。

# 要旨

この記事では、Fail2banというツールの概要を書きます。

具体的な設定の例は、検索したらたくさん出てきましたので、そちらを参照するとよいかと思います。

# ツール概要

アクセス遮断したいIPアドレスを登録してくれるデーモンです。

ログ監視により、遮断IPアドレスが判断されるので、「どのログ」の「どんなアクセス」が「何回あったか」などを設定する必要があります。

# バージョン

* OS : CentOS 7.6
* Fail2ban : 0.9.7

# インストール

https://github.com/fail2ban/fail2ban/tree/master#installation

CentOSなら `yum` からでも可です。

# 設定

## /etc/fail2ban/jail.d/

Banの個別設定です。

* どのログファイルを監視するか
* filter.dで設定した文字列を、何秒に何回検知したらBanするか
* Banする期間は何秒か

などを設定します。

## /etc/fail2ban/filter.d/

検知したいログの文字列を設定します。
どのfilterを使うかはjailで設定します。

# 運用

すべき設定をしたら、 `systemctl` コマンドでデーモンを起動します。

```bash
$ fail2ban-client list [jailで定義した文字列]
```

で出力されるBanリスト (BanされたIPリスト) を見ると、導入してよかったな、と思えます。

# おわりに

この記事では、Fail2banというツールの概要を書きました。

それではごきげんよう。
アンサンブル学習とは

## バイアス
バイアスは
実際値とモデルとの誤差の平均

```math
(E_{ \widehat{f} }[\widehat{f}(x)-f(x)])^{2}
```

のこと。
値が小さいほど予測値と真の値の誤差が全体的に小さいことがわかる。

モデルが単純であるあまりに学習が上手くいかない度合いを表している。

## バリアンス
対してバリアンスは
モデルがどれだけ散らばっているかを示す度合い = モデルの結果側の分散

```math
(E_{ \widehat{f} }[\widehat{f}(x)]-E_{ \widehat{f}} [\widehat{f}(x)])^{2}]
```
のことで、値が小さいほど予測値の散らばりが小さいということになります。

訓練データに依存し過ぎることで新しいデータへの予測が悪化する度合いを表す。

## 理想は
バイアスが小さい方が全体的な差が小さく、バリアンスが小さければ、散らばりが小さいことがわかるので、双方を小さくしていきたいが、機械学習のアルゴリズムにおいては、
バイアスが大きい => 未学習
バリアンスが大きい => 過学習

を表していて、トレードオフの関係にある。


## アンサンブル学習の仕組み
複数のモデルでの評価を多数決とって最終的な評価をする。

## バギング
バギングとは「Bootstrap Aggregating」の略で一般的にモデルの予測結果のバリアンスを低くする特徴がある。

この手法では、データセット側を複数に分割して複数回学習を行う。


## ブースティング
ブースティングは一般的にモデルの予測精度に対してバイアスを下げる特徴

この、手法では、学習器を複数個用いてつなぎ合わせる。

## 参考
http://segafreder.hatenablog.com/entry/2016/05/24/235822
RubyistのためのPython環境ツール比較早見表

# はじめに
Pythonのバージョン/ライブラリ管理は色々あってややこしい。
「Rubyで言うと?」と考えるとRubyistにはわかりやすそうなので、独断で現在主流のPython環境管理をまとめてみる。

# 早見表
| 対象 |   Ruby| Python |
|  --- | --- | --- |
| バージョン | rbenv  | [pyenv](https://github.com/pyenv/pyenv) |
| ライブラリ | gem | pip |
| ライブラリ依存/仮想環境 | bundler | [pipenv](https://github.com/pypa/pipenv) |

# バージョン管理
Rubyistには同じみ `rbenv`、Pythonにも`pyenv`がある。使い方も基本的には同じ。
rbenvにはruby-buildというサブモジュールが必要だが、pyenvでは必要無い。

# ライブラリ管理
`pip` はPython 2.7.9/3.4以降から標準付属。

# ライブラリ依存/仮想環境
Pythonはたくさんあるが、`Bundler`に近い`pipenv`が良さそうなので比較してみる。(厳密には違うが、、)

|  | bundler| pipenv |
|  --- | --- | --- |
| 管理ファイル | Gemfile | Pipfile |
| lockファイル | Gemfile.lock | Pipfile.lock |
| lockファイルからライブラリインストール | bundle install | pipenv sync |
| 仮想環境実行 | bundle exec | pipenv run |
| 仮想環境パス(デフォルト) | ./vendor/bundle  | ~/.local/share/virtualenvs/#{プロジェクトのディレクトリ名}-#{ハッシュ値} |
#VsCode の正規表現置換で rspec の let 記法を #Ruby の変数代入に置換する例

# Find

```
 *let\(:(\w+)\) *\{ *(.+?) *\}
```

# Replace

```
$1 = $2
```

# Before

```rb
  let(:user) { create(:user, :man) }
  let(:book) { user.book }
```

# After

```rb
user = create(:user, :man)
book = user.book
```

# 操作の例

コマンドパレットで Replace を選んで、C+Enter で全て置換。

![image](https://user-images.githubusercontent.com/13635059/69098748-8cb3f000-0a9c-11ea-8a74-4dc82f5743ec.png)
![image](https://user-images.githubusercontent.com/13635059/69098753-8faee080-0a9c-11ea-9a48-7d7dc79319df.png)
![image](https://user-images.githubusercontent.com/13635059/69098755-9178a400-0a9c-11ea-9624-661029fde769.png)

# 未来の自分

見てますかー？ブラジルのあなたー？



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2739








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rspec + FactoryBot で Class名を省略して create や build を直接書く設定 ( #Rails )

# Factory_botの設定

`spec/rails_helper.rb`

```rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods

end
```

これで 

- FactoryBot.create を create と書けるようになる
- FactoryBot.build を build と書けるようになる
- etc etc

[RailsアプリへのRspecとFactory_botの導入手順 - Qiita](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2738








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rails console で FactoryBot の Class名を省略して create や build を直接書く ( include FactoryBot::Syntax::Methods )

`include FactoryBot::Syntax::Methods` するだけで ok


- FactoryBot.create を create と書けるようになる
- FactoryBot.build を build と書けるようになる
- etc etc

# なぜそうしたいのか？

Development環境でテストデータ作成がしたい
rspecに書いてあるデータ作成をそのまま踏襲したい
create って書いてあるところを FactoryBot.create に置き換えるのが面倒だ

# ところで development のテストデータを、君は、何故 FactoryBotで作らないのか

seedだってFactoryBotにまかせて良いのでは？

# 参考

[RailsアプリへのRspecとFactory_botの導入手順 - Qiita](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

[Module: FactoryBot::Syntax::Methods — Documentation for factory_bot (5.1.1)](https://www.rubydoc.info/gems/factory_bot/FactoryBot/Syntax/Methods)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2740








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Git】間違えてpushしてしまったファイルをリモートから削除する方法

# 前置き
Git初心者がいかに単純に，間違えてpushしたファイルをリモートから消すかの手順をメモしただけです．もっと良い方法があるのかもしれませんが，とにかく消せれば良いという人向け．
[このサイト](http://mimaunes.hatenablog.com/entry/20150817/1439741937)を参考にさせてもらいました．

# 手順
流れは以下のようになってます．

1. Gitの管理対象ファイルから消す
2. 削除したファイルをadd
3. commit
4. push

# 実行
```
$ git rm test.txt
$ git add -u
$ git commit -m "deleted test.txt"
$ git push origin master
```
ここで，`git add -u`は「前ステージと比較して変更点があった部分のみadd」を意味する．
バージョン確認方法

#経緯
目的：RedHat7.7の検証環境の作成
試行　①AWS環境にて7.7の作成を試みましたが、存在しないことが判明
　　　②AWS環境にてRedHat7.6を作成し、7.7にバージョンアップさせることにしました。

#Linux RedHatバージョン確認するには？
##catコマンドの利用
Linux RedHat7.6のバージョンを確認する為には、catコマンドを利用します。
実行コマンド下記の通りです。

```
# cat /etc/redhat-release
  Red Hat Enterprise Linux Server release 7.7 (Maipo)
```


##バージョンアップしたい場合
仮にバージョンが所定のバージョンでは作成できない場合、
下記コマンドを利用してバージョンアップします。

```
# yum upgrade -y
# reboot
```
yum upgradeコマンドのオプション-yは、「全ての問いにyesと答える」という意味です。
つまり、バージョンアップする際にまとめてyesと答えたこととなり、いちいち問いかけられる質問にyesと入力する手間が省けます。
他のオプションに関しましては、helpコマンドを入力の上、お確かめください。

[注意]
yumコマンドでバージョンアップした後、再起動を忘れずに行ってください。
再起動後、再度確認コマンドを実行し、反映されていることを確認してください。

#引用
>https://eng-entrance.com/linux-os-version

以上がバージョンの確認方法でした。
最後までご覧くださりありがとうございました！
応用カリキュラム 02 検索

google検索テクニック

キーワード選び
複数キーワードで
文章を単語に分解
何に関係のある情報か

意味を調べる時は「とは」を末尾につける
期間限定にしてみる
マイナス検索

この辺は、経験で身につけているつもり。

以下、英語検索・・・
キーワードを含めて検索をすると目的の記事が見つかりやすくなるか？

- change
- save
- default
- compare
- configure
- override
- install

プログラミングやってたらなんかよく目にするキーワードのような気はする。

フレーズ検索　""で囲んで検索すると、正にそのワードだけで検索できる。(そうだったんだ、知らんかった・・・)

サイトはなるべく1ページ目から探す。見つからない場合は、ページを進めていくのではなく、検索キーワードを
見直して、再チャレンジ。

エンジニア専門情報サービス

- Qiita
- Stack Overflow
新しい環境でAnacondaをインストールしたらSSLErrorが発生したので解決した（Windows10、Anaconda3-2019.10）

1．Anaconda3-2019.10-Windows-x86_64.exeでAnacondaをインストール

2．Anaconda Promptを開き、仮想環境を構築する際に、下記のエラーが発生

~~~
(base) C:\Users\xxx> conda create -n py36 python=3.6 anaconda
Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://anaconda.com blocked, please file
a support request with your network engineering team.

SSLError(MaxRetryError('HTTPSConnectionPool(host=\'http://repo.anaconda.com\', port=443): Max retries exceeded with url: /pkgs/main/win-64/current_repodata.json (Caused by SSLError("Can\'t connect to HTTPS URL because the SSL module is not available."))'))
~~~

3．OpenSSLは[こちら](https://slproweb.com/products/Win32OpenSSL.html)からWin64OpenSSL-1_1_1d.exeをインストール（※Win64OpenSSL-1_1_0L.exeだとエラー）

![openssl01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/58b0d993-7799-4e1a-994f-1f1c02501e30.png)

4．C:\OpenSSL-Win64に展開されていたので、C:\OpenSSL-Win64\binの中身をすべてAnaconda3\Library\binにコピペ

![openssl02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/25a77068-cd7d-0443-488c-11c8f7cb328e.png)

5．Anaconda PromptからOpenSSLが使用できることを確認

~~~
(base) C:\Users\xxx>openssl
OpenSSL> exit
~~~

6．システム環境変数の確認
![openssl03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/f2746c82-1786-e0a1-db37-95c52ec4c11e.png)

7．Anaconda Promptを開き、仮想環境を作成できた

~~~
(base) C:\Users\xxx>conda create -n py36 python=3.6 anaconda
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: C:\Users\xxx\Anaconda3\envs\py36

  added / updated specs:
    - anaconda
    - python=3.6

The following NEW packages will be INSTALLED:
~~~

8．SSLのエラーは消えるが、大学内だとダメなときもあるのでテザリングで

~~~
Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

ConnectTimeout(MaxRetryError("HTTPSConnectionPool(host='repo.anaconda.com', port=443): Max retries exceeded with url: /pkgs/main/win-64/current_repodata.json (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x0000027D8404FB48>, 'Connection to repo.anaconda.com timed out. (connect timeout=9.15)'))"))
~~~
PowerAppsで保存した画像（Base64）をエクセルで見る。（デコード）

# 今回やりたい事
以前の記事でPowerAppsで撮った画像をSharePointリストに保存し、それを他のPowerAppsのアプリで見るやり方を書きました。[「【PowerApps】カメラで撮った画像をSharePointリストに保存し、他のアプリで見る。」](https://qiita.com/Econoshift/items/2727dc687f5801d87272)

今回その画像をエクセルから開く案件がありましたが、Power Automateを使わないでやりたいという案件でした。悪戦苦闘をして出来たのでここに備忘録しておきます。

# Base64をデコードするアプローチ
最初、偶然 Base64の文字列をChromeのURLボックスにコピペしたらその画像が出てくるのを発見しました。VBAやVBスクリプトでそれを再現出来ないか試しましたが出来なかったし、どうやらそれが出来るのはChromeブラウザーだけなのが分かってそのアプローチは止めました。

次に思いついたのがPowerAppsが画像ファイルをエンコードしてBase64に変換したのだからデコードすれば画像ファイルに戻るのではないかという事です。

エンコードとデコードについてはこのページが分かり易いです。
　[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word135.html)

# エクセルVBAでBase64をデコードする
早速、「vba base64 画像にデコード」と言うキーワードでググりました。そしてこちらのページのコードを参考に自分でコードを書いてみました。
　[ファイルをBase64エンコード・デコードするVBAマクロ | 初心者備忘録](https://www.ka-net.org/blog/?p=4479)

```VBA.
Private Function DecodeBase64(ByVal Base64Str As String, ByVal FilePath As String) As Long

'Base64の文字列をデコード
    Dim elm As Object
    Dim ret As Long
    
    Const adTypeBinary = 1
    Const adSaveCreateOverWrite = 2
     
    ret = -1 '初期化
    On Error Resume Next
    
    Set elm = CreateObject("MSXML2.DOMDocument").createElement("base64")
    elm.DataType = "bin.base64"
    elm.Text = Base64Str
    With CreateObject("ADODB.Stream")
        .Type = adTypeBinary
        .Open
        .Write elm.nodeTypedValue
        .SaveToFile FilePath, adSaveCreateOverWrite
        .Close
    End With
    
    If Err.Number <> 0 Then ret = 0
    On Error GoTo 0
    
    DecodeBase64 = ret
  
End Function
```

参考にと言いながら上のコードは先ほどのページからのほとんんどコピペです。笑）感謝しかありません。ですので詳しい説明は割愛させて頂きます。要はMSXMLのBase64デコード機能を使用しています。上のコードは優れもので、参照設定無しで使えたので良かったです。　

上のコードを標準モジュールに保存してBase64の文字列と保存先のURLを引数とするDecodeBase64関数を作った事になるのです。

# 最初の「Base64」までの文字を消すのがミソ
このDecodeBase64関数をメインのプロシジャーに入れて、引数の保存先を開ければ画像ファイルが開くのを期待したのですが上手く開きません。涙目）やっぱり無理かと諦めかけてたところヒントとなるページを見つけました。（すみません、この記事を執筆している時に見つからず、URLが分かりませんでした。）

PowerAppsのBase64でエンコードした文字列はいつも「data:image/jpeg;base64」から始まります。どうやらこれを含めずにデコードしたら良いらしいのです。

標準モジュールに下記のコードを入れました。

```VBA.
    result = DecodeBase64(Mid(ImageURL, InStr(ImageURL, "base64,") + 7), SavePath2)
```
ImageURLがBase64の文字列が入った変数、SavePath2が保存したいファイル名のFullPathが入った変数です。これは関数なので結果をresultという変数に入れます。この二つの引数に問題があると「‐1」という結果が返ってきます。上手くいくと「0」が返ってきます。数式内のMid関数でBase64の文字列の最初の「Base64」までの文字を削除しています。

参考までに下記のコードで保存した画像ファイルをそのまま開けられます。

```VBA.
    CreateObject("Shell.Application").Open (SavePath2)
```
これを達成するまでに数時間を要しました。なんか人生を無駄にしていますかね。
WinActor　タスクスケジューラで自動起動

### 2020/1/24追記
　やっとタスクスケジューラから自動実行したとき、ネットワーク上のファイルが開けない問題が解決した。
　
＜原因＞
　ネットワーク探索が無効になっていた

＜解決策＞
　下記の通り作業する　（ドメインのネットワーク探索が無効になっていた）
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/84fad0a1-2745-495c-471c-fcf1726cc66a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/2c32f7d6-cc96-2ec0-f839-864f552fe549.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/523c42a1-b6ed-dda0-e58e-960891b19416.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/f4b5ca1f-85f3-db3c-4ffe-6f1d17522ddf.png)

### 2020/1/14追記
起動ショートカットのリンクでタスクスケジューラを組むと、実行が不安定だった。
※起動ショートカットのオプションでファイルタイプをVBSを選択できることに気づいた。
VBSにすると、タスクスケジューラの引数設定、起動オプションは不要になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/2244978e-f86f-1d83-4822-2fc3b2b97c8a.png)

### WinActor Forumは使えない
NTT謹製のフォーラムは、なかなかヒットしないのでQiitaにあげます。
（俺の検索ワードチョイスが悪いのか、思うように出てこない）

### 自動起動のしかた
Windowsには便利なタスクスケジューラというものがある。
しかし、UIが非常に分かりづらい。
自動起動させるために1時間以上かかったので、Qiitaに載せます。


###1.起動ショートカットを作成する
※自動起動させたい端末で作成すること
WinActorを起動する
↓
シナリオを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/dd987038-24be-359e-b5b6-0057fd8e948d.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/00107445-23a3-8c6e-8002-2bdbc428a0a6.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/cce8f1e4-feea-33f1-f031-2feee06b2a60.png)
↓
起動時のオプションはタスクスケジューラの引数で設定する
※ここで設定するとタスクスケジューラで起動したときうまくいかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/99dd6a91-8f60-b7ce-f1fc-6f81448bca2a.png)
↓
これで起動ショートカット完成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/ae06d407-85a9-9950-ca06-060524239c96.png)

###タスクスケジューラの設定
「タスクの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/7bcd0b06-6775-f06f-47c2-07f193dc8f8f.png)
↓
「操作」→「新規」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/a216d58a-b104-4fc2-e8ce-add455dcf32b.png)
↓
先程作成した起動ショートカットを選択
→そうすると「プログラム/スクリプト」がWinActorのパスになる
→「引数の追加」に-f "シナリオのフルパス" -r -e 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/45760b4f-0569-a142-459d-fa9664461c39.png)
起動オプションはWinActor簡易マニュアルを参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/ee1a1909-cc3b-87b1-783d-9faa40f5206a.png)



[参考サイト|WinActor User Forum](https://winactor.com/questions/question/%e3%82%b7%e3%83%8a%e3%83%aa%e3%82%aa%e3%81%ae%e8%87%aa%e5%8b%95%e5%ae%9f%e8%a1%8c/page/2/)


###って色々やってみたけど、コレでよかったみたい
フツーに「操作」→「プログラム/スクリプト」にVBSファイルを選択する
最上位特権は外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/53224b60-385c-1511-85ff-bb202b396af7.png)
【Selenium】文字入力中にカーソルが別のフォームに移動してしまう

# 背景
次のようにして、全画面コピーした内容をテキストエリアに入力する処理を作っていました。

```ruby
js = "
  document.execCommand('SelectAll');
  return window.getSelection().toString();
"
str = driver.execute_script(js)
driver.find_element(:id, 'hoge').send_keys(str)
```
ところが、入力中に別のフォームに移ってしまい、入力がめちゃくちゃになってしまいました。

# 結論
`send_keys`で入力する前に、`replace()`関数を利用して`\t`を置き換える。

```ruby
js = "
  document.execCommand('SelectAll');
  return window.getSelection().toString().replace(/\t/g, ' ');
"
str = driver.execute_script(js)
driver.find_element(:id, 'hoge').send_keys(str)
```

## \tとは
バックスラッシュ記法で「タブ」を意味しています。
全画面コピーした際に紛れ込んでいた`\t`によって、カーソルが移動していたようです。

## replace()関数
次のようにすることで、「str」中の「対象」を「置換後」に置き換えることができます。

```js
str.replace('対象', '置換後')
```

このままでは1回しか置き換えられないので、置き換えたい対象が複数ある場合は正規表現のgフラグを使用する必要があります。

```js
str = 'hogehogehoge';
str.replace('hoge', 'fuga');    // 'fugahogehoge'
str.replace('/hoge/g', 'fuga'); // 'fugafugafuga'
```

これを利用して文中含まれるすべての`\t`を` `に置き換えました。

# 参考
- [バックスラッシュ記法によるエスケープ](https://www.javadrive.jp/ruby/string/index2.html)
- [String.prototype.replace()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
- [正規表現リファレンス](https://kyu-mu.net/coffeescript/regexp/)
jQueryセレクタメモ

```javascript:セレクタ.js

セレクタ例

$("p"); // 要素（タグ）指定
$("#id")// id指定
$("input[name='hoge_name']") // name指定
$(".className"); //クラス指定

$("#id, .className "); //OR指定 、複数指定カンマで区切る

$("a[target='_blank']"); //例：リンクの_blankを選択

$("input[name*='hoge']") //部分一致
$("input[name^='hoge']") //前方一致
$("input[name$='hoge']") //後方一致

//and検索
$(".focus_tab.focus_first")　//focus_tabかつfocus_firstクラスである要素を取得、（注意：スペースを空けない）

//階層構造によるセレクタ
$(".contents_detail  .detail_row");

//階層構造によるセレクタ（直下のみ）
$(".contents_detail > .detail_row ");
$(".detail_table > tbody > tr ");

//他
$('input[type="checkbox"]:checked'); 
$('input[name='hoge']:hidden');
$('div:visible');

//最初の1件のみ取得
$('.detail_row:first');

※↓未検証
//html5,データ属性 （data-rowIndexと指定した例）タイムリーフでは(data-th-rowIndex)
$('.detail_row:first').attr("rowIndex");
$($('.detail_row')[1]).attr("rowIndex");
※↑未検証

```

```javascript:イベント引数.js

blur	要素がフォーカスを失った時に発生
focus	要素がフォーカスを得た時に発生
load	ドキュメント内の全リソースの読み込みが完了したときに発生
resize	windowの大きさが変更された時に発生
scroll	ドキュメントがスクロールした時に発生
click	クリックされた時
dblclick	ダブルクリックされた時
mousedown	要素上でマウスが押された時に発生
mouseup	要素上でマウスが押され、上がった時に発生
mousemove	要素上でマウスが移動している時に発生
mouseover	マウスが要素に入った時に発生。子要素でも発生
mouseout	マウスが要素から外れた時に発生。子要素でも発生
mouseenter	マウスが要素に入った時に発生。子孫要素に入った時には発生しない
mouseleave	マウスが要素から外れた時に発生。子孫要素から外れた時には発生しない
change	要素がフォーカスを得て値の修正が完了した時に発生
select	type属性値が”text”のinput要素、textarea要素のテキストが選択された時に発生
submit	フォームが送信された時に発生
keydown	キーが押し下げられた時に発生
keypress	キーが押された時に発生
keyup	キーが上がった時に発生
error	javascriptのエラーが発生した時

```
FortigateでFSSOを使用すると８時間でインターネットに接続できなくなる

* FortiGate 50E
* v5.4.9,build1202 (GA)

FortigateでFSSOを使用していると最初の認証から８時間経過するとインターネットに接続できなくなる現象が発生します。
ローカルネットワークのホストへは通信が可能ですので、Fortigateがインターネット側へ通信を通さないようです。

そのような状況のときログに以下のような記録が残ります。

* ログ抜粋

```
action=FSSO-polling-logoff status=success reason="timeout" msg="FSSO-polling-logoff event from xxx.xxx.xxx.xxx: user foo logged off xxx.xxx.xxx.xxx"
action=FSSO-logoff msg="FSSO-logoff event from Local FSSO Agent: user foo logged off xxx.xxx.xxx.xxx"
action=authentication status=logout reason="N/A" msg="User foo succeeded in logout"
```

どうやらFSSOにはタイマーがあり、最初にFortigateで認証されてから８時間経過すると強制的にログオフされるようです。

# FSSO logoff タイマーの設定
「FOOS-polling-logoff timeout」などで検索すると、このページ→[ Active Directory timeout? - Fortinet Forums](https://forum.fortinet.com/tm.aspx?m=119045)が引っかかります。

GUIからは設定できそうにないのでコンソールから設定を行います。

```
config user fsso-polling
edit 1
set logon-history <int> #<-----(0-48, default is 8)
next
end
```

これでログオフまでの時間の設定が完了です。
eclipse上のエラー　Q＆A　memo

ここには自分がeclipse上で発生したエラーをまとめていこうと思います。
まだ経験数カ月の雑魚初心者ですが、
誰かの役に立てれば幸いです。（コメント欲しいなｗ）

## プロジェクト '〇〇' のクラスパス変数 'TOMCAT_HOME/lib/□□□-api.jar' がアンバインドされています	〇〇ビルド・パス	ビルド・パス問題
ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません。
・Eclipse→pleiades\tomcat\8\libに同じjarファイルがあったので、
〇〇のビルドパス構成→ライブラリー　からエラーjarを全て除去し、
外部jarの追加→pleiades\tomcat\8\libから先ほど除去したjarを追加。
プロジェクトをクリーンすればOK。


## eclipse起動後、CSSの編集が反映されない。紐づいてない？
エクリプスの挙動がおかしいときは以下３パターンのクリーンを試そう。
①ブラウザで「Ctrl+F5」で更新。
②eclipse上部の「プロジェクト」→「クリーン」。
③直接プロジェクトを右クリック→「リフレッシュ」。

## eclipseにimportや更新したファイルが反映されない
該当プロジェクトを右クリック「リフレッシュ」

## jsファイルが反映されない
今回jsファイルが反映されなかったのは
以下が途中で改行されていたから。

```a.html
<script type="text/javascript" src="js/btn.js"></script>
```
## Safariでcssのactiveとhoverが上手く反応しない

html側のタグ中に`ontouchstart=""`を入れる。
例：`<span class="btnst" ontouchstart="">更新</span>`

## eclipseでポートがalreadyで作動しているとき
エクリプスを閉じてもTomcatだけ動き続けることある。
タスクマネージャーでjava.exe(javaから始まるもの)を終了させる。

## pleiadesの展開(解凍)ができないとき
Windows展開ウィザードでのエラー表示で
フォルダーを開くことができないときの対処法。

「圧縮 (zip 形式) フォルダー 'D:\pleiades-e○○○○-ultimate-jre_20190630.zip' は無効です。」と出る。

以下を参考に「7-zip」で開くことができた。
参照　https://shootingogi.net/1420/

解凍ツールが入っていなかったのが原因。

## pom.xmlで追加した内容が効かない（springboot）
springbootでバリデーションチェックを追加したが
チェック判定がエラーにならない。
eclipse上部の「プロジェクト」→「クリーン」。


```.xml
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</dependency>
```
## 外部プロジェクトを参照呼び出しできない(Java)
プロジェクトAからプロジェクトBを「import パッケージ名.クラス名」でimport参照したがエラーが出る。
プロジェクトAを右クリックし「ビルド・パスの構成」から「プロジェクト」タブを選択、「プロジェクトB」を追加し適用。

「プロジェクトB」が表示されなければJavaプロジェクトとして認識されていない。
つまりプロジェクトBはビルド・パスの設定もできない状態、カーソルを当てると「使用可能なアクションはありません」と出る。
Javaプロジェクトとして認識させる設定をする。
プロジェクトBを右クリックし「プロパティ」→「プロジェクト･ファセット｣を選択し､｢ファセット･フォームへ変換...｣をクリック。
Javaにだけチェックが入る。完了後、上記ビルド・パス設定をする。
参照：https://qiita.com/yukiri-pg/items/90c75cb9c53e025516f5