OmniAICreator/Qiita-1.07M huggingface dataset:
【#49 エンジニア転職学習】VirtualboxでUbuntu22.04の開発環境をつくる

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

簡単なアプリケーション開発を続けていきますが、
その前にLinuxの開発環境を整えようと思います。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
先日は今まで使用していたCentOS7にGoやVSCode等の開発ツールを入れましたが、
Ubuntuも使ってみたいと思い1から作り直しました。
* **VirtualBoxを使用してUbuntu22.04の開発環境構築　←Topics!!**


# VirtualBoxを使用してUbuntu22.04の開発環境構築
導入したツールは先日投稿したCentos7にいれたものと同じです。
**①VirtualBoxにUbuntuを入れて初期状態までいく　②VSCodeでGo Install/Update toolsを導入する　③MySQL設定**
の3点で詰まりそうになりましたので、その点を中心に順番に説明します。
* ホストOS：Windows11
* VMwear　：Oracle VirtualBox 6.1.36
* Linuxディストリビューション　：Ubuntu22.04.1
* IDE　：VSCode
* 他インストールしたツール等：
    * Go言語
    * MySQL8.0
    * Git最新版
    * Google Chrome
### VirtualBoxにUbuntu22.04をインストール
バージョン等は違いますが、基本やることは参考記事の通りです。
その際Ubuntuのインストールと初回起動時のソフトウェアアップデートが非常に時間かかりました。
私のPC環境も原因だと思いますが合わせて2時間弱程でした。

https://qiita.com/HirMtsd/items/225c20b77a7cd5194834

### GoogleChromeをインストール
この際gdebiパッケージマネジャーとwgetをインストールします。

https://ubunlog.com/ja/chrome-algunas-formas-de-instalarlo-en-ubuntu-21-04/

### Go・Git・VSCodeをインストール
基本は1つ目の記事通りに進めました。
Goはaptコマンドで取得すると最新ではないので`wget`と`tar`で取得・解凍します。

https://golangstart.com/golang_start/

VSCodeインストール後、`GO: Install/Update tools`のdelveパッケージを取得する際にエラーが起きました。
gccというC言語コンパイラがないことが原因です。
`sudo apt install gcc`でgccをインストールして、再度`GO: Install/Update tools`インストール実行で成功します。
私はgcc取得が完了せず何度かやり直しました。

https://qiita.com/hskm07/items/dc30f65693fbfa9557f0

### MySQLインストール
インストール自体はaptコマンド一発で終了です。
そのあとのパスワード等を設定する`mysql_secure_installation`を実行する工程で、
セキュリティレベルに対応したパスワードを入力しても全く受け付けてくれず無限ループのような状況になりました。

一旦強制終了して、`sudo mysql -u root`と入力しパスワードなしでmysqlを立ち上げます。
mysql内で、`ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{PASSWORD}';`を
実行してrootユーザーのパスワードを設定します。
再度ターミナルに戻って`mysql_secure_installation`を実行すれば、
問題なく最後まで設定できました。


https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-ja

# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
Twitter でOGP表示するための設定

# 以下の手順になります。
## 最低は以下のタグを設定します。

```html
<meta content="これはOGP" property="og:title">
<meta content="summary_large_image" name="twitter:card">
<meta content="zzzzzzzzzzzzzzz.com/og.png" property="og:image">
<meta content="zzzzzzzzzzzzzzz.com" property="og:url">
```

- `twitter:card` は `summary_large_image` か `summary`か設定できます。
- `og:image`と`og:url`は必ずドメインと含む設定必要です、
```html
NGケース
<meta content="/og.png" property="og:image">

OKケース
<meta content="zzzzzzzzzzzzzzz.com/og.png" property="og:image">
```

- それ以外のタグはありますので、必要の場合設定しても大丈夫です。


## Twitter card validatorを行います
- https://cards-dev.twitter.com/validator

## Twitterで確認して、以上


# Twitterカードは他のカードもあります。
- https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/caed2a1d-d186-af09-290f-5853c1485ae9.png)
Windows10のバッチで外部txtを1行ずつ読み込んでループ（変数に格納など）

# やり方

```bat:batと同じフォルダーにあるtxtを1行ずつ処理するサンプル
rem 遅延環境変数を使う為の宣言
setlocal ENABLEDELAYEDEXPANSION

rem batと同じフォルダーにあるtester.txtの中身を1行ずつ読み込むループ
rem ただし、tester.txtの文字コードはShift-JISにしないと文字化ける
for /f %%a in (tester.txt) do (

	rem variableという名前の変数に1行分を格納
	set variable=%%a

	rem 変数の中身を確認したいので画面出力（遅延環境変数を使った場合は%ではなく!で囲う）
	echo !variable!

)

rem setlocalの終了
endlocal

rem コマンドプロンプト画面閉じずに一旦止める
pause
```

txtの中身。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b5d76327-240f-da38-4e6c-9cb816a3d55a.png)

batの実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ffee6709-e9f8-7903-22ce-21d9e22458f1.png)

読み込んだ1行を変数に格納してうんたらかんたら…
なことが多いから **遅延環境変数** もセットで扱う（覚える）のがポイント。

# 参考サイトさん

https://tooljp.com/bat_qa/ECHO-off-errror-3B28.html

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
React CSSの適用方法をまとめる

React初心者です。自分の理解のためにまとめてみます

* モダンJavaScriptの基本から始めるReact実践の教科書（https://www.sbcr.jp/product/4815610722/）

コンポーネントの定義方法・CSSをモジュール化するか・SCSS記法が使えるかとかで分類できる
### コンポーネントの定義方法による分類
##### 定義したCSSをコンポーネントに適用する
styleやclassなどに装飾を定義して、コンポーネントに割り当てていく方法
* inline styles
* CSS Modules
* Styled JSX
* Emotion
##### コンポーネントごと定義する
* Styled components
* Emotion

### CSSをモジュール化するかしないか
##### モジュール化する(2つにファイルを分ける)
* CSS Modules
##### モジュール化しない(jsxファイルに記述する)
* その他

### 記法による分類
##### SCSS記法が使える
* CSS Modules
* styled components
* Emotion
##### SCSS記法が使えない
* styled JSX
##### JavaScriptのオブジェクトとして書く
* Inline styles
* Emotion
EKSのNodeに割り当てることができるIPアドレスを増やす方法

# なんで増やす必要があるのか
- 安めのインスタンスタイプでNodeを構成する場合、インスタンスに割り当てることができるIPアドレスの上限が少ないため、それにより新規Podを起動することができなくなるから
    - たとえば、t3smallだと11個までしかIPアドレスを持つことができないため、仮にCPUメモリなどのリソースに空きがあったとしても、新規Podの起動ができなくなってしまう


# 手順
- VPC CNIプラグインというものを使って、/28のIPアドレスプレフィックスを割り当てることができる


## 割り当てられるPod数を確認

```
kubectl describe nodes <NodeName>
```

このNodeはt3.smallで起動しており、Capacityが`11`となっており、11台までしかPodの起動ができない。

```
Capacity:
  attachable-volumes-aws-ebs:  25
  cpu:                         2
  ephemeral-storage:           104845292Ki
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      1994624Ki
  pods:                        11   ← 11台まで
Allocatable:
  attachable-volumes-aws-ebs:  25
  cpu:                         1930m
  ephemeral-storage:           95551679124
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      1507200Ki
  pods:                        11
System Info:
  Machine ID:                 ec248b9dac6722fd9acc25fd3f65ca6c
  System UUID:                ec248b9d-ac67-22fd-9acc-25fd3f65ca6c
  Boot ID:                    9010f11a-8230-443d-a92b-8a2833ee65d9
  Kernel Version:             5.4.204-113.362.amzn2.x86_64
  OS Image:                   Amazon Linux 2
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://20.10.13
  Kubelet Version:            v1.22.9-eks-810597c
  Kube-Proxy Version:         v1.22.9-eks-810597c
ProviderID:                   aws:///ap-northeast-1a/i-095d812d190f6d642
Non-terminated Pods:          (11 in total) ← 11/11台このノードでPodが起動しているということ
```

/28 IPv4 アドレスプレフィックスを割り当てる機能を有効化する

```
kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
```

## 設定確認
Podであるaws-nodeはPodにIPを割り当てる仕事をしている

```
kubectl describe -n kube-system pod aws-node-9czrj | grep  ENABLE_PREFIX_DELEGATION 
```


## Nodeを再作成する
managedNodegroupであれば、eksctlで`maxPodsPerNode: 110`を指定する

