OmniAICreator/Qiita-1.07M huggingface dataset:
全探索 ~2のN乗分2進数全パターンの配列を作成する~

タイトルの通り、2^N分2進数配列を全パターン作成するアルゴリズムを紹介します。
文章では伝わりずらいので、コードで。
例えば2^2の場合、
``` javascript:index.js
let list = [
    [0, 0],
    [0, 1],
    [1, 1],
    [1, 0],
];
```

この2進数のすべてのパターンの配列を作成するには、2^N分配列の作成が必要になります。


# この配列のメリット
話は前後しますが、この2進数のすべてのパターンの配列があると何がうれしいかと言うと、N個の数値でそれぞれ異なるデータが存在する（重複OK）場合に全部を足したり引いたり、一部だけ足したり引いたり、足さなかったりの全パターンを簡単に計算することができます。


# 前提条件・データ説明
ではさっそく、今回は貿易を例に計算していきます。
自国日本では、A国、B国、C国と貿易取引を行っていると仮定します。


|    国    |   【輸出額】      |     【輸入額】                 |
|:----------:|:---------------:|:------------------------:|
| A国   | 100億円        | 120億円      |
| B国 | 75億円          | 35億円              |
| C国     | 35億円 | 110億円          |


この際の貿易収支の全パターンを計算してきましょう。
指数計算の全パターンの計算後のイメージは以下のようになります。
``` javascript:index.js
let list = [
    [0, 0, 0, 0, 0, 0], // A輸出フラグ、B輸出、C輸出、A輸入、B輸入、C輸入
    .
    .
    .
    [1, 1, 1, 1, 1, 1]
];
```

# 実装
それでは、以下に実際に計算のコードを記載していきます。
```javascript
/**
 * 2^N分の2進数全パターンを取得
 * @param {number} N 指数
 */
const getAllIndexPattern = (N) => {
    const ret = [];
    // ループの回数が2^N
    for (let i = 0; i < Math.pow(2, N); i++) {
        const arr = [];
        // i.toString(2)で数値を2進数に変換する
        // その後左を0 padding
        const str = i.toString(2).padStart(N, '0');
        for (let j = 0; j < str.length; j++) {
            arr.push(Number(str[j]));
        }
        ret.push(arr);
    }
    return ret;
};
```
これの実行結果が、以下です。（実際にDeveloper toolとかで呼び出してみてください）
今回ではNが6になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/fb036d8b-0f23-7075-ac6c-b2637837cb7a.png)
見切れちゃうので、lengthだけ見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/24e0c22d-6489-9fab-b378-cccdd4203709.png)
ちゃんと2^6=64が出力されていることが分かります。

それではこの2進数全パターンを用いて、貿易収支の全パターンを計算します。
```javascript
// 貿易収支の計算上、輸入＞輸入だと黒字、輸入＜輸入だと赤字のため、輸入にマイナスをつけている
const TRADE_LIST = [100, 75, 35, -120, -35, -110];

const allIndexPatternArr = getAllIndexPattern(6);
let result = [];
allIndexPatternArr.forEach(allIndexPattern => {
    let sum = 0;
    for (let i = 0; i < allIndexPattern.length; i++) {
        sum += TRADE_LIST[i]*allIndexPattern[i];
    }
    result.push(sum);
});
// 重複削除
result = Array.from(new Set(result));
// 降順ソート
result.sort((a,b) => b - a);
```
実際に全部で38パターン（重複：26件）という結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/7ace131e-7926-3f34-fd84-b66c76264acf.png)
この結果、
『**貿易黒字**のパターンは16パターン、**赤字**は21パターン、**どちらでもない**1パターンの計38パターンが貿易収支の結果としてあり得えます。』
みたいな、解釈に使うことも可能です。


:::note info
ちなみに今回Javascriptで計算しましたが、Pythonでも2^N分の2進数全パターンを取得のプログラムは書くことができ、さらにスマートにコーディングできます。
:::

```python
def get_all_index_pattern(n):
    return [list(format(i, f'0{n}b')) for i in range(2**n)]
```

以上。
'eb' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。の解決方法

理由はpathが通っていないため

```
pip show awsebcli
```

と打ち、awsebcliがあるロケーションを確認

```
Location: c:\users\[ユーザー名]\appdata\roaming\python\python39\site-packages
```

が分かり、ユーザー環境変数のpathにこれを追加したが、改善されなかった。

<h1>解決方法</h1>

```
C:\Users\[ユーザー名]\AppData\Roaming\Python\Python39\Scripts
```

をpathに通す


Scriptsフォルダにeb.exeがあるから？？
【Docker】DockerDesktopが起動しない場合の対処法

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## DockerDesktopが起動しない場合の対処法

### 環境
- PC ： MacBook Pro (13-inch, M1, 2020)
- OS ： macOS Monterey 12.3
- Docker Desktop ： 4.6.0（75818）

### 状況
下画像赤枠の「Use gRPC FUSE for file sharing」をオフにした後、「Apply & Restart」し、DockerDesktopを再起動したところ「Docker Desktop Starting...」のままで起動しなくなりました。

![スクリーンショット 2022-03-21 0.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e5fd462a-d149-c72c-4f5b-dfa7ab36f3d8.png)

### 試したこと
* 「Reset to factory defaults」の実行
「Troubleshoot」の「Reset to factory defaults」を試みましたが、起動には至りませんでした。

![スクリーンショット 2022-03-21 0.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/09926917-9ba5-7f8a-8e29-8ecc5a91a91f.png)

* `brew uninstall --cask docker` `brew install --cask docker`の実行
homebrewからインストールしたものだったので`brew uninstall --cask docker` `brew install --cask docker`を実行しましたが、「Use gRPC FUSE for file sharing」がオフになったままで、再インストール前と変わらず、「Docker Desktop Starting...」のままで起動しませんでした。

### 改善した方法
ターミナルで以下のコマンドを実行し、Dockerを完全にアンインストールした後に再度`brew install --cask docker`を実行したところ、正常に起動しました。

```:ターミナル
sudo rm -Rf /Applications/Docker.app
sudo rm -f /usr/local/bin/docker
sudo rm -f /usr/local/bin/docker-compose*
sudo rm -f /usr/local/bin/docker-credential-desktop
sudo rm -f /usr/local/bin/docker-credential-ecr-login
sudo rm -f /usr/local/bin/docker-credential-osxkeychain
sudo rm -Rf ~/.docker
sudo rm -Rf ~/Library/Containers/com.docker.docker
sudo rm -Rf ~/Library/Application\ Support/Docker\ Desktop
sudo rm -Rf ~/Library/Group\ Containers/group.com.docker
sudo rm -f ~/Library/HTTPStorages/com.docker.docker.binarycookies
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
sudo rm -f /Library/LaunchDaemons/com.docker.vmnetd.plist
sudo rm -Rf ~/Library/Logs/Docker\ Desktop
sudo rm -Rf /usr/local/lib/docker
sudo rm -f ~/Library/Preferences/com.docker.docker.plist
sudo rm -Rf ~/Library/Saved\ Application\ State/com.electron.docker-frontend.savedState
sudo rm -f ~/Library/Preferences/com.electron.docker-frontend.plist
```

改善しなかった方法とは異なり、初回起動時に以下の画面が表示されました。

![スクリーンショット 2022-03-21 0.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9bcc9473-a3e4-de8c-1cd8-b7bc9ff29e4b.png)
2022/3/21主にITとかセキュリティの記事

ブリヂストンにサイバー攻撃、狙われるサプライヤー(3/18)
https://s.response.jp/article/2022/03/18/355318.html?utm_source=https://tokiocyberport.tokiomarine-nichido.co.jp/&utm_medium=referral

国際ハッカー集団「アノニマス」
https://www.jiji.com/sp/d4?p=any316&d=d4_et

米CISAとFBI、国際衛星通信ネットワークの脅威を緩和するセキュリティアドバイザリ(3/18)
https://news.mynavi.jp/techplus/article/20220318-2296901/

米CISAとFBIが米国の衛星ネットワークへの脅威を警告、Viasatへのサイバー攻撃を受け(3/19)
https://jp.techcrunch.com/2022/03/19/2022-03-18-cisa-fbi-satellite-networks/

ロシア関与の「Cyclops Blink」ボットネットがASUS製ルーターを標的に(3/18)
https://japan.zdnet.com/article/35185064/

【見直し迫られる部品会社との関係】トヨタの部品会社にサイバー攻撃(3/18)
https://news.mynavi.jp/techplus/article/20220318-2296772/

3月15日は「ドメインの日」、選択したドメインで「.jp」が「.com」を上回る【さくらインターネット調べ】(3/18)
https://webtan.impress.co.jp/n/2022/03/18/42496

