OmniAICreator/Qiita-1.07M huggingface dataset:
古いPC(Win 7)でSalesforce DXの環境設定する2

さっそく、次のプロジェクトに掛かりましょう。

#[開発ツールのインストール](https://trailhead.salesforce.com/ja/content/learn/projects/set-up-your-lightning-web-components-developer-tools/install-development-tools?trail_id=migrate-from-aura-to-lightning-web-components)

苦労して設定した古いNodeがあるので、ここではupdateは飛ばします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fa5ee7b4-e44f-8ea4-7427-0c5530a993cc.png)

次の Visual Studio Codeもインストールしたので飛ばしましょう。

#[Lightning Web コンポーネントを作成する](https://trailhead.salesforce.com/ja/content/learn/projects/set-up-your-lightning-web-components-developer-tools/create-a-lightning-web-component)

無事追加

# [コードの分析と組織へのリリース](https://trailhead.salesforce.com/ja/content/learn/projects/set-up-your-lightning-web-components-developer-tools/analyze-your-code-and-deploy-it-to-your-org)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f6f548bf-0be4-b7c0-4d06-bb4588a43fc7.png)
これはどこ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b4e940e6-fd4f-6856-4775-9dca7cb9b76f.png)
この部分に入力する見たい。

あっ、エラーだ。

```
Error  force-app\main\default\lwc\myFirstWebComponent\myFirstWebComponent.js  
bad result: TypeError: Cannot read property 'parent' of undefined    
at prune (/home/sfdc/tools/lwc/2.2.9-234.6/node_modules/@lwc-platform/sfdc-lwc-metadata/dist/template/transform/binding.js:112:17)    
at getPrunedPath (/home/sfdc/tools/lwc/2.2.9-234.6/node_modules/@lwc-platform/sfdc-lwc-metadata/dist/template/transform/binding.js:122:12)    
at /home/sfdc/tools/lwc/2.2.9-234.6/node_modules/@lwc-platform/sfdc-lwc-metadata/dist/template/transform/binding.js:196:28    
at Array.forEach (<anonymous>)    
at Object.transform (/home/sfdc/tools/lwc/2.2.9-234.6/node_modules/@lwc-platform/sfdc-lwc-metadata/dist/template/transform/binding.js:194:14)    
at Object.collectMetadata (/home/sfdc/tools/lwc/2.2.9-234.6/node_modules/@lwc-platform/sfdc-lwc-meta
```

```
コピーする時に<template> を消してしまったようです。
```

[「force：source：push」のプッシュ失敗](https://salesforce.stackexchange.com/questions/313347/push-fail-for-forcesourcepush)

最後の確認ですが、今までのプレイグランドと、スクラッチ組織のプレイグランドの２つが起動していますが、そのまま確認しても問題なかった。


考えたらwin7環境でJavaのランタイムをインストールしていないので、エラーチェックは機能してないですね。
やっぱりインストールした方がよさそうだけど... 32ビット版が探せない...

# Javaのインストール

一応32ビット版 Zipファイル版
https://www.azul.com/downloads/?version=java-11-lts&os=windows&architecture=x86-32-bit&package=jdk

これを展開してC:\Program Files\Javaのフォルダーにコピーします。


環境変数名は「JAVA_HOME」
https://support.blancco.com/pages/viewpage.action?pageId=26215477

機能している感じです。今まではカーソルをもっていっても無反応でしたが、ちゃんと説明がでる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d8a174d4-bad9-8d2f-0b7f-002d92cbfa41.png)
【MySQL超入門】データベース・テーブル作成・CRUD

#はじめに
最近プログラミングの勉強を始めた初心者です。:baby:
MySQLのデータベースの操作を行っている際、SQL文をたまに忘れてしまうことがあるので、
**データベース・テーブルの作成**・**CRUD**のSQL文をここにまとめてみました。

記事に関して、間違っている点などありましたらご指摘いただければと思います。
###MySQLとは？
* 世界で最も人気のある、基本無料のオープンソースデータベース:girl_tone1::boy_tone2::girl_tone5::boy_tone3:
* 操作方法がシンプルかつ、高速性・堅牢性・利便性に優れている:eyeglasses:

###CRUDとは？
データベースの基本操作で、以下のそれぞれの頭文字からとった総称です。

頭文字|CRUD|機能|SQL文|
|:---:|:---:|:---:|:---:|
|C|Create|データ追加|INSERT文|
|R|Read|データ取得|SELECT文|
|U|Update|データ更新|UPDATE文|
|D|Delete|データ削除|DELETE文|
#データベース作成
まずは、データベースの作成です！
データベースを作成するSQLは、これです！

```SQL:
CREATE DATABASE データベース名;
```

データベースが作成できているか確認するには、このSQL文でデータベース一覧を表示します！

```SQL:
SHOW DATABASES;
```
#テーブル作成
続いて、テーブルを作成するSQL文です！
※データ型については、本記事では触れません

```SQL:
CREATE TABLE テーブル名(カラム名 データ型);
```
カラムを複数作成する場合は、カンマで区切ります。

たとえば、、、このSQL文で:point_down:

```SQL:
CREATE TABLE sample_table(id INT,name VARCHAR(15),age INT(3),created_at DATETIME);
```
こんな感じのテーブルが作られるイメージです！:point_down:
<**sample_table**>

|id|name|age|created_at|
|:---|:---|:---|:---|
||||
||||
||||
#CRUD
それでは、CRUDのSQL文もやっていきましょう！！
##データ追加（INSERT文）
データ追加には、INSERTE文を使います！
作成されているテーブルに、新しいレコード（データ）を挿入できます。
こんな感じ:eyeglasses:

```SQL:
INSERT INTO テーブル名 (カラム名)VALUES(値);
```
これも例を挙げてみると、、、

```SQL:
INSERT INTO sample_table (id, name, age ,created_at) VALUES (1, '小林隼人', 15, now()), (2, '屋島未来', 27, now());
```
このSQL文で:point_up:
こんな感じにレコードが追加されます！:point_down:
<**sample_table**>

|id|name|age|created_at|
|:---:|:---:|:---:|:---:|
|1|小林隼人|15|now()|
|2|屋島未来|27|now()|
||||
※now()は自動で現在時刻を入れてくれるメソッド(関数)です

##データ取得（SELECT文）
データ取得には、SELECT文を使います！
テーブル内のレコード（データ）を取得できます。
こんな感じ:eyeglasses:

```SQL:
SELECT カラム名 FROM テーブル名;
```
指定したカラムのみデータを取得できます！
nameとageのみ取得してみると、、、

```SQL:
SELECT name ,age FROM sample_table;
```
<取得結果>

|name|age|
|:---:|:---:|
|小林隼人|15|
|屋島未来|27|
こんな感じで、好きなレコード（データ）を取得できます！
####WHERE句
ここで、WHERE句の説明だけしておきます！
WHERE句を使用すると、取得したレコード（データ）を絞り込むことが出来ます。

例えば、年齢が２０歳以下のレコード（データ）のみ取得したい場合、、、

```SQL:
SELECT name ,age FROM sample_table WHERE age < 20;
```
とすると、、、
<取得結果>

|name|age|
|:---:|:---:|
|小林隼人|15|
年齢が２０歳以下の、小林くんのみ取得できますね！
##データ更新（UPDATE文）
データ更新には、UPDATE文を使います！

```SQL:
UPDATE テーブル名 SET カラム名 = 値;
```
WHERE句を付けて特定のレコード（データ）を更新します。
**※WHERE句を付けないとテーブル内の全レコードを更新してしまいます**

以下、例文です:eyeglasses:

```SQL:
UPDATE sample_table SET age = 24 WHERE id = 1;
```
すると、、、
<**更新結果**>

|id|name|age|created_at|
|:---:|:---:|:---:|:---:|
|1|小林隼人|**24**|now()|
|2|屋島未来|27|now()|
||||
小林くんの年齢の値を更新できます！

##データ削除（DELETE文）
データ削除には、DELETE文を使います！

```SQL:
DELETE FROM テーブル名;
```
WHERE句を付けて、特定のレコード（データ）を削除します。
**※WHERE句を付けないとテーブル内の全レコードを削除してしまいます**

例えば、小林くんのみ削除したいときは、、、

```SQL:
DELETE FROM sample_table WHERE id = 1;
```
<**削除結果**>

|id|name|age|created_at|
|:---:|:---:|:---:|:---:|
|2|屋島未来|27|now()|
||||
||||
こうなります:eyeglasses:
##まとめ
データベースの基本操作を一通り解説してみました。
初心者の方で、SQL文を忘れてしまった方は参考にしてみてください！
AnsibleのジョブからTeamsにメッセージを送信する方法

# はじめに
AnsibleのジョブからTeamsにメッセージを送信する場合、uriモジュールを利用してPOSTすることもできると思いますが、 **office_365_connector_cardモジュール** を利用すると簡単に実装できます。


