OmniAICreator/Qiita-1.07M huggingface dataset:
【ElastiCache】RBAC(Role-Based Access Control)が有効なRedisClusterにJedisで接続する

RBAC(Role-Based Access Control)が有効になっているElastiCache RedisClusterに、EC2で動作するアプリケーションから、JavaのRedisクライアントライブラリであるJedisを使って接続する。

## 前提

- 『Authenticating users with Role-Based Access Control (RBAC) 』(https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Clusters.RBAC.html) に従ってRedisClusterが作成されている
- アプリケーションの動作するEC2から、RedisClusterへネットワーク設定的にアクセス可能である
  - `openssl s_client -connect エンドポイント:6379 -quiet` 等のコマンドで確認できる
- 認証するユーザーのアクセス文字列に `+cluster` と `+ping` が設定されている
  - `+ping` は設定しなくても繋がるが、設定しておかないとログにerrorが吐かれる

## コード

```scala
import redis.clients.jedis.{BinaryJedisCluster, HostAndPort, JedisCluster, JedisPoolConfig}

// JedisClusterインスタンス生成 (RedisClusterへの接続)
val jedis = new JedisCluster(
  new HostAndPort("Clusterの設定エンドポイント", 6379),
  BinaryJedisCluster.DEFAULT_TIMEOUT, // connectionTimeout: Int
  BinaryJedisCluster.DEFAULT_TIMEOUT, // soTimeout: Int
  BinaryJedisCluster.DEFAULT_MAX_ATTEMPTS, // maxAttempts: Int
  "ユーザー名", // user: String
  "パスワード", // password: String
  null, // clientName: String
  new JedisPoolConfig(), // poolConfig: GenericObjectPoolConfig[Jedis]
  true// ssl: Boolean
)

// あとは生成したインスタンスを使って、許可されているコマンドを実行できる
jedis.set("test1", "テスト1")
jedis.set("test2", "テスト2")
jedis.set("test3", "テスト3")

println(jedis.get("test1")) // "テスト1"
println(jedis.get("test2")) // "テスト2"
println(jedis.get("test3")) // "テスト3"
```

エンドポイント、ユーザー名、パスワードは環境や設定に合わせて置き換えること。
`connectionTimeout`、`soTimeout`、`maxAttempts` もアプリケーションに合わせて適切に設定すること。
ちなみにデフォルト値は以下。

```java
public static final int DEFAULT_TIMEOUT = 2000;
public static final int DEFAULT_MAX_ATTEMPTS = 5;
```
ブラウザでjancodeを認識したい



#動機
socket.io を介してzbarで認識させれば、できそうなのでやってみました

#ブラウザ上での認識率比較
zxing < zbar < dynasoft



#インストール
sudo apt install libzbar0
pip3 install pyzbar
pip3 install flask
pip3 install flask-socket.io



#スクリプト  
Jsとpythonのやりとり部分は、この記事と同じです
https://qiita.com/im02kai/items/e460fa86be1501474275



#zbar用に変更

```python:app.py
from pyzbar.pyzbar import decode

@socketio.event
def image_barcode(img_base64):#base64

    im = Image.open(io.BytesIO(base64.b64decode(img_base64.split(',')[1])))
    data = decode(im)

    if data != []:
    	str=data[0][0].decode('utf-8', 'ignore')
    	print(str)
    	
    	(x, y, w, h) = data[0].rect
    	
    	emit('my_response',{
            'code': str,
            'x': x,
            'y': y,
            'w': w,
            'h': h
            }
        )
    else:
        print("Image is empty!!")
        emit('error',{'code': '0000'}
        )


```


#テストサイト
Yahoo Shopping Apiと連携してみました
認識率のテストでご利用ください

https://www.web-tools.app/zbartop
【GIT】差分ファイル一覧を作成

GITでコミットAからコミットBまでの間で、削除・追加・変更されたファイルについて、それぞれの一覧を取得する方法です。
`git diff` は `--name-only` を付けると、ファイルのパスを返してくれるのです。
`git diff` は `--name-status` を付けると、ファイルのパスとステータス（削除・追加・変更）を返してくれるのです。

# 差分ファイル一覧を出力
```bash:git
$ git diff --name-status A..B
```

```bash:結果
D	src/◯◯◯◯/◯◯◯.◯◯◯ 　　　D　　=　　削除ファイル
A	src/◯◯◯◯/◯◯◯.◯◯◯　　　　　A = 追加ファイル
M	src/◯◯◯◯/◯◯◯.◯◯◯　　　　　M = 変更ファイル
```

# 差分ファイル一覧を別ファイルに保存
リスト一覧を出力してファイル保存したい場合
`> list.tsv`　を追加すれば大丈夫。

```bash:git
git diff --name-status 1a9c53a..0abd2d2 > list.tsv
```
出力結果がタブで区切っているので今回は`.tsv`にしています。

# 差分抽出してzipに保存
```bash:git
$ git archive --format=zip --prefix=root/ HEAD `git diff --diff-filter=d --name-only HEAD^ HEAD` -o archive.zip
```

詳しくは下記より
https://qiita.com/kaminaly/items/28f9cb4e680deb700833


# 参考サイト
https://qiita.com/youthkee/items/5014a9be25487854249d
🗑【Sphinx】autodocの索引ページで、モジュールを「モ」ではなく「ま」の項目に表示する

https://pypi.org/project/sphinxcontrib.kana-text/

#後日談

以下の記事で手動で行っていた内容ですが、Sphinx拡張側で辞書をを作って対応しました。「モジュール」であれば「も」もしくは「ま」の項目に表示されます。初期設定では「ま」です。

---

``sphinx.ext.autodoc`` を使った時、索引では「モジュール」は「モ」の項目に表示されます。

これを次のように「ま」の項目に表示する方法を消化します。

![2021-09-22 13.21.39  96e895f333b5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665190/a717f30c-9d13-1252-be62-8f9564b70b8f.png)

![2021-09-22 13.22.02  c1d046727d15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665190/27915b0d-b09c-549d-5671-241e00758d6b.png)

#🧪セットアップ

##①sphinx_kana_termをセットする

次のページからSphinx拡張のコードをコピペして準備します。

https://qiita.com/koKekkoh/items/7e56228276fd092f3c8e

https://qiita.com/koKekkoh/items/4563b63fdb8eaa3ef4f9

- ファイル名は ``sphinx_kana_term.py`` とします。
    - ``sphinx_kana_term/__init__.py`` としても動作します。

※ ``pip install ...`` じゃなくてすいません…

##②sphinxのメッセージカタログを編集する

ファイルは他の場所でもOKです。利用環境の都合に合わせてください。

```bash
mkdir /usr/local/share/locale/ja/ja/LC_MESSAGES
cd /usr/local/share/locale/ja/ja/LC_MESSAGES
cp /usr/local/lib/python3.8/site-packages/sphinx/locale/ja/LC_MESSAGES/sphinx.po .
vi sphinx.po
```

次のように書き換えてください。

```
…
#: sphinx/domains/javascript.py:331 sphinx/domains/python.py:58
#: sphinx/domains/python.py:1120
msgid "module"
msgstr "まも|モジュール"
…
```

- ``モジュール`` は二つあるので間違わないようにしてください。
- ``msgid "module"`` の単数形の方です。

##③confi.py

```pyhon
import os
import sys
sys.path.insert(0, os.path.abspath('_ext'))
```

- 私の環境では複数のSphinxプロジェクト共通のディレクティブを用意しているため、パスが異なります。

```python
extensions = [
    'sphinx_kana_term',
    'sphinx.ext.autodoc',
    'sphinx.ext.todo',
]
```

#以上
PowerVS IBM i 日記(37): DC(TOK04) でも IBM i 7.1 が利用可能－大阪 DC(OSA21)は 7.1 イメージが 3 つあるけど…

# 東京 DC(TOK04) でも IBM i 7.1 が利用可能
久しぶりに PowerVS に触りました。

気が付いたら東京 DC(TOK04) でも IBM i 7.1 が利用可能になっていました。
イメージとして「IBMi-71-11-001」が選択できるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/de9fddcc-c141-8465-1493-21651ce627b3.png)

## 大阪 DC(OSA21)には3種類の IBM i イメージが存在

でも大阪 DC(OSA21)には「IBMi-71-11-001」「IBMi-71-11-002」「IBMi-71-11-003」と3種類のイメージがあるんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1c9f6e2a-e5fc-082c-461f-7d6bc4825036.png)