```
managedNodeGroups:
  - name: t3-small-managed
    instanceType: t3.small
    minSize: 2
    maxSize: 5
    volumeSize: 100
    privateNetworking: true
    maxPodsPerNode: 110 ← コレ
```


## 再作成後はPodのCapacityが増えている

```
Capacity:
  attachable-volumes-aws-ebs:  25
  cpu:                         2
  ephemeral-storage:           104845292Ki
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      1994624Ki
  pods:                        110
```


# 参考
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cni-increase-ip-addresses.html
https://qiita.com/okubot55/items/2c25d75bd72bac629829
Windows10のバッチでコマンドプロンプトを閉じずに一旦止めたい時はpause

# やり方

```bat:変数の中身を確認するサンプル
rem 変数用意
set unko=おえー

rem 変数の中身を確認したいからコマンドプロンプト画面に出力
echo %unko%

rem コマンドプロンプト画面閉じずに一旦止める
pause
```

結果はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/aea028a4-0d0e-d576-0516-4d4d57a3e092.png)


# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
OCI LBとSSLの紐付け

# はじめに

### Certbotのインストール
22年7月現在のOracleLinux8の場合、下記リンクの通りに実施したら出来た

https://unethk.hatenablog.jp/entry/2021/06/14/211624

↑と思ったが上手く起動しない
Docker環境を使えば手軽にCertbot使えると思ったので、Dockerで試すことにする

### Docker経由でのCertbot起動
幸いにもOCIにはCloudShellがあり、そちらの環境ではDockerを起動させることが出来る。
よって特にDocker/Certbot環境を用意すること無く手軽に証明書の作成ができる

```shell
docker run -it certbot/certbot certonly \
  --manual \
  --domain test.domain \
  --email testmail@mailaddress.com \
  --agree-tos \
  --manual-public-ip-logging-ok \
  --preferred-challenges dns
```


### 中身を取り出す

本来であればマシン側にホストをしたいが、権限で取れないため、
一度コンテナ内のファイルを取りに行く

:::note warn
コンテナ内にファイルが格納されているため、
コンテナを削除する前にファイルを拾うなど管理してください
:::

```shell
/etc/letsencrypt/archive/test.domain # ls -l
total 20
-rw-r--r--    1 root     root          1862 Jul 29 22:33 cert1.pem
-rw-r--r--    1 root     root          3749 Jul 29 22:33 chain1.pem
-rw-r--r--    1 root     root          5611 Jul 29 22:33 fullchain1.pem
-rw-------    1 root     root          1704 Jul 29 22:33 privkey1.pem
```


### ロードバランサの作成

#### タイプの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/cac200d9-cf7b-dbea-aab1-2af8424b6647.png)
ロードバランサの作成

#### 詳細の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/e07c82d9-a6e7-a19e-4bcd-de2711a467fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/b57e66e1-a2c8-2a8f-43d4-c9ca379ef525.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/4b70d78e-884c-4ae7-3b78-d6d8fe6a807d.png)

拡張オプション内はデフォルトのままで進める

#### バックエンドの選択
ポリシーを決め、バックエンドにLBの配下にぶら下げたいインスタンスを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/b5e2fe32-f269-5906-0a31-54d6bbe1ed0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/9db0c322-82ff-a608-e1fe-666c7a43bb17.png)


SSLの使用はチェックを入れない

#### リスナーの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/371dbebc-9ed8-6e29-3b6f-c98e5f77028a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/4ebddddf-9896-27ee-11fd-ef8b4e2c05ed.png)

- SSL証明書：cert1.pem
- 秘密キー：privkey1.pem


#### ロギングの管理
必要に応じて選択

### DNSのAレコードでLBとドメインを紐づけ
ドメインでアクセスすると、
もちろんリスナーがhttpsのみしか対応していない場合、パブリックIPでのアクセスはできず、ドメインからのアクセスしか受け付けない形になっている

## httpsリダイレクトしたい場合

こちらの記事が参考になる
https://qiita.com/sugimount/items/6a621682ce30af7611d6

# 参考
https://qiita.com/sugimount/items/3f43c55141252f8f2968

https://qiita.com/sugimount/items/b15fb2a17fd5bb8b3480

https://hawksnowlog.blogspot.com/2021/04/run-certbot-on-docker.html
shell2httpを作ってHTTP経由でお手軽にCLIツールを実行する