# office_365_connector_cardモジュール

## ドキュメント
[https://docs.ansible.com/ansible/latest/collections/community/general/office_365_connector_card_module.html](https://docs.ansible.com/ansible/latest/collections/community/general/office_365_connector_card_module.html)


## 事前準備
通知用のTeamsチャネルのコネクタにIncoming Webhookを構成しておきます。

https://qiita.com/wataash/items/72b49509c3964294dd67


## モジュールの使い方

Ansible単体で利用する場合はモジュールをインストールしておきます。
https://rheb.hatenablog.com/entry/ansible_collections

Ansible Tower/AWXの場合はcollections/requirements.yml に community.general を追加しておきます。

```yaml:collections/requirements.yml
---
collections:
- community.general # <--追加する
```

Playbookには以下のように記述します。

```yaml:使い方
- name: Task Name
  community.general.office_365_connector_card:
    webhook: TeamsのIncoming Webhook URL #必須
    title: 件名                        #省略可
    text: 本文
```

## 実装例：作成したEC2のPublic DNS名をTeamsに通知する

### サンプルコード
```yaml:サンプルコード
〜略〜

# Send Teams Webhook
- name: Send Teams Webhook
  community.general.office_365_connector_card:
    webhook: "{{ teams_webhookurl }}"
    title: "あなたのWordPressが正常に作成されました。"
    text: "ようこそページにアクセスし利用を開始しましょう！ http://{{ gather_ec2.instances[0].public_dns_name }}/wordpress/"
  register: teams_webhook
  delegate_to: localhost
  vars:
    ansible_connection: local
```

### 実行結果
Teamsに以下のように通知が届きます。
![teams-adaptivecard2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/65140fa3-7352-97b5-4db4-eac86e8ac2ca.png)

# おわりに
Ansibleは豊富なモジュールが提供されているので、積極的に利用することでPlaybook作成の効率化が期待できそうです。
flutterでandroidの申請

## android申請概要
基本の流れは[play consoleヘルプ](https://support.google.com/googleplay/android-developer/answer/9859152?hl=ja)に記載があります。
ダッシュボードの流れに沿って必要な箇所を対応します。
アプリのリリースで関連する場所に回答していきます。
事前にgoogle play consoleへ登録と素材（アイコン・スクリーンショット・アプリの説明文）などは容易しておく必要があります。

keystoreファイルの設定は以下のリンクを参考
https://algorithm.joho.info/flutter/flutter-android-apply-google-play/

## 今回詰まったaabファイルについて
Google Play に Android アプリを公開するには、Google Play Console に aab ファイルをアップロードする必要があります。
aabファイルとはgoogle playにアプリをアップロードするための圧縮ファイルのようなものです
ダッシュボードで公開の部分の設定をするとaabファイルのアップロードというのがでてきます。
調査しているときは、androidスタジオで作成するのだと思っておりました。
androidスタジオのBuild から Generate Signed Bundle / APK...を作成できると思っていました。
しかし、`Generate Signed Bundle / APK...` が見つかりませんでした。
下記と同じ状況。

https://stackoverflow.com/questions/69473361/generate-signed-bundle-apk-option-is-missing-in-android-studio

## flutterで作成した際はaabファイルの作成方法が違う?
やり方はいまいち分かってないですがターミナルから証明書を作ってビルドする方法があるようです。
以下のリンクを参考にabbファイルを作成しました。
https://qiita.com/kazutxt/items/f463441840292f0bbe5b
https://hondakenya.work/flutter-androidapp-releasebuild/

## 申請後パスワードが明記されてなくてリジェクト
アプリにログインする際にテスト用のパスワードを伝える必要があります。
アプリへのアクセス手順を追加する
Google Play Console を開いて、[アプリのコンテンツ] ページ（[ポリシー] > [アプリのコンテンツ]）に移動します。
[アプリのアクセス権] で [開始] を選択します。
注: アプリへのアクセス手順を以前に追加したことがあり、その手順に変更を加える場合は、[開始] ではなく [管理] を選択します。
[新しい手順の追加] をクリックし、アクセスの詳細を入力します。
注: ログイン メカニズムについて注意すべき点があれば（ワンタイム パスワード、多要素認証、3 つ以上のフィールドを使用したログインなど）、[その他の手順] 欄に記載してください。
変更を保存します。

https://support.google.com/googleplay/android-developer/answer/9859455?hl=ja

## アプリにかんして　の問い合わせ先
https://support.google.com/googleplay/android-developer/gethelp?hl=ja&visit_id=637798764909600304-185184537&rd=1#
CloudEndureからMGNへ


# CloudEndureからのお知らせ

2022年6月30日
　- 新規のCloudEndure Migrationライセンスは割り当てられません。
　　　※既存のライセンスを継続して使用することができます。
2022年9月30日
　- CloudEndure Migrationエージェントの新規インストールはできません。
　　　※すでにインストールされているエージェントを使用して、進行中の移行を完了することができます
2022年12月30日
　- サービスが利用できなくなります

ちなみに、CloudEndure Disaster Recovery(DR)サービスに影響を与えまないという記載がありますので、
引き続き使えます。

※引用リンク：https://docs.cloudendure.com/Content/Configuring_and_Running_Migration/Migration_EOL/Migration_EOL.htm

# MGN とは

AWS　https://aws.amazon.com/jp/application-migration-service/faqs/より
Q: AWS Application Migration Service とは何ですか?
AWS Application Migration Service (AWS MGN) は、AWS へのリフトアンドシフト移行に推奨される主要な移行サービスです。AWS Application Migration Service は、ソースサーバーを物理、仮想、またはクラウドのインフラストラクチャから AWS でネイティブに実行するように自動的に変換することにより、AWS への移行を簡素化および迅速化します。アプリケーション、そのアーキテクチャ、または移行されたサーバーを変更することなく、同じ自動化されたプロセスを幅広いアプリケーションに使用できるようにすることで、移行をさらに簡素化し、コストを削減します。AWS Application Migration Service を使用して、カットオーバーの前に無停止のテストを実行できます。テスト後、AWS Application Migration Service を使用して、通常は数分で測定される短いカットオーバーウィンドウ中に、アプリケーションをクラウドにすばやくリフトアンドシフトできます。

CloudEndureに比べると、メリットはAgentLessでの対応とAWSサービスによる設定のシンプル化です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/7c7b42fc-4f2d-99fb-4837-1e218aad32b2.png)
参照：
https://d1.awsstatic.com/aws-application-migration-service/AWS_MGN_Network_Architecture_No_Internet_Access.pdf

# MGN と　CloudEndureの違い

主にサポートOSには違いがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/3fc74617-a7a9-254d-8e8c-a8b7d855c385.png)



ちなみに、既存の設定をCloudEndureからMGNに移行することができません。

※上記以外はMGNとCloudEndureどちらもいくつ注意事項もありますので、
詳細はそれぞれのリンクをご参照ください。
https://docs.aws.amazon.com/mgn/latest/ug/Supported-Operating-Systems.html
https://docs.cloudendure.com/#Getting_Started_with_CloudEndure/Supported_Operating_Systems/Supported_Operating_Systems.htm
Oura Cloud APIにNode.jsからアクセスする #iotlt