おっと、macOS Monterey 12.3へのアプデは気をつけて！(3/18)
https://www.gizmodo.jp/2022/03/trouble-with-repaired-mbp-becoming-inoperable-on-macos-12-3.html

（注意喚起）島根大学を騙った不審なメールについて(3/18)
https://www.shimane-u.ac.jp/docs/2022031800013/

「Internet Explorer 11」の引退まであと3カ月を切る ～Microsoftが改めて注意喚起(3/17)
https://news.yahoo.co.jp/articles/6b829bb18f4c3b6b316f82e1b0643a50e092ff2d
AppStoreConnectでrejectされた場合の再審査対応について。

先日、プロジェクトのリリース対応でiOSの審査を出しておりました。
その際、以下の理由で審査がリジェクトされてしまいました。

Guideline 2.1 - Performance - App Completeness

この時の問題自体はアプリではなく、DB側の設定だったためすぐに問題を解消することができました。

AppStoreConnectでリジェクト際に該当のAppから解決より返信を行い、
きちんと説明できれば通常のフローよりも割と早く再審査されるようです。
（体験はしてないので分からないですが、他の方の記事を見ていると割と数時間で審査が完了するみたいなこともあるようです。）

ただし、私はそのことを知らずに焦ってしまい、再審査をしてもらうために再度申請からやりなおしてしまいました。

みなさん、リジェクトされてもすぐに再審査してもらい場合はあせらずに返信から行いましょう！

備忘録として残しておきます。

2022/3/23 追記
上記の内容ですが、iOSの審査自体は日本時間の深夜2時〜明朝7時ぐらいの間に行われている印象です。
優先リクエスト自体を日本時間のお昼に出したとしても、審査は上記の時間帯に行われる可能性がめちゃくちゃ高いです。（お、お昼でもやってくれるんやな！とか勘違いさせてしまっていたらすいませんでした！）
画像投稿で画像が表示されないエラーの対処【Ruby on Rails】

### 画像投稿時のエラー

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316171/c0fe7f62-9610-5523-aaa7-8337d8cba2f1.png)

コードは載せていませんが、上の画像の「新規投稿」画面で「ファイルを選択」から画像と、テキストを記入し、「投稿する」を押したところ、投稿はされたものの下記の画像のように画像だけが表示されない現象が起きました。

![新規投稿_画像表示されず.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316171/106b6391-acbb-2ca2-b703-ebf3626abb19.png)

　画面上では何がエラーなのか分からなかったので、「rails s」を実行したコンソールで何か出ていなか確認したところ、下記のようなエラー内容が出ていました。

```:コンソール　rails s
MiniMagick::Error (You must have ImageMagick or GraphicsMagick installed):
```

翻訳すると、「ImageMagickまたはGraphicsMagickがインストールされている必要があります」といった内容。


そこでエラー内容を調べたところ、「ImageMagick」のインストールをして解決したという記事を複数見つけたので、早速試してみることに。
参考：[【解決】Image Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: You must have ImageMagick or GraphicsMagick installed](https://qiita.com/___fff_/items/1c70fe04e4f7ea1c12be)

```:ImageMagickのインストール
brew install imagemagick
```

MacBookが物凄いファンの音と発熱をしながら、頑張ってインストールしてくれたお陰？で、インストール後、無事に画像投稿に成功しました！

![画像投稿成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316171/db939721-e705-df2b-5f68-c4a11e1971bc.png)


次に画像を投稿せずに、テキストだけ投稿したらどうなるか試したところ、嫌な予感はしましたが、いつも通りエラーが出ました。　このエラーの対策はRailsチュートリアルに何か書いてあるだろうと思い検索したところ、「attached?」という論理値を返すメソッドを使って対処していることが分かりましたので、見様見真似で下記のように修正。

```:変更前
     <%= image_tag @post.image.variant(resize: "570x570") %>
```

```:変更後
     <%= image_tag @post.image.variant(resize: "570x570") if @post.image.attached? %>
```

修正したところ、テキストだけの投稿も表示することが出来ました！！！:sob:
インクリメンタルサーチでサーバー側のAPIを書くのがめんどくさいので何とかした話

# 注意!!
全てのシーンでのインクリメンタルサーチに対応できません。
数が少なく、更新頻度がかなり少ないorないレコードをインクリメンタルサーチする場合のみ適用できます。

# 何を言ってるの？
フロント検索UIで文字をタイピングした段階で検索した文字列にヒットしたDBにあるレコードを探す機能を作成した際のTipsです。

たとえば、100レコードほどしかなく、本人しか追加、削除しないなどの性質をもったテーブルです。
最初のレンダリング時に、DOMに持っておいて、DOM上で検索できるようにすれば、サーバー側に通信なく、データを表示非表示できると思ったので、実践してみました。
普段使わないあまり使わないであろうXpathでの実装です。


# コードはこんな感じ

CSS
```css
display-none {
   display: none;
}
```

TypeScript
```ts
    // 検索フォーム
    this.search = <HTMLInputElement>>document.querySelector('#search');
    // 検索対象のDOM
    this.searchTargets = <NodeListOf<HTMLElement>>document.querySelectorAll('.target');

    // イベントリスナー
    this.search.addEventListener("keyup", this.searchKeyUpHandler());

    /**
     * 検索窓に入力された文字列で検索
     *
     * @param e HTMLElementEvent<HTMLInputElement>
     */
    private searchCallTrackingWordKeyUpHandler = (e: HTMLElementEvent<HTMLInputElement>) => {
        e.preventDefault();

        // 文字が入力されてなければ、全ての行を表示し処理終了
        if (e.currentTarget.value.length == 0) {
            for (let i: number = 0, len: number = this.searchTargets.length; i < len; i++) {
                this.searchTargets[i].classList.remove("display-none");
            }
            return;
        }

        // 初期化(全て非表示)
        for (let i: number = 0, len: number = this.searchTargets.length; i < len; i++) {
            this.searchTargets[i].classList.add("display-none");
        }

        // xPathに変換し、検索窓に入力された文字列でテキストノードを取得
        const xPathTextNodeResult: XPathResult = document.evaluate(
            `//div[contains(@class, 'target')]/div/text()[contains(., "${e.currentTarget.value}")]`,
            document,
            null,
            XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
            null
        );

        // テキストノードの数
        let snapshotLength: number = xPathTextNodeResult.snapshotLength;

        // テキストノードの親要素を取得し、表示する
        while (snapshotLength--) {
            const searchTarget = xPathTextNodeResult.snapshotItem(snapshotLength)!.parentElement!.closest('.
target')!;
            searchTarget.classList.remove('display-none');
        }
    }
```

https://developer.mozilla.org/ja/docs/Web/API/Document/evaluate


# メリット・デメリット

* メリット
フロント・サーバー側に記述が少なくなるはず。
DOMそのものを書き換えないので、検索した結果にイベントリスナーなどする場合は一度で済む(API通信だと、今描画してる検索結果のDOMを削除して、再度、createElementし、イベントリスナーする流れだと思われるが、この手法だと表示非表示なので、SSR時などに一度だけイベントリスナーすれば良い）

* デメリット
裏で、更新された場合、リアルタイムで最新の情報が得られない。あくまでSSR時の情報だけ。
ffmpeg 2560*1080の動画から1920*1080の部分だけ切り出す

# はじめに
タイトルのことができるコピペコマンドを探しても見つからなかったので投稿。
このようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/e92aefe9-b7b7-862f-f285-cbd4a25c8eea.png)

※ffmpegも動画ファイルのフォーマットも全く詳しくないです

# 実行環境
- Windowds 10
- ffmpeg version2022-03-17-git-242c07982a-full_build-www.gyan.dev


# コマンド

```bash
// GPUを利用しないエンコード
ffmpeg -i test.mp4 -vf crop=1920:1080:320:0 output.mp4

