OmniAICreator/Qiita-1.07M huggingface dataset:
scrapyのsettings.pyに記述した方が良いこと

scrapyでスクレイピングする際、settings.pyで色々設定を変えることができます。
まずspiderのソースコード書き始める前に、これは設定変えておいた方が良いというものの覚書です。

#### 追記するもの
###### 文字コードを変更して文字化けを防ぐ
`FEED_EXPORT_ENCODING = 'utf-8'`を追記しておく。
スクレイピングして出力してきた文字コードを指定しないと文字化けするかもなので。

#### 既存の記述のコメントアウトを外すもの
ちなみにコメントアウトを外すには、センテンスを選択して`command + K + U`
コメントアウトをつけるには、`command + K + C`

###### ページダウンロードの間隔を設定する
`DOWNLOAD_DELAY = 3`のコメントアウトを外す
**多分かなり重要**
ページをダウンロードしてから次のページのダウンロードするまで3秒待って負荷を軽くしろという意味
これやってないと、スクレイピングしたいサイトに迷惑がかかる

###### robots.txtに従うか決める
```
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
```
これはrobots.txtの記述に従うかって話。

###### 取得した言語を日本語にする

```
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'ja',
}
```
言語に関して。
初期設定では、`'Accept-Language': 'en'`ってなってるので`ja`に変更する。
これをしないと取得した要素が英語になる。

###### ダウンロードしたページのキャッシュを保持させる設定

`HTTPCACHE_ENABLED = True`
ダウンロードしたページをキャッシュデータとして持っておく
スクレイピングが難しいので何度もエラーを解消しようとコードの書き換えする場面もあるので、毎回ダウンロードして処理に時間がかからないように。

`HTTPCACHE_DIR = 'httpcache'`
キャッシュを持っておくディレクトリ名を指定

`HTTPCACHE_EXPIRATION_SECS = 86400`
キャッシュを保持しておく秒数
86400秒（＝1日）経ったら、キャッシュに頼らずダウンロードし直す
ページが更新されてしまったらスクレイピングする値も変わってしまうので、変更の頻度に合わせて変える

###### User-Agentの変更
`USER_AGENT =`
httpリクエストを送った時のUser-Agentの値を変更する
スクショに貼ってあるのは、普通のユーザーとしてWebページを閲覧する時に送られるリクエスト。
Scrapyのbotがリクエストを送るとUser-Agentに「scrapy〜〜」みたいな値が入るらしい。
webページによっては、「このリクエスト、人間じゃなくてスクレイピング目的のクローラーだな。アクセス禁止してやる！」みたいな作りにしてるものもあるらしい。

![スクリーンショット 2022-03-06 16.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048531/c5a74aab-23ab-a2a6-fb1b-ce096c7154cf.png)
[仕事効率化] Macの単語変換, smart quotes無効化を設定した

日曜日の昼下がりに細い設定をした。
個人的な雑メモです。
(ちなみに、mac, alfred, google docs, miro の話が入り混じってます)


## macの設定で絵文字の変換をできるようにした

理由は二つ
- 変換を早くしたい
- アイコンの意味を自分なりに統一したい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/0e6e3b28-18b7-41bb-56ce-2419c8a7b6ab.png)
(🎉 = party popper -> popper にした)

