OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi でsystemdにサービス登録すると音が出なくなる現象の対処法

# どんな現象か
mp3を再生するPythonプログラムを作成し、それを`python test.py`のように実行する場合は問題なく音が出ますが、
自動起動するためにsystemdにサービス登録したところ、音が鳴らなくなってしまいました。

ユニットファイルは以下のような内容。
```
[Unit]
Description=Test
After=network.target

[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/test.py
WorkingDirectory=/home/pi

[Install]
WantedBy=multi-user.target
```

# 何が問題か？
PulseAudioという音を鳴らすためのサウンドサーバシステムが、rootユーザからは参照できないようになっているため。

ユニットファイルで`User=pi`のように指定していても、それは`ExecStart`で指定したプロセスをpiユーザで起動するという意味であって、
サービス自体の起動はrootユーザによって行われます。

# 対処方法1
サービスの起動を非rootユーザで行います。

`systemctl --user enable test.service`のような形でサービス登録すればOK。

ユニットファイルの置き場所など他にもいくつかの設定があるので、詳しくは以下の記事を参考に。
[サーバー起動時に非rootユーザでsystemdを使ってサービスを立ち上げる](https://qiita.com/k0kubun/items/3c94473506e0e370a227 "サーバー起動時に非rootユーザーでsystemdを使ってサービスを立ち上げる")

ただし、この方法だと非rootユーザーのユニットとしか依存関係を設定できないらしいです。
今回は`After=network.target`と指定している通り、ネットワークの接続後に動かしたかったので、この方法は使えませんでした。。。

# 対処方法2
ユニットファイルに、環境変数`XDG_RUNTIME_DIR`の設定を追記。

```
[Unit]
Description=Test
After=network.target

[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/test.py
WorkingDirectory=/home/pi
Environment="XDG_RUNTIME_DIR=/run/user/1000"

[Install]
WantedBy=multi-user.target
```

[Service]セクションに`Environment="XDG_RUNTIME_DIR=/run/user/1000"`を追記しています。

`1000`となっている部分はUID。
ラズパイで最初に作ったユーザのUIDは`1000`になるっぽいですが、念のため`id`コマンドでUIDを確認したほうが良いかもしれません。

こちらの方法で、rootユーザからのサービス起動でも無事に音が鳴るようになりました！
mysql コマンドがつかえない時 mysql.exeのpathを通す

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/55e2bbad-dd38-5702-4401-ea7c2d9b425f.png)
<h1>mysqlコマンドへPATHを設定する</h1>
上記コマンドが実行できない場合、
mysql.exeがあるディレクトリのpathを通します 

![mysql2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/66d26672-aecf-fc02-3efe-aa80f7e73cb5.png)
AWS オンプレミスとクラウドについて（自分用メモ

・オンプレミス
自社設備を自社運用する環境のことです。
自社設備について機器調達、設備管理の手間がかかります。
また、自社運用では、機器故障の対応。稼働中に対応可能な人員の確保が必要になります。
さらに、導入した機器や設備は簡単に変更できないため、ピーク需要の変化に柔軟に対応できません。そのため、オーバースペックな機器を導入したり、需要予測を誤って機器のスペックが不足する場合があります。

・クラウド
AWSなどのクラウドコンピューティング（クラウド）とは「インターネット越しに、必要なリソースにアクセスして使用する」環境のこと。
クラウドサービスを利用することによってのメリット。

・固定費の削減
必要なリソースを必要なだけ購入すればよい（従量課金制）ため、、リース代金や償却費などが不要。

・コストメリット
多数の顧客に対応可能な機器を調達するため、クラウドサービス側は調達に関するコストメリットを得ることができます。

・需要変化に対応
クラウドサービスは数分程度でリソースを用意できるため、急激な需要変化が起きてもスケールアップ/ダウン（リソースの処理能力の増減）やスケールアウト/イン（リソースの多重度の増減）で対応。

・対応速度の向上
リソースが数分で用意できることを生かして、開発や検証に必要な実環境と同様の環境をすぐに用意することができます。そのため、ユーザはリソースの調達に関する時間や費用を抑えることができ、また不要になった検証環境をすぐに破棄することでもコスト削減に効果があります。

・運用、保守に関する費用の削減
設備を購入、管理する必要がないため、ラッキングや電力管理といった作業や、機器故障の対応が不要。

・グローバル化
クラウドサービスはインターネット経由で利用できるため、世界展開も容易になります。また、クラウドサービスは複数の地域（リージョン）で展開されているため、アプリケーションを複数のリージョンに展開することで世界各地域からのアクセスに低遅延で応答できるようにできます。

【クラウドコンピューティングのサービスモデル】
クラウドコンピューティングの代表的なサービスモデルに、IaaS、PaaS、SaaSがあります。

・IaaS (Infrastructure as a Service)
ネットワークやストレージを含むサーバー機能を提供するサービス。ユーザーはサーバーのスペックを選択し、OSやミドルウェアの導入をします。

・PaaS (Platform as a Service)
OSやミドルウェア、ランタイムなどのアプリケーション実行環境を含むプラットフォームを提供するサービス。ユーザーはインフラを意識せずに、アプリケーションの開発・導入ができます。

・SaaS (Software as a Service)
アプリケーションを含むすべての機能を提供するサービス。ユーザーは機能のオプションを設定するだけでアプリケーションを利用できます。
AutoGluon-Tabular を使ってみた


  feat_1  feat_2  feat_3  feat_4  feat_5  feat_6  feat_7  feat_8  feat_9  \
0       1       0       0       0       0       0       0       0       0   
1       0       0       0       0       0       0       0       1       0   
2       0       0       0       0       0       0       0       1       0   
3       1       0       0       1       6       1       5       0       0   
4       0       0       0       0       0       0       0       0       0   

   feat_10  ...  feat_85  feat_86  feat_87  feat_88  feat_89  feat_90  \
0        0  ...        1        0        0        0        0        0   
1        0  ...        0        0        0        0        0        0   
2        0  ...        0        0        0        0        0        0   
3        1  ...        0        1        2        0        0        0   
4        0  ...        1        0        0        0        0        1   

   feat_91  feat_92  feat_93   target  
0        0        0        0  Class_1  
1        0        0        0  Class_1  
2        0        0        0  Class_1  
3        0        0        0  Class_1  
4        0        0        0  Class_1  
```
2．デフォルトでモデルを構築する場合
```R:
label='target'
time_limit=600 #秒単位
predictor = TabularPredictor(label=label).fit(train_data, time_limit=time_limit)
```
また、leaderboardで訓練を行った各モデルの性能を確認することができます
```R:
lboard = predictor.leaderboard()
lboard.sort_values(by='score_val', ascending=False)
```
今回はアンサンブルモデルがscore_val=0.8312で一番高いという結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298986/d2c05226-71ec-531a-d14b-5996de89e3c3.png)

３．それではテストデータに対して予測して、5行まで見せます
```R:
pred_test = predictor.predict(test_data, as_pandas=True)
pred_test.head()
```

```:実行結果
0    Class_2
1    Class_6
2    Class_6
3    Class_2
4    Class_9
Name: target, dtype: object
```
## 一番気になった機能
マルチモーダルアンサンブル学習（↓のようにテキストデータや画像データを含めて、複数種類のデータを入力し、統合的にモデル構築する）をやりたい場合、ただfit()関数の中に、hyperparametersを'multimodal'に設定すれば簡単に実現できます。
```R:
predictor = TabularPredictor(label=label).fit(train_data, hyperparameters='multimodal')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298986/61cea44c-8c8f-b261-0e58-748a2e34ac6c.png)


参考になるホームページ
https://aws.amazon.com/cn/blogs/china/machine-learning-with-autogluon-an-open-source-automl-library/
FX業者のスプレッドをインジケーターを使って調査する必要性について

FX業者は自社のスプレッドを公開していたり、比較サイトなどで平均スプレッドを紹介しているが、スプレッドは不定期で変わるため、インジケーターを使って調査するのが良いと思っている。