[shell2http](https://github.com/msoap/shell2http)をsnapで入れると動かず、[Flask-Shell2HTTP](https://github.com/eshaan7/Flask-Shell2HTTP)はファイルを直接弄らないといけないのでPythonで作ってみました。

https://github.com/GitHub30/shell2http

[![Python](https://img.shields.io/pypi/pyversions/shell2http.svg)](https://badge.fury.io/py/shell2http)[![PyPI](https://badge.fury.io/py/shell2http.svg)](https://badge.fury.io/py/shell2http)
# インストール

```bash
pip install shell2http
```

# 使い方

http://localhost:8080/ をブラウザで開くことでコマンドが実行されます。8080は変更可能です。

```bash
shell2http [options] ["shell command" for /] /path "shell command" /path2 "shell command2" ...
options:
    -p, --port NNNN : port for http server ( default 8080 )
```

# 例

## Windows

`curl localhost:8080`するとシャットダウンできます。 http://localhost:8080/ を開いてもシャットダウンできます。

```powershell
shell2http 'shutdown -s -t 0'
```

`curl localhost:8080/beep`でビープ音が鳴ります。

```powershell
shell2http 'shutdown -s -t 0' /beep 'echo ^G'
```
http://localhost:3306/beep を開くとビープ音が鳴ります。

```powershell
shell2http --port 3306 /beep 'echo ^G'
```

## Linux

`curl localhost:8080`すると通知が届きます。 http://localhost:8080/ を開いても通知が届きます。

```bash
shell2http 'notify-send Hello root'
```

`curl localhost:3000/path`でサウンドが再生されます。

```bash
shell2http -p3000 'notify-send Hello root' /path 'canberra-gtk-play -i desktop-login'
```

```bash
shell2http -p3000 /path 'canberra-gtk-play -i desktop-login'
```

例えば、ポートフォワーディング(UPnP)してプロセスがやられたら、外からデスクトップに音を鳴らしたり通知できます。リクエストのパラメータを使用しないのでosコマンドインジェクションも問題ないと思います。

https://en.wikipedia.org/wiki/Code_injection#Shell_injection

本家の[shell2http](https://github.com/msoap/shell2http)よりも5倍高速で100ms以内に実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/f1e6107b-ff91-0cc1-0aa8-8740d438c966.png)

# 謝辞

https://github.com/msoap/shell2http

https://github.com/eshaan7/Flask-Shell2HTTP
Webエンジニアにおけるタスクの取り組み方

この業界に入り数年が経ち、後輩エンジニアが入ってきて指導する機会も増え、タスクへの取り組み方について伝える機会が増えました。そこで、彼らが入ってくるたびに伝えていたことを整理しようと思います。

# 1. 与えられたタスクの全体感を掴む
　自分が何をやらなければいけないのか、アウトプットはなんなのかということを明確に掴む必要があります。
　この時、木を見て森を見ずにならないようにしなければいけません。言われたことに対してそのまま実施するというのではなく、本当に実現したいことはなんなのかという原点に立ち止まって考える必要があります。時には要求に対して断るケースもあるでしょう。あるいは少し変えた方が良いのではないかという提案をすることもあるでしょう。要求を咀嚼して最適な解を見つけ出す、これが仕事です。
　アウトプットがわかったところで、そのアウトプットを出すために具体的に何をしなければいけないのかを考えます。
# 2. タスクの洗い出し・整理
　実装や現在の仕様を把握して具体的にタスク化していきます。タスクは細かくしようと思えばいくらでも細かくできます。例えばある商品に対してレビュー機能をつけたいとなったときには、テーブルを作る、リレーションをはる、外部キー制約を考える、UIを考える・・・などです。今列挙したものの中では粒度感が違います。粒度感を揃える必要はありませんが、粒度感を把握しておく必要はあります。このタスクは１つのタスクで表現されているが、検討に入っていくとさらに見えていなかったことが見えてきてタスクが増える可能性があるということを把握しておくことは仕事を円滑に進める上で非常に重要なことです。
　こうしてタスクの洗い出しができたら優先順位をつけていきます。これは必ずしも容易ではありません。私の基本方針としては、既に明確になっていることに関しては後に回し、曖昧度が高いものから取り組むようにしています。曖昧度が高いタスクを先に考えることで、最初のうちは全体の進捗は悪くなりますが、後半に行けば行くほど明確なものが増えていくので進捗が良くなったり、タスクを他の人にふることもできるようになります。一方で、曖昧度が高いタスクをやるにあたって、明確なタスクを片付ける必要があれば、それは優先度は高いものとなります。
　実はエンジニアにおいてはタスクを洗い出している中で、あるいは現状を把握している中でほぼやるべき実装が部分的に終わってしまうケースがあります。私は以前転職した直後に任されたタスクで何をやらなければいけないかファイルをいじりながら整理しているうちにほぼ実装が完成していることに気づきました。あとは細かな仕様を取り込むだけで実装の大枠部分は完了していたのです。しかし、社歴が長くなるにつれこの様なケースは無くなっていきました。なぜなら、経験を積めば積むほどいちいちファイルを見なくてもタスクが整理でき、やるべきことが明確になっているからです。慣れていない環境でタスクを早く終わらせたい場合は、ファイルを触ってみる中で実装までやってしまうと良いでしょう。
# 3. 実装
　タスクの洗い出し・整理ができたら実装に進みます。しかし、前述の様に現状を把握していく中で実装がほぼ完成している場合もあり、必ずしも2. タスクの洗い出し・整理から明確に区切りがあるわけではありません。とはいえ、2. タスクの洗い出し・整理では例えば自動テストの実装、細かな設計までは行っていないと思いますので、最後の詳細の詰めは行う必要があります。仕事というものは８割〜９割まではすぐにできるものの、残りの１割に時間がかかるというケースはよくあります。実装フェーズでは、この最後の詰めを意識して行いましょう。
# 4. PR作成
　実装が完了したと思ったら、PullRequestを作成します。この時、とりあえずDraftないしWIP（Work In Progress）でPullRequestを作成すると良いでしょう。実装に複数日かかるケースなどは、日々の進捗をチームに共有するという意味でも、１日の仕事を終える際にはDraftないしWIPでPullRequestを作成する様にしましょう。どんなに途中で整理がついてなくて恥ずかったとしても必ず１日の最後にPullRequestを出す、他のメンバーが見て助けてくれたり、稼働日が違う人（土日や夜間稼働する業務委託の方など）が引き取ってくれたり、チームで開発するにあたって非常に大事なことだと思います。
# 5. セルフレビュー＆修正
　PullRequestを作成したら、すぐにレビュー依頼をかけようとしてはいけません。まずは、PullRequest上でセルフレビューを行いましょう。エディタで見ていた時とは違った気づきを得られることは多々あります。diffもエディタやターミナル上でみるよりも見やすかったり、見える世界が違うことはよくありますので、PullRequest作成したら必ずセルフレビューを行う様にしましょう。セルフレビューで修正すべき箇所が見つかったら修正しましょう。場合によってはPullRequestを出した直後にセルフレビューを行い、一晩寝かせて翌朝再度セルフレビューを行っても良いでしょう。疲れてきている夜に見るのと頭がすっきりしている朝見るのでは同じ一人の人間でも指摘できるレビュー内容が違う場合があります。また、PullRequestをDraftで作成した夜お風呂の中で気づきがあるかもしれません。セルフレビューする時間をずらして一人の人間でも複数の視点で見ることが大切です。
# 6. レビュー依頼＆修正
　PullRequestを作成し、セルフレビューも行った後はようやくチーム内にレビューを依頼します。この時に、PullRequestのDescriptionにはきちんと説明を記載する様にします。昨今ではほとんどのチームではDescriptionのテンプレートが設定されていることでしょう。先輩エンジニアを見ていると必ずしも丁寧にDescriptionを記載していないかもしれませんが、入社まもない場合は丁寧に記載する様に心がけましょう。先輩エンジニアたちはこれまで一緒に働いてきた蓄積があるので、場合によっては詳細を説明せずともPullRequestが取り組もうとした課題およびその解決方法について阿吽の呼吸で把握できたりします。入社まもない場合はその蓄積がありませんので、どういうことを考えてこのPullRequestを作ったのかということをしっかりと伝えていく必要があります。しばらく経てば周りからもこの人はこういう考えをするんだということがわかる様になり、一定の信頼を得られる様になれば仔細にDescriptionを書かなくても伝わる様になります。
Windows10で設定は一通りしたのにまだ勝手にスリープになる時（システム無人スリープタイムアウト設定）

# 概要

下記の設定をしたのに、それでもなお勝手にスリープする時。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/51e5c9c3-ef82-fe77-80f2-2d1bd4c7528b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5fbcd1fc-ff01-5cee-2119-da2fca06a7bc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1e5a0773-c9ab-f99f-efea-438125cfcf9a.png)

# システム無人スリープタイムアウト

**システム無人スリープタイムアウト** なる設定がある。
これは、レジストリーを変更しないと画面に表示されない。

レジストリーエディターで下記へ行く。

```
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\238C9FA8-0AAD-41ED-83F4-97BE242C8F20\7bc4a2f9-d8fc-4469-b07b-33eb785aaca0
```

```Attributes``` を2に設定。
（再起動やログアウト⇒ログインの必要は無し）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e695f5d3-d188-ef28-4500-666eaac2ccc7.png)

すると下記に出てくる。
無効にしたい場合は0分に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6358100c-b939-3219-d546-36c956319cde.png)


# 参考サイトさん

https://mseeeen.msen.jp/avoid-unwelcome-auto-sleep-of-windows/

https://aprico-media.com/posts/7075

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
PythonでGUIアプリを作りたい（Tkinter編）

PythonでGUIアプリを作るにはTkinterを使うと簡単です。
Tkinterが標準モジュールですのでインポートするだけで使用できます。
```python
import tkinter as tk
```
とりあえずウインドウを表示させてみます。
```python
import tkinter as tk

# メインウィンドウの生成
root = tk.Tk()

# メインループ（ウインドウを表示する）
root.mainloop()
```
![tkinter_gui_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782030/a062097b-9800-021c-a53c-2ccb06360688.png)

何も表示されていませんがウインドウが表示されました。

### タイトルバーの表示

```
# ウインドウタイトルの表示
root.title("Sample Code")
```

```
# ウインドウサイズを設定
root.geometry("640x480")
```

```
# ウインドウサイズの変更を禁止
root.resizable(False, False)
```
LPIC Lv1-101 プロセス優先度& ハードリンクとシンボリックリンクについて まとめてみた

# はじめに

LPIC Lv1-101
プロセスの実行優先度の変更について
ハードリンクとシンボリックリンクについて
についてまとめてみた


# 最終更新日

2022年08月19日


# 環境の情報

OS
Ubuntu20.04

# 注意

最新の状態を確認して下さい。


# 公式さま

https://www.lpi.org

# 参考さま

Ping-t
https://mondai.ping-t.com


# プロセスの実行優先度の変更について

# nice値

ナイス値。
プロセスの優先度のこと。
プロセスは、通常nice値0で動く。


# nice

コマンド。
nice値を指定して、コマンドを実行する。


# top
# ps

コマンド。
プロセスのnice値を表示する。

# nice値のデフォルト
0

# nice値を省略して実行した時のnice値
10


# nice値の数値の幅
「-20」から「19」まで。


# 優先度
nice値が低いプロセスほど、優先度が高くなる。
優先度の高いプロセスには、CPUを使う時間が多く割り当てられる。


# renice
コマンド。
すでに起動しているプロセスのnice値を変更する。




# PID
プロセスID 
process ID
識別子。
オペレーティング（OS）が、
今動いているプロセスを識別するために、割り当てる。



# -p
PIDを指定するオプション
PIDのプロセスのnice値を変える。

# ハードリンクとシンボリックリンクについて


# ln
コマンド。
リンクを作る。


# ln -s 
-sはオプション。
シンボリックリンクを作る。



# ハードリンク
ファイルの実体を、直接参照するリンクのこと。
ディレクトリのハードリンクは、作ることが出来ない。


# シンボリックリンク
元のファイルの場所を指し示すリンクのこと。



# inode番号
inode number
アイノード番号。
ファイルやディレクトリの属性情報が書いてあるデータ（inode）に割り当てられる番号。
inode番号は、ファイルシステム毎に別々に管理される為、異なるファイルシステムへハードリンクを作ることが出来ない。同じinode番号でもそれぞれのファイルシステムで違う実体を指すため。



# ls -i
-iは、オプション。
inode番号を確認するため。



# >>
演算子。
ファイルに追記するため。
Linux Debian形式のパッケージdpkg,aptについて（自分用メモ

Debian系ディストリビューションで使用されるパッケージにDebian形式（拡張子はdeb）があります。
Debian形式のパッケージファイル名は以下のような形式。

パッケージ名_バージョン番号-リリース番号_アーキテクチャ名.deb

例）bind9_9.16.4-1_i386.deb

Debian形式のパッケージ管理ツールには以下の2つがあります。

●dpkgツール
Debian系パッケージを管理する基本的なツールです。設定ファイルは「/etc/dpkg/dpkg.cfg」です。
dpkgツールの主なコマンドは以下のとおりです。

●dpkgコマンド
パッケージのインストール・アンインストールなど、基本的なパッケージ管理を行うコマンド（RPM系Linuxでは、rpmがほぼ同等のコマンドにあたる）

dpkg [オプション]　アクション

▲オプション
・-E 同バージョンが既にインストールされていればインストールを行わない
・-G 新バージョンが既にインストールされていればインストールを行わない
・-R ディレクトリを再起的に処理

▲アクション
・-i(—install) パッケージファイル名　パッケージのインストール
・-r(—remove) パッケージ名　設定ファイルを残してパッケージをアンインストール
・-P(—purge) パッケージ名　設定ファイルも含め完全にパッケージをアンインストール
・-l(—list) [検索パターン]　インストール済みパッケージを検索して表示
・-L(—listfiles) パッケージ名　指定したパッケージからインストールされたファイルを一覧表示
・-s(—status) パッケージ名　インストール済みのパッケージの詳細情報の表示
・-S(—search) 検索パターン　指定したファイルがどのパッケージからインストールされたかを表示
・-C(—audit) インストールが完了していない（不完全）パッケージの表示

※「dpkg -S」コマンドはインストール済みのパッケージの情報を検索しますが、apt-fileコマンドではインストールされていないパッケージも検索対象になります。必要なファイルが見つからない時に使用すると便利


■dpkg-reconfigureコマンド
インストール済みのパッケージを再設定するコマンド


●APT(Advanced Package Tool)ツール
APTツールはdpkgツールを拡張したツール群です（※）。インターネット上ないしはメディア上のパッケージ情報のデータベースを使い、依存関係を調整しながらパッケージ管理を行うことができます。パッケージの取得元（リポジトリ）は「/etc/apt/sources.list」ファイルで設定します。
（※）現在はRed Hat系ディストリビューションで使用されるRPM形式のパッケージに対応したバージョンもあります。

●APTツールの主なコマンド。

▲apt-get
パッケージのインストール・アンインストールなどを行うコマンド
（RPM系Linuxでは、yumがほぼ同等のコマンドにあたる）

apt-get [オプション]　サブコマンド

サブコマンド
・install パッケージ名　パッケージのインストール　または　アップグレード
・remove パッケージ名　パッケージのアンインストール
・upgrade インストール済みの前パッケージのアップグレード
・dist-upgrade ディストリビューションを最新版にアップグレード
・update パッケージのデータベー図を最新版に更新
・clean 過去に取得したパッケージファイルを削除

▲apt-cache
パッケージ情報の検索・参照などを行うコマンド

apt-cache サブコマンド

サブコマンド
・search キーワード　キーワードを含むパッケージを検索
・show パッケージ名　指定したパッケージ情報を表示
・showpkg パッケージ名　指定したパッケージの被依存関係を含めた情報を表示
・depends パッケージ名　指定したパッケージが依存しているパッケージの一覧表示

▲apt
apt-getとapt-cacheの機能を統合したコマンド

▲apt-file
特定のファイルが含まれているパッケージを検索するコマンド

書式：apt-file [オプション] アクション

アクション
・update パッケージ情報を最新に更新
・search | find 検索パターン　パスに検索パターンが入っているファイルを含むパッケージを検索
・list | show パッケージ名　パッケージに含まれているファイルを一覧表示


Linuxで使用するパッケージとは、ソフトウェアの実行ファイル、設定ファイル、ライブラリ、マニュアルなどが含まれているファイルのこと。パッケージおよびその管理ツールを使用することによって、ソフトウェアのインストール・アンインストールなどが容易にできるようになります。
学び#2 expressでの静的ファイルの提供方法

app.use(express.static('フォルダ名"));

と記載ことによって、そのフォルダ内の静的コンテンツを提供できる。
なお、このフォルダ名が起点になるので、静的コンテンツを指定する際には、指定したフォルダ(ディレクトリ)にいる前提でコンテンツ名を指定する。

※静的コンテンツとはhtmlファイルや画像などのリクエストの内容の影響を受けないコンテンツのこと

参照元：https://expressjs.com/ja/starter/static-files.html
LibreOffice変換コマンドの深掘り: soffice VS. soffice.bin

## はじめに

LibreOfficeの変換コマンドsofficeを深掘りします。
特に、soffice.binとの関連や違いなど。

## LibreOfficeのsofficeコマンドとは

- LibreOffice
    - オープンソースソフトの統合オフィスソフトウェア
    - [LibreOfficeをインストール](https://qiita.com/mingchun_zhao/items/03ed64c1ae3648c00416#libreoffice%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を合わせてご参照ください

- sofficeコマンド
    - LibreOfficeに内蔵されたドキュメント変換コマンド

## 検証環境

- AlmaLinux 8.6

## sofficeコマンドの他に、soffice.binが存在する?

- sofficeコマンドの配置場所に、soffice.binも存在

```shell
$ ls -l /opt/libreoffice7.3/program/
```

## まず、sofficeコマンドの確認から

- 実体はシェルスクリプト

```
$ file /opt/libreoffice7.3/program/soffice
/opt/libreoffice7.3/program/soffice: POSIX shell script, ASCII text executable
```

### sofficeをデバッグしてみる

`sh -x`コマンドでsofficeシェルスクリプトをデバッグ
すると、sofficeからoosplashが呼び出されていることが判明

```shell
$ sh -x /opt/libreoffice7.3/program/soffice --headless --convert-to pdf test.xlsx
... ...
+ exec /opt/libreoffice7.3/program/oosplash --headless --convert-to pdf test.xlsx
... ...
```

## つぎ、oosplashを確認

oosplashは、アプリケーション起動処理中に画像を表示するSplashと関係するかも。

- 実体は、バイナリの実行ファイル

```shell
$ file /opt/libreoffice7.3/program/oosplash

/opt/libreoffice7.3/program/oosplash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f60aed35eb866e2b73386fcbff8b84e8a58a378e, stripped
```

### straceコマンドでトレース採取

```shell
$ strace -f -o strace_oosplash.log /opt/libreoffice7.3/program/oosplash --headless --convert-to pdf test.xls
```

strace_oosplash.logから、oosplash内部でsoffice.binが呼び出されることが判明

```traceから
...
execve("/opt/libreoffice7.3/program/soffice.bin", ["/opt/libreoffice7.3/program/soffice.bin", "--headless", "--convert-to", "pdf", "test.xlsx"], 0x7ffcc4a53aa8 /* 21 vars */ <unfinished ...>
...
```

## ここまでわかったこと

- soffice -> oosplash -> soffice.bin の順で呼び出される
- 変換は実質soffice.binにより行われる、sofficeはそのラッパーにすぎない

## sofficeとsoffice.binの違いは?

端末A、端末Bから、同時に同じ変換を実施してみる(同じLibreOfficeユーザプロファイルを使用する前提)

### まず、sofficeの挙動を検証

- 端末A

```shell
$ /opt/libreoffice7.3/program/soffice --headless --convert-to pdf test.xls
convert /tmp/test.xls -> /tmp/test.pdf using filter : calc_pdf_Export
Overwriting: /tmp/test.pdf
```

- 端末B

```shell
$ /opt/libreoffice7.3/program/soffice --headless --convert-to pdf test.xls
convert /tmp/test.xls -> /tmp/test.pdf using filter : calc_pdf_Export
Overwriting: /tmp/test.pdf
```

- 結果
    - 端末Aの変換が終わるまで、端末Bは待機(キューイング)
    - 端末Aが終わったら、端末Bの変換がスタートし成功

### つぎ、soffice.binの挙動を検証

- 端末A

```shell
$ /opt/libreoffice7.3/program/soffice.bin --headless --convert-to pdf test.xls
convert /tmp/test.xls -> /tmp/test.pdf using filter : calc_pdf_Export
Overwriting: /tmp/test.pdf
```

- 端末B

```shell
$ /opt/libreoffice7.3/program/soffice.bin --headless --convert-to pdf test.xls
$ echo $?
1
```

- 結果
    - 端末Aの変換が実行中のため、端末Bの変換要求はエラーコード1で失敗(待機しない)
    - 端末Aのみ変換成功、端末Bの変換はなかったことに

## おわりに

sofficeコマンドとsoffice.binコマンドの差異を検証しました。
目的に応じて、使い分けるとよいかもしれません。
IntelliJのIDE上でGitによるバージョン管理の始め方

# アカウントを連携させる
プロジェクトを開いている場合はまず、閉じる
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/daa7f7b4-830c-35db-5872-510f2a474e3b.png)
「カスタマイズ」から、「全ての設定」を開く
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/67371195-4c02-6a64-a4cd-7c880c24ed37.png)
「GitHub」を選択
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e34f27e5-450c-dafb-a473-5b3b974d14dd.png)
アカウントを追加する。Web上で認証が行われる。

# 既存のプロジェクトを追加する
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1066b1cf-592f-f985-f646-35053a5f4759.png)
「VCS」->「Gitリポジトリの作成」を実行