メモ
- 変換がsuggest表示されるので、tabを押して変換する
- google doc 上だとsuggestが出ない、、、、、
  - google docsだと、`Tools > Preference > Substitution` から設定する[他ない](https://support.google.com/mail/thread/13641261/text-substitutions-on-mac-os-safari-chrome-not-working-i-g-suite-gmail?hl=en)かも？





## mac、google docsそれぞれで、smart quotes を無効化した

macでは、右下のチェックを外した。[ref](https://bear.app/faq/How%20to%20disable%20smart%20quotes%20and%20dashes/#:~:text=Disable%20smart%20quotes%20on%20Mac&text=Mac%20users%20can%20also%20disable,Use%20smart%20quotes%20and%20dashes.%E2%80%9D)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/685b6fd0-8691-860f-642a-68271693721f.png)


google docsでは、`Tools > Preferences > General`
Mac初期化したからとりあえずHomebrewインストールする

# Mac初期化したからとりあえずHomebrewインストールする
そろそろ四月です。
春がやってきます。
初期化の季節です(?)。
私学生、初期化しても特に影響無いので結構初期化しちゃいます。
そんなこんなで今回も初期化したのでHomebrewのインストールからやっていきます。
ついでにちゃんとやり方も記事にして説明しましょという感じですね。

## Macの環境
プロセッサだったりOSだったりの情報は以下です。
### ハード情報
![環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/2ff86778-97d4-006e-9a1f-83ba6ed993f5.png)
- MacBook Pro(2018年モデル)
- Intel プロセッサ

### ソフト情報
- MacOS Monterey
- シェルはzsh
- ほぼ初期化した状態でChromeやらだけ入れた

## Homebrewインストール
とは言っても公式サイトに書いてあるやつを実行するだけなんですが。。。
https://brew.sh/
```zsh:zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

メインで``/bin/zsh``使ってるけど``/bin/bash``でいいのかなとか思ってたけど問題ないんですね。

![brew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/0ae812ed-be1f-e1c5-851b-ef0a0febe6bb.png)

こんな感じで``Install successful!``と出たら完了です！

![brew_doctor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/8bf769f5-4da0-8400-65f0-73c5c5110af8.png)

``brew doctor``でもしっかりインストールできていることを確認できますね！

:::note info 
**追記**
ターミナルのユーザー名とホスト名の表示を
```zsh:zsh
ユーザー名@ホスト名 ~ % 
```
から
```zsh:zsh
~ % 
```
に変える方法は[こちら](https://qiita.com/yosyosyoyoyo/items/f72d2df0deb120cf1e5f)を参考にしました。
:::

## おわりに
いかがでしたかね？私の環境では特に問題は起きていないので大丈夫だとは思いますがちゃんとできていれば嬉しいです。

実は初投稿なのですが定期的に記事を作成できるように頑張ります。
【React】本番環境にデプロイして画面が真っ白になった時の解決方法

初めまして！
外語大生フロントエンドエンジニアのジャックです。
今まで記事を閲覧することしかしていませんでしたが、この度、Qiitaを初投稿することにしました！

初投稿ですのでお見苦しい文章かもしれませんが、暖かく見ていただけると嬉しいです。
よろしくお願いします:bow_tone2:

# 前書き

ReactでSPAを初めて作り、デプロイした時に画面が真っ白になって数時間ハマってしまいました。
これから書く解決方法は中々見つけることができなかったのでReact初心者の人が同じ現象に遭遇した時に参考にしていただけると幸いです。

# 現象

npm startでローカル環境では正常に描画されてるけど、npm run buildして本番環境にアップすると画面が真っ白になってしまう。

# 解決方法その1


`package.json`を開き、`"homepage": "./",`を追加するだけ。

```json
{
  "name": "helpmeeeal",
  "version": "0.1.0",
  "private": true,
  "homepage": "./",
```

どうやらビルド後のパスが合ってなかったみたい。。

# 解決方法その2

だいたい`解決方法その1`のやり方で真っ白になってしまう問題は解決できるっぽいのですが、僕はこれだけでは正常にデプロイすることができなかった。。
調べても`解決方法その1`のやり方ばかり出てくると思います。
僕と同じようにまだ解決できない方は以下の方法を試してください！


こちらのコードを

```react
import { useState } from "react/cjs/react.development";
```
こちらに変換
```react
import { useState } from "react";
```

これをやっただけで真っ白問題は解決できました。

## 原因

どうやら`vs code`の自動補完機能で`useState`を補完したのが原因でした。
`useState`だけでなく`useEffect`や`Recoil`など、他の`import文`も一度確認してみるといいかもです。

# 最後に

最後まで読んでいただきありがとうございました。
Reactを勉強し始めた方や駆け出しエンジニアの方はなんで真っ白になったかわかんないですよね。。笑
僕もまだまだ勉強中なのでよければ[Twitter](https://twitter.com/Jackpackeeer "Twitter")つながりましょー！
フォローしていただけると嬉しいです:boy_tone1:
【パブリッシャー】レポートに他のレポートへのリンクを貼ってみる

この記事では、概要レポートの各行に他のレポートへのリンクを貼ってみます。
リンク作成にはExpression(拡張表現)を使用します。リンク先のレポートは、概要レポートの対象行の詳細を表示します。
つまり、概要レポートと詳細レポートを用意することになります。
早速、Sharperlightアプリケーションメニューから **[Sharperlight](https://sharperlight.jp/)パブリッシャー**を起動します。
## 詳細レポートの準備
[新規]ボタンでレポート編集用ダイアログを開きます。**グループ**、**コード**、**タイトル**、**レポートのタイトル**を入力します。
![3022-03-13 Figure 05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a6e64603-8ab0-46e2-ec77-f9a5835bc0ae.png)
[クエリーを編集]ボタンで[クエリビルダ]を開きます。このようなクエリを作成します。
フィルターに設定されている売上日(年/月)と製品分類名で表示する詳細なデータを絞り込みます。
![3022-03-13 Figure 04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/36d2d4ec-aa5a-48e1-daf2-2713eac9d50b.png)
[OK]ボタンでクエリを保存し、さらに[OK]ボタンでレポートも保存します。
## 概要レポートの準備
この概要レポートがリンク元のレポートとなります。
[新規]ボタンでレポート編集用ダイアログを開きます。**グループ**、**コード**、**タイトル**、**レポートのタイトル**を入力します。
![3022-03-13 Figure 06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6a2cbe64-d9ef-4fca-9b69-3f6153ee603e.png)
[クエリーを編集]ボタンで[クエリビルダ]を開きます。このようなクエリを作成します。
売上日(年/月)単位で製品分類名別に数量を集計して表示するレポートです。
赤枠で囲んだところにはExpression(拡張表現)が定義されています。ここで詳細レポートへのリンクを記述します。
![2022-03-13 Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0de65e4f-b362-d0eb-11f5-f79c72b91870.png)
ではどのようにリンクを定義するか見てみます。
[出力]領域の右クリックメニューからExpression(拡張表現)を追加します。
[拡張表現]タブの関数階層表示から**HTML** -> **Link to another Report**を選択します。
テンプレートが編集用テキスト領域に表示されます。このテンプレートを編集していきます。
![2022-03-13 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d475f2af-d2c2-14e0-bb15-f476b01d2e1d.png)
編集後はこうなります。
リンク先レポートの指定（グループコードとレポートコード）が見えます。**UrlEncode("QiitaSample.SalesLinkDetail")**。
フィルターへ値を渡す用のパラメータも定義します。フォーマットは **&flt{フィルターの名前}=** となります。渡す値は各行の売上日(年/月)と製品分類名なので、行参照が設定されています。HtmlEncode(**{%売上日}**)とHtmlEncode(**{%ProPro製品分}**)。
:bulb:レポートURLのパラメータについては、後日別の記事で！
![2022-03-13 Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/977384b6-dc45-a614-4890-06d5d120f9e6.png)
クエリおよびレポートを保存して完了です。
## レポートの表示
概要レポートのURLをブラウザのアドレスバーに貼り付けてレポートを表示します。
http://{yourservername}/mdService1Rest/Report/?query=**QiitaSample.SalesLinkSummary**
![3022-03-13 Figure 07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bfee6dc3-6bdc-f222-cd06-56e72a58d77f.png)
詳細を押すと...詳細レポートが開きます。
概要レポートから渡された売上日(年/月)と製品分類名が参照タグを経由してタイトルに表示されます。
表には詳細が表示されます。
![3022-03-13 Figure 08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/29f9e37e-dc13-5fc4-e46c-094b6d7d233a.png)

:postbox:[Sharperlight](https://sharperlight.jp/)
-rwxr-sr-x の権限ってなに？

## 勉強前イメージ

みたことあるようなないようなよく知らない

## 調査

### -rwxr-sr-x の権限ってなに？

「-rwxr-sr-x」 のうち、 `s` の箇所はいつもは `x` が入る認識なんだけど
`s` というのは特殊なアクセス権で `SGID(Set Group ID)` というものです。
これは実行権限のあるファイル・ディレクトリに設定されるもので

- ファイルに設定されている場合 → 実行すると実行ファイルの `所有しているグループの権限` で実行されます。
- ディレクトリに設定されている場合 → 配下にあるファイルやディレクトリの所有グループがSGIDで設定されているディレクトリの所有グループと同様になります。

グループでファイルを共有する際に、専用のSGIDのディレクトリを作成しておいてファルのやり取りを行う事ができる。

### SGIDの設定方法・やってみる

#### ディレクトリ

- 作業前のディレクトリ

775ですね。

```
[admin@localhost ~]$ ll
drwxrwxr-x 2 admin admin 6  3月 13 11:57 sgid_dir
```

- SGIDの設定

SGIDの設定はアクセス権限に `2000` または `g+s` を追加します。
以下はどちらでも設定してみましたが、同様に設定できました。

```
[admin@localhost ~]$ chmod -R 2775 sgid_dir/
[admin@localhost ~]$ ll
drwxrwsr-x 2 admin admin 6  3月 13 11:57 sgid_dir
```

```
[admin@localhost ~]$ chmod -R g+s sgid_dir/
[admin@localhost ~]$ ll
drwxrwsr-x 2 admin admin 6  3月 13 12:00 sgid_dir
```

#### ファイル

- 作業前のファイル

664 になってます。

```
[admin@localhost sgid_dir]$ ll
-rw-rw-r-- 1 admin admin 0  3月 13 12:01 sgid_file
```

- SGIDの設定

大文字Sになってます・・・なぜ？
→ 調べたら、ファイルのグループの実行権限がない場合に `S` が表示されるそうです。

```
[admin@localhost sgid_dir]$ chmod 2664 sgid_file 
[admin@localhost sgid_dir]$ ll
-rw-rwSr-- 1 admin admin 0  3月 13 12:01 sgid_file
```

ということで、ディレクトリと一緒の2775で設定してみたら消えるはず。
→ 小文字の `s` になって実行権限が付与されました。

```
[admin@localhost sgid_dir]$ chmod 2775 sgid_file
[admin@localhost sgid_dir]$ ll
-rwxrwsr-x 1 admin admin 0  3月 13 12:01 sgid_file
```

とりあえず `g+s` でも実行してみます。
↑と一緒でファイルのグループの実行権限がなくなってSになってしまうので、775にしてから挑戦
→ できました！

```
[admin@localhost sgid_dir]$ ll
-rwxrwxr-x 1 admin admin 0  3月 13 12:18 sgid_file
[admin@localhost sgid_dir]$ chmod g+s sgid_file 
[admin@localhost sgid_dir]$ ll
-rwxrwsr-x 1 admin admin 0  3月 13 12:18 sgid_file
```

## 勉強後イメージ

LPIC101でやるらしいから昔勉強したんだろうけど全く覚えてなかったw
正直あんま使うこともないのか、わからん。

## 参考

- [Linuxアクセス権その２（特殊なアクセス権）](https://www.kenschool.jp/blog/?p=4346)
- [‘-rwxr-sr-x’というパーミッション設定](http://sgykfjsm.github.io/blog/2014/04/01/whats-is-rwxr-sr-x/)
javascriptで文字列を掛け算する方法

## 概要
`Javascript`で同じ文字列を掛け算して羅列する際に、`Ruby`とは記載方法が異なったためメモとして残しておきます。

## 記載方法
### Rubyの場合

```ruby
puts 'a' * 3
#=> aaa
```
`Ruby`の場合は単純に文字列に数字を掛ければ求められる。

### Javascriptの場合

```javascript
console.log('a'.repeat(3))
//=> aaa
```
`Javascript`の場合は`Ruby`のように単純な計算式ではなく、`repeat`メソッドを使います。
[初学者/At_Corder] A.Cookie_Exchangesを解いてみた

# [初学者/At_Corder] A.Cookie_Exchangesを解いてみた
## 目次
- 概要
- 開発環境
- 解答と説明
- まとめ

## 概要
A.Cookie_Exchangeの問題です。
[2022/03/14] @scivola 様からのコメント内容にて、ご教示いただいた内容を解答に反映しております。

## 開発環境
- Ruby 2.6.3
- Visual Studio Code
- Ubuntu 20.04.3

## 解答と説明
問題文は下記のサイトにて、ご覧いただけます。

https://atcoder.jp/contests/agc014/tasks/agc014_a

##### 解答
```ruby:cokkie_exchange.rb
a,b,c = gets.split.map(&:to_i)

arr = [a,b,c]
count = 0

if arr.uniq.one? && arr.all?(&:even?)
	puts -1
else
  while arr.all?(&:even?)
    arr = arr.rotate.zip(arr.rotate(2)).map{ |i| i.sum / 2 }
    count += 1
  end
  puts count
end
```
##### 説明
**＜流れ＞**
- 入力された値をa,b,cに代入。
↓
- 最終的に出力する実行回数をcountとして定義。
↓
- （if）a=b=cかつすべて偶数の時は、無限処理になるため、繰り返し処理をせずに、-1を表示。
↓
- （else）すべて偶数の時は、クッキーを分ける処理を繰り返し、奇数が含まれる時は、countを出力。

上記流れをコメントとして、実際のコードに付け加えると下記のようになります。

```ruby:説明コメント付き
# 入力された値をa,b,cに代入。
a,b,c = gets.split.map(&:to_i)

arr = [a,b,c]

# 最終的に出力する実行回数をcountとして定義。
count = 0

# a=b=cかつすべて偶数の時は、無限処理になるため、繰り返し処理をせずに、-1を表示。
if arr.uniq.one? && arr.all?(&:even?)
	puts -1
else
# すべて偶数の時は、クッキーを分ける処理を繰り返し、奇数が含まれる時は、countを出力。
  while arr.all?(&:even?)
    arr = arr.rotate.zip(arr.rotate(2)).map{ |i| i.sum / 2 }
    count += 1
  end
  puts count
end
```
**＜メソッド説明＞**
- 入力された値の取得
空白区切りの取得に、splitを用い、
すべてIntegerで取得するために、a,b,cそれぞれに、to_iをmapメソッドにて、処理しています。
```ruby:入力された値の取得
# a,b,c = とすると、一度に代入できます。
a,b,c = gets.split.map(&:to_i)
```
- a=b=cの判定
a,b,cはIntegerのため、配列.uniq.one? を用いています。
```ruby:a=b=cの判定
arr.uniq.one?
```
- 偶数の判定
all?メソッドを用いて、配列内の要素すべてに対して、偶数であるか（even?メソッド）を判定しています。
```ruby:偶数の判定
arr.all?(&:even?)
```
- arr.rotate.zip(arr.rotate(2)) とは
rotateとzipを用いることで、それぞれの人ごとに必要なクッキーの個数を配列にすることが出来ます。
```ruby:arr.rotate.zip(arr.rotate(2)) とは
arr.rotate.zip(arr.rotate(2))
# (例)4 12 20と入力したとき、
# =>[[12, 20], [20, 4], [4, 12]]
```
- クッキーを分ける処理
前述の配列化したクッキーの個数を、配列ごとにsumで合計を算出し、2で割っています。
```ruby:クッキーを分ける処理
arr = arr.rotate.zip(arr.rotate(2)).map{ |i| i.sum / 2 }
# (例)4 12 20と入力したとき、
# arr.rotate.zip(arr.rotate(2)) => [[12, 20], [20, 4], [4, 12]]
# [[12, 20], [20, 4], [4, 12]].map{ |i| i.sum / 2 } => (処理イメージ)[[(12+20)/2],[(20+4)/2],[(4+12)/2]]

# Ruby 2.7以上の方は、arr[_1]が使用できるため、下記でも可。
# (arr[_1]とは、何者だろうと思われた方は、コメントのscivola 様の解説をご覧ください。)
arr = arr.rotate.zip(arr.rotate(2)).map{ _1.sum / 2 }
```

## まとめ
ざっくりと解答をまとめてみました。
より良いコードになるよう、アドバイスいただけると、嬉しいです！

## 参考サイト
https://qiita.com/minhee/items/61e6a4115d5c4d5d3047
JavaScriptで記事日付を年度別でソートして表示する

誰かが実装してそうなものですが、意外と調べても見つからなかったので。

# デモ

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="NWXWXOK" data-user="qwe001" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/qwe001/pen/NWXWXOK">
  Order By Financial Year</a> by qwe001 (<a href="https://codepen.io/qwe001">@qwe001</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 実装

要は、記事の投稿月が1～3月の時は
1年引いた年別グループに格納すればOKってことです

```javascript
var dates = [
  {"date":"2021-03-31"},
  {"date":"2021-04-01"},
  {"date":"2022-03-31"},
  {"date":"2022-04-01"}
];

var years = {};
for(var i in dates){
  var date = dates[i].date;

  var m = moment(date);
  var ymd = m.format('YYYY-MM-DD');
  var year = parseInt(m.format('YYYY'), 10);
  var month = parseInt(m.format('M'), 10);

  if(month <= 3){
    year = m.subtract(1, 'year').format('YYYY');
    year = parseInt(year, 10);
  }

  if(years.hasOwnProperty(year) === false){
    years[year] = [];
  }

  years[year].push(ymd);
}

console.log(years);
```
```javascript
{
  "2020" : [
    "2021-03-31"
  ],
  "2021" : [
    "2021-04-01",
    "2022-03-31"
  ],
  "2022" : [
    "2022-04-01"
  ]
}
```
Azure Solution Architect Expertを３週間で取得した話

# はじめに
Azure Solution Architect Expertに３週間ほどで合格したので、勉強方法を備忘で語ります。
※今回は試験対策に絞っているので、体系的にAzureを勉強しようって方にはおすすめしません。

# Azure Solution Architect Expert認定の概要
まずは、試験の概要を読みます。
以下、引用です。AWSで言うところのSAPといったところでしょうか。

>Azure Solutions Architect Expert 認定資格の受験者は、コンピューティング、ネットワーク、ストレージ、監視、セキュリティなど、Microsoft Azure で実行されるクラウドおよびハイブリッド ソリューションの設計に関する専門知識を持っている必要があります。
このロールの責任には、利害関係者に助言し、ビジネス要件を安全でスケーラブルで信頼性の高い Azure ソリューションのための設計に変換することが含まれます。
Azure ソリューション アーキテクトは、Azure でのソリューションの実装を担当する開発者、管理者、その他のロールと提携します。
この認定資格の受験者は、ネットワーキング、仮想化、ID、セキュリティ、ビジネス継続性、ディザスター リカバリー、データ プラットフォーム、ガバナンスを含む IT 操作の各種方面についての経験と知識が卓越している必要があります。 このロールのプロフェッショナルは、各分野での意思決定がソリューション全体に与える影響を管理する必要があります。 さらに、Azure 管理、Azure 開発、および DevOps プロセスの経験がある必要があります。

>この認定資格を取得するには、次の要件を満たしてください。
Microsoft Certified: Azure Administrator Associate 認定資格を取得し、試験 AZ-305 に合格すること。または、
試験 AZ-303 および 試験 AZ-304 に合格すること (2022 年 3 月 31 日の廃止前まで)。または、
試験 AZ-303 (2022 年 3 月 31 日の廃止前まで) および 試験 AZ-305 に合格すること

AZ-303とAZ-304に合格する必要があるようですが、2022年３月末で廃止され、
AZ-303を取得している人であれば、AZ-305を取得すれば認定されるみたいですね。
AZ-303を３月末までに取得していない場合、AZ-104（Azure Administrator Associate）とAZ-305を取得することで認定されるとのこと・・・　うーん複雑ｗ

https://docs.microsoft.com/ja-jp/learn/certifications/azure-solutions-architect/

# なぜ取得しようと思ったか
AWSの資格をコンプリートしたので、次はどこに行こうとフラフラしていたところ、
Azureもいいなぁと思い・・・という理由です。
調べていたところ、AZ-303、AZ-304が３月末で廃止・・・実は１年ほど前にUdemyのコースを買って放置していたので
急がねば！と思い立ちました。
https://qiita.com/Regryp/items/4e2c0bdd738c91db75f5

# 前提知識
前項に記載したとおり、普段の業務では、AWSメイン、Azureはコンソールを少しだけ２年くらい前に触ったレベル
一応AzureFundamentalを２年前に取っていてふんわりAzureのサービスを知っているレベルです。

# AZ-303: Microsoft Azure Architect Technologiesの勉強
以下２コースを２周実施、わからない単語をググって復習だけというシンプルな方法です。本来はチュートリアルやら、MSLearnやらを実施しないと体系的に知識は身につかない気がしますが、期間が限られていたため、ショートカットしました。ごめんなさい・・・

https://www.udemy.com/course/microsoft-azure-architect-technologies-exam-practice-tests/

https://www.udemy.com/course/az303-azure-practice/?expanded=672078190#overview

# AZ-304: Microsoft Azure Architect Designの勉強
こちらも同様に、以下２コースを２周実施、わからない単語をググって復習だけでした。

https://www.udemy.com/course/microsoft-azure-architect-design-exam-practice-tests/

https://www.udemy.com/course/az-301-azure-architect-design-practice-test/

# 試験の感想
AWSの試験より割と細かい内容が問われる気はしますが、問題はわかりやすく、AWSのSAPよりだいぶ簡単な気がしました。個人的にはAZ-303よりAZ-304のほうが少し難しかったような。
ライセンス体系やAzureADの理解は必須ですね。

# まとめ
今回は、だいぶショートカットした勉強方法になってしまいましたが、試験勉強を通じて、
サービスのライセンス体系や仕組みなどを効率的に学べた気がします。
Azureのサービスがこれで完璧に設計できるかというとだいぶ怪しいので、
これからがんばります！
7 Rails 新たなRouting、Controllerのアクションは追加しないで検索機能 , ジャンル検索機能を実装する

## 検索機能の流れ
1 検索フォームを作成する。
2 モデルにメソッドを定義する。
3 アクションを編集する。


## 1 検索フォームを作成する

```
<%= form_with url: admin_items_path, local: true, method: :get do |f| %>
  <%= f.text_field :word %>
<% end %>
```

このフォームで送られるパラメータは、、、
```
{"utf8"=>"✓", "word"=>"×××", "controller"=>"admin/items", "action"=>"index"} 
```

###### <font color="Red">ポイント</font>

クエリパラメータは特に、設定しなくても使える

クエリパラメータの作り方
book_path(book.id)
本来は、book_path(id: book.id) (idというキーにbook.idという値を入れる)

params[:word]
本来は、book_path(word: “xxx”) => wordというキーに値を入れる

複数のキーに値を入れる
book_path(word: “xxx”, search: “yyyy”)


nameというキーに値をform_withで入れる(この時のメソッドは、get)
<%= f.text :name %>

## 2モデルにメソッドを定義する
```Ruby
def self.looks(word)
    if word
        @items = Item.where("name LIKE?", "#{word}")
    else
        @items = Item.all
    end
end
```

###### <font color="Red">ポイント</font>
1 if文でwordに値があるか(wordに値が与えらたかどうかで)条件分岐させている。

2  
```Ruby
Item.where("name LIKE?", "#{word}")
```
Itemテーブルの中のnameカラムからwordの値(検索フォームで入力された値)が
含まれているものを取得している。

3 
```Ruby
else
   @items = Item.all
end
```

検索フォームに何も入力してないとき、全ての商品を表示する。
###### <font color="Red">この記述が無いと検索フォームに名前を入力しないと商品が表示されない:scream:</font>

## 3 コントローラーのアクションを編集する
```Ruby
def index
   @items = Item.looks(params[:word])
end
```
このlooksは、2で定義された

# ジャンル検索機能の流れ


## 1 アクションを編集する

```Ruby
def index
    @genres = Genre.all
    if params[:genre_id]
      @genre = Genre.find(params[:genre_id])
      @items = @genre.items.all
    else
      @items = Item.all
    end
  end
```

###### <font color="Red">ポイント</font>
1
```Ruby
 if params[:genre_id]
```
パラメータで、genre_idに値がある(値が送られてきたかどうか)で、条件分岐させる

2
```Ruby
@genre = Genre.find(params[:genre_id])
```
送られてきた、genre_idと同じidのGenreを取得する

3
```Ruby
@items = @genre.items.all
```
@genreに関連するitemを全て取得し、@itemsに格納させる

4
```Ruby
else
  @items = Item.all
end
```
パラメータで、genre_idが無いときitemを全て表示させる。
<font color="Red">この記述が無いと検索フォームに名前を入力しないと商品が表示されない:scream:</font>

## 2 genre_idをアクションに送る
```
<% @genres.each do |genre| %>
   <p><%= link_to genre.name ,  items_path(genre_id: genre.id) %></p>
<% end %>
```
この時のパラメータ
```
<ActionController::Parameters {"genre_id"=>"1", "controller"=>"public/items", "action"=>"index"}
```



#### ポイント: <font color="Red">link_toに任意のパラメータを付与する方法</font>
例:
```
名前付きルート(group_id: 1, team_id: 2)
```
この時のURL
```
.../.../...?group_id=1?team_id=2
```
コントローラーで受け取る方法
```
params[:group_id]
params[:team_id]
```
ハノイの塔をC#で解く（再帰アルゴリズム）

## ハノイの塔
[ハノイの塔 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94) より

以下のルールに従ってすべての円盤を右端の杭に移動させられれば完成。

![Tower_of_Hanoi_4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/6547699c-ac4b-b910-a2e0-92a1ead81153.gif)

出典：André Karwath aka <a href="//commons.wikimedia.org/wiki/User:Aka" title="User:Aka">Aka</a> - <span class="int-own-work" lang="ja">投稿者自身による作品</span>, <a href="https://creativecommons.org/licenses/by-sa/2.5" title="Creative Commons Attribution-Share Alike 2.5">CC 表示-継承 2.5</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=85401">リンク</a>による

+ 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤から構成される。
+ 最初はすべての円盤が左端の杭に小さいものが上になるように順に積み重ねられている。
+ 円盤を一回に一枚ずつどれかの杭に移動させることができるが、小さな円盤の上に大きな円盤を乗せることはできない。

n枚の円盤すべてを移動させるには最低 2<sup>n</sup> − 1 回の手数がかかる。（奥村晴彦『C言語による最新アルゴリズム事典』技術評論社、1991年、216–217頁。ISBN 4-87408-414-1。）

## アルゴリズム
<img alt="Tower of hanoi" src="https://user-images.githubusercontent.com/74280232/158025699-ec93796c-3322-48d9-b9be-5e10b7249d8c.png" width=400>

```text
GOAL: move n disks from A to C

move n-1 disks from A to B -> 再帰
move disk n from A to C
move n-1 disks from B to C -> 再帰
```


## ソースコード
GitHubにも同じソースコードあり

https://github.com/probabilityhill/hanoi-csharp

```c#:Hanoi.cs
using System;

class Hanoi {
  public void Move(int n, char from, char to, char other) {
    if(n >= 1) {
      Move(n - 1, from, other, to);
      Console.WriteLine("move disk {0} from {1} to {2}.", n, from, to);
      Move(n - 1, other, to, from);
    }
  }
}

class HanoiMain {
  public static void Main(string[] args) {
    Hanoi hanoi = new Hanoi();

    Console.Write("How many disks? ");
    int n = int.Parse(Console.ReadLine());

    // n枚のdiskをAからCへ移す
    hanoi.Move(n, 'A', 'C', 'B');
  }
}
```

## 実行例（n=3）
[こちら](https://paiza.io/projects/e/DDCuMSPG5-ay6rS6g0VQvw?theme=monokai)から実行可（入力は半角数字）

```text
How many disks? -> 3

move disk 1 from A to C.
move disk 2 from A to B.
move disk 1 from C to B.
move disk 3 from A to C.
move disk 1 from B to A.
move disk 2 from B to C.
move disk 1 from A to C.
```
RealmをRxSwiftで実装してみる

## 前提
RealmはRxSwiftCommunityにおいて[RxRealm](https://github.com/RxSwiftCommunity/RxRealm)というライブラリが既に存在しますが、
今回はそれらを使用せず実装して行きたいと思います。

https://github.com/RxSwiftCommunity

https://github.com/RxSwiftCommunity/RxRealm


実装はDIを意識しているためコンストラクタ経由で実体を渡すようにしています。


## 保存
```swift
    func add<O>(object: O) -> Single<Void> where O : Object {
        return Single<Void>.create { observer in
            do {
                let realm = try Realm()
                try realm.write {
                    realm.add(object)
                    observer(.success(()))
                }
            } catch let error {
                observer(.failure(error))
            }
            return Disposables.create()
        }
    }
```
今回は一回だけイベントを通知したいのでSingleUnitを使用します。
（Singleとはsuccessかerrorが一回のみ通知されるObservableです）

## 削除
```swift
    func delete<O>(object: O) -> Single<Void> where O : Object {
        return Single<Void>.create { observer in
            do {
                let realm = try Realm()
                try realm.write {
                    realm.delete(object)
                    observer(.success(()))
                }
            } catch let error {
                observer(.failure(error))
            }
            return Disposables.create()
        }
    }
```


### protocolで切り分ける

```swift
    /// 保存する
    func add<O: Object>(object: O) -> Single<Void>
    /// 削除する
    func delete<O: Object>(object: O) -> Single<Void>
```
M1 MacにRosetta2なしでGCC環境を構築する

こんにちは。2022年3月初投稿です。

# はじめに
先日GCCをM1 Macにインストールしたのですが、
IntelからAppleSiliconへ切り替わる過渡期なため、インストール手順を紹介した記事が
- Intel Mac向け
- AppleSilicon向け（Rosetta2あり）
- AppleSilicon向け（Rosetta2なし）

の3パターンあり、すこし混乱しました。
しかも関連ソフトも同じ有様で、わかりづらかったので
備忘録的にまっさらな`AppleSilicon搭載MacにRosseta2なしでGCC環境を構築する`手順をまとめていきます。

# 環境
```
マシン: Mac mini (M1, 2020)
OS: macOS 12.2(Monterey)
シェル: zsh
```

# 関連ソフトのインストール
## CommandLineTools for Xcode
開発者向けツールのCommandLineTools for Xcodeをインストールします。
（Xcodeを使う予定がある場合は、そちらのインストールで代替可能）
```zsh
% xcode-select --install
```

## Homebrewのインストール
パッケージ管理ツールのHomebrewをインストールします。
[公式サイト](https://brew.sh/index_ja)のインストール用のコマンドを実行します。パスワードや了承を求められるので指示に従って操作します。
![homebrew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414198/9abe2aa0-8850-195d-e2ae-7c8459f596ae.png)

インストール後に案内が出てきますが、M1 Mac（AppleSilicon搭載Mac）の場合は以下のコマンドを実行してパスを通します。
```zsh
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/******/.zprofile
# ******はユーザ名に置き換え
% eval "$(/opt/homebrew/bin/brew shellenv)"
```

Homebrewのバージョン確認コマンドを実行して、インストールが無事完了したか確認します。
```zsh
% brew --version
```

```zsh: 実行結果例
Homebrew 3.4.1
Homebrew/homebrew-core (git revision 7aa6ef8a215; last commit 2022-03-12)
```

# GCCのインストール
Homebrewを利用してGCCをインストールします。
```zsh
% brew install gcc
```

GCCのコマンドを呼び出せるように設定していきます。
```zsh
% cd /opt/homebrew/bin/
% ln -s gcc-11 gcc
% where gcc
```
```zsh: 実行結果例
/opt/homebrew/bin/gcc
/usr/bin/gcc
```
G++も同様に設定します。
```zsh
% ln -s g++-11 g++
% where g++
```
```zsh: 実行結果例
/opt/homebrew/bin/g++
/usr/bin/g++
```
Macを再起動して終了です。

# 動作確認
適当なC/C++プログラムをコンパイル･実行して、動作を確認します。
```c: hello.c
#include <stdio.h>

int main(void){
	printf("Hello GCC World!\n");
}
```
```zsh: 実行結果例
% gcc hello.c
% ./a.out
Hello GCC World!
```

# さいごに
Intel Macで環境構築をしたときの手順を試みたら、Homebrewの段階でつまづいてしまい、
ググるとIntel Macしかなかった時代（PowerPC?知らない子ですね）の記事やら、
M1黎明期のRosseta2を使った方法が出てきて、余計に混乱しました。
Rosseta2を使わずにすむならその方がうれしいので、HomebrewからGCCのインストールまでの一連の流れをまとめてみました。
そんなことより新型Mac miniまだですか。


# 参考
- [MacでGCCを"正しく"環境構築しよう！](https://qiita.com/DaikiSuyama/items/09f5aa399aad37783146)
- [Mac M1 にGCC入れてみた](https://anamogra.com/?p=185)
- [brew upgrade でのエラー対処からCommand Line Toolsについてまとめてみる](https://techracho.bpsinc.jp/wingdoor/2021_04_09/104821)
本格始動！

iOSアプリを作りたいと思い続けて、数年経ちました。

昨年の誕生日に父親から、macbookairをプレゼントされました。
これで、晴れてアプリ作成に乗り出せる状態になりました。

ちなみに、macの仕様は、


```
MacBook Air(Retina, 13-inch, 2020)
プロセッサ 1.1GHz デュアルコアIntel Core i3
メモリ 8GB 3733 MHz LPDDR4X
グラフィックス Intel Iris Plus Graphics 1536MB
```

です。

iOSアプリを作る過程を呟きのような感じで
徒然なるままに記事を書いていきたいと思っています。
NFC モジュールの動作安定性を改善する

# NFC RFID-RC522

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/766c0b0c-e0c4-8f80-891b-2ec05377be28.png)

RaspberryPi/ESP32/STM32 などに繋いで実験していましたが、かなり不安定でした。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/71b218f5-f45d-3978-5a66-93f1140c22a9.png)
3.3V の電源供給を改善するために、手持ちの47μFのコンデンサを取り付けてみました。

これでSTM32接続時の動作安定性はかなり良くなった。
追実験はしていませんが、恐らくESP32の動作安定性についても効果があるのではないかな？

# N532 NFC RFID module
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3ab290bb-796e-f7b4-5f91-ce81b182e1a1.png)


使用していると不安定なことがありました。特に FeliCa を対象にしているときに全く反応が無かったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e876f51d-7773-0e24-c6f3-55b741c87ad6.png)

同様に、47μFのコンデンサを取り付けることでかなりの改善が見られました。
[mpeg4 @ 000001eb3d342700] timebase 1000/66667 not supported by MPEG 4 standard, the maximum admitted value for the timebase denominator is 65535　というエラーの対処法

# はじめに

普段、PythonのOpenCVの`cv2.VideoWriter`使用して画像からmp4動画を作成しています。
しかしタイトルにあるようなエラーが発生しました。


```
[mpeg4 @ 000001eb3d342700] timebase 1000/66667 not supported by MPEG 4 standard, the maximum admitted value for the timebase denominator is 65535
[ERROR:0@0.001] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (2822) open Could not open codec mpeg4, error: Unspecified error
[ERROR:0@0.001] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (2839) open VIDEOIO/FFMPEG: Failed to initialize VideoWriter
```

このエラーについて説明しているサイトは少なく、情報が出てきませんでした。
しかし原因がfpsを小数で渡しており、かつ値が大きくオーバーフローしているためとわかったので、記事を書いておきます。

なお元のコードはこちらになります。

https://qiita.com/penpenpen/items/acfa194cee45190cd8f3

# コード

今回問題となった部分は以下のコードです。


```.py
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
video = cv2.VideoWriter(f'{saving_direcory_path}/{illust_id}.mp4',fourcc, fps, (width, height))
```

1行目でMPEG-4を指定し、2行目で各種パラメータを指定しています。
各種パラメータの意味は下記公式サイトを見てください。
今回問題となったのは`fps`というパラメータです。

https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5



# fpsのふるまい

OpenCVではfpsを指定されたとき、内部では`delay = 1/fps`として画像間の時間間隔`delay`に計算しなおしていそうだとわかりました。
この際、`fps`が`int`ならば何の問題もありませんが、`float`の場合、1000倍して`int`型に変換しています。すなわち計算では`delay = (1*1000)/(fps*1000)`となります。
具体的にみると、`fps=66.66666`として渡すと、内部では`delay = 1000/66667`として計算されます。
しかし、この時分母は16bitの最大`65535`までしか取れません。結果`66667`はオーバーフローしてしまい、以下のようなエラーが出てしまいます。

```
[mpeg4 @ 000001eb3d342700] timebase 1000/66667 not supported by MPEG 4 standard, the maximum admitted value for the timebase denominator is 65535
```

# 解決法

解決法は、`fps`を整数で渡す、もしくは小数の場合は1000倍して`65535`を超える場合のみ整数まで丸めるのがいいでしょう。

後者の場合、コードは以下のようになります。

```.py
fps = 66.66666
if fps*1000 > 65535:
    fps = round(fps)
```

# まとめ

以上がこのエラーの対処法です。
OpenCVは標準ライブラリではありませんが、画像を扱う際は重宝するライブラリなので、使う機会が多いと思います。
そのため情報は多いと思っていたのですが、このエラーに関してはわからず、大変でした。
ぜひ活用していください。
Java書くなら、IntelliJ IDEAがおすすめ!

# Javaの学習を始めてみた...
最近転職活動をしていて、未経験OKの会社の募集要項を見るとAI,IOT,スマートフォンのアプリ開発の求人が多かった!
研修付きの採用があって、Java,Pythonが多い???

最近Javaの学習を再開して、動作が軽いからとVscodeで書いていたのだが、モジュールをインポートできてないとエラーが出たりと、Javaならではの環境構築に悩まされた...

EclipseというIDEを使って学習するのが紹介されているが、使いにくくて、好みではないので、IntelliJ IDEAの方がカッコイイということで、今回無料版のコミュニティを使って学習をしてみた。
設定さえすれば自動でやってくれるので、結構使いやすい。

## 学習環境
- PCは、macOSMoterey
- IDEは、IntelliJ IDEA

## 先ずはダウンロード
https://www.jetbrains.com/ja-jp/idea/download/#section=mac

![スクリーンショット 2022-03-13 11.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/ba4dfe4f-d79b-fb5f-269b-274eacb6227d.png)

Communityの方をダウンロードする。

**こちらのサイトを参考にすると良いと思います**
https://sukkiri.jp/technologies/ides/intellij-idea/intellij-idea-mac.html

## プロジェクトを作成するとこんなディレクトリ構造になっている
```
.
├── CalcSample.iml
├── out
│   └── production
│       └── CalcSample
│           └── com
│               └── company
│                   ├── CalcLogic.class
│                   └── Main.class
└── src
    └── com
        └── company
            ├── CalcLogic.java
            └── Main.java

```

![スクリーンショット 2022-03-13 11.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/d677069a-c534-7356-acad-57951551cd9f.png)

## ソースファイルのコード

Main.java

```
package com.company;

public class Main {

    public static void main(String[] args) {
        int a = 10; int b = 2;
        int total = CalcLogic.tasu(a, b);
        int delta = CalcLogic.hiku(a, b);
        System.out.println("足すと" + total + "、引くと" + delta);
    }
}
```

CalcLogic.java

```
package com.company;

public class CalcLogic {
    public static int tasu(int a, int b) {
        return (a + b);
    }
    public static int hiku(int a, int b) {
        return (a - b);
    }
}

```

**右上のRUNボタン(▶️のアイコン)を押すとコンパイルされる**
コンソールの実行結果
```
足すと12、引くと8
```

# 使ってみた感想
内部が複雑すぎるEclipseよりこっちの方が操作がしやすかったです。でもマシンのメモリが16GB異常ないとパソコンがフリーズするらしいので、ジェットブレインのIDE使う方はMacでもWindowsでも16GBのPCを買いましょう。
YouTubeやUdemyでMacでの使い方が紹介されてたりするので、ご興味ある方はやってみてください。
データ隠蔽・情報隠蔽とは

## 対象 

この記事ではデータ隠蔽・情報隠蔽とは何ぞや？から
何のためにするの？まで落とし込むための記事です。


## データ隠蔽

* クラスのメンバ（フィールドやメソッド）の公開範囲を限定すること
 

つまり、不用意にデータに触らせないためにある。
どうして、不用意にデータを触らせてはいけないのかは以下を考える。

例えば、どこからかしこもデータを触れる環境だと
そのデータを使用しているか範囲が絞りづらい　
⇒　**保守性が低くなる**（影響範囲がわかりづらくメンテナンスがめんどくさい）

これを解消するために「データを隠しましょう。」「関係ないところからは直接扱えないようにしましょう」というのが
データ隠蔽をする理由となる。

このデータ隠蔽を表現するために、カプセル化が用いられる。

カプセル化 → アクセス修飾子で公開範囲を制限する（private etc..）

このことからデータ隠蔽とカプセル化はセットで考えられることが多い


## 情報隠蔽

* 公開するものと非公開のものに分けること

抽象化することで関係性をきれいにしている。
モジュール間の連携を公開部分だけですることで、構造が複雑になるのを防ぐ目的




以下記事がわかりやすいのでご参考までに

https://zenn.dev/dowanna6/articles/92c6494570a4dc
[Flutter] FirebaseAnalyticsのエラーでビルドできない時の対処法


# はじめに
flutterのバージョンが2.10未満で、firebaseのバージョンアップ後に以下のようなエラーが出た時の対処法です。

```shell
    1 warning generated.
    ../../../.asdf/installs/flutter/2.8.1-stable/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-3.1.0/lib/src/method_channel/utils/exception.dart:13:11: Error: Member not found: 'Error.throwWithStackTrace'.
        Error.throwWithStackTrace(exception, stackTrace);
              ^^^^^^^^^^^^^^^^^^^
    ../../../.asdf/installs/flutter/2.8.1-stable/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-3.1.0/lib/src/method_channel/utils/exception.dart:16:9: Error: Member not found: 'Error.throwWithStackTrace'.
      Error.throwWithStackTrace(
            ^^^^^^^^^^^^^^^^^^^
    ../../../.asdf/installs/flutter/2.8.1-stable/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-3.1.0/lib/src/method_channel/utils/exception.dart:11:7: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
    Never convertPlatformException(Object exception, StackTrace stackTrace) {
          ^
    Failed to package /Users/xxxxxxx/Projects/xxxx/xxxxxxxxxx.
    Command PhaseScriptExecution failed with a nonzero exit code
    note: Using new build system
    note: Planning
    note: Build preparation complete
    note: Building targets in dependency order
```

# 対策
以下のどちらかで解消できます！
- flutterのバージョンを2.10にあげる
- firebaseの依存パッケージのバージョンをoverrideする
例.`pubspeck.yaml`に以下を追記（自分の場合)
```
dependency_overrides:
    firebase_messaging_platform_interface: 3.1.6
    firebase_crashlytics_platform_interface: 3.1.13
    cloud_firestore_platform_interface: 5.4.13
    firebase_auth_platform_interface: 6.1.11
    firebase_storage_platform_interface: 4.0.14
    cloud_functions_platform_interface: 5.0.21
    firebase_analytics_platform_interface: 3.0.5
    firebase_remote_config_platform_interface: 1.0.5
    firebase_dynamic_links_platform_interface: 0.2.0+5  
    firebase_performance_platform_interface: 0.1.0+5 
    firebase_app_installations_platform_interface: 0.1.0+6
```

# 原因
Firebaseのバージョンアップにより、flutter2.10に依存する実装が組み込まれたことが原因らしいです
参考:[[firebase_messaging] Unable to build or run tests after release](https://github.com/FirebaseExtended/flutterfire/issues/8181)
したがって、先述したようにflutterのバージョンを単に上げれば解消されますが、プロダクトの場合安易にflutterのバージョンをあげることもできないかと思います。（自分はそうでした。）なので、firebaseのうち、flutter2.10に依存する部分を古いバージョンでoverrideして利用すれば解消できます。

# 参考 
[[firebase_messaging] Unable to build or run tests after release](https://github.com/FirebaseExtended/flutterfire/issues/8181)
バッククォートの使用方法

バッククォート(``)  は、Linuxでは全く違う意味を持ちます。 シングルクォートは囲った中身を文字列として出力するのに対して、バッククォートは囲った中身をコマンドとして実行しその結果を出力します。

■使用例
$ echo "処理日:``date +%Y年%m月%d日`。"
処理日:2022年12月31日。


バッククォートの代用として｢$()｣も使用出来る。

■使用例
$ echo "処理日:$$(date +%Y年%m月%d日)。"
処理日:2022年12月31日。

Solarisでは｢$()｣上記が使用出来なかった。
バージョンによってだろうか、調査が必要。
Laravel と Ruby on Rails の CRUD

Laravel と Ruby on Rails でそれぞれアプリ開発をしていて，CRUD に対応するアクション名を混同しそうになったので整理したいと思います！

# Laravel での CRUD 

以下のように書くことで，
```php
use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class);
```
下の表のような，様々なアクションを処理するためのルートを定義できます！

|HTTP verb  |パス  |アクション | 目的|
|---|---|---|---|
|GET  |/photos  |index  |全ての写真の一覧を表示|
|GET  |/photos/<font color="red">**create**</font>  |<font color="red">**create**</font>  |写真を1つ作成するためのHTMLフォームを返す|
|POST |/photos  |<font color="red">**store**</font>  |写真を1つ作成する|
|GET  |/photos/{photo}  |show  |特定の写真を表示する|
|GET  |/photos/{photo}/edit  |edit  |写真編集用のHTMLフォームを1つ返す|
|PUT/PATCH  |/photos/{photo} |update  |特定の写真を更新する|
|DELETE  |/photos/{photo}  |destroy  |特定の写真を削除する|

# Ruby on Rails での CRUD 

以下のように書くことで，
```ruby
resources :photos
```
下の表のような，様々なアクションを処理するためのルートを定義できます！

|HTTP verb  |パス  |アクション | 目的|
|---|---|---|---|
|GET  |/photos  |index  |全ての写真の一覧を表示|
|GET  |/photos/<font color="red">**new**</font>  |<font color="red">**new**</font>  |写真を1つ作成するためのHTMLフォームを返す|
|POST |/photos  |<font color="red">**create**</font>  |写真を1つ作成する|
|GET  |/photos/:id  |show  |特定の写真を表示する|
|GET  |/photos/:id/edit  |edit  |写真編集用のHTMLフォームを1つ返す|
|PUT/PATCH  |/photos/:id |update  |特定の写真を更新する|
|DELETE  |/photos/:id  |destroy  |特定の写真を削除する|

# Laravel と Ruby on Rails の CRUD ルートの違い

上の2つの表の赤文字で示したように，Laravel の create アクションは Ruby on Rails のnew アクション，Larvel の store アクションは Ruby on Rails の create アクションに対応しています．混同しないように注意しないといけないですね！

# 参考文献
https://railsguides.jp/routing.html

https://readouble.com/laravel/8.x/ja/controllers.html
React環境構築編

# React環境構築手順
reactを使って開発する方向けに超シンプルにお伝えできればと思います。

## 前提条件
- ```nodebrew``` 
- ```Node.js(ver 8.10以上)``` 
- ```npm(ver 5.2以上)```
上記３点がが既にインストールされている
```Node```はバージョン16がおすすめ。（17だとなぜか正常に動作しない？かったからです）

### ①ビルド環境の構築

```.ターミナル
npx create-react-app {任意のプロジェクト名}

```

おそらく下記のエラーを吐く可能性があります。
その際は5.6行目どちらかのコマンドを試してみてください。
バージョンが古いよ、との勧告らしいです。
```.ターミナル
Your are running `create-react-app` 4.0.3, which is behind the latest release(5.0.0).
We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:
- npm uninstall -g create-react-app
- yarn global remove create-react-app
```

上記でも同じエラーを吐いた場合は・・・
下記コマンドでキャッシュのクリアをしてください（私はこの方法で解決できました。）
```.ターミナル
npx clear-npx-cache
```

### そしてもう一度```npx create-react-app```

下図のようになっていればOKです！
![スクリーンショット 2022-03-12 10.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/68b8725e-cd15-43ae-5282-a4b0f29ee04a.png)

### ②作成したプロジェクトに移動

```.ターミナル
cd {作成したプロジェクト名}
```
### ③ローカルサーバーを起動（どっちかでok　上の図でnpmを推奨してるのでnpm startがいいですねw）
成功した場合勝手にサーバーが立ち上がります。

```.ターミナル
npm start
yarn start
```

以上です！
WordPress ninjaテーブルを使ってショートコードでデータを呼び出す方法


MySQLにオリジナルテーブルを作ってデータを呼び出す方法もありますが、
そこまで複雑なことをしない場合は、データテーブルプラグインを使って
データを呼び出した方方が比較的簡単に実装できると思います。

ここでは、ninjaテーブルを使って呼び出してみたいと思います。

## 流れと設定方法
    //------ninjaテーブルを使った値の呼び出し方-------------
    //プレフィックスを設定してください
    //記事の中からショートコードで呼び出す
    //ショートコード[nintbl　table番号 条件項目 条件項目の値 取得フィールド]
	//例えば、tabel番号が92でid=1のレコードのprice項目の値を取得する場合 [nintbl 92 id 1 price]
    //注1 複数レコードが該当するような条件は利用できない
    //注2 部分検索を利用している似たような項目名を付けない(price_max,price_min)
## ショートコード
```sample.html
[nintbl　table番号 条件項目 条件項目の値 取得フィールド]
[nintbl 92 id 1 price]
```



**注意）ninjaテーブルの項目を指定するときはColumn Keyを指定する！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/52c91fc1-cfde-07c8-c51c-928dba6528ba.png)


## phpコード


```function.php
<?php
function get_nintbl($atts){


    global $wpdb;

    //プレフィックス（データベースのテーブル名の頭の文字列）を設定する
    $prefix="wpyd";	
	
	//$prepared_sql = $wpdb->prepare("SELECT *FROM $wpdb->ninja_table_items WHERE table_id = %d",$atts[0]);
    $prepare_sql = $wpdb->prepare("SELECT * FROM ".$prefix."_ninja_table_items WHERE table_id = %d",$atts[0]);	
	$results=$wpdb->get_results($prepare_sql);

    //echo count($results);

    $replace = [
        // '置換前の文字' => '置換後の文字',
        '[' => '',
        '{' => '',
        '}' => '',
        ']' => '',
        '"' => '',
      ];

    //var_dump($results);

    foreach($results as $data) {
        //[{"id":"1","career":"docomo","ols":"ドコモオンライン","price":"10000"}]
        
        // カンマ区切りのデータを分割
        $str_data=str_replace(array_keys($replace), array_values($replace), $data->value);
        $arry_data = explode(",", $str_data);

        //var_dump($arry_data);
        $match = preg_grep('!'.$atts[1].':'.$atts[2].'!',$arry_data);

        if(count($match)>0){
			$value = preg_grep('!'.$atts[3].'!',$arry_data);
			foreach($value as $val){
                   return str_replace($atts[3].":","",$val); 
            };
        }        
    }
	//return "受け取った数字は".$atts[0]."と".$atts[1]."です";
}
add_shortcode('nintbl','get_nintbl');
```
Rails 7 で CSS が反映されなかった話

かなり初歩的なところでつまづいて何時間も無駄に費やした記録

Ruby 3.1.1 + Rails 7.0.2.3

# 何が起こった？

初めて Ruby on Rails 7 で簡単なウェブアプリを作ろうとしていた。

スタイルシートは，空の状態から始め，`app/assets/stylesheets/application.sass.scss` に少しだけ記述を行なった。

しかし反映されなかった。

# やったこと

この節は，実際にやったことをかなり単純化して記述している。

## 前半

Sass を使う前提で

```
rails new hoge -c sass
```

として Rails アプリを作り，いくつかのモデルとコントローラーを書いた。
スタイルは一切書かずに動作確認などを行なった。
開発中は

```
bin/dev
```

でサーバーを起動していた。

ここで，「production 環境での動作がどうなるか」と思い，

```
rails s -e production
```

でサーバーを起動し直し，ブラウザーで表示させたところ，エラーが出た。
`log/production.log` には

```
ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.
```

と出ていた。
あ，そうか，production 環境ではプリコンパイルした CSS を用意しないといけないのだった。

そこで，

```
rails assets:precompile RAILS_ENV=produciton
```

とすると，`public` の下に `assets` ディレクトリーが出来て，いくつかのファイルができた。
もちろんその中に `application-なんちゃらかんちゃら.css` もある。中身は空（まだスタイルを一切書いてないので当たり前）。

これでエラーは出なくなった。

## 後半

さて，ここから開発を再開。
モデル，コントローラーなどを作り進め，「そろそろスタイルも書いていくか」と思ったものの，Rails 7 における CSS のルールがよく分からない。

とりあえず `app/assets/stylesheets/application.sass.scss` に

```scss
body {
  background: yellow;
}
```

のような簡単な記述を行なってどうなるか調べた。
反映されない。背景が黄色くならない。
うーむ，やはり Rails 7 の CSS についての基本的な知識が欠けているようだ。

ここから，さまざまな実験を行なったりウェブ検索したり，
cssbundling-rails gem の説明（英語）を頑張って読んでみたりもしたが，よく分からない。

確実に分かって安心できた点は，

```
bin/dev
```

を起動している間は

```
yarn build:css --watch
```

が効いているので，`application.sass.scss` に書いた内容が即座に `app/assets/builds/application.css` に反映される，ということであった。
`builds` 下に反映されるということは，〈そこそこうまくいっている〉はず。cssbundling-rails の説明でも，出来たファイルが `builds` 下に置かれる，と書いてあった。
問題は，なぜ `builds` 下のスタイルシートがブラウザーで読み込まれないか，だ。

そこで，見ている画面の HTML を開き，`<link rel="stylesheet" ...` を見つけ，`href` 属性を確認し，そのパスを直接ブラウザーで開いた。
そいつは空っぽであった。

手詰まり感で陰鬱な気持ちになった。
今まで sprockets が裏で何をやってくれていたかとか意識したことがなかった。Rails 7 の新しいアセット管理の仕組みの理解も浅い。
うーん。

ここまでで数時間，いや十時間くらい溶かしただろうか。

# 解決

ふと，`public` ディレクトリーの下に `assets` が出来ていることを思い出した。
こいつを消してみたらどうなるのか。
`assets` をディレクトリーごと削除して，

```
bin/dev
```

をいったん落として再起動してみたところ，記述したスタイルが反映された。
この状態で `app/assets/builds/application.css` の記述を変更し，ブラウザーで画面をリロードしてみると，即座に反映された。

なんのことはない，development 環境であっても `public/assets` にスタイルシートがあればそれが読み込まれるというだけのことであったらしい。
まだ完全に理解できたわけではないが，だいたい分かった。いちおうこれで解決。

Rails のアセット管理が分かっている人にすれば「あたりまえやん」なのかもしれないが，Rails 7 という未知の世界に足を踏み入れ，大いに迷ったのであった。

# あとがき

これ，Rails 7 未満でも同じなんですかね？

development 環境はローカルだけで使い，production 環境は本番サーバーだけで使う，というのが普通だと思うが，たとえば自分だけが（自分の特定のマシン上だけで）使う住所録を Rails で作ったとき，同じ場所で development でも production でも使うっていうことはあると思うんだけど，そういう場合はどうすればいいのだろう？
SwiftUIのドロップダウン、ホイール、メニュー、Picker

# 選択メニューを作る方法です

# 選択UIを表示したい
ユーザーに選択肢の中から選んでもらうメニューをSwiftUIで実装するには、Pickerを使います。

# 方法

```swift
struct ContentView: View {
    @State var languages:[String] = ["English","Russian","Ukrainian"]
    @State var greetings:[String:String] = ["English":"Hello",
                                            "Russian":"Привет привет(Privet privet)",
                                            "Ukrainian":"Привіт привіт(Pryvit pryvit)"]
    @State var selectedLanguage:String = "English"
    var body: some View {
        HStack {
            Picker(selection: $selectedLanguage, label: Text("languages"), content: {
                ForEach(languages, id:\.self) { value in
                    Text("\(value)")
                        .tag(value)
                }
            }).onChange(of: selectedLanguage) { newValue in
                print(newValue)
                // Do with selected value
            }
            .pickerStyle(.menu)
            Text(greetings[selectedLanguage]!)
        }
    }
}
```

# pickerStyle

menu
![スクリーンショット 2022-03-13 9.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d4cb1070-d799-7be0-fe7f-7f317ad9c5e3.png)

segmented
![スクリーンショット 2022-03-13 9.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/01705a03-cc4d-dea1-05d0-7dc6dd2ba81e.png)

radioGroup

![スクリーンショット 2022-03-13 9.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2cca5598-ec73-f7bd-bcd0-eb675fad366f.png)

iOSではこれに加えてwheelが使えます。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Autify 2022年3月2日のリリース

# Autify 2022年3月2日に最新のリリースがありました

[2022年3月2日のリリース](https://autify.zendesk.com/hc/ja/articles/4560865694873-2022%E5%B9%B43%E6%9C%882%E6%97%A5%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9 "2022年3月2日のリリース")

気になる点をピックアップしてみていきましょう。

## 1.1. テストプラン詳細画面から実行履歴を確認可能に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/f4f61728-18fa-fe6c-a172-f46c283fefd4.png)


リリースノートにもあるように、右わきに「直近の実行」欄ができました。
いつ実行したかわかるので、便利ですね。
クリックすることで、その実行結果に移動して、その詳細が確認することができます。


## 1.3. APIから既存のURL置換設定を変更可能に

テスト環境と本番環境、Salesforce で言うと、Developer環境とSandBox環境、本番環境といくつかあるかと思います。
Autifyでレコーディングする場合、URLが異なるので、それぞれの環境でレコーディングする必要がありましたが、この「URL置換設定」をすることで、URLを切り替えてくれる機能です。

Autifyの画面からは以下の「シナリオ内のURL置換」の設定になりますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/df274194-a096-27d6-74e6-9ad8083cc287.png)

それが、APIでできるようになった、とのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/75139257-d1bc-eae6-fbb0-36a3456321ca.png)


## 1.4. JavaScriptスニペットのサイトがオープン

タイトルの通り、JavaScriptスニペットのサイトがオープンされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/06d89998-b6c8-f64f-a4ea-3c314ed85cb5.png)

右の「言語」で「日本語」にできます。
左横の🌞マークは、Darkモード／Lightモードの表示モードを切り替えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/9b6e7bb7-a276-6376-36b4-c4b39861ee85.png)

日本語になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/750b20d1-3fed-f7f5-638e-2f99b1505ea3.png)

