OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript 関数ドリル】中級編のreverse関数の実装アウトプット

## reverse関数の課題内容

\_.reverse関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#reverse

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/reverse/

## 課題に取り組む前の状態

- 解答を見なくてもできそうだと思った。

## 課題に取り組んだ後の状態

- 自分で実装できた。
- 解答例はループ処理の回数が半分で済む記述となっていて、参考になった。


## reverse関数の実装コード（答えを見る前）

```javascript
function reverse(array) {
    const reversedArray = [];

    for (let i = 0; i < array.length; i++) {
        reversedArray.unshift(array[i]);
    }
    for (let i = 0; i < array.length; i++) { 
        array[i] = reversedArray[i];
    }
    return array;
}

var array = [1, 2, 3];
 
reverse(array);
// => [3, 2, 1]
 
console.log(array);
// => [3, 2, 1]
```

## reverse関数の実装コード（答えを見た後）

```javascript
// 同じ
```
OrchestratorへPUBLISHしたロボットをダウンロードしてみる①

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

## 【序章】
UiPathで作ったロボットを、他の方に使っていただくには、UiPath OrchestratorへPUBLISHして、それをUiPath Assistantユーザに連携していきます。

UiPath Orchestratorには、PUBLISHされた全てのロボットが存在する訳ですね。そのロボットが、実際に運用としてPUBLISHされたものなのかは、管理簿などで管理すればいいのですが、どのようなロボットなのか、どれ位の規模のロボットなのかを知るには、ロボット開発者に時間を割いてもらって…

それはそれでなかなか手間なので、そもそもロボット資産を提供依頼をしたとしても、快く開示してくださるとは思えず…止む無くUiPath Orchestratorから、パッケージをダウンロードしていき、それを基に読み進めたり…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/8838935c-70aa-20b3-97e5-d0717b7c6a2b.png)

これをやると、ロボットは、"パッケージ名_バージョン.nupkg"というファイル名としてダウンロードできますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/b654afd7-7b98-5fff-e71b-54b610ed6c55.png)


- - - 
## 【本題】
ダウンロードの手順は、
1. UiPath Orchestratorにログインする
1. 「テナント」から「パッケージ」へ遷移する
1. 検索で、ターゲットとする「パッケージ」を検索する。
1. 一覧の右側のダンゴアイコンから、「バージョンを表示」を選択
1. 「パッケージ バージョン」画面から、対象とするバージョンのダンゴアイコンから、「パッケージをダウンロードする」を選択
1. ダウンロードが始まるので、終了するまで待つ

となる訳ですが、これが一つ二つだったら手作業でいけますが、これでもなかなか手間だなと思われたら！

### さぁ、どうします！？

UiPathでやってみよう！と試行錯誤したのですが、検索結果が複数出てきたり、検索が完全一致ではなく、部分一致のものが表示されてしまうなど、なかなかうまくハンドリングできません（検索が完全一致に出来ませんか?って中の人にはお伺いしていますが、今は出来ない雰囲気(^^♪

あぁでもない、こぉでもないと、画面を睨めっこする日々が過ぎ、ひょいと見かけた最初の画面の左下。ここに、文字列が浮かび上がっている事に気が付き！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/1ba4228b-d4c1-2105-3137-64d25544464e.png)

これを利用してみよう！ってトライしたところ、一発で、ダウンロード出来たのでした！

`https://OCのURL.jp/odata/Processes/UiPath.Server.Configuration.OData.DownloadPackage(key='ロボット名:1.0.1')`

こんな感じ。

### これなら、ロボット名と、バージョンの情報さえ入手できれば、一気にダウンロード出来ますね！

以下の例は、ダウンロードのURLを、変数URLに組み立てて、「URLに移動」アクティビティで移動（ダウンロード）させたシーケンスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/b3934181-2649-fb96-92c1-b6f00d5a4add.png)

* 因みに、お客様環境ですので、色々隠してます<m(__)m>
* バージョンは、2020.10のオンプレです。
* 他環境ではどうなるか、検証はしていません<m(__)m>

- - - 
## 【まとめ】
- ダミーで作ったプロセスを対象に実験してみました。成功したのは、たまたまかもしれません。部署異動などに伴うプロセス名の変更は、やはりロボット資産から行った方が安心ですね。
- とは言え、ロボ資産がなくなってしまった！などのアクシデントに備えて、知識としてこういう事で成功した事例があったって事を覚えていただけるといいですね。
- そもそも部署名をプロセス名に冠するのはダメぢゃん！って方は、是非命名ルールなどを教えていただければ幸甚です。

- - - 
## おわりに
いかがでした？

ロボットを、パッケージ.nupkgとしてダウンロードできれば、後は解凍して、Project.jsonから使用しているアクティビティパッケージのバージョンを調査したり、開発時点の、運用では不要なファイルが混在していないか確認したりと、色々楽しめますね！

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
クラスメソッドとインスタンスメソッドの違い

# メソッドとは
Rubyではdefを使ってメソッドを定義します。
```ruby
def # メソッド名(引数)
  # 必要な処理
end
```
```ruby
def add(a, b)
  puts a + b
end
add(1, 1)
#=>2
```

# クラスとは
Rubyではクラスを次のように定義します。クラス名（例：Addition）は必ず大文字で始めます。
```Ruby
class Addition
end
```

# インスタンスとは
Rubyでは以下のようにクラス名.newと書くことでインスタンスを生成することができます。
```ruby
Addition.new
```

# インスタンス変数とは
インスタンス作成時に実行されるinitializeメソッドを利用して「@がついたインスタンス変数」に代入します。インスタンス変数はインスタンス内であればどこでも呼び出すことができます。
```ruby
class Addition

  def initialize(a, b)
      @a = a
      @b = b
  end

end
```

# インスタンスメソッドとは
インスタンスに紐づけられたメソッドで、レシーバがインスタンスのメソッドとも言う。インスタンスに含まれるデータ（インスタンス変数）を読み書きする場合に定義されます。クラス構文の内部で以下のように定義します。
```ruby
class Addition

  def initialize(a, b)
      @a = a
      @b = b
  end
  
  #以下がインスタンスメソッド
  def add
      puts @a + @b
  end
 
end

addition_1 = Addition.new(1, 1)
# インスタンスに対してインスタンスメソッドを呼び出す
addition_1.add
#=> 2
```

# クラスメソッドとは
クラスに紐づけられたメソッドでレシーバがクラスのメソッドともいう。インスタンスに含まれるデータは使わないメソッドを定義したいときに使われます。クラスメソッドを定義する方法はいくつかあり、以下はself.をメソッド名の前に付ける方法です。
```ruby
# クラスメソッドを定義する方法その一

class #クラス名

  def self.#クラスメソッド
   #クラスメソッドの処理
  end

end
```
クラスメソッドを定義する方法の二つ目はclass << selfからendの間にメソッドを記述する方法です。
```ruby
# クラスメソッドを定義する方法その二

class #クラス名
  class << self

      def #クラスメソッド
      #クラスメソッドの処理
      end
      
  end
end
```
クラスメソッドの例です。
```ruby
class Addition
  @@total_calculations = 0

  def initialize(a, b)
    @a = a
    @b = b
    # 　インスタンスの作成毎に+1
    @@total_calculations += 1
  end

  # インスタンスメソッド
  def add
    puts @a + @b
  end

  # クラスメソッド
  def self.count_calculations
    puts "計算回数は#{@@total_calculations}回です"
  end
end

addition_1 = Addition.new(1, 1)
addition_1.add
#=> 2
# クラスメソッドを呼び出す
Addition.count_calculations
#=> 計算回数は1回です
```

# クラスメソッドとインスタンスメソッドの違い
クラスメソッドはクラスに紐づけられており、インスタンスメソッドはインスタンスに紐づけられている点が違います。
【JavaScript 関数ドリル】中級編のremove関数の実装アウトプット

## remove関数の課題内容

\_.remove関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#remove

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/remove/

## 課題に取り組む前の状態

- 解答を見なくても実装できそうだと思った。

## 課題に取り組んだ後の状態

- 解答例と異なる部分はあるが、実行結果はサンプルと同じになった。


## remove関数の実装コード（答えを見る前）

```javascript

function remove(array, predicate) {
  const removedArray = [];

  for (let i = 0; i < array.length; i++) {
    if (predicate(array[i])) {
      removedArray.push(...array.splice(i, 1));
    }
  }
  return removedArray;
}

var array = [1, 2, 3, 4];
var evens = remove(array, function (n) {
  return n % 2 == 0;
});

console.log(array);
// => [1, 3]

console.log(evens);
// => [2, 4]
```