これを実行すると「VCS」から「Git」に表示が変わります。
VCS:Version Control System ということかな？

# 各種用語

### コミット　－＞　新しいバージョンとしてローカル保存
### プッシュ　ー＞　リモートリポジトリ（オンラインファイル）へ保存

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/3bcc72af-efeb-e7f2-ad67-10ea7d079bd7.png)

### チェックアウト
別のブランチへの変更
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e0a376bf-6469-296d-e54c-bda18bb37dcd.png)

### リベース

https://www.sejuku.net/blog/71919#:~:text=4%20%E3%81%BE%E3%81%A8%E3%82%81-,rebase%E3%81%A8%E3%81%AF,%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%80%8D%E3%81%A8%E3%82%82%E8%A8%80%E3%81%88%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82

よくわからない


まだ始めたばかりなので、今後内容を追加していこうと思います。
100日後くらいに個人開発するぞ！day069

## 今日は投稿一覧ページを作成してみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/01209a0d-70fa-f246-dc78-eb94f56d3161.png)


## 今日のアウトプット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/ae1876d3-686f-1272-f6a0-83367654ee1d.png)


## 今日の学び
### データベースと投稿一覧ページ
* データベースとはデータを保存しておく場所のこと
* 投稿一覧ページではデータベースから投稿を取り出し１つずつ表示する
* 一覧ページの作成にはindexというアクション名を使用することが一般的