これは「[(34): 大阪 DC(OSA21) でも PowerVS の提供を開始](https://qiita.com/6onoda/items/9a45729b8a6b13a77de5)」の時から変わらず。

イメージ名のルールは「IBMi-OSのバージョン-TRのレベル-更新番号」のように付いていると思われます。

そこで、気になったのが東京の「IBMi-71-11-001」と大阪の「IBMi-71-11-001」は同じものなのかという点です。

## 両方の「IBMi-71-11-001」比較

WRKPTFGRP を見てみます。

東京の「IBMi-71-11-001」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/5a0c9b7c-3fbf-de9c-b687-09742ad0b4bc.png)

大阪の「IBMi-71-11-001」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1dde2945-e133-9cc5-4ccb-e015aecf1f19.png)

PTF明細や導入されているプログラムも同じでした。

2 次言語が導入されていないもの同じでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/50518284-5081-35ac-d9db-3a4d5b21e3a6.png)

## 大阪の「IBMi-71-11-002」「IBMi-71-11-003」は起動しない

「IBMi-71-11-001」と、大阪だけにある「IBMi-71-11-002」「IBMi-71-11-003」と比べるために「IBMi-71-11-002」「IBMi-71-11-003」からインスタンスを作成しました。

インスタンスは作成され、起動しようとしましたが「シャットオフ」になってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e5a6b039-f941-f011-8485-61339a1cf621.png)

手動で「開始」してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/909b90c7-366b-a0ab-615a-bf20f7e5edec.png)

「アクティブ」になったように見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/4dc43398-0320-9796-7e6d-24dc258f8b5c.png)

しかし、コンソールはつながりませんでした。
SRCに「B2008105 LP」が出ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/9879b3fd-2b31-583f-dab0-85364ceaaa78.png)

B2 は LPAR のエラーです。

> B2xx xxxx	It may indicate a Logical partition error.

https://www.ibm.com/docs/en/i/7.3?topic=problems-system-reference-code-list

しばらくすると、結局「シャットオフ」に戻ってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/179c8de4-89d4-fd2e-9f17-944ae2a4a423.png)

結局、使えるのは「IBMi-71-11-001」だけのようです。

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
Djangoのobjectsはどんな場合に必要になるか

#はじめに
先日業務の中でDjangoの仕様である`objects`につまづいてしまったので、この機会に`objects`が使える条件など調べた情報をまとめます。
初歩的な内容になってしまうかもしれませんが、知識の確認がてらにでもご覧ください。

#そもそも'objects'とは？
この`objects`とは`モデルマネージャー`と呼ばれるものです。
データベースから任意のデータを操作する際などによく使われます
Djangoでは、`モデル名.objects`のようにすると様々なことができます。

##具体例

|name       |price|
|:----------|----:|
|apple      |100  |
|orange     |100  |
|banana     |150  |

```python:
 from app.models import Item
 
 items = Item.objects.filter(price=100) 
```
上記では`モデルマネージャー`である`objects`に`モデルマネージャーのメソッド`である`filter()`が連結され、'price'が100である'apple'と'orange'が取り出されています。

#objectsが必要な場合
##結論
`モデルクラスに対してモデルマネージャのメソッドを使う場合`です！

##具体例

```python:
#先ほどと同じ記述です
 from app.models import Item
 
 items = Item.objects.filter(price=100) 
```

このように、**モデルクラスに対して**filter()メソッドのようなモデルマネージャのメソッドを使うときは
`モデルクラス(Item).モデルマネージャ(objects).モデルマネージャのメソッド(filter())`
と記述します。

#objectsが不要な場合
##結論
`クエリセットインスタンスに対してモデルマネージャのメソッドを使う場合`です！
##具体例
```python:
1 from app.models import Item

# filter()はクエリセットを返す 
2 items = Item.objects.filter(price=100) 
3 items = items.order_by('name')
```
二行目の記述で`items`にはfilter()が返したクエリセットインスタンスが代入されています。
このため、三行目では
`items.objects.order_by('name')`
とする必要がありません。

#おまけ
モデルマネージャのメソッドは、クエリセットインスタンスに対して連結して記述できます。

```python:
from app.models import Item

# filter()はクエリセットを返すので、order_by()を連結できる 
items = Item.objects.filter(price=100).order_by('name')
```

#参考
[【初心者向け】Djangoのモデル操作でobjectsが必要な場合・不要な場合を理解する]
(https://qiita.com/shonansurvivors/items/12b087cf5ab591273c8c)

[Django データベース操作 についてのまとめ]
(https://qiita.com/okoppe8/items/66a8747cf179a538355b)
Tomcat でよくある事象：Tomcat v9.9 Server at localhsot are already in use

とってもよくある事象
eclipse / STS でのサーバ起動で、
>Tomcat v9.9 Server at localhsot are already in use
>>Starting Tomcat at v9.0 Server at localhost has encountered a problem. Server ports(8005,8080) required at Tomcat v9.9 Server at localhsot are already in use

というのがよく発生する。

Linux なら tomcat プロセスを探して、そのままkill。
Windowsの場合、

Step1) プロンプトから以下のコマンド

```
netstat  -ano  |  findstr  <Port Number>
```
-- sample -----

```
C:\Users\tomoi>netstat  -ano  |  findstr  8080
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       9612
  TCP         [::]:8080              [::]:0                 LISTENING       9612
```
 
Step2) 以下の taskkill で kill する。

```
taskkill /F /PID < Process Id >
```
sample

```
taskkill  /F  /PID  9612
```
「失敗」を恐れているサラリーマンたちへ

#前書き

　致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]の一節の感想文である。
[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474

　今日読んだ記事で、10年前に言われた上司のコトバを思い出した。
　今の仕事で、自分の考えやアイデアを実行することを躊躇している人がいるとしたら読んでほしいと思って紹介する。
　（最初に断っておきますが、個人事業主や経営者の方の参考にはならないと思います）

#本題<br>【5月30日】ナンバー１とナンバー２の違い <br>　古森重隆 富士フイルムホールディングス会長兼CEO
古森重隆。元富士フイルムの経営者。入社以来営業畑を歩みトップに上り詰める。
数々の構造改革を断行した。2004年は主力のフィルム事業からの撤退を英断。
その後請われてNHKの経営委員会の委員長も務めた。
1939年生まれ。御年、82歳。

古森さんが語るのは自らの会社のトップ（ナンバー１）としての経験。
そこからナンバー１とナンバー２の違いについて語る。
>『主力の写真フィルム事業から相当思い切った構造改革をやろうというんですから、反対もたくさん出てくるし、
　新規分野もどこに投資するかで意見も割れます。そこで会社の経営資源を全部洗い出し、市場を徹底分析して、
　ここぞという分野を定めて投資したんです。例えば液晶の材料、インクジェット、化粧品、医療機器、医薬品といった分野です。
　自前でやっていては機を逸するので、積極的にM＆Ａを働きかけ、インクジェットプリンターのヘッドで世界一の会社を買収しました。
　医療のITシステムの会社や製薬会社など、あわせて三十社近くを買い、この十年間で六千億くらい投資しました。』
『何が当たるのか、読みに読んで決める。決めたらやる。経営者として、百の判断をしたら百間違えないつもりで私はやっています。
　絶対間違えないぞと。そのためにはいろいろ情報も必要ですが、それが全部揃うまで待っていては機を逃してしまう。
　不完全な情報から本質を見極めなければならないから確かに難しい。』

ふむ。繰り返し語られる、『機』。ビジネスは『機』だ。いくら素晴らしいことをやろうとしていても、『機』を逃す会社は成長しない。
ネットの記事によると、古森さんは本業である写真フィルム事業の衰退に危機感を感じ、課長・部長時代から経営に訴えていたという。
だが、当時はまだまだフィルム事業での収益が好調な時代。当時の役員は耳を貸さなかった。
そして、自ら社長になると改革を決断・実行した。大規模なリストラ実行も決断した。

古森さんは続ける。
>『私も一つ、二つは間違えました。会社の存続に関わるような問題ではありませんでしたが、その程度で済んだのは、やはり百決めたら百間違えない
　という気魄（きはく）と精魂を込めてやっているからです。そうやって毎日仕事をしていると、もう本当にヘトヘトになりますよ。
　社長になんかなるもんじゃないなというのが実感ですね。』
『しかし社長になったからにはそういう姿勢で臨まなければなりません。間違えるのが人間だと言っているようでは経営は務まらない。
　昔の侍なら間違えたら腹を切らなきゃいけないわけで、それくらい決死の覚悟でやらなければならないと思います。』

切腹か。以前この本でも昔の武士に例えていた人がいたな。経営は一つ間違えると命取り。真剣勝負なのだ。

>『だから組織のナンバー１とナンバー２の一番の違いは責任の重さです。ナンバー２も相応の責任は負っていますが、まだ竹刀の勝負だと思います。
　間違えてもまだ自分の後には社長がいるという思いがどこかにある。しかしナンバー１が間違えたら会社が傾いてしまう。
　その差はとてつもなく大きいですよ。』

社長は孤独だ。責任も重い。数々の経営者が語るコトバだ。
私はそれほどの重圧と責任を背負ったことがない。そういえば、10年前、当時の上司のＭさんも、かつて一国一城の経営者だったな。
Ｍさんからかけてもらったコトバを思い出す。

**「仕事で失敗しても死ぬわけじゃあない」**


そう、失敗しても死ぬわけじゃあない。そして、我われサラリーマンには上司がいる。会社がある。何を躊躇することがあるのだろうか。
自分が正しいと思ったことは、遠慮せずにやればいい。『機』を逸するな。
ＴＶでハヤシ先生もいってる。「今でしょ」って。


皆さまの参考になれば幸いです。



（参考）
古森重隆　-Wiki
https://ja.wikipedia.org/wiki/%E5%8F%A4%E6%A3%AE%E9%87%8D%E9%9A%86
富士フイルムはなぜ、大改革に成功したのか　古森重隆・富士フイルムホールディングス会長・CEOに聞く　ー東洋経済ONLINE
https://toyokeizai.net/articles/-/24643
FlutterでDart Error: Can't load Kernel binary: Invalid kernel binary format version　と出た

### エラー内容
FlutterでiOSアプリをビルドしていたら、
`Dart Error: Can't load Kernel binary: Invalid kernel binary format version`
というエラーが出てうまくいきませんでした。
### 対処方法
Flutterのライブラリ（プロジェクトとは別にしていました）の**>bin>cache**フォルダをゴミ箱に入れ
`flutter clean`　して
`flutter run` したらうまくいきました
Azure Synapse Analytics Spark Poolにおける課金対象時間


## 注意事項
2021年9月22日時点における情報であるため、最新の情報についてはMicrosoft社のドキュメントをご確認ください。

## 概要
Azure Synapse Analytics Spark Poolにおける課金対象時間を調査しましたので共有します。

調査のきっかけとしては、Spark Poolでは割り当てコア数に利用時間（分単位）を乗じた金額が課金されるという記載があるのですが、セッションの停止とアイドル状態の時間の設定がどのように影響するかが不明確であったことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/83e4f9dd-cd6f-1f40-a8b4-8e33a835d35c.png)
引用元：[価格 - Azure Synapse Analytics | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/details/synapse-analytics/)