// GPUを利用したエンコード
ffmpeg -i test.mp4 -vf crop=1920:1080:320:0 -vcodec h264_nvenc output.mp4
```

※ffmpegでGPUエンコーディングするためには、諸々準備が必要です
参考：[ffmpeg で GPU エンコードできるようにする](https://neos21.net/blog/2022/01/28-01.html)

# 参考サイト
- [FFmpeg > クロップ-領域を指定して動画出力](https://w.atwiki.jp/kobapan/pages/173.html)
Tableau Publicでパラメーターの使い方がわかってきた＜メモ＞

# インポート

「Tableau Public」の「パラメーター」機能の使い方がわからなかったのですが、少しづつ理解できてきたので、メモをしておきます。
データは、首相官邸サイトの「新型コロナワクチンについて」から。

https://www.kantei.go.jp/jp/headline/kansensho/vaccine.html

データを取り込んで、表形式に配置します。
今回は、県名をパラメーターとして使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/fc4fd7f6-ae2a-3b19-8794-67d4c6236de4.png)


# パラメーター作成

県名列のフィールドをクリックし、「パラメーター」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d30ad35e-cd9a-2860-bc40-6ece18cf7d25.png)


# 名前と初期値設定

パラメーターの名称と、初期値（現在の値）を指定しておきます。
その際、「許容値」を「リスト」とし、値のリストに県名列を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e554ace4-abe9-2a66-b4e8-a0f33dd61808.png)


# パラメーター作成

OKをクリックすると、左パネルの下側にパラメーターが設置されます。
これを他のフィールドと同様に計算式に使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/67bcc6de-613a-2305-f60d-bd88508fd132.png)


# 計算フィールド準備

県名列に「計算フィールド」を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/86f78ed8-5bd7-887a-862b-2f6fe2d50131.png)


# 計算式設定

パラメーターで設定した県名の値をピックアップするようにします。
まず今回は、文字列をパラメーターとして使ったので、「県名列　=　パラメーターで選択したもの」というシンプルな式としています。
日付型をパラメーターとする場合「開始日～終了日（Date >= 開始日 & Date <= 終了日）」ということができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/dcf04eb8-9b64-cd91-eb7e-589016c0a9a9.png)


# フィルターに設定

計算式を「フィルター」枠にドラッグします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/97552f87-66f1-4780-b458-9fdea7e9202d.png)


# 「真」を選択

「フィルター編集」で「真」を選びます。
「真=初期値で設定した"北海道"」です。
「偽="北海道"以外の全県」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/4f8f7f1b-22e7-f52a-f1ed-4d731521a676.png)


# フィルターI/F利用

フィルター枠に設置した計算フィールドを右パネルに表示させます。
こうすると、ラジオボタンやドロップダウンで県名を選べ、その値が計算式に渡され、表が更新されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/6ac5f4c1-9d3b-c9ba-17d6-4bff4f7ff8e2.png)


# フィルター値変更

例えば、「東京都」を選ぶと、表も東京都の数値に切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/00700dd2-a541-60d9-aea6-194bfdfd6ea5.png)

**了**
'virtualenv' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。が表示されたとき

Windows11のtmdで

```
virtualenv [環境名]
```

と打ち込んだ時、

```
'virtualenv' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

と表示された


<h1>解決方法</h1>

```
python -m venv [環境名]
```

と打つ。

その後、

```
[環境名]\Scripts\activate
```

で仮想環境をアクティブ化できる。
AWS Robot Delivery Challenge 2022 に出場できなかった話 : タスクプランニング