いくつか気になるサンプルコードがあるので、
今後、確認していきたいと思います。

## その他の更新

その他の更新もあるので、リリースノートを確認してみてはいかがでしょうか。


# 情報
- Autify https://autify.com/ja
- Autify 2022年3月2日のリリース https://autify.zendesk.com/hc/ja/articles/4560865694873-2022%E5%B9%B43%E6%9C%882%E6%97%A5%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9
- Autify JavaScript Snippets https://autify-javascript-snippets.netlify.app/ja/
【React / useRef】要素の位置、大きさを取得する

# はじめに
ReactでHTML要素の大きさ（幅、高さ）、位置を取得したい場面があり、そのときの実装メモ。

※ TypeScript を使っています

# 実装
## カスタムフックを作る

```useGetElementProperty.ts
// 引数のtargetProperty をDOMRectのもつPropertyに限定する
type DOMRectProperty = keyof Omit<DOMRect, 'toJSON'>;

// RefObjectの型は div, span, p, input などのさまざまなHTML要素に対応できるようにextendsで制限をかけつつ抽象化
export const useGetElementProperty = <T extends HTMLElement>(
  elementRef: RefObject<T>
) => {
  const getElementProperty = useCallback(
    (targetProperty: DOMRectProperty): number => {
      const clientRect = elementRef.current?.getBoundingClientRect();
      if (clientRect) {
        return clientRect[targetProperty];
      }

      // clientRect が undefined のときはデフォルトで0を返すようにする
      return 0;
    },
    [elementRef]
  );

  return {
    getElementProperty,
  };
};
```