調査の結果、課金対象時間は、ノートブック実行等によりSparkプールが開始されてから、ノートブックのセッションを停止後にアイドル状態の時間を経過するまでの時間でした。

この記事では、その詳細を説明します。

## 課金対象時間

課金対象時間を整理すると下記図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/40a227e2-80e8-ec66-348a-2c0ff7b9e1ab.png)

課金対象期間はノートブックの下記の2つに分けることができ、①については停止する方法と自動で停止する方法があります。
①ノートブックのセッションの時間（処理中の時間+タイムアウト時間）
②Sparkプールのアイドル時間

①を自動で停止する方法としては、下記のようにセッションのタイムアウト時間を設定する方法です。デフォルト値として、30分が設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/22227d8e-15c5-ce7d-6916-b69e9a5cf5dc.png)

②のアイドル時間については、下記のように設定が可能です。デフォルト値が15分であり、最低5分の設定が可能です。ノートブックのセッションとは異なり、Sparkプールを手動で停止することができないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/71dd1f3f-6cf1-65e6-57b8-325c9dc65f4c.png)


また、パイプラインでSparkプールを利用する場合には、ノートブック処理完了後にセッションが終了されますが、Sparkプールはアイドル状態の時間を経過するまで停止されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f37962eb-64dd-d0f9-e442-cf47567dc86a.png)


Azure Synapse Analytics Spark Poolにおける課金対象時間について説明しましたが、ドキュメントにも記載されているように、Sparkのコードを実行していない時間にも課金が発生することに注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/365219e7-7eb9-4d13-fa3b-a1193c2e9171.png)
引用元：[クイックスタート: Azure portal を使用してサーバーレス Apache Spark プールを作成する - Azure Synapse Analytics | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/quickstart-create-apache-spark-pool-portal)
pandasで集計結果を条件とした抽出を行う

pandasで集計結果を条件とした抽出を行います。
集計結果の受け取り方に注意が必要です。


以下のデータを例にします。

```python
import pandas as pd
df=pd.DataFrame({'cust_id': ['A1', 'A2', 'A3', 'A4', 'A5','A6'],
                 'amount': [100, 500, 300, 200, 200,500]})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6ab8dd5e-3b08-6acc-6487-5c133f0241e1.png)

amountの平均をとってそれ以上のレコードだけを抽出します。
平均は以下のようにmeanという集計関数で取得できます。

```python
df.mean()
```
```:結果
amount    300.0
dtype: float64
```


しかし、以下のコードで平均以上を抽出しようとすると「ValueError: Can only compare identically-labeled Series objects」が発生して失敗します。

```python
df[df['amount']>=df.mean()]
```

これはdf.mean()がSeriesオブジェクトだからです。

```python
print(type(df.mean()))
```
```:結果
<class 'pandas.core.series.Series'>
```

なぜSeriesオブジェクトなのかは複数の数値列があるデータにするとわかります。
以下のデータはamountのほかにcountという数値列を追加しました。

```python
df=pd.DataFrame({'cust_id': ['A1', 'A2', 'A3', 'A4', 'A5','A6'],
                 'amount': [100, 500, 300, 200, 200,500],
                 'count': [1, 5, 3, 2, 2,5]})
df.mean()
```
```:結果
amount    300.0
count       3.0
dtype: float64
```

amoutの平均とともにcountの平均値も戻りました。このように複数の集計結果が入りうるのでSeriesオブジェクトとして戻るのです。

ではamountの平均値だけを求めます。2つ方法があります。
まずはdf.amountでSeriesオブジェクトにしてからmean()で集計する方法です。

```python:df.amount.mean()
print(df.amount.mean())
print(type(df.amount.mean()))
df[df['amount']>=df.amount.mean()]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3758025d-1c82-7983-47c2-fed9a952f909.png)


もう一つは、df.mean()でSeriesオブジェクトを得てから、['amount']とインデックスアクセスして単一値を得る方法です。

```python:df.mean()['amount']
print(df.mean()['amount'])
print(type(df.mean()['amount']))
df[df['amount']>=df.mean()['amount']]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ff54fb30-de58-e648-6696-60cc58eeeab6.png)

集計結果を条件とした抽出はこのように集計結果を単一値で得てから、ブールインデックスやqueryで検索します。上記はブールインデックスでの例でしたが、queryを使う場合は以下のように@で集計結果を参照します。

```python
df.query("amount>=@df.amount.mean()")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fc9ff023-4268-46b0-b717-8b1660f2ef02.png)

ちなみにcust_idとamountだけでよければSeriesオブジェクトのまま集計と抽出をすることも可能です。
set_index('cust_id')でcust_idはインデックス化して、['amount']でSeriesオブジェクトに変換しています。Seriesオブジェクトは列がひとつしかないので、sr.mean()で平均値が単一値として求まります。

```python
sr=df.set_index('cust_id')['amount']
sr[sr>=sr.mean()]
```
```:結果
cust_id
A2    500
A3    300
A6    500
Name: amount, dtype: int64
```


[データサイエンス100本ノック（構造化データ加工編）](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)のP-035を解くときにちょっと引っかかったのでメモしました。
Github で、異なるリポジトリの別のブランチに push する

# やりたいこと