##　remove関数の実装コード（答えを見た後）

```javascript
// 同じ
```
【5分で解説】Dockerfile で使う FROM, RUN, CMD

# はじめに

Dockerfile を作成する際に

**FROM, RUN, CMD** を利用することがあります。

それぞれがどんな役割を担っているのか復習も含め整理していきます。

# 対象者

- IT  初学者
- Docker 初学者
- インフラ系に興味がある方

# 得られるもの

- FROM についての概要が把握できる
- RUN についての概要が把握できる
- CMD についての概要が把握できる

## 使用したDockerfile

```bash
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
	curl \
	cvs \
	nginx
CMD ["ls"]
```

## **FROM**

- 作成する Docker 環境のベースとなる image (OS)を指定
- 基本は必要最低限の機能を備えた image を指定
- Dockerfile はFROM から書き始める

## **RUN**

- Linuxコマンドを実行。RUN を使うことで好きなように環境をカスタマイズできる。
- RUN <やりたいこと> で記述

```bash
RUN apt-get update　
RUN apt-get install <package>
```

- RUN毎にimage layer が作られる
- Docker image のベストプラクティスは Layer数を最小限にする  **※ RUNの数に注意**

### RUN を使い方

- Dockerfile を作成 or メンテナンスする時は RUN を分けて記述する

```bash
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install curl -y
RUN apt-get install cvs -y
RUN apt-get install nginx -y
```

- Dockerfile を完成させる際に && や \\ でRUNの行を減らす。

```bash
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
	curl \
	cvs \
	nginx
```

## **CMD**

- コンテナ起動時のデフォルトコマンドを指定
- CMD[”executable(ls, pwd など)”, “param1”, “param2”] で記述

```bash
CMD ["/bin/bash"]
```

- 原則Dockerfileのさいごに記述

```bash
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
	curl \
	cvs \
	nginx
CMD ["ls"]
```

- 一般的には /bin/bash が多いらしい
- CMD は Layer を作らない

# さいごに

簡単なdockerfile を作り記事にすることで自身の理解を再確認できました。

次は ADD, COPY などを追加して知識の幅を広げられたと思います。

私自身は Docker 初学者ですが、コツコツを成長出来たらを思います。
(メモ) WSL2のUbuntu20.10にPodmanをインストール

# はじめに
- 検証でPodmanが動作する環境を手元のWindowsマシンのWSL上に構築したい状況でした
- PodmanのUbuntuへのインストールは20.10からOfficail repositoryを使えるようになっているということでUbuntu20.04を20.10にUpdateして対応することにしました
  - https://podman.io/getting-started/installation
    - The podman package is available in the official repositories for Ubuntu 20.10 and newer. 
- 検証が必要で対応した内容のメモであり、内容を保証する意図はありません
- 前提環境は、WindowsのWSL2上のUbuntu 20.04です
- 実施したことの要点です
  - Ubuntu 20.10へのUpdate
  - Podmanのインストール

# 作業ログ
※細かいログではありません（今後類似の作業をする際などに参照するためのメモです）

## Ubuntu 20.10へのUpdate
- 基本的には以下を参考に実施
  - https://zenn.dev/ryuu/articles/upgrade-ubuntu2204-wsl
    - 現時点で20.10はLTSではないため`/etc/update-manager/release-upgrades`の編集が必要である点に注意