#### 補足

↓これは

```ts
type DOMRectProperty = keyof Omit<DOMRect, 'toJSON'>;
```
↓これと同じこと

```ts
type DOMRectProperty =
  | 'height'
  | 'width'
  | 'x'
  | 'y'
  | 'top'
  | 'right'
  | 'bottom'
  | 'left';
```


## Componentで利用する
カスタムフックを呼び出して利用する。

```ts
const Home: NextPage = () => {
  const targetRef = useRef(null);
  const { getElementProperty } =
    useGetElementProperty<HTMLDivElement>(targetRef);

   return (
    <div>
      {/*値を取得したい要素にRefをセットする*/}
      <div ref={targetRef}>
        {/*~~~~~~省略~~~~~~*/}
      </div>
    </div>  
```

取得した値をコンソールに出力してみる

```ts
const Home: NextPage = () => {
  const targetRef = useRef(null);
  const { getElementProperty } =
    useGetElementProperty<HTMLDivElement>(targetRef);

  useEffect(() => {
    console.log("height", getElementProperty("height"));
    console.log("width", getElementProperty("width"));
    console.log("x", getElementProperty("x"));
    console.log("y", getElementProperty("y"));
    console.log("top", getElementProperty("top"));
    console.log("right", getElementProperty("right"));
    console.log("bottom", getElementProperty("bottom"));
    console.log("left", getElementProperty("left"));
  }, []);

  return (
    <div>
      {/*値を取得したい要素にRefをセットする*/}
      <div ref={targetRef}>
        {/*~~~~~~省略~~~~~~*/}
      </div>
    </div>
```
取得できた！