* リポジトリ A (例 https://github.com/example-a/a.git)
* リポジトリ B (例 https://github.com/example-b/b.git)

(注意: リポジトリは適当な例です) 

リポジトリ A にある branch-a ブランチの内容を、
リポジトリ B にある branch-b ブランチに push したい。



# やりかた

1. push 元のリポジトリ A を clone し、そこに cd する

    ```
    git clone git@github.com:example-a/a.git
    cd a
    ```

2. push 先のリポジトリ B をリモートリポジトリに追加する

    ```
    git remote add b git@github.com:example-b/b.git
    ```

3. push 元のブランチ名と、push先のリモートリポジトリ名・ブランチ名を指定して push する

    ```
    git push b branch-a:branch-b
    ```

### 謝辞
thanks to @yasuraok
【intra-mart】JavaのクラスファイルなどがImportできなくなった時の対処法

#はじめに
本日は、intra-martでJavaのクラスファイルなどがImportできなくなった時の対処法を記載します。
JavaEE開発を行っている際に自分も同じ状況になりました。備忘のために記事としています。

【前提条件】
・intra-mart e Builder for Accel Platform をインストール済みであること。
・intra-mart Accel Platform をインストールし、初期設定までが完了していること。
・開発環境のresinサーバーが作成されていること。
・e-Builder上にプロジェクトが作成できていて、開発を始めていること。

※プロジェクトの作成方法に関しては以下を参照してください。

https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/create_war/create_project.html

#状況確認
JavaのクラスファイルなどがImportできなくなった時とは以下のような状況のことを言います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/6e4cd184-2b73-55e3-1b53-f738d3d0c190.png)
上記のような赤線がでて「○○が見つかりません。」という表示が出るような状況です。

#対処法
対処法を説明します。あくまでも対処法の一つですので、これで解決しない場合は他の方法を探す必要があります。
###手順
[1.プロジェクトのプロパティを選択](###1.プロジェクトのプロパティを選択)
[2.Javaのビルドパスを選択](###2.Javaのビルドパスを選択)
[3.Accel Platform Libraryを選択した状態で編集をクリック](###3.Accel Platform Libraryを選択した状態で編集をクリック)
[4.すべて「次へ」を押して終了](###4.すべて「次へ」を押して終了)

###1.プロジェクトのプロパティを選択
e-Builderの上の方にあるプロジェクトをクリック、一番下のプロパティを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/db10078d-3f3a-fa63-6049-a97e01fae58c.png)

###2.Javaのビルドパスを選択
Javaのビルドパスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/a1aa5570-5671-cdad-536e-caad1dcd1542.png)

###3.Accel Platform Libraryを選択した状態で編集をクリック
Accel Platform Libraryを選択した状態で、右下にある編集をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/c5dcb949-9b69-4195-d82e-86d1eaf5e110.png)

###4.すべて「次へ」を押して終了
以降出てくる表示はすべてそのまま「次へ」を押してください。最後まで進んだらそのまま「終了」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/731990c1-4904-8405-ff5e-0ad651ea6e4b.png)

もう一度Javaファイルに戻ってみると、赤線は消えて、無事にJavaのクラスファイルなどをImportすることに成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/d3154d69-9166-e8c5-c89e-1174017dc406.png)
#まとめ
以上、JavaのクラスファイルなどがImportできなくなった時の対処法を記載しました。今回の事象は良く起きるみたいです。焦らず対応しましょう。
ROS2におけるメッセージ -common_interfacesの活用

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】