### コントローラの作成
* 新しくコントローラを作成する際は`rails generate controller コントローラ名 アクション名`というコマンドで作成を実行できる
    * `rails generate controller`は`rails g controller　コントローラ名 アクション名`と省略できる
【JavaScript】関数とスコープ② 〜巻き上げ・クロージャ〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* 巻き上げとは
* 関数における巻き上げの挙動
* クロージャとクロージャ内部の仕組み

# 関数宣言と巻き上げ
* `巻き上げ`とは、宣言部分がもっとも近い関数またはグローバルスコープの先頭に移動しているように見える動作のこと。
* 代表的な例として、`functionキーワードを使用した関数宣言より前に関数を呼び出しをしてもエラーにならない`挙動がある。

```js
// この時点では関数は定義されていないのに関数を呼び出せる
hello(); // => hello

// この位置で関数を定義している
function hello() {
  console.log("hello");
}
```
巻き上げによって以下のように定義されているのと同じ
```js
// グローバルスコープに移動しているかのような挙動となる
function hello() {
  console.log("hello");
}

hello(); // => hello
```

# クロージャ
* 「`静的スコープ`」「`メモリ管理の仕組み`」を利用し、関数内で`外側のスコープにある変数への参照を保持できる`という仕組みのこと。


## 静的スコープ
* JavaScriptのスコープには、`どの識別子がどの変数を参照するかが静的に決定される`という性質がある。
* 以下の例では、下記の流れで静的に参照先が決定される。
    * 関数printStr()の関数スコープには変数strが定義されていない
    * 外側のスコープ(グローバルスコープ)を探す
    * グローバルスコープのstrを参照する(静的に参照が決定する)

```js
const str = "グローバルスコープのstr";

// printStr関数内で定義されたstrは、スコープチェーンの仕組みによりグローバルスコープの変数strを参照する
function printStr() {
  console.log(str);
}

function excePrintStrMethod() {
  // この変数strはprintStr関数から参照されない
  const str = "関数スコープのstr";
  // printStr関数はグローバルスコープの変数strを参照することが決定している(静的スコープ)
  printStr();
}

excePrintStrMethod(); // => グローバルスコープのstr
excePrintStrMethod(); // => グローバルスコープのstr
```

## メモリ管理の仕組み
* プログラミング言語には、使わなくなった変数やデータを`メモリから解放する仕組み`を持っている。
* 言語によっては、`手動でメモリを解放するコード`を書く必要がある。
* JavaScriptでは、自動でメモリを解放してくれる`ガベージコレクション`という仕組みを採用している。

### メモリから不要なデータが解放されるタイミング例
```js
// ①"first comment"という文字列データがメモリ上に確保され、変数strがメモリ上のデータを参照する
let str = "first comment";

// ②再代入により変数strは、"second comment"という文字列データを参照するようになる
str = "second comment";

// ③"first comment"は、どこからも参照されなくなりガベレージコレクションの回収対象になる
// ④任意のタイミングでガベレージコレクションが回収し、メモリから解放される
```

### 関数の実行が終了した際に解放される場合
```js
// 関数内に定義した変数は関数呼び出しのたびに定義され、呼び出し完了時に不要となり解放される
function func() {
  const str = "関数内で定義";
  console.log(str);
}

func(); // => 関数内で定義
```

### 関数の実行が終了しても解放されない場合
```js
// 関数内で定義した変数を返り値としている
function func() {
  const str = "関数内で定義";
  return str;
}

// 関数funcの返り値を変数resultに代入
const result = func();
console.log(result); // => 関数内で定義(変数resultはデータを参照し続けている)
```

### 静的スコープとメモリ管理の仕組みを使用したクロージャの例
```js
const baseCounter = () => {
  let count = 0;
  return function increment() { // *1
    return count = count + 1;
  }
}

// counterAに代入したタイミングでbaseCounter()内の変数や関数が定義される
// counterAは"*1"のincrement()を参照している
// "*1"のincrement()はcountを参照しているため、結果的にcounterAも参照し続けている事になる
const counterA = baseCounter();
console.log(counterA()); // => 1
console.log(counterA()); // => 2
console.log(counterA()); // => 3
console.log(counterA()); // => 4

// counterBに代入したタイミングでbaseCounter()内の変数や関数が新たに定義される
// counterBを呼び出すと、結果は1からとなっており、新たな参照を持っていることが分かる
const counterB = baseCounter();
console.log(counterB()); // => 1
console.log(counterB()); // => 2
console.log(counterB()); // => 3
console.log(counterB()); // => 4

console.log(counterA()); // => 5
console.log(counterA()); // => 6

console.log(counterB()); // => 5
```
【JavaScript】関数とスコープ① 〜スコープ〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# スコープとは
* 変数や関数などを参照できる範囲のこと。
* `スコープ内`、`スコープ外`といった表現を聞くことがある。
* スコープには`関数スコープ`や`ブロックスコープ`がある。

## 関数スコープ
* 関数内で定義された変数は`関数内でのみ参照を可能`とする。
* `関数の外側`から参照しようとすると例外が発生する。
* 関数の`仮引数`についても関数内でのみ参照できる。

```js
const func = arg => {
  const str = `関数スコープの${arg}`;

  // スコープ内なので参照できる 
  console.log(arg); // => 内側
  console.log(str); // => 関数スコープの内側
}
func("内側");

// 関数スコープ内の変数を参照しようとすると例外が発生する
// console.log(str); // => ReferenceError: str is not defined
```
## ブロックスコープ
* ブロック(`{}`)内で定義した変数はブロックスコープ内でのみ参照可能。
* 関数スコープ同様にスコープの外側から参照すると例外が発生する。

```js
// ブロックスコープ
{
  const str = "ブロックスコープ内";
  console.log(str); // => ブロックスコープ内
}

// スコープ外からは参照できない
console.log(str); // => ReferenceError: str is not defined
```

## スコープの使われ所・恩恵
以下のような構文を使用し、知らず知らずのうちにスコープに触れていたり、恩恵を受けているのではないでしょうか。

* 異なるスコープによる同名変数定義
* if文やwhile文
* for文