[Oura Ring](https://ouraring.com/)のAPIドキュメントを眺めていたら結構簡単に取得できそうだったので少し調べたらnpmライブラリとして公開している人がいたので試してみました。

https://www.npmjs.com/package/oura-cloud-api

## 環境

- Node.js v17.3.0

## インストール

```bash
npm i oura-cloud-api
```

## トークンの取得

https://cloud.ouraring.com ここからログインすると簡単に取得できました。

## コピペコード

npmのページにある通りにやると動作します。

2022年1月16日だけを取りたいとかならこんな感じです。

npmのサンプルよりも多くの情報が取れそうな`getSummaries()の関数を利用してみてます。

```js
const Client = require('oura-cloud-api');
 
(async () => {
    
    const accessToken = 'RDEOSTZPD4...';
    
    try {
        const client = new Client(accessToken);
        
        const userInfo  = await client.getUserInfo();
        console.log(`The call returned: ${JSON.stringify(userInfo)}`);
        
        const summaryData  = await client.getSummaries({ start: '2022-01-16', end: '2022-01-16' });
        
        console.log(summaryData);
       
    } catch (error) {
 
        console.log(`Oh-no, error occured: ${error}`);
 
    }
 
})();
```

## sleepとreadinessの値が当日は取れない模様

僕はGen2を利用しているので、 **Gen3だと違うかもしれません**が、当日の指定だとこの二つの値が取れないかもしれません。

仕様などはまた記事にしてみたいと思います。
Djangoとは

**Django**の基本的なことについて調べたので、メモしておく。

# Djangoとは
**Django**とは、Webアプリケーション開発で使用されるフレームワークのこと。
フレームワークとは、アプリケーション開発に使用されることが多い機能をひとまとめにしたソフトウェアのこと。フレームワークを使用することで、自分で機能を開発しなくてよくなり、効率よく開発を進めていけます。
**Django**を使用するメリットとして、以下のような点が挙げられていた。

**【メリット】**
■ **Webアプリ開発に関する様々な機能がある**
　具体的には、ユーザー認証・管理画面・サイトの案内ぺージ・RSSフィードを作成する機能など
■ **高いセキュリティ**
■ **保守性・拡張性が高い**

# Djangoのインストール
Pythonがインストールされていることを前提として、**Django**のインストールは以下の```pip```コマンドを実行する。

```
$ pip install django
```
動作確認を行いたい場合は、Python shellを起動して以下のコマンドを実行する。

```
>>> import django
>>> django.get_version()
'4.0.1'
```

上記のように```'4.0.1'```とバージョンが表示されれば正常にインストールされている。
Python shellを終了する場合は、```exit()```を実行する。
rails s が上手くいかない。rails newが作成できない時。

簡潔に書くと、

**rubyとrailsのバージョンの互換性**

に問題がある場合がある。

その為、下記のURLを確認して見直すことをおすすめする。
もし、互換性がないものであればURL通りにRuby、railsを入れ直してみると解決する可能性がある。
https://www.hmallett.co.uk/2018/08/ruby-and-ruby-on-rails-version-compatibility/


補足：上記の方法は下記のようにPumaさえも立ち上がらない人向け
```=> Booting Puma
=> Rails 5.2.6 application starting in development
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!     
```
Chrome DevToolsでPopover(hover時など)の挙動を確認する


hoverを外すと隠れてしまう要素を、DevToolsなどで確認したくなることはありませんか？
しかしdevtoolsへカーソルを移動してしまうと要素が消えてしまいます。
今回は、hover時の要素を確認できずに困っている方へ向けて、解決方法を解説します。

devtoolsのconsoleに `debugger` と入力する

![スクリーンショット 2022-01-18 16.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374962/309fa2d8-5bce-bcc9-89bf-0a203a60360e.png)

hoverしてPopoverを表示する

![画面収録 2022-01-18 16.20.21.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374962/ac149bc0-34d3-58b4-9b6f-80007122eec4.gif)

enterで　`debugger` を実行する

![スクリーンショット 2022-01-18 16.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374962/af579b0d-ba19-79d7-84e9-5b3a2bee54d5.png)

これで好きなだけdevtoolsを確認できます。

![スクリーンショット 2022-01-18 16.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374962/85ebc381-fb94-aa42-5dd8-76ff54012d79.png)
[Ruby]閏年の条件分岐

学習したことのアウトプットとして

##閏年になる条件
- その年が4で割り切れること
- ただし、年が100で割り切れて400で割り切れない場合は閏年ではない

##記述例
if~endの入れ子としてさらにif~endを使っていく

```ruby
year = 指定の年

if year % 4 == 0  # 年が4で割り切れること
  if year % 100 == 0 && year % 400 != 0  # 年が100で割り切れて400で割り切れない場合
    # 閏年でない
  else
    # 閏年
  end
else
  # 閏年でない
end
```
　
もっと簡単な書き方はいくらでもありそうな気がするが…一つの例として書き留めておく。

　

※補足等ありましたらコメントいただけると幸いです。
【抄訳】Ignite 振り返り向けラーニングコンテンツのご紹介

みなさんごきげんよう。Microsoft App Innovation チームです。 

みなさんは Continue your learning with Microsoft というラーニングコンテンツが公開されているのはご存知でしょうか。Microsoft Ignite が終了した後も引き続き学び続けていただくために用意されたこのコンテンツは、みなさんにはお馴染みの Microsoft Learn をはじめ、様々な情報がまとめられています。

[**Continue your learning with Microsoft(英語)**](https://docs.microsoft.com/ja-jp/events/post-ignite-nov-2021/?WT.mc_id=PostEvent-42974-sylviej&Dev_QT=PET3035062) 

Continue your learning with Microsoft は 8 つのセクションが用意されていて、コンテンツの中には日本語に対応しているものもありますが、今回はその中でも活用しやすそうなものをいくつかピックアップしてご紹介します。 

#MVP-Led After Parties 

Microsoft Ignite 後にも活動を続けている Microsoft MVP を中心とする世界中の各コミュニティが紹介されていて、主に Linkedin や Facebook ページへのリンク集となっていています。 

日本のユーザーコミュニティは **Azure Rock Star プログラム**としてまとめられていて、こちらはみなさんに馴染みのある connpass へのリンクが多くなっていますのでご興味ある方はこちらもご参照ください。 

https://www.microsoft.com/ja-jp/events/top/azure-rock-star.aspx?Dev_QT=PET3035062

#Ask the Expert 

Microsoft Ignite スピーカーがみなさんの質問に答えてくれるライブ配信が予定されていました。現在、ライブ配信の予定は全て終了していますが、当日の内容がオンデマンド配信で視聴できるようになっています。 

https://docs.microsoft.com/ja-jp/events/post-ignite-nov-2021/ask-the-experts/?Dev_QT=PET3035062

日本では「クラウドデベロッパーちゃんねる」にて「Microsoft Ignite 秋まつり 2021 [#くらでべ] 」で日本版 Microsoft Ignite 振り返りイベントを行いましたのでこちらも合わせてご覧ください。 

https://www.youtube.com/watch?v=oq_OnKEQbSA&Dev_QT=PET3035062

#Microsoft Virtual Training Days 

Microsoft Azure、Microsoft 365、Dynamics 365、パワー プラットフォーム、セキュリティに関するトピックのバーチャルトレーニングをさまざまなスキルレベルに合わせて実施しています。 

2022 年実施分のスケジュールも公開されています。 

https://mvtd.events.microsoft.com/?wt.mc_id=onedestination&?Dev_QT=PET3035062
 

#Microsoft Ignite Official Learn Collections 

Microsoft Ignite での発表についての情報のコレクション一覧です。ひとつのトピックに対して関連する Microsoft learn、ドキュメント、ビデオ、ブログ、プロダクトページがまとめられています。 

タイトルは英語ですが、 Microsoft learn やドキュメント、ブログなどは日本語に対応しているものもありますのでぜひご確認ください。  

https://docs.microsoft.com/ja-jp/events/post-ignite-nov-2021/ignite-learn-collections/?Dev_QT=PET3035062

#おわりに 

Microsoft Ignite での発表については「[**MICROSOFT IGNITEBOOK OF NEWS**](https://news.microsoft.com/ignite-november-2021-book-of-news/?Dev_QT=PET3035062)」にもまとめられています。こちらも Translate ボタンから翻訳されたものを確認できますので合わせてご活用ください。
マークダウン記法から装飾を外す

単純に マークダウン記法のテキスト→HTML→HTMLタグ削除の流れで外しています。
markdown-itを使用します。

使いまわしそうなのでパッケージにしてます。
`npm i markdown-it-remove`([リポジトリ](https://github.com/s-n-1-0/markdown-it-remove))

```typescript
export function removeMdPlugin(md, 
    {
    removeTags = true,
    replaceNewlineValue = null,
    escapeHtml = false,
    }={}) {
    md.renderer.__oldRender = md.renderer.render;
    md.renderer.render = (...params)=>{
      let html:string =  md.renderer.__oldRender(...params);
      var tmpHtml = (removeTags) ?  html.replace(/(<([^>]+)>)/gi, '') : html;
      tmpHtml = (replaceNewlineValue === null) ? tmpHtml : tmpHtml.replace(/\n|\r/gi,replaceNewlineValue);
        if(escapeHtml) return md.utils.escapeHtml(tmpHtml);
        else return tmpHtml;
    };
}
//------
import MarkdownIt from 'markdown-it';
const md = new MarkdownIt().use(removeMdPlugin ,{});
var result = md.render(`
# markdown-it!
## markdown-it!
### markdown-it!
[GitHub](https://github.com/)
\`inline\`
![img](https://github.com/)
`);
/*
↓
markdown-it!
markdown-it!
markdown-it!
GitHub
inline
*/
```

# 説明
やっていることは本当に単純で `html.replace(/(<([^>]+)>)/gi, '')`でタグを空文字に置き換えているだけです。あとは任意で`tmpHtml.replace(/\n|\r/gi,replaceNewlineValue)`で改行コード(\n|\r)を半角空白とかに置き換えています。

### markdown-itプラグインについて
装飾を外すことと直接関係ないですが書き残しておきます。
md.rendererはRendererクラスであり、render関数はクラスに依存しています。そのためrender関数を__oldRenderとしてmd.rendererにぶら下げることでエラーを回避しています。

rulesとかに介入してタグの配置をブロックすることも考えましたが面倒くさそうなのでやめました。
Herokuで立ち上げた本番環境のDBのデータをバックアップして、staging環境にデータをインポートする

こんにちは、kumaです。

前回herokuを使ってstaging環境を構築したのですが、その際に本番のDBのデータをそのまま使用したいと思い、手入力でやらずにもっと楽にできる方法はないかと思い、調べたところ存在したのでその方法について書いていきます。

前回記事

https://qiita.com/koudai_kumazaki/items/e5b336e9cb069adcc546

## 前提
- 環境構築時にclearDBを使用していること
- MySQL５.7であること

## 手順

### 本番データからバックアップをとる。
```
mysqldump --no-tablespaces --user=ユーザ名 --password=パスワード --host=サーバ名 データベース > production.sql
```

`--no-tablespaces`がないと、下記のようなエラーが出ます。

```
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
```

上記のエラーが出る理由は、テーブルスペースにアクセスする際には、process特権が必要なのに、それが設定されていないためです。
今回はテーブルスペースの情報を必要としないため、`--no-tablespaces`をつけて解決しました。

### テーブルスペースとは？
データファイルの置き場所。今回はデータファイルだけ引っ張れれば良いので`--no-tablespaces`オプションをつけた。

### 本番データをstaging環境にインポートする。

```
mysql --user=ユーザ名(staging) --password=パスワード(staging) --host=サーバ名(staging) データベース(staging) < production1.sql
```

## 参考記事

https://www.ownway.info/Ruby/heroku/how/management/database/cleardb

https://www.koikikukan.com/archives/2021/02/17-235555.php
【React Native】AndroidのWebViewでPDFを表示する3つの方法

#はじめに
アプリ内にPDFのドキュメントを置きたい場合、ブラウザ遷移による表示とアプリ内でのWebView表示の2パターンが考えられます。
リンクからブラウザ遷移させるのが実装としては一番楽ですが、ブラウザからアプリに戻るのが面倒であるため、ユーザの手間を考えるとなるべくこの方法は使いたくありません。

そうなると、WebViewでの表示一択となりますが、ここで1つ問題があります。
それは**AndroidではWebViewにおけるPDF表示に非対応である**ということです。

この問題を回避してAndroidでもアプリ内でPDFを表示する方法を2つ記載します。

#Google Docs Viewerの使用
1つ目は、Google Docs Viewerを使って、PDFをページ内に埋め込んで表示する方法です。

AndroidのときだけURLをエンコードして、Google Docs ViewerのURLに埋め込むような関数`viewerUri()`を作成します。

```tsx
import { Platform } from "react-native";

export const viewerUri = (uri: string) => {
  if (Platform.OS === "android") {
    const encodeUri = encodeURI(uri);
    return `https://docs.google.com/viewer?url=${encodeUri}&embedded=true`;
  }
  return uri;
};
```
呼んできた`uri`を元に`WebView`を表示するようなテンプレート　`WebViewTemplate`を作成します。

```tsx
export const WebViewTemplate = ({ route }) => {
  const { uri } = route.params;

  return <WebView source={uri} />;
};
```
`WebViewTemplate`の呼び出し元で`viewerUri()`を使用します。

```tsx
  navigate("WebViewTemplate", {
    uri: viewerUri(<path>),
    title: <title>,
  });
```

これでAndroidのWebViewでPDFを表示できるようになったのですが、実際に実機を触ってみるとPDFのファイルサイズによっては開くのに数秒以上かかってしまっており、**「いつ開くんだよ...(イライラ)」**という感情が生じてしまいます。
UXを考慮するとこれが結構見過ごせないレベルのモタつきだったので、別の方法(2つ目)を模索することになりました。

#`rn-pdf-reader-js`の使用
2つ目は、`rn-pdf-reader-js`というライブラリに頼る方法です。

https://www.npmjs.com/package/rn-pdf-reader-js

`expo install rn-pdf-reader-js`でインストールしたら、テンプレート　`PdfViewTemplate`に以下のように記述します。

```tsx
import React, { useCallback, useState } from "react";
import { StyleSheet } from "react-native";
import PDFReader from "rn-pdf-reader-js";
import { LoadingIcon } from "src/components/molecules/LoadingIcon"

export const PdfViewTemplate = ({ route }) => {
  const { uri } = route.params;
  const [isLoading, setIsLoading] = useState(true);
  const handleOnLoadEnd = useCallback(() => setIsLoading(false), []);

  return (
    <>
      <PDFReader
        source={{ uri }}
        style={StyleSheet.absoluteFill}
        noLoader
        onLoadEnd={handleOnLoadEnd}
      />
      {isLoading && <LoadingIcon style={[StyleSheet.absoluteFill, styles.loading]} />}
    </>
  );
};

const styles = StyleSheet.create({
  loading: {
    justifyContent: "center",
    alignItems: "center",
  },
});
```
Google Docs Viewerを使用するときよりも表示速度は速くなりますが、それでも1~2秒は描画に時間がかかります。
そんなときにローディングアイコン(クルクルしたやつ)を出したくなると思いますが、`PDFReader`にはすでにそのアイコンが実装されています。

中には自分でカスタムしたアイコンを出したい方もいると思いますが、そんな場合には、以下のように`isLoading`というstateを用意して、`PDFReader`の`onLoadEnd`というpropsでローディングの終了を取得するようにすればOKです。

URLのエンコードは必要ないので、呼び出し元にはパスをそのまま記述します。

```tsx
  navigate("PdfViewTemplate", {
    uri: <path>,
    title: <title>,
  });
```

これでモタつきなくPDFを開けるようになりました。

#`react-native-pdf-view`の使用
`rn-pdf-reader-js`でPDFの表示は速くなったのですが、今度はAndroid側のページ操作がスクロールではなく、矢印タッチになってしまいました。
iOSとAndroidのUIの差分が気になるだけではなく単純に操作がしづらいので、これらの問題を解消するためにはまた別のライブラリ`react-native-pdf-view`を利用する必要があります。
ただ、こちらをExpoのプロジェクトに導入するためには、ejectでBare workflowに変更する必要があるため、あくまで奥の手となります。

https://github.com/rumax/react-native-PDFView#readme

#最後に
よりよい方法をご存知の方がいらっしゃいましたら、コメント欄で教えていただければ幸いです。

#参考資料

https://skill-upupup-future.com/?p=1155
[py2rb] decode

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# decode (Python)
https://docs.python.org/ja/3.7/library/stdtypes.html#bytes.decode

バイト列から文字列
## encode
https://docs.python.org/ja/3.7/library/stdtypes.html#str.encode

文字列からバイト列
# どうする？ (Ruby)
https://docs.ruby-lang.org/ja/latest/method/String/i/encode.html

`encode`はあるものの`decode`は無い様子。
ふむ、要検討。
# メモ
+ Python の decode を学習した
+ 道のりは遠そう
SPSS Modeler ノードリファレンス 5-1 線型回帰

# 1-1 線型回帰ノード[モデル作成タブ]
<img width="200" alt="107_89線型.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7109a8ec-c6a1-7d51-25ce-bc7d79aaffce.png">


## 1.ノードの目的
線型回帰モデルを作成します。予測対象も入力変数も共に数値フィールドである必要があります。

## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/jePHgxDid9Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3.クイックスタート

[馬力]を[エンジン（の体積）]で推測する単回帰モデルを作ります。
＊サンプルデータ（CSV）は[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-01-18 10.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/54841a92-18e4-e5d9-b93a-eb0893a17355.png)

入力ノード編集画面の[データ型]タブで以下のように設定します。[値の読み込み]ボタンをおしてから[馬力]を[対象]、[エンジン]を[入力]にします。
![スクリーンショット 2022-01-18 10.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/92e32009-9cfb-4d22-d49a-372e8fdee7db.png)

[線型回帰]を入力ノードに接続して赤枠のボタンから実行します。
![スクリーンショット 2022-01-18 10.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d4e5baac-d227-ffe2-70cd-fea78f551fc1.png)

モデルナゲット（ダイヤのアイコン）が生成されたらダブルクリックで編集します。
![スクリーンショット 2022-01-18 10.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/278c1e3a-9a90-ebbf-4de5-1f1532bc987e.png)

[要約]タブに回帰式が出力されています。回帰式は　馬力＝41.34(切片)＋エンジン*0.3212です。
![スクリーンショット 2022-01-18 10.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0d5e9f29-c566-07c4-11fa-4a4ce290b2b5.png)



[詳細]タブに回帰式のモデル詳細が出力されています。
<img width="450" alt="スクリーンショット 2022-01-18 10.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/27fc1d0d-f3a2-b372-c333-97c0726baf91.png">
<img width="800" alt="スクリーンショット 2022-01-18 11.00.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ce2c4adf-14da-7bf5-9ecb-77e377ccfa9c.png">

説明変数を加えて重回帰モデルにする場合は先の入力ノードの[データ型]タブを変更するか[線型回帰]ノードの[フィールド]タブで設定します。

![スクリーンショット 2022-01-18 11.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d85abe3a-5963-e014-44e6-3c94b22d233e.png)



### SPSS Modelerで回帰モデルを作る場合のヒント

入力変数が離散量の場合ダミー変数（フラグ生成ノード）を作るか[１次]ノード（ノードリファレンス5-2）を利用します。

https://qiita.com/Makimaki2020/private/acbade8927eb10deee00

[線型回帰]には多重共線性指標と残差の自己相関指標（Durbin-Watsonの検定）があり、[1次]にのみステップワイズにAICC/R2乗/ASEなどの指標、外れ値の除去を含むデータ準備機能が備わっています。



## 4.Tips

#### 多重共線性の診断

![スクリーンショット 2022-01-18 11.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7ba91f4b-24dd-b96d-84f8-9d7a87f6fa8d.png)


![スクリーンショット 2022-01-18 11.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/052440fc-faad-2f83-ce24-e17269e80acc.png)



## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/cars.csv

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=models-linear-node

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

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

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

https://qiita.com/416nishimaki/private/503037195081d3323eee
【Python、Ruby】約数と総和

#はじめに
元々Rubyを中心に、学んでいましたが、Rubyで書く内容を他の言語であればどのように書くのか？とふと思い、Pythonに興味があったため、勉強をしてみようと思いました。
そんな中で、
##### AIZU ONLINE JUDGE
というサイトを知り、ちょうど良いトレーニングになりそうだと思ったので、少しずつ挑戦してみることにしました。
本当は、アプリ等をどんどん作成したほうがトレーニングになるのかなと思いつつ、基礎の部分として損はないだろうと思い、やり始めています。

##3-D 約数の数

######３つの整数 a、b、cを読み込み、aからbまでの整数の中に、 cの約数がいくつあるかを求めるプログラムを作成してください。

######Input
a、b、cが１つの空白区切りで１行に与えられます。

######Output
約数の数を１行に出力してください。

######例
a=1 , b=10 ,c=30のとき、
約数の数は6つ


####解答
```ruby:3-D.rb
# 回数を調べる
a,b,c = gets.split(" ").map(&:to_i)
count = 0
for i in a..b do
  if c%i == 0
    count += 1
  end 
end
puts(count)
```
```python:3-D.py
# 回数を調べる
a,b,c = map(int,input().split(" "))
count = 0
for i in range(a, b + 1):
  if c % i == 0:
    count += 1;
print(count)
```


##総和と配列もついでに求めてみる
せっかくなので、総和や配列を取り出す方法も一緒に考えてみました。
もっと綺麗なコードもあると思うのですが・・・

```ruby:3-D.rb
# 回数だけではなく、中身を取り出し、総和を確認する
a,b,c = gets.split(" ").map(&:to_i)
count = 0
divisions = []
sum = 0
for i in a..b do
  if c%i == 0
    count += 1
    # Rubyではpush、Pythonでappend
    divisions.push(i)
    # sum += i　最後に p sum　でもOK
  end 
end
puts(count)
p divisions
print(divisions.sum)
```
```python:3-D.py
# 回数だけではなく、中身を取り出し、総和を確認する
a,b,c = map(int,(input().split(" ")))
divisions = []
for i in range(a,b+1):
  if c % i ==0:
    count += 1
    divisions.append(i);
print(count)
print(divisions)
print(sum(divisions))
```


こう見ると、RubyとPythonはやはり似ているところが多いのかなと思いました。

##メモ
- Rubyについて
  - p, puts, printメソッドの違いの再認識(https://qiita.com/ryo0916/items/daf75aca9675f5a01d17)
Amazon Linux 2 で Nginx, MariaDB, PHP7.2 から 7.4 にアップグレードする方法


Concrete CMS をインストールしているサーバーで

- PHP7.2.x or PHP7.3.x -> PHP7.4.x
- MariaDB 5.5.x or 10.2.x -> 10.5.x
- Nginx 1.12.x -> 1.16.x

にアップデートした時のコマンドメモです。

めっちゃくちゃざっくりです。

アップグレード元のバージョンが違ったり、レポジトリが違ったりあって、
いろんなケースの手順をまとめてます。

**PHP+MySQL のサーバーに詳しい人しか参考にしないでください。**


```
# PHP7.3 まであった Exntesion & 古い Concrete CMS でも使用していたが
# PHP7.4 では利用不可 & Concrete CMS 最新版では不要になるので削除
sudo yum remove php-pecl-mcrypt php-recode

# 旧バージョンの Amazon Linux Extra や MariaDB の公式レポジトリを Disable or 削除
sudo amazon-linux-extras disable nginx1.12
sudo amazon-linux-extras disable php7.2
sudo rm /etc/yum.repo.d/mariadb.repo

# MariaDB 公式から Amazon Linux Extra に変えるときは
# 大文字から子文字になるので一旦アンインストール。
# DB データは /var/lib に残ったのを確認
sudo yum remove MariaDB*

# 新バージョンのレポジトリを enable
sudo amazon-linux-extras enable nginx1
sudo amazon-linux-extras enable php7.4
sudo amazon-linux-extras enable mariadb10.5

# MariaDB を公式から移行するのであればインストールが必要
sudo yum install mariadb mariadb-devel mariadb-server

# 単純に yum update でアップデート。カーネルのアップデートとかもあるし
sudo yum update

# スタートアップ起動しているか確認
sudo systemctl is-enabled nginx
sudo systemctl is-enabled php-fpm
sudo systemctl is-enabled mariadb

#  (Nginx サーバーだったら) PHP キャッシュ・セッション系のオーナーが
# apache に変わるので Nginx に戻す
sudo chown -R nginx:nginx /var/lib/php

# Ngonx 1.12.x からのアップデートであれば、443 などの記述が
# ちょっと厳しくなっているので、Nginx Config を確認する。
sudo vi /etc/nginx/conf.d/XXXX

# 再起動
sudo reboot
```
Virtual BoxにインストールしたKali Linuxが起動しない事象への対処

#概要
VirtualBox上にインストールしたKali Linuxをアップグレードした後に、Kali Linuxの仮想マシンを起動した際に黒い画面となりフリーズした際に対処した方法を記載。  

1. VirtualBoxをアップグレード
1. VirtualBox Additionsの入れ直し

＜検証環境＞
Ubuntu 19.10

#原因の推測
アップグレードすることによりboot系の何かが変更になった（カーネルモジュールのバージョンアップ？）と思われる。
そにより、VirtualBoxのGuest Additionとの相性が悪くなり起動できないと推測！

#対処手順
１．旧バージョンのVirtualBoxをアインストール

```bash:VirtualBoxアインストール
$ sudo apt purge virtualboxXX
```
XX:Virtualboxのバージョン
Tabで補完してアインストールパッケージ（バージョン）を選定すると便利

２．最新版のVirtualBoxをインストール
[VirtualBoxのサイト](https://www.virtualbox.org/)から最新版のVirtualBoxをダウンロードしてインストールする

```bash:VirualBoxインストール
$ sudo apt install VirtualboxXX
```
XX:VirualBoxのバージョン

３．Kali Linuxを起動

４．Kali Linuxにインストール済みのGuest Aaddtionをアインストール

```bash:GuestAdditonアインストール
$ sudo apt purge virtualbox-guest-*
```

５．最新のdkmsをインストール
Debian系OSはVirtualbox-guest-dkmsパッケージをインストールすることにより、Guest Addtionsの機能を使用可能になるよう。

```bash:最新のdkmsをインストール
$ sudo apt update
$ sudo apt install -y dkms
```

６．Kali Linuxをアップグレード

```bash:KaliLinuxアップグレード
$ sudo upgrade
```

７．アップグレード後にシャットダウン

８．VitualBoxマネジジャーで、Kali LinuxのデバイスにマウントされているGuest Addtion.isoをアンマウント
デバイス -> 光学ドライブ -> 仮想ドライブからディスクを除去

９．Kali Linuxを起動して最新のGuest Addtionを再インストール

#参考にした情報
1. [LinuxにVirtualBox Guest Additionsを入れる方法まとめ](https://linuxfan.info/virtualbox-guest-additions)
1. [VirtualBoxのGuest Additionsのインストールができない](https://teratail.com/questions/192137)
PDF.js エラーいろいろ覚書

これは個人的な覚書です。

[pdf.js](https://github.com/mozilla/pdf.js)利用時に出力されたエラー/ワーニングの対処策です。

# エラー その1

> 'Error: The browser/environment lacks native support for critical functionality used by the PDF.js library (e.g. `ReadableStream`); please use a `legacy`-build instead.'


出力箇所はここです。

https://github.com/mozilla/pdf.js/blob/70fc30d97c619de0f2fcb51e67bfdb1a46922725/src/core/worker.js#L139


`PDFJSDev`と`ReadableStream`がundefinedだとエラーになります。

```js
if ((typeof PDFJSDev === "undefined" || PDFJSDev.test("SKIP_BABEL"))
 && typeof ReadableStream === "undefined") { /* (snip) */ }
```


## 解決策

[サンプル](https://github.com/mozilla/pdf.js/blob/master/examples/node/getinfo.js) にしたがって `pdfjs-dist/legacy/build/pdf.js`を使います。


# エラー その2

> Setting up fake worker failed: "Cannot find module './pdf.worker.js'

または

> Setting up fake worker failed: "Cannot read properties of undefined (reading 'setup')"

または

> Setting up fake worker failed: "The "id" argument must be of type string. Received an instance of Object".



## 解決策

`GlobalWorkerOptions.workerSrc`にpdf.worker.jsのパスをセットします。


```ts
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf';

pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/legacy/build/pdf.worker';
```


webpackするのなら、webpackの中でファイルを出力します。

```js:webpack.config.js
module.exports = {
  entry: {
    "pdf.worker": "pdfjs-dist/legacy/build/pdf.worker.entry",
  },
  output: {
    filename: "[name].js",
  },
};
```

実際にパスをどうするかは、また考慮が必要そうです。


# エラー その3

> Warning: fetchStandardFontData: failed to fetch file "FoxitSansBold.pfb" with "UnknownErrorException: The standard font "baseUrl" parameter must be specified, ensure that the "standardFontDataUrl" API parameter is provided.".

## 解決策

`node_modules/pdfjs-dist/standard_fonts`の下に、フォントファイル達があります。
直接参照するか、プログラムから見える位置にコピーします。

`pdfjslib.getDocument`の引数でパスを指定します。

```ts
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf';

const document = pdfjsLib.getDocument({
      standardFontDataUrl: 'フォントファイルを置いたパス',
});
```
Kotlinxがインポートできない問題の解決策

#概要
参考書に従ってAndroidStudioでアプリ開発を始めたところ、最初のライブラリ導入で躓きました。いろいろ調べてみて、初心者には難しいお話が多かったので解決策を置いておきます。

環境
Android Studio Arctic Fox | 2020.3.1 Patch 4

#問題
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153548/6485eabf-3762-8f56-3768-9353e3528e4d.png)
明らかに有効じゃないですね。コード内で使うこともできませんでした。


#解決策
Kotlinxは非推奨になり、2021年9月以降削除予定（すでに削除済みかも）です。ViewBindingに移行しましょう。
###１、ViewBindingを導入
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153548/9213af13-d4ba-3e59-18e3-4ee9f2784a54.png)

build.gradle(:appの方)を開き、android{}内に

```
buildFeatures {
        viewBinding true
    }
```
を記述。上の方に黄色いバーが出てくるので、忘れずにSync Now しておきます。これで使えるようになりました。

###MainActivity.ktの編集
デフォルトのMainActivity.ktに追記します。

```
package com.example.hoge.outofbussinesscards

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
//以下追記
import com.example.hoge.outofbussinesscards.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    
    //以下追記
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        //以下追記
        binding = ActivityMainBinding.inflate(layoutInflater)
        //変更
        setContentView(binding.root)

    }
}