[ROS2のpublisher/subscriber概要](https://qiita.com/NeK/items/bb21b9e24f89f3182d05)にて質問を頂いて色々考える機会をもらったので本ページを作成．感謝．

# 概要
ROS2ノードはメッセージのやり取りによって緩い接続性を実現している．その時，独自メッセージによって自分独自の(プロジェクト独自の)メッセージを実現しても良い．
ただ，よく使用するメッセージは `common_interfaces`にまとめられており，(特にロボットや器械を対象にすると)結構そろっているので活用しない手はない．

使い方は

# common_interfacesの活用
## 種類を確認

[GitHubの公式のcommon_interfaces](https://github.com/ros2/common_interfaces)に色々あるので見てみる．

## 利用
例えば以下のメッセージを利用する場合．

* common_interfaces/sensor_msgs/msg/BatteryState.msg

### インクルードファイル

`#include <sensor_msgs/msg/battery_state.hpp>`

### package.xml
使用するものを追加．

`<depend>sensor_msgs</depend>`

### CMakeLists.txt
使用するものを追加

```text
find_package(sensor_msgs REQUIRED)

ament_target_dependencies(
...
  "sensor_msgs"
...
)
ament_export_dependencies(
...
  "sensor_msgs"
...
)
```

### メッセージでの利用など
メッセージの型を指定して`create_publisher`や`create_subscription`を利用する．
この時の型は以下のようになる．

`sensor_msgs::msg::BatteryState`


## 注意
`std_msgs`は中の注意書きにあるように「とりあえず使う分だから．長期使用には合いません」みたいなことが書いてある．

> The primitive and primitive array types should generally not be relied upon for long-term use.

`primitive`と`primitive array`なので `ColorRGBA`，`Empty`，`Header`は別．
[AWS基礎⑥]　EC2・AMI・SSH・公開鍵認証とは（用語説明）

<h2>初めに</h2>
今回はEC2を始め、周辺に登場してくる用語について学びました。
「EC2」「AMI」「SSH」「公開鍵認証」について用語の解説を行いました。

<h2>EC2とは</h2>
![スクリーンショット 2021-09-22 10.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/203ecb9f-dc70-61cc-957b-2d39b3100783.png)

Elastic Compute Cloud
AWSクラウド上の仮想サーバーです。

<h2>AMIとは</h2>
Amazon Machine Image
サーバーのテンプレートのようなものです。
AMIを用いることで、EC2インスタンスディスク内の
全内容（たとえば、OSやミドルウェア、アプリケーションなど）をバックアップできます。

以下のように作成したEC2サーバーがあり、
それをAMIでテンプレート化したとします。
新しくEC2を作る際にこのAMIを使用すれば、NGINXだったりを新しくインストール、
設定する必要がなく、サーバーのテンプレートを丸っと持って来れてしまうのです。
![スクリーンショット 2021-09-22 10.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/d2c0a0c4-b5d9-610b-f9fe-f40bb55fa90e.png)

<h2>SSHでログインするとはどういうことなのか</h2>
SSHにログインすることで、WEBサーバーを操作できる。（サーバーにログインできる）
![スクリーンショット 2021-09-22 10.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/2ccbde0f-e76f-4c4a-b2f7-c99707fe7ec4.png)

<h3>SSHとは</h3>
「Secure Shell」の略で、ネットワークに接続された機器を遠隔操作し、
管理するための手段です。ポイントはSecure（安全）に！
```通信内容は暗号化されています。```
ログインする側を```SSHクライアント```
される側を```SSHサーバー```と言います。

<h2>公開鍵認証とは</h2>
誰でもサーバーに入れると困るのでサーバーの作成者だけがログインできるように、
SSHログイン時に```公開鍵認証```を行なっています。

![スクリーンショット 2021-09-22 11.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/359586e9-2ab6-e8fe-00b3-d7bc3083b357.png)

公開鍵はサーバーが保有。
```秘密鍵を持っているユーザーのみログイン可能です。```

<h2>終わり</h2>
ServiceNow-Navigationメニューの追加方法

### 簡単なことをかく動機
Self-Serviceのクエリ条件を確認したかったため、navigation menuのレコード情報を見ようとしたら完全に度忘れしていた自分に対する備忘録。

### Step1:テーブルに移動
System Definition > Application Menus
にてsys_app_applicationに移動する。

### Step2:レコードの検索
Titleにself-serviceと入力して対象レコードを絞る
### Step3:レコードの確認
self-serviceの関連リストであるmoduleに「自分の要求」＝My Requestレコードがあるのでそれのクエリ条件を見る。
task テーブルのクエリ条件が下記のもの。

```
&sysparm_fixed_query=sys_idINjavascript:getMyRequestIDs()
あるいは下記
opened_by=javascript:gs.user_id()^EQ
```

user_idの紐づけが当然ある。これを開発、検証、本番とroleが違うところでどう試していくのかは別問題。

以上

参考記事
https://docs.servicenow.com/bundle/rome-platform-user-interface/page/administer/navigation-and-ui/task/t_CreateAModule.html
python初学者の備忘録　文字列型について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 文字列型とは

`基本`

+ シングルクォーテーションまたはダブルクォーテーションで囲む

```python:
>>> print('おはよう') または
>>> print("おはよう")
おはよう
```

+ 「￥n」「”””」で改行

```python:改行例
>>> print('おはよう\nこんにちは\nこんばんは') または
>>> print("""おはよう
こんにちは
こんばんは""")
おはよう
こんにちは
こんばんは
```

```python:コード内での改行例
Greeting = ('おはよう'
 'こんにちは')
# または
Greeting = 'おはよう'\
'こんにちは'

print(Greeting)
# -- 実行結果 --
おはようこんにちは # 出力結果は改行されない
```
+ シングルクォーテーション、ダブルクォーテーションなどのエスケープ

```python
# -- シングルクォーテーションの手前に\を入れる --
>>> print('I can\'t speak English') または

# -- ダブルクォーテーションで囲む --
>>> print("I can't speak English")
# I can't speak English

# -- ダブルクォーテーションをエスケープする場合も同様 --
>>> print('例:"I can\'t speak English"')
# 例:"I can't speak English"
```

+ 改行コードをエスケープする

```python
# -- 文字列の前にr(raw)を入れる --
>>> print(r'C\name\name')
または
# -- \を\でエスケープする --
>>> print('C\\name\\name')
C\name\name
```

+ 数値型と同様に「+」「*」で文字列の連結や繰り返しが可能

```python
>>> print('おはよう' + 'こんにちは')
おはようこんにちは

>>> print('おはよう' * 6)
おはようおはようおはようおはようおはようおはよう
```

#### -- 文字列インデックス --

:::note info
インデックスは0から始まる
:::

```python
>>> 'Minnie'
'Minnie'
>>> 'Minnie'[0]
'M'
>>> 'Minnie'[1]
'i'
>>> 'Minnie'[2]
'n'
>>> 'Minnie'[3]
'n'
>>> 'Minnie'[4]
'e'
>>> 'Minnie'[5]
# 4番目の文字は無いためエラー

# -- [-]は最後から数えた文字数 --
>>> 'Minnie'[-1]
'e'
>>> 'Minnie'[-2]
'n'
>>> 'Minnie'[-3]
'n'
>>> 'Minnie'[-4]
'i'
>>> 'Minnie'[-5]
'M'
```

#### -- 文字列のスライス --

```python
>>> 'English'[:]   
'English' # すべて出る

>>> 'English'[2:5]
'gli' # 3文字目から6文字目まで

>>> 'English'[2:]
'glish' # 3文字目から最後まで

>>> 'English'[:4]
'Engl' # 4文字目まで

>>> 'English'[0:7:2]
'Engl' # 1文字目から7文字目までを2文字飛ばしで
```

##### `2、8、16進数`に変換した際のプレフィックスが必要ない場合にも使える
```python
>>> bin(255)[2:] 
'11111111'
>>> oct(255)[2:] 
'377'
>>> hex(255)[2:] 
'ff'
```

## [文字列型で使用する関数 →](https://qiita.com/dondondon/items/848932f2d1f0dafe050e)

## [文字列型で使用するメソッド →](https://qiita.com/dondondon/items/7537aa8b9b43c8c97792)
2021年に Android 2.3.3 (API 10) のアプリを作ろうとしてハマったところのメモ

罠
--------------------------------------------------
* 一度、最新や新しめの AndroidStudio を入れると、ライブラリのバージョンが上がってしまう。そのため、後から古い AndroidStudio を入れても、最新のライブラリを使おうとして動かないプロジェクトを作成してしまう。
* 古い AndroidStudio で新規作成したプロジェクトでなければならない（という結論に私は至りました）
* `Suggestion: use tools:overrideLibrary="android.support.v7.appcompat" to force usage` とエラーメッセージに出るのですが、それを入れていっても最終的にクラスが定義されていないエラーが出てしまう。


関連エラー等メモ
--------------------------------------------------
### FragmentManagerImpl が見つからないエラー
`java.lang.NoClassDefFoundError: android.support.v4.app.FragmentManagerImpl`

### SDK Versino を落としすぎたときに出たエラー
```
Configuration on demand is an incubating feature.
NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory.  It is currently set to C:\Users\xxxxx\AppData\Local\Android\Sdk\ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.
```


対応方法
--------------------------------------------------
AndroidStudio 2.3.3 で新規作成したプロジェクトの **build.gradle (Module app)** を編集します。
ここに書かれているバージョン情報を下記のように変更します

私は、
* `compileSdkVersion 25`
* `targetSdkVersion 25`
* `compile 'com.android.support:appcompat-v7:25.3.1'`
が対象でした

```gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "31.0.0"
    defaultConfig {
        applicationId "xxx.xxxx.xxxxxxxxxx"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
```
[Flutter] スタイルのcopyWithは良いけどテーマだと気を付けないといけない面倒な話

こんにちは、Flutter赤ん坊です。

今回はたいそう無駄な実験を、しこたま白熱した熱気に包まれたPCファンの音を聴きながら、せっせことこなしました。考えたら当たり前のことを実験するのは、はたして無駄なのかそうでないのか、皆様のご意見にゆだねます。

## 事の発端

テーマを使い回せば良いとはよく言われているのですが、使い回し方がいまいちよくわからない。copyWithで元々あるテーマを使いまわせるのはわかるけど、何かもやっとして色々調べるも、自分で試した方が早いんじゃないかと言う思いにかられ、やってしまいました。

## 試した事

とりあえず一つの要素のみ適用したスタイル３つを設定し、それらをcopyWithとmergeで合成しました。最後に、テーマとしてcopyWithで合成してみました。

```dart
// 単体
final large = TextStyle(fontSize: 30);
final red = TextStyle(color: Colors.red);
final line = TextStyle(decoration: TextDecoration.lineThrough);

// スタイル合成
final copy = large
    .copyWith(color: Colors.red)
    .copyWith(decoration: TextDecoration.lineThrough);
final merge = large.merge(red).merge(line);

// テーマ合成
final copyTheme = ThemeData(textTheme: TextTheme(headline1: large))
    .copyWith(textTheme: TextTheme(headline1: red))
    .copyWith(textTheme: TextTheme(headline1: line));
```

これらを以下のコードで表示します。

```dart
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text("--- 単体 ---"),
    Text("large", style: large),
    Text("red", style: red),
    Text("line", style: line),
    Text("\n--- スタイル合成 ---"),
    Text("copy", style: copy),
    Text("merge", style: merge),
    Text("\n--- テーマ合成 ---"),
    Text("copy theme", style: copyTheme.textTheme.headline1),
  ],
)
```

## 結果

![スクリーンショット 2021-09-22 10.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2001849/50b28bef-0fcc-b9ed-cf59-7619c92c26e4.png)

スタイルのみをcopyWithやmergeしたものは、いずれもうまく合成できています。一方テーマをcopyWithしたものは、最後のスタイルのみ適用されていますね。

以上のことから、本気でテーマを合成しようとしたら、スタイル一つ一つに対してcopyWithやmergeをかけないといけないようです。実に面倒臭い事実に気付いてしまったわけですが、もやっとが解消されたので良かった事にしておきます。

以上です。夏が終わりに近づいていますが、ごきげんよう。
ABC115 C - Christmas Eve を楽しんだ

https://atcoder.jp/contests/abc115/tasks/abc115_c

![abc115_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/423def45-a556-314f-0b8d-a6371557cd91.png)
![abc115_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/4b643e69-99f9-ec74-4c42-bd561a4eff5f.png)
![abc115_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f5597b54-df07-636c-8225-97ba26e26f5d.png)

hmax, hmin の差を min にするのであれば、
木を並べ直した方が良いと思った。

次に k 本ずつ hmax - hmin の差が最小になる組み合わせを探した。

```ChristmasEve.py
n,k = map(int,input().split())
H = []
for _ in range(n):
    h = int(input())
    H.append(h)
H.sort()
ans = float("inf")
score = 0
for i in range(n-(k-1)):
    score = H[i+k-1]-H[i]
    if ans > score:
        ans = score
print(ans)
```
オムニチャネルおよびスキルベースのルーティング




[Omni-channel and skills-based routing](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000CglIx)


クライアントにも同様のコンセプトがありました。きれいではありませんでしたが、うまくいきました。これが私たちがしたことです：

+ スキルを 2 つに分割しました (例: スキル 1 は T1 スキル 1 と T2 スキル 1 の 2 つに分割されました)。
+ フローを介してケースをルーティングしました。このフロー内に、選択した製品と必要なその他の情報をチェックする数式変数がありました。
+ ケースに正しいスキルを付けるために決定木が作成されました。

[オムニチャネル フローを使用すると、要件を組み込むことができる場合があります。](https://help.salesforce.com/s/articleView?id=sf.omnichannel_flows.htm&type=5)
[Xcode]iOS15アップデート後にシミュレーターのスプラッシュ画面でフリーズするバグの対処法

## 投稿の経緯
`iOS15`へアップデート後にXcodeでデバックすると、**スプラッシュ画面でアプリが動かなくなる症状**が発生しました。２,３分待機していると動き始めるが、遅すぎる。仕事にならない。。

色々調べて対処法へたどり着いたの共有します。

## 環境
macOS BigSur バージョン 11.6
Xcode バージョン 13.0

## 対処法
**【結論】**
Developerディレクトリー内のフォルダを削除することで解決します。

👇以下削除対象。

**DerivedDataディレクトリ** 👈 本命①
~/Library/Developer/Xcode/DerivedData

**iOS Device Logsディレクトリ**
~/Library/Developer/Xcode/iOS Device Logs

**iOS DeviceSupportディレクトリ**
~/Library/Developer/Xcode/iOS DeviceSupport

**Devicesディレクトリ** 👈 本命②
~/Library/Developer/CoreSimulator/Devices

※Devicesディレクトリを削除した場合は下記コマンドでDevicesを再構築してください。

```
 xcrun simctl erase all
```

これらを削除して、ビルドすると解消されていると思います。参考にしてください！

## お知らせ
現在、iOS開発案件を業務委託で募集中です（副業）。[TwitterDM](https://twitter.com/ken_sasaki2)でご依頼をお待ちしています
Webスクレイピングツール５選 | Webクローラーを簡単評価(3)

元記事：https://jp.scrapestorm.com/tutorial/5-web-scraping-tools-easy-evaluation-of-web-crawlers-3/
Webスクレイピングツールは、Webサイトで必要な情報を取得するように開発されています。今回は五つのWebスクレイピングツールを紹介します。
##1) ScrapeStorm
ScrapeStormとは、強い機能を持つ、プログラミングが必要なく、使いやすく人工知能Webスクレイピングツールです。違う基盤のユーザーに二つのスクレイピングモードを提供し、1-Clickで99％のWebスクレイピングを満たします。ScrapeStormにより、大量のWebデータを素早く正確的に取得できます。手動でデータ抽出が直面するさまざまな問題を完全に解決し、情報取得のコストを削減し、作業効率を向上させます。
**特徴：**
・インテリジェントな識別
・自動エクスポート
・データ処理と重複排除
・ファイルのダウンロード
・スケジュール機能
・IPローテーションとキャプチャーの識別
・RESTful APIおよびWebhook
・EコマースのSKUと大きな画像を自動識別できる
・日本語サービスを提出する
リンク:https://jp.scrapestorm.com/
![1.ScrapeStorm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/3301d0cc-510a-800f-fbe7-ea4bf890f535.png)
##2) Scraping-Bot
Scraping-Bot.ioは、URLからデータをスクレイピングするための効率的なツールです。
スクレイピングのニーズに合わせたAPIを提供します。ページのRawHTMLを取得するための通用API、小売Webサイトのスクレイピングに特化したAPI、不動産Webサイトから物件リストをスクレイピングするためのAPIです。
**特徴：**
・JSレンダリング(Headless Chrome)
・高品質のプロキシ
・ページのHTML
・最大20の同時リクエスト
・ジオターゲティング
・基本プランの一ヶ月無料トライアル
リンク:www.scraping-bot.io
![2.Scraping-Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/4103a95b-dc84-5845-68b8-89e33d09eec4.png)
##3) PareseHub
ParseHubは、無料のWebスクレイピングツールです。 必要なデータをクリックするだけでデータを簡単に抽出できます。 分析のために任意の形式でスクレイピングしたデータをダウンロードできるデータスクレイピングツールの1つです。
**特徴：**
・データをダウンロードする前にテキストとHTMLをクリーンアップできる
・使いやすいインターフェイスがある
・サーバーで保存されたデータを抽出できる
リンク:www.parsehub.com
![3.PareseHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/3ab7551a-5bb4-19de-8c09-39bb72caa2fa.png)
##4) Scrapestack
Scrapestackは、リアルタイムのWebスクレイピングRESTAPIです。2000以上の企業は、Scrapestackを使用して、apilayerによって支持されるこの専用APIを信頼します。scarestack APIを使用すると、素早くWebページをスクレイピングし、数百万のプロキシIP、ブラウザー、CAPTCHAを処理できます。
**特徴：**
・3,500万を超えるデータセンターとグローバルIPアドレスを使用できる
・100以上のグローバル位置にアクセスして、Webスクレイピングリクエストを発信する
・APIを同時にリクエスト可能
・CAPTCHA解決とJavaScriptレンダリングをサポートできる
リンク:www.scrapestack.com/
![4.Scrapestack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/7f200a0d-d47f-e703-9506-f151c005d4a1.png)
##5) Scrapingbee
Scrapingbeeは、ヘッドレスブラウザとプロキシ管理を処理するWebスクレイピングAPIです。WebページでJavascriptを実行し、リクエストごとにプロキシをローテーションできるため、ブロックされることなくオリジナルHTMLページを取得できます。また、Google検索スクレイピング専用のAPIもあります。
**特徴：**
・JavaScriptレンダリングをサポート
・自動プロキシローテーション
・Googleスプレッドシートで直接使用できる
・Amazonのスクレイピングに役立つ
・Google検索スクレイピングをサポート
リンク:www.scrapingbee.com
![5.Scrapingbee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/04d34ed6-4635-651d-34e2-91d9d8734d25.png)
uSURVIVALというアセットを使った所見

https://assetstore.unity.com/packages/templates/systems/usurvival-multiplayer-survival-95015?locale=ja-JP

uSURVIVALを使っている最中の感想です。
私はサーバ実装の知見が無いため、これを使えばイケる！と意気揚々でしたが。

# 感想
アイテムを増やしたりステータスを変えたりと、用意されたテーブルをいじるだけなら楽にでき、
機能を増やしたりしたくなるとまずコーディングの突貫ぶりが気になってくる。といったところです。
試作品やミニゲーム向けで、長期保守していくレベルの製品には不向きな印象を受けました。

個人的にはミニゲームレベルでもそれなりに手を加えました（今後のアップデートをマージする気が起きません）。
作りたいゲームシステムによってはそのままで良い可能性もありますが、そうはなりませんでした。
なんというか、uSURVIVALというよりSurvival Game Starter Kitです。

# 機能
私はこの手のゲームをあまりしないのですが、アークサバイバルやポータルナイツなどに近い機能構成です。
ログイン時にキャラクターを作成し、そのキャラクターでゲームに入ります。
切断した時点のステータスや位置情報がデータベースにセーブされ、次のログイン時はそこから開始します。
アドオンとしてPUBGのようなダメージドーム機能も入っています。

任意のモデル差し替えは難しくないのですが手順が多いので自分でエディタ拡張を書くことになると思います。
キャラクターの初期ステータスやデフォルト所持アイテムはプレファブ自体をいじって設定する形式なので、
これも設定ファイル形式に修正した方が無難です。

他にできることは、

- サーバのみの起動
- サーバ兼クライアントとしての起動
- ローカル又はグローバルなサーバへの接続
- キャラクター作成と削除
- 装備
- 装備品の耐久度
- アイテムドロップ
- クラフト（アイテムを合成）
- クラフトの成功率設定
- かまど（アイテムの強化装置みたいな）
- インベントリ（使用や入れ替えが可能）
- アイテムボックス（使用できず入れ替えのみ可能）
- FPS視点（目玉などのオブジェクトを非表示にする）
- 扉の開閉(閉めると敵が入れなくなる)
- リロード
- リスポーン
- 武器に応じた構えや攻撃
- サブ武器を肩や腰に背負う
- 水面を泳ぐ
- 足音
- 独自のステータスの追加
- ステータスのフロー（酸素が尽きると代わりにHPが減る）

※一部Mirrorと被る機能があるかもしれません。

# 仕様としての注意
味方同士に攻撃が当たります。

インタラクトする判定に距離は使わず、すべてレイキャスト(線)で取っています。
よってTPS視点ではカメラ位置を調整しないと操作しづらいです。

フィールド上のアイテムを一度取ってゲームをプレイしなおすと、そのアイテムが同じ場所に復活しています。
これはリスポーン設定をオフにしても一緒です。
避けたい場合は最後に取ったサーバ時間を読み書きする判定処理などの対応が必要です。

エイペックスのようにバトル開始前にキャラクター選択する構成ではありません。
やるならMirrorのサンプルにあるようなルーム機能を織り交ぜますが、このアセットの趣旨と違うような気がします。

キャラクター作成時に同名は使えません。
デフォルトではキャラクターを削除した後にその名前で再度作成もできません。
データベースを見るとレコードのdeletedのフラグが立つだけでテーブルから削除はしない作りになっています。
これはクエリを書き換えれば簡単に変更できますが、
キャラ情報をユーザが即座に抹消できるような機能は危険です。

# 設計としての注意
すべてが１シーンで完結しているので、タイトルシーンやステージシーンが必要なら手を加える必要があります。

メモリ管理のお約束に則っていません。
毎フレームnewしている箇所があります。
毎フレームGetComponent()やSetActive()やGetComponentInChildren()やAddListener()をしている箇所があります。
イベント駆動ではなく、Updateループ内で毎フレーム状態のクリアと更新をする設計思想が見受けられます。

SendMessageを使っている箇所があります。

UnityEventをインスペクタで多用しています。

プレイヤーオブジェクトに大量の機能コンポーネントがアタッチされています。
当然、ゲームによっては必要ない機能もあるわけですが、
単純にオンオフできず、削除するだけではnullエラーになります。
中身を弄りたくなければ「酸素量」や「体温」などのUIを非表示にして解決することになります。

uSurvivalに入っているMirrorを削除してgithubから最新のMirrorを落としてきたら参照が壊れます。
ちなみに参照が狂うのはNetworkIdentify、NetworkStartPositionなどです。付け直せば解決します。

linqの一部は重いからこっちの形で実装する！といった親切なコメントが書かれています。

WebGLの場合、付属しているjslibのメソッドが旧式のためそのままでは100%エラーが発生します。
Pointer_stringfyやRuntime.dyncallなどです。エディタ起動では正常動作するため要注意です。

攻撃時、サーバでレイキャストを取ってクライアントでもレイキャストを取る処理があります。
サーバ側ではダメージ処理を、クライアント側ではサウンドやエフェクトの発生に使うようです。
見た目では当たってるのに内部では当たっていないケースが起こりえます。

そのうち修正されそうですが、サーバーオンリーモードだとプレイヤーの座標が更新されず、攻撃が当たらないバグがありました。

サンプルシーンに出てくるゾンビは倒れるだけで非アクティブにはなりませんが、
~~Unityのレイキャストは非アクティブなオブジェクトにも当たるので、仮に死んだ敵を非アクティブにしても当たります。~~**自分で何を書いているのか分からないので要検証です。**
これを防ぐにはレイキャスト後に非アクティブなオブジェクトを除外するか、レイヤーを変える手段があります。



Inputクラスがそのまま使われているのでどこで何の入力判定を行っているのか一目で分かりません。

# 最後に
市販アセットの欠点は「買うまでスクリプトの中身が分からない」ことだと思います。
しかし作者が内部の話を未購入のユーザーに上手く伝えるのも難しいことは理解しています。
スチームみたいに2時間以内なら返金するサービスもありえないので、レビューを頼るかこうして情報交換するのが望ましいと考えています。

以下のようなレビューがすべてを物語るわけではありませんが、少なからず気持ちは分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703909/e926caf9-978e-b707-3fda-0adffa60e8d7.png)
Fundamental Statistics for Data Science (Part 03)

This article is a continuation of [Fundamental Statistics for Data Science (Part 02)](https://qiita.com/qualitia_cdev/items/0bd5a50a73099e5384b1).

8) Covariance
Covariance measures the relationship among two random variables. Let's assume that we have two random variables, A and B. Where respectively E(A) and E(B) represent the means of the A and B.

![cov.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579376/bab3ee34-3156-ae00-8a96-b25de08ffc11.jpeg)

Covariance values can be 0, positive or negative.  A negative value indicates the variable varies in the opposite direction, and if the value is positive, two random variables vary in the same direction. And if the value is 0, then the variable not varies together.

```cor_var.py
import numpy as np

a = np.array([2,4,7,8])
b = np.array([-1,-2,-4,-7])

ab_cov = np.cov(a,b)
print(ab_cov)
```

9) Correlation

This also measures the relationship between two random variables.  Correlation coefficients values reside between -1 to 1. Correlation of variable with its self always 1. Cor(A, A) = 1 . And also, it is critical to remember even there is a correlation between two random variables, it's not necessary to change one variable cause to change the other. There might be another variable that causes both variables to change.

we can calculate the correlation coefficient by, 

![cor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579376/0d8af2ad-a429-1fb4-abb7-6e63f610647f.jpeg)


```cor_var.py
import numpy as np

a = np.array([2,4,7,8])
b = np.array([-1,-2,-4,-7])
corr = np.corrcoef(a, b)

print(corr)
```
There are different correlation calculation methods  such  as;
- pearson
- spearman
- kendall


Some example that we use correlation.
- How the height of soccer players is correlated to their shooting strength.
- Is there any relationship between employee work experience and salary.

In the next part, lets' talk about probability distribution functions.

*本記事は @qualitia_cdevの中の一人、@nuwanさんが書いてくれました。
*This article is written by @nuwan a member of @qualitia_cdev.
サポートが切れたCentOS6でyumを使う方法

執筆時点の日付は2021/09/17です。
CentOS6でyumが使用できずググって参考サイトにたどり着きました。
CentOS6のサポートが切れていることでyumを実行できない状態でした。
サイトを参考にリポジトリ設定ファイルを修正した流れをメモします。
参考サイトだと設定ファイルが3つありましたが、自分の環境だと1つだけでした。

# リポジトリファイル修正前に出ていたエラー

```
# yum list installed postfix
読み込んだプラグイン:fastestmirror
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
エラー: Cannot find a valid baseurl for repo: base
```

# yumリポジトリファイルを編集
念の為、ファイルのバックアップを作成します。

```
# cd /etc/yum.repos.d/
# cp CentOS-Base.repo CentOS-Base.repo.org
```

## 編集手順

```
# vi /etc/yum.repos.d/CentOS-Base.repo
```

Base、Update、Extras、Plus、Contribそれぞれにおいて同じ箇所を修正します。
主な修正箇所は各3箇所あります。

- mirrorlistをコメントアウト
- baseurlのコメントを外す
- baseurlの`mirror.centos.org`を`vault.centos.org`

### 修正前の例

```
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
```

### 修正後の例

```
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
```

### vimで置換する場合のコマンド

```
:%s/mirrorlist/#mirrorlist/g
:%s/#baseurl/baseurl/g
:%s/mirror.centos.org/vault.centos.org/g
```

修正後、再度`yum`を実行し動作することを確認しました。

以上です。

# 参考にさせてもらったサイト
https://trios.pro/centos6-yum-support-end/
フロントエンド初心者でもReactは簡単？Reactの文法を学んでみた～序章～

自社開発企業でWebアプリケーションエンジニア（※名前はいろいろあるので都合よく解釈してください）、Webアプリのうち各サブシステムを開発しているエンジニアです。

今回はReactという最近流行りのモダンなJavaScriptのフレームワークを学んでみたということで、
そもそもJavaScriptもそんなに詳しくないので（多少は書ける）、興味本位でProgateを使って学んでいきます。

※なお著作権等に引っかからないよう、文法的な書き方部分だけ抜粋していく感じ(Re-Write)で行こうと思います。

参考

https://prog-8.com/courses/react

#Hello World

```react
import React from 'react';

class App extends React.Component {
  render() {
    return (
      <h1>Hello React</h1>
    );
  }
}

export default App;
```

- Reactからreactをimportする
- React.Componentをextendsしたクラスを実装
- renderメソッドのreturnでHello Worldを記述
- export でクラスをexportする

# JSX 

```react
import React from 'react';

class App extends React.Component {
  render() {
    return (
      <div>
          {/*コメントはこのように書く*/}
          <h1>Hello World</h1>
          <p>一緒にReactを学びましょう！</p>
      </div>
    );
  }
}

export default App;
```

- returnは1つの要素である必要がある（上の例の場合divタグがないとエラう）
- コメントは{/**/}で書くことができる

# imgタグ

```react
import React from 'react';

class App extends React.Component {
  render() {
    return (
      <div>
          <img src="https://XXXX.com/yyyy.png"/>
      </div>
    );
  }
}

export default App;
```


- 閉じタグがない
- タグの終わりにスラッシュ/を入れる

# JSXにJSを埋め込む

```react
import React from 'react';

class App extends React.Component {
  render() {
    //JSX領域の外のコメントはこう書く
    const text = 'Hello World';
    return (
      <div>
          {text}
      </div>
    );
  }
}

export default App;
```

- 中括弧{ }でくくることでJSX領域にJSをかける
- returnの中がJSX領域


#イベント（ボタンをおすとコンソールログを吐く）

```react
import React from 'react';

class App extends React.Component {
  render() {
    return (
      <div>
           <button onClick={()=>{console.log('表示切替')}}>表示切替</button>
      </div>
    );
  }
}

export default App;
```

-ボタンにイベント名を指定し、そこにアロー関数（ES6）を実装

#イベント（画面の表示名称を変える）

```react
import React from 'react';

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {name: 'World'};
  }
  
  render() {
    return (
    	<div>
          <h1>hello {this.state.name}!</h1>
          <button onClick={() => {this.setState({name:'React'})}}>表示切替</button>
    	</div>
    );
  }
}

export default App;
```
- stateをコンストラクタで定義し初期値を代入しておく
- returnの中にはstateのnameが入るようにしておく
- アロー関数ののなかに実行したい処理を書く（今回はWorld→Reactに変える）
- this.state = {name:''React}と書いてはいけない（らしい）のでsetを使う



#メソッドに切り出す

```react
import React from 'react';

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {name: 'World'};
  }
  
  handleClick(name){
    this.setState({name:React});
  }

  render() {
    return (
    	<div>
          <h1>hello {this.state.name}!</h1>
          <button onClick={() => {this.handleClick('React')}}>表示切替</button>
    	</div>
    );
  }
}

export default App;
```
- ES6と同様にメソッドを実装する
- onClickでやっている内容をそのまま転記
- 引数を利用して共通化
- 呼び出すときはthisをつける


#最後に

現時点では、直感的というか簡単な気がする。
ただES6（＆そもそものJavaScript）を知らないと、ちと苦戦するかもね。
**※HTMLは大前提**

次回は[フロントエンド初心者でもReactは簡単？Reactの文法を学んでみた～２章～](https://qiita.com/soepy/items/432d22d19093a1ddfd58)
coc.nvimを使用するとCPU使用率が上がる問題

coc.nvimのおかげでvimの開発体験が大きく向上したのですが、よくPCのファンが全力で回ることが気になっていました。
nodeのCPU使用率が100%を超えて160%や190%になるという..

ネットで検索すると大きいファイルを開いた際やnodeのバージョンが古い場合に同じ現象が起きるという情報は見つかったのですが、今回のケースには当てはまりませんでした。

他のプラグインとの組み合わせやvimrcの問題かと思って色々試したのですがなかなか改善しません。

そんなとき、ファイルの開き方によって問題が発生するかどうかが変わることに気が付きました。
vimを開いた後ファイルを読み込むと発生し、ファイルを直接vimで開いた場合には発生しません。

そのあたりをきっかけに、coc.nvimのワークスペースという概念について記載されたページを見つけました。
https://github.com/neoclide/coc.nvim/wiki/Using-workspaceFolders
どうやら多くのファイルが含まれた、高すぎる位置のパスがワークスペースとして認識されると負荷が高まるようです。

`:CocList folders` コマンドで現在のワークスペースが確認できます。

特定のパスをワークスペースとして認識しないようにする設定を行ったところ無事に問題が解決しました。

https://github.com/neoclide/coc.nvim/blob/master/doc/coc.txt

> - "ignoredRootPaths": Absolute root paths that language server should
not use as rootPath, higher priority than rootPatterns.

`:CocConfig` の設定例

```
{
    "languageserver": {
        "intelephense": {
            "command": "intelephense",
            "args": ["--stdio"],
            "filetypes": ["php"],
            "initializationOptions": {
                "storagePath": "/tmp/intelephense"
            },
            "ignoredRootPaths": ["~", "/project"]
        }
    }
}
```

拡張機能でignoredRootPathsを設定する方法が分からなかったので、以下のページを参考に直接intelephenseを設定しています。
https://qiita.com/Yoika/items/efbbcfe5e609d70319a2

今までこの問題が原因で何度もcoc.nvimを入れては消しを繰り返していたのですが、これで安心して使い続けられそうです。
OpenSSL のコマンドで証明書の情報確認

# はじめに
テスト環境とかに組み込んだ SSL 環境で「Server certificate chain verification faild and the CA is missing」とか言われて時に、証明書の確認を行うが、そのときに OpenSSL のコマンドを利用していろいろ確認する。

だた、この OpenSSL のコマンド(引数) をすぐに忘れるので備忘録を残しておく。


# 証明書の期限確認

実行コマンド

```bash
openssl x509 -noout -dates -in  ＜証明書ファイル＞
```

コマンド例

```bash
# サーバ証明書
openssl x509 -noout -dates -in  newcert.pem
notBefore=Sep  6 06:17:24 2019 GMT
notAfter=Sep  5 06:17:24 2020 GMT

# CA証明書
openssl x509 -noout -dates -in  cacert.pem
notBefore=Sep  6 06:02:19 2019 GMT
notAfter=Sep  5 06:02:19 2022 GMT
```

# 証明書が組み込まれたサーバ(サービス) の証明書有効期限確認

コマンド例 

```bash
openssl s_client -connect ＜ホスト名＞:636 | openssl x509 -noout -enddate
depth=1 C = XX, ST = XX, O = XX, OU = XX, CN = XXXXXXX
verify error:num=19:self signed certificate in certificate chain
notAfter=Sep  5 06:17:24 2020 GMT
```

SMTP の場合は以下のオプション付き

```
openssl s_client -connect ＜ホスト名＞:25 -starttls smtp | openssl x509 -noout -dates
```

# 証明書内容の確認

実行コマンド

```bash
penssl x509 -text -noout -in ＜証明書ファイル＞
```

コマンド例

```bash
penssl x509 -text -noout -in newcert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            a9:6f:0b:e9:0f:57:31:f7
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=XX, ST=XXXX, O=XXXX, OU=XXX, CN=XXXXXX
        Validity
            Not Before: Sep  6 06:17:24 2019 GMT
            Not After : Sep  5 06:17:24 2020 GMT
        Subject: C=XX, ST=XXXX, O=XXXX, OU=XXX, CN=XXXXXX
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                     :
                     :
                     :

```

# サーバ証明書と秘密鍵のセットか確認

サーバ証明書の内容表示

```bash
openssl x509 -noout  -modulus -in  newcert.pem
Modulus=XXXX.....
```

秘密鍵の内容表示

```bash
# openssl rsa -noout  -modulus -in  newkey.pem
Enter pass phrase for newkey.pem:XXXXXXXXXX
Modulus=XXXX....
```
【RSpec】expected `User.count` to have changed by 1, but was changed by 0というエラーの解決方法


#対象者

* タイトル記載のエラーに苦しんでる方
* RSpecテストのコードを書いている方


#目的

* エラーを解決して、テストを正常に稼働させる

#実際の手順と実例
###1.前提と現状

![スクリーンショット 2021-09-21 21.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/ce96bf4f-b8a5-fbf8-131c-3a6a1e50f900.png)

ユーザーの新規登録が成功するかどうかのテスト実行時にこのようなエラーがでました、、、

直訳すると

````
User.count "が1だけ変化したと思ったら、0だけ変化していた。
````
　
推測すると新規登録が正常に行えず、Userが１人増えなかったということだと思いました。

該当ソースコードは以下の通り

`````spec/system/before_login_spec.rb 
  describe "ユーザー新規登録のテスト" do
      before do
        visit new_user_registration_path
      end

　　　　　　（中略）

　　　　　　　 context "新規登録成功のテスト" do
        before do
          fill_in "user[name]", with: Faker::Lorem.characters(number: 10)
          fill_in "user[email]", with: Faker::Internet.email
          fill_in "user[password]", with: "password"
          fill_in "user[password_confirmation]", with: "password"
        end

        it " 新規登録が正しく実行される" do
          expect do
            click_button "登録する"
          end.to change(User, :count).by(1)
        end
     end
  end
`````

###2.結論（解決策）

**バリデーショをチェックすること**

単純なミスでした、、、、、
バリデーションにひっかかっていたために新規投稿が成功せずにエラーを吐いていたので、バリデーションを見直すと解決できると思います。



###3.原因

私の上記例で例えると、
新規登録時に２文字以上のnicknameが必須項目になっていたので、前提の条件（before ~ end ）に

```
fill_in "user[nickname]", with: Faker::Lorem.characters(number: 10)
````
を追加して解決できました。

#参考にさせて頂いた記事

* [RSpec - change の基本動作。 ( by / from / to の使い方 )](https://qiita.com/Yinaura/items/62dc0d87f968f43e335b)
* [【RSpec】ユーザーの新規登録について結合テストを行う時に意識すること](https://qiita.com/H-Iida/items/e849078181cb56147d96)