### 異なるスコープによる同名変数定義
```js
// 同じ変数名は定義できない(letであっても)
const str = "変数に代入";
const str = "変数に代入";
// => SyntaxError: Identifier 'str' has already been declared
```

```js
function hello() {
  const greeting = "Hello";
  console.log(greeting);
}

function goodMorning() {
  const greeting = "Good Morning";
  console.log(greeting);
}

// 関数ごとにスコープが異なるため、同名の変数を定義していても例外が発生しない
hello();       // => Hello
goodMorning(); // => Good Morning
```

### if文やwhile文
```js
// if文とブロックの組み合わせ
if (0 < 1) { // ブロック始め
  const result = "if文のブロックスコープ"
  
  console.log(result); // => if文のブロックスコープ
} // ブロック終わり 

// while文とブロックの組み合わせ
while (true) { // ブロック始め
  const result = "while文のブロックスコープ";
  
  console.log(result); // => while文のブロックスコープ
  break;
} // ブロック終わり
```

### for文
* for文はループの度に`新しいブロックスコープ`を作成している。

```js
// ループごとにブロックスコープが作成されていなければ同名の変数が定義され、2ループ目で例外が発生するはず
for (let i = 0; i < 5; i++) { // ブロック始め
  const str = "for文のブロックスコープ内";
  
  console.log(str); 
} // ブロック終わり

// => for文のブロックスコープ内
// => for文のブロックスコープ内
// => for文のブロックスコープ内
// => for文のブロックスコープ内
// => for文のブロックスコープ内
```

## スコープチェーン
* `内側のスコープ`から`外側のスコープ`に変数等が定義されているか探しに行く仕組み。
* 内側(プログラム的には現在)のスコープに参照対象が存在する場合は、内側を優先的に参照する。
* 最終的に参照対象が存在しない場合は、例外が発生。

```js
// スコープはネストできる(例としてブロックスコープを用いる)
{
  const str = "外側のスコープ";
  const greeting = "hello";
  {
    const greeting = "HELLO";
    
    // 現在のスコープには参照対象の変数が存在しないので、外側のスコープを探す(スコープチェーン)
    console.log(str);       // => 外側のスコープ
    // 現在のスコープを優先
    console.log(greeting);  // => HELLO
  }
}
```

## グローバルスコープ
* 何らかのスコープに所属していない変数などは`グローバルスコープ`に定義されたこととなる。
* グローバルスコープに定義された変数を`グローバル変数`と呼び、どこからでも参照できる。

```js
// グローバルスコープに定義した変数
const str = "グローバル変数";

function scoop() {
  console.log(str);
}

scoop(); // => グローバル変数

// 流れとしては scoop関数内で変数strを探す -> 無いのでスコープチェーン(外側を探す)
// -> グローバルスコープに定義されたstrを参照
```
STM32G031で4ピンから「hello...」をシリアル出力(mbed-os)(HAL)(STM32)(LPUART)



x 過去ログを見よ
x PA_2をOBでGPIOに出来る人むけ
x STM32G031は、秋月で売っているSTM32G031J6M6の事


目的
シリアルのテスト


![o_con653.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bdd559fb-dfb5-118d-bfcf-e2281f8eb211.jpeg)



```c++



//HAL_ds1307_S_SER_031_1

#include "mbed.h"


int main()
{

    UART_HandleTypeDef hlpuart1;

    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
    PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);


    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_LPUART1_CLK_ENABLE();


    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_LPUART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    hlpuart1.Instance = LPUART1;
    hlpuart1.Init.BaudRate = 9600;
    hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
    hlpuart1.Init.StopBits = UART_STOPBITS_1;
    hlpuart1.Init.Parity = UART_PARITY_NONE;
    hlpuart1.Init.Mode = UART_MODE_TX_RX;
    hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;

    HAL_HalfDuplex_Init(&hlpuart1);
    HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8);
    HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8);
    HAL_UARTEx_DisableFifoMode(&hlpuart1);


    while(1) {

        //表示
        //                                       12345678901
        HAL_UART_Transmit(&hlpuart1, (uint8_t *)"hello world", 11, 10);
        HAL_UART_Transmit(&hlpuart1, (uint8_t *)"\r", 1, 10);
        HAL_UART_Transmit(&hlpuart1, (uint8_t *)"\n", 1, 10);

        // 1秒待つ
        HAL_Delay(1000);

    }//while

}//main



```
【JavaScript】文字列③ 〜文字列の取得、検索〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* 指定した文字列の取得、検索方法

# 文字列の一部を取得
以下のメソッドで文字列から一部を取得できる。
* `slice`メソッド
* `substring`メソッド

これらのメソッドを使用する場合、
* 指定するインデックスは`0以上`
* 第二引数を指定する場合は`第一引数の位置 < 第二引数`の位置にする

ことが推奨される(詳細はそれぞれのメソッドの挙動を理解すると分かる)

## sliceメソッド
* 第一引数に開始位置、第二引数に終了位置を指定し、`その範囲を取り出した新しい文字列`を返す。
* 返される文字列には、`第二引数に指定した位置の文字は含まない`ことに留意。
* 位置の引数に`マイナス値`を指定した場合は末尾から検索する。
* 第一引数の位置が第二引数の位置より大きい場合、常に`空の文字列`を返す(開始位置が終了位置よりも前を指定する)。
* 第二引数は省略でき、省略した場合は`文字列の末尾`が終了位置となる。

```js
const str5 = "ABCDE";

// BCを取得してみる
console.log(str5.slice(1, 3));  // => BC

// 末尾から検索する
console.log(str5.slice(-4, 3)); // => BC

// 第二引数を省略
console.log(str5.slice(1));     // => BCDE

// 開始位置が終了位置よりも大きい
console.log(str5.slice(2, 1));  // => ""
```

## substringメソッド
* 基本的に、指定する引数や指定した範囲の新しい文字列が返されるなど`slice`メソッドと同じ。
* 異なる点として、位置にマイナスの値を指定した場合は`常に0`として扱われる。 
* また、第一引数の位置が第二引数の位置より大きい場合、`第一引数と第二引数が入れ替わる`という挙動になる。

```js
const str6 = "ABCDE";

// BCを取得してみる
console.log(str6.substring(1, 3));  // => BC

// マイナス値を指定する(-4は0として扱われる)
console.log(str6.substring(-4, 3)); // => ABC

// 第二引数を省略
console.log(str6.substring(1));     // => BCDE

// 開始位置が終了位置よりも大きい(第一引数が1、第二引数が2と内部的に置き換えられている)
console.log(str6.substring(2, 1));  // => B
```

# 文字列の検索
* 文字列の検索方法として大きく`文字列による検索`、`正規表現による検索`に分類される。
* 取得したい結果ごとにメソッドが用意されている。

## 文字列による検索
* 文字列によるインデックスの取得
* 文字列にマッチした文字列の取得
* 真偽値の取得

### 文字列によるインデックスの取得(`indexOf`、`lastIndexOf`メソッド)
* 指定した文字列で検索し、最初に現れたインデックスを返す。
* 内部的に厳密等価演算子（`===`）で検索する。
* 一致する文字列がない場合は、`-1`を返す。
* `indexOf`は先頭から、`lastIndexOf`は末尾から検索を行う。

```js
const str7 = "ABCDEABCDE";

// 先頭から検索
console.log(str7.indexOf("BC"));      // => 1

// 末尾から検索
console.log(str7.lastIndexOf("BC"));  // => 6

// => 該当する指定文字が複数あっても、それぞれの検索ルートから最初に一致したインデックスを返している
```

### 文字列にマッチした文字列の取得(`indexOf`メソッド)
* 前項の`indexOf`メソッドに直接取得したい文字列を指定する。
* 存在する場合は`インデックス`、存在しない場合は`-1`が返され、判定結果として使用する。

```js
const str8 = "Hello World";

console.log(str8.indexOf("Hello"));  // => 0
console.log(str8.indexOf("Good"));   // => -1

const search = "Hello";

if (str8.indexOf(search) !== -1) {
  // -1 じゃない = いずれかのインデックスが返されている
  console.log(`${search}は含まれています`);
} else {
 console.log(`${search}は含まれていません`); 
}
// => Helloは含まれています
```

### 真偽値の取得
* 検索文字列が先頭に存在するかの真偽値を返す(`startsWith`メソッド)
* 検索文字列が末尾に存在するかの真偽値を返す(`endsWith`メソッド)
* 検索文字列が含まれているかの真偽値を返す(`includes`メソッド)