- 詰まったところ（過去にUpdateを途中まで検証していた環境だったからごみがあったかも）
  - リポジトリの検索で404が出た
    - 色々検証した環境なので、、真っ新にしたいという思いもあり`wsl.exe --unregister `してregisterし直した 
    - それだけでは404解消しなかったためキャッシュクリア
      - 参考にした情報⇒：[Ubuntu で apt-get update が404になる問題](https://qiita.com/nyanchu/items/a8cfc5cf627d70d798bf)
```cmd:
$ sudo cp -p /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
$ sudo rm -rf /var/lib/apt/lists/*
``` 
  - 見かけた以下の情報も参考に、`/etc/update-manager/meta-release `を編集（httpsをhttpに編集）
    - https://text.baldanders.info/remark/2020/11/upgrade-ubuntu-20_10/

## Podmanのインストール

- [ガイド](https://podman.io/getting-started/installation)通り、下記コマンド2つの実行で、インストール自体は成功
```cmd:
$ sudo apt-get -y update
$ sudo apt-get -y install podman
```
- しかし、起動できない・・

```cmd:
$ podman
Error: default OCI runtime "runc" not found: invalid argument
$ 
```
- 上記エラーのため、以下の対応を追加で実施
  - https://github.com/containers/podman/issues/8227
```cmd:
$ sudo apt-get install runc && echo && podman run -it --net=host k8s.gcr.io/busybox cat /etc/os-release
```
- 動いた！
```cmd:
$ podman --version
podman version 2.0.6
$ 
```

以上
【JavaScript 関数ドリル】中級編のpullAt関数の実装アウトプット

## pullAt関数の課題内容

\_. pullAt関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#pullAt

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/pullAt/

## 課題に取り組む前の状態

- 前回取り組んだpull関数と同じように実装すればいいのかなと思った。

## 課題に取り組んだ後の状態

- サンプルの実行結果と同じ結果が出たものの、第二引数が数字の場合、複数渡される可能性があることに気づいていなかったため、解答例を見て、修正しなければならなかった。


## pullAt関数の実装コード（答えを見る前）

```javascript
function pullAt(array, indexes) {
    const pulledArray = [];
    
    switch (typeof (indexes)) {
        case 'number':
            pulledArray.push(array.splice(indexes, 1));
        case 'object':
            // indexes.sort();
            for (let i =  indexes.length-1; i >=0; i--) {
                pulledArray.unshift(...array.splice(indexes[i], 1));
            }
    }

  return pulledArray;
}
```

##　pullAt関数の実装コード（答えを見た後）

```javascript
function pullAt(array, ...indexes) {
  const pulledArray = [];
  const indexArray = Array.isArray(indexes[0]) ? indexes[0] : indexes;

    for (let i = 0; i < indexArray.length; i++) {
        pulledArray.push(array[indexArray[i]]);
    }
    indexArray.sort();
    for (let i = indexArray.length - 1; 0 <= i; i--) {
        array.splice(indexArray[i], 1);
    }

  return pulledArray;
}
```
誕生日を求める



+ [Hey guys. Can someone help me please? I need a formula where I have the exact age. Ex. xx Years - xx Months - xx Days. Does anyone know any way I can do this?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HDkXJ)

年だけならこれでもいい。

```
IF( NOT( ISBLANK( Birthdate ) ) ,
  IF( DATE( 2000 , MONTH( Birthdate ) , DAY( Birthdate ) ) <= DATE( 2000 , MONTH( TODAY() ) , DAY( TODAY() ) ),
     YEAR (Today()) - YEAR ( Birthdate ),
     YEAR (Today()) - YEAR ( Birthdate ) -1 ),
  null)
```

月と日もいるらしい。

```
IF(
  datetime_1 - datetime_2 > 0 ,
  TEXT( FLOOR( datetime_1 - datetime_2 ) ) & " days "
  & TEXT( FLOOR( MOD( (datetime_1 - datetime_2 ) * 24, 24 ) ) ) & " hours "
  & TEXT( ROUND( MOD( (datetime_1 - datetime_2 ) * 24 * 60, 60 ), 0 ) ) & " minutes",
  ""
)
```



+ [formula field for age](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PhCfh)

```
IF( NOT( ISBLANK( Birthdate)), 
YEAR(DATEVALUE(CreatedDate))-YEAR(Birthdate )-
IF(ADDMONTHS(Birthdate ,12*(YEAR(DATEVALUE(CreatedDate))-YEAR(Birthdate )))<=DATEVALUE(CreatedDate), 0,1), NULL)
```

```
IF( NOT( ISBLANK( Birthdate)), 
YEAR(TODAY())-YEAR(Birthdate )-
IF(ADDMONTHS(Birthdate ,12*(YEAR(TODAY())-YEAR(Birthdate )))<=TODAY(), 0,1), NULL)
```
IEを非対応エラーページに飛ばす.htaccessの例

さんざん出てきたネタですが、IEのサポート終了に寄せて小ネタです。

IEなどの非対応ブラウザは、404エラーのように強制的にエラーページに飛ばし、お互いトラブルを予防する、という対応はありだと思います。

そのページにブラウザの変更やアップグレードをお勧めする案内があるとより親切ですね。

# 手順

1. サポートしていないブラウザへのエラーページを、`/unsupported/`として制作(画像等もこのディレクトリに配置)。
2. `/.htaccess`ファイルに次の記述を行う。

```apache
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (MSIE|Trident)
RewriteCond %{REQUEST_URI} !(^/unsupported/)
RewriteRule .* /unsupported/ [L,R=301]
```

# EdgeのIEモード

少し調べたところ`User-Agent`で判別する方法がなさそうでした。なので道連れでエラーページ行きです。そんな特殊なユーザーはほとんどいないと思われますが…

後年は批判を浴びることも多かったIEですが、長い目で見ると時代を切り開いたブラウザと思います。おつかれさまでした！
環境変数読み込みエラーUncaught ReferenceError: process is not defined

環境変数を読み込もうとしたら`process is not defined`となったので修正します。
webpack5からNode.jsのpolyfillが自動挿入されなくなった模様です。

>Automatic Node.js Polyfills Removed
In the early days, webpack's aim was to allow running most node.js modules in the browser, but the module landscape changed and many module uses are now written mainly for frontend purposes. webpack <= 4 ships with polyfills for many of the node.js core modules, which are automatically applied once a module uses any of the core modules (i.e. the crypto module).
>
>While this makes using modules written for node.js easy, it adds these huge polyfills to the bundle. In many cases these polyfills are unnecessary.
>
>webpack 5 stops automatically polyfilling these core modules and focus on frontend-compatible modules.

非推奨になったpllyfillはこちらから参照できます。

https://github.com/webpack/node-libs-browser#node-libs-browser

## DefinePluginを使って設定する

```
yarn add -D dotenv
```

`webpack.config.js`にpluginとして追加します。
```diff_javascript:webpack.config.js
+ const dotenv = require('dotenv')
+ const env = dotenv.config().parsed;

 plugins: [
+      new webpack.DefinePlugin({
+        'process.env': JSON.stringify(env),
+      }),
  ]

```

.envファイルの記述はこんな感じです。

```:.env
REACT_APP_FIREBASE_APIKEY="*****"
REACT_APP_FIREBASE_DOMAIN="*****"
REACT_APP_FIREBASE_DATABASE="*****"
REACT_APP_FIREBASE_PROJECT_ID="*****"
REACT_APP_FIREBASE_STORAGE_BUCKET="*****"
REACT_APP_FIREBASE_SENDER_ID="*****"
REACT_APP_FIREBASE_APP_ID="*****"
REACT_APP_FIREBASE_MEASUREMENT_ID="*****"
```

firbaseConfigで設定した環境変数をセットします。
```:firebaseConfig.js
const {
  REACT_APP_FIREBASE_APIKEY,
  REACT_APP_FIREBASE_DOMAIN,
  REACT_APP_FIREBASE_DATABASE,
  REACT_APP_FIREBASE_PROJECT_ID,
  REACT_APP_FIREBASE_STORAGE_BUCKET,
  REACT_APP_FIREBASE_SENDER_ID,
  REACT_APP_FIREBASE_APP_ID,
  REACT_APP_FIREBASE_MEASUREMENT_ID,
} = process.env;

const firebaseConfig = {
  apiKey: REACT_APP_FIREBASE_APIKEY,
  authDomain: REACT_APP_FIREBASE_DOMAIN,
  databaseURL: REACT_APP_FIREBASE_DATABASE,
  projectId: REACT_APP_FIREBASE_PROJECT_ID,
  storageBucket: REACT_APP_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: REACT_APP_FIREBASE_SENDER_ID,
  appId: REACT_APP_FIREBASE_APP_ID,
  measurementId: REACT_APP_FIREBASE_MEASUREMENT_ID
};
```

これでエラーが解消できたようです。
参考までに。
物体検出の学習データを自動生成

ディープラーニングでは大量の学習データを手作業で用意する必要があり、これがかなり面倒です。

物体検出の学習データを自動生成するアプリを作ったので紹介したいと思います。

# 自動生成の方法

背景が白い板の上に学習させたい物体を置き、携帯のカメラなどを使って、様々な角度から動画を撮影します。
![video.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/cfc6d87e-e8bf-d47c-9ccc-d1cafe471f26.jpeg)


動画のフレームごとに以下の処理をします。

１． グレースケール画像にします。

![gray_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/62ba05f6-f4b4-b8ed-7ae6-ce21166eb1a4.jpeg)

２． 適当な明度の閾値で二値画像にします。
![bin_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/be4c2a57-4b40-7c7c-a6d2-685b3d9613a1.jpeg)

３． OpenCVで画像の中央付近にある輪郭を抜き出し、これをマスク画像とします。
![mask_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/2a6a1b67-6928-c336-db22-5d87af9331f2.jpeg)

４． 原画をマスク画像でクリップします。
![clip_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/d4861f76-9252-d8a4-0863-acacfdd9db0a.png)

５． 色・位置・サイズを変化させてから、適当な背景画像に貼り付けると、学習データの画像になります。
![tmp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/e22c6b76-05f8-9ff6-43ba-3e0de1dd65e9.jpeg)

背景画像としては[COCOデータセット](https://cocodataset.org/#home)の画像ファイルを使いました。
背景画像と、位置・サイズ・色の変化を組み合わせると、大量の学習データが自動生成できます。
![aug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/732bd550-6243-0109-d274-fc979de0721e.png)

## 学習データのテスト
野菜とお菓子で学習データを作り、[YOLOv5](https://github.com/ultralytics/yolov5)でテストしました。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/164d0d14-6cbc-b42d-2545-d8b83492c3f7.jpeg)
常に良い結果が得られるとは限りませんが、撮影条件を工夫したり、YOLOv5のチューニングをすれば、そこそこ使える方法だと思います。


# アプリの実行方法

Google Colabで学習データの自動生成から[YOLOv5](https://github.com/ultralytics/yolov5)による物体検出までできるのでお試しください。
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1vy5CFLmAdbjK-6n-qyJUyOlUtFVIotZ5?usp=sharing)

ソースはGitHubで公開しています。

[https://github.com/teatime77/auto-img-tag](https://github.com/teatime77/auto-img-tag)

ローカルPCでの実行方法はGitHubのREADMEをご覧ください。


## 動画の撮影アプリ

動画の撮影は携帯のカメラでもよいのですが明るさの調整が難しかったので、パソコンのUSBカメラで撮影できるアプリを作りました。
![camera.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/56b18021-ef05-87a7-bc6d-512751895504.png)
明度または色相で物体を背景から分離しています。
アプリの画面の左上の画像は原画、右上は二値画像、右下は背景を真っ白にした画像です。
左のアプリの画面では、明度の閾値を調整すると、二値画像の白の領域が変化します。
右のアプリの画面では、背景の色相を指定してから、色相の範囲を調整すると、白の領域が変化します。
**動画撮影**ボタンをクリックすると、背景が真っ白な動画ファイルを作成できます。

---
# 撮影の方法

明度で物体を背景から分離する場合は、下からLEDライトを照らしてパソコンのUSBカメラで撮影しています。
![lighting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118740/e7faab33-20c4-177b-0f06-b10ac22f1d58.jpeg)
LEDライトはAmazonで買った自撮りライトです。

ライトの上の白い板はIKEAで買ったまな板です。厚さが8mmあり光を拡散してくれます。
背景が均一な白であることは撮影の重要なポイントです。

まな板の上の透明の台は100円ショップで買ったディスプレイスタンドです。
物体をまな板の上に直接置くと影ができるので、透明な台の上に置いています。

---

アプリのバグなどがあれば、コメント欄に書かれるかTwitterに連絡をお願いします。
[![Twitter_Logo_White_On_Blue20.png](https://qiita-image-store.s3.amazonaws.com/0/118740/af910f48-8c6b-27cb-7951-eaa6e97afa87.png)](https://twitter.com/teatime77)  [teatime77](https://twitter.com/teatime77)


**ここまで読んでいただき、ありがとうございました。**
Solid.js の使い方

こちらのページを参考にしました。
[Solid を試す](https://www.solidjs.com/guides/getting-started)

プロジェクトの作成と起動

```bash
npx degit solidjs/templates/js sx01
cd sx01
npm i
npm run dev
```

ブラウザーで、http://localhost:3000/　にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1c3d540a-08f4-a5da-7853-c4c0ebabd97a.png)

サーバーは動かしたままにして、次のファイルを編集します。

```jsx:src/App.jsx
import logo from './logo.svg';
import styles from './App.module.css';

function App() {
  return (
    <div class={styles.App}>
      <header class={styles.header}>
        <img src={logo} class={styles.logo} alt="logo" />
        <p>
          Edit <code>src/App.jsx</code> and save to reload.
        </p>
	  <p>Hello World!</p>
	  <p>皆さん、お元気ですか。</p>
	  <p>Jun/15/2022</p>

      </header>
    </div>
  );
}

export default App;
```

ブラウザーで、http://localhost:3000/　にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/bcd9df4e-1049-2ebc-6775-d80b4a890e61.png)

## ビルド ##

```bash
npm run build
cd dist
http-server
```

ブラウザーで、http://localhost:8080/　にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/00da39be-facb-04f8-ae7b-24503e4a3135.png)

他のサーバーを使う場合


```bash
serve -s dist
```

```bash
php -S 0.0.0.0:8000 -t dist
```

```bash
cd dist
python -m http.server
```
JS 文章の一部を正規化で書き換える為に：2

以前、[こちら](https://qiita.com/molhot/items/ea4e046c8f8700485c0a)の記事にてJSを用いた文章の取り出し方を解説しました。
今回はその続きです。

## 今回のゴール：文章内条件と一致した文字があるか見る
以前、取り出したい位置の文章は取り出せましたね。
今回、文章は前回と同じく、こちらを用います。
```html:HTML
<!DOCTYPE html>
<head>
    <title>
        練習用
    </title>
</head>
<body>
    <h1 id="h1_id" class="h1_class">
        あばたけたぶら
    </h1>
    <main id="main_content" class="id_class">
        彼は背後にひそかな足音を聞いた。<br>
        それはあまり良い意味を示すものではない。<br>
        誰がこんな夜更けに、しかもこんな街灯のお粗末な港街の狭い小道で彼をつけて来るというのだ。<br>
        人生の航路を捻じ曲げ、その獲物と共に立ち去ろうとしている、その丁度今。<br>
        彼のこの仕事への恐れを和らげるために、数多い仲間の中に同じ考えを抱き、<br>
        彼を見守り、待っている者がいるというのか。<br>
        それとも背後の足音の主は、この街に無数にいる法監視役で、強靭な罰をすぐにも彼の手首にガシャンと下すというのか。<br>
        彼は足音が止まったことに気が着いた。<br>
        あわてて辺りを見回す。ふと狭い抜け道に目が止まる。<br>
        彼は素早く右に身を翻し、建物の間に消え去った。<br>
        その時彼は、もう少しで道の真中に転がっていたごみバケツに躓き転ぶところだった。<br>
        彼は暗闇の中で道を確かめようとじっと見つめた。<br>
        どうやら自分の通ってきた道以外にこの中庭からの出道はないようだ。<br>
        足音はだんだん近づき、彼には角を曲がる黒い人影が見えた。<br>
        彼の目は夜の闇の中を必死にさまよい、逃げ道を探す。<br>
        もうすべては終わりなのか。すべての苦労と準備は水の泡だというのか。<br>
        突然、彼の横で扉が風に揺らぎ、ほんのわずかにきしむのを聞いた時、彼は背中を壁に押し付け、追跡者に見付けられないことを願った。<br>
        この扉は望みの綱として投げかけられた、彼のジレンマからの出口なのだろうか。<br>
        背中を壁にぴったり押し付けたまま、ゆっくりと彼は開いている扉の方へと身を動かして行った。<br>
        この扉は彼の救いとなるのだろうか。
    </main>
    <script src="test.js"></script>
</body>
```
mainにクラス、IDを付けました。そこだけお気を付けください。
（なんかしっかりしてる人から見たら怒られそうなID名とかつけてそうです...ゴメンナサイ）

こちらの文章から、それでは「すべての」という単語がいくつあるのか調べてみましょう。

## 方法：matchを用いる
簡単に、matchを用いれば対象の文字列を検索することができます。
以下、test.jsに記載する内容です。
```js:JS
/*対象の文字列の取り出し*/
var main_content = document.getElementsByTagName('main')[0].textContent;
console.log(main_content);

/*match関数を用いて対象の文字が何個あるか調べる*/
const subject_num = main_content.match("すべての");
console.log(subject_num.length);
```
varを使うのはよろしくないと聞いたので、途中constを用いています。
実行すると1と帰ってきます。
本当に1下記になる方は
1. 対象のページ
2. 右クリックから検証をクリック
3. ページで「コントロール+F」
4. 検索窓に「すべての」と打つ

そうすると文字が何個あるか数えられます。（今回だと1です）
しかしこれでは事前に文字列が分かっていなければなりませんね。
どうせなら変数をmatchに渡してみたいものです。

## 方法：RegExpを用いる
まず、下記コードのようになります。
```js:JS
/*対象の文字列の取り出し*/
var main_content = document.getElementsByTagName('main')[0].textContent;
const search = "すべて";
console.log(main_content);

/*match関数を用いて対象の文字が何個あるか調べる*/
const subject_num = main_content.match(new RegExp(search, "g"));
console.log(subject_num.length);
```
変数で検索する際は「RegExp」を用いるそうです。
（試しに変数をそのままmatchの因数に渡したのですが実行できます、まだ正規表現を使っていないからですかね？）
このように行うことで、変数も検索できるようになりますね。

## 次回
次は実際に正規表現を用いて文字を表してみましょう！
Bar graph02



引数：X=横軸,  hue = 横軸に対して何の件数をカウントするのか

```python

#1. hue有り。PclassとSurvivedの件数を棒グラフで可視化
sns.countplot(x='Pclass', hue='Survived', data=data_train)

#2. hue無し。PclassとSurvivedの件数を棒グラフで可視化
sns.countplot(x='Pclass', data=data_train)

```

1. hue有り。
![Survived.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/1b57c9df-46e1-444b-543e-1de36ac15332.png)

2. hue無し
![Pasted Graphic 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/b1783a1d-5d83-f0c7-4681-3dfa43463edb.png)
￼￼
Go中級者になるための個人的インプット集👨‍💻

# はじめに
## 概要
Goを書くようになりそこそこ経ちました👨‍💻
これまでに読んできたWeb上のリンクをまとめました。随時更新します。

# インプット集
## 入門〜初心者👶

### プログラミング言語Go完全入門

https://engineering.mercari.com/blog/entry/goforbeginners/

大変お世話になった（なっている）スライドです。
今でも定期的に見返していますし、Goを始めたい方にはまず紹介しています。

### Goへのヘイトに対する考え方

https://zenn.dev/nobonobo/articles/74808a8d5e6f1e

Goに対する批判は定期的に起こるのですが、キャッチアップしている言語が批判に合うと悲しくなりますよね🥹
言語仕様のシンプルさに由来する批判が多いように思うのですが、それに対する回答をひとつ持っておくと糧になると思います。
[元JavaエンジニアがGoに感じた「表現力の低さ」と「開発生産性」の話](https://inside.dmm.com/entry/2021/12/10/ex-java-engineer-thoughts-about-go)もタメになりました。

### 今改めて読み直したい Go基礎情報

https://budougumi0617.github.io/2019/06/20/golangtokyo25-read-again-awesome-go-article/

本記事で紹介されている「Go at Google: Language Design in the Service of Software Engineering」は特に見ておくと良いと思います。

>Googleが開発の中で何を問題視していたのか、何をGoで解決しようとしたのかが書かれている。 Goをなぜ作ろうとしたのかを知ることでGoのゴールや言語思想を知ることができる

## FAQ系🙋‍♂️

### Goを学ぶときにつまずきやすいポイントFAQ

https://future-architect.github.io/articles/20190713/

### 今までにGoでよく聞かれた質問とその参考リンク

https://blog.p1ass.com/posts/go-faq/

### Go 言語(Golang) はまりどころと解決策

https://www.yunabe.jp/docs/golang_pitfall.html

## Goらしいコードの書き方 / コード規約📝

### Effective Go

https://go.dev/doc/effective_go

以下では色んなスタイルガイドを貼っていますが、ひとまずEffective Goを読み、各論的に詰まったら参考にするみたいな考え方で良いのかなと思います。

### スタイルガイド等

- [Uber Go Style Guide](https://github.com/uber-go/guide)
- [GitLab - Go standards and style guidelines](https://docs.gitlab.com/ee/development/go_guide/)
- [Clean Go Code](https://github.com/Pungyeon/clean-go-article)
- [Go Best Practices](https://github.com/smallnest/go-best-practices)
- [Go Codereview Comments](https://knsh14.github.io/translations/go-codereview-comments/)

## ランタイム寄りの知識🤖

### Goならわかるシステムプログラミング

https://ascii.jp/serialarticles/1235262/

書籍化もしている「Goならわかるシステムプログラミング」のWeb版です。
自分は1版も2版も書籍で購入しましたが、GoをよりOSに近いところで考えるための足掛かりになります。

### H.Sakiさんの記事

https://zenn.dev/hsaki

https://speakerdeck.com/sakiengineer

メチャクチャ凄すぎて毎度助けられてます...。

## コンパイラ / 構文解析🐉

### Go コンパイラのコードを読んでみよう

https://www.ebiebievidence.com/posts/2020/12/golang-compiler/

### GoのためのGo

https://motemen.github.io/go-for-go-book/

## Goで何か作る👨‍💻

### Golangでロードバランサーを実装する

https://bmf-tech.com/posts/Golangでロードバランサーを実装する

### Biscuit Code Reading

https://docs.google.com/presentation/d/1W3ST15Rx1b0Jm_9H97p7tlbrzmQiNwo77lBDncBIfSo/mobilepresent?slide=id.g33148270ac_0_143

GoによるOS「Biscuit」のコードリーディング。

### build-your-own-x

https://github.com/danistefanovic/build-your-own-x

OSやエディタ、Git、ブロックチェーン等を様々な言語で作る方法をまとめた「車輪の再発明」リポジトリですが、Goについてもそれなりのトピック載っています。

## 後で分類する🚧

https://gocon.jp/2022spring/sessions/

https://ymotongpoo.hatenablog.com/entry/2021/12/15/231928

https://threedots.tech/post/common-anti-patterns-in-go-web-applications/

https://dave.cheney.net/high-performance-go-workshop/gophercon-2019.html

https://dave.cheney.net/practical-go

https://dave.cheney.net/category/golang

https://mattn.kaoriya.net/

https://www.slideshare.net/lestrrat/goapi-go-conference-2018-spring

https://ukai-go-talks.appspot.com/2014/gocon.slide#1
getとsetを使っているのにdo not mutate vuex store state outside mutation handlers.が出たとき解決策

## そもそもこのエラーの意味は？
ミューテーションハンドラーの外部でvuexストアの状態をミューテーションしないでください

## 状況
mapStateを使用していた訳でなく、computedにget,setを記載していた。
詳しくは下記のリンクに記載。

[Vue.js：Vuexのエラー：「[vuex] Do not mutate vuex store state outside mutation handlers」の原因と対応例](https://qiita.com/SFITB/items/c6c202a8e237f25d38d3)
しかし、エラーが起こる。


## 解決策
```
export default {
  props: {
    notCartItems: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
      items: JSON.parse(JSON.stringify(this.notCartItems)),
    }
  },
}
</script>
```

無理感が否めないので、もっと綺麗なコードを知っている方ご教授くださいmm
参考にさせて頂いたサイト
[Vue.js：Vuexのエラー（vuex do not mutate vuex store outside mutation handlers）対策](https://kcfran.com/2021/10/26/vue-js-error-store-outside-mutation-handlers/)
Android ポップアップの表示時間をデフォルトより長くor短くする 【Kotlin】【Coroutine】

## はじめに
Androidには標準で、ポップアップ表示を行うToastというものがあります。
（参考：https://developer.android.com/guide/topics/ui/notifiers/toasts ）
しかし、こいつ表示時間が自由に選べません。
「LENGTH_SHORT」＝2秒か「LENGTH_LONG」＝3.5秒
の二つしか値を取れないのです。

今回は、もっと短くor長くトーストを表示したい方に向けて
kotlinで自作のcustomToastクラスを作ってみました。

ちなみにAsyncTaskで実装したコードは割とあるのですが
Android11で非推奨になっているため今回はCoroutineで実装しています。

## 前提
エディター：Android Studio
言語：Kotlin

coroutineを使うのでbuild.gradleにcoroutineを追加して、syncProjectしておいてください。

```
dependencies {
    implementation( "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0")
    // 以下は、元々の記述
}
```

## 作ったもの
早速ですがコードです。
適当なフォルダの下にCustomToast.ktというファイルを作成して、以下を貼り付けます。
```kotlin
import android.content.Context
import android.os.Handler
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class CustomToast : Runnable {
    private var toast: Toast? = null
    private var duration: Long = 0
    private val handler = Handler()
    suspend fun show() {
        if (duration > 2000) {
            var i = 0
            while (i < duration - 2000) {
                handler.postDelayed(this, i.toLong())
                i += 2000
            }
            handler.postDelayed(this, duration - 2000)
        } else {
            this.execute()
        }
    }

    override fun run() {
        toast!!.show()
    }

    private suspend fun execute() {
        try {
            withContext(Dispatchers.Main) {
                toast!!.show()
            }
            Thread.sleep(duration)
            withContext(Dispatchers.Main) {
                toast!!.cancel()
            }
        } catch (e: Exception) {
            Log.e(localClassName, "ここにキャンセル時の処理を記述", e)
        }
    }


    companion object {
        fun makeText(context: Context?, text: CharSequence?, duration: Long): CustomToast {
            val ct = CustomToast()
            ct.toast = Toast.makeText(context, text, Toast.LENGTH_SHORT)
            ct.duration = duration
            return ct
        }
    }
```

呼び出し側は適切なスコープから呼び出してください。
```
// 例
viewModelScope.launch {
  customToast.makeText(context, "表示したい文字列", "表示したい時間(ミリ秒)").show()
}
```

## 終わりに
一旦、この記事はここまでで公開しますが
LGTMなどの反応が多ければ解説記事書きます。


参考資料
1. 公式のToastのページ https://developer.android.com/reference/android/widget/Toast
1. javaでの実装例
https://tech.pjin.jp/blog/2012/08/13/android-tipstoast%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%99%82%E9%96%93%E3%82%92%E9%95%B7%E3%81%8F%E7%9F%AD%E3%81%8F%E3%81%99%E3%82%8B/
2. AsyncTaskからCoroutineへの書き換え
https://re-engines.com/2021/03/12/android-11%E3%81%A7deprecated%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9Fasynctask%E5%AF%BE%E5%BF%9Ckotlin%E7%B7%A8/
Google音声認識ライブラリを使用して、音声オセロを作成

https://twitter.com/shirox22/status/1535972099990335488?s=20&t=TKj7JAxAZ72Q55UePZx5Qw

@y-tetsu 氏のページ　👉http://github.com/y-tetsu/reversi
のオセロ用ライブラリと、google音声認識ライブラリを使用して、音声認識オセロを作ってみました。

y-tetsu 氏のreversiはリバーシ(オセロ)のPython用ライブラリです。
手軽にリバーシAIをプログラミングして、アプリケーションが作れます。

しかし、今回はgoogleの音声認識AIを利用して、音声認識オセロを作って、声で打てるようにしてみました。

exeファイルは、https://plainstudio.org/
にフリーで置いておきます。

メニューバーから、黒(先手)のプレイヤー、白(後手)のプレイヤーを選択します。
プレーヤーから、「音声入力」を選択すると、音声入力出来ます。

音声入力は、「Aの1」あるいは「A1」というように、横軸のアルファベットと、縦軸の数字を発話することで入力します。

（認識しない時は、認識するまでトライしてください。）

音声認識ライブラリは、
https://pypi.org/project/SpeechRecognition/ 
にあります。使い方は、解説のページがいろいろとネット上にあるので、参考にしてみてください。

Google音声認識ライブラリはフリーで使えて便利ですが、さらに認識を高めたりする方法や、他のライブラリを使った方法など、何かもっといい方法があればと思いますが、どうでしょうか。

```
from reversi import Reversi
from reversi.strategies import SlowStarter
import speech_recognition as sr
from reversi.strategies import AbstractStrategy
import string
import win32com.client as wincl
from tenacity import retry
import re

class Onsei(AbstractStrategy):
  
  @retry()
  def next_move(self, color, board):
    size = board.size
    legal_moves = board.get_legal_moves(color)
    r = sr.Recognizer()
    mic = sr.Microphone()
    voice = wincl.Dispatch("SAPI.SpVoice")

    def conv(s):
      s = s.replace('の','').lower()
      return string.ascii_lowercase.find(s[0]),int(s[1:])-1

    while True:
        rete = color
        u_dict = { 'black':'くろ', 'white':'しろ'}
        for word,read in u_dict.items():
            rete = rete.replace(word, read)
            
        voice.Speak(rete + "のばんです" )

        excg = "_ABCDEFGH"
        lst = legal_moves
        ans = [f'{excg[v[0]+1]}の{v[1]+1}' for v in lst]
        print(ans)
        result1=re.sub("'","",str(ans))
        
        voice.Speak ('うてるばしょわ'+str(result1)+'です')     
        voice.Speak("どこにうちますか" )
        
        with mic as source:
            r.adjust_for_ambient_noise(source) #雑音対策
            audio = r.listen(source)

        print ("Now to recognize it...")
        s = r.recognize_google(audio, language='ja-JP')
        print(s)
        
        if conv(s) in legal_moves:
            voice.Speak (s)
            
            return(conv(s))
        else:
          voice.Speak("そこはうてません")

Reversi(
    {'音声入力': Onsei(),
     'コンピューター': SlowStarter()
     }
).start()

```
03.00.EDA01基礎統計量



```python

df.head()
df.tail()
display(data.head())

全ての変数の最初の５行をレビュー
for col in df.columns:
	print(‘{}’\n’.format(df[col].head())

# 行数と列数の確認
df.shape 

#基礎統計量
df.describe()
df[“列名”].describe()

#特徴名
columns()
df.columns

#データの大きさ
df.info()

#　特定列の値のcount
df[“y”].value_counts()

```
![不明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/f0206bfd-5fcf-9379-c3a6-359294f8f10c.png)
￼
03.02.データ型の確認


データの種類
Int : int64
Float : float64
Str: object
Bool: true/false


```python
#データ型の確認
df.dtypes
df.info()

```
![dfTdtypes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/0d1ec2e2-4d06-8413-4866-3a69a51396ec.png)

![Range Index 7365 entries. 0 to 7364.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/4c23402c-80f7-7fc0-47e1-9cc2ef4ddd1e.png)
￼￼
Pivot table


creating Pivot table.

```python

# value: valueを指定しないとカラムに選択されていない全てのデータでテーブルが作成されてしまう。
# aggfunc:集計方法
# margins_name=で名称変更
# fill_value=0で欠損値を0で埋める
# デフォルトではdropna=Trueとなっており、全ての行列が欠損値の場合は表示されない。表示するにはdropna=False
df_pivot = pd.pivot_table(df,values = "Claim Qty", index = "customer_ENG", columns = "Suppliers",
                         aggfunc = ['count'], margins=True, margins_name="total",
                         fill_value=0, dropna=True)
 
df_pivot

```
![Suppliers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/fd1c7386-5c8f-4d6d-79be-d4e7a30df859.png)


sorting the pivot: get index of the sorted values and reindex the initial pivot table.

```python

df_pivot2 = df_pivot.reindex(df_pivot["count"].sort_values(by= 'total', ascending=False).index)
df_pivot2.head(10)

```

![Suppliers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/43492cb3-6a23-0e6e-40e1-a40d8b7aab24.png)
￼￼
STM32F767でMbed OS bare-metalで遊ぶ


目的
すこし軽くなる

mbed.app.jsonを新規作成

```

{
    "requires": ["bare-metal"]
}


```


![o_con536.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/23e76dec-169b-6104-d631-b6503d75f43e.jpeg)


![o_con537.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/51491881-0c15-b64d-c1c1-d98a6528b15f.jpeg)


![o_con538.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7dc5fd9-d263-baed-5b3c-78c82d887a07.jpeg)



https://os.mbed.com/docs/mbed-os/v6.15/bare-metal/using-the-bare-metal-profile.html


OSの表示


https://os.mbed.com/docs/mbed-os/v6.15/mbed-os-api-doxy/group__platform__version.html#gab84d5969fc7496418838c5c55c7b0188
Bar graph


How to create bar graph.




```python

# 横軸ｘにcustomer_ENG、縦軸にClaim Qtyで棒グラフ作成
sns.countplot(x='customer_ENG', data=df, order = df['customer_ENG'].value_counts().index)

plt.show()

```

![customer ENG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811258/d22b0700-388a-c95c-8ac7-9cf4061c9250.png)
￼
STM32F767でMbed OSで遊ぶ


目的
いろいろ遊んでみる

1.新規

2.mbed OS blinky LED HelloWorldを選択

3.OK

4.コンパイル

5.転送

6.LEDが点滅することを確認

7.おわり


![o_con533.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2ba9eeda-62ce-918f-56dd-c934c6542755.jpeg)


![o_con534.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/82ae1e94-b089-4d8d-70fd-101a488ab38f.jpeg)



![o_con535.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1734461d-adab-8e84-cadc-935e0fa3d82e.jpeg)



```c++


/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"
#include "platform/mbed_thread.h"


// Blinking rate in milliseconds
#define BLINKING_RATE_MS                                                    500


int main()
{
    // Initialise the digital pin LED1 as an output
    DigitalOut led(LED1);

    while (true) {
        led = !led;
        thread_sleep_for(BLINKING_RATE_MS);
    }
}



```
cscの作法 その185

# 概要
cscの作法、調べてみた。
managed directxやってみた。
directsound、やってみた。
録音してみた。

# 参考にしたページ

https://makky12.hatenablog.com/entry/2016/07/24/175348

# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;

namespace mdx
{
	public partial class Form1 : Form {
		CaptureSound cap;
		public Form1() {
			this.Text = "DirectSound";
			this.Load += new EventHandler(this.Form1_Load);
			Button btn1 = new Button();
			btn1.Location = new Point(140, 40);
			btn1.Size = new Size(80, 20);
			btn1.Text = "START";
			btn1.Click += btn1_Click;
			Controls.Add(btn1);
			Button btn2 = new Button();
			btn2.Location = new Point(140, 110);
			btn2.Size = new Size(80, 20);
			btn2.Text = "STOP";
			btn2.Click += btn2_Click;
			Controls.Add(btn2);
			Console.WriteLine("ok0");
		}
		private void Form1_Load(object sender, EventArgs e) {
			cap = new CaptureSound();
			Console.WriteLine("ok1");
		}
		private void btn1_Click(object sender, EventArgs e) {
			cap.startRecord(this);
			Console.WriteLine("start");
		}
		private void btn2_Click(object sender, EventArgs e) {
			cap.stopRecord();
			Console.WriteLine("stop");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
細ピンヘッダー

SOP Flashのソケットの基板でコネクタに秋月の細ピンヘッダーを使っていました。これはソケットのピンがハーフピッチでハーフピッチの基板には通常のピンヘッダーが入らないためでした。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/14000636@N03/25393992650/in/dateposted-public/" title="IMGP0279"><img src="https://farm2.staticflickr.com/1554/25393992650_6e6b0fa3e0_m.jpg" width="240" height="180" alt="IMGP0279"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

FT232Hな基板側のピンソケットは通常のもので初めの頃はflashromで問題なく使えていたのですが、段々に認識しなくなったりしてきました。

どうも細ピンヘッダーとピンソケットはダメみたいです。

作り直すことも考えたのですが、面倒なのであるものはいじらず、丸ピンソケットと通常のピンヘッダーの下駄を作ってみました。

![写真（2022-06-15 6.37） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5ec56ffc-2432-9185-f9aa-23f2adf24941.jpeg)

ちゃんと認識できるようになりました。
Account_Id__c Account_Type__cがない



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8a789722-c87b-16f6-e59e-338195ff8097.png)

ユーザオブジェクトにこれらのいフィールドを追加する必要があるようです。


+ [Trailhead Completion issues (Use External Services in a Flow)](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000C3e1aSAB)
+ [Can't complete adding a Update Record to a flow in Build a Flow To Access External Business Actions.stuck with Setting Field Values for the User Records.See as attached below.Your Help will be highly appreciated.Thank you in advance](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDm5HSAT)
スケジュールされたレポートを受信できない


[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [スケジュールされたレポートを受け取っていません](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A8wjpSAB)

素晴らしい、対処法がまとめられていました。

スケジュールされたレポートで何が起こっているかを確認するために確認できることがいくつかあります。
 

1. スケジュールが期限切れになっていないことを確認します。すでに期限が切れていると言ったので、それを乗り越えることができます。
2. [設定]>[監視]>[ジョブ]>[スケジュールされたジョブ]を調べて、レポートの再実行がスケジュールされているかどうかを確認します。これにより、システムが機能しており、スケジュールに問題がないことを確認できます。
3. [設定]>[監視]>[ログ]>[電子メールログファイル]に移動し、レポートが電子メールで送信される予定の日の電子メールログファイルと、レポートの送信先/送信元のユーザーを要求します。メールログの準備ができたら、ダウンロードして解凍します。次に、レポートを日時で並​​べ替え、レポートが送信される予定だった時刻を確認します。そこにある場合は、レポートが送信されました（または送信が試みられました）が、電子メールサーバーによってハングアップした可能性があります。送信に問題があった場合は、[再試行]列に番号が表示されます。
4. レポートがスパムフォルダに入れられていないこと、またはレポート付きの電子メールを他のフォルダまたは電子メールにリダイレクトする可能性のあるOutlookルールがないことを確認します。私
5. 上記のすべてが機能しているのにレポートが配信されない場合は、ITチームに確認してください。メールサーバーは、スケジュールされたSalesforceレポートをスパムとしてマークし、ユーザーの受信トレイに配信されないようにすることがあります。


+ [Classicレポートのスケジュール実行について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg2oVSAR)

英語ですが同じような質問/回答があります。

+ [Why are none of my scheduled reports running?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A87olSAB)

これを見ると有効期限が切れていないかを確かめるみたいです。
1. Confirm that the schedule didn't expire - you said you already did that so we can cross that over.

具体的には、以下の場所で確認するとことです。
Look in Setup > Monitor > Jobs > Scheduled Jobs to see if the report is scheduled to run again - that way you can confirm that system is working and that there are no problems with schedule.


# スケジュールされたジョブのレポート　：　Lightningではジョブ名が分からない 

Lightning からのレポートをサブスクライブする場合、ジョブ名はランダムな長い文字と数字の文字列で、タイプは「レポート通知」です。ジョブ名を、実際にどのレポートであるかを識別できるものにすることはできますか?


+ [All Scheduled Jobs](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BtBaP)
+ [Reporting Notifications Jobs](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A99GY)

アイデアになっている

https://ideas.salesforce.com/s/idea/a0B8W00000GdoUJUAZ/need-proper-job-name-for-all-scheduled-jobs


# レポートスナップショットが実行されていません

+ [レポートスナップショットが実行されていません](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXT0i)

:::note
こちらの記事をご確認ください。 


https://help.salesforce.com/s/articleView?id=analytics.data_troubleshooting_snapshots.htm&type=5
:::
【動画リンク一覧】プログラマのためのC言語

# プログラマのためのC言語

## はじめに

- この記事は動画のリンク集です(Windowsユーザ向け)
- プログラムある程度わかっているけどC言語や基礎的なことはよくわからない人向けにC言語でコンピュータについて詳しくなれそうな動画作り中
- 動画の更新はモチベーションに左右されるため不定期となります
- ついでに最近さぼり気味です



どんな分野のエンジニアであれ基礎として大事なことはやった方がいい
とは言え、やはり目の前のこと、やりたい事の方に興味がいってしまうのが人の性



C言語や基礎と言われるものをやりたくないわけじゃない
ただなかなかやる時間もないし興味がわかない...
やるにしてもぶっちゃけ何をどうすればいいのやら状態...

という人の一助になれたら幸いです。

## リンク

[再生リスト：プログラマのためのC言語](https://www.youtube.com/playlist?list=PLGCuVleP1tbHB7CAqmuOToBgCnNWWcfmB)


### 準備

簡単な自己紹介、なぜC言語なのかなどの想いや想定する視聴者などについてと、C言語の開発環境に関する内容

- [ガイダンス](https://youtu.be/usEylTfVzuA)
- [Hello World](https://youtu.be/HR0pBadWKvw)



### 基礎

ここらへんはとりあえず抑えておきたいと思う基礎的な部分

- [変数とメモリ](https://youtu.be/bYnh49cFqcA)
- [ビットとビット演算](https://youtu.be/QXJzB8jL9Zg)
- [2進数、10進数、16進数](https://youtu.be/IietHKQa_4o)
- [2進数でマイナス表現](https://youtu.be/yUse4QcwsPY)
- [基本データ型の話](https://youtu.be/7d5Qi3WGd9k)
- [エンディアンの話](https://youtu.be/38qCT3sh-Bc)



### 浮動小数点数 IEEE754

コンピュータが浮動小数点をどう表しているのかという話を少し細かくしてみた動画

- [2進数で小数を表す基本編](https://youtu.be/JjMdjmjmq3c)
- [2進数で小数を表す(IEEE754前編)](https://youtu.be/aIYRmqol7BM)
- ~~2進数で小数を表す(IEEE754後編)~~　モチベーション不足により保留



### ポインタ関連

よく難しいといわれてしまうポインタに関する動画

- [変数とポインタ](https://youtu.be/wBY8MyE-600)
- [配列とメモリ](https://youtu.be/HdmvZVhSfQE)
- [配列とポインタの比較](https://youtu.be/dgYmh1PrMHQ)
- [メモリの動的確保](https://youtu.be/HbQjMwt4MGY)
- [メモリのヒープ領域について](https://youtu.be/s0XIG8xq9tQ)
- [ポインタとconst](https://youtu.be/iqk9pNGhvuc)
複数のApple開発者アカウントを運用していると、実は危険な flutter create の動作

この内容は古い情報です。現在は Automatically Manage Signing がONでも Capability を追加しない限りは、勝手にバンドルIDが Apple Developer に追加されてしまう動作は起こらないようです。

以前は Apple Developer アカウント側にワイルドカード App ID が存在しないとXcodeからバンドルIDを登録に行っていた気がするのですが...。私の勘違いだったら、ごめんなさい。

いちおう flutter create が証明書を検索する流れについては現在も同じなので、記事としては残しておきます。

# 以下、古い内容

複数の Apple 開発者アカウントを使って開発している環境で `flutter create` を使って新規プロジェクトを作成して開発を始めると、予期せぬ開発者アカウントに新規作成したプロジェクトのバンドルIDが自動登録されてしまうことがあります。

著者が確認した Flutter のバージョン: 2.8.1

## 手順
複数の Apple 開発者アカウントを使って開発している macOS 環境で、以下の操作をします。

- `flutter create` で Flutter プロジェクトを新規作成する
- Xcode でそのプロジェクトを開く

このとき、生成された Xcode プロジェクトの自動署名管理（Automatically Manage Signing）はオンなので、開発者アカウントに新しいプロジェクトのバンドルIDが自動登録されます。しかし、どのアカウントに登録されるかは不定です。そのときの開発機の Keychain の状態に依存します。

## 原因
`flutter create` が、Keychain に格納されている証明書を自動検索し、Xcode の`DEVELOPMENT_TEAM`を勝手に設定してしまうのが原因です。

`flutter create` は内部で、`security find-identity -p codesigning -v` コマンドを実行し、Keychain に登録されている Apple Development 証明書を検索します。そして、

- 過去に選択された証明書（flutter config で確認できる ios-signing-cert に保存されている値）があればその証明書
- なければ、上記コマンドで最初に見つかった Apple Development 証明書

が使われるように、 Xcode プロジェクトのチームIDを自動設定するようです。

このため、自動設定されたものが、バンドルIDを登録したいアカウントの Apple Development 証明書だった場合は良いのですが、そうでない場合は、Xcode でプロジェクトを開いた瞬間に予期せぬアカウントにバンドルIDの登録が走ってしまいます。

## 対策
`flutter create` に署名の設定を変更するオプションはありません。
Xcode でプロジェクトを開くと、その瞬間にバンドルIDの登録が走ってしまいますので、Xcode からは設定が変えられません（オフラインで起動する、という手はありますが）。

ということで、ベタですが、`flutter create` でプロジェクトを生成したあと、`ios/Runner.xcodeproj/project.pbxproj` をテキストエディタで開いて、`DEVELOPMENT_TEAM`の行（3箇所）をすべて削除するのが確実かなと思います。

## おわりに
誤ってバンドルIDを登録した先が、有料版の開発者アカウントであれば、開発者ポータルにログインしてバンドルIDを消せますので、深刻な問題にはならないかと思います。ただ、バンドルIDを誤って登録したことはなかなか気が付きにくいので、A社のバンドルIDがB社のアカウントに登録されてしまったが、B社さんから指摘されるまで気が付かなかった...みたいなことはありそうで怖いです（`flutter create` が生成するバンドルIDは `com.example.<projectname>` なので事故の危険は低いですが、`--org` オプションでバンドルIDのプリフィックスを変えると...危険ですね）。

あと、気をつけたいのは、無料版の開発者アカウントにバンドルIDが登録されてしまうケースです。無料版のアカウントのバンドルIDは開発者ポータルからは消せません。その場合はバンドルIDが期限切れになるのを1週間待つ（or どうしてもの場合はサポートに相談する）ことになりますので、わりと大変です。
【TypeScript】アサーション

## 型アサーション
```ts
let name: any = "Tanaka"

let length = (name as string).length

// length = "foo"
// > error TS2322: Type 'string' is not assignable to type 'number'.
```

```ts
let name2: any = "Tanaka"
// JSXの記法と似ているため注意
let length2 = (<string>name2).length
```

## constアサーション

```ts
let name = "Tanaka"

name = "Tatsuya"

let nickname = "Tatsuya" as const
nickname = "Tatsuya"
// nickname = "Tatsu"
// > error TS2322: Type '"Tatsu"' is not assignable to type '"Tatsuya"'.

let profile = {
  name: "Tanaka",
  height: 201
} as const

// プロパティがreadonlyとなる
// let profile: {
//   readonly name: "Tanaka";
//   readonly height: 201;
// }

// profile.name = "Tanaka"
// error TS2540: Cannot assign to 'name' because it is a read-only property.
// profile.height = 400
// error TS2540: Cannot assign to 'height' because it is a read-only property.
```
LeetCodeで400問くらい解いてみた。

## 現状(2022/6/15)
- コンテストのレーティングは上位23%
- LeetCodeを始める前よりは圧倒的に解ける問題が増えた。
- なにもやってない人と比べると圧勝するけど、競技プログラミングをやっている人の中では強くない。
![スクリーンショット 2022-06-15 2.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61388/6a7e0405-2cd7-182d-f001-70fd59c67f53.png)
https://leetcode.com/yi_desu/

## 読んだ本
- アルゴリズム図鑑 絵で見てわかる26のアルゴリズム
- 問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

## 問題の選び方
- [Problems](https://leetcode.com/problemset/all/)から選ぶ。
- 難易度はEasy, Medium
- Solution(解説)があるもの。

## 問題の進め方
- 問題を読んで数分考えてみる。
    - 解けそうなものは実装する。

- 数分考えて、解き方が想像できないものはSolution(解説)を見る。
- Solutionを読んで解き方が理解できたら実装する。

## 定期的にコンテストに参加する。
- コンテスト中は解説を見ることができないので、考えるトレーニングになる。
- 自分にとって、ちょうどいい難易度の問題が出題されるので楽しい。
- Weekly Contest と Biweekly Contestでは難易度に違いはなさそう。

#### Weekly Contest
- 毎週 日曜日 11:30〜13:00

#### Biweekly Contest
- 隔週 土曜日 23:30〜1:00
簡単にIEモードでWebページを開く手順はどれなのか確認してみた

# はじめに
2022年6月16日(日本時間)でWindows10のInternet Exploreが、ついにサポート終了となります。
「IEでしか動作しないアプリがあるのに対策を忘れていた！」という方のために、IEモードでWebページを開く方法を調べて、その手軽さを私の主観で評価してみました。

# 使用した環境
手元にある以下のような私のPCで試しています。
- Windows 10 Home 21H1
- Edge バージョン 102.0.1245.41 (公式ビルド) (64 ビット)

# IEモードでWebページを開く方法

## グループポリシーを使用する方法（手軽さ：★☆☆☆☆）
「グループポリシー」（もしくは同等のレジストリ設定）と「エンタープライズサイト一覧」を使用する方法です。
エンタープライズ一覧のxmlに登録されたWebサイトをIEモードで開きます。
対象のサイトを一括で管理できるので、組織的にIEモードを使用する場合に向く方法です。

またサイト一覧はEdgeを開いてから1分後に有効になります。
即時反映ではありませんので、サイト一覧を更新した際はご注意下さい。

### 手順
正直、手軽ではないので手順などは省略します。
使用する場合は、MSが公開している[こちら](https://docs.microsoft.com/ja-jp/deployedge/edge-ie-mode-policies)のサイトを参考してください。


## EdgeのIEモードローカルサイト一覧を使用する方法（手軽さ：★★★☆☆）
Edgeの設定画面から対象サイト一覧を追加するを使用する方法です。
対象サイト一覧を個人で好きに編集できるので、個人での管理に向く手軽な方法です。
ただし、設定したサイトは登録から30日で削除されます・・・

### 手順
1. Edgeのアドレスバーに`edge://settings/defaultBrowser`と入力してEdgeの設定画面を開きます。
2. 設定画面から`Internet Explorer モードでサイトの再読み込みを許可`を`許可`して、`Internet Explorer モード ページ`に対象のサイトを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652816/4ff760c6-2592-4b17-0c28-8ac6235ec8e1.png)


## Edgeの右上にある`⋯`アイコンから「Internet Explore モードで再読込する」を使用する方法（手軽さ：★★★★☆）
Edgeの右上にある`⋯`アイコン（設定など Alt + F）をクリックして、開いているページをIEモードで再度表示する方法です。
手軽さは先ほどの方法とほとんど変わりませんが、対象サイト一覧を管理する必要が無いのでほんの少しだけ手軽な気がします。
ただし、この方法は一度はEdgeで画面が開ける必要があるので、IE以外をエラーにするようなチェックがされていると使えません。

### 手順
1. Edgeのアドレスバーに`edge://settings/defaultBrowser`と入力してEdgeの設定画面を開きます。
2. 設定画面から`Internet Explorer モードでサイトの再読み込みを許可`を`許可`します。
3. 対象のページをEdgeで開いた後に、`⋯`アイコン（設定など Alt + F）をクリックして、`Internet Explore モードで再読込する`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652816/cd378eca-0703-62c8-39e2-578fe887a8fb.png)


## コマンドで強制的にEdge IEモードを起動する方法（手軽さ：★★★★★）
MSのドキュメントでも記載がない引数が使われているので記載するか悩みましたが、、、
この方法を使うと常にIEモードで動作するEdgeが立ち上がります。
（ちなみにSeleniumでIEモードの自動テストを実行すると、このコマンドが使われてEdgeが起動します）
ただし、この状態になったEdgeを使い続けると、IEを使い続けるのと同じようなセキュリティリスクがあるので注意してご利用ください。
使用する場合は、自己責任でお願いします。

### 手順
1. コマンドプロンプトを開きます。
2. コマンドプロンプトから以下のコマンドを実行します。
```dosbatch
rem 念のためEdgeのexeを終了
taskkill /im msedge.exe /f
rem 強制的にIEモードでEdgeを起動
"C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" "--ie-mode-force" "--internet-explorer-integration=iemode"
```

# おわりに
終わる終わると言われてから何年たったか分かりませんが、ようやくIEのサポートが終了します。
正直、Webアプリ開発者としては、有難いと感じることが多分にあります。
ただ自分のWebアプリ開発は、IEのバージョンアップとともにあったので少し寂しくもあります。
最後にIEモードを使い倒すことで、IEへの敬意と感謝を表したいと思っています。
ありがとう、Internet Explore！！！！
（個人の感想です）
ROS2 Dashingにおける/dev/input/js0以外での joyトピックの使用方法@2022/06

# はじめに
Windows10上のVirtual BoxのROS2 Dashingにコントローラをつなぐ際、デバイスIDは自動的に
js2以降からとなってしまう。しかし、ROS2 Dashingのコントローラの値取得用のトピックであるjoyは
デフォルトではjs0で起動してしまい、js1以降を指定できない。
parameter設定をすれば済む話なのだが、方法がROSのバージョン間でかなり違っており、Webでも
簡単に確信的な情報を見つけられず、かなり苦労したのでここに残しておく。

# 実行環境
 <table>
    <tr>
      <td>ホストOS</td>
      <td>Windows 10 HOME 21H2</td>
    </tr>
    <tr>
      <td>仮想化ソフト</td>
      <td>Virtual Box 6.1.22</td>
    </tr>
    <tr>
      <td>ゲストOS</td>
      <td>Ubuntu 18.04.6 LTS</td>
    </tr>
    <tr>
      <td>ROS</td>
      <td>ROS2 Dashing Diademata</td>
    </tr>
    <tr>
      <td>JOYSTICK</td>
      <td>PS4 DualShock4 Bluetooth接続(※1</td>
    </tr>
 </table>


※1 Bluetooth接続は、ds4drv等使う記事が出てくるが、私の環境では必要なく
　  UbuntuにBluetooth接続するだけでOKだった。

#  joyトピックをjs0以外で使うParameter設定の仕方
### 1. joy-params.yaml を作成
この際、拡張子が".yaml"であれば名前は何でもいい
私の環境では、コントローラがjs2に認識されたので下記のように設定した。
``` .tsx:joy-params.yaml
joy_node:
    ros__parameters:
        dev: "/dev/input/js2"
```

今回は保存場所を~/ とした。


### 2. yamlファイルを指定してターミナルでノードを実行
"__params:=" 以降にPATHを指定。絶対でも相対でもＯＫ。
``` 
$ ros2 run joy joy_node __params:=./joy-params.yaml
```
下記のようにレスポンスが帰ってくれば成功している。
``` 
[INFO] [joy_node]: Opened joystick: /dev/input/js2. deadzone_: 0.050000.
```


# 参考
https://docs.ros.org/en/dashing/Tutorials/Parameters/Understanding-ROS2-Parameters.html