![](https://storage.googleapis.com/zenn-user-upload/e503ab388f2d-20220313.png)

# 最後に
ありがとうございました！！

### 参考
- https://developer.mozilla.org/en-US/docs/Web/API/DOMRectReadOnly
- https://qiita.com/akifumii/items/3927c8fb9b5a552086e8
Qiitaの記事にディレクトリ構造を記述するにはどうするか？

## はじめに
今回は、下記のようにQiitaの記事にディレクトリ構造を記述する方法をお伝えします。
```:ディレクトリ構造
.
├── Dockerfile
└── src
    ├── Gemfile
    ├── Gemfile.lock
    └── app.rb
```

## 結論
以下の手順を行えばOKです。

#### 1. ターミナルでtreeコマンドを実行
```bash
$ tree
```

treeコマンドは、現在のディレクトリ以下の構造をテキストで表示してくれます。

私の環境では、実行結果はこのようになります。

```bash:ディレクトリ構造
.
├── Dockerfile
└── src
    ├── Gemfile
    ├── Gemfile.lock
    └── app.rb
```


ここで、もし「treeコマンドがないよ」と表示されたらどうしたら良いでしょうか？
```:treeコマンドがないよ！
zsh: command not found: tree
```

簡単です。

treeコマンドをインストールしましょう！

```bash:MacOSの場合
brew install tree
```

```bash:Debian系Linuxの場合
apt install tree
```

```bash:RedHat系Linuxの場合
yum install tree
```

インストールが終了したら、再度treeコマンドを実行してください。

### 2. Qiitaの記事にコピペ
1.の実行結果をコピーし、Qiitaの記事の編集画面でペーストします。
![c7e0a1d99f91d212445469e04317adc5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238817/13b779c3-54c4-0d00-a147-aa55960f0c40.gif)

```:ディレクトリ構造
.
├── Dockerfile
└── src
    ├── Gemfile
    ├── Gemfile.lock
    └── app.rb
```

するとどうでしょう。

綺麗にディレクトリ構造が記述できました！

ポイントとしては、「```」で囲っておくことをおすすめします。

「```」で囲うと、自動的にコードブロックとしてレンダリングしてくれます。

【参照】
https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code---コードの挿入

## おわりに
treeコマンド、とても便利ですね！

これからも活用していきます。

それでは。
Problem 97: 非メルセンヌ素数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 97. 非メルセンヌ素数

原文 [Problem 97: Large non-Mersenne prime](https://projecteuler.net/problem=97)

**問題の要約：2004年に見つかった非メルセンヌ素数は2,357,207桁の$28433 \times 2^{7830457}+1$であるがこの数の下10桁を求めよ**

Pythonの整数はメモリのある限り桁数が無制限なので普通に計算しても答えが出てしまうのがすごいですが、ここは**pow**関数を使ってmoduloを指定すれば効率的に解くことが出来ます。

ちなみに[メルセンヌ素数(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E6%95%B0)とは$2^n − 1$で表せる素数のことで、素数判定がしやすいので現在見つかっている巨大な素数の多くはメルセンヌ素数だそうです。

```python 
m = 10**10
print(f"Answer: {(28433*pow(2,7830457,m)+1)%m}")
```

（開発環境：Google Colab）