OmniAICreator/Qiita-1.07M huggingface dataset:
【メモ】HTML作成＿奮闘記録

知識習得を目的とした記録。随時更新。
同じように知識を必要とする人へ共有する意味を込めて公開する。


# JSライブラリ
使えそう、使いやすそうなものをピックアップ

* Vue.js　小規模開発向け。データとDOMが自動的に繋がる
* anime.js　[公式](https://animejs.com/)　（動きがある演出ができる）
* Velocity.js　（動きがある演出ができる）


# やりたいこと
### 文字の表示
・数字をランダムに表示させたい
　→ドラムロール風にカウンターを表示
　→数字だけ表示
　**⇒ルーレット**
　**⇒ビンゴ**
　＜codepenでBINGOで検索＞
　　　・[Bingo Machine](https://codepen.io/spdbear/pen/YbvWZj)
　　　※一度出た数字は次は出ないように設定されている


・JSに指定した文字に、色を付けたい
　⇒CSSで指定する（[指定方法] (https://www.tohoho-web.com/css/prop/color.htm)）


・JSに指定した文字の大きさを変更する
　⇒JSの対象の文字指定でfont-sizeで指定する（[指定方法](https://www.tohoho-web.com/css/prop/font-size.htm)）

### ボタン
・押したらテキストを表示して、もう一度押したら非表示
＜参考＞
 [Vue.jsでいい感じのアニメーションを作りたい](https://qiita.com/b0ntenmaru/items/ba25ecec99820faddd8e)
GASで住所から郵便番号を取得して、スプレッドシートに出力する

#背景
スクレイピングで取得したとある複数の企業情報において、住所はあるが、郵便番号がないパターンがあった。元々、スプレッドシートに情報をまとめていたので、GASを使って住所から郵便番号を取得してみた。

#そもそもGASって
初めて使うので、ちょっと説明。

>Google Apps Script(略称GAS/ガス)とは、Googleによって開発されたスクリプトプラットフォームである軽量のアプリケーション開発のためのGoogleのワークスペースプラットフォーム。 主にGoogleのサービスを自動化するスクリプト言語である。JavaScriptがもとになっているため汎用性が高く、開発環境はGoogle Chromeだけでいいのでプログラミング初心者が始めやすい言語の1つである。

[wikipedia](https://ja.wikipedia.org/wiki/Google_Apps_Script)

GASの開発方式には2種類あるため、作りたいプログラムによって使い分ける必要がある。

* スタンドアロン型（ドキュメントやスプレッドシートなどと連携を行わなくてもよい場合）
* コンテナバインド型（ドキュメントやスプレッドシートなどと連携を行う場合）

今回はコンテナバインド型で実施。

#使い方

1. Googleスプレッドシートを新規作成
2. ツールタブから「スクリプトエディタ」を開く
3. コード書く

#スプレッドシートの中身

| 情報取得日  |会社名      | 住所          | 郵便番号     |
|:-----------|------------:|:------------:|:------------:|
| 2021/11/1  | A 株式会社   | 東京都新宿区ほげほげ|        |
| 2021/11/2  | B 株式会社   | 東京都港区ほげほげ  |       |
| 2021/11/3  | C 株式会社   | 東京都千代田ほげほげ|       |


#コード

```
function searchZip() {
  
  var response;
  var zip;
  var mDiff;
  var mStart  = new Date();
  var url = 'https://google.co.jp/maps/search/';
  // シート名を記入
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('住所から郵便番号');

  // 必要なデータ（住所と郵便番号の２列）を配列に
  var lastRow = sheet.getLastRow();
  var values = sheet.getRange(2,3,lastRow-1,2).getValues();
  
  try {
    
    values.forEach(function(value) {

      // value[0]:住所
      // value[1]:郵便番号

      // 既に入力済みは無視
      if (value[1].length > 0) {
        return;
      }

      // 6分の制限時間を超えないよう5分くらいでやめる
      mDiff = new Date() - mStart;
      if (mDiff > 300000) {
        return;
      }
      
      // グーグルマップで検索
      response = UrlFetchApp.fetch(url + value[0]).getContentText();
      
      // 検索結果に郵便番号があるかチェック
      zip = response.search('〒');
      
      if (zip >= 0) {
        
        // 郵便番号を取得
        value[1] = response.substr(zip + 1, 8);
      } else {
        
        // 取得できなかった住所はログに
        Logger.log(value[0]);
      }
      
      // 1秒間隔でAPIアクセス
      Utilities.sleep(1000);
    });

  } catch(e) {
    
    // 何かエラーがあれば出力
    Logger.log(e);
  }
    
  // データを戻す
  sheet.getRange(2,5,lastRow-1,2).setValues(values);  
}

```

GAS上でコードを書いて保存して実行する。
すると、スプレッドシート内の郵便番号が追記されていく。

便利。自動化万歳。
長期サポート (Long Term Support) となる .NET 6  - 今こそ移行すべきか？

こんにちは！

昨年 .NET ファミリーを統合するためにリリースされた .NET 5 ですが、サポート期間が1年間しか設けられておらず、.NET 5 への移行を見送っていた方々に朗報です。

ついに LTS (Long Term Support) の .NET 6 が 2021年11月8日 (月) にリリースされます。

今後、.NET 6 以降 の偶数バージョン (例 .NET 6 / .NET 8 / .NET 10...) に対して、最初のリリースから LTS (3年間のサポート期間) が設けられます。

LTS とは、対象 OS で動作する為のサポートが提供されます。詳細は以下のサポートポリシーをご参照ください。

https://github.com/dotnet/core/blob/main/release-notes/6.0/supported-os.md

https://dotnet.microsoft.com/platform/support/policy/dotnet-core


本記事では、改めて .NET 6 へ移行すべきか？についてお話したいと思います。



## 結論として移行を始めても良い

デスクトップアプリケーション (WPF / Windows Forms) 、ウェブ (ASP.NET MVC) に関する .NET 6 の変更内容を見ても、機能改善、不具合ともに積極的に対応されているので .NET 6 をターゲットに移行を始められても良いかと思います。また、補足情報ですが、既に弊社のお客様で .NET 5 へ移行されている方もおりますが、致命的な不具合に関するご報告もお聞きしないので .NET 5 (.NET 6) は優秀なのだなと感じております。今後も積極的な機能改善を期待したいですね。

但し、Xamarin に関して、正確には .NET 6 ではなく .NET MAUI ですが、2021年11月時点では対応されず、2022年第二四半期に先送りになってしまったので、もう少し様子を見た方が良いかなと思います。

https://devblogs.microsoft.com/dotnet/update-on-dotnet-maui/


### .NET 6 の 大まかなアップデート内容

本記事では、NET 6 自体の新たな更新内容についての詳細は言及しませんが、ファイル操作のパフォーマンス向上や、既存の不具合修正が行われています。

詳細は、以下の記事などをご閲覧ください。

https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/6.0

## .NET Framework のまま、移行しないと問題になりうるシナリオ

改めて .NET Framework のままだと、どんな問題が起こりえるのか？ 考えてみます。

まず .NET Framework は .NET 6 がリリースされても、引き続きサポート対象となっています。
但し、不具合修正やセキュリティに関する修正などは行われますが、新機能の追加は厳しいかと思われます。

では "新機能” の追加について、どういったものが想定されるでしょうか？ 以下に幾つか例を挙げてみます。

#### 新しい通信規格 (HTTP/3) の対応

2015年に登場した HTTP/2 は、まだ記憶に新しいかと思いますが、更なる最新の技術仕様として HTTP/3 が承認されました。

.NET 6 以降の HTTP/3 サポートについて、以下の記事で言及されています。

https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/

NET Framework でも、対応パッケージを導入すれば通信できる可能性は高いかと思われますが、仮に .NET Framework で何らかの不都合が発生する可能性も、移行しないリスクとして見据える必要があります。

#### OS (Windows) の新しい入力インターフェースの可能性

今では一般的となったタッチパネルによるデバイス操作も、昔はありませんでした。

Windows OS のタッチ操作は、OSのアップデート、および、 .NET Framework のバージョンアップにより、サポートされるようになりましたが、今後、新たな入力インターフェースが登場してきた場合、.NET 6 のみ更新対象として .NET Framework のままだと、サポート出来ないリスクが想定されます。

#### OS (Windows) の新機能サポート

入力インターフェースと似た話ですが、OS の新規機能についても同じようにリスクがあります。

例えば、 Windows 11 では、Android アプリが動作できる事が話題となりました。Android アプリ & Windows 間の連携が当たり前になった未来が来るかもしれません。

将来的に Android と連携する要望が挙がった際に .NET Framework では API が対応できず .NET 6 でのみサポートとなるかもしれません。

## まとめ

.NET 6 のリリースに伴い、いよいよ移行を開始される開発プロジェクトも多いかと思います。
移行をサポートする [.NET アップグレードアシスタント ](https://docs.microsoft.com/ja-jp/dotnet/core/porting/upgrade-assistant-overview) というツールもありますので、是非ご活用ください。

また、すぐに移行しない場合でも、.NET Framework のままのリスクも検討しつつ、必要であれば早めに計画し、準備を進めていきたいですね。

弊社では、移行に関するような技術的なご相談なども受け付けておりますので、ご興味がある方は<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank">こちら</a>からお気軽にご相談ください。

## 技術サポート・無料オンライン相談会をご利用ください

インフラジスティックスのUI製品は多くの機能を備えているためドキュメントの情報量も多く、なかなかお探しの情報に辿り着けない場合もあります。そういった際はお気軽に技術サポートや、製品導入支援担当との無料オンライン相談会をご予約いただくことで検証時間を節約可能ですので、ぜひご活用ください。<br>
<a href="https://jp.infragistics.com/support/dev-support" target="_blank">技術サポートへの問い合わせ方法を確認する</a><br>
<a href="https://jp.infragistics.com/free-consultation" target="_blank">無料オンライン相談会を予約する</a>
toastr ブラウザバックで flash を表示させないようにする

`toastr` を導入した。

機能自体はうまく実装できたんだけど
`flash` が表示されているページにブラウザバックするとメッセージが表示されてしまうので修正した。

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`gem "toastr-rails"` をつかって `toastr` の機能が実装できている

## 本題
最初はブラウザバックのイベントの検知して 
`DOM` 操作で `notice` を削除したろって思ったんだけど
`toastr` が `DOM`操作してるわけじゃないからできなかった

修正するには ` JS` の挙動を制御する必要がある

___

`toastr` のコードを以下みたいにした

```:js  
      $(window).on("load", function() {
      toastr['#{type}']('#{msg}');
      })
```
めっちゃ普通なんだけど

```
$(window).on("load", function() {
```

のイベントにはブラウザバックが含まれないっぽい

もちろんこのコードでは `turbolinks` にフックしないんだけど
`flash`メッセージを表示するときは `GET`メソッド使わないから多分問題ない
「TextMeshProで日本語を使えるようにするときの注意事項」に関する更新情報

# 「TextMeshProで日本語を使えるようにするときの注意事項」に関する更新情報(2021年11月10日時点)
#### 6日前に後述の記事を公開しましたが、改善されたようなので載せます。
#### 6日前、TMP Settingsに自作のフォントアトラスを適用した後に、TextMeshProを使用しているオブジェクトのTextMeshPro - Textの「Font Asset」に自作のフォントアトラスを設定しても、使えませんでした。
#### 本日、TextMeshProを使用しているオブジェクトのTextMeshPro - Textの「Font Asset」に自作のフォントアトラスを設定したところ、使えるようになっていました。
#### 下に画像を載せます。
![スクリーンショット 2021-11-10 15.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/fd8c9614-8b63-7b8e-d280-24a42658fe7f.png)

#### 本来あるべき設定で使えるようになり良かったと思いますが、まさか6日で改善されるとは思いませんでした。

---

# Unityにおいて、TextMeshProで日本語を使えるようにするときの注意事項(2021年11月4日時点)
#### Unityにおいて、TextMeshProで日本語を使えるように設定しているときに、日本語が表記されないトラブルがあったので載せます。
#### フォントアトラスを作成してTMP Settingsで適用した後に、ヒエラルキーウィンドウのTextMeshProコンポーネントを持つオブジェクトを選択した後が問題でした。
#### インスペクターウィンドウのTextMeshPro - Textの「Font Asset」に日本語表記用に作成したフォントアトラスを設定すると、日本語が表記されなくなるようでした。
![スクリーンショット 2021-11-04 16.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/7ac4c273-c04a-bcad-9af0-6425bef89195.png)

#### 何故か「Font Asset」の設定は、デフォルトの「LiberationSans SDF」のままが正しいみたいでした。日本語表記用に作成したフォントアトラスに設定するのが正しい気がするのですが、何故でしょうね。
#### 下にTextMeshProで日本語を使えるようにする手順を載せます。
---
---

## TextMeshProで日本語を使えるようにする手順
![スクリーンショット 2021-11-04 16.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/567673f6-0a73-5d91-eaf4-ec8ecfa4d35a.png)

### 1.フォントアトラスを作成する
①使用したいフォントファイルをプロジェクトウィンドウのAssetsフォルダにドラッグアンドドロップする。
Unityでは、「.ttf」か「.otf」のファイル形式を使用できる。

②何らかのエディタで、フォントアセットとして使用したい文字を入力した「.txt」ファイルを、エンコードをUnicode(UTF-8)で作成する。
作成したら、プロジェクトウィンドウのAssetsフォルダにドラッグアンドドロップする。

③トップメニューのWindowからTextMeshProをクリックして、「Font Asset Creator」を選択する。

④Font Asset Creatorの「Source Font File」に使用したいフォントファイルを設定する。
Sampling Point Sizeは「Auto Sizing」だと作成に時間がかかるので、「Custom Size」を選択する。(値は48くらいが適当)
また、「CharacterSet」をクリックして、「Characters from File」を選択すると、「CharacterFile」の項目が表示される。
「CharacterFile」に使用したいテキストファイルを設定する。
![スクリーンショット 2021-11-04 16.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/58213c7a-4738-e49a-1d68-93a8dfe3b906.png)

⑤Generate Font Atlasをクリックして、Saveをクリックする。

⑥ダイアログが表示されるので、Saveをクリックすると、フォントアトラスが作成される。

### 2.作成したフォントアトラスをTextMeshProに適用させる
①作成したフォントアトラスを、プロジェクトウィンドウの「Assets/TextMesh Pro/Resources/Fonts & Materials」に移動する。

②プロジェクトウィンドウの「Assets/TextMesh Pro/Resources」の「TMP Settings」をクリックする。

③TMP Settingsの「Default Font Asset」を作成したフォントアトラスに変更する。
![スクリーンショット 2021-11-04 16.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/a8aa8a86-cf60-d337-3996-1c47c314d5a9.png)

④ヒエラルキーウィンドウからTextMeshProコンポーネントを持つオブジェクトを選択する。
インスペクターウィンドウのTextMeshPro - Textの「Font Asset」が「LiberationSans SDF」、「Material Preset」が「LiberationSans SDF Material」になっているか確認する。※
![スクリーンショット 2021-11-04 16.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/872f044c-3d9a-becf-7135-5c7fbd5d67e2.png)

⑤TextMeshPro - Textのテキストに設定したフォントアトラスの日本語が使用できるようになっている。

※ 「Font Asset」に作成したフォントアトラスを設定すると何故か適用されなくなる。
TMP Settingsの「Default Font Asset」に作成したフォントアトラスが設定されていれば、「Font Asset」が「LiberationSans SDF」の設定で適用される。

---
---

#### 以上で手順は終了です。
raty.js と kaminari ページネーションを繰り返すと星が消える

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
raty.js をつかって星の機能を実装している
raty.js への変数の受け渡しに gon を利用している
kaminari のページネーションを実装している

## 本題
`raty.js` と`kaminari` を使ったページで
何回かページ遷移を繰り返すと星が消える

ただそのページでリロードすると星が再び現れる
これは困った
___

ページ遷移後の `head` を見たときに `gon` の中身が変更されていないことに気づく

`gon` っていうのは `js` に変数を渡す `gem` で
コントローラーで変数に入れた値が `head` タグに中に入り
そこから `js` に渡される仕組み

実際の検証ツールの値は

[![Image from Gyazo](https://i.gyazo.com/2e9389541ad04c4e30c9eb9de6b7a26d.png)](https://gyazo.com/2e9389541ad04c4e30c9eb9de6b7a26d)

こんなかんじ

これが今回のページ遷移では全く変わっていなかった。

つまり `head` が変わっていない

それすなわち `turbolinks` が働いてしまっているということ

なので `kaminari` をローカルにインストールして
リンクに片っ端から

```
'data-turbolinks': false
```

を入れてやった

ページネーションで `ajax` がしぬけどしゃあなし

すると無事動作するように
STM32CubeProgrammerがmacOSで動かなくなったときは

# STM32CubeProgrammer
というソフトは、STM32というSTM社のマイコンにバイナリを書き込むためのソフトです。なんか最近公式のmac用インストーラが素直に通らなくなったので備忘録的に。

# ( 2021/11/4 時点 )
1. 公式のサイトからインストーラを落とします。このとき2.8.0を選ぶとなぜかSTLINK接続時にクラッシュするので、2.7.0を選びましょう。
（ https://www.st.com/ja/development-tools/stm32cubeprog.html )
![スクリーンショット 2021-11-04 16.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021714/56de0a95-b840-cea6-4234-06278b059b6b.png)

2.  ダウンロードフォルダに入ったzipを解凍しましょう
2.  やってみるとわかりますが、そのままインストーラをクリックして起動しようとしても起動しないので、コマンドラインから動かします
2.  解凍後のフォルダを右クリック>サービス>フォルダに新規ターミナル　でターミナルを開く
3. 以下のコマンドを入力
3. 
```
SetupSTM32CubeProgrammer-2.7.0.app/Contents/MacOs/SetupSTM32CubeProgrammer-2_7_0_macos
./SetupSTM32CubeProgrammer-2.7.0.app/Contents/MacOs/SetupSTM32CubeProgrammer-2_7_0_macos
```
6. これでGUIがでてくるはずなので、そのまま続けてインストール
![スクリーンショット 2021-11-04 16.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021714/4361164e-2cbb-65a0-0105-f24392f228e1.png)
6. おわり![スクリーンショット 2021-11-04 16.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021714/6b444caa-65c2-70bc-b910-2555e23a0fb4.png)
Red Hat Linux 8にscreenをインストール

RHEL8でscreenをインストールしようとすると、
いきなり`sudo dnf install screen -y`してもインストールできなかったので調べてみた。

これでインストールできた。

```
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
sudo dnf install screen -y
```

```
$ screen --version
Screen version 4.06.02 (GNU) 23-Oct-17
```
ESXiでWindowsを入れたときにパーティションが自動で拡張されない


# 背景
VMにWindows11を入れたかった. 
もともとストレージが３２GBだったが，Windows10を入れた時点で２８GBほど占有していた．
Windows11をインストールするためには最低１０GBのストレージ容量が必要だったためESXiからストレージを３２GBから６０GBにした．

しかしWindows側ではドライブの容量の拡張が確認できなかった．

```google.com
ESXi HDD 増えない
```
するとESXiから拡張したあとパーティションの操作をしている記事を発見した
https://aulta.co.jp/archives/3407

なのでWindowsのDisk Manager　を開いた
<img width="300" alt="スクリーンショット 2021-11-04 16.00.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/4768daf7-ef20-8287-ddbb-f5ab02176016.png">

そしたらどうやら追加したストレージ容量はディスクの末尾に付随することがわかった
<img width="400" alt="スクリーンショット 2021-11-04 16.00.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/10899123-323f-29d1-d835-72e024b5fdd4.png">


拡張を試みたが，リカバリーパーティションが間に挟まっているため，だめだった.
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/ddeaba38-e1a1-a032-d17c-37c6ddaf1d4a.png">

新しいボリュームとして初期化はできるが，想定したパーティション構成ではない
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/86367e71-2de7-caac-425d-822161d07b64.png">

パーティションを削除してみる
https://www.lifewire.com/delete-windows-recovery-partition-4128723

```
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\Windows\system32> diskpart

Microsoft DiskPart version 10.0.19041.610
DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online           60 GB  1024 KB        *

DISKPART> select disk 0

Disk 0 is now the selected disk.

DISKPART> list partition

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             100 MB  1024 KB
  Partition 2    Reserved            16 MB   101 MB
  Partition 3    Primary             31 GB   117 MB
  Partition 4    Recovery           499 MB    31 GB
  Partition 5    Primary             28 GB    31 GB

DISKPART> select partition 4

Partition 4 is now the selected partition.

DISKPART> delete partition override

DiskPart successfully deleted the selected partition.
```
パーティションが削除できた
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/5d7f485a-e626-51dc-1e31-dfb9288dcba3.png">

拡張できる
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/f7143f4b-1c10-5aa6-e330-afc15a58ecc3.png">

できた
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/4f923035-3e11-ff24-7770-af4fcb1b9b03.png">

無事インストールできそう
![スクリーンショット 2021-11-04 16.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171398/c414d8f7-b6e4-eeeb-6c8f-b1864e53b863.png)


<img width="300" alt="" src="">
<img width="300" alt="" src="">
chartkick メタ文字を利用してブランクな要素をつくる

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`


## 前提
`gem chartkick` をつかって棒グラフを実装している


## 本題

`chartkick` で棒グラフを作ってるんだけど

[![Image from Gyazo](https://i.gyazo.com/5c2ad40ed2bfa7bea289bf199cbab613.png)](https://gyazo.com/5c2ad40ed2bfa7bea289bf199cbab613)

要素が少ないとブサイクになる

これを

[![Image from Gyazo](https://i.gyazo.com/6a0ffdf7f99ef7e4fa953f813ae34368.png)](https://gyazo.com/6a0ffdf7f99ef7e4fa953f813ae34368)

こうするためにいろいろやった

___

まず考えたのは要素の大きさを細くすること

しかしうまいことやり方がわからず


で、次に考えたのが今回の本題。

まずはそもそもの部分 `chartkick` の仕様について

`chartkick` に変数を渡す場合は多重配列で渡してやり、
中の配列の１番目にラベル名、２番目に数字を
渡してやればいい

だから今回の画像の例だと

```
@chart = [ [関蝉丸神社上社, 1], [熊野三山, 1] ]
```
この `@chart` を `chartkick` に渡してやると図が描画される
 
そこで要素が５個以下だったら計６個の要素がデフォルトになるようにロジックを書いた。

具体的なコードは以下

```:コントローラー
    if @chart.count <= 5
      dammy = 6 - @chart.count
      dammy.times do |n|
        @chart << ["",""]
      end
    end
```

これなら `@chart` の回数に依存する数だけダミーの要素が `@chart` にはいる

実際に中身をみてみると

[![Image from Gyazo](https://i.gyazo.com/fe4ad11bd2623dbc9e9f03183d153bdb.png)](https://gyazo.com/fe4ad11bd2623dbc9e9f03183d153bdb)

きちんとロジックは機能している

しかし

[![Image from Gyazo](https://i.gyazo.com/ae0e2185d065270c15c628cc9f5a76a4.png)](https://gyazo.com/ae0e2185d065270c15c628cc9f5a76a4)

なぜか１つ分の要素としてしかカウントされていない


これはおそらく内部的に `distinct: true` みたいにされてて
同じ要素が削除されてしまっている

しかしそのへんをオフにするオプションが見つからなくて困った

___

最終的にはコードは以下みたいにした

```:コントローラー
    if @chart.count <= 5
      dammy = 6 - @chart.count
      dammy.times do |n|
        @chart << ["\n"*n,0]
      end
    end
```

メタ文字をいれることでそれぞれの要素を一意にする

実際に中身を見てみると

[![Image from Gyazo](https://i.gyazo.com/8e9650dc822a749492dc4049e87fdda4.png)](https://gyazo.com/8e9650dc822a749492dc4049e87fdda4)

こんなふうにそれぞれが一意になってそう

そして `View` で描画される際にはメタ文字として認識されるから `\n` は消える
An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

#エラーの訳
指定されたキーは存在しないよ

#コード
```Python
bucket_name = 'xxx'
object_key_name = 'xxx.json'
s3 = boto3.resource(
                's3',
                region_name='ap-northeast-1',
                aws_access_key_id = 'xxx',
                aws_secret_access_key = 'xxx',
            )

bucket = s3.Bucket(bucket_name)
obj = bucket.Object(object_key_name)

response = obj.get()
body = response['Body'].read()
    
json.loads(body.decode('utf-8'))
```

#エラー
```
An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.
```

#解決方法
解決方法は、キーを見直すこと。
キー≒パス≒ディレクトリ
したがって、ディレクトリを見直すこと。一文字違ってもダメ。

エラー発生原因は非常にシンプル。ディレクトリが違うから。
ここでいうと、
`object_key_name`
の事になる。
例えば
`aaa/bbb/ccc/ddd.json`
を持ってきたいのに
`aaa/bbb/ccc/eee.json`
を指定していると上記のエラーが発生する。
slim タグの中に変数を入れるコード

## 開発環境
`ruby 2.6.5`
`slim-rails`

 `erb` では割と見る

```
<div class="comment-content" id ="this_comment_<%= comment.id %>"></div>
```
みたいなコードを `slim` で書くにはどうすればいいか


___
```
.comment-content#this_comment_=comment.id
```

まずは愚直に `slim` の文法に沿って書いてみる
するとうまく動作しない

ブラウザ検証ツールを見てみると

```
<div #this_comment_="3" class="comment-content"></div>
```

と変換される

変数展開はされてるんだけどされかたがおかしい

本来は

```
<div #this_comment_3 class="comment-content"></div>
```
となってほしいところ

___

```
.comment-content #this_comment_comment.id
```

変数展開されるはわかったから
そのまま `comment.id` を入れてみる

すると

```
<div class="comment-content">#this_comment_comment.id</div>
```

id ではなく 要素の中身として出力されてしまった


___

```
.comment-content #="this_comment_#{comment.id}"
```

明示的に = ってすることもできるみたい
で、文字列を入れると思わせて変数展開をさせる

すると

```
<div #="this_comment_4" class="comment-content"></div>

```

ちゃんと出力された

ただ # がid に変化されてない

なので

```
.comment-content id="this_comment_#{comment.id}"
```
ってしてやると

```
<div id="this_comment_4" class="comment-content"></div>
  ```

きれいにいった
HAVING句の挙動調査

>※達人に学ぶSQL徹底指南書 第2版 のまとめノートです。

- havingはgroup byを省略して使用できる、空集合を引数にとったgroup byが省略されていると解釈される。
- group by 空集合は全レコードを一行に集約する

```
SELECT count(*)
  FROM SeqTbl 
  group by ();


-- 結果が返れば歯抜けあり 
SELECT '歯抜けあり ' AS gap 
  FROM SeqTbl 
  group by ()
HAVING COUNT(*) <> MAX(seq);
```

- 歯抜けを探すには、seqの集合の中に入らないseq+1の集合を求める。

※not inはandに同値変換されるのでnullが含まれていると機能しない

```
SELECT seq+1 as 歯抜け番号
from seqtbl
WHERE seq+1 not in (SELECT seq from seqtbl);

SELECT *
from seqtbl
WHERE seq+1 not in (SELECT seq from seqtbl);
```
一番最初の歯抜けに対応できない、連続した2つ以上の歯抜けに対応できない問題がある。


- 数列が連続しているかだけを判定する

```
SELECT '数列は連続しています' as 連続判定
from seqtbl
having count(*) = max(seq)-min(seq)+1;

SELECT 
CASE WHEN count(*) = max(seq)-min(seq)+1 then
'数列は連続しています'
else '歯抜けがあります' end as 連続判定
from seqtbl;
```

- 初項が1でない、count(*)が0であるを例外として連続判定するコード

```
SELECT 
CASE WHEN count(*) = 0 then '空テーブルです'
WHEN min(seq) > 1 then '初項が1より大きいです'
WHEN count(*) = max(seq)-min(seq)+1 then
'数列は連続しています'
else '歯抜けがあります' end as 連続判定
from seqtbl;
```



-- 存在量子「seq+1=seqとなるようなあるseqがある」を満たさないseqの実装

```
SELECT 
seq+1 as 歯抜けの番号
from seqtbl s1
where not EXISTS(SELECT *
from seqtbl s2
WHERE s1.seq+1 = s2.seq
);
```


- 実装非依存の最頻値取得
- 収入ごとの集合から要素数最大のものを取得
- ALLのすべての要素以上である=最大値である

```
SELECT
income,
count(*) as cou
from graduates
GROUP by income
having count(*) >= all(SELECT count(*)
                        from graduates group by income);
```

- group by だとnullも部分集合としてとってくるのでnullが最頻値になる場合がある
- と思ったが、
    - count(*)はnullをカウント対象に含める
    - count(列名)はnullをカウント対象に含めない
という性質を使用して次のように書き換えるとこの問題を解決できる

```
SELECT
income,
count(income) as cou
from graduates
GROUP by income
having count(income) >= all(SELECT count(income)
                        from graduates group by income);
```

前述のcountの性質を活かして所属学部のすべての学生がすべて提出物を提出し終えている学部を取得できる。

```
select
dpt
from Students
group by dpt
having count(sbmt_date) = count(*);
```
ユークリッドの果樹園 とオイラーのファイ関数の和の高速化（その３）

### オイラーのファイ関数の和の高速化
[前回の投稿](https://qiita.com/masa0599/items/fe68d804c88a2e47a603)で以下の漸化式が出ましたので、これをプログラムにして行きたいと思います。

$\displaystyle \sum_{m=1}^{N} φ(N) = G(N,1)+1 $
$\displaystyle = \frac{N(N-1)}{2}-\sum_{m=2}^{N} G(\lfloor \frac{N}{m} \rfloor ,1)+1$</br>
 
まず再帰関数にしやすいように＋１のところは後にして、以下の式を考えます


$\displaystyle  G(N,1)= \frac{N(N-1)}{2}-\sum_{m=2}^{N} G(\lfloor \frac{N}{m} \rfloor ,1)$</br>

これをプログラムにしたのが下のV3.0です、それなりに速くなっていると思いますが、まだ1分以内で計算できるのは$10^7$までです。さらなる高速化を考えます。

```python
# V3.0 G(N,1) recursive with lru_cache
from functools import lru_cache
@lru_cache(maxsize=None)
def G(n):
  if n == 0: return 0
  ret = 0
  for m in range(2,n+1):
    ret += G(n//m)
  return n*(n-1)//2-ret 

n = 10**8
print(n, G(n))
# 100000000 3039635516365907
```
| | $10^4$|$10^5$|$10^6$|$10^7$| $10^8$|
|:--:|:---:|:---:|:--:|:--:|:--:|
|V1.0(gcd) | 8s| x| x| x| x|
|V2.0(totient)|0s| 0s|70s|x|x|
|V3.0(G(N,1))|0s| 0s|1s|16s|180s|

### さらなる高速化

これは前述のリンク[How to calculate these totient summation sums efficiently?](https://math.stackexchange.com/questions/316376/how-to-calculate-these-totient-summation-sums-efficiently)で紹介されている**Simplified hyperbola method 簡易双曲線法**を使ったものです。

難しそうなので、なるべく分かりやすく説明します。

再帰的に呼ぶ引数の$N//m$に注目すると、その値は同じ値を取る場合が多いことに気づきます。例えば$N=10,m=2$の場合だと以下のようになります。すなわち$m\leqq x < m'$で同じ値になっています。従ってこの区間は再帰呼び出しを1回だけ行い$(m'-m)$倍してして、その後$m$を$m'$にスキップすればよいことが分かります。

| N| m | N//m | m'|
|:--:|:---:|:---:|:--:|
|10|2|  5 |3|
|10|3|3|4|
|10|4|2|6|
|10|5|2|6|
|10|6|1|11|
|10|7|1|11|
|10|8|1|11|
|10|9|1|11|
|10|10|1|11|

このように変更したコードが下のV3.1です。さらに+1するコードをかぶせて$ \sum_{m=1}^{N}φ(m)$を求める最終的な関数**totsum**を作りました。これを使って$10^{10}$まで約1分で計算できるようになりました。

```python
# V3.1 Simplified hyperbola method #1
from functools import lru_cache

def totsum(n):
  @lru_cache(maxsize=None)
  def G(n):
    if n == 0: return 0
    ret, m1 = 0, 2
    while m1 < n:
      n1 = n//m1
      m2 = n//n1 + 1
      ret += (m2-m1)*G(n1)
      m1 = m2
    return (n*(n-1))//2-ret
  return G(n)+1

n = 10**8
print(n, totsum(n))
```

| | $10^4$|$10^5$|$10^6$|$10^7$| $10^8$|$10^9$|$10^{10}$|
|:--:|:---:|:---:|:--:|:--:|:--:|:--:|:--:|
|V1.0(gcd) | 8s| x| x| x| x|x|x|
|V2.0(totient)|0s| 0s|70s|x|x|x|x|
|V3.0(G(N,1))|0s| 0s|1s|16s|180s|x|x|
|V3.1(totsum)|0s| 0s|0s|0s|1s|3s|26s|

### （追記）簡易双曲線法の別の実装

上記のリンクでは以下の漸化式が出てくるので、これをそのまま実装したコードも添付します。コードはかなり違いますがやっていることは同等なのでパフォーマンスはV3.1とほぼ同じでした。

```math 
\begin{align}
\Phi(n) &= T(n) - \sum_{2\le i \le n/c}\Phi(\frac{n}{i}) - \sum_{j \le c-1}(\lfloor \frac{n}{j} \rfloor - \lfloor \frac{n}{j+1} \rfloor) \Phi(j) \\
& ここで　c = \lfloor \sqrt{n} \rfloor
\end{align}
```

```python 
# V3.2 Simplified hyperbola method #2
from functools import lru_cache
def totsum2(N):
  @lru_cache(maxsize=None) 
  def G(N):
    c = int(N**(0.5))
    return (N*(N-1))//2 \
          - sum(G(N//i) for i in range(2,c+1)) \
          - sum(((N//j) - (N//(j+1)))*G(j) for j in range(1,N//(c+1)+1))
  return 1 + G(N)

n = 10**8
print(n, totsum2(n))
```



（開発環境：Google Colab）

このアルゴリズムはEuler ProjectのProblem 351, 202, 787等を解くのに役に立ちます。
ユークリッドの果樹園 とオイラーのファイ関数の和の高速化（その２）

[前回の投稿](https://qiita.com/masa0599/items/6968c99e0e928763cb42)ではユークリッドの果樹園の木の数がファイ関数の和で求められることを示しましたが、今回はそのファイ関数の和を高速化することを考えます。

### オイラーのファイ関数の和の高速化

ネットにいくつかの情報がありましたが、この記事が比較的分かりやすかったので、少し自分流に変更して説明したいと思います。

> [How to calculate these totient summation sums efficiently? (StackExchange)](https://math.stackexchange.com/questions/316376/how-to-calculate-these-totient-summation-sums-efficiently)

まずN以下の自然数のペアの組合せの数をF(N)とします。</br>

$F(N)=|\lbrace a, b:\ 0 < a < b\leq N \rbrace |= {}_n \mathrm{C}_2 = N(N-1)/2...(1)$ </br>

このペアの内で$gcd$が$m$となるものをG(N,m)で表します。

$G(N,m)=|\lbrace a, b:\ 0 < a < b\leq N, gcd(a,b) = m \rbrace | ...(2)$ </br>

この$(2)$の要素をすべてを$m$で割ると$gcd=1$となります。集合の最大値は$\lfloor \frac{N}{m} \rfloor$となります。

$G(\lfloor \frac{N}{m} \rfloor ,1)=|\lbrace a, b:\ 0 < a < b\leq \lfloor \frac{N}{m} \rfloor, gcd(a,b) = 1 \rbrace | ...(3)$ </br>

(2)と(3)の要素は1対1に対応するので数は同じです、したがって、

$G(N,m)=G(\lfloor \frac{N}{m} \rfloor ,1)...(4)$

これを$m=1..N$で和を取ったものがF(N)になるので、

$\displaystyle  F(n) = \sum_{m=1}^{N} G(N,m) =  \sum_{m=1}^{N} 
 G(\lfloor \frac{N}{m} \rfloor ,1)$

$G(N,1)$を左辺に持ってくると、

$\displaystyle  G(N,1) = F(N)-\sum_{m=2}^{N} G(\lfloor \frac{N}{m} \rfloor ,1)$

今回求めたいオイラーのファイ関数の和はgcd=1となるペアの数なので、Gで表すと含まれていない$(1,1)$を加えて以下のようになります。

$\displaystyle \sum_{m=1}^{N} φ(N) = G(N,1)+1 $<br>
$\displaystyle = F(N)-\sum_{m=2}^{N} G(\lfloor \frac{N}{m} \rfloor ,1)+1$</br>
$\displaystyle = N(N-1)/2-\sum_{m=2}^{N} G(\lfloor \frac{N}{m} \rfloor ,1)+1$</br>
 


これで漸化式が出来たので次回はこのを式を元にしてPythonのプログラムを書いて行きたいと思います。

[ユークリッドの果樹園 とオイラーのファイ関数の和の高速化（その３）](https://qiita.com/masa0599/items/6c6986d7c9121aa724d8)

（開発環境：Google Colab）
ユークリッドの果樹園 とオイラーのファイ関数の和の高速化（その１）

### ユークリッドの果樹園

[ユークリッドの果樹園(wiki)](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E6%9E%9C%E6%A8%B9%E5%9C%92)について色々調べてみました。

> 座標の格子点$(x,y)\space (x, yは自然数)$に細い木を立てたとき、原点から見える木の条件は$gcd(x,y)=1$である

というものでWikiにもある画像をN=25まで描いてみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/136459f6-46cc-3af0-e63e-8ca507f5a56c.png" width=70%>

ここからオイラーのファイ関数につながって行きます。まず次のような問題を考えます。

***【問題】ユークリッドの果樹園で$0<x,y<N$のとき原点から見える木の数を求めよ。***

すなわち上の図で青の点の数を数えよという問題になります。
まず素直にN=25で$gcd(x,y)=1$となる点$(x,y)$を数えてみます。

```python
# V1.0
import math
N, count = 25. 0
for i in range(1,N+1):
  for j in range(1,N+1):
    if math.gcd(i, j) == 1:
      count += 1

print(f"answer = {count}")
# answer = 339
```
計算量は$O(n^2)$となるのでかなり効率が悪いですね。そこでオイラーのファイ関数$φ(n)$の登場となります。[Wiki](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0)によれば、

***$φ(n)$は n と互いに素である1以上n以下の自然数の個数***

となります。これは下の図のようにユークリッドの果樹園の右下の三角形の縦の列の青の数と同じになります。したがってこれを2倍して1引けば答が出るはずです。（$(x,y)=(1,1)$が重複）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/ef528f01-84ec-47c5-ea3c-572f0d8e06af.png" width=50%>

今回は組込みのsympy.ntheoryのtotient関数を使って計算すると同じ答えになりました。

```python
# V2.0 using totient
from sympy.ntheory import totient
N, count = 25, 0
for x in range(1,N+1):
  count += totient(x)  
print(f"answer = {count*2-1}")
# answer = 339
```
計算時間は以下のようになります。V1.0(gcd)は$10^4$まで、V2.0(totient)では$10^6$まで100秒以内で計算できました。それ以上になるとさらなる高速化が必要になります。[続編](https://qiita.com/masa0599/items/fe68d804c88a2e47a603)で**オイラーのファイ関数の和の高速化**について書きたいと思います。

| | $10^3$| $10^4$|$10^5$|$10^6$|$10^7$|
|:--:|:---:|:---:|:--:|:--:|:--:|
|V1.0(gcd) |1s| 38s| x| x| x|
|V2.0(totient)|1s|1s| 5s|70s|x|

[ユークリッドの果樹園 とオイラーのファイ関数の和の高速化（その２）](https://qiita.com/masa0599/items/fe68d804c88a2e47a603)

（開発環境：Google Colab）
geocoder 住所からの緯度経度の算出

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 本題

`geocoder` を使っていて
名称から緯度経度は算出はできるのに
住所からは算出できない問題があった

例えば

[![Image from Gyazo](https://i.gyazo.com/371010af7910ebb82dd8227d6e82f5f7.png)](https://gyazo.com/371010af7910ebb82dd8227d6e82f5f7)

こんなかんじ

___

https://qiita.com/roark/items/2fedc1ebac763e72d70b


上の記事曰く
`geocoder` の地図の初期設定は `nominatim` っていうものらしい
その精度だと住所からの算出はできないとのこと

どうやら自分は `google map` の `API` を使えていなかったみたい

なので

```
bin/rails g geocoder:config
```

で設定ファイルを作り

```
Geocoder.configure(

  lookup: :google,    

  api_key: "自身のAPIキー"              

)
```

で設定してやる

すると

[![Image from Gyazo](https://i.gyazo.com/0d949e4c2d7c2a38782663d2fc8ffa38.png)](https://gyazo.com/0d949e4c2d7c2a38782663d2fc8ffa38)

所得できた
HoloLens2のデバイスポータルに関するメモ

- PCのブラウザを開いてURL入力．デバイスポータルにアクセスできる

- HoloLens2とPCを同じWi-FiにつないでいればPCとUSB接続しなくてもWi-Fi経由でデバイスポータルにアクセスできる．

- HoloLens2本体のデバイスポータルの下にアクセスURLが表示されているので，それを見る．HoloLens2とPCが別回線の時はUSBでPCとHoloLens2を接続した状態でイーサネットのURLを入力する．

- IPアドレスでアクセスする場合はIPv4のアドレス入力
   →時間がたつとIPアドレスは変わるので注意．

- アクセス成功すると，ユーザ名とパスワードを要求される．

- ユーザ名とパスワード数回間違えると"Credential Reset"となって新しいユーザ名とパスワード作る必要あり．

- pinはHoloLens2被った状態じゃないと表示されず（？）失敗となる

---
参考サイト一覧

[Microsoft公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/advanced-concepts/using-the-windows-device-portal)
[DevicePortalを使う【HoloLens2】-トマシープが学ぶ](https://bibinbaleo.hatenablog.com/entry/2020/04/14/203329)
[HoloLens2で認識した空間マッピングをDevicePortalからダウンロードする](https://bluebirdofoz.hatenablog.com/entry/2021/01/16/231219)
CSV ファイルの書き込み

## 開発環境
`ruby 2.6.5`

## 本題
スクレイピングをしていて

[![Image from Gyazo](https://i.gyazo.com/6a4409849f74303f368c039a18267a1e.png)](https://gyazo.com/6a4409849f74303f368c039a18267a1e)

こんなかんじで `@cat_list` の中にほしい情報をいれて
CSVファイルに書き込もうと思い

```
CSV.open("result.csv", "w", :force_quotes=>true) do |csv|
  @cat_list.each do |info|
    csv << info
  end
end
```

するとエラー

内容は

```
/Users/isamutatsuya/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv/writer.rb:37:in `<<': undefined method `collect' for "王子神社":String (NoMethodError)
```

こんなかんじ。どうやら書き込みの書き方がうまくいってないよう

___

明確な答えはなかったんだけど
どの参考文献も配列で書き込んでいたので

```
CSV.open("result.csv", "w", :force_quotes=>true) do |csv|
  @cat_list.each do |info|
    csv << [info]
  end
end
```

としてみたらうまくいった

以下参考

https://docs.ruby-lang.org/ja/latest/class/CSV.html
【Rails】enum_help使用してselectボックス作成

検索するとmapを使っているやり方がほとんどだったがこっちの方がシンプルに書ける

##環境
Ruby 3.0.2
Rails 6.1.4.1


##やり方
enum_help使用

```model.rb
class Employee < ApplicationRecord
  enum status: { enrollment: 0, resigned: 1 }
end
```

- ```Employee.statuses_i18n```はenum_helpで使えるようになるもの

```ruby
Employee.statuses_i18n
#=> {"enrollment"=>"在職中", "resigned"=>"退職済み"}
```


```html.slim
f.collection_select :status, Employee.statuses_i18n.to_a, :first, :last, {}, class: 'hogehoge'
```

```
f.collection_select(メソッド名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション or HTML属性 or イベント属性])
```


第2引数：配列指定
第3引数(value属性の項目)：配列の最初の要素(ここでいうと"enrollment", "resigned")
第4引数(テキストの項目)：配列の最後の要素(ここでいうと"在職中", "退職済み")
第5引数：クラスを定義する場合、空を指定しオプションはないことを明記


##参考

https://railsdoc.com/page/collection_select

https://github.com/zmbacker/enum_help

https://qiita.com/ohnitakahiro/items/c536fe65e37980e1087e

https://qiita.com/tanutanu/items/ee18ed0ab13dcbe50864
ruby インスタンス変数

`rails` で当たり前のように扱っているインスタンス変数

http://devtesting.jp/tddbc/?TDDBC%E5%A4%A7%E9%98%AA2.0%2F%E8%AA%B2%E9%A1%8C

上記の自動販売機プログラムで改めて考えた


```
class VendingMachine
  MONEY = [10, 50, 100, 500, 1000].freeze 
  def initialize 
    @slot_money = 3
  end
  def current_slot_money
    @slot_money
  end
  def slot_money(money)
    return false unless MONEY.include?(money)
    @slot_money += money
  end
  def return_money
    puts @slot_money
    @slot_money = 0
  end
end

```

上みたいな自販機プログラムを書く
その上で irb で

```
>> require '/Users/isamutatsuya/workspace/vending_machine/vm.rb' #=> true
>> a = VendingMachine.new #=> #<VendingMachine:0x00007fc1e22d19e0 @slot_money=3>
```

ここで irb 上で `@slot_money` を出力すると

```
>> @slot_money #=> nil
```

となる。

なんとなく 3 が出力されそうな雰囲気があるけど結果は `nil`

これはなんでかというと 伊藤淳一さんの ruby 本には

> インスタンス変数はクラスの外部から参照することができません。もし参照したい場合は参照用メソッドを定義する必要があります
引用　プロを目指す人のための Ruby 入門　著 伊藤淳一

とある。

クラス内部でしかインスタンス変数は参照できないらしい

`rails` ではコントローラーで定義したインスタンス変数を
当たり前のように同名の `View` 使っていたので
ここでインスタンス変数のスコープの理解があいまいだったことに気づいた 

インスタンス変数のスコープはあくまで同じクラス内
これはどの参考書読んでも同じだった

~~したがって `rails` において、
コントローラー内と同名ビュー内で同じインスタンス変数が使えるのは
上記の２つが同じクラスにあるからかなと思う。（これは間違えているかも）~~

←どうやらこの仕組みは裏側でインスタンス変数をコピーする仕組みが働いているらしい。
詳しくはコメント欄の確認をお願いします。


またもしクラスのインスタンス変数を出力したい場合は

①インスタンスメソッドとして変数を返り値として出力する
②アクセサメソッドを定義してプロパティにアクセスする

がありそう
【Laravel・PHP】動画ファイルがアップロードできない時に対処 php.iniの設定

# はじめに
Laravelで動画アップロード機能を実装したがどうしても成功しなかった。
実は**php.ini**というPHPの設定を変更しないとうまく動かないことがわかったのでそれに関する情報です。

# 環境
PHP 7.4.21
Laravel 8.39.0

# php.ini
このファイルの場所ですが、今回の環境はEC2（Linux系）なので
**/etc/php.ini**にあります。

ファイルの場所はOSなどで違う場合ありますので`phpinfo()`でみれます。

ここの記述を編集します。

# 設定内容
今回は**アップロードする容量の制限にひっかかっている**ことがわかったのでその上限を変えます。
変更加えたのは以下の内容です。

```
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

(中略)

memory_limit = 1024M // デフォルトは128M


;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;

(中略)

post_max_size = 1024M　// デフォルトは8M


;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

(中略)

upload_max_filesize = 1024M　// デフォルトは2M
```

私の場合はこの３項目を編集し正常に動作するようになりました＾＾
php.iniの設定が必要だとは初めて知ったので学びになりました！
firebase ~環境構築(Hosting)~

自分の勉強の為のメモとして書きます。

firebaseのHostingまでの環境構築

`yarn -g add firebase-tools`

次にfirebaseにlogin

`firebase login`

次にfirebaseの初期設定
`firebase init`

次にfirebaseのHostingにdeploy
`firebase deploy`

firebase console側では

プロジェクトを作成する
settingでロケーションをasia-notheast1に設定
VMware Intel VTを有効化にする

## 目標
ESXiホスト上に仮想マシンを作成する

これまでは

「このホストはIntel VT-x に対応していますが、Inter VT-xは無効になっています。」

と出ていたため、Intel VT-xを有効化することが必要

## 結論
https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-2A98801C-68E8-47AF-99ED-00C63E4857F6.html

仮想マシン構築時にCPUのところでハードウェア アシストによる仮想化にチェックをつけて構築すればOK

## 苦労した点

BIOSで有効にするという話もあったが、BIOSでは仮想化を有効にする項目は見当たらず。

http://network-server-infra.com/2019/02/17/vmware-player%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%EF%BC%9F/

### 仮想環境ではBIOSで設定することはほぼない

今回は仮想環境に仮想環境を構築していたのだが、仮想環境の場合はBIOSで設定する項目はほとんどない
構築時の詳細設定で設定することがほとんど
物理端末だとBIOSで設定する
PG ConnectionBad エラー

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`
`postgresql 13.4`

[![Image from Gyazo](https://i.gyazo.com/ca4228c29bdcf2ce607cb214275b6ea6.png)](https://gyazo.com/ca4228c29bdcf2ce607cb214275b6ea6)


昨日起動できていたアプリが今日になって `reils s` したらエラー

___

https://qiita.com/great084/items/98c83364f246473249c4

どうやら昨日の `pid` が残ってしまっているよう

```
 rm /usr/local/var/postgres/postmaster.pid

brew services restart postgresql

```
したら無事起動
Google map の導入



`Ruby on Rails`　のアプリに `Google map` を導入するためには
`Google` の `API` と `Ruby` の `gem` を使う必要がある

導入にあたって抑えとく部分のまとめを

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`
## Google の提供する API

・`Google` マップを使うにあたって `Googlemap` の `API` と `geocoder` の `API` を所得する必要あり

・`Google map` の `API` は `Google map` を使用するもの

・`geocoder` の `API` は経度や緯度から目的地を算出する `API`（逆もあり）

・参考にさせていただいた記事以下

　https://qiita.com/nagase_toya/items/e49977efb686ed05eadb

・上の記事を参考にすると
[![Image from Gyazo](https://i.gyazo.com/6d38ef3d05b2e1a3d3f30c856db11b2e.png)](https://gyazo.com/6d38ef3d05b2e1a3d3f30c856db11b2e)
　こんなかんじで `Google map` をつくれる

・抑えておくべきことは `Google map` と検索機能自体は
　`gem` を使わなくても導入できるとうこと

## Ruby の提供する gem

・`geocoder` という `gem` と `gmaps4rails` という`gem` を使う

・`geocoder` は `Google` の `API` と `DB` 連携させる `gem`
・要するに `gem` を使わなくても `Google map` は使えるけど
　地図の情報を保存したり、住所が追加されたタイミングでコールバックさせて
　`Google map` を更新したりするために必要

・`gmaps4rails` は簡単に `Google map` を表示するたまの `gem`
・要するに `gem` を使わなくても頑張れば `Google map` を表示できるけども
　`gmaps4rails`  を使えば簡単に設定できるということ

・それぞれの一次情報は以下

https://github.com/alexreisner/geocoder

https://github.com/apneadiving/Google-Maps-for-Rails

・ 導入にあたって参考にさせていただいた記事は以下

https://qiita.com/nakanoyoshiki/items/af9f37e9d2653518d6b0

https://qiita.com/yuki_chrono/items/a2638c33eedc3c036d01

・上の記事を参考にすると
[![Image from Gyazo](https://i.gyazo.com/44aa233df9cd4c03cd75088daa1288cd.png)](https://gyazo.com/44aa233df9cd4c03cd75088daa1288cd)
　こんなかんじで `DB` に保存したタイミングで地図が更新される


## まとめ

地図の導入は情報が非常に多い
ただ一方で本当に正しいのかって思う記事も多かった。
正直自分の認識があってるのかも微妙なところ

一次情報の大切さを痛感
【続】あなたの知らないディズニーキャラクターの世界 #JavaScript #HTML #CSS #codepen #Netlify 

#懲りないDヲタ

以前にディズニーキャラクターをランダムに取得して返す、というLINE Botを作成しました。
（過去のQiita記事→[あなたの知らないディズニーキャラクターの世界](https://qiita.com/kk_puruzera/items/d6a3c6400090fa44d794)）

が、しかし。
本当はクイズっぽくしたかった、という心残りがあったのです。

そこで、今回は**CodePen**と**Netlify**を使用して、
<font color="Red">**まだ見ぬディズニーキャラクターに出会えるWebアプリ**</font>を作成してみました。
Dヲタ（ディズニーヲタク）は懲りませんよぉ～！

#見ろよ、これで完成なんだぜ？
CodePenで作成したものをNetlifyを使用して公開しました。

https://sad-mestorf-06e28a.netlify.app

#使用したもの

* [CodePen](https://codepen.io/trending)
* [Netlify](https://www.netlify.com/)
* [DisneyAPI](https://disneyapi.dev/)

**参考にしたCodePen**
[Extreme Hover - HTML + CSS](https://codepen.io/CameronFitzwilliam/pen/vYNgbPX)
[料理とお買い物メモ](https://codepen.io/yui-ko/pen/RwZjpGd)

**作成過程の記録用として**
[Zenn](https://zenn.dev/)

#完成コード
今まで直書きしていましたが、今回はCodePenを埋め込んでおきます。

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

#完成までのあれやこれや
こちらも今までダラダラと記載しておりましたが、今回は「Zenn」を使用して記録しておきました。
投稿主が地面に這いつくばり血反吐を吐いてきた過程はこちらをご確認ください。
（すみません。血反吐は過言でした。Enterキーがひび割れるほどの苦心、くらいが妥当でした。）←

https://zenn.dev/puruzera/scraps/9fde00251fda68

#楽しかったのか
<font color="Red">**楽しかったです！**</font>
更新されるたび知らないキャラクターが表示されるので本当に勉強になりました。
知っているキャラクターが表示されたときは、当たりを引いたような嬉しさを感じました♪

知らないものを知ろうとするには、まずは目の前に突然現れてくれなければいけません。
まずは画像のみ表示し、そのあと名前を確認できるという動きもクイズのようにできたと思います。
今回はLINE Bot作成時の雪辱をほんのすこしですが果たせたように思います。

#反省会
ここからはほぼ自分用の反省会です。
聞いてくださる方のみどうぞ。

**・むっず！**
HTML、CSS、私には手ごわかった……！
他のユーザーのものを参考にしようと思っても、書かれているコードが読み取れない……！
これは継続して勉強が必要だと思いました。
（やるとは言っていない。）←

**・画像の位置センスない！**
あれやこれや試したのですが、取得した画像の位置を変えられず……。
これは次への課題とします！！

**・シンプルすぎやしないか**
動きがおもしろいCodePenを元に作成しましたが、全体的にシンプルすぎたように思います。
もっといろいろ凝りたかったのですが、限られた時間内と自分の今のスキルはこれが限界でした。
自分のスキル不足を痛感しました……。

そんなこんなしつつ、きっとまた何か創り出すんです。
引き続き見届けていただけると嬉しいです。

<font color="Red">追記</font>
**iPhoneユーザー**から「キャラクター名が表示されない」「キャラクター画像をタップしても表示されない」という連絡をもらいました。
さて、なぜなのか……。こちらも調べてみようと思います。
exists②

>※達人に学ぶSQL徹底指南書 第2版 のまとめノートです。

・列は持続的な構造として考えるべきである

- 列方向への全称量化
- 全称量化「すべての列が1である」の実装
```
posgreのall,anyはサブクエリ以外に配列型ならば引数に受け取ることができる。
SELECT *
  FROM ArrayTbl
WHERE 1 = ALL (array[col1, col2, col3, col4, col5, col6, col7, col8, col9, col10]);
```

- 存在量化「少なくとも1つは9である」の実装

```
SELECT *
from arraytbl
WHERE 9 = any(ARRAY[
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10])
```

- すべての列がnullである　の実装

```
--オールNULLの行を探す：正しい答え
SELECT *
  FROM ArrayTbl
 WHERE COALESCE(col1, col2, col3, col4, col5, col6, col7, col8, col9, col10) IS NULL;
```
Paramikoでget_pty=Trueにしてsudoコマンドを実行してパスワードを入力しても反応がないとき

### ことはじめ
- 設定が間違ってないかどうか、全ホストのとあるconfigファイルをちょっと確認したかった
- rootでしか表示できないファイルだったのでcatするにしてもsudo(パスワード入力)が必要だった
- expectを使ったスクリプトよりpythonの方がわかりやすいと思った

#### 現象

@kanedaq さんの  
>[Pythonコードから多段SSHでホストに接続し、コマンドを実行してstdout出力を受け取る](https://qiita.com/kanedaq/items/fd9e229323f2fc07e920)

とかを参考にコードを書いたのだけど、なぜか動かない。
動かないというかsudoパスワードを入力した後の結果が全く返ってこないという現象に出会った。

#### (おそらくの)原因

- パスワードの入力タイミングが早すぎたのが原因と思われる
- ちょっと反応の悪いホストの場合、sudoのパスワードプロンプトが表示されるのをちゃんと待ってからパスワードを入力する必要がある模様

#### 解決策
- 考えてみればそりゃそうかという感じだが、一律で5秒sleepをはさむとかすると対象ホストが増えれば増えるほど比例して待ち時間が長くなるのが嫌だった
- なので、パスワードプロンプトが表示されるまで待って入力可能になった瞬間に入力するようにする

### 環境
- 5.4.72-microsoft-standard-WSL2
- Ubuntu 20.04.3 LTS
- Python 3.8.5
- Paramiko 2.7.2

### リモートでsudoコマンドを実行する最低限のコード
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import paramiko
import time

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 接続
client.connect(
    hostname="hostname",
    username="testuser",
    password="password",
    port=22,
)

# cmd実行
cmd = "sudo whoami"
stdin, stdout, stderr = client.exec_command(cmd, get_pty=True)

while len(stdout.channel.in_buffer) == 0:
    # stdoutにパスワードプロンプトが出力されるまで待ち続ける
    continue

# とてつもなく反応が悪いホストの場合は入力可能になるまで更に待った方がいい？
# time.sleep(1)

# sudoパスワード入力
stdin.channel.send("password" + "\n")
# stdinだけ閉じる
stdin.channel.shutdown_write()

# 実行結果
# (留意点: get_pty=Trueにしているとstderrもこっちに出力されている)
print(stdout.read().decode().strip())

# 切断
client.close()
```
PDO エラー出力に関して　参考サイト


#### PDOはデフォルトでエラーを吐かない

```
PDO::ERRMODE_SILENT
```

デフォルトのエラー設定。
エラーメッセージを出力しない。エラー内容は保持している。 
エラ−を取得するには`PDO::errorCode()`か`PDO::errorInfo()`を使う。

https://unskilled.site/pdo%E3%81%AF%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E3%81%AF%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E3%82%92%E3%81%97%E3%81%AA%E3%81%84%E3%81%A7%E3%81%99/

#### 'MYSQL_ATTR_USE_BUFFERED_QUERY'

https://www.drupal.org/hosting-support/2012-07-30/mysql_attr_use_buffered_query
スクレイピング　ページ遷移しながらデータ収集

## 開発環境
ruby 2.6.5

https://qiita.com/ichihara-development/items/d2c240a0c5258881cdcf


上の記事を参考にさせてもらって

yahoo ニュースのデータを
CSVファイルに格納するスクリプトを書いてみた

[![Image from Gyazo](https://i.gyazo.com/6aa1000d810d864bc23e8a49e4005522.png)](https://gyazo.com/6aa1000d810d864bc23e8a49e4005522)

ここのページネーションでページ遷移しながら

[![Image from Gyazo](https://i.gyazo.com/683a3d3b66d77ca361fd5dd235bac78b.png)](https://gyazo.com/683a3d3b66d77ca361fd5dd235bac78b)

全ての記事のタイトルを所得する試み

ここまで出来ればいろいろ自動化できそう


スクリプトは以下

```
require 'nokogiri'
require 'open-uri'
require "csv"

url_base = "https://news.yahoo.co.jp/topics/top-picks/"
add_url = "https://news.yahoo.co.jp/"
def get_categories(url)
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  categories = doc.css(".pagination_item a")
  categories.map do |category|
    cat_name = category.text
    cat = category[:href]
  end
end

@cat_list = get_categories(url_base)
@cat_list.pop(1)
@cat_list.unshift("topics/top-picks")
@infos = []

@cat_list.each do |cat|
  url = "#{add_url + cat}"
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  titles = doc.css(".newsFeed_item_title")
  i = 1
  titles.each do |title|
    @infos << [i,title.text]
    i += 1

  end
end

CSV.open("result.csv", "w") do |csv|
  @infos.each do |info|
    csv << info
  end
end
```

いろいろ無駄はありそうだけどとりあえず動く

流れは

① ページネーションの `href` を配列にして `nokogiri` で所得
② 所得した `href` を加工（次への `href` を削除したり　今のページの `href` を追加したり）
③ 加工した `href` の配列を `each` で回しながら `nokogiri` で記事のタイトルを所得
④ 所得したタイトルを CSV ファイルに格納


実際に実行すると

[![Image from Gyazo](https://i.gyazo.com/6c625a7e2edb09db9d2727c1428fbee4.png)](https://gyazo.com/6c625a7e2edb09db9d2727c1428fbee4)

こんな感じでCSVファイルがつくられて
所得した情報が入る
ruby 配列を変更するメソッド

## drop メソッド
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/drop.html

```
e = [1, 2, 3, 4, 5, 0]
e.drop(3)      # => [4, 5, 0]
```

引き数に与えた数の要素を先頭から削除して
配列を返す

## pop メソッド

https://docs.ruby-lang.org/ja/latest/method/Array/i/pop.html

```
e = [1, 2, 3, 4, 5, 0]
e.pop(3)      # => [1, 2, 3]
```

引数に指定した数の要素を末尾から削除して
配列を返す

## unshift メソッド

https://docs.ruby-lang.org/ja/latest/method/Array/i/unshift.html

```
e = [1, 2, 3, 4, 5, 0]
e.unshift(3)      # => [3, 1, 2, 3, 4, 5, 0]
```

引数に与えた数を配列の先頭から追加して
配列を返す

## push メソッド

https://docs.ruby-lang.org/ja/latest/method/Array/i/push.html

```
e = [1, 2, 3, 4, 5, 0]
e.push(3)      # => [1, 2, 3, 4, 5, 0]
```
引数に与えた数を配列の末尾に追加して
配列を返す
スクレイピング　nokogiri

※スクレイピングは自己責任でお願いします

参考にさせていただいた記事は以下

https://nokogiri.org/tutorials/parsing_an_html_xml_document.html

https://github.com/sparklemotion/nokogiri

https://qiita.com/kotaokubo/items/78f89610dc05a317e78a

[![Image from Gyazo](https://i.gyazo.com/724a4ed7279e04760ec5990d1ab92d40.png)](https://gyazo.com/724a4ed7279e04760ec5990d1ab92d40)



こんなかんじの表を

[![Image from Gyazo](https://i.gyazo.com/5267266d75fa24197b14bb207a1b0571.png)](https://gyazo.com/5267266d75fa24197b14bb207a1b0571)

こんなかんじで取り込める


## 開発環境
ruby 2.6.5
Ruby on Rails 5.2.5

## 前提

`rails` に組み込む想定
基本的なアプリを `scaffold` でつくっておく (今回は Post モデル)


## 方法


① `gem 'nokogiri'` で `bundle install`

② 共通の関数にするために `concern` ファイルに以下の `module` を作る

```:concern
module PaypayScrapesConcern
  require 'open-uri'
  require 'nokogiri'

  def set_paypay_shops
    url = 'https://paypay.ne.jp/notice/20200604/01/'

    doc = Nokogiri::HTML(URI.open(url))
    @posts = []
    doc.xpath('//div[@class="article__contents post"]').css('tr').each do |node|
      @posts << node.css("td[1]").text
    end
    @posts = @posts.drop(1)
    @posts
  end
end
```
```
Nokogiri::HTML(URI.open(url))
```

 でもとの HTML をひっぱってきて

```
doc.xpath('//div[@class="article__contents post"]').css('tr').each do |node|
  @posts << node.css("td[1]").text
end
```
で情報を切り出している


③ 今回は `post_new_path` のルーティングで表示させるので
　new アクションに以下のコードを書く

```:post_controller.rb
 def new
    if params[:format] == "paypay"
      @posts = set_paypay_shops
    end
    @post = Post.new
  end
```
クエリパラメーターで条件分岐（これは状況によってはいらない）

④ `view` に以下のコード

```:posts/new.html.erb
<%= link_to "表示する", new_post_path("paypay")%>
<% if @posts.present? %>
  <% @posts.each do |post| %>
    <%=  post%>
  <% end %>
<% end %>
```

`get` メソッドなので
`new_post_path("paypay")` とすると

```
irb(#<PostsController:0x00007ffa83a5b498>):001:0> params
=> <ActionController::Parameters {"controller"=>"posts", "action"=>"new", "format"=>"paypay"} permitted: false>
```

こんな感じでパラメーターをつけられる。`format` の使い方間違ってる気がするけど

今回のパターンは new の url で完結するようにした
AI開発を簡単スタート！ STM32マイコンとMEMSセンサを用いた組込みAIソリューション

#1.AIの概要  

AI（Artificial Intelligence： 人工知能）は、1956年にダートマス大学で開催された夏季シンポジウムにおいて、初めて正式に「Artificial Intelligence」という用語が使用され、研究分野として確立されました。以降、さまざまな技術革新とともに発展を続け、近年では、ビッグデータやコンピュータの演算能力の向上により、さらなる応用も期待されています。2015年には、深層学習（ディープ･ラーニング）に基づくAIアルゴリズムがImageNetの画像認識精度コンペにおいて、初めて人間の能力を上回りました [1]。深層学習は、画像認識だけでなく、音声認識やデータ･マイニング、自然言語処理など、さまざまな分野で大幅に精度が向上しています。AIは、いまやあらゆる分野で活用できる大きな可能性を持った技術といえるでしょう。

AIには、キーとなる技術コンセプトが3つあります。

 - AI： コンピュータによる人間の知的能力の模倣を可能にする技術の総称
 - 機械学習（Machine Learning = ML）： データに基づく学習を繰り返すことで性能を向上させていくアルゴリズムや方法論（AIの一種）
 - 深層学習： 人間の脳の神経回路を模した多層構造を利用して、膨大なデータから意味を導き出す学習アルゴリズム（MLの一種）

![fig1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/c4529fb1-035f-51d8-9e2b-eca9ed362f93.png)
　　　　　　　　　　　　　　図1： 人工知能のあゆみ

#2.エッジ・コンピューティングを用いたSTのAIソリューション  

現在、AI技術はおもにクラウドまたはエッジのいずれかをベースに使用されています。クラウド･ベースのデータ集中型AIには、データ転送の遅延といった制約があるため、データ･セキュリティやシステムの応答性、プライバシー保護、および端末の消費電力などにおけるユーザのニーズに対応できない場合があります。また、組込みデバイス（スマートフォン、スマート･スピーカ、ロボット、ウェアラブル機器など）は、クラウド･サーバに依拠してAI機能を実現します。一方で、エッジAIは、組込みシステム自体がローカルでAIアルゴリズムを実行するため、環境認識や、人間とコンピュータのインタラクション、決定制御といった機能をリアルタイムで行うことができます。



![fig2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/02d9bc78-82d8-0a80-8800-56563799f7a3.png)


　　　　　　　　　　　　　　図2： データ集中型のAIアプローチ



また、エッジAIの推論には、システムの応答性向上、ユーザ情報に対するプライバシー保護の強化（すべてのデータを複数のシステムを介してクラウドに転送する必要がないため）、接続コストや消費電力の削減など、さまざまなメリットもあります。

![fig3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/d1c29fdd-3d7a-219b-c665-7518175f7b83.png)


　　　　　　　　　　　図3 ： 組込みAIを用いたエッジ･コンピューティング



ABI Researchによる調査では、ディープ･エッジAI端末の世界出荷台数が2030年までに25億台に達すると予想されています[2]。独立型かつ低消費電力でコスト効率に優れた組込みソリューションを中心に、ディープ･エッジAI技術のコミュニティとエコシステムの発展が続いています。

STは、このようなトレンドに対して開発者がSTM32マイコンやMEMSセンサ、ToF（Time-of-Flight）測距センサをベースにした組込みAIを迅速に導入できるよう、さまざまなソリューションの準備を進めてきました。STM32マイコン向けの組込みAI開発ツール「STM32Cube.AI」や、機械学習コア内蔵MEMSモーション･センサなど、組込みAI開発に役立つ革新的な製品やソリューションを提供しています。

AIは、今や一般的な技術として幅広い分野で活用され、大きな成果をあげています。組込みAI機器は、今後ますます身近なものになり、私たちの生活をより豊かにしていくでしょう。


# Reference


[1]https://arxiv.org/abs/1502.01852

[2]https://www.prnewswire.com/news-releases/global-shipments-of-tinyml-devices-to-reach-2-5-billion-by-2030--301123076.html
Webアプリやアプリケーションなどで、入力や変換がうまくいかないときの備忘メモ。

Webアプリやアプリケーションなどで、入力や変換がうまくいかないときに試してもらえますと。

# macで「英数」キーを押しても英数入力に切り替わらない場合
現状「かな」モードであるはずなのですが、あえて**一回「かな」キーを改めて押した後に「英数」キーを押すとちゃんと「英数」に切り替わることがある。**
Windowsメインで開発されたアプリケーションが、入力切替をトグル的なステータス管理してるせいなのかな？と勝手に思っている。

#ブラウザなどで、ID/パスワードの自動入力候補が出てこない場合
他のサイトでは出てくるのに...
こんなときは**適当に"a"など打ってみて、それを消すとなぜか候補が出てくることがある。**

### この他にもいろいろとあった気がするので、思い出し次第追加していきます。