```js
const str9 = "ABCDEABCDE";

// 検索文字が先頭に存在するか
console.log(str9.startsWith("A")); // => true
console.log(str9.startsWith("C")); // => false

// 検索文字が末尾に存在するか
console.log(str9.endsWith("E"));  // => true
console.log(str9.endsWith("A"));  // => false

// 検索文字が含まれているか
console.log(str9.includes("E"));  // => true
console.log(str9.includes("F"));  // => false
```
N期連続で値が上昇/下降したら安定フラグを作成する(SPSS Modeler データ加工逆引き4-10)

# N期連続で値が上昇/下降したら安定フラグを作成する(ステート型)

![スクリーンショット 2022-08-02 8.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4b1200a9-651d-620d-0658-ca68be8154f8.png)

## 1.想定される利用目的

・顧客の特定行動から特徴量を作成する
・設備ログから特定イベントの有無を特徴量にする

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/stable.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-02 8.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1f66092c-aa32-8c33-2237-3c3fb9f3bfdd.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-08-02 8.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bc8e034b-14e4-dd3b-b796-feca10d0bab0.png)
＊反転フラグは逆引き4-9で作成手順を解説しています。

b.[フィールド作成]ノードを編集します。[派生]モードを[ステート型]にします。フラグが立つ[オン]の条件は3期連続の上昇または下降です。値の1行上から当該行の差は[@&#xFFF0;OFFSET(value,1)-value]で表すことができるので3行前から2行前、2行前から1行前と順番に差が連続でプラスかマイナスになる条件を定義します。@&#xFFF0;OFFSET(列,1)は列の1行上を参照する関数です。反転はリセット条件にしています。
![スクリーンショット 2022-08-02 8.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d8420bd8-7056-11cb-c6c9-fedb253f2a95.png)

式ビルダーから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-08-02 8.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/90aae0bf-4e7f-a08d-c8cb-eeab5adaf1b5.png)

[プレビュー]します。
![スクリーンショット 2022-08-02 8.35.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fe1f25c7-6979-64ff-f7f1-e3d9573e8e25.png)

d.[散布図]ノードを[実行]します。
![スクリーンショット 2022-08-02 8.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b272124b-5575-d415-346f-f810b5c5f343.png)


#### 注意点
反転をリセット条件にしましたが、ID（設備や顧客）を連続して記述しているデータではIDの切り替えをリセット条件にすることが多いはずです。

## 4.参考情報

#### IoTデータを扱った記事

https://qiita.com/kawada2017/items/1385a5d4a83154792c12

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【JavaScript】文字列② 〜文字列の分解・結合、比較〜

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* 文字列の分解、結合方法
* 文字列の長さを取得する方法
* 文字列の比較方法

# 文字列を配列へ分解(split)
* 第一引数に文字列の区切り文字を指定し、分解した配列を返す。
* 第一引数には正規表現も指定できる。

```js
const str1 = "A!B!C";

console.log(str1.split("!")); // => [ 'A', 'B', 'C' ]
```

# 配列の要素を結合して文字列にする(join)
* 第一引数に区切り文字を指定し、その区切り文字で結合した文字列を返す。

```js
const array = ["A", "B", "C"];

console.log(array.join("!")); // => A!B!C
```

# 文字列の長さ
* Stringの`length`プロパティは文字列の長さを返す。
* 長さの実態はCodeUnit(`Unicodeにおける1文字を表すのに使う最小限のビットの組み合わせ`)の数

```js
const str1 = "ABCDE";
console.log(str1.length); // => 5(正確には5文字ではなく、CodeUnitが5つという評価をしている)
```

# 文字列の比較
* 厳密等価演算子(`===`)を用いて、同一かどうか比較を行う。
* 大小の関係演算子(`>`、`<`、`>=`、`<=`)でも比較を行える。
* これらは内部的に文字列の`CodeUnitの数、並び順`が同じかで比較している。

```js
const str2 = "A";
const str3 = "A";

// 文字列を比較
console.log(str2 === str3);

// 上記の例は、内部的にCodeUnit("A" = 65)同士を比較している
console.log(str2.charCodeAt(0)); // => 65("A"のCodeUnit);
console.log(str2.charCodeAt(0) === str3.charCodeAt(0));

const str4 = "B";
console.log(str4.charCodeAt(0)); // => 66("B"のCodeUnit);

// 内部的に"A"のCodeUnit(65)、"BのCodeUnit(66)"で比較を行う
console.log(str3.charCodeAt(0) === str4.charCodeAt(0)); // => false 
console.log(str3.charCodeAt(0) > str4.charCodeAt(0));   // => false
console.log(str3.charCodeAt(0) < str4.charCodeAt(0));   // => true
console.log(str3.charCodeAt(0) >= str4.charCodeAt(0));  // => false
console.log(str3.charCodeAt(0) <= str4.charCodeAt(0));  // => true
```
html table要素

table
→表要素、枠を作る。
td
→表データセル要素
tr
→表の行要素
th
→表のヘッダー部分
tbody
→テーブル本体要素
tfoot
→表フッター要素
thead
→表ヘッダー要素

rowspanとcolspan:
何行（列）使うかどうか。
th rowspan="2" 
→表２行分使う
th colspan="2"
→表2列分使う

scope:
thにscopeをつけると、thがカバーするセルの範囲を指定します。
th scope="col"なら列方向のセルを対象にする。
【JavaScript】プロトタイプオブジェクト

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載していく。

「[【JavaScript】JavaScript入門一覧](https://qiita.com/andota05/items/22fae452225b785fd405)」に他の記事をまとめています。

# この記事で理解できること
* プロトタイプオブジェクト(Object.prototypeプロパティで定義されたオブジェクト)とは
* Objectの継承
* プロトタイプメソッドとインスタンスメソッドの優先度

# Objectはすべての元
* `Object(クラス)`は、全てのオブジェクトの元である。
* `Array`オブジェクトや`String`オブジェクトなどは、この`Object`を継承している。*1

> *1 「ArrayオブジェクトやStringオブジェクトなどは、このObjectを継承している。」とは、
> 正確にはObject.prototypeプロパティで定義された、`prototype`オブジェクトを継承している。
> (Array、Stringオブジェクトなどを`子`と捉えた場合、Objectが`親`のような存在)

# 「定義していないメソッドが使える。 なぜ？」
下記、例のように、あるオブジェクトを作成し、自ら定義していない`toStringメソッド`を呼び出してみる。
すると、定義していないはずなのに、`呼び出し・処理`が正しく実行される。

> **メモ**：toStringメソッドは、オブジェクトを表す文字列を返すメソッド
> MDN『[Object.prototype.toString()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString)』

```js
// 数値を値として持つプロパティnumのみを定義したオブジェクトを作成
const obj = { num: 123 };

// numプロパティの値の型を調べる
console.log(typeof obj.num);            // => number

// numプロパティの値をtoStringメソッドで文字列に変換し、型を調べる
console.log(typeof obj.num.toString()); // => string
```
この自ら定義していない`toStringメソッド`が使用できる理由として、
* オブジェクト(今回の例では作成した`obj`)の継承元である`Object(prototypeオブジェクト)`で定義されているからである。
* また、その結果、あるオブジェクトを`作成した時点`でObjectを継承している(Objectはすべての元)ということも分かる。

# (Object.prototype)prototypeオブジェクト
* `Object.prototype`プロパティに定義された、全てのオブジェクト作成時に`自動的に追加される`特殊なオブジェクト。
* `prototype`オブジェクトに組み込まれているメソッドは`プロトタイプメソッド`と呼ばれる。
* Objectを継承した任意のオブジェクトから`プロトタイプメソッド`が参照できる仕組みを`プロトタイプチェーン`と呼ぶ。

```js
// prototypeプロパティを確認してみる
console.dir(Object.prototype)

// => constructor: ƒ Object()
// => propertyIsEnumerable: ƒ propertyIsEnumerable()
// => toString: ƒ toString()　★★先ほど使用したtoStringメソッドも存在する★★
// ...etc
```

# プロトタイプメソッドとインスタンスメソッドの優先度
* プロトタイプメソッドと`同名のメソッドが定義されている場合`、インスタンス(が持つ)メソッドの呼び出しが優先される。
(ここでの「インスタンス」は、下記例で作成しているオブジェクト「instance1」「instance2」を指す)

```js
const instance1 = {
  name: "instance1"
}

const instance2 = {
  name: "instance2",
  // プロトタイプメソッドと同名のメソッドをオブジェクトで定義(インスタンスメソッド)
  toString: () => {
    return "インスタンスメソッド";
  }
}

// toStringメソッドを持っているか確認するための関数を別途定義
function hasToString(obj) {
  if (typeof obj.toString()) {
    return `${obj.name}にtoStringは存在します`;
  } else {
    return "toStringは存在しません";
  } 
}

// 各オブジェクトはtoStringメソッドを持っている
console.log(hasToString(instance1)); // => instance1にtoStringは存在します
console.log(hasToString(instance2)); // => instance2にtoStringは存在します

// じゃあtoStringメソッドを実行してみよう
console.log(instance1.toString());   // => [object Object]
console.log(instance2.toString());   // => インスタンスメソッド(※インスタンスメソッドが優先されている)
```

# (参考)Object.prototypeを継承しないオブジェクト
* `Object.create(null)`でオブジェクトを作成すると、<br>プロパティやメソッドを持たない(Object.prototypeを継承しない)空のオブジェクトを作成できる。

`ES2015`から追加された`Mapオブジェクト`の代わりとして利用されていたようです。

```js
const obj = Object.create(null);

if (typeof obj.toString()) {
  console.log("toStringが存在します");
}
// => TypeError: obj.toString is not a function(存在していない!!)
```
STM32G031とDS1307で時計プログラム(ソフトウェアシリアル出力100bps)(HAL)


STM32G031とDS1307で時計プログラム(ソフトウェアシリアル出力100bps)

x 過去ログを見よ
x PA_0をOBでGPIOに出来る人むけ
x STM32G031は、秋月で売っているSTM32G031J6M6の事

目的
秋月のDS1307ZN+T&R I-06950


![o_con651.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c539b5d5-5284-a5bd-c7f5-e5cb52bf1888.jpeg)


![o_con652.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7ff96be5-b9ee-8776-755d-1fab4693d177.jpeg)



```c++



//HAL_ds1307_S_SER_031_1

#include "mbed.h"


#define  TX_1()      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET)
#define  TX_0()      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET)

//仮想シリアルへの一文字出力 1000bps
// 10 100bps
//  5
//  2
//  1 1000bps
int pc_putc(char ch)
{
    TX_1();
    TX_0();//Start
    HAL_Delay(9);

    for(int ii=0; ii<8; ii++) { //Data x 8
        if(   ((ch>>ii)&1) == 0 ){TX_0();} else {TX_1();}
        HAL_Delay(9);
    }; //for

    TX_1();//Stop
    HAL_Delay(9);

    return(0);
} //pc_putc


int main() {

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    __HAL_RCC_I2C2_CLK_ENABLE();

    I2C_HandleTypeDef hi2c2;

    hi2c2.Instance = I2C2;
    hi2c2.Init.Timing = 0x10707DBC;
    hi2c2.Init.OwnAddress1 = 0;
    hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c2.Init.OwnAddress2 = 0;
    hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
    hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c2);    

    HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE);

    HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0);


    uint8_t data_read[7]; //リードバッファー
    uint8_t n1_8[8]; //バッファー

    while(1) {

//data_read[2] = 0x12;
//data_read[1] = 0x32;
//data_read[0] = 0x45;

        //時間の読み込み
        HAL_I2C_Master_Transmit(&hi2c2, (0xD0)     , (uint8_t*)"\000", 1, 3000);        
        HAL_I2C_Master_Receive( &hi2c2, (0xD0) | 1 , data_read,        7, 3000);

        //温度の表示
        pc_putc( '0'+(data_read[2] >> 4)  );
        pc_putc( '0'+(data_read[2] & 0xf) );
        pc_putc( '.' );
        pc_putc( '0'+(data_read[1] >> 4)  );
        pc_putc( '0'+(data_read[1] & 0xf) );
        pc_putc( '.' );
        pc_putc( '0'+(data_read[0] >> 4)  );
        pc_putc( '0'+(data_read[0] & 0xf) );
        pc_putc('\r');
        pc_putc('\n');

        // 1秒待つ
        HAL_Delay(10);
  
    }//while

}//main




```
Python3エンジニア認定データ分析模試試験3回目　-間違えた問題-

<H1>獲得点数　600/1000点</H1>
<H2>正答率: 60.0 % ( 24問 / 40問 正解 )</H2>

```python
ランダムフォレストについて説明している以下の文章のうち、正しい選択肢を選べ
A,他の機械学習アルゴリズムと比較すると、欠損値の穴埋めや標準化などのデータの前処理を必要としないアルゴリズムである。
```
:::note info
ランダムフォレストは複数の学習器を用いていることから、
アンサンブル学習や集団学習ともいわれています。
近接代入を使用して欠落しているデータの置換をすることで、
欠損値の推定分析結果の精度を安定させることができます。
また, 単体での分析と比較して、過学習を抑えることができる特徴を持っています。
:::

```python
Anacondaで特定のライブラリ(XXXX)のバージョンを更新する際に使用するコマンドとして正しいものを選べ

A,conda update XXXX
```


```python
R言語について説明している以下の文章のうち、正しいものを選べ

A,RにはC++を使うためのパッケージが存在し、高速化をする際によく用いられる

```

```python
enjoyという出力を返すように、XXXXに当てはまるものとして正しいものを選べ
import re

pattern = r"enjoy"
text = "enjoy data science"
matchOB = re.match(pattern , text)
if matchOB:
    print(matchOB.XXXX)

A,group()

```

```python
連続的な値を確率変数として考えることができる分布として正しいものを選べ

A,正規分布
```

```python
以下のコードを実行した場合の出力として正しいものを選べ。
import numpy as np

A = np.array([[1,2,3],[4,5,6]])
B = A[0,:]
A[0,:]=0
B

A,array([0, 0, 0])

```

```python
以下のコードを実行すると、変数A, B, C, Dには１つだけ異なるデータが格納される（4つのうち3つは同じデータが格納される）。格納されているデータが他の変数と異なる変数を選べ。

import numpy as np

A = np.full(10, 10.0)
B = np.array([10])*10 #array([100])
C = np.zeros(10)+10
D = np.ones(10)*10

A,B
```

```python
以下のような日付、日経平均の株価の始値、終値が格納されたpandasデータフレームdfがある。このデータフレームのカラムの型を確認するためのメソッドとして正しいものを選べ

A,df.dtypes
```

```python
以下のような、pandasデータフレームAとpandasデータフレームBがある。この２つのデータフレームの日付が一致する部分のみを列方向に結合したデータフレームを作成するコードとして正しいものを選べ

A,
pd.merge(A, B, how=”inner”, on=”日付”)

```

```python
以下のような、ユーザーごとのサービス利用状況が格納されたデータフレームdfがある。
性別ごとの人数を棒グラフで表示するためのコードとして正しいものを選べ

A,
import matplotlib.pyplot as plt 

df["性別"].value_counts().plot.bar()
plt.show()

```



```python
以下のような、ユーザーごとのサービス利用状況が格納されたデータフレームdfがある。
性別ごとの利用回数のヒストグラムを別々に（※）描画するコードとして正しいものを選べ

※１つのグラフ内ではなく、男性のヒストグラム、女性のヒストグラムをそれぞれ別のグラフオブジェクトとして描画するという意味です

A,
df["利用回数"].hist(by=df["性別"])
plt.show()
```

```python
サポートベクターマシンについて説明している以下の文章のうち正しいものを選べ

A,scikit-learnで使用する場合、カーネルはガウスカーネル以外にも指定することができる
```

```python
scikit-learnで学習した決定木を可視化する際に使用するライブラリとして正しいものを以下の中から選べ

A,pydotplus
```
3層スキーマ＜基本情報技術者試験＞

スキーマとは、概要といった意味を持つ言葉で、<b>データベースの構造や仕様を定義</b>するものです。
標準的に使用されている規格（ANSI/X3/SPARC）では、3層スキーマ構造をとっています。
3層スキーマとは、外部スキーマ、概念スキーマ、内部スキーマという3層に定義を分けることで、データの独立性を高めています。
つまり、3層スキーマとは、見た目（外部スキーマ）、データ構造（概念スキーマ）、物理的構造（内部スキーマ）に分けて、<b>データの独立性を向上させることが目的</b>となっています。
この論点が、基本情報技術者試験でも問われています（午前試験<現行の形式>）。

基本情報で問われた問題を、要約すると、3層スキーマアーキテクチャを採用する目的は何か？という問題です（<b>H27春期、問26</b>）。
解答の選択肢だけ述べると、
データの物理的な格納構造を変更しても、アプリケーションプログラムに影響が及ばないようにする。
です。