MT4を使っている業者であれば、[spread_recorder.mq4](http://mt4-traripi.seesaa.net/article/278955530.html)という無料のインジケーターがあるため、調査するのは簡単だ。

特に、DD方式を採用している業者の場合、こっそりスプレッドを広くすることもあり、特に早朝時間や指標発表などのタイミングで広くなるように変更することもある。

比較サイトなどでは平均スプレッドと呼ばれる、1日の平均値を取ったスプレッドを公開しているが、朝スキャEAなどを使っている人は平均スプレッドだけでなく最大スプレッドも考慮する必要がある。

というのは、EAにはMaxSpreadの設定値があるため、それ以上のスプレッドの時にはエントリーしないからだ。

古いEAなどはスプレッドが狭く設定されていることもあり、なかなかエントリーしないこともあると思うが、そのような時は最大スプレッドを調べた後で、MaxSpreadを調整すると良い。

スプレッドは主にMT4時間の0時～1時に広がるため、夜にspread_recorderを設定して、朝に確認すればOKだ。

このような方法で、ぜひスプレッドを調査してみると良いと思う。

弊社でのサイトでは定期的に[海外FXのスプレッド](https://nagoweb.co.jp/kaigaifx/spread/)を調査して公開しているので、ぜひ参考にしてほしい。



スプレッドを調査していくと、GMT+0の業者（ExnessやLANDFXなど）はスプレッドが広がる時間帯が長く、通常は0時～1時くらいでスプレッドがおさまってくるが、この2業者は広い時間帯が長い。

夏時間だと22時30くらいまで広く、GMT+0で言う1時30分くらいまで広がる。

これらスプレッドが広がる時間帯が長い業者はMT4 0時台にエントリーする朝スキャなどは不向きなので注意し、EAがなかなかエントリーしない場合は、業者を変えることもおすすめしたい。
background-imageの表示ラグ問題を（ほぼ）CSSのみで実装するCSS遅延読み込みで解決

:::note info
こちらはZennにて[『background-imageの表示ラグ問題を（ほぼ）CSSのみで実装するCSS遅延読み込みで解決](https://zenn.dev/crayfisher_zari/articles/24273afb875d1d)に投稿した内容と同じです
:::

ベストプラクティスとも限らないですが、プレーンなHTML・CSSサイトでも手軽に実装できる方法を紹介します。

# background-imageの一瞬表示されない問題

 CSSのbackground-imageはその画像が表示されるまで読み込まれません。例えばユーザーのアクションに応じてbackground-imageを変える場合、変更後の画像はユーザーアクションが行われてから初めて読み込まれます。（この読み込みは初回のみ行われるので、2回目以降は発生しません）

[遅延表示のサンプル](https://crayfisher-zari.github.io/css-background-preload/)
 
より具体的な現象としては、独自デザインのラジオボタンやチェックボックスをクリックした時、初回のみ一瞬遅れて表示される、というのがあります。他にも`display: none`で非表示にしている要素を表示させた場合でも同様の表示ラグが発生します。

 ▼初回のみ表示が遅くなっている様子（分かりやすくするためにネットワーク速度を落としています）
![dee66eeec8bf-20220127.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/c3cddcf3-a859-d3a0-57e3-f48ad61988ec.gif)


このラグを解決するために予め画像を読み込んでおく必要があります。ストレートな対応としてはページ読み込み時にそのような画像も読み込んでしまえば解決できますが、表示速度が重視されている昨今では、ページ時読み込み時に使わない画像のロードは避けたいです。

ほかには`rel="preload"`を使って画像を読み込んでおく手法があります

```html
<link rel="preload" href="hoge.png" as="image">
```
これを使えば指定した画像を遅延読み込みしてくれます。遅延読み込みしたい画像が少数なら良いですが、ある程度の規模だとサイト全体で背景画像の数もそれなりの数になり、1つ1つ記述していくのは少し不便[^1]です。

手軽にほぼ[^2]CSSのみでこの一瞬表示されない問題を解決する手法を紹介します。

[^1]: 静的サイトジェネレーターやフレームワークを使えばこの辺は解決できるかもしれませんが、本記事ではスコープ外とします。
[^2]: 微量のインラインJavaScriptが含まれているので純粋にCSSのみではないです。

# background-imageを遅延読み込みさせる
この解決のためにCSSの背景画像を遅延読み込みさせます。HTMLの`<img>`タグには`loading`属性があり、`loading="lazy"`などを指定すれば手軽に遅延読み込みを実装できますが、CSSにはありません。

そこで、次のような遅延読み込みしたい画像用のCSSを作ります。

▼preload.css

```css
html:after {
  content: "";
  background-image: url("https://picsum.photos/id/120/1200/900"),
    url("./images/radio_on_preload.png"),
    ...
}
```

`background-image`プロパティは画像を複数指定できるので、遅延読み込みさせたい画像の分だけ記述していきます。このCSS`<HTML>`タグの疑似要素に背景画像を設定するものですが、サイズがないので実際の表示されることはありませんが、`display:none`や使われていない背景画像と異なり、このCSSが適用されれば画像自体は読み込まれます。

つづいて`<head>`タグ内のCSS読み込みを次のようにします。

```html
<link
  rel="stylesheet"
  href="./preload.css"
  media="print"
  onload="this.media='all'"
/>
```
`media="print"`と`onload="this.media='all'"`が見慣れないかもしれませんが、CSSのレンダリングブロックを回避するテクニックです。

読み込み時は`media="print"`（印刷用CSS）なので読み込まれずスルーされます。インラインJavaScriptで`onload`イベントがあるので、ページ全体の読み込みが終わったら`this.media='all'`が実行されます。つまり、読み込み完了時に`media="print"`から`media="all"`に変化し、この時点で`preload.css`が読み込まれます。

`preload.css`が読み込まれると、先程設定したHTMLの疑似要素にCSSが設定され、画像が読み込まれます。これで画像が読み込まれたので動的な変更時にもラグなく表示されます。

# まとめ
`media="print"`と`this.media='all'`を使ってCSSファイルの遅延読み込みさせる方法で表示ラグを解決する方法を紹介しました。余談ではありますが、この方法はWebフォントを遅延読み込みさせる方法[^3]など、CSSファイルの遅延読み込みとして使えます。初回の一瞬だけのチラツキとはいえ、こうした部分にも配慮があるとよりユーザー体験の良いサイトになるでしょう。

[^3]:[The Fastest Google Fonts – CSS Wizardry – Web Performance Optimisation](https://csswizardry.com/2020/05/the-fastest-google-fonts/#async-css)を参照
AWS-CliをVPS等の別サーバで設定する

あらかじめIAMでコマンドライン用のユーザーを作成。
その際にAccess key IDとSecret access keyが発行されるのでダウンロードして控えておく。

【要注意！】
ここで作成されるAccess key IDとSecret access keyは非常に注意が必要となるものですので、絶対に流出させないようにしてください。
例えば、プログラムのコードにこれをハードコーディングしてgithub等で公開してしまった日には目も当てられないような酷い事態になる可能性があります。
くれぐれも慎重に扱ってください。

$ aws configure
AWS Access Key ID [None]: 控えておいたIDを入力
AWS Secret Access Key [None]: 控えておいたKeyを入力
Default region name [None]: 利用しているリージョンを入力、us-east-2等
Default output format [None]: 特に記入しなくてOK

IAMユーザーの権限でコマンドラインが利用できるようになります。
C# 設定・構成ファイル、Settings.settings

C# の設定ファイル、構成ファイルについて、app.configの\<appSettings>に書く方法は知っていたけれども、最近、Settings.settingsに設定が書いてあるものがあり、これは何だろう？と調べていました。すると、他にもやり方が幾つかあるのを知りました。

この記事が詳しかったです。

https://qiita.com/ko2ic/items/6dd2a57759829a3620f0

# Settings.settings のユーザーごとの設定ファイルの場所
Settings.settingsを使うと、（app.configの\<appSettings>とは違って、）ユーザーごとに設定値を変えることができるのですが（スコープをユーザーにできるという意味）、その設定値を書いたファイルがどこに保存されているのか、当初すぐに分かりませんでした。

複数記事を調べた結果、ここにあることが分かりました。

>C:\Users\<ユーザー名>\AppData\Local\<会社名>\<アプリケーション名>.exe_Url_<ハッシュ値>\<バージョン>\user.config

そして、この\<会社名>というのが、どこにあるのかというと、

プロジェクトを右クリックし、プロパティを選択。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/373809d8-a223-562f-a9ab-54a01d16d881.png)
プロパティ画面の、アプリケーションのアセンブリ情報をクリック。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/8409c892-5ac1-6900-9ed2-328b9106417f.png)
この画面に会社名がありました。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/f6cad107-e395-5e7b-8be0-370631434b5b.png)

## 参考になったサイト
Settings.settingsについて、以下の記事を参考にしました。

https://se-naruhodo.com/paramsettings/

https://qiita.com/tera1707/items/2ebc0e5c48dc5226f60c
Flutter iOSシミュレータが真っ白になった時の対処法 

## 初めに
Flutterで開発している途中でiOSシミュレータの画面が真っ白のままになってしまい、解決に時間をかけてしまったので記録を残しておきます。

## 環境
+ macOS Big Sur（バージョン 11.6）
+ Flutter 3.0.3

## 問題点
Firebaseをアプリに追加して再度 iOSシミュレータをビルドすると成功するがシミュレータの画面が真っ白のままで動かなくなってしまう。
<img width=200, src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609901/b7631860-3827-8c72-3ecd-e4ca6728beba.png">

```
Launching lib/main.dart on iPhone 12 in debug mode...
Running pod install...
Running Xcode build...
Xcode build done.                                           42.5s
```
flutter run を実行するとビルドは成功するためエラーも出ない

## 試したこと
+ iOSシミュレータの再起動
+ Mac 再起動
+ flutter clean
+ Podfile, Podfile.lockの削除

## 解決策
Firebase.initializeApp( ) に以下の内容を追加

```diff_dart:main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
+   options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(const MyApp());
}
```

解決策は非常に簡単でした。
Flutter3.0 へ移行するタイミングで Flutter と Firebase の連携方法にも変更が加えられており、以前は必要なかった上記のコードが必須になっていました。

Flutter3 以前に書かれたドキュメントではこの部分がないものもあるので、参考にする際には多少の注意が必要です。とはいえ公式ドキュメントではこのコードを追加するよう指示されているので、まずは公式ドキュメントに従って進めれば問題ないと思われます。

以上です！

## 参考にしたサイト
https://firebase.google.com/docs/flutter/setup?hl=ja&platform=ios
論理回路と基本回路

コンピュータは```AND```、```OR```、```NOT```などの論理回路の集合体だ。
上の３つの回路を```基本回路```という。

# 論理積回路(AND回路)
入力ABがあり出力Yがある場合はどちらも１でないと出力は１にならない。
## 論理式
```A ・ B ＝ Y```

# 論理和回路(OR回路)
入力ABがあり出力Yがある場合どちらかが１であれば１が出力される。
## 論理式
```A + B = Y```

# 否定回路(NOT回路)
入力Aがあり出力Yがある場合入力の値は反転する。

## 論理式
```オーバーバーA = Y```

# 基本回路を組み合わせた論理回路
基本回路(AND,OR,NOT)では拾いきれない処理がある。
それで代表的な回路が```否定論理積回路(NAND回路)```、```否定論理和回路(NOR回路)```、```排他的論理和回路(EOR回路またはXOR回路)```がある。

## 否定論理積回路(NAND回路)
入力ABがあり出力Yが出力が１の場合反転し０になる。

## 否定論理和回路(NOR回路)
入力ABがあり出力Yが1の場合、反転し、０になる。

## 排他的論理和回路(EOR回路またはXOR回路)
２つの入力が等しい場合は0を、異なっている場合は1を出力
（感謝！）

# 演習
XとYの否定論理積X NAND Yは、NOT(X AND Y)として定義される。X　OR YをNANDだけを使って表した論理式はどれか。
## 気づき
論理回路を手書きで書かず
回答のように選択肢から表を作って確かめていた。
MicroPythonと電子工作

## なぜMicroPythonなのか

こたえ：RaspberryPi Picoは今のところ、MicroPythomでしか動かせないから！

[![Image from Gyazo](https://i.gyazo.com/6523be09fa5c21e1a9514af91ac67a4d.jpg)](https://gyazo.com/6523be09fa5c21e1a9514af91ac67a4d)

---

## RaspberryPiの種類と開発言語

Pico以外はここらへんが詳しい
https://sozorablog.com/raspberrypi-erabikata/

Picoを含めるとここらへん
https://www.ekit-tech.com/?p=769

画像をお借りして、

[![Image from Gyazo](https://i.gyazo.com/34a6c44cec103e7e86308c0b30794ae7.jpg)](https://gyazo.com/34a6c44cec103e7e86308c0b30794ae7)

これプラス、Pico W / Pico WH っていう無線機能が付いたものもそろそろ発売されます（https://raspberry-pi.ksyic.com/news/page/nwp.id/108）

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

技適が通れば発売だそうです

---

### ざっくりと

Raspberry Pi / Raspberry Pi Zero はOSを入れて、開発していく
→ 開発言語を選べる（主にPython）

Raspberry Pi Pico は他のPCと接続して、コードを書き込む必要がある
→ MicroPython

---

### 言語も限定的で、他にもPCが必要だなんて…

Raspberry Pi / Raspberry Pi Zero はちっさいコンピュータのイメージで、接続している電源コードを気軽に抜き差しできない…。
PCも電源コードを直接抜き差ししてないですもんね

そういった点でPicoはバッテリー駆動を気軽に行いやすい（気持ち的にも）
Arduinoに近いです

[![Image from Gyazo](https://i.gyazo.com/401191bbd23c7e257a82e16c9effe446.jpg)](https://gyazo.com/401191bbd23c7e257a82e16c9effe446)

---

### 他にもメリットいっぱい
* OSを入れる手間がない（最初の取っ掛かりとして結構大事）
    * Raspberry PiのOSを入れるのに公式ツールなど出てきましたが、それでも30分以上はかかる
    * OSを入れるSDカードも必要ない
    *  開発方法が決まっていて、シンプルでわかりやすい
* 起動が早い
* OSに余計なリソースを取られないので、数値以上にスペックがある

---

## Raspberry Pi Pico以外のMicroPythonで開発

* ESP8266 / ESP32系
    * 例1:[ESP32-DevKit](https://akizukidenshi.com/catalog/g/gM-15673/)、[やり方](https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/tutorial/intro.html)
    * 例2:[M5StackとVisualStudioで](https://qiita.com/ono-honeycomb/items/91255ab932333bc61c9a)
    [![Image from Gyazo](https://i.gyazo.com/2045b6c5e0e5e85ae6cce6964402107a.jpg)](https://gyazo.com/2045b6c5e0e5e85ae6cce6964402107a)
* [micro:bit](https://makecode.microbit.org/?lang=ja#)
    * エディタも一緒になってる
    [![Image from Gyazo](https://i.gyazo.com/da5ac594ab3a98d506a82f30ff66460c.png)](https://gyazo.com/da5ac594ab3a98d506a82f30ff66460c)
* [The pyboard](https://micropython.org/)
    * MicroPython公式のボードっぽい
    [![Image from Gyazo](https://i.gyazo.com/b6380e66acc40b5c06e0cb0755dcd64a.jpg)](https://gyazo.com/b6380e66acc40b5c06e0cb0755dcd64a)

---

## MicroPythonを書くためのエディタ紹介
* Visual Studio Code
    * [M5Stackの公式から始めたら落とし穴あったので、ここらへんを参考に](https://qiita.com/ono-honeycomb/items/91255ab932333bc61c9a)
* micro:bit
    * 一緒になっている
    * ブロックプログラミングと切り替え
    * エミュレートもついててかなりいい感じ
    [![Image from Gyazo](https://i.gyazo.com/801514f4aa75e03e038d4e2809cfcce8.png)](https://gyazo.com/801514f4aa75e03e038d4e2809cfcce8)
* [Thonny](https://thonny.org/)
    * Raspberry Pi (Zero) から Pico へ書き込むことも想定して作られてる軽量エディタ
    * [始め方参考サイト](https://sanuki-tech.net/and-more/2022/raspberry-pi-pico-l-pika/)
    [![Image from Gyazo](https://i.gyazo.com/ae491c03af9e36f254a5cf58f2eec0fa.png)](https://gyazo.com/ae491c03af9e36f254a5cf58f2eec0fa)
プログラミング学習のモチベーションを上げるにはどうすれば良いのか？ 

モチベーションの根源は「価値の認識」だ。

価値を認識するために「価値についての作文を書いてもらう」という方法が紹介されていた。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/30990156-29d1-caf6-601b-d794e9790f22.png)


モチベーションは直接奮い立たせることは出来ないものだと思っていたが、ひとつの明確な回答がここにあった。

しかも人が教えるのではなく、受け手に自ら考えてアウトプットしてもらう形式。これは理にかなっている。

# 出典

https://www.amazon.co.jp/dp/B07F8KZ8SJ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPの値渡し、参照渡しについて

最近学んだのでまとめます。

## 値渡しとは??
```php
$a = 1;
$b = $a;
echo $b;
// 1
```
僕含め、よく皆さんが使っているであろうデフォルトの変数の代入です。
想定通りの挙動ですね。
内部的には、`$a`の**中にある1という値を複製して**`$b`に渡しています。
文字通り、「値渡し」ですね。

## 参照渡しとは??
```php
$a = 1;
$b = &$a; // &を使うことで、$aを$bに参照渡しできる
$a = 2;
echo $b;
// 2
```
あれ？`$b`には「1が入ってる`$a`」を代入してるから、`$b`をechoしたら1じゃないの??
しかし、2が出力されます。
これは、内部的には「**変数`$a`の場所を`$b`に渡して**」います。
`$a`を`$b`に参照渡しした結果、**`$a`の値を変えると`$b`の値も変わります。**
なので、`$a`、`$b`も2になってしまう仕組みです。

それを踏まえて下記コード。

```php
<?php

$articles = [
    ['name' => 'アイス', 'price' => '100'],
    ['name' => 'ジュース', 'price' => '150'],
    ['name' => '唐揚げ', 'price' => '400'],
];


$object = new stdClass();

$array = [];

foreach ($articles as $article) {
    $object->name = $article['name'];
    $object->price = $article['price'];
    $array[] = $object;
}
var_dump($array);
exit;

```
の結果が下記。

<details>
<summary>実行結果</summary>

```php
array(3) {
  [0]=>
  object(stdClass)#1 (2) {
    ["name"]=>
    string(9) "唐揚げ"
    ["price"]=>
    string(3) "400"
  }
  [1]=>
  object(stdClass)#1 (2) {
    ["name"]=>
    string(9) "唐揚げ"
    ["price"]=>
    string(3) "400"
  }
  [2]=>
  object(stdClass)#1 (2) {
    ["name"]=>
    string(9) "唐揚げ"
    ["price"]=>
    string(3) "400"
  }
}
```
</details>

<details>
<summary>期待値</summary>

```php
array(3) {
  [0]=>
  object(stdClass)#2 (2) {
    ["name"]=>
    string(9) "アイス"
    ["price"]=>
    string(3) "100"
  }
  [1]=>
  object(stdClass)#3 (2) {
    ["name"]=>
    string(12) "ジュース"
    ["price"]=>
    string(3) "150"
  }
  [2]=>
  object(stdClass)#4 (2) {
    ["name"]=>
    string(9) "唐揚げ"
    ["price"]=>
    string(3) "400"
  }
}
```
</details>

```php
    $object->name = $article['name'];
    $object->price = $article['price'];
    $array[] = $object;
```
(@shiracamus様より)
オブジェクトの場合は、オブジェクトへの参照を値（参照値）として変数に保持します。
オブジェクトへの参照値を渡すと「オブジェクト共有」することになります。

で、`$object`の中身を作ったタイミングで `$array[]` に代入しています。
しかし、**オブジェクトへの参照値を渡しているため**、次のループで、**`$array[]`の中の`$object`を書き換えて**しまいます。
つまり、`$array[]` の中の`$object`と、`$object`は一心同体状態になります。
`$object`に変更があったら、`$array[]`内の`$object`にも同じように変更が加わります。

おそらく内部的な挙動はこうです。

1回目のループ
```php
$array = [
(object)['name' => 'アイス', 'price' => '100'],
];
```
2回目のループ
```php
$array = [
(object)['name' => 'ジュース', 'price' => '150'], --> 本来はアイス、100が入るはず
(object)['name' => 'ジュース', 'price' => '150'],
];
```
3回目のループ
```php
$array = [
(object)['name' => '唐揚げ', 'price' => '400'], --> 本来はアイス、100が入るはず
(object)['name' => '唐揚げ', 'price' => '400'], --> 本来はジュース、150が入るはず
(object)['name' => '唐揚げ', 'price' => '400'],
];
```

## 回避策
参照値をそのまま渡すのではなく、参照先のオブジェクトの中身をコピーして渡してあげます。
```php
<?php

$articles = [
    ['name' => 'アイス', 'price' => '100'],
    ['name' => 'ジュース', 'price' => '150'],
    ['name' => '唐揚げ', 'price' => '400'],
];


$object = new stdClass();

$array = [];

foreach ($articles as $article) {
    $object->name = $article['name'];
    $object->price = $article['price'];
    $array[] = clone $object;
}
var_dump($array);
exit;
```
cloneを使うことによって、`$object`の**値だけをコピーして** `$array[]`の中に代入することができます(値渡し)

結果、期待値通りの挙動となります。
WindowsにインストールしたJenkinsでシェルを実行する方法

# はじめに
今まで、LinuxディストリビューションのサーバでしかJenkinsを使っていなかったので、作業用PCでJenkinsからシェルが実行できずに困りました。
現場のメンバーが方法を知っていたので教えてもらいました。
簡単な設定で使えるようになったのですが、意外とはまったので共有します。

# 手順
* Git for Windows をインストールしておく
* Windows環境変数「Path」に以下のパスを追加する
```
C:\Program Files\Git\bin
```

* Jenkinsを再起動
100日後くらいに個人開発するぞ！day056

## 今日は入力データを受け取る処理をしてみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/8686356c-4a07-20c9-a859-165dcec80c15.png)



## 今日の学び


### 繰り返し処理で番号をつける
* each文の処理で値を1増やして更新する繰り返し処理で番号をつける
    * 例
        * `foods = ["パン","ラーメン",...]`
        * `index = 0`
        * `foods.each do |menu|`
        * ` puts "#{index}. #{foods}"`
        * ` index += 1`
        * `end`

### 入力を受け取る
* `変数 = gets.chomp`とすることで、エンターキーを押されるまでに入力された値を変数に代入することができる
    * `puts "メニューを入力してください"`
    * `foods = gets.chomp`
    * `puts "#{foods}を注文します"`
* `gets.chomp`で受け取った値は文字列になるため数値を入力する際は`gets.chomp.to_i`で数値に変換することで計算などに使える
    * `puts "個数を入力してください"`
    * `number = gets.chomp.to_i`
    * `puts "#{number}個を注文します"`
github pagesにReactアプリを公開する


## Reactアプリの作成

```
cd desktop/
npx create-react-app wikiquiz-test --template typescript
cd wikiquiz-test
```

## `gh-pages`をインストール

```
npm install gh-pages --save-dev
```

`package.json`にhomepageを追加する

```json:package.json
{
  ...,
  "scripts": {
    ...,
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  },
  ...,
  "homepage": "https://super-pylori.github.io/wikiquiz-test/"
}
```

## githubで新規リポジトリ作成

新規リポジトリを作成する
作成したらリモートリポジトリを追加する

```
git remote add origin git@github.com:super-pylori/wikiquiz-test.git
git push origin master
```

## デプロイ

```
npm run build
npm run deploy
```

これで[https://super-pylori.github.io/wikiquiz-test/](https://super-pylori.github.io/wikiquiz-test/)が公開される
githubのSettings→PagesでURLとか確認できる

## 参考

[ReactアプリをGitHub Pages(Project Pages)で公開する](https://qiita.com/EisKern/items/15dcf7864fa49df8f247)
JUCEでBinary Builderを使ってwavデータをVSTiに組み込む方法

# はじめに
[前回の記事](https://qiita.com/shoshoi/items/815bc393a4babd968f56)で、JUCEでPCMシンセサイザープラグイン（VSTi）を作る方法を説明しました。
その中で、前回の実装の問題点として、プラグインを使用する際に`.vst3`だけでなくPCMシンセサイザーで再生する`.wav`ファイルについても所定のフォルダに配置しなければならずややこしい点が挙げられました。

使い勝手をよくするために、本記事では`.wav`ファイルを`.vst3`にバイナリとして組み込む方法を紹介します。

[前回の記事](https://qiita.com/shoshoi/items/815bc393a4babd968f56)で作成したアプリをベースに説明します。ソースコードは以下リポジトリにあります。

[リポジトリ](https://github.com/shoshoi/SimpleSampler)


# 前回の実装の確認
以下は前回の実装です。`File* file = new File("file.wav");`でカレントディレクトリから`file.wav`ファイルを読み込み、読み込んだ`file.wav`をシンセサイザーに追加する処理になっています。
```c++:SimpleSynth.cpp
#include "SimpleSynth.h"
#define MAX_VOICES 16

void SimpleSynth::setup() {
	// add voices to our sampler
	for (int i = 0; i < MAX_VOICES; i++) {
		addVoice(new SamplerVoice());
	}

	audioFormatManager.registerBasicFormats();

    // wavデータをファイルから読み込む
	File* file = new File("file.wav");
	ScopedPointer<AudioFormatReader> reader = audioFormatManager.createReaderFor(*file);

	BigInteger allNotes;
	allNotes.setRange(0, 128, true);

	addSound(new SamplerSound("default", *reader, allNotes, 60, 0, 10, 10.0));
}
```
前述した通りこの実装では、プラグインを使用するときの準備として`.vst3`ファイルの配置の他に、シンセサイザーが再生する`.wav`ファイルも適切なパスへ配置する必要があります。`wav`ファイルはホストアプリケーションのカレントディレクトリに配置しなければならずややこしいため、以降ではwavファイルの配置しなくていいよう`.wav`ファイルを`.vst3`にバイナリデータとして組み込む方法を説明します。

# バイナリデータの出力
## Binary Builderの準備
JUCEライブラリについてくるBinary Builderというアプリを使用すると、wavファイルをバイナリデータとしてC++ソースに出力できます。今回はこのBinary Bulderを使用します。Binary Bulderの使い方は@kawakawa_さんの以下の記事で紹介されていますのでご参照ください。

https://qiita.com/kawakawa_/items/d604e50f7ff7f4c3dee5

## バイナリリソースの出力
`WavResource`フォルダにバイナリリソースにしたいwavファイル（今回は`file.wav`ファイル）を配置し、出力先の`OutPut`フォルダを準備してコマンドプロンプトから以下を実行します。
```
BinaryBuilder WavResource OutPut WavResource
```
すると`OutPut`フォルダに`WavResource.cpp`および`WavResource.h`が出力されます。

WavResource.hの中身は以下のような形になっています。
```
/* (Auto-generated binary data file). */

#pragma once

namespace WavResource
{
    extern const char*  file_wav;
    const int           file_wavSize = 353506;

}
```

# 今回の実装
前の項目で出力した`WavResource.cpp`および`WavResource.h`をプロジェクトに読み込みます。
そして、元々wavデータをファイルから読み込んでいた処理を、以下の通り`MemoryInputStream`を使ってバイナリリソースから読み込む処理に変更します。

```c++:SimpleSynth.cpp
#include "SimpleSynth.h"
#define MAX_VOICES 16

void SimpleSynth::setup() {
	// add voices to our sampler
	for (int i = 0; i < MAX_VOICES; i++) {
		addVoice(new SamplerVoice());
	}

	WavAudioFormat wavFormat;

    // wavデータをバイナリリソースから読み込む
	ScopedPointer<AudioFormatReader> audioReader
		= wavFormat.createReaderFor(new MemoryInputStream(WavResource::file_wav,
			WavResource::file_wavSize,
			false),
			true);


	BigInteger allNotes;
	allNotes.setRange(0, 128, true);

	addSound(new SamplerSound("default", *audioReader, allNotes, 60, 0, 0.1, 10.0));
}
```
# おわりに
wavデータをバイナリリソースから読み込めるようになりました。Binary Builderの存在に気づくのに時間がかかりました。。。
今回はwavファイルを読み込みましたが、画像やフォントでも同様のことができるみたいなので、今後のプラグイン開発で使ってみようと思います。
ネスペ試験の勉強振り返り

2022年度のネットワークスペシャリスト試験に合格しました。
自身の振り返りの意味も含めてどのように勉強したかをまとめたいと思います。

## 用意したもの
+ iPad　ノートとして使いました。ある程度画面の大きさがあった方がいいです。
+ GoodNotes5　ノートアプリです。多機能で便利です。
+ 参考書　説明の後に問題がついているものを使いました。一通り流した後は、辞書的な使い方をしました。
+ 問題集　過去門や予想問題です。eラーニング講座を申し込んだので予想問題なども入手出来ました。

## 勉強の前に決めたこと
勉強方法の前に、何をいつするかを決めました。

私の場合、午前Ⅰについては免除だったので午前Ⅱ、午後Ⅰ、午後Ⅱの対策が
必要でした。午前Ⅱは一問一答形式で、過去問を解くだけで6割は行けます。
なので、午後Ⅱはちょうど長い通勤時間があったので、そこに割り当てました。

問題は午後Ⅰと午後Ⅱです。これらは過去問を解くにしても時間がかかります。
午後Ⅱなんて120分想定なので、練習だとしても90分くらいは枠を取らないといけません。
時間が空いたから勉強しよう、なんて気には面倒で中々なれません。

では、どうするか。ルール化するしかありません。
その当時、私は出社とテレワークが半々くらいの割合でしたので、それを踏まえて以下の
ように決めました。

1. 勉強時間を確保出来る時間に起きる。（睡眠時間を確保する為に前日早く寝る）
2. 午前Ⅱ=1ポイント、午後Ⅰ=1ポイント、午後Ⅱ=3ポイントと割り振る。
3. 出社の日は朝一に午後Ⅰを1問解いてから家を出る。テレワークの日は午後Ⅱを解く。
4. 平日は3ポイント以上、休日は5ポイント以上取る。 

出社する日は朝一の午後Ⅰ、通勤中の午前Ⅱで2ポイントなので残り1ポイントを取る必要があります。
そこは臨機応変で朝にもう一問解いてしまうとか、帰宅後に解くとか判断していました。

休日であれば、朝は当然時間があるので午後Ⅱを解きます。後は、残りのポイントを午後Ⅰで稼いだり
していました。

ルールの決め方は人それぞれかと思いますが、大事なのは面倒なことをすることに対して余計な判断を
挟む余地をなるべく作らないことだと思います。

:::note info
そもそも朝に起きられない人も多いかと思いますが、私はiPadのアラームで音楽ではなく、言葉を
再生するようにしたら起きやすくなりました。
（衝撃的な言葉とかを聞くと一気に意識が覚醒することってありますよね）
:::
## 勉強のやり方
私はただ参考書を読み進めていくのが苦手でした。すぐに眠くなります。
なので、参考書を読む⇒過去問や予想問題を解く⇒内容の振り返り、という形で進めました。
問題を解いて、間違ったところや疑問に思ったところを改めて確認する時は、目的が
はっきりしているので眠くなりにくいです。

1. 紙の参考書を読む。
2. 問題をiPadをノート替わりに使って解く。
3. 答え合わせをして、疑問点などをiPadにまとめる。

参考書の内容が終わった後は、2と3を問題毎に繰り返すだけです。やったことを書くとこれだけ
ですが、iPadを使うことで色々とメリットがあります。


**全てのノートをiPadという端末の中に集約出来ます。**
GoodNote5はノート毎にタブがあるので問題を解くノート、勉強用ノートを簡単に行き来出来ます。
しかも、ページはいくらでも追加出来るし途中に差し込むことも出来ます。

**文字検索が出来ます。**
後から見返す時、どこに書いたかが分からなくなることがありました。ですが、GoodNote5は
手書き文字に対応した検索機能があるので、すぐに目的の箇所を探し出せます。

**ネット上の記事を張り付けることが出来ます。**
これが凄く便利でした。ネットワークスペシャリストの勉強をしていると、処理の流れをノートに
まとめたい時があります。そんな時、手書きで一から書いていると汚くなるし、時間がかかります。
ですが、ネット上の記事のスクリーンショットを取って、ノートに張り付ければ時間は大きく短縮
出来るし、綺麗です。しかも、その記事に書き込むことが出来るので、自分として深く理解して
おきたい部分を深堀することも出来るのです。

## 足りていなかったこと
合格できたとは言え、失点した箇所もそれなりにありました。
その理由を自分なりに分析すると大きく2つかと思います。

**技術に対するアンテナが低い**
私はそれまで知らなかった技術に対しての問題に弱い傾向がありました。問題は本文をしっかり読めば
理解出来るように作られている、とは言われていますが先入観や思い込みを持ってしまった上で読むので
前提からズレてしまうことがあったのです。

それに対する対策は、日ごろから情報収集をちゃんとするしかないでしょう。

**振り返りが局所的になっていた**
問題を解くと疑問点が出てきます。それを解明するように取り組んでいましたが、ある技術の一つの
箇所だけ理解出来ればそれでOKになっていたところがあったと思います。
なので、同じ技術でも異なる視点から問われた時に理解不足で失点してしまったのです。

問題で問われたところだけでなく、その背景にある技術の全体を理解するように学びを進める
べきでした。

## まとめ
ネットワークスペシャリストの勉強法についてまとめました。
これは私が行った勉強法でしかありませんが、この記事がこれから勉強する方の助けになれば幸いです。

※こういう勉強法がある、もっと上手く使う方法があるなどの意見があれば教えて頂ければ有難いです。
【C++】基礎を学ぶ⑰～カプセル化～

# カプセル化
知らなくても良いクラスオブジェクト内部の仕組みを**隠すこと**

## なぜカプセル化するか
データの変更をオブジェクト自身に任せることによって、**バグ**を引き起こさせないようにする
**不正なデータ変更**を**禁止**する条件を設定することができる

## カプセル化を用いたプログラム
`private`を使用する
```cpp
#include <iostream>
using namespace std;
 
class Test {
  private:
    int num;
  public:
    void setNum(int x);
};

void Test::setNum(int x) {
  num = x;
  // cout << test.num << endl; ビルドエラーになる
  cout << num << endl;
}

int main() {
  Test test;
  test.setNum(10);
}
```
```
10
```

## getter/setter
`getter`/`setter`とは、メンバ変数に値を**取得**/**設定**するためだけを目的とするメンバ関数のこと

### プログラム
```cpp
#include <iostream>
using namespace std;
 
class Student {
  private:
    int score;
  public:
    void setScore(int x);
    int getScore();
};

void Student::setScore(int x) {
  score = x;
}

int Student::getScore() {
  return score;
}

int main() {
  Student Taro;
  Taro.setScore(90);
  cout << Taro.getScore() << endl;
}
```
```
90
```

## 不正な値の代入を防ぐ
`setter`に不正な値の代入を防ぐようなプログラムを書くことで、**バグ**が起きにくいコードになります

### 負の値が設定されるのを防ぐ`setter`
```cpp
void Student::setScore(int x) {
  if (0 > x) {
    x = 0;
  }
  score = x;
}
```

## 次の記事
[【C++】基礎を学ぶ⑱～コンストラクタ～](https://qiita.com/rapirapi/items/a6d887a239b275fcdea7)
Yolov5の精度を検証する

# トレーニングしたモデルの精度を検証したい

# 方法

以下の記事と同じ形式で、検証データセットを用意します。

https://qiita.com/john-rocky/items/60af264e3e60f2bc0eb7

検証スクリプトを実行します。

```shell
python val.py --weight exp/weights/best.pt --data my_config.yaml
```

**Precision
Recall
mAP@.5 
mAP@.5:.9**
が算出され、ログにグラフが残ります。

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

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
「パスワード確認の入力欄をなくす」という選択肢もあるんですよ

# 「パスワードの確認」への入力がとにかく面倒。

同じパスワードを2回も入力させるやつ。
登録をやめて離脱したくなる。

# どうせ忘れてもリカバリーできる

パスワード再設定ができるでしょ。
2回も入力させるなんて無駄だよ。

# 脳死で「パスワード確認の入力欄」を付けてない？

利便性とそれ以外のトレードオフをちゃんと考慮しているか？


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
基本情報技術者試験 過去問 ビットとバイト 回線利用率の計算

# 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/d87737b9-a91d-8e25-7a3a-bcf0b422dd2d.png)

# 正解

エ 9.6

# 解説



### 転送量

制御情報を加えて1.2Mバイトのデータを10秒ごとに転送するということは、秒間の転送量は0.12Mバイト、ビットに直すと値8倍の0.96Mビットである

## 計算

1秒に10Mビット利用できる回線を、1秒に0.96Mビット利用するので、回線利用率は9.6%

# 自分の答え

1バイトが8ビットだということを覚えていなくて間違った
(4ビットぐらいかと…)


# 公式解説

```
回線利用率は「転送量÷回線速度」で求められます。

[1秒当たりの転送量]
転送するファイルサイズは平均1Mバイトですが、転送の際に転送量の20％の制御情報が付加されるので、実際に転送するデータ量は、

　1Mバイト×1.2＝1.2Mバイト

ファイルの転送は10秒ごとに行われるので、1秒当たりの平均転送量は、

　1.2Mバイト÷10＝0.12Mバイト

[転送速度]
回線の通信速度はビット単位なのでバイト単位に変換してから計算しなければなりません。10Mビット／秒をバイト単位に変換すると、

　10M÷8＝1.25Mバイト／秒

[回線利用率]
0.12Mバイト／秒のデータを1.25Mバイト／秒の回線で転送するので、回線利用率は、

　0.12÷1.25＝0.096＝9.6%

したがって「エ」が正解です。
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
良いUIとはストレスフリーなUIだ。ユーザーの注意力資源を奪うな。

言いたいことは以上。タイトルのとおり。

それ以上でもそれ以下でもない。

# たとえば何故人類は過剰にダイアログを生成してしまうのか

「note」で記事一覧から複数の公開記事を下書きに戻そうとすると、1個の記事ごとに操作を繰り返し、何個ものダイアログを見なければいけない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/e64c32d3-b51d-c076-50fe-72d97a5d68d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/e58660b5-452e-0b10-dc90-84527af323f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/642baed9-207d-926d-63c2-bebdcad61bad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/97bf0acc-70e0-6990-598f-e991888a078d.png)

「下書きに戻すダイアログ」と「下書き戻すのを完了したダイアログ」がある。

何が不要か？ この二つまったくもって不要である。

本来であれば

- 複数記事を同時に下書きに戻せるようにする
- ユーザーへの「操作完了の告知」はダイアログではなく、画面上か下に邪魔にならない形でフラッシュ表示する

というのが良い。

# ユーザーの注意力は有限だ

注意力を奪われたユーザーは、あなたのサービスを嫌うかも知れないし、あなたのサービスで他のことをするエネルギーを奪われるかもしれない。

たとえばnoteで言えば「下書きに戻す処理」でエネルギーを奪われて、新しい記事を書くエネルギーがなくなるかもしれない。

そうでなくても、ユーザーの貴重な注意資源を奪うこと自体が犯罪である。罰せられはしないものの。

# ユーザーが滅多にしない操作は、リッチにしなくても良い？

それは分かる。だけどとにかく、この操作はストレス度が高かった。

悪いユーザー体験であったことは間違いない。

<!-- Update From Qiita API -->

# チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
テイラー展開から数値微分導出までのメモ

# 数値微分のメモ

よく忘れるがたまに使うのでメモ

数式の直感的理解は[Wiki](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B)を参照。nの打ち切りとaの値を設定でき、もとのグラフとテイラー展開で近似した関数の比較ができます。

関数f(x) の x = a でテイラー展開すると、その定義から次のように書ける。

```math
f\left(x\right)=\sum_n^\infty\frac{f^{n}\left(a\right)}{n!}\left(x-a\right)^n=f\left(a\right)+f^\prime\left(a\right)\left(x-a\right)+\frac{f^{\prime\prime}\left(a\right)}{2!}\left(x-a\right)^2+\frac{f^{\prime\prime\prime}\left(a\right)}{3!}\left(x-a\right)^3+...
```

これを式変形すると f'(a) = ... というように式変形すると

```math
f^\prime\left(a\right)=\frac{f\left(x\right)-f\left(a\right)}{\left(x-a\right)}-\frac{1}{\left(x-a\right)}\left\{\frac{f^{\prime\prime}\left(a\right)}{2!}\left(x-a\right)^2+\frac{f^{\prime\prime\prime}\left(a\right)}{3!}\left(x-a\right)^3+...\right\}
```

x-a=⊿ とすると

```math
f^\prime\left(a\right)=\frac{f\left(a+\delta\right)-f\left(a\right)}{\delta}-\left\{\frac{\delta}{2}f^{\prime\prime}\left(a\right)+\frac{\delta^2}{6}f^{\prime\prime\prime}\left(a\right)...\right\}
```

十分に⊿が小さいとし、コンピュータへの計算させやすさから右辺第2項を誤差として扱うと、以下のように書ける

```math
f^\prime\left(a\right)=\frac{f\left(a+\delta\right)-f\left(a\right)}{\delta}-O\left(\delta\right)
```
学生がpaizaラーニング解いてみた01 paizaラーニング「マップの判定・縦横 (paizaランク B 相当)」

## はじめに
2023年卒の学生です.

言語化の練習 & 備忘録として今回からpaizaラーニングの問題をC,C++で解説していきます．
まだまだ拙いと思いますがよろしくお願いします．

## 対象者
この記事は下記のような人を対象にしています。

- C,C++で競技プログラミングpaizaを使っている人
- プログラミング初学者
- 駆け出しエンジニア

## 今回の解説する問題
[マップの判定・縦横 (paizaランク B 相当)](https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss)


## 説明文
マップの行数 H と列数 W とマップを表す H 行 W 列の文字列 S_1 ... S_H が与えられるので、
隣接する上下左右のマスが全て '#' であるマスの y , x 座標 を答えてください。

ただし、左端のマスの場合は「右のマスが '#' 」であれば、右端のマスの場合は「左のマスが '#' 」であれば隣接する左右のマスが全て '#' であるものとします。
また、上端のマスの場合は「下のマスが '#' 」であれば、下端のマスの場合は「上のマスが '#' 」であれば隣接する上下のマスが全て "#" であるものとします。

なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

##### 入力される値
・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)

##### 期待される出力
N (1 ≦ N ≦ H×W) 行の出力
・ 条件を満たすマスの y , x 座標を出力してください。
・ 左上 (y = 0, x = 0) のマスから順に、x 座標 , y 座標の順で増加するように出力してください。詳しくは入出力例を参考にしてください。

##### 条件
すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ H, W ≦ 20
・ S は W 文字の文字列
・ S の各文字は '.' または '#'
・ 条件を満たすマスが少なくとも 1 つ以上存在します

##### 入力例
``` 例1.txt
//入力例
3 3
##.
###
...

//出力例
0 0
0 2
```

``` 例2.txt
//入力例
10 10
##########
..........
##########
##########
..........
#.#.#.#.#.
.#.#.#.#.#
#.#.#.#.#.
.#.#.#.#.#
..........

//出力例
6 0
6 2
6 4
6 6
6 8
7 1
7 3
7 5
7 7
7 9

```

## コード

``` main.cpp
#include <iostream>
using namespace std;
int main(void){
    //縦,横の値入力
    int H,W;
    cin>>H>>W;

    //map入力
    char N[H][W];
    for(int h = 0; h < H; h++){//縦
        for(int w = 0; w< W; w++){//横
            cin>>N[h][w];
        }
    }
    
    for(int h = 0; h < H; h++){//縦
        for(int w = 0; w< W; w++){//横
            //チェック
            if((h <= 0   || N[h-1][w] == '#')//上
             &&(h >= H-1 || N[h+1][w] == '#')//下
             &&(w <= 0   || N[h][w-1] == '#')//左
             &&(w >= W-1 || N[h][w+1] == '#')//右
            ){
                //値出力
                cout<<h<<" "<<w<<endl;
            }
        }
    }
    return 0;
}
```

# おわりに
今回は[マップの判定・縦横 (paizaランク B 相当)](https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss)を解いてみました．
初めての技術ブログで分かりやすいコードを書けてないと思うので
気軽にコメントしてもらえれば随時更新していきますのでよろしくお願いします．
また書いて欲しい問題も随時募集中です．
起動した時点でsignal SIGABRTが出る場合

signal SIGABRTでアプリがクラッシュする場合は、Outlet接続がうまく行っていないせいという記事が多いが
info.plistに正しい記載がない場合にもこのエラーが出る。

例えば、音声録音の機能を持つアプリなのに、info.plistに追記がない場合などは、起動時にこのエラーでクラッシュする
M1 MacでScrapyがImportError: ...mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))となる場合の対処法

Scrapyを使おうとすると一瞬M1では使えないかと思ったが`lxml`をソースからビルドすることで解決した。
(macOS Monterey 12.4, MacBook Pro 2020 M1)

> ImportError: dlopen(/opt/homebrew/lib/python3.10/site-packages/lxml/etree.cpython-310-darwin.so, 0x0002): tried: '/opt/homebrew/lib/python3.10/site-packages/lxml/etree.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))

```sh
$ pip uninstall lxml
$ pip install --no-binary lxml lxml 
```

https://apple.stackexchange.com/questions/436801/m1-mac-mach-o-file-but-is-an-incompatible-architecture-have-x86-64-need-a
【Solargraph】Solargraph用のコンテナを作成する【Docker】

## `Dockerfile`を作成
以下が`Dockerfile`の例です。
```Dockerfile:Dockerfile
FROM ruby:3.1.2

WORKDIR /app
RUN gem install solargraph

EXPOSE 7658
```

## `docker-compose.yml`を作成
`docker-compose.yml`を以下のように作成します。

```docker-compose.yml
solargraph:
    build: .
    command: bundle exec solargraph socket --host=0.0.0.0 --port=7658
    volumes:
      - .:/app
    ports:
      - "7658:7658"
```

`docker-compose.yml`を作成したらコンテナを起動します。

```:ターミナル
$ docker-compose up -d solargraph
```

## 拡張機能をインストール
VSCodeに以下の拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=castwide.solargraph

## 拡張機能の設定
`setting.json`に以下のように記述し、拡張機能の設定をします。

```setting.json
"solargraph.externalServer": {
  "host": "localhost",
  "port": 7658
},
"solargraph.transport": "external"
```
これでVSCodeでsolargraphが使用可能になります。
CRenderTarget::DrawText と CD2DTextLayout::CD2DTextLayout のバグ

１．環境など
Visual Studio 2022/2019/2017（それ以前は未確認）
MFC
マルチバイト文字セット

２．現象
MFC の Direct2D ラッパークラス、CRenderTarget と CD2DTextLayout ですが、マルチバイト文字セットで正しく動きません

３．詳細
MFCの実装ファイル、afxrendertarget.cpp

場所は環境によりますが、わたしの環境では以下のあたり
【Visual Studio 2022】
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\atlmfc\src\mfc
【Visual Studio 2019】
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\src\mfc
【Visual Studio 2017】
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\src\mfc

で確認したところ、CRenderTarget::DrawText では

m_pRenderTarget->DrawText(T2CW(strText), strText.GetLength(), textFormat->m_pTextFormat, &rect, *pForegroundBrush, options, measuringMode);

などとなっています。バッファだけUnicodeへ変換して、文字数は変換前のバイト数を渡しています。なので、全角文字を渡すとUnicode文字数より大きな文字数を渡してしまい、文字化けします。CD2DTextLayoutのコンストラクタも同様です。

４．対策
【CRenderTarget::DrawText】
CHwndRenderTarget の 派生クラスを用意し、同じ DrawText を宣言し、定義部分は afxrendertarget.cpp からコピーしてきて

m_pRenderTarget->DrawText(T2CW(strText), strText.GetLength(), textFormat->m_pTextFormat, &rect, *pForegroundBrush, options, measuringMode);

のところを

CStringW strTextW(strText);
m_pRenderTarget->DrawText(strTextW, strTextW.GetLength(), textFormat->m_pTextFormat, &rect, *pForegroundBrush, options, measuringMode);

と修正し、CHwndRenderTarget の代わりに使います。

【CD2DTextLayout::CD2DTextLayout】
このラッパークラスは使わず
IDWriteFactory* pDWFactory = AfxGetD2DState()->GetWriteFactory();
であれこれします。
herokuへgit pushが500M制限オーバーでエラーになる

# djangoとpytorchを用いた画像認識Webアプリを作成し、herokuへ git pushしたらエラーになり失敗。pushできない

Compiled slug size: xxxM is too large (max is 500M).

容量オーバーのようです。モデルは50MB程度、
何が大きいのか確認すると、
```
Downloading torch-1.11.0-cp39-cp39-manylinux1_x86_64.whl (750.6 MB)
```
Pytorchが750MBもある。
<br>
Pytorchはgpu用がサイズが大きく、cpu用を指定するとサイズ削減できるとのことで

requirements.txt　の　Pytorch部分を修正する。

### 変更前
```requirements.txt
torch==1.11.0
```

### 変更後
```requirements.txt
-f https://download.pytorch.org/whl/torch_stable.html
torch==1.11.0+cpu
```

170MBになり、問題なくherokuにgit　pushもできました。
```
Downloading https://download.pytorch.org/whl/cpu/torch-1.11.0%2Bcpu-cp39-cp39-linux_x86_64.whl (169.2 MB)
```
Go言語でunit testをしたい

# はじめに
最近Go言語を最近初めてTDD的な個人開発を行いたかったので自分用のメモとしてGo言語のunittestの書き方をまとめました。

# Go言語でのunittestの書き方
#### testファイルの作成
まずは、テストしたい関数と同階層に`<ファイル名>_test.go`というファイルを作成しましょう。今回は`Hello.go`をテストする`Hello_test.go`を作成しました。
```
.
├── Hello.go
└── Hello_test.go
```

#### `Hello_test.go`の記述
続いてテストコードを書きましょう。`Hello()`に名前を渡すと`Hello, <名前>!`と帰ってくるプログラムをテストします。
```Hello_test.go
package main

import (
	"testing"
)

func TestHelloName_名前出力のテスト(t *testing.T) {
	name := "abemaru"
	want := "Hello, abemaru"
	msg, err := Hello(name)
	if msg != want || err != nil {
		t.Errorf("Hello(%s) returns error: %v", name, err)
	}
}
```
まずはテストを落とすために何もしない関数を作成します。(テスト失敗後にちゃんと実装しますよ！)
```Hello.go
package main

func Hello(name string) (string, error) {
	return name, nil
}
```
上記の状態でテストを実行します。コマンドは`go test`です。
```terminal
% go test
--- FAIL: TestHelloName_名前出力のテスト (0.00s)
    Hello_test.go:12: Hello(abemaru) returns error: <nil>
FAIL
exit status 1
FAIL   hello  0.377s
```
ちゃんと落ちてくれました。

#### `Hello()`の実装
ちゃんとテストが通るように実装します。
```Hello.go
package main

func Hello(name string) (string, error) {
	return "Hello, " + name, nil
}

```
変更を加えた後にまた`go test`を実行します。

```ターミナル
% go test
PASS
ok     hello  0.353s
```

# おわりに
結構簡単にテストは実装はできそうですね。本来であれば、`name`が空のときのテストもどんどん書いていくべきなのですが、今回はデモなので省略しました。

これで楽しくテストを書きながらプログラムを実装していきましょう。


# 参考
- https://go.dev/doc/tutorial/add-a-test
正規表現サンプル集

正規表現の勉強がてら、見つけ出したい文字列ごとに、正規表現をまとめました。

# 整数（10進数）

- `^\d+$`
    - 整数を検索する最も簡単な正規表現です。なお、`\d`は`[0-9]`と同じです。
- `^[+-]?\d+$`
    - 数字の前に符号がついていてもマッチします。
- `^[+-]?(?:[1-9]\d*|0)$`
    - 001のように数値の前に0がある場合を除外したものです。

# 整数(2進数、8進数、16進数)

- `^[0-9a-fA-F]+$`
    - 16進数です。大文字のみマッチさせるなら`^[0-9A-F]+$`です。
- `^(?:0[xX])[0-9a-fA-F]+$`
    - 接頭辞がついたもののみをマッチさせます。
- `^[+-]?(?:0[xX])?[0-9a-fA-F]+[hH]?$`
    - 16進数全てに対応したもの。
- `^[+-]?(?:(?:0[xX])?[0-9a-fA-F]+|[0-9a-fA-F]+[hH])$`
    - 上記のものだと、16進数の前後に接頭辞と接尾辞の両方がついていてもマッチしてしまうので、それを弾いたものです。
- `^[01]+$`
    - 2進数です。
- `^[0-7]+$`
    - 8進数です。

# 実数
- `^\d+(?:\.\d+)?$`
    - 最も単純な正規表現。
- `^[+-]?(?:\d+\.?\d*|\.\d+)$`
    - 0省略あり、符号があっても判定可。
- `^[+-]?(?:[1-9]\d*|0)(?:\.\d+)?$`
    - 整数部分について数値の前に0がある場合を除外したもの。
- `^[+-]?(?:[1-9]\d*|0)(?:\.\d*[1-9])?$`
    - さらに、小数部分も0で終わることを禁止したもの。

# 実数（指数表記）
- `^[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$`
    - 0省略なし。
- `^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$`
    - 0省略あり。

# 郵便番号
- `^\d{3}-\d{4}$`
    - -の省略を許すなら、`^\d{3}-?\d{4}$`
    - -を書かないなら、`^\d{7}$`

# 携帯電話番号
- `^0[7-9]0(?:-\d{4}){2}$`
    - -の省略を許すなら、`^0[7-9]0(-?)\d{4}\1\d{4}$`

# IPv4
- `^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$`

# 日付
- `^\d{4}([\/-])(?:0[1-9]|1[0-2])\1(?:0[1-9]|[12]\d|3[01])$`
    - yyyy/mm/dd もしくは yyyy-mm-ddの形式。
- `^\d{4}\/(?:0?[1-9]|1[0-2])\/(?:0?[1-9]|[12]\d|3[01])$`
    - 頭の０の省略を許す。（/区切り）
- `^\d{4}\/(?:(?:0[13578]|1[02])\/(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)\/(?:0[1-9]|[12]\d|30)|2\/(?:0[1-9]|[12]\d))$`
    - より厳密に。（yyyy/mm/ddの形式）

# 時間
- `^(?:2[0-3]|[01]\d)(?::(?:[0-5]\d)){2}$`


# 参考
https://qiita.com/BlueSilverCat/items/f35f9b03169d0f70818b

https://www.javadrive.jp/regex-basic/
【Laravel】laravel duskインストール時のエラー解決

# Laravel duskインストール時にエラー発生
公式ドキュメントを見ながらLaravel duskの導入をしていたら、以下のようなエラーが発生しました。
```plaintext
$ sail artisan dusk:install
Dusk scaffolding installed successfully.
Downloading ChromeDriver binaries...

== 略 ==

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:0A000126:SSL routines::unexpected eof while reading
```

実行環境は以下の通りです。
- OS : macOS Monterey
- PHP : 8.1.6
- Laravel : 9.19.0
- Laravel Dusk : 6.24.0
- Laravel Sail : 1.0.1

# PHPとOpenSSLとの互換性の問題
調べてみると、[**IssueHint**](https://issuehint.com/issue/laravel/dusk/979)というサイトにこのように書かれていました。

>このエラーはPHPとOpenSSL 3.0間の互換性が原因で起こります。
>PHP側で修正され、バージョン8.1.7以降で動作するようになります。

なので、PHPのバージョンをアップグレード(ver 8.1.8)して再度実行してみました。
```plaintext
$ sail artisan dusk:install
Dusk scaffolding installed successfully.
Downloading ChromeDriver binaries...
ChromeDriver binaries successfully installed for version 103.0.5060.53.
```
すると今度はうまく行ったみたいです^ ^

## 参考にしたサイト
公式ドキュメント
[https://laravel.com/docs/9.x/dusk(英語)](https://laravel.com/docs/9.x/dusk)
[https://readouble.com/laravel/9.x/ja/dusk.html(日本語)](https://readouble.com/laravel/9.x/ja/dusk.html)

IssueHint
[https://issuehint.com/issue/laravel/dusk/979(英語)](https://issuehint.com/issue/laravel/dusk/979)

# まとめ
この問題は比較的最近起きたものだったようで、また一つ勉強になりました。
今後も問題にぶち当たったら、コツコツ解決と勉強をしていこうと思います。
「愛知県民」なので自動運転に使用されるAI技術についてまとめてみた　③未来の自動運転車・AI技術

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

**愛知県といえばトヨタ、トヨタといえば車、車といえば自動運転**ということで、
ふと自動運転ではどのような技術が使われているのかが気になり、
前回は2022/7/7時点の自動運転・AI技術についてまとめてみました。

https://qiita.com/Aichi_Lover/items/919b02174f2f1a3e68b5

そこで今回は**未来の自動運転車・AI技術についてまとめてみたいと思います♪**
車のIT技術について勉強中の方の参考になれば幸いです。
(*^^)v

# 2.拡張現実型ヘッドアップディスプレイ（AR HUD)

**ヘッドアップディスプレイ(HUD)とは、既に実用化されている技術で、
車速や回転数等の情報をドライバの目線に入りやすい位置に映し出す装置のことです。**

HUBは例えば、日産のスカイラインにて実用化されており、
常に前方を向いたまま、計器類に視線を落とすことなく運転をすることができるため、
安全運転・ドライバの負担軽減に繋がります。

|![1458214.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/a5ef9bc6-0fb8-4b64-f255-3c43835c4170.jpeg)|
|:--|
図：スカイラインのHUB　出典：Response HP https://response.jp/article/2019/09/27/326977.html

**AR(Augmented Reality）表示ができるHUDによってHUDの情報表示エリアを拡大したものが、
拡張現実型ヘッドアップディスプレイ（AR HUD)です。**

AR HUBは現在開発中の技術であり、
車速や回転数等だけでなく、目的地までのルートや歩行者の位置、前走車との距離など
重要な情報を実際の道路上に直接重ねて表示します。

|![imgs_feed_zoom_1680317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/35da93c0-cf34-dac0-76f2-e745d12db47c.jpeg)|
|:--|
図：AR HUDのイメージ画像　出典：goo HP https://autos.goo.ne.jp/news/350500/image.html?news_image_id=1635718

技術課題として、フロントガラスの内側・外側の屈折による二重像の発生、
明るい太陽光の下でも視認性に問題ないよう光源輝度の向上、
その他、消費電力の低減、冷却、搭載性などがあります。

:::note info
光源輝度を向上させるには電力が必要となりますが、EV需要の増加に伴い、消費電力の低減も課題となっています。
:::

AR HUDの実装により、ドライバの状況認識が向上し安全運転に貢献できると考えられています。

# 3.AIアシスタント

Google homeやAlexaなど、最近はAIアシスタントと会話をし、
家電を操作したり情報を検索したりすることが増えてきました。
（ちなみに、我が家には両方あります・・・(笑)）

車内においても、AIアシスタントが実用化されています。

**メルセデス・ベンツの車載AIアシスタントであるMBUX（Mercedes Benz User Experience）は、
音声で音楽の再生や目的地を指定、エアコンの設定変更を行うことができます。**

（参考：MBUX ご利用ガイド　音声認識機能編　https://faq.mercedes-benz.co.jp/usr/file/attachment/Vj9iAotp1o1rDVy2.pdf?attachment_log=1&object_id=8200&object_type=faq&t=raw）


https://www.youtube.com/watch?v=6Tm7Z4fky0w

また、トヨタが現在開発中の車載AIアシスタントYUIは会話に加えて、
乗客の表情や動作から感情や眠気などの状態を推定し、
シートの温度や角度変更・音楽・車内イルミネーション・空調・フレグランスなどの
各種HMI（Human Machine Interface）を用いて働きかけることを目指しています。

|![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/fb37bf44-cb6e-5e28-f8be-ae9f65d3da61.jpeg)|
|:--|
図：YUI搭載の車、LQのイメージ　出典：トヨタHP https://global.toyota/jp/newsroom/corporate/30063094.html

このように、未来のAIはアシスタントの域を超えて同乗するコンパニオンのようになり、
会話をしながら車内をよりパーソナルな心地よい空間へと進化させると考えられています。

また、自動運転も音声で指示することができるようになると考えられています。

例えば、ドライバが急いでいるが、自動運転車はセンサーがブロックされているため追い越し操作を行わないという場面で、
「前方の白い車を追い越したら近道をして」と指示することができるようになります。
(参考：マイナビニュース　https://news.mynavi.jp/techplus/article/20211223-2236326/)

# 4.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今回も色々調べてみて、特に音声アシスタントの部分が興味深かったです。

今後、音声アシスタントは車に不可欠な装備になり、
お友達と会話するような気軽さで、車内環境はもちろん運転まで音声で操作できる日が来る気がしました・・・！

次回も何か気になることがあれば、記事にします♪
(:3_ヽ)_
GitHub ニューバッチQuickdrawについて

# GitHub ニューバッチについて

Quickdrawというバッチが増えたようです。

![quickdraw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60417/0cbdc43b-49f7-910d-3e8b-ea0a6abf556a.png)


取得要件は

Closed within 5 minutes of opening

ということです。


## 簡単に取得するには？

ライセンスをつけたい時にライセンスのプルリクを投げてすぐに自身で承認するのが、一番簡単に取得できると思う。

## スキントーン対応

Settings → Appearance → Emoji skin tone preference で肌の色を設定すると絵文字の（猫？の）肌の色が変わリます。
【Rails】Running via Spring preloader in process...が表示されコマンドが動作しない

# 開発環境
Rails 6.1.4
ruby 2.6.3

# 目次
- 実例
- springとは？
- 対処法

# 実例

`rails g devise:install`コマンドで`devise`をインストールしようとしたところ、
下記コマンドが出てきて正常に動作しない状態になりました。

```ruby:ターミナル
$ rails g devise:install
Running via Spring preloader in process 23800
#中略
Run `rails generate --help` for more options.
```    

# springとは

`spring`とは、アプリケーションをバックグラウンドで実行し続けることで、<br>
開発をスピードアップするRailsアプリケーションプリローダーです。<br>
変更を加えるときにサーバーを再起動する必要をなくしてくれるものだそうです。

といいつつも、プロセスが残っていたりすると今回のような問題が発生します。


# 対処法

まずは、springの状態を確認します。

```ruby:ターミナル
$ spring status
Spring is running:
#以下略
```  

springが起動したまま、プロセスが何かの原因で止まってしまっています。
そのため、springの停止をしてあげます。

```ruby:ターミナル
$ spring stop
Spring stopped.
``` 

再度状態を確認してみましょう。

```ruby:ターミナル
$ spring status
Spring is not running.
``` 

しっかりspringが止まっています。
再度コマンドを実行するとspringも再度実行されます。

私はこの状態で再度`rails g devise:install` を実行したら無事成功しました！


お疲れ様でした！
あくまで備忘録なので足りない説明等多々あるかと思います。
行き詰まった際の助けになれば幸いです。
基本情報技術者－①情報の表現

情報の表現

情報量の単位
→コンピュータ内部では、全ての情報は電気信号の「on」と「off」のように２値であつかわれているため、これを２進数の「１」と「０」に対応させ表現しています。「１」や「０」のように。コンピュータで扱う最小の情報量の単位をビット（bit）といい、２進数１桁の相当します。さらに、８個のビットをひとまとめにしたものをバイト（Byte）といい、２進数８桁にそうとします。１ばいとは８ビット、２バイトは１６ビット～です。バイトは情報量の基本単位となっています。
例えば、「10001111」は１ばいと（８ビット）の情報量であり、このような「１」と「０」の羅列はビットパターンと呼ばれることもあります。

表現可能な情報量
→１ビットで表現可能な情報量は「０」と「１」の２（＝2¹）通り、２ビットでは「00」「01」「1０」「11」の４（＝２²）通り、３ビットでは「000」「001」「010」「011」「100」「101」「110」「111」の8（＝２³）通りです。
一般的に、nビットでは２ⁿ通りの情報を表現することがあります。

大きな数値を表す接頭語
→最近は、コンピュータが扱う情報量は膨大なものになっています。そこで、データ量を表すＢ（バイト）の前に10の整数
乗倍、Ｋ(キロ)、Ｍ(メガ)、Ｇ(ギガ)、Ｔ(テラ)が使われます。例えば、「今月のスマートフォンの通信量が０GB(ギガバイト)」、「ハードディスクの容量は０TB(テラバイト)などのように使われます。
つまり、Ｋ(10³)、Ｍ(10⁶)、Ｇ(10⁹)、Ｔ(10¹²)となります。

小さな数値を表す接頭語
最近は、コンピュータの処理速度が非常に速くなっています。そこで、処理時間を表すＳ(秒)の前に10の整数乗倍を表す接頭語、m(ミリ、10⁻³）、μ(マイクロ⁻⁶)、n(ナノ⁻⁹)、p(ピコ⁻¹²)が使われいます。

指数の公式
データ量や処理時間んを計算するときに役に立つのが、指数の公式です。主な公式をおさらいしておきます。
なお、m、nは、正の整数とします。


文字の表現
コンピュータ内部は０と１の２進数で表現されているにもかかわらず、コンピュータが文字を扱うことができるのは、
文字コードと呼ばれる、文字の一つ一つに０と１の２進数で表現された識別番号を割り振られているからです。
例えば、文字「あ」は、シフトJISコードでは「1000 0010 1010 0000」、Unicode(UTF-8)では「110 0011 1000 0001 1000 0010」の識別番号が割り振れています。
メールなどで「文字化け」という現像が起こることがありますが、これは作成者が使った文字コードとは異なる文字コードを当てはめたことが原因です。
代表的な文字コードには、次のようなものがあります。

ASCllコード
→英数字・記号・制御文字のみ。米国標準符号で最も基本となる文字コード。漢字・仮名の日本語はない。

シフトJISコード
→ASCllコードに、漢字・仮名の日本語を加えたもの。

EUC
→UNIXやLinuxなどで使用される。漢字・仮名も使用できる。

 Unicodo
→世界の文字の多くを一つの体系にしたもの。これを符号化する方式の一つにUTF-8がある。