概要を読んでいない方は先にこちらを読んでください！
[目次のページ](https://qiita.com/KyoBashi/items/153aff5ce8af7111b537)
## はじめに
![](https://i.imgur.com/z88WpWD.png)

今回は上図のcommanderの部分について説明します．
WebUIから指令をうけとって，ロボットの各機能を操作する，いわば司令塔に相当する機能です．

## Commanderの制御フロー
WebUIは以下のような画面になっています．

![](https://i.imgur.com/kcHeuD1.jpg)

画面右上のControllerから確認できるように，送られる指令は以下の4つです．
* Dijkstra
* Navigation
* Manual
* Auto

それぞれの指令が送られたときのCommanderの対応について以下で説明します．
### Dijkstra
この指令を送る際は事前にMapで経由したい箇所（あれば）と目標地点の番号をクリックします．そのあとこの指令を送ることで，指定した番号のリストにあった最適経路が帰ってきてロボットが動くという仕組みになっています．

* アルゴリズム
①ターゲットポイントをdijkstraノードに送り，初期目標姿勢を受け取る．
②現在位置と初期目標姿勢から頭とお尻の近い方を目標姿勢に近づける．
③ロボットがどちら向きかをplannerノードに送る．
④kanayama_controlノードを動かす．
### Navigation
この指令を送る際は事前にMapで目標地点の番号をクリックします．
そのあとこの指令をおくることで，目標位置までロボットが動くという仕組みになっています．
* アルゴリズム
①stop_controlで全コントローラを止める．
②ターゲットポイントをposition_controlノードにおくる．
### Manual
これは，ロボットのコントロールを手動に切り替えるという指令になっています．ロボットの前に移動する障害物が来たり，不測の事態が起こった時に手動に切り替えるための機能です．
* アルゴリズム
①stop_controlで全コントローラを止める．
②manual_controlノードを動かす．
### Auto
これは，Kanayama Controlを再開させる指令になっています．
主にManualからの切り替えで使用します．
* アルゴリズム
①stop_controlで全コントローラを止める．
②kanayama_controlノードを動かす．
AWS Robot Delivery Challenge 2022 に出場できなかった話 : Kanayama Control

概要を読んでいない方は先にこちらを読んでください！
[目次のページ](https://qiita.com/KyoBashi/items/153aff5ce8af7111b537)
## はじめに
![](https://i.imgur.com/FUkgQ6x.png)

今回は上図のkanayama_controlの部分について説明します．
コントローラにはKanayama Controlという手法を用いました．
車両制御にはよく用いられる手法で，以下の論文を参考にしました．
https://ieeexplore.ieee.org/document/126006

Kanayama Controlでは，Plannerから参照位置と参照制御入力を受け取り，自己位置推定を行うノードから自己位置を取得し，制御入力を計算しています．
AWS Robot Delivery Challenge 2022 に出場できなかった話 : ダイクストラ法

概要を読んでいない方は先にこちらを読んでください！
[目次のページ](https://qiita.com/KyoBashi/items/153aff5ce8af7111b537)

## ダイクストラ法とは
グラフ理論におけるアルゴリズムの一つで、グラフ上の2頂点間の最短経路を決定するアルゴリズムです。今回はコース上の２点間を最速で移動する経路を導くアルゴリズムとして使用しました。頂点の位置は下図のように決定し、各辺の重みは各ノード間を移動するのにかかる所要時間となります。これらの所要時間は最適制御によって計算されたものになっています。


![](https://i.imgur.com/QHiPk0G.png)



## アルゴリズム
この記事を参考にしました。
https://myenigma.hatenablog.com/entry/20140502/1399001915

## 全体としての位置付け
![](https://i.imgur.com/Uz8H5pP.png)


## 実装
1. commanderから通過するノードの順序を受け取る(始点、中継点、中継点、、、終点)
2. 始点から中継点を通過して終点に最短で到達するためのノードの順序をダイクストラ法で導く。
3. ダイクストラ法で導いたノードの順序通りに、経路を繋ぎ最適経路を生成する。(ノード間の経路はあらかじめ最適制御で計算されていて、離散化された座標、各座標でのロボットの目標速度、目標角加速度がcsvファイルの形式で格納されている。)
5. 生成した最適経路の情報（離散化された座標、ロボットの目標速度、目標角加速度）を黄金探索に渡す。

![](https://i.imgur.com/qlhP6ny.png)
Apacheで80番以外のポート番号を指定する

# 目的
Apacheを使用したWebサーバではデフォルトで80番のポート番号を使用している。
ポート転送をする際に、80番ポート以外を使用したい時が出てくるかと思います。   
そこで、80番以外のポート番号を指定してWebサーバへアクセスする方法を記載する。

# 環境
windows10
VMware Workstation 16 Player
CentOS7
Apache

# 前提
VMware Workstation 16 Player上に、CentOS7を構築し、Apacheがインストールおよび起動している状態   
`http://IPアドレス/`へアクセスすると以下の画面が表示される  
※IPアドレスはコマンド`ip a`で確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/c0210706-f3e2-6056-c0a9-c428b5c4edf1.png)

# 手順
今回、指定するポート番号は10001とする。  
## httpd.confを編集する
1.viでhttpd.confを開き、`Listen 80`を`Listen 10001`に修正する
```:httpd.confの開き方
[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
```

```:修正前
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
```

```:修正後
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 10001
```
2.httpdをリスタートする
```
[root@localhost ~]# systemctl restart httpd
```
## firewallの追加
1.ファイアウォールにポート番号10001を追加する
```:ポート番号追加
[root@localhost ~]# firewall-cmd --permanent --add-port=10001/tcp
```

2.ファイアウォールのリロード
```
[root@localhost ~]# firewall-cmd --reload
```
## ポート番号10001でアクセスする
`http://IPアドレス:ポート番号/`でブラウザからアクセスをすると下記画面が表示されることを確認。
今回の例では`http://IPアドレス:10001/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/c0210706-f3e2-6056-c0a9-c428b5c4edf1.png)

# 参考サイト
* https://www.javadrive.jp/apache/install/index6.html
* https://qiita.com/sh_mems/items/4d8e5f376025cf84dfdf
累積和

[問題](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0516)

```c++
int main() {
    // 入力
    int N, K; //個数、k番目までの和
    while (cin >> N >> K) {
        if (N == 0) break;
        vector<long long> a(N);
        for (int i = 0; i < N; ++i) cin >> a[i]; //数列

        // 累積和を前計算
        vector<int> s(N+1, 0);
        for (int i = 0; i < N; ++i) s[i+1] = s[i] + a[i];

        // 答えを求める
        long long res = -INF; // 最初は無限小の値に初期化しておく
        for (int i = 0; i <= N-K; ++i) {
            long long val = s[K+i] - s[i];
            if (res < val) res = val;
        }
        cout << res << endl;
    }
}
```
ハッキングラボの作り方で本通りにネットワークの構築ができない


**まえがき**
ハッキングラボの作り方をやっている中で本書通りにネットワークを構築できずかなり苦戦したので、書き残します。正直はっきりとした原因は分かりませんし、本書通りにはなっていませんが一応、図の通りになっていると思います。
私の場合、途中で諦めて本書を進めていく中で解決できました。
（と思う）

_____
**状態**
二つのLANは接続されているが「管理対象外」とついている。または
片方が接続されている状態になっている。
_____

**目標** ：P89にある④のIPアドレスを全て通す。

________
**考えられる原因**
・本書通りにし過ぎて間違たIPアドレスを入力している。
・ホストOSのファイアーウォールが邪魔をしている
・そもそもホストオンリーアダプタとNATでは矛盾した設定になっている。
________
原因１：**本書通りにし過ぎて間違たIPアドレスを入力している** 

これは本書では物理ネットワークのルーターのIPアドレスが[192.168.1.1]とありますが、これが自分の環境をみると違ってたりします。
自分の環境をしらべるにはホストにてipconfigコマンドを実行後「デフォルトゲートウェイ」という項目の右下にアドレスが書いてあります。ちょっと見直してみてください。

<br><br>

原因２：**ブリッジアダプタに設定する**

②の設定が終わった後に「インターネット」から「アダプター２」のNATをブリッジアダプターに切り替えることで解消できるそうです。私の場合はこれで二つ同時に接続している状態には持ち込めましたが、インターネットにつながらない状態になっていました。その後ブリッジアダプタをNATに切り替えて起動させると、
ルーターとインターネットにはアクセス出来ましたがホストオンリーアダプタにはアクセス出来ませんでした。ホストからはping通ります。ファイアーウォールが邪魔しているんだと思います。

<br><br>

原因３：**ホストOSのファイアーウォールが邪魔をしている**

これは原因②の続きにもなりますが、本書を進めるとP223でホストのファイアウォールを設定します。ここで私の場合ゲストからホストオンリーアダプタへのpingが通りました。

___
**参考サイト**
https://teratail.com/questions/348854

_______
**さいごに**
自分の文が下手だなと思いました。分かりづらいかもしれませんが誰かしらの解決の一役買えたら幸いです。

プライベートIPアドレスでよく出てくる「192.168.....」というのは語呂合わせで「いちくに  いちろっぱ」と覚えるそうです。これ、へぇ～って話ですよね....
pythonのbackoff



`@backoff`関連情報がないのでここにメモします。

pythonでbackoffは特定なエラーが発生するとそれをバックオップさせ、リトライをするデコレーターです。

まずpipインストールをします。

```
$ pip install backoff
Collecting backoff
  Downloading backoff-1.11.1-py2.py3-none-any.whl (13 kB)
Installing collected packages: backoff
Successfully installed backoff-1.11.1
```

簡単な例えを見ましょう。

```python
def test():
    number = int(input("Enter an integer: "))

test()
```



このコードを実行しintではない値を与えたらValueErrorが発生しますが、入力の誤りを三回くらいは勘弁しようと思います。方法は二つです。

* `input(...)`の結果をタイプをチェックしてintであればPass, そうじゃなければindicator変数を指定してこの変数が３を超えたらVauleErrorを発生させる。
* `@backoff`を使用する。

一番目はコードの修正範囲が広いので複雑になります。だから二番目を使用します。

```python
import backoff

@backoff.on_exception(backoff.expo,
                      ValueError,
                      max_tries=3)
def test():
    number = int(input("Enter an integer: "))

test()
```



実行結果です。

```
$ python3 3test.py
Enter an integer: e
Enter an integer: r
Enter an integer: t
Traceback (most recent call last):
  File "3test.py", line 9, in <module>
    test()
  File "/home/ubuntu/.local/lib/python3.8/site-packages/backoff/_sync.py", line 94, in retry
    ret = target(*args, **kwargs)
  File "3test.py", line 7, in test
    number = int(input("Enter an integer: "))
ValueError: invalid literal for int() with base 10: 't'
```

`@backoff`デコレーターで`max_tries=3`を設定するとリトライを三回してもう一度誤りの値が与えられたら`VauleError`を発生させます。

これが有用な場合はAPIサーバーとかDBのような異なるサーバーで接続する時です。次のコードはDB接続+HTTP request接続をするコードの一部の抜粋です(from the book “Robust Python”)。

```python
import backoff
import requests
from autokitchen.database import OperationException 
# setting properties of self.*_db objects will
# update data in the database

@backoff.on_exception(backoff.expo,
                      OperationException,
                      max_tries=5) 
def on_dish_ordered(dish: Dish):
    self.dish_db[dish].count += 1

@backoff.on_exception(backoff.expo,
                      OperationException,
                      max_tries=5) 
@backoff.on_exception(backoff.expo,
                      requests.exceptions.HTTPError,
                      max_time=60)
def save_inventory_counts(inventory):
    for ingredient in inventory: 
        self.inventory_db[ingredient.name] = ingredient.count

```

一番目の関数`on_dish_ordered`の`@backoff`はDBの接続が`OperationException`で失敗すれば最大5回までリトライさせます。

二番目の関数`save_inventory_counts`は`@backoff`を重ねて使用してます。`save_inventory_counts`がDBとHTTP.request両方を使っているので一番目の`@backoff`はDBの`OperationException`発生際5回まで、二番目の`@backoff`では`HTTPError`発生際60秒(`max_time=60`)までリトライさせます。
100日でSQLの達人になる@LeetCode! Day48 <日付周りFORMATをマスターする！>

## 615. Average Salary: Departments VS Company （問題レベル: Hard）要課金
今日の問題はこれ。
会社の月別部門ごとの売上を全体平均と比較した評価をリストアップするという問題。

まだまだ、`GROUP BY`で一緒に扱えない変数の処理などに戸惑ったりして頭の中がスッキリせずSQLの達人には程遠いです。
しかし、１か月半も毎日課題に取り組んでいると流石に成長を感じます。
`Hard`レベルの問題もちょっとしたコマンドの検索くらいで自力で記載できるようになってきました。
`WITH`句は使い慣れると便利。頭がスッキリしないときにとりあえず理想的な中間テーブルを作って置ける。
ただし、実行速度的には注意が必要なのかもです。

今回は`WITH`句を３つも使い、実行速度は遅いですが、理解はしやすい回答だと思います。
最終的に提出した答えはこれ。

```:SQL
WITH tb1 AS (
SELECT FORMAT(s.pay_date, 'yyyy-MM') AS pay_month, 
e.department_id, s.amount
FROM salary s
JOIN employee e
ON s.employee_id=e.employee_id
),

tb2 AS (
SELECT department_id, AVG(amount*1.0) AS mean, pay_month
FROM tb1
GROUP BY department_id, pay_month
),

tb3 AS (
SELECT AVG(amount*1.0) AS mean, pay_month
FROM tb1
GROUP BY pay_month)
    
SELECT a.pay_month, b.department_id,
CASE WHEN b.mean > a.mean THEN 'higher' 
     WHEN b.mean = a.mean THEN 'same'
                          ELSE 'lower' END AS comparison
FROM tb3 a
JOIN tb2 b
ON a.pay_month=b.pay_month
```

今日のポイントは日付周りの関数。
最初、日付は文字列扱いかと思い`LEFT()`, `SUBSTRING()`を使ったがエラー。
ポイントは`日付情報`のフォーマットは`FORMAT(日付変数,'書式')`を使う。

|書式|説明|出力結果例|
|---|---|---|
|yyyy|４桁の西暦|2022|
|yy|西暦下２桁|22|
|MM|月(ゼロ埋め)|03|
|M|月|3|
|dd|日(ゼロ埋め)|02|
|dd|日|2|
|yyyy-MM-dd|上記の組み合わせ例１|2022-03-20|
|yyyy/M/d|上記の組み合わせ例２|2022/3/2|
|HH|２桁の時間（２４時間表示0埋め）|15|
|hh|２桁の時間（12時間表示）|3|
|tt|PM/AM表示|PM|
|mm|分(ゼロ埋め)|09|
|ss|秒(ゼロ埋め)|03|
|dddd|曜日|Sunday|
|ddd|曜日省略|Sun|

日付の表示方法で覚えておきたいのはもう一つ
`CONVERT(VARCHAR,日付変数,数値でのフォーマット指定))`
数値でのフォーマット指定には色々ありますが、下記を覚えておけば良いでしょう。

|書式|出力結果例|
|---|---|
|111|2022/03/02|
|112|20220302|
|23|2022-03-02|
|8|23:09:03|



* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Androidアプリの更新リリースの方法

## 前提

- Androidアプリのリリース版のビルド・テストが完了していること
  - https://qiita.com/yiwa81/items/de2555a06fa9c4ea391a

- デベロッパーアカウントを登録済みであり、アプリの初回リリース済み

## リリース版パッケージの登録と内部テストの公開

- Google Play Consoleで対象のアプリを選択
- 「テスト」>「内部テスト」 を選択し、「新しいリリースを作成」を選択
- 「内部テスト版リリースの作成」画面において
  - Bundleファイル（署名済みaabファイル）をアップロード
  - 「リリースの詳細」を適宜記入
  - 「次へ」を選択
  - 「保存して公開」を選択
- 「内部テスト」画面において
  - 「このトラックは一時停止しています」という表示が出ている場合、「トラックを再開」を選択
  - 「テスター数」タブを選択
    - テスターが登録されていない場合、「メーリングリストを作成」を選択し、適宜テスターのアカウント（メールアドレス）を追加
    - 「テストへの参加方法」にあるリンクのURLを、テスターのアカウントに連絡

## 内部テストの実施

- テスターのアカウントにて、リンクのURLにアクセスし、「プログラムを開始」を選択
- テスターのアカウントの実機にて、Google Playで対象のアプリを更新
- テスターのアカウントの実機にて、アプリの動作を確認

## リリース前レポートの確認

- Google Play Consoleで対象のアプリを選択
- 「テスト」> 「リリース前レポート」>「概要」又は「詳細」を選択
- 登録したリリース版パッケージ（Bundle）で問題が起きていないか確認する
  - 登録してからリリース前レポートの結果がでるまで1時間程度かかることに注意

## 製品リリースの実施

- Google Play Consoleで対象のアプリを選択
- 「テスト」>「内部テスト」を選択
- 「リリースをプロモート」>「製品版」を選択
- 「リリースのレビュー」を選択
- 「保存」を選択
- 「概要に移動」を選択
- 「公開の概要」画面において、「1件の変更を審査に送信」を選択

上記実施すると、審査（数時間～1日程度）された後、公開される。
IAMユーザーを払い出してAWSの環境設定をメンターに確認してもらう

## 初めに
EC2にデプロイ等の理由からAWSでインフラ周りを構築することがあると思いますが、自力で解決できないエラーがコンソール上で起きた時、メンターに構築内容を確認してもらう手段についてご紹介します。

## IAMユーザーの払い出し
自分のコンソールからIAMユーザーを追加して、ログイン情報をメンターに伝え、自分のコンソールにログインできるようにしてあげればわざわざ画面共有やSlackでやりとりしなくて済みます。

IAMユーザーの登録手順まで紹介したいところですが、以下の記事にわかりやすく全て記載されているのでそちらを参考にして頂ければと思います。

https://tokku-engineer.tech/add-and-delete-iam-user/

不正ログイン等あれば追加したIAMユーザーを削除してしまえばログインできなくなるので安心です。
VueでRequire component names to be always multi-wordとかいうクソッタレなエラーが出たら

将来の要素と競合しないようにオリジナルなワードに（ケバブケースにしたりパスカルケースにしたり）しろってこと。

https://eslint.vuejs.org/rules/multi-word-component-names.html

```javascript
/* ✓ GOOD */
Vue.component('todo-item', {
  // ...
})

/* ✗ BAD */
Vue.component('Todo', {
  // ...
})
```
基本情報技術者試験対策　11日目

基本情報技術者試験勉強　11日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
実際の午前試験のように、80問解いて、9割以上正解率を目指す。


間違えた箇所
-
1,CSMA/CD方式
各ノードが伝送機体の使用中かを判断し、使用中でなければ、送信する
使用中だと、ランダムな時間の経過後、再度送信する

2、TDMA方式
タイムスロットで割り当てられたノードだけが送信する

3、優先度制御方式
各ノードに論理的な順位づけを行い、送信機を順次受け渡し、これを受け取ったノードだけが送信を行う。

4、トークンバッシング方式
各ノードを環状に接続して、送信権を制御するための特殊なフレームを循環させる
送信権を受け取ったノードが送信を行う

5、各ベンチマーク
①ドライストーン
整数演算の性能を評価する

②ウェットストーン
浮動小数点演算性能を評価する

③リバモア・フォートラン・カーネル
科学技術計算用

④リンバック
システムの浮動小数点演算性能を評価する

⑤SPEC
コンピュータの性能評価を測定する目的実施される

６、メモリコンパクション
主記憶上の外部フラグメンテーションを一つの連続領域にまとめる。

フラグメンテーション（断片化）
データをいくつかに分割して、記憶させられる

外部フラグメンテーション
可変長の領域を割り当てていくシステムで、空き領域が分割され、小さすぎるため、大きなデータを記憶できない

内部フラグメンテーション
固定調の領域を割り当てていくシステムで、割り当てられた領域に未使用の断片が生じる

7,ロールアウト
主記憶に空き容量がない状態の時に、優先順位の低いデータを補助記憶に対比させる

８、スラッシング
空き容量が少ない時に、オーバーヘッドが生じることで、CPUの使用率が低下する現象

オーバーヘッド
ある処理をするために、余分にかかる処理のこと

９、オーバレイ
主記憶よりも大きいプログラムを実行するときに、あらかじめ複数のモジュールに分割して、必要な分を記憶装置に実行する

１０、CRC方式
送信データから生成多項式によって誤り検出用のデータを付加して送信


振り返り
-
80問中58問正解という結果で、合格点には及ばなかった。やはりテクノロジー系の正答率が53%と一番低い。問題数もテクノロジー系が多いため、テクノロジー系を一番改善し、最低６０％はとる。一方で、マネジメント系とストラテジ系の正答率も上げ、８０％以上は取る。
次回は、計算問題を中心に取り組む。

>引用・参考
基本情報技術者試験ドットコム
https://www.fe-siken.com
IT用語辞典　e-words
https://e-words.jp/
本番環境でS3に登録した画像が表示されない

## 起きたこと
EC2にアプリをデプロイ後、アプリの動作確認をしていたところS3に保存した画像が表示できていないのを発見。

## 調査
EC2にデプロイする前にherokuにデプロイさせていたのですが、その時はS3に保存した画像を問題なく表示できていたので、今回の原因はビュー側でなく他のどこかしらの設定箇所に不備があると判断して以下の点を調査しました。

・シンボリックリンクの貼り付け確認
・.envの`AWS_BUCKET=`でバケット指定確認
・S3がパブリックになっているか確認

##解決
原因は、EC2上の/var/www/shared/.envの`APP_ENV`部分でした。
本番環境で動作させているのに、localで指定してしまっていた。。。

```
APP_ENV=local
↓ #変更
APP_ENV=production
```

.envを修正後、config:cacheで修正点を反映させて、再度画像登録で無事表示できました！

```
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
```
C言語 - offsetofの使い方を確認 

# offsetofマクロを使ったプログラム
offsetofマクロについて仕様を確認しました。
確認環境は以下の通りです。
|開発環境|OS|
|:---|:---|
|Microsoft Visual Studio Community 2019 Version 16.11.7|Windows 10 バージョン21H1|

## 使い方
offsetof(構造体名(struct xxx),メンバー変数名) ・・・ 構造体メンバーの先頭から指定したメンバーまでのオフセット値を返してくれます。
## 参考
[MSDN](https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/offsetof-macro?view=msvc-170)を確認ください。
## 何ができるの
offsetofは構造体のメンバーに対して適用します。
下記構造体をサンプルとします。
```cpp
	struct students {		// 生徒情報(構造体)
		char name[16];		// 氏名
		short belongto;		// 所属
		short age;			// 年齢
		long testaverage;	// テスト平均
	};
```
## サンプルプログラム
上記の構造体に対して、以下のとおり、offsetofマクロを使用してみます。
```cpp
	printf("offsetof(name)=%d\n", offsetof(struct students, name));
	printf("offsetof(belongto)=%d\n", offsetof(struct students, belongto));
	printf("offsetof(age)=%d\n", offsetof(struct students, age));
	printf("offsetof(testaverage)=%d\n", offsetof(struct students, testaverage));
```
## 実行結果
```cpp
offsetof(name)=0			// 先頭メンバーなので0
offsetof(belongto)=16		// char 16byteの後なので先頭からbelongtoまでのオフセット値16byte
offsetof(age)=18			// belongto 2byteの後なので先頭からageまでのオフセット値18byte
offsetof(testaverage)=20	// age 2byteの後なので先頭からtestaverageまでのオフセット値20byte
```

## 感想
使ってみるとシンプルですね。
ただ、どんな時に使えるか分かりません。
効果的な使い方があれば教えて下さい。
【React】LoadingButtonを一定秒数後に元に戻るようにカスタマイズ【MUI】

<h2>MUIのLoadingButtonを一定秒数後に元に戻るようにカスタマイズ</h2>
MUIのLoadingButtonを実装したところ、以下のような症状に遭遇しました。
・ボタンを押下してから、時間がどれだけ経ってもLOADING状態になってボタンを再度押せない
・エラーが帰ってきても、LOADING状態になって、ボタンを再度押せない

以上の症状を解消するために、一定時間(今回は5秒)経ったら、Loading状態から復帰し、再度ボタンを押せるようにカスタマイズしていきます。

<h2>実装</h2>
カスタマイズはシンプル。
onClick時にloadingのstateをtrueに更新。5秒後にTimeoutが実行されloadingのstateがfalseに更新されます。

一応、onClickのファンクションやボタンラベルを渡したりできるようにする等のカスタマイズもしています。

```LoadingButton.js
import React, { useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import SaveIcon from '@material-ui/icons/Save';
import LoadingButton from '@mui/lab/LoadingButton';
import { COLORS } from "../style_constants";
import { styled } from '@mui/material/styles';

const useStyles = makeStyles((theme) => ({
  button: {
    margin: theme.spacing(1),
  },
}));

const CustomButton = styled(LoadingButton)({
  backgroundColor: COLORS.MAIN_COLOR,
  opacity: 0.9,
  "&:hover": {
    backgroundColor: COLORS.MAIN_COLOR,
    opacity: 1,
  },
});

export function SaveButton({ onClick, btnLabel }) {
  const classes = useStyles();
  const [loading, setLoading] = useState(false);

  function handleClick() {
    setLoading(true);
    onClick();
    setTimeout(function () {
      setLoading(false);
    }.bind(this), 5000);
  }

  return (
    <div>
      <CustomButton
        size="large"
        variant="contained"
        color="primary"
        onClick={handleClick}
        loading={loading}
        loadingPosition="end"
        endIcon={<SaveIcon />}
        className={classes.button}
      >
        {btnLabel}
      </CustomButton>
    </div>
  )
}

```

こんな感じ。(色とか別カスタマイズを加えています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/2337c811-2696-79fc-b277-7c36d3c997c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/3b5cd26b-2e82-ff77-9ae1-674c36dc3f0b.png)

<h2>参考</h2>

https://mui.com/api/loading-button/

https://jpcodeqa.com/q/aa5dd379ea8b6eaf407e0099c254daf0
macOS Monterey 12.3でArduinoが動かなくなった！

最近MacをアップデートしmacOS Monterey 12.3にしたところ、Arduinoのコンパイルが通らなくなった。

こんなエラーが出ていた。
```arduino
arduino "python": executable file not found in $PATH
```
以下のLibraryを使用していた。
```
#include <WiFi.h>
#include <ESP32Time.h>
```
噂ではESP32を使用している場合このエラーが出ているとか

# どうすればいいか？

###### ~/Library/Arduino15/packages/esp32/hardware/esp32/インストールされているバージョン/platform.txt内の<br>「python」と記載されている**全ての**箇所を「python3」に書き換えるだけ

:::note alert
tools.esptool_py.network_cmd=**python** "{runtime.platform.path}/tools/espota.py"
:::
:::note info
tools.esptool_py.network_cmd=**python3** "{runtime.platform.path}/tools/espota.py"
:::

#### なので、自分はテキストエディタの置換機能で「python」から「python3」に変えただけでコンパイルが通った！

どうやら、macOS Monterey 12.3では<a href="https://applech2.com/archives/20220309-apple-removed-python-from-macos-123-monterey.html">macOSからPython 2.7のランタイムが削除されるらしい。</a>

日本語での解決方法がなかったので、メモがてら残しておく。
modint

自作クラスのインスタンス同士では単純に足し算をすることはできない

仮引数に入っているのは+記号の右辺

左辺値は自分自身、つまり「this」を表す



```c++
// modint: mod 計算を int を扱うように扱える構造体
template<int MOD> struct Fp {
    long long val; //this -> value
    constexpr Fp(long long v = 0) noexcept : val(v % MOD) { // 定義
        if (val < 0) val += MOD; // 負なら
    }
    constexpr int getmod() { return MOD; }
    constexpr Fp operator - () const noexcept {
        return val ? MOD - val : 0; // 0 以外ならマイナスを付ける
    }
    //modで割ってから計算
    constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
    constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
    constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
    constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
    constexpr Fp& operator += (const Fp& r) noexcept {
        val += r.val; //左辺 : val  右辺 : r.val
        if (val >= MOD) val -= MOD;
        return *this; //左辺
    }
    constexpr Fp& operator -= (const Fp& r) noexcept {
        val -= r.val;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr Fp& operator *= (const Fp& r) noexcept {
        val = val * r.val % MOD;
        return *this;
    }
    //ax+by=1を解く
    constexpr Fp& operator /= (const Fp& r) noexcept {
        long long a = r.val, b = MOD, u = 1, v = 0;
        while (b) { 
            long long t = a / b; // (最大公約数)
            a -= t * b; swap(a, b);
            u -= t * v; swap(u, v);
        }
        val = val * u % MOD;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr bool operator == (const Fp& r) const noexcept {
        return this->val == r.val; //値の比較
    }
    constexpr bool operator != (const Fp& r) const noexcept {
        return this->val != r.val;
    }
    friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept {
        return os << x.val; //左シフト
    }
    friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept {
        if (n == 0) return 1;
        auto t = modpow(a, n / 2);
        t = t * t;
        if (n & 1) t = t * a;
        return t; // a^nの高速化
    }
};


const int MOD = 1000000007;
using mint = Fp<MOD>;

int main() {
    mint a = 423343;
    mint b = 74324;
    mint c = 13231;
    mint d = 8432455;

    cout << (a * b + c) / d << endl;
}
```
Androidアプリのリリース版のビルド・テスト方法

## 前提

- Android StudioでAndroidアプリのプロジェクトを作成済み
  - https://qiita.com/yiwa81/items/fd6559cc4a790058542f

- Gradleのセットアップ済み
  - https://qiita.com/yiwa81/items/ccfd6f397a949a0fbe95

Android Studioを使ってビルドする方法もあるが、自動化を考慮し、コマンドラインでビルドする方法について記載する。

## Androidアプリのリリース版パッケージの作成

### ビルド

APK及びBundle(aab)を生成する。
（APKは実機での動作テストのために作成する。BundleをGoogle Playにアップロードする。）

* 例: コマンドラインでビルドする場合
````
.\gradlew.bat clean build bundleRelease
````

### 署名

生成されたAPK及びBundle(aab)に署名をする。 

* 例: コマンドラインでAPKに署名する場合
````
set ANDROID_SDK_BUILD_TOOLS="%USERPROFILE%\AppData\Local\Android\Sdk\build-tools\31.0.0"
call %ANDROID_SDK_BUILD_TOOLS%\apksigner.bat sign ^
-ks <jksファイルのパス> ^
--out <署名後のapkファイルのパス> ^
<署名前のapkファイルのパス>
````

* 例: コマンドラインでBundle(aab)に署名する場合
````
call jarsigner -verbose ^
-sigalg SHA256withRSA -digestalg SHA-256 ^
-keystore <jksファイルへのパス> ^
-signedjar <署名後のaabファイルのパス> ^
<署名前のaabファイルのパス> <エイリアス>
````

なお、 エイリアスはjksファイルで定義されている。以下のコマンドで確認できる。
````
keytool -v -list -keystore <jksファイルのパス>
````
## リリース版パッケージのテスト方法

### USB接続した実機での動作テスト

実機（スマホ等）で以下の事前設定を行う。

- 設定 > システム > 端末情報 を選択
- ビルド番号を7回タップする。これで、開発者向けオプションが有効となる
- 設定 > システム > 開発者向けオプション を選択
- USBデバッグ を有効にする

- 注
  - 設定メニュー構成は、機種によるかも

開発マシンに実機をUSB接続する。

以下のコマンドを実行し、実機にアプリ（署名済みapk）をインストールする。
````
set ANDROID_SDK_PF_TOOLS="%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools"
call %ANDROID_SDK_PF_TOOLS%\adb -d install <署名済みapkファイルのパス>
````

インストールしたアプリを起動し、動作を確認する。

## 続き

- Androidアプリの更新リリースの方法
  - https://qiita.com/yiwa81/items/42bd7358fbde91a2af2d
取引先オブジェクトの [評価] 項目: no access の設定方法

Trailhead の データセキュリティ > 項目へのアクセスの制御 単元のハンズオンで `取引先オブジェクトの [評価] 項目: no access の設定` でつまずいた。
これをどのように設定すればよいかを記録として残しておきます。

### ハンズオンの項目としての記載

日本語

> Salesプロファイルのアクセス権を制御する: > 項目権限: > 取引先オブジェクトの [評価] 項目: no access

英語

> Control access for the Sales profile: > Standard Object Permissions: > Rating field on the Account object: no access

### 参考記事

Trailhead を英語に切り替えて、ハンズオンの文章でググると

[control acces to fields profile does not have the appropriate field-level security for the account Rating field.](https://developer.salesforce.com/forums/?id=9060G0000005cJMQAY)

がヒットして、英語での説明ではあるが設定方法が記載されていました。

### 設定方法

1. 設定ページでクイック検索に `項目アクセス許可` (en: Field Accessibility) と入力する。
1. `取引先` (en: Account) をクリックする。
1. `プロファイルごとの参照` (en: View by Profiles) で `Salse` を選択する。
1. `評価` (en: Rating) の `編集可` をクリックする。
1. `参照可能` のチェックを外して、 `保存` を押下する(これで、先のページでは `非表示` に変わる)。

### 参考

* [control acces to fields profile does not have the appropriate field-level security for the account Rating field.](https://developer.salesforce.com/forums/?id=9060G0000005cJMQAY)
MacでもBlenderでGPUレンダリングができるようになっていたので比べてみた

## この記事の概要

ここ最近のBlender[^1]は、MacではGPUレンダリングができませんでした。[^2]

[^1]: [公式マニュアル](https://docs.blender.org/manual/en/2.90/render/cycles/gpu_rendering.html)を辿ってみたところ、2.90からは`GPU rendering is only supported on Windows and Linux; macOS is currently not supported.`と記載されていました。

[^2]: NVIDIAのeGPUを使用すればできたらしいですが、私は試したことがありません。

しかし、2022年3月9日にリリースされたバージョン3.1ではGPUレンダリングが可能になったようです。
ということでUIやレンダリング時間を比較してみた記事です。

## 注意

今回の内容は

- macOS 12.2以上のM1 Mac
- macOS 12.3以上でAMDのグラフィックカードを積んでいるMac

のどちらかの条件を満たさないといけません。

詳しくは公式のリリースノートをご覧ください。
https://wiki.blender.org/wiki/Reference/Release_Notes/3.1/Cycles

## 環境

| カテゴリー | 内容 |
| --- | --- |
| マシン | MacBook Pro (16-inch, 2019) |
| OS | macOS Monterey (12.3) |
| プロセッサ | 2.4 GHz 8-Core Intel Core i7 |
| メモリ | 64 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5500M 8 GB |

MacBook Pro単騎で3DCGに挑むなんて……という声が聞こえてきますが、これでやっています。
## 設定画面

多くの人が使っているであろう2.93(LTS)と比較してみます。

 | 2.93 | 3.1 |
 | --- | --- |
 | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-preference-2.93.png) | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-preference-3.1.png) |

`Preferences > System` に `Cycles Render Devices`という項目が追加されています。

ここで`Metal`のタブを選び、使用したいGPUを選べばOKです。
逆に言えば、ここでチェックを入れていないとGPUレンダリングはできません。

## Scene設定

PreferenceでオンにするだけでもまだGPUレンダリングは実施されません
`Scene > Device`より`GPU Compute`を選んで、ようやくレンダリング時にGPUが使われます。

 | 2.93 | 3.1 |
 | --- | --- |
 | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-scene-option-2.93.png) | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-scene-option-3.1.png) |

3.1までは`GPU Compute`を選んでもグレーアウトしてしまい、意味はありませんでした。

なお3.1で`Open Shading Language`のチェックが消えているのは、この項目がCPUレンダリング時限定のオプションだからです。
詳しくはこちらのマニュアルをご覧ください。

https://docs.blender.org/manual/en/latest/render/shader_nodes/osl.html

## レンダリング時間

[Blenderではスプラッシュスクリーンのファイルがなどがオープンに共有されている](https://cloud.blender.org/p/gallery/6220ae43b4a486f53171c89e)ため、3.1のものを使って時間の比較をしてみました。
結果、CPUレンダリングだと約9分、GPUレンダリングだと約5分。
（当然と言えば当然ながら）レンダリング時間が短くなっています。

レンダリング設定は以下です。

| 項目 | 値 |
| --- | --- |
| Noise Threshold | 0.04 |
| Max Sanples | 1024 |
| Min Samples | 16 |
| Time Limit | 0 sec |

一応、証拠がてらレンダリング時のスクリーンショットを載せておきます。

 | CPU | GPU |
 | --- | --- |
 | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-3.1-render-cpu.jpg) | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/blender-3.1-render-gpu.jpg) |

 [CC-BY-SA](https://creativecommons.org/licenses/by-sa/4.0/) | [Lorenzo Aiello - orencloud](https://www.artstation.com/orencloud)

## 余談

2021年10月14日、Blender Development FundにAppleが参加しました。
金銭的な支援だけでなくエンジニアリングのサポートにも入るとのことだったので、BlenderもMetalを活用できるようになったと思われます。

## まとめ

- 以下のどちらかを満たせば、MacでもBlenderでGPUレンダリングができる
  - macOS 12.2以上のM1 Mac
  - macOS 12.3以上でAMDのグラフィックカードを積んでいるMac
- 自動で使える訳ではなく、設定を有効にしないといけない
- （当然と言えば当然ながら）レンダリング時間が短くなる

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
ModuleNotFoundError でつまづいた話

# ModuleNotFoundErrorでつまづいた話

## ModuleNotFoundError

python3のパッケージ,pytrendsをimportして使用したところModuleNotFoundErrorが発生して動けなくなった。


最終的に問題は解決したが、単純にpytrends.pyという名前のファイルで実行していたため、参照先がおかしくなってるだけだった。
pythonのパッケージと同じ名前のファイルをつけるのはやめた方が良い。
```python
from pytrends.request import TrendReq
```

エラーメッセージ
```shell
Traceback (most recent call last):
  File "[WORKDIR]/pytrends.py", line 1, in <module>
    from pytrends.request import TrendReq
  File "[WORKDIR]/pytrends.py", line 1, in <module>
    from pytrends.request import TrendReq
ModuleNotFoundError: No module named 'pytrends.request'; 'pytrends' is not a package

```

## 他の可能性の確認

ちなみに再現性のテストとしてdatetime.pyというファイルを作成してdatetimeモジュールをインポートすると以下のようなエラーメッセージとなった。

```python
from datetime import datetime
```

```shell
Traceback (most recent call last):
  File "[WORKDIR]/datetime.py", line 1, in <module>
    from datetime import datetime
  File "[WORKDIR]/datetime.py", line 1, in <module>
    from datetime import datetime
ImportError: cannot import name 'datetime' from partially initialized module 'datetime' (most likely due to a circular import) ([WORKDIR]/datetime.py)

```

メッセージの内容が変わり、今度は循環参照としてImportErrorが発生した。
どうも最初のpytrendsのModuleNotFoundErrorはpytrends.requestを参照して参照先が存在しないため、NotFoundErrorとなったらしい。

循環参照の方は、datetimeモジュール(この場合は同名のファイル)のみを参照しているためdatetimeファイルの参照自体を行おうとすることはできる。しかし、参照したファイルの内容がまたdatetimeの参照を行なっているため、無限に自分を参照することになり、循環参照となるようだ。


ちなみに`from`を用いない場合は参照自体は行われるため、datetime.pyのファイル自体に問題がなければエラーは起きないが、自身の処理を２度行うことになるだけで利用用途はなさそうだ。

```python
import datetime

print('hoge')
```

実行結果
```shell

$ python datetime.py
>> hoge
>> hoge
```

ちなみに、
```python
import datetime
```
自体を行わなければ何も問題は起こらない。
<b>ただし絶対にやめた方が良い。</b>


## 最後に

pythonのパッケージ名には気をつけましょう。
もしくは、パスやディレクトリ構成をきちんとしておくのが無難かと。
パーミッションチェックをシンプルに実装する為のベストプラクティス

# はじめに
パーミッション関連の実装、実装頻度が非常に高い上、少々大変だったりしますよね。
最近ではパーミッション確認時の選択肢が増えたり、onRequestPermissionsResultがdeprecatedになったりと、この辺りの文化も変わっている印象です。
そんな中で、とてもシンプルにパーミッションチェックを実装できる、ベストプラクティス的な実装をご紹介したいと思います。

# 実装方法
まず、[PermissionsDispatcherKtx](https://github.com/permissions-dispatcher/PermissionsDispatcher/tree/master/ktx)を導入します。

```
dependencies {
  implementation "com.github.permissions-dispatcher:ktx:${latest.version}"
}
```

次に、以下を変数として定義します。
```
private val checkPermissions by lazy {
   constructPermissionsRequest(
   Manifest.permission.CAMERA,
   onPermissionDenied = viewModel::onPermissionDenied,
   onNeverAskAgain = viewModel::onNeverAskAgain,
   requiresPermission = viewModel::requiresPermission)
}
```

あとは、パーミッションを表示したいタイミングで以下を呼ぶだけです。
```
checkPermissions.launch()
```

実装は以上になります。

ここからはconstructPermissionsRequestを簡単に解説します。
上記関数はライブラリ内で以下のように定義されています。

```
fun Fragment.constructPermissionsRequest(
    vararg permissions: String,
    onShowRationale: ShowRationaleFun? = null,
    onPermissionDenied: Fun? = null,
    onNeverAskAgain: Fun? = null,
    requiresPermission: Fun
): PermissionsRequester = PermissionsRequesterImpl(
    permissions = permissions,
    activity = requireActivity(),
    onShowRationale = onShowRationale,
    onPermissionDenied = onPermissionDenied,
    onNeverAskAgain = onNeverAskAgain,
    requiresPermission = requiresPermission,
    permissionRequestType = PermissionRequestType.Normal
)
```
まず、第１引数の**permissions**ですが、ご覧の通り複数指定が可能になっています。
ここに取得したいパーミッションを指定する必要があります。

次に第２引数の**onShowRationale**ですが、『今後表示しない』が設定されていない状態で権限のリクエストが発生した直後に呼び出されます。
こちらには引数があり、続行か中断を指示できるPermissionRequestを指定することができます。
これを用いると、独自のダイアログ上で続行か中断の指示を出すようなことが可能になります。

次に第3引数の**onPermissionDenied**ですが、『今後表示しない』が設定されていない状態で権限付与が拒否された場合に呼び出されます。

次に第4引数の**onNeverAskAgain**ですが、『今後表示しない』が設定された状態で権限付与が拒否された場合に呼び出されます。

最後に第5引数である**requiresPermission**ですが、こちらはパーミッションが許可された場合に呼び出されます。

以上になります。
第２引数から第４引数まで任意の設定になるので、必要に応じて設定してあげたら良いかと思います。
また、Activityにも対応しておりますので、Fragment、Activityどちらでも同じように実装が可能です。

# さいごに
ライブラリを導入するというハードルはありますが、これまでにないくらいシンプルに実装する事ができるようになりました。
また、checkPermissionsの定義を見ていただけるとわかるかと思いますが、viewModel内の関数を直接呼ぶ事もでき、最近のアーキテクチャーとも親和性が高いと思います。
拒否された際に何を出すべきかというのは大いに検討の余地があると思いますが、こちらの検討に時間をかける為にも、パーミッションチェックの実装は時間をかけずに終えたいところですね。
Kotlin coroutinesを用いたTestで、処理が思うような順番で実行されない時の対処法

## はじめに
ViewModelでよくあるようなパターンの、suspend functionではなく内部でコルーチンを起動しているようなメソッドを書くときに詰まったのでメモ用に投稿します。
```kotlin

class SampleViewModel(
    private val sampleApi: SampleApi
) : ViewModel() {
    private val _sampleStateFlow = MutableStateFlow(false)
    val sampleStateFlow: StateFlow<Boolean>() 
        get() = _sampleStateFlow

    fun sample() {
        viewModelScope.launch {
             _sampleStateFlow.value = true
        }
    }
}
```
こういうメソッドではメソッドの内部でコルーチンを起動している関係上、sample()内部の処理が完全に終わった後にその後の処理が実行されるわけではないので

```kotlin

   @Test
   fun sample_test() {
      viewModel.sample()
      assertThat(viewModel.sampleStateFlow.value).isTrue() //assertionにgoogle/truthを使用
   }

```
のように書くとテストが失敗する場合があります。今までは
```kotlin

   @Test
   fun sample_test() = runBlockingTest {
      viewModel.sample()
      assertThat(viewModel.sampleStateFlow.value).isTrue()
   }

```
とすれば良かったのですが、runBlockingTestが非推奨になっているのでその代替策をまとめます。

## runTestとUnconfinedTestDispatcher()を併用する
```kotlin
   @Before
   fun setUp() {
      Dispatchers.setMain(UnconfinedTestDispatcher())
   }

   @After
   fun after() {
      Dispatchers.resetMain()
   }
   
   @Test
   fun sample_test() = runTest() {
      viewModel.sample()
      assertThat(viewModel.sampleStateFlow.value).isTrue()
   }

```

## advanceUntilIdle()を用いる
```kotlin

   @Test
   fun sample_test() = runTest() {
      viewModel.sample()
      advanceUntilIdle() //testScopeの中で待機していたコルーチンの処理が終わるまで待ってくれる

      assertThat(viewModel.sampleStateFlow.value).isTrue()
   }

```

## Job型で返して、テストメソッドでjoin()する
```kotlin
//SampleViewModel側
fun sample() = viewModelScope.launch {
    _sampleStateFlow.value = true
}

@Test
fun sample_test() = runTest {
  viewModel.sample().join()
  
  assertThat(viewModel.sampleStateFlow.value).isTrue() //assertionにgoogle/truthを使用
}

```
[参考元リンク](https://speakerdeck.com/hkusu/unit-test-for-viewmodel-and-livedata?slide=38)


## 終わりに
公式の文献をちゃんと読むことが大事だと再認識しました…。

## 参考文献
https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-test/MIGRATION.md

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/advance-until-idle.html

https://speakerdeck.com/hkusu/unit-test-for-viewmodel-and-livedata?slide=38
Kaggleでユーザー登録するまで

# はじめに
「データサイエンスの森　Kaggleの歩き方」を読みながら、Kaggleの使い方を勉強しようとしたのですが、CHAPTER-2「はじめてのKaggle」の画面が全然変わってしまっていたので、手元でメモを取りながら新しい画面の記録をつけました。


# 前提
ユーザー登録では、Googleアカウント登録済みのパターンを利用しています」。


# 登録手順


## 初期URL
最初に次のURLにアクセスします。

[https://www.kaggle.com/](https://www.kaggle.com/)

![スクリーンショット 2022-03-20 21.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/35ee2adc-d84a-28f5-4846-e74292e68ca0.png)


上の画面で右上の 「Register」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0fc14d58-3503-bc3d-451c-b1671b0e263b.png' width=500>

下の画面になったら、「Verify Your Accoungt」 をクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b1087fb8-5e42-3b90-1639-63b1dc52c52d.png' width=500>

次の画面になったら、COUNTRYをJPにして、携帯の電話番号を入力し、「私はロボットではありません」にチェックを入れます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1d984057-d922-b364-a751-072952eb557e.png' width=500>

下の画面になったら、携帯のSMSに送られてきたverification numberを入力します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/890cf297-4eb9-1644-729c-d5929eb3d2cd.png' width=500>

次の画面になったら、ユーザー登録完了です。Close ボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/84da63b1-e538-0960-eeff-74886b2760dc.png' width=500>

下記の画面になれば、Kaggleの機能が使える状態になっています。冒頭で紹介した書籍でいうと、p.50と同じ状態になっています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/33ab9f62-78e3-b828-8fa3-b1424273d503.png' width=900>

次のステップは https://qiita.com/makaishi2/items/bfb28cd785b0b0863e4a になります。