```


###書き換え方
Kotlinxの場合
```hogeBtn.setOnClickListener{
```
View Bindingの場合 
```binding.hogeBtn.setOnClickListener{
```
頭にbindingをつけるだけです。入力して赤文字になったらとりあえずbindingをつけてみる。

#参考記事
大変お世話になりました。ありがとうございます。
参照日：2022/01/18
https://www.usaco-pg.com/2021/04/29/kotlin-android-viewbinding/#settings
【Salesforce】[カスタマーユーザを無効化]ボタンを押下後、関連するレコードを操作したい

# 動作確認

できない。

[カスタマーユーザを無効化]ボタンを押下した際に、トリガが動かない。
※ただユーザの有効項目のチェックが外れたりするので最終更新日は更新される。なんでトリガ動かないんや。

# 実現方法

カスタマーユーザに関連していた取引先責任者が不要であれば削除することで、下記のレコードを操作できる可能性がある。

・ユーザ(futureメソッドが必要)
・取引先
・その他のレコード

しかし、[カスタマーユーザを無効化]ボタンを押下するとユーザとの関連が無くなる。
また取引先責任者を削除した際にトリガ起動前に取引先責任者を参照していた値が外れてしまうため注意が必要。

＜例＞
・取引履歴（仮）が取引先責任者を参照している。
・取引先責任者を削除する。
・取引履歴（仮）から取引先責任者の参照が解除される。
・取引先責任者のトリガが動く。

上記のため、メールアドレスやその他の一意なキー値が必要。
※ユーザと取引先責任者であればメール項目など

取引先は取引先責任者の項目として保持されているので特定はIDを使って取得が可能。
※関連する取引先に取引先責任者が1件も関連していない場合、取引先も削除する。ということが可能。

# 参考リンク

[非同期Apexの概要
](https://qiita.com/xuwenzhen/items/1141ebfd540515f582c8)
[py2rb] next

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# next (Python)
```python
a = iter([1, 2, 3, 4, 5])

while True:
    try:
        print(next(a))
    except StopIteration:
        break

# 1
# 2
# 3
# 4
# 5
```
https://docs.python.org/ja/3.7/library/functions.html?highlight=iter#next

https://www.shoeisha.co.jp/book/detail/9784798163642

独習Python 510p
> 初歩的なプログラミングでは、開発者がイテレーターを直接利用する機会はほどんどありません。

そうですよね、上記のプログラムであればforループで事足ります。
# to_enum (Ruby)
```ruby
a = [1, 2, 3, 4, 5].to_enum

while true
  begin
    puts a.next    
  rescue => exception
    break
  end
end

# 1
# 2
# 3
# 4
# 5
```
https://docs.ruby-lang.org/ja/latest/method/Object/i/enum_for.html

https://www.shoeisha.co.jp/book/detail/9784798168845

独習Ruby 278p
> 内部イテレーターでは表現しにくいものを（略）外部イテレーター（略）で表現

```ruby
a = [1, 2, 3, 4, 5]

3.times do |i|
  puts a[i]
  i += 1
end

# 1
# 2
# 3
```
普通のループメソッドですと、イテレーターを変更`i += 1`することができないので、そういう時に使用するのかもしれませんね。
# メモ
+ Python の next を学習した
+ 道のりは遠そう
UITextFieldの入力値を通貨に自動変換


Combineを使うと割とスッキリ実装できる。
今回のサンプルは日本円のみにしてますが、応用して通貨以外にも色々な単位に自動変換するUITextFieldを作れると思います。

```swift

class SampleViewController: UIViewController {

    let numberFormatter: NumberFormatter = {
        let nf = NumberFormatter()
        nf.numberStyle = .currency
        nf.locale = Locale(identifier: "ja_JP")
        return nf
    }()

    let textField: UITextField = {
        let tf = UITextField()
        tf.keyboardType = .numberPad
        return tf
    }()

    private var cancellable = Set<AnyCancellable>()

    override func viewDidLoad() {
        super.viewDidLoad()
        textField
            .textDidChangePublisher()
            .map { Int($0.removeCurrencyCharacter()) ?? 0 }
            .map { self.numberFormatter.string(from: NSNumber(value: $0)) }
            .assign(to: \.text, on: textField)
            .store(in: &cancellable)
}

extension UITextField {
    func textDidChangePublisher() -> AnyPublisher<String, Never> {
        NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification, object: self)
            .compactMap { ($0.object as? UITextField)?.text }
            .eraseToAnyPublisher()
    }
}

extension String {
    func removeCurrencyCharacter() -> String {
        self.replacingOccurrences(of: ",", with: "")
            .replacingOccurrences(of: "¥", with: "")
    }
}

```
Oracle Databaseのメモリ領域に新入り登場？Managed Global Area (MGA)についてまとめてみた

## はじめに

Oracle Database インスタンスのメモリ・アーキテクチャと言えばSGA、PGAですが、最近のOracle DBには新しく Managed Global Area (MGA) と呼ばれるメモリ領域が確保されるようになっています。
マニュアルなど公開資料に分かり易く情報がまとまっていないので、こちらに少しMGAの特徴やサイジングへの影響、参考資料を整理してみました。

## 参考資料

情報整理にあたって以下を参考にしました。

+ [MGA (Managed Global Area) Reference Note (Doc ID 2638904.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2638904.1)
+ [MGA（Managed Global Area）リファレンスノート (Doc ID 2685485.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2685485.1)
+ [Limiting Process Size with Database Parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1520324.1)

## MGAの特徴概要

### MGAとは

+ 12.2.0.1 から新規導入
+ SGA、PGAとは異なる性質を持つ
+ 複数のプロセスが共有して使うメモリ領域
+ 動的に確保される
+ パラレル・クエリの一時的な作業領域などで使われる
+ PGAとは異なる領域だが、MGA領域はPGA関連の初期化パラメータで確保する（具体的なサイジングは後述）

### MGAの使用状況確認

+ MGAの使用状況は v$pgastat から確認可能（ただし19c以降のみ）

```
SQL> select * from v$pgastat;

NAME                                                                        VALUE UNIT                   CON_ID
---------------------------------------------------------------- ---------------- ------------ ----------------
...
MGA allocated (under PGA)                                                 <value> bytes                       0
maximum MGA allocated                                                     <value> bytes                       0
...
```

### MGA関連の待機イベント

+ 新しく用意されたMGA関連の待機イベント
    - latch: MGA shared context root latch
    - latch: MGA shared context latch
    - latch: MGA heap latch

### LinuxにおけるMGAの構成

+ MGAは PGA_AGGREGATE_LIMIT の下でカウントされ、/dev/shmページを使用
+  /dev/shmページは、通常のPGAメモリとは異なり、スワップ不可
+ PGA_AGGREGATE_LIMITが設定されていない場合、非公開Bug 30851951 が発生する可能性あり
+ 18cおよび19cでは、IPCはMGAを使用
+ MGA用にラージページを構成可能

### MGA関連のエラー

+ ORA-461からORA-468、ORA-27778およびORA-27779 が該当

### 既知のMGA関連のバグ

+ BUG 30851951 - OPEN FDS TO /DEV/SHM/*KSIPC_MGA*.DAT CAUSES FILE-MAX LIMIT TO EXCEED AND CRASHES INSTANCE
+ BUG 27903447 : FG SUFFERS FROM "MEMORY: REG/DEREG" WAIT FOR ABOUT 2 SECONDS IN TOTAL
+ BUG 29202104 - LNX64-19.2-CDB, CLOSE ABORT PDBS, SMON HIT ORA-600 [504], [MGA SHARED CONTEXT LATCH]
+ BUG 29123482 - Create sessions in cdb, ipc0 hit ORA-600 [mga seg reg failed] and ORA-04030, instance crashed (Doc ID 29123482.8)
+ BUG 23563687 - IPC0 IS USING 2G RSS MEM WHICH IS THE TOP PROCESS TO USE RSS MEM
+ BUG 27965499 - INSTANCE TERMINATED WITH ORA-600[MGA SEG REG FAILED]
+ BUG 30293345 - LATCH: MGA SHARED CONTEXT LATCH WAITS AFTER MIGRATION TO 18C

## MGAのサイジング

+ 18c以降はMGA用の領域がPGA外に取得されるようになった
+ ただしMGAの領域はPGAの初期化パラメータによって確保される
+ そのため18c以降は元々のPGAの見積に対して、さらにMGA分の領域を加算する必要がある
+ サイジングの計算式は以下の通り

PGA_AGGREGATE_LIMIT = (original PGA_AGGREGATE_LIMIT value) + ((maximum number of connected processes) * 4M)

+ PGA_AGGREGATE_LIMIT についての補足
    - 12cR1から導入された初期化パラメータ
    - PGA_AGGREGATE_TARGETと異なり、厳格にPGAの消費メモリを定める
    - デフォルトでは、PGA_AGGREGATE_LIMITは2GB、PGA_AGGREGATE_TARGETの200%、および3MB×PROCESSESパラメータのうち、より大きい値に設定
    - 18c以降ではRAC環境の場合 5MB×PROCESSESパラメータを推奨

## まとめ

12cR2まではPGA内にMGA用の領域が確保されていましたが、18c以降はPGAの外に確保されます。
したがって18c以降でPGAのサイジングをする際は、MGAの領域も意識して PGA_AGGREGATE_LIMIT を設定しましょう。
Salesforceで行動（カレンダー）の関連先を簡単に設定する方法

今回はSalesfroceで行動（カレンダー）で関連先を簡単に紐づける方法を見ていきます

※場所的にはSalesforceの↓です
![行動１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3511fa4c-7725-96b9-e524-fb2fb100f747.png)

ここで関連先が（通常はリード、取引先責任者と並んでますが）リードを使わない環境の場合、いちいち選択を変更し取引先責任者を選択しないといけないのは煩わしいですね。
今回は、ここらへんについてどうすればいいか見てきます。



##原則事項：オブジェクト権限のあるすべてのオブジェクトが選択可能で並び順の制御はできない


例えばリードのオブジェクト権限がないユーザの場合、画像のように「取引先責任者」１択です
![行動２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/11f3008d-9adf-f020-d6a2-100845b5ef8d.png)


なるべくオブジェクトを使わないユーザはオブジェクトの権限を抜けば選択できなくなるので関連先の選択が容易にできます

##疑問：そもそもみんなはどのように関連先を選択するか？

英語の設定では以下のような手順で関連先を選択しています。

###ステップ１

「Name」もしくは「Related To」をクリック（今回は「Related To」をクリックします）

![行動３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2fe17797-da7c-b015-e515-045c6322c12f.png)

###ステップ２
関連付けたいオブジェクト英語名の頭文字をクリック（今回は商談Opportunityを選択したいのでOを入力します）
そうすると、「O」のオブジェクト一覧が自動で表示されるのが分かるでしょうか。
![行動４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d68c9be6-00ef-7577-82f5-543de7010f98.png)

###ステップ３
オブジェクトが選ばれている状態で「Enter」キーを押してください。
これで商談オブジェクトの設定がされます
![行動４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/32d7ab8a-c1a8-8ee4-1253-ee0fa11b4a60.png)


つまり商談オブジェクトを設定する際、英語版なら
１「Related To」をクリック
２「O」をクリック
３「Enter」キーをクリック
と３ステップで可能なのです

（Ordersオブジェクトは４ステップです）
１「Related To」をクリック
２「O」をクリック
３「O」のオブジェクト一覧が出るので「Orders」を選択
4「Enter」キーをクリック

なお、この文字をクリックしてだいたいのオブジェクトが表示されるのは「英語」のみの設定です。
（つまり　商談　など日本語のオブジェクトはできない）
つまり、この行動（カレンダー）の関連先設定問題は、英語版なら簡単ですが英語でない言語だと一気に難しくなる設定です。

##回避策

以上のことを踏まえ、日本語でも回避策をお伝えします。
###回避方法１　オブジェクトの並び順が５０音順なことを考慮する

タブと表示ラベルの設定で「リード」を「見込み客」に変更します
![行動５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/deef2c8b-d00a-299f-dfbb-d544232cbebd.png)


そうすると、並び順が
「リード、取引先責任者」
から
「取引先責任者、見込み客（リード）」に変更されます
![行動６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5b83f77f-01ec-5350-b96d-8f15abbef9df.png)

###回避方法２　オブジェクト名の先頭をアルファベットに変更する
これもタブと表示ラベルの設定からオブジェクト名を変更
（例　商談→O商談）
そうすれば、英語版と同じでアルファベットを入力しエンターキーを押すことで商談に設定することが可能です


##回避方法の注意点

今回の回避策は「タブと表示ラベルの設定」の変更ですが、こちらの名称を変更すると、今回の行動の関連リスト以外にも様々な部分でオブジェクトの名称が変更されてしまいます。
なので「タブと表示ラベルの設定」で変更する際は、他にどのような部分で名称が変更されるかSandboxなどで確認してから本番で変更することを強くお勧めします。
Unityで自前のパラメータをjosn形式で扱った際にObjectFieldのPickerで選ぶのが大変

#初めに
プロジェクトでjsonデータを扱うことがあると思います。
その際にEditorGUILayout.ObjectFieldでPickerでデータを選択する際に
開発序盤ならば選択するものが少ないからいいですが

![bbbbbbbbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/2e869821-fd44-c1d9-a0c8-0437dc8b8dd0.png)

これが開発後半になると
![aaaaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/74b588eb-6dd7-7390-4fcb-f149ac317730.png)

多すぎて、どれ選べばいいんだよ！（名前ソートして。。。は言わないでねｗ）
って状態になります。なぜ、このようになるのか？
これを私なりに解決する方法を今回書いてみようかと思います。

##なんでこんなにでてくるの？
EditorGUILayout.ObjectFieldのプログラムでTextAssetを設定しています。

```c#
        TextAsset source = new TextAsset();
        source = EditorGUILayout.ObjectField("hoge",source, typeof(TextAsset), true) as TextAsset;
```
このTextAssetのクラスの親子関係が問題になります。階層を見てみると

Object

┗TextAsset

　┗MonoScript

となっています。
MonoScriptは、「スクリプトのAssetを扱うためのクラス」になります。このおかげでPickerを出すと
クラスの親子関係でMonoScriptが選択画面に出てしまいます。なので、開発後半になると大量に出てしまいます。
というわけです。


https://docs.unity3d.com/jp/current/ScriptReference/MonoScript.html



###対処法
私がやった対処法はPickerで検索するする際にオブジェクトにラベルを付けておく
検索対象をタイプだったりいろいろ設定できます。

Unity：Projectウィンドウの検索を使いこなす！

http://www.fast-system.jp/unity%EF%BC%9Aproject%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%EF%BC%81/


ラベル検索をPickerを開いた時に自動で設定すればいいのでは？
って事で下記の方法使ってラベルを入れました。

https://qiita.com/Alt_Shift_N/items/3831f7ea17e56d5d0a72

プログラムはこんな感じ、

```c#
         TextAsset source = new TextAsset();
        source = EditorGUILayout.ObjectField("hoge",source, typeof(TextAsset), true) as TextAsset;

        if (ObjectSelectorWrapper.isVisible)
        {
            ObjectSelectorWrapper.SetFilterString("l:hoge");
        }
```

これで、json形式のデータを"hoge"と言うラベルをつけておくだけでPickerの選択ウィンドウがすっきりします。
左が対応後、右が対応前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/1f1ff6a2-9a8f-bc43-4c61-f87e3fef552c.png)


####最後に
今回は、アセットの管理方法について書きましたが、私が思いついて対処方なので、
もっと良い方法があったら教えてください。
開発後半になってアセットが大量にあり、管理が大変になります。。。
初めから設計をしっかりしてればよかったな～って思う今日この頃。。
NPMのコマンドが401になる

## 環境
Angular CLI:11.2.14
Node:16.4.2
OS:win32 x64
Angular:11.2.14
## 現象
`npm i`, `npm uninstall`, `npm cache clean`などnpmコマンドが使えない
👉angularとNodeのバージョンが一致していないのが原因
[Angular CLIとNode.jsのバージョン対応表](https://stackoverflow.com/questions/60248452/is-there-a-compatibility-list-for-angular-angular-cli-and-node-js)
nodeのバージョンを上げ方
1. nvm-windowsがなければインストールする
[nvm（Node Version Manager）でWindowsにNode.jsをインストールする](https://jsstudy.hatenablog.com/entry/functionaljs-9-nvm-windows)
2. Nodeのバージョンを上げる 
[node.js のバージョンを切り替えて使う（nvm-windows）](https://bnote.net/front-end/nvm.html)
コマンドプロンプトを管理者で実行しないとバージョンの変更ができないので注意

ここまででnpm uninstallはできるようになった
まだ401が出るので、.npmrcで指定しているURLで401だったので以下を実行。
> vsts-npm-auth -config .npmrc  

最初のコマンドが全部使えるのが確認できた

そのほか参考
[Update vsts-npm-auth with new username and password](https://stackoverflow.com/questions/43840562/update-vsts-npm-auth-with-new-username-and-password)
MBR（マスターブートレコード）を解剖する

# 背景
fdiskコマンドとかで何気なくパーティションをいじくっている中で、
パーティションテーブルを持っているMBRくんおことを全然知らないと思って調査してみた備忘録。

# 調査
## MBR（マスターブートレコード）
HDDなどの記憶媒体の最初のセクタ（512bytes)に存在する特殊なレコード。
OSの読み込みだったり、ディスクパーティションの情報だったり、
重要な情報がこの512Bytesの中に入っている。

### MBRの構成がどうなっているのか
MBRは1セクタ分の容量 = 512Byteで構成されており、
BIOS形式のMBRの場合、具体的には下記の情報が含まれる

|Byte Offset|容量|内容|備考|
|-|-|-|-|
|00~445|446Bytes|ブートストラップローダ||
|446~461|16Bytes|1st パーティションテーブル||
|462~477|16Bytes|2nd パーティションテーブル||
|478~493|16Bytes|3rd パーティションテーブル||
|494~509|16Bytes|4th パーティションテーブル||
|510~511|1Bytes|ブートシグニチャ|MBRの有効性を示す特定値|

### 【想像】なぜ標準パーティションが4つしか持てないのか
BIOS形式のディスクって標準パーティションが4つしか持てないのは、
MBRレコードの中にパーティションを示す領域を16byte * 4 = 64byte分しか用意できなかったからかな？
この設計が現代まで生きているので、標準パーティションは4つまでしか作れないということかな・・・

## ブートストラップローダの構造
ものすごく端折って言ってしまえば、OS起動用のパーティションを作成し読み込むための関数が設置されている。

具体的には、下記のような動作を行っているらしい。

> 1. パーティションテーブルの検査
> 2. ４つのテーブルエントリーを先頭から順に検査し、起動可能な（起動フラグの立った）基本領域がないか探す。
> 3. 見つかったら、その領域の先頭位置をテーブルから取得する。 　BIOSにその位置を示して、当該先頭セクターをメモリーにロードしてもらう。
> 4. ロードした先頭セクターに制御を移す。

引用：http://nobusan.jp/computer/boot/bootstrap.html

②の起動フラグの立った基本領域というのは、後述するパーティションテーブルのブートフラグのことと考えられる。
あくまでMBRのブートストラップローダは、OS起動用パーティションを見つけて読み込むことだけを目的としていて、
OSの起動自体は、起動用パーティションのPBR（PartitionBootRecord）が実施するものと思う。

## パーティションテーブルの構造
パーティションテーブルは16Byteで構成されており、構造は下記のようになっている

|容量|内容|備考|
|-|-|-|
|1byte|ブートフラグ|起動パーティションとして利用可能かを示す値（0x80 → 可 / 0x00 → 不可）
|3byte|開始セクタ(CHS)|使用されていない
|1byte|パーティション識別子(システムID)|ファイルシステムを値で指定する（<a href="https://www.wdic.org/w/TECH/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%97">参考</a>）
|3byte|最終セクタ(CHS)|使用されていない
|4byte|開始セクタ(LBA)|
|4byte|パーティションの総セクタ数(LBA)|

### 【疑問点】CHSって何？なぜ使用されていない？
CHSは「Cylinder Head Sector」の略で、シリンダー(C)・ヘッド(H)・セクター(S)の三つの頭文字で作られている。
古いハードディスクの読み書き場所の指定に使われていた方式？らしい。
恐らくは、古い形式の要素であるため、現在は使用されていない、いうことだと考えられる。

### 【疑問点】LBAって何？
LBAは「Logical Block Address」の略。
ディスクの各セクタに「論理ブロック」と呼ばれる通し番号を振り、
この番号を指定することで、任意のセクタにアクセスするロジック。
CHSはディスクアクセスの際に複数の情報だったが、こっちのほうがシンプルで使いやすいのかな。
CHSが使用されていない、ということは、基本的にはこちらが利用されているものと考えられる

### 【想像】MBRの2TBの壁の正体
BIOS形式のMBRで作成できるパーティションの最大サイズは2TBという話は有名で、
これの正体はパーティションテーブルの末尾4Byteに示す「パーティションの総セクタ数」に関係があると思う。
4Byteは-2,147,483,648～2,147,483,647の値を表現することが可能なので、最大で4,294,967,296の値を表現することができる。
つまり、パーティションの総セクタ数としてして利用できるのも4,294,967,296個までということになる。
1セクタが512Byteだから、
4,294,967,296 × 512 ＝ 2,199,023,255,552
となり、おおよそ2TBまでがパーティションで利用できる容量の最大値ということになる。

### 【想像】ディスク容量を指定するときに512Byteの倍数で指定する理由
これもパーティションテーブルの末尾に示す、「パーティションの総セクタ数」に関係がある
容量は1Byte単位で指定するわけじゃなくて、あくまで利用するセクタ数で判断されるため、
1セクタ=512Byteだから、Byte指定する場合は512の倍数にしないといけない、ということ。

##ブートシグニチャについて
MBRの最後の1byteに書き込まれているマジックナンバー的なもの。
「0xAA55」が書き込まれていなければ、無効なMBRとして判断される。

# 参考
- 語句の概要
    - [IT用語辞典 e-Words - MBR(マスターブートレコード) ]("https://e-words.jp/w/MBR.html")
    - [通信用語の基礎知識検索システム - LBA]("https://www.wdic.org/w/TECH/LBA")
    - [通信用語の基礎知識検索システム - CHS]("https://www.wdic.org/w/TECH/CHS")
- もう少し詳しい解説
    - [パソコン用語 - MBR(マスターブートレコード)とは]("https://jisaku-pc.net/words/mbr.html")
    - [とあるSIerの憂鬱 - MBR の場合でもディスク識別子が存在した]("https://incarose86.hatenadiary.org/entry/20150131/1422710143")
    - [ブートストラップローダの詳細]("http://nobusan.jp/computer/boot/bootstrap.html")