OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLにおける「現在日時」

:::note info
※ 執筆時点の2022年05月でのPostgreSQL 13に基づいて書きましたが、9以降のPostgreSQLで一貫して同じように扱われているので問題ないかと。
:::

# 現在日時を示すものには、いろんな表現があります

　PostgreSQL 13の日本語ドキュメントで、[9\.9\.4\. 現在の日付/時刻](https://www.postgresql.jp/document/13/html/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)を見ていて気づいたのでメモしておきます。

　PostgreSQLでは様々な現在日時を示す表現があるのです。

## CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP

```sql
SELECT 
  CURRENT_DATE,
  CURRENT_TIME,
  CURRENT_TIMESTAMP,
  CURRENT_TIME(1),
  CURRENT_TIMESTAMP(1),
  LOCALTIME,
  LOCALTIMESTAMP,
  LOCALTIME(1),
  LOCALTIMESTAMP(1)
```
　結果は以下の通り：
![Snap_20220527_115607_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/b1f8903b-1612-6484-90d8-24a0dcb09fe6.png)


　この処理系の場合は、秒以下6桁まで提供するものの、精度を指定することで指定桁での丸め処理が行われることがわかりました。
　「+09」がついているのは、タイムゾーンつきということですね。

## transaction_timestamp(), statement_timestamp(), clock_timestamp(), timeofday(), now()

　説明を丸ごと引用しておきます：

> transaction_timestamp()はCURRENT_TIMESTAMPと等価ですが、明確に何を返すかを反映する名前になっています。 
> statement_timestamp()は現在の文の実行開始時刻を返すものです（より具体的にいうと、直前のコマンドメッセージをクライアントから受け取った時刻です）。 statement_timestamp()およびtransaction_timestamp()はトランザクションの最初のコマンドでは同じ値を返しますが、その後に引き続くコマンドでは異なる可能性があります。
> clock_timestamp()は実際の現在時刻を返しますので、その値は単一のSQLコマンドであっても異なります。
> timeofday()はPostgreSQLの歴史的な関数です。 clock_timestamp()同様、実際の現在時刻を返しますが、timestamp with time zone型の値ではなく、整形されたtext文字列を返します。
> now()はtransaction_timestamp()と同じもので、伝統的なPostgreSQL関数です。

```sql
SELECT 
  transaction_timestamp(), statement_timestamp(), clock_timestamp(), timeofday(), now()
;
```
結果は以下の通り：
![Snap_20220527_120204_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/afe62933-b754-21fb-2c7c-67b5d88b4212.png)

　このSELECT文を単発でやってもあまり意味がなく、説明にあるようにトランザクション処理の中で使えばいろいろな差が出てくるものになってます。

# 使い分けを考える

　INSERT文やUPDATE文を実行したリアルな時刻を記録したい（例えばcreate_atやupdate_atとか）なら、transaction_timestamp()とclock_timestamp()のどちらでしょうか。
　考え方次第だとは思うのですが、一連のデータ更新処理を一括りとして捉えるなら、transaction_timestamp()を使うのが筋だと思えます。　複数のテーブルを横断するような長い処理で、最初の方と最後の方で日時がズレないのはこちらのtransaction_timestamp()です。
　一方、リアルな時刻にこだわるならclock_timestamp()になりそうです。　特定のクエリーの処理時間を計測する、みたいなのにも使えるかもしれません。
ディレクトリ構造をパワポやテキストで書くの辞めませんか？

## 概要

皆さんは、ディレクトリ構成などを表現するときにどのようなツールを使用しているでしょうか。  
テキストで記号(┣等)を駆使しながら表現したり、PowerPointで図を書いたりしている方が多いと思いますが、きれいに整わなかったり、エディタからPowerPointに切り替えてマウスを使うのが面倒だったりしませんか？

この記事では、PlantUMLを使用して、整列された美しいディレクトリ構成を簡易言語で表現する方法をご紹介します。

## ゴール
PlantUMLに含まれる、ワイヤフレームGUI設計ツールである、**Salt**を使用します。  
ワイヤフレームGUIはその名の通り、色や大きさなどのデザイン面を排除し、ボタンがあることだけを意識してGUI設計について議論するためのツールとなっています。  
今回は、Saltに含まれるツリー構造表現を使用してきます。

出来上がりのイメージはこんな感じ。整列されて美しい！

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350454/ed5fefc2-cef5-8e15-94a5-027cd34d0204.png width=60%>

ちなみに、├などは「けいせん」で変換可能です。お試しあれ。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350454/f986061e-33b1-d5f2-662c-cc60c9fb3502.png width=10%>

## Salt

手順などは特に無いので、早速ソースです。  
PlantUMLが記述できる環境であれば、基本的にインストールなどは不要です。  

```
@startsalt
{
{T
 + Users
 ++ Documents
 ++ Desktop | デスクトップはゴミ箱ではない
 +++ <color:red> とりあえず.tmp </color> | 色付きも可能
 ++ Music <- 表で区切らないとコメントが揃わない
}
}
@endsalt
```

ポイントは4点です。
1. startsalt / endsaltで開始と終了を明記
2. {T ~ }で囲うことで木構造ウィジェットの使用を宣言
3. ++の数によって階層の深さを表現
4. |を使用して表との組み合わせ


### 何が便利なの？

エクセルやパワポを使い慣れた方からすると、特に不便を感じていないのかもしれません。
せっかくなので、Saltで表現するメリットをご紹介します。

1. テキストデータなので、軽量でGitによる差分管理が容易
2. 整列の手間がいらず、見た目がきれい
3. エディタ内で完結する事ができ、ツールの切り替えが不要

3のメリットは分かりにくいかもしれませんが、我々エンジニアにとってはキーボードで完結するというのが結構大事だったりします。  
コードを書いている最中にマウスに持ち替える作業が入ると、集中が切れて途端にやる気が無くなる。そんな繊細な生き物なのです。(私だけ？)


## おわりに

PlantUMLのGUI設計ツールであるSaltを使用した、木構造表現によるディレクトリ構成の作成方法をご紹介しました。  
手軽にかけて、見た目も綺麗ですごいですよね！

普段からPlantUMLを使用している方は新たにツールを入れる必要もないので導入コストは低いと思いますので、一度お試しください。

それでは、良いエンジニアライフを！
【初心者】djangoでつまづいたところと解決策

# 記事の目的
djangoを勉強していく上でつまづいたところや覚えておきたいことを備忘録的に記す


## つまづいたところ

### 画像のアップロード

#### やりたいこと

モデルを以下のように作成してフォームからデータを追加できるようにしたい
```models.py
class ImageModel(models.Model):
    name = models.CharField(max_length=100)
    img = models.ImageField(upload_to='')
    author = models.CharField(max_length=100, null=True)
```

#### エラー
以下の画像のように　`this field is required`と表示されてしまう

![スクリーンショット 2022-05-27 11.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675330/53945a89-e69c-aa8e-8dec-d35683e5890a.png)

#### 解決策
htmlファイルのformの表記を
```
<form action="" method="POST" >
↓
<form action="" method="POST" enctype="multipart/form-data">
```

と変更する


### アップロードされた画像を加工して表示する

#### やりたいこと
formを用いてアップロードされた画像を加工して加工前と後のものを両方表示する

####つまづいたこと

cv２でオープンして加工しようとしたが以下のエラーが吐かれた
(MEDIA_URL = 'medi'として実行してみる)

####解決策
MEDIA_URL, MEDIA_ROOTの設定の時に何も考えずに設定していたが同じにしないといけなかった.
```python:setting.py
#画像を表示するときにurlの一部となる(あまりわかってない)
MEDIA_URL = 'media/'

#画像がアップロードされた時の保存先
#本番環境でも使える書き方(DEBUG = True/Falseで条件分岐)

if DEBUG:
    MEDIA_ROOT = BASE_DIR / 'media'
else:
    MEDIA_ROOT = f'/var/www/{BASE_DIR.name}/media'
```

結局MEDIA_ROOTは画像のurlの一部になるもので表示する際に必要となる.
画像をアップロードするだけで終わりならべつに問題はなかったが後からそのurlからパスを取ってきて加工するためには実際に保存する先(MEDIA_ROOT)と同じにしなければならない.

またurlからpathを取得するときは画像のurlとBASE_DIRから成るので以下のようにstr型にcastして結合しなければならない

```python:views.py
from django.conf import settings
path = str(settings.BASE_DIR) + url
```
通貨強弱チャートの見方考え方

# 通貨強弱チャートについてよく質問されるので回答のメモ

自称世界一使いやすい通貨強弱確認ツールを開発しています。
https://fx-labo.app/strength/?t=today

よくtwitterなどで質問をもらうので回答用にメモを残します。

## Question
通貨強弱の計算式は？
単位は？
起点を変えると全然異なるグラフになるのはなぜ？

---
## Answer
計算式は長くなるので割愛
起点となるある時刻からの相対的な変化率です。
移動平均や取引量は一切考慮していない起点の価格とその時点の価格だけの比較です

足し合わせるといつでもゼロになります。
相対的なものなので単位はありません。

## 考え方
ある起点のすべてのペアの値を０として
起点時を
```
ドル円 110円
ユーロ円　120円
ユーロドル　1.00ドル
```
:::
として

次のタイミングで
```
ドル円 100円
ユーロ円　130円
ユーロドル　1.10ドル
```

となっていたとしたら
```
ドル円だけ見ると円高→円強くなった
ユーロ円だけ見ると→円弱くなった
ユーロドルだけ見たると→ユーロが強くなった
```
この場合ざっくりですがドルの一人負けですから

ユーロが +2
円が+1
ドルが -3
みたいな強弱関係になるはずです。
これを8通貨全部混ぜて計算してます。

なので時々　フランとかトレードしないという理由で消して表示させてる人がいるんですが
計算式にはフランも盛り込んでいるので、ちょっと意味合いが変わってしまいます。

単位は？ともよく聞かれるんですが
どの時点でも数値を足し合わせればゼロになるように相対的な数値です


### 起点の話
同業さんたちは日本時間の朝の７時とかを基点にしてるんですが

これに異議を唱えてとにかくいっぱい起点を設定できるようにしたのが
このアプリです。

また起点を変えると、その起点を基準に考えますので
たまたま起点になった時刻が経済指標の発表などで
ローソク足でいうヒゲがビヨーンと伸びた状態だと
他の起点と比較したときにグラフの状態がかなり変わります。

なので必ず３つくらいの起点を切り替えてトレンドを把握することをオススメします。

## 最後に
だらだら記載しましたが。

あまり深く考えずにシンプルにつかっていただければ幸いです。
アプリはこちら
https://fx-labo.app/app/
UE4 Projectileメモ


Projectile
https://www.youtube.com/watch?v=Ol55a7tIzjI

[ UE4 ] LineTraceでの銃の発射処理を3種類ご紹介
https://www.youtube.com/watch?v=MomKtpmvywM

Unreal Engine 4 - Projectile Shooting - Part 29
https://www.youtube.com/watch?v=evk4JuFmMmg
Oracle RACの Dynamic Resource Mastering (DRM) の動作を確認してみた

Oracle DatabaseのRACには Dynamic Resource Mastering (DRM) という機能があります。
Oracle Databaseではデータアクセスする際に該当データをバッファキャッシュ上にキャッシュします。
RACでは複数あるノードのどれか1つにキャッシュされますが、そのキャッシュ先ノードを動的に変更できるのがDRMです。
DRMを使うことで、より対象データにアクセスする頻度が高いノードにキャッシュを移せますので、データ取得の効率が向上します。
英語になりますが詳しくは下記MOSドキュメントを参照ください。
[DRM - Dynamic Resource management (Doc ID 390483.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=390483.1)

ちなみにDRMという略語は Dynamic Re-mastering という機能の略称でも使われていますが、こちらは別物ですのでご注意ください。
Dynamic Re-masteringについては下記がご参考になります。
https://blogs.oracle.com/otnjp/post/tsushima-hakushi-79

とあるきっかけで前者のDRMの動作確認をする機会がありましたので、その際のコマンドとログを残しておきます。

## 環境概要

動作確認した環境の概要は以下の通りです。

+ OS: Oracle Linux 7.9
+ DBバージョン: 19c (19.3)
+ DB構成: 2ノードRAC（CDB構成）

## 確認手順

適当な一般のDBユーザでPDBにログインし、テーブルを作成します。
ノードはどちらでも大丈夫です。

```sql
create table test_easy(col1 number, col2 number, col3 varchar2(20));

begin
for i in 1..10000 loop
insert into test_easy values(i, mod(i,5), 'dummy');
end loop;
end;
/
```

作成したテーブルのオブジェクトIDを確認し、メモしておきます。

```sql
select object_id, owner, object_type from dba_objects where object_name='TEST_EASY' and object_type='TABLE';
```

sysでPDBにログインし、GV$GCSPFMASTER_INFO に問合せてDRMの実行状況を確認します。
この段階では結果は特に何も返ってきません。

```sql
select * from GV$GCSPFMASTER_INFO where DATA_OBJECT_ID=<メモしたオブジェクトID>;
```

ノード2に接続後、sysでPDBにログインして手動でDRMを実行します。
これでノード2がテーブル「test_easy」のキャッシュにおけるマスターとなります。

```sql
oradebug setmypid
oradebug lkdebug -m pkey <メモしたオブジェクトID> 1
```

再度 GV$GCSPFMASTER_INFO に問合せると以下のように返ってきます。
テーブル「test_easy」のキャッシュについて、マスターがノード2上のインスタンスになっていると分かります。

```sql
select * from GV$GCSPFMASTER_INFO where DATA_OBJECT_ID=<メモしたオブジェクトID>;

   INST_ID    FILE_ID DATA_OBJECT_ID GC_MASTERING_PO CURRENT_MASTER PREVIOUS_MASTER REMASTER_CNT ...
---------- ---------- -------------- --------------- -------------- --------------- ------------
         1          0    <object id>        Affinity              2           32767            1
```

ちなみに「PREVIOUS_MASTER」のカラムには今の状態になる直前までマスターだったインスタンスの番号が通常入ります。
ですが対象オブジェクトに対して初めてDRMが実行された場合は、上記のように PREVIOUS_MASTER に「32767」が入るようです。

ここまでDRMの動作状況を GV$GCSPFMASTER_INFO で確認して来ましたが、LMDのトレースファイルからも確認できます。
LMDのトレースファイルでは以下のように表記されます。

```text
---ノード1の場合---
* received DRM start msg from 2 (cnt 1, last 1, rmno 2)
*   (domid 1, numhv 0, addhv 0)
Rcvd DRM(2) AFFINITY Transfer pkey 1.4.4294967295 to 2 objscan 1
...(略)...
End DRM(2) for pkey transfer request(s) from 2

---ノード2の場合---
Begin DRM(2) (active 0)(swin 1) - AFFINITY transfer pkey 1.4.4294967295 to 2 objscan 1 req 0x90599fb0
...(略)...
* End DRM for pkey remastering request(s) (locally requested)
```

以上、簡単ですがDRMの手動実行による動作確認でした。
Outlookのセットアップ画面を表示しない方法



# Outlookのセットアップ画面をスキップしたい
初めてOutlookを起動した際に、メールのセットアップウィザードが始まりますが、スキップする方法を書いてみます。

まずは、

```:ファイル名を指定して実行
outlook.exe /PIM NoEmail
```
してみてください。

それで終わりです。

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/8c85d365-a3c4-a7fc-87cc-65d8236f9fce.png)


# おまけ
このままですと、Outlookを閉じてもう一度起動した際に、またセットアップ画面が表示されてしまいます。

なので、

コントロールパネルのメールのプロファイルの設定を「使用するプロファイルを選択する」をしてください。

![aaa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/f22520eb-d1e3-91b4-f1c0-0cd84411ce3d.png)

すると、
次回起動時に、またセットアップ画面をスキップできます！
が、プロファイルの選択メッセージが表示されますが、我慢してください...
（メール設定すれば、こんなおまけはいらないです。）

![aaa3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/165ee4e2-281d-4dbf-c495-0ee604747854.png)
Specification of Socket Adaptor, No.416, AUTOSAR R21-11(190) CP

Specification of Socket Adaptor, No.416,2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_SocketAdaptor.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

## 用語(terms)

|Term|Description|
|:--|:--|
|ARP |Address Resolution Protocol
|DEM| Diagnostic Event Manager
|DET| Default Error Tracer
|DHCPv4 |Dynamic Host Configuration Protocol
|DHCPv6 |Dynamic Host Configuration Protocol for Internet Protocol Version 6
|DoIP| Diagnostics over IP
|HTTP| HyperText Transfer Protocol
|IANA| Internet Assigned Numbers Authority
|ICMPv4| Internet Control Message Protocol
|ICMPv6 |Internet Control Message Protocol for Internet Protocol Version 6
|IETF| Internet Engineering Task Force
|IP| Internet Protocol
|IPv4 |Internet Protocol version 4
|IPv6 |Internet Protocol version 6
|NDP |Neighbor Discovery Protocol
|Sd| Service Discovery
|TCP |Transmission Control Protocol
|TCP/IP| A family of communication protocols used in computer networks
|TLS| Transport Layer Security
|TP |Transport Protocol
|UDP |User Datagram Protocol
|UdpNm |AUTOSAR UDP Network Management
|AUTOSAR Connector |The SoAd serves as a (De)Multiplexer between different PDU sources/suppliers and the TCP/IP stack as well as between the TCP/IP stack and different PDU sinks/consumers. The term AUTOSAR connector refers to a source/supplier or sink/consumer of a PDU.
|TCP socket connection| A socket connection which uses TCP as transport protocol (choice container SoAdSocketProtocol contains a SoAdSocketTcp subcontainer).
|UDP socket connection |A socket connection which uses UDP as transport protocol (choice container SoAdSocketProtocol contains a SoAdSocketUdp subcontainer).
|IF-PDU |An IF-PDU is a PDU which is sent/received via the IF-API of the SoAd
|TP-PDU| An TP-PDU is a PDU which is send/received via the TP-API of the SoAd

## 英日単語帳
日本語は仮訳

T.B.D.

## 参考(reference)

[1] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[2] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[3] SOME/IP Protocol Specification
AUTOSAR_PRS_SOMEIPProtocol
[4] Specification of PDU Router
AUTOSAR_SWS_PDURouter
[5] Specification of UDP Network Management
AUTOSAR_SWS_UDPNetworkManagement
[6] Specification of Module XCP
AUTOSAR_SWS_XCP
[7] Specification of Service Discovery
AUTOSAR_SWS_ServiceDiscovery
[8] Specification of Diagnostic over IP
AUTOSAR_SWS_DiagnosticOverIP
[9] The Dynamic Host Configuration Protocol (DHCP) Client Fully Qualified Domain
Name (FQDN) Option
https://rfc-editor.org/rfc/rfc4702.txt
[10] The Dynamic Host Configuration Protocol for IPv6 (DHCPv6) Client Fully Qualified
Domain Name (FQDN) Option
https://rfc-editor.org/rfc/rfc4704.txt
輪読会メモ：リーダブルコード（第7~9章）

前回記事：  
[輪読会メモ：リーダブルコード（第1~3章）](https://qiita.com/takumi_links/items/34e98d7dbbe0532a69d1)  
[輪読会メモ：リーダブルコード（第4~6章）](https://qiita.com/takumi_links/items/1d85f91cbaf6ab1c03ec)  
の続きになります。

今回は第7章～第9章まで。
7~9章は、**ループとロジックの単純化**が大きなテーマとなっています。
実装にとても関わってくる章かなと感じました。（**普段の業務に応用できる内容がとても多かった印象です**）

## 第7章：制御フローを読みやすくする
> **条件やループなどの制御フローはできるだけ「自然」にする。コードの読み手が立ち止まったり読み返したりしないように書く。**  
（「リーダブルコード」p.84より）
  - いきなり耳の痛い言葉が舞い込んできました・・・。読み手が立ち止まらずに読めるコードを書いているだろうか。自戒。。

> **7.1 条件式の引数の並び順**  
**左側：「調査対象」の式、変化する / 右側：「比較対象」の式、あまり変化しない**  
（「リーダブルコード」p.84~85より）

```javascript
if (length => 10) 
```
  - 実はこれまで自分自身、あまり統一できてない部分でした。**「調査対象」を左側に、「比較対象」を右側に**、という指針は条件式を書く上で今後徹底します。

> **7.2 if/elseブロックの並び順**  
**条件は否定形よりも肯定形を使う。**  
**単純な条件を先に書く。**  
**関心を引く条件や目立つ条件を先に書く。**  
（「リーダブルコード」p.86~88より）
- 並び順もこれまではあまり意識できてなかったなーと反省。特に、「**条件は否定形よりも肯定形を使う。**」は特に使えてなかったので今後注意。

```php
// 自分がよく書いてるコード
if (!empty($value)) {
    // 空じゃなかったら
} else {
    // 空だったら
}

// こっちのほうがよい
if (empty($value)) {
    // 空
} else {
    // 空じゃなかったら
}
```

> **7.3 三項演算子**  
**基本的にはif/elseを使おう。三項演算子はそれによって簡潔になるときにだけ使おう。**  
（「リーダブルコード」p.88~89より）
- 行数を短くできればもちろん素晴らしいが、何よりも大事なのは「**他の人が理解するのにかかる時間を短くする**」こと。分かりやすいコードを書くように心がける。

> **7.5 関数から早く返す**  
（「リーダブルコード」p.91~92より）
- 「**関数で複数のreturn文を使ってはいけないと思っている人がいる**」←これ、結構いるみたい。自分は早期リターンを多用するんですが、早期リターンを書くのが怖い（というか、慣れてないだけ）のプログラマーも多そう。
  - 関数から早く返すことは悪くない、というのをレビュー時等に教えていこう。

> **7.7 ネストを浅くする**  
（「リーダブルコード」p.93~96より）
- ネストの深いコードを読むのは辛い・・・**ネストが3段階を超えたら**何かおかしいなぁ・・・と判断するぐらいがいいかもしれない。

## 第8章：巨大な式を分割する
> **巨大な式は飲み込みやすい大きさに分割する。**  
**8.1 説明変数**  
**式の意味を説明する**  
（「リーダブルコード」p.100より）
- 式の意味を表す変数を定義してあげると、読み手の理解が早い
```java
// 更新対象の商材情報を取得
Optional<ProductDto> optProductDto =
  productGetService.getProductById(productId);

// 商材名を取得
String productName = optProductDto.isPresent()
  ? StringUtils.defaultString(optProductDto.get().getName())
  : "";
```

## 第9章：変数と読みやすさ
> **9-1. 変数を削除する**  
**breakが使えないようなネストが何段階もあるループでは、コード（ループの内部のコードやループ全体）を新しい関数に移動するといい。**  
（「リーダブルコード」p.112~115より）
- バッチ処理を実装することが多いのだが、色々なデータをループ回しがちでネストが深くなりやすい。ループ内のロジックは関数側に書くなど工夫したい。

> **9-2. 変数のスコープを縮める**  
（「リーダブルコード」p.115~122より）
- すべての変数のスコープを縮める
  - 変数を定義した位置からなるべく離れずに使うのが保守性向上にはよい。（基準としては定義したい位置から数行：5行ぐらい？）もし定義位置から使う箇所が大きく離れてしまったら、ロジックを再考したいほうがよさそう。
  - 大きいバッチ処理の実装等していると、遠いところに宣言した変数を参照しがち・・・。変数位置が遠いと、変数の内容を覚えておく必要があるので大変。
- **大きなクラスを小さなクラスに分割する**
  - 「データを分割する」意識をもって、ロジックを作る前にデータのモデリングをしたほうがいいかもしれない。考えながら作ると、巨大なクラスになりがち。。

> **9-3. 変数は一度だけ書き込む**  
（「リーダブルコード」p.123~124より）
- 基本的には変数は変更不可（**イミュータブル**）であるべき。
- 早期リターンは怖くない。最後まで無駄なロジックを引っ張るぐらいなら、早めにリターンしちゃえ。

## 第7~9章 まとめ
業務システムを開発する際には複雑なビジネスロジックを組むことが多くあります。その中にはたくさんの制御フローが入ってきます。  

たくさんの制御フローがあると、どうしてもコードが読みにくくなりがち・・・。

「処理を分割したり、変数のスコープを意識したり・・・」と最低限のことは意識してきたつもりでしたが、常に意識してコードを書いてきたかと言われると自信がなくなってきます。

今回、リーダブルコードを改めて読み直し、読みやすいコードを書く上で大切なことを明文化できているなぁという実感があります。  

一通り読み終えたら、今回の読書メモを簡略化してまとめて、自分用の「**コーティングの際に気を付けることリスト**」を作ろうと思います。
VBA_06_Dictionary_Collection_DynamicArray_Sample

Keyword
---

Dictionary
Variant
Collection
Dynamic Array
Redim
Join

Sample Code
---
```vb:２つリストを比較し、一致しないものを取得
Public Sub MySample20220527()
    Dim mySheet As Worksheet
    Dim myArrList As Variant
    Dim i As Long: Dim j As Long: Dim myNoDataCnt As Long
    Dim myAllDataList As New Dictionary: Dim myTargetList As New Dictionary
    Dim myKey As Variant
    Dim myNotSameFileList As New Collection
    Dim myOutputList() As String
    
    Set mySheet = ThisWorkbook.ActiveSheet
    myArrList = mySheet.UsedRange
    
    myNoDataCnt = 2
    
    For i = LBound(myArrList, 1) + myNoDataCnt To UBound(myArrList, 1)
        If Not myAllDataList.Exists(myArrList(i, 2)) Then
            If myArrList(i, 2) <> "" Then
                myAllDataList.Add myArrList(i, 2), myArrList(i, 1)
            End If
        End If

        If Not myTargetList.Exists(myArrList(i, 5)) Then
            If myArrList(i, 5) <> "" Then
                myTargetList.Add myArrList(i, 5), myArrList(i, 4)
            End If
        End If
    Next i
    
    For Each myKey In myTargetList.Keys
        
        If Not myAllDataList.Exists(myKey) Then
            myNotSameFileList.Add myKey
        End If
    Next
    
    ReDim myOutputList(myNotSameFileList.Count - 1) As String
    
    For j = 1 To myNotSameFileList.Count
        myOutputList(j - 1) = myNotSameFileList.Item(j)
    Next j
    
    Debug.Print Join(myOutputList, ",")
End Sub
```
Sample Data
---
![無題6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672288/69aa1e4a-f23b-2b34-d259-f702332f0e3e.jpeg)
SPSS Modelerでフィールド名が異なるデータの結合や不等号条件での結合

一般的には、SPSS Modelerではフィールド名が異なるデータの結合をする場合、フィルターノードでどちらかの列名に合わせてからレコードノードで結合します。

例えば以下のようなデータがあった場合、左のデータは「ID]と右のデータは「ユーザーID」となっていて列名が異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d1752e7-e8ef-20db-3ab4-56a634262a4b.png)

このような場合は、フィルターノードでどちらかの列名に合わせます。この例では「ユーザーID」を「ID」に変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/34bbbad6-f14e-420a-005c-5938d4b4c983.png)

そして、レコード結合ノードで、レコード結合方法に「キー」を選び、結合キーに合わせた列を指定します。この例では「ID」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fb8fb675-70e7-78d8-4284-d90a45480249.png)

ただ、レコード結合方法を「条件」にすると条件文を書けますので、列名が違っていても指定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c2a510ec-5399-a4bc-32d5-17c91aa179a6.png)

しかしながら、結合したい表が3つ以上あったり、あとで順番を入れ替えたりするとややこしくなるので、一般的にはフィルターノードでどちらかの列名にあわせることを推奨します。


なお、レコード結合方法を「条件」には不等号や関数も使えますので、そういう特殊な結合の場合には活用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5de3cecb-df08-37e5-ea77-2b705d70b34f.png)

ID >= ユーザーIDという条件ですと、以下のような結合結果になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7913e2b2-8894-4a73-7100-75fe18b46598.png)

* テスト環境
Modeler 18.3
Windows 10 64bit

# サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/220527%E3%83%87%E3%83%BC%E3%82%BF%E7%B5%90%E5%90%88/%E3%83%87%E3%83%BC%E3%82%BF%E7%B5%90%E5%90%88.str
Requirements on SPI Handler/Driver, No.77, AUTOSAR R21-11(186) CP

Requirements on SPI Handler/Driver, No.77, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_SPIHandlerDriver.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|CS| Chip Select
|DIO |Digital Input Output
|ECU |Electric Control Unit
|DMA |Direct Memory Access
|ICU| Input Capture Unit
|MAL| Old name of Microcontroller Abstraction Layer (replaced by MCAL because ‘MAL’ is a french term meaning ‘bad’)
|MCAL| MicroController Abstraction Layer
|MCU |MicroController Unit
|MISO|Master Input Slave Output
|MMU |Memory Management Unit
|MOSI |Master Output Slave Input
|Master |A device controlling other devices (slaves, see below)
|Slave| A device being completely controlled by a master device
|NMI |Non Maskable Interrupt
|OS| Operating System
|PLL| Phase Locked Loop
|PWM |Pulse Width Modulation
|RX |Reception (in the context of bus communication)
|SPAL |The name of this working group
|SFR |Special Function Register
|RTE |RunTime Environment
|STD| Standard
|REQ |Requirement
|UNINIT| Uninitialized (= not initialized)
|Channel |A Channel is a software exchange medium for data that are defined with the same criteria: Config. Parameters, Number of Data elements with same size and data pointers (Source & Destination) or location.
|Job |A Job is composed of one or several Channels with the same Chip Select (is not released during the processing of Job). A Job is considered atomic and therefore cannot be interrupted by another Job. A Job has an assigned priority.
|Sequence |A Sequence is a number of consecutive Jobs to transmit but it can be rescheduled ⌋()between Jobs using a priority mechanism. A Sequence transmission is interruptible (by another Sequence transmission) or not depending on a static configuration.

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
PostgreSQL vs MySQL: その違いとは

MySQL と PostgreSQL は多くの同じ機能と特徴を備えていますが、この2つのリレーショナルデータベース管理システム（RDBMS）には無視できない決定的な違いがあります。

これらの違いについてよくご存じない方のために、簡単に概要を説明します：

+ MySQL は読み取り専用のコマンドを管理するのに適しています。MySQLは読み取り専用のコマンドを管理するのに適しています。
+ PostgreSQLは、読み書き操作、大きなデータセット、複雑なクエリを管理するのに適しています。PostgreSQLは、読み書き操作や複雑なクエリを管理するのに適していますが、読み取り専用操作には適していません。
+ MySQLはPostgreSQLよりも少ない機能しか提供しませんが、そのおかげでMySQLは軽量で安定性が高く、処理速度が速いのです。
+ PostgreSQLは最初からACIDに準拠するように構築されており、同時実行トランザクション（MVCC）が必要な場合に最適ですが、読み取り専用操作に関しては遅く、安定性に欠けます。
+ MySQLはさまざまなタイプのデータストレージエンジンと高い互換性を持っています。一方、PostgreSQLは多くの異なるNoSQLフォーマットと高い互換性を持っています。

このガイドでは、各データベースシステムの簡単な歴史と概要を説明します。また、MySQLとPostgreSQLの決定的な相違点と類似点、そして使用ケースによってどちらが最適かを紹介します。

| 機能の比較 | MySQL | PostgreSQL |
|:-:|:-:|:-:|
|  **ORDBMSとRDBMSの比較** | リレーショナルデータベース管理システム(RDBMS)  | オブジェクトリレーショナルデータベース管理システム(ORDBMS) |
|  **ACIDコンプライアンス** | ほとんどのエンジンはACIDコンプライアンスを提供しているが、MyISAMはACIDをサポートしていない。 | 完全サポート  |
|  **バックアップとリカバリ** | バックアップとリカバリ機能を提供  | 効率的なバックアップとリカバリ機能でよく知られている  |
|  **クロスプラットフォーム** | 対応  | UNIXベースのシステムに最適  |
|  **拡張機能とプラグイン** | 多数あり  | 拡張性で有名なPostGISなど  |
|  **外部キー** | サポートされているが、MyISAMではサポートされていない。  | 完全サポート  |
|  **インデックス作成テクニック** | 様々なテクニックが利用可能標  | GINやGiSTのような高度な型を提供  |
|  **SQLデータ型** | 準的な型が利用可能  | より多様で、配列、hstoreを含む  |
|  **ストアドプロシージャ** | サポートあり  | PL/pgでより高度にSQL言語トリガー  |
|  **トリガービュー** | サポートあり  | 柔軟な多言語サポート  |
|  **ビュー** | サポートあり  | マテリアライズド・ビュー  |

| ユースケース | MySQL | PostgreSQL |
|:-:|:-:|:-:|
|  **ウェブアプリケーション** | スピードと信頼性で広く知られている  | 特に複雑なユースケースで人気上昇中 |
|  **。。。** | 。。。  | 。。。 |

**目次**

+ 基本： PostgreSQLとMySQLの概要
+ 同じ、同じ、でも違う： MySQLとPostgreSQLの共通点（そしてユニークな点）は？
+ PostgreSQLよりMySQLを使用する場合、またその逆は?
+ PostgreSQLのユーザー・サポートとMySQLのユーザー・サポート
+ PostgreSQLのスピードとMySQLのスピード：どちらが速いか？
+ PostgreSQLとMySQLはどのプログラミング言語をサポートしていますか?
+ PostgreSQLとMySQLはどのオペレーティング・システムで動作しますか?
+ PostgreSQLのインデックスとMySQLのインデックス： どのようにインデックスを作成するのか?
+ PostgreSQLとMySQLのコーディングの違いは?
+ 2020年以降のPostgreSQLとMySQLの最新動向
+ 記事の概要

基本： PostgreSQL と MySQL の概要。。。

**本ブログの続きは以下のリンクからご覧ください。**
[PostgreSQLとMySQLの決定的な違い
](https://www.integrate.io/jp/blog/postgresql-vs-mysql-which-one-is-better-for-your-use-case-ja/ "Integrate.io")
railsのアプリを作成　バリデーション、フラッシュメッセージ

# User関係の処理出忘れていたところ
ユーザーの新規登録、ログイン、一覧、詳細ページ、または機能を追加できた。
しかしまだなくなっているものがある。
プロゲートを参考にしている。
それは
・バリデーションをかける
・フラッシュメッセージをつける
・例外処理をする
・エラーメッセージを表示させる

・ユーザー画像を設定する
・session[:user_id]を使いログイン中にさせる。
・条件分岐で表示内容を変える


まずuserモデルのバリデーションをかけよう。

## バリデーションをかける
```user.rb
class User < ApplicationRecord
  validate :name, {presence: true}
end
```
こんな感じかな？
見てみよう。
```user.rb
class User < ApplicationRecord
  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness:true}
  validates :password, {presence: true, uniqueness:true}
end
```
何かパスワードは何かあったような気がするが今はどうでもいい。
後でする。

## rails consoleで確かめてみよう
```
irb(main):001:0> user = User.new
=> #<User:0x000000011347f400 id: nil, name: nil, email: nil, passwo...
irb(main):002:0> user.save
  TRANSACTION (0.3ms)  BEGIN
  User Exists? (0.5ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` IS NULL LIMIT 1
  User Exists? (0.5ms)  SELECT 1 AS one FROM `users` WHERE `users`.`password` IS NULL LIMIT 1
  TRANSACTION (0.3ms)  ROLLBACK
=> false
```
これでfalseになっている。

# フラッシュメッセージをつける
```users_controller.rb
.
.
.
  def update
    @user = User.find_by(id: params[:id])
    @user.name = params[:name]
    @user.email = params[:email]
    @user.password = params[:password]
    if @user.save
      flash[:notice] = "更新されました。"
      redirect_to "/users/#{@user.id}"
    else
      render "users/edit"
    end
  end
.
.
.
```
```application.html
.
.
.
    </header>

    <% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
    <% end %>
    <%= yield %>
.
.
.
```
これで表示される。
Next.js の使い方 css (Typescript)

こちらで行ったのと同じことを　Typescript で行いました。
[Next.js の使い方 css](https://qiita.com/ekzemplaro/items/c6b498e5dca19973efbb)

## プロジェクトの作成 ##

```bash
yarn create next-app blog-type --typescript
```

## ソースの作成 ##

フォルダー構造

```text
$ tree -I node_modules/
.
├── README.md
├── components
│   ├── layout.module.css
│   └── layout.tsx
├── next-env.d.ts
├── next.config.js
├── package.json
├── pages
│   ├── _app.tsx
│   ├── api
│   │   └── hello.ts
│   ├── index.tsx
│   └── posts
│       └── first-post.tsx
├── public
│   ├── favicon.ico
│   ├── images
│   │   └── profile.jpg
│   └── vercel.svg
├── styles
│   ├── Home.module.css
│   ├── globals.css
│   └── utils.module.css
├── tsconfig.json
└── yarn.lock
```

次のものは、[Next.js の使い方 css](https://qiita.com/ekzemplaro/items/c6b498e5dca19973efbb)のファイル名を変更したものです。

pages/index.tsx  <- pages/index.js
pages/posts/first-post.tsx <- pages/posts/first-post.js
components/layout.tsx <- components/layout.js

次のファイルは、[Next.js の使い方 css](https://qiita.com/ekzemplaro/items/c6b498e5dca19973efbb)　と同じです。
components/layout.module.css
styles/globals.css
styles/utils.module.css

public/images/profile.jpg
は、何か、jpg ファイルを入れてください。

## サーバーの起動 ##

```bash
yarn dev
```

ブラウザーで
http://localhost:3000/
にアクセス
【まったりShopifyアプリ紹介】ShopifyでLP作成するアプリを紹介する

## はじめに
おはようございます！
最近、ShopifyにてLPの制作をする機会がありまして、その際にいろいろなアプリを試しに導入・運用しました。
この記事では、ShopifyにてLPを作成するための方法をまったりと紹介していきたいと思います。
早速行ってみましょう。

## LPって何？
そもそもLPとはなんぞやって方もいるかもなので、そこから解説。
今回想定しているLPの意味は以下の通りです。

> 訪問者のアクションを誘導することに特化した縦長のレイアウトのページのこと

訪問者のアクションと言っても色々ありますが、主に紹介している商品を購入していただくことを目的としていることが多いです。
最近では、このLPと呼ばれるものが世の中にたくさんあります。

例えば、Appleの新型デバイスの紹介用サイトとかはLPです。
AppleのLPは、デザイン性抜群でとてもおしゃれなので購買意欲が湧き上がってきます。

以下の記事を参考にしました。

https://ds-b.jp/media/pages/123/

## ShopifyでLPを作成することのメリット
ShopifyはECサイトを構築するためのプラットフォームになります。
Shopify自体が世界的に勢いを増しているサービスになります。これから、ECサイトを構築するなら基本Shopifyを使用する形になるだろうと考えています。
ECサイトは、ネット上で商品を販売するためのサイトのことなのでLPとの親和性が高い気がします。
商品紹介を読んで、購入というアクションまでの一連のフローを妨げる要素がありませんからね。

## LP作成に使用したアプリの紹介
ShopifyにECサイトを構築するとなると、やはりShopifyの幅広い知識や技術が必要になってきます。
Shopify自体、ノーコードでストアの見た目を作成できるのである程度カスタマイズ性はありますが、細かいデザインの修正ができなかったりでしたり、テーマに備わっていないセクションは使用できないんですよね...。
それなりに高度なカスタマイズをしようと思うと、やはりHTMLやCSS,Liquid（Shopfiy独自言語）の技術が必要になってきます。

流石に、そう言った技術を身につけるのは障壁が高いですし、簡単に自分の目的の見た目を再現できるならその方がいいですよね。
そこで、手軽にLPを制作するためのアプリがないのか調査してみたところ、何個かアプリがありましたので紹介しようと思います。

- LayoutHub ‑ Easy Page Builder
- PageFlyランディングページ構築
- らくらく画像ランディングページ | リテリア Easy LP

それぞれのメリット・デメリットを挙げたいと思います。

### らくらく画像ランディングページ | リテリア Easy LP
個人的におすすめしたいのがこちらのアプリになります。

https://apps.shopify.com/easy-lp-20220306?locale=jafrom=qiita

**メリット**

- 完全日本語対応している
- さまざまなセクションを提供してくれているため、カスタマイズ性に優れる
- 基本的には、テーマエディタ側での操作になるためShopifyのストアカスタマイズに慣れている人なら誰でも使える使用
- サポートも迅速で、完全日本語対応しているので個人的にはありがたかった

以下のようなLPがノーコードで簡単に作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392019/3aa0ee97-7f6c-4ba4-a7b2-f96521147903.png)

### LayoutHub ‑ Easy Page Builder
**メリット**

- 多彩なレイアウト・セクションが使用できるのでカスタマイズ性に優れる
- 3ページまでなら無料でLP作成できるみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392019/c8017eec-9fdb-2ee3-d068-8ea270711e5e.png)

**デメリット**
- 商品数が多く、商品詳細ページごとに表示変えたいみたいな場合は、料金が結構かかりそう
- 管理画面が日本語対応していない

### PageFlyランディングページ構築
**メリット**
- さまざまなレイアウト・セクションを使用できるのでカスタマイズ性に優れる
- 独自のエディタにてレイアウトの構成を作成することも可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392019/ec27070a-7de7-e2ca-3554-861fc8291033.png)

**デメリット**
- 管理画面が日本語対応しきれていないため、操作に課題感あり

## 終わりに
以上で、ShopifyにてLP制作する方法のご紹介終了です。
以下のURLより、アプリのインストールを行うことができます。

お疲れ様でした。

https://apps.shopify.com/easy-lp-20220306?locale=jafrom=qiita
RailsでSVG、SVGスプライトを使う

# はじめに
SVG形式のアイコンや画像をRailsで使う際の一例を紹介します。
アプリ内に保存したSVGファイルからSVGスプライトを作り、HTMLで読み込む方法になります。
PNG等ではなくSVGを使うメリットについては、他の記事等を参考にしてください。

:::note
環境
Mac OS Catalina 10.15.7
ruby 2.6.5
Rails 6.0.5
bundler 2.3.13
node 12.16.1
yarn 1.22.18
webpack-dev-server 3.11.2
:::

# SVGファイルの保存
`app/assets/images/svg/`内にSVGファイルを保存します。
今回はアイコンで試していきます。


FontAwesome6の場合:
右上のアイコンから、SVG形式でダウンロードできます。
Copy SVG Codeからコードだけコピーして好きな名前のSVGファイルとして保存してもOKです。
![Search___Font_Awesome.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/2274b121-3d3e-5d9b-0e68-9b54814bc33d.jpeg)


IcoMoonの場合:
欲しいアイコンを選択して、左下の「Generate SVG & More」からダウンロードできます。
Zip形式で、PNGなどもついてくるので、解凍してSVGディレクトリ内のSVGファイルをアプリ内に保存します。
![IcoMoon_App_-_Icon_Font__SVG__PDF___PNG_Generator.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/be640a01-9f90-9e30-67cb-d7b5aa8aedd0.jpeg)

# SVGスプライトを作成する
変換用のGemをインストールします。

```rb:Gemfile
gem 'svgeez', '~> 4.1'
```

`app/assets/images/svg`内のSVGを
`app/assets/images/icons.svg`として変換します。

```bash
$ bundle install
$ bundle exec svgeez build --source app/assets/images/svg --destination app/assets/images/icons.svg

=> Generating sprite at `/Users/tanakashun/Desktop/study/awesome_events/app/assets/images/icons.svg` from 5 SVGs...
Successfully generated sprite at `/Users/tanakashun/Desktop/study/awesome_events/app/assets/images/icons.svg`.

# --source と --destination はそれぞれ -s と -d と省略して書けます
```

`app/assets/images/icons.svg`というSVGスプライトが出来上がりました。

# SVGファイルの表示
bodyタグ内の最後にこれを読み込む記述をします。
erbではなくhamlで書いています。
```rb:application.html.haml
= raw Rails.application.assets_manifest.find_sources('icons.svg').first`
```

`mic.svg`という名前のsvgファイルを表示したいときは、先頭に`#icons-'をつけて以下のように書きます。

```haml
%svg
  %use(xlink:href="#icons-mic")
```

クラス名をつけて、CSSでデザインを調整したい場合は以下のように書けます。
```haml:haml
%svg.icons-mic
  %use(xlink:href="#icons-mic")

(#viewBoxを使う場合は以下のように書けます。viewBoxについてはこの記事では扱いません。)
%svg.icons-mic{width: "32", height: "32", viewBox: "0, 0, 32, 32"}
  %use(xlink:href="#icons-mic")
```

```css:css
.icons-mic {
  fill: blue; #塗り潰しの色
  stroke: red; #境界線の色
}

```
cssの書き方は以下の記事が参考になりました。

https://qiita.com/yamamiweb/items/011d6b264a5af568783b#html%E4%B8%AD%E3%81%AB%E7%9B%B4%E6%8E%A5svg%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A8%98%E8%BF%B0
【UiPath】入力モードの違い

# はじめに

この投稿は、RPAツール「UiPath」の 入力モード／メソッド について「個人的に」まとめたものです。


# 入力モード／入力メソッドとは？

ロボットが、`アプリケーションや Web ページの入力項目を操作する方法` です。実際のアクティビティでは、以下の画像のように「プルダウン」から選択できます。選択肢の種類は

- ハードウェア イベント
- シュミレート
- Chromium API
- ウィンドウメッセージ

の4種類があります。

以下は「モダンデザイン」のアクティビティでのプロパティ画面のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/f68eb817-a804-71ec-e8ca-385aae7ea925.png)

※ アプリ/ブラウザーと同一 は「プロジェクト設定画面」で上記の４つから選択したものを使用します




# 違い・使い分け

UiPath の公式サイトでは、以下のように説明されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/58d62153-6bd1-1598-c68a-819a73c9d61d.png)

https://docs.uipath.com/studio/lang-ja/docs/input-methods

表で分かりやすいのですが、それぞれ「`どう動いているのか？`」がイメージしにくい。

と思って、公式サイトを探すと 以下の図がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/f9ca2d89-050a-0554-7857-9a1f9b66984c.png)

https://docs.uipath.com/studio/lang-ja/v2019/docs/ui-automation

なんとなく分かります。でも、表と一緒に説明してくれれば、もっと分かりやすいのに。

# 説明付きの図にしてみる

ということで、公式サイトに書かれた情報をもとに、イメージがしやすい図にしました。ちょっと情報が多いですが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/8c498c95-13e6-4807-07bb-1c1c3be38124.png)

※ ハードウェア イベントは Driver を操作するのではなく、Driver と同じ事をするイメージと思ってください。

基本的に、

- 動くなら「シミュレート」が一番優先（早いし、画面操作の影響を受けない）
- 次に「ウインドウメッセージ」を試す（少し遅いけど、画面操作の影響を受けない）
- 上記でダメなら「ハードウェアイベント」で妥協（遅いし、画面操作の影響を受けるけど）
- ChromiumAPI は、アクティビティが古いと動かないこともあるかも（未確認）

という観点で使用します。

もちろん「動けば良い」「こっちのほうが好きだ」などのプロジェクト方針もあると思うので、絶対ではありませんが。。。


# Chromium API

Chromium API は version2021.10 で登場した機能で、Chromium ベースのブラウザー ＝ Microsoft Edge ・Google Chrome を  DevTools Protocol を使用して、ブラウザをAPI操作します。

モダンデザインのアクティビティで使用できます。（クラシックデザインでは使用できません）

入力が一番確実で、画面フォーカスの影響も受けない、信頼性の高い入力方法です。

が、まだ新しい機能なので、古いバージョンでは動かないこともあるかもしれません。（v021.10 で試したら動かないことも有りました）

https://docs.uipath.com/studio/lang-ja/docs/chromium-api


# 終わりに

以上、入力モードの違いについて、でした。なにかの役に立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
tailコマンドとかでも強調表示する自作コマンド

とりあえずこれで！って書いただけなんで、処理速度とか気になる人いたら改善案くださいな！

## 結論

結論から書くよ！

```bash
highlight=""
i=0
for I; do
  i=`expr $i + 1`
  highlight+="-e s@\(${I}\)@\x1b[1;3${i}m\1\x1b[0m@g "
done
sed $highlight
```

このスクリプトを```/usr/local/bin/hl```とかに置いて、
実行権限を与えて（```chmod +x /usr/local/bin/hl```）、
こんな風に使う```# tail -f /var/log/hoge.log | hl INFO DEBUG```
するとこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/4c5bb473-d7ef-c92e-c36f-9528afb70e3e.png)

## 説明

ざっくり説明すると、以下です。
#### hl という名前
強調表示！→　high light　略称で hlにした！好きな名前にしたらいいよ！

#### \x1b[1;3${i}m\1\x1b[0m という呪文

```\x1b``` => ESCを指す
```\x1b[``` => ESC[ => 画面出力の制御 CSIシーケンスと呼ばれています。
```1;``` => セミコロンで複数命令可能で、1;は太字を指します。
```3${i}m``` => 3${i}は31,32...となりますが、3は文字色を指定するよ。そのあとは色指定です。mは命令の終了。
```\1``` => sedでHITした文字列が入る。
```\xib[0m``` => ESC[0m => 画面出力の制御命令0、つまり終了を意味する。

繋げるとこういう呪文です。
**「画面出力制御の命令を告げる！出力は太字にせよ！文字色は1個目は赤っぽく、2個目は緑っぽく...！命令は以上！
とりま送られてきた文字列を出力せよ！さっき言った命令はここで終了とする！」**

色とか強調表示の参考は以下とかみてね。自由にカスタマイズしちゃってくださいね！
参考URL：　https://www.serendip.ws/archives/4635
rubyのsort_byを用いた複数条件下のおけるソート方法

## 複数条件下でソートさせる方法

`sort_by`を使うことで簡単に実現できる。

以下の例の場合、まず`val2`で昇順ソートした後に`val1`で昇順ソートされる。

```ruby
sorted_array = array.sort_by do |val1,val2|
  [val1,val2]  
end  
```
また、降順ソートをしたい場合は、`-`をつけるだけでいい。
（負の数でソートすれば順番は逆になるため）
```ruby
sorted_array = array.sort_by do |val1,val2|
  [-val1,val2]  
end  
```
この例だと、まず`val2`で昇順ソートされ、次に`val1`で降順ソートされる。
ただし、文字列は降順ソートできない（負の値という概念がないため）

## 実行結果

```ruby
[1] pry(main)> array = [[2,"test2"],[1, "test2"], [3, "test1"]]
=> [[2, "test2"], [1, "test2"], [3, "test1"]]

[2] pry(main)> sorted_array = array.sort_by do |id,name|
[2] pry(main)*   [id,name]  
[2] pry(main)* end  
=> [[1, "test2"], [2, "test2"], [3, "test1"]]

[3] pry(main)> sorted_array = array.sort_by do |id,name|
[3] pry(main)*   [name,id]  
[3] pry(main)* end  
=> [[3, "test1"], [1, "test2"], [2, "test2"]]

[4] pry(main)> sorted_array = array.sort_by do |id,name|
[4] pry(main)*   [-id,name]  
[4] pry(main)* end  
=> [[3, "test1"], [2, "test2"], [1, "test2"]]
```

## おまけ
ちなみに`sort`を使う方法もあるが、`sort_by`の方がわかりやすいかつ高速なため、`sort`を使う機会はほとんどない。

以下のリンク先のコードによると、
https://github.com/fastruby/fast-ruby/blob/master/code/enumerable/sort-vs-sort_by.rb

```ruby
def fastest
  ARRAY.sort_by(&:name)
end

def faster
  ARRAY.sort_by { |element| element.name }
end

def slow
  ARRAY.sort { |a, b| a.name <=> b.name }
end
```
という順番らしい。

複雑なソートをしない場合でもsort_byを使ったほうがよい。

## 参考文献
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/sort_by.html
https://github.com/fastruby/fast-ruby/blob/master/code/enumerable/sort-vs-sort_by.rb
【AWS】VPC内のEC2インスタンスから外部FTPサーバへ通信したい時のポート設定 

# はじめに
あるVPC内のPrivateサブネットにあるEC2インスタンスから同VPC内のPublicサブネットにあるNATゲートウェイを経由して外部FTPサーバへパッシブモードで通信させる際に行った、セキュリティグループやネットワークACLの設定を備忘として残しておきます。

# FTPについて
FTPでは2つのTCPコネクション「**コントロールコネクション（制御用）**」と、「**データコネクション（データ転送用）**」を使ってファイル転送を行っています。
また、FTPの通信には、サーバからクライアントに対して接続要求を行う「**アクティブモード**」と、クライアントからサーバに対して接続要求を行う「**パッシブモード**」の2パターンがあります。

FTPがアクティブモードの場合、 以下のポートが使用されます。（今回の設定では対象外）
>・コントロールコネクション（制御用）：21番ポート
>・データコネクション（データ転送用）：20番ポート

FTPがパッシブモードの場合、 以下のポートが使用されます。
>・コントロールコネクション（制御用）：21番ポート
>・データコネクション（データ転送用）：エフェメラルポート（ダイナミックポート）

# パッシブモードでの通信の流れ
**【コントロールコネクション】**
EC2はFTPサーバの21番ポートに接続し、戻りの通信はEC2のエフェメラルポートに返ってきます。

**【データコネクション】**
EC2はFTPサーバのエフェメラルポートに接続し、戻りの通信もEC2のエフェメラルポートに返ってきます。

# セキュリティグループとネットワークACLの設定
今回行う設定は以下になります。（VPC内の構成によって変わります。）

### EC2（FTPクライアント）のセキュリティグループ
**【アウトバウンド】**
>FTPサーバの21番ポートへの通信許可
>FTPサーバのエフェメラルポート（1024 - 65535）への通信許可

:::note info
セキュリティグループはステートフルです。インスタンスからリクエストを送信する場合、そのリクエストのレスポンストラフィックは、インバウンドセキュリティグループのルールにかかわらず、流れることができます。許可されたインバウンドトラフィックに対する応答（戻りのトラフィック）は、アウトバウンドルールにかかわらずアウト側に対し通過することができます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html
:::

### EC2（FTPクライアント）があるPrivateサブネットのネットワークACL
**【インバウンド】**
>FTPサーバからエフェメラルポート（1024 - 65535）への通信許可

**【アウトバウンド】**
>FTPサーバの21番ポートへの通信許可
>FTPサーバのエフェメラルポート（1024 - 65535）への通信許可

### NATゲートウェイがあるPublicサブネットのネットワークACL ###
**【インバウンド】**
>EC2（FTPクライアント）から21番ポートへの通信許可
>EC2（FTPクライアント）からエフェメラルポート（1024 - 65535）への通信許可
>FTPサーバからエフェメラルポート（1024 - 65535）への通信許可

**【アウトバウンド】**
>FTPサーバの21番ポートへの通信許可
>FTPサーバのエフェメラルポート（1024 - 65535）への通信許可
>EC2（FTPクライアント）のエフェメラルポート（1024 - 65535）への通信許可

# さいごに
エフェメラルポートの範囲は狭めておくのがベター
Python + SeleniumWebDriver で不要な文字の出力を抑制する方法

[参考記事]
Python+SeleniumWebDriverではwebdriver_managerを使うといちいちdriverのexeを置き換えなくて済む
https://qiita.com/YoshikiIto/items/000f241f6d917178981c

この記事を見てwebdriver_managerを使ってみたところ大変便利だったのですが、

```
[WDM] - ====== WebDriver manager ======
[WDM] - Could not get version for google-chrome. Is google-chrome installed?
[WDM] - Get LATEST chromedriver version for None google-chrome
...
```

といったinfoの表示が少し鬱陶しかったので消しました。

この出力が出てくるようにどこが設定しているのかというと、
webdriver_manager\core\logger.py 内の

```python:logger.py
__logger.setLevel(wdm_log_level())
```

の部分です。ここからコールされたwebdriver_manager\core\config.py内のwdm_log_level()がログレベルを設定していますが、この中の

```python:config.py
default_level = 20
```

がログレベルをlogging.INFOに設定することを意味しています。
このdefault_levelの設定を30(WARNING相当)に変えるなどすればwebdriver_managerのinfo出力を消すことができます。
GithubにGitでプッシュしたらアカウントが違う

# GithubにGitでプッシュしたらアカウントが違ったときの対処法

Githubと同じ名前のGitユーザーを使ってコミットやプッシュをしたところ、期待したGithubのアカウントではコミット等できていませんでした。
私が解決したやり方を書き残してきます。

## 問題

### 状態

問題が起きたのは下記の状態の時でした。

```
Githubのユーザー名 : foo
Githubのメールアドレス: bar@mail.com
Gitに設定したユーザー名 : foo
Gitに設定したメールアドレス : なし
```

この状態で下記の手順を実行します。

1. リモートリポジトリをクローンします。
2. クローンしたローカルリポジトリ内にファイルを作成します。
3. ローカルのリポジトリにコミットします。
4. リモートリポジトリにプッシュします。

### 現象

リモートリポジトリのGithub上のコミット履歴を見ると、コミットしたアカウントが自分のものではありませんでした。
より詳しく言うと、コミット者のアカウント名は、先述したGithubとGitのユーザー名と同一のfooという名前ではあります。しかし、アカウントページを観ようとするとどうやらアカウントページが存在しないようでした。

## 解決

ローカルのリポジトリのディレクトリ内で下記のコマンドを実行します。
`git config user.email "bar@mail.com"`

その後に先ほどの手順の前まで戻し作業をしてから、再度同じ手順を行います。
そうすると、自分のアカウント(先述したGithubアカウントfoo)にてコミットされていることを、Github上で確認できます。

## 原因

原因は、ローカルリポジトリにてgitの設定でuser.emailを設定していなかったことでした。
Githubは、gitユーザーのEmail設定を用いて、Githubアカウントと紐づけているようです。
ユーザー名では紐づけを行っていないようです(確か両方とも一意の名前をサインアップ時に求められた気がします。なのでまだ少し理解しがたい気持ちが残っています)。

なので、Emailを正しく設定していなければ、間違ったアカウントでプッシュしてしまいます。
今回の問題はそうして起こりました。

## あとがき

いくつかのパターンでプッシュ時のアカウントが期待を満たさないことがあるということがわかりました。
例えば、名前とメールを設定しなかったor間違ったものを入力していた場合などです。
なので、どういったときに成功するのか、失敗するのか、気になりました。少し検証してみました。

| ケース番号 | アカウント名 | メールアドレス | 結果 |
|:-:|:-:|:-:|:-:|
| 0 | (Gitﾕｰｻﾞｰ名が)なしor (Gitﾕｰｻﾞｰ名がGitｱｶｳﾝﾄ名と)違う | なしor違う | 失敗 |
| 1 | なし  | 同じ  | 失敗(ただし、globalにﾕｰｻﾞｰ名が設定されていた場合は成功する) |
| 2| 違う  | 同じ  | 成功 |
| 3| 同じ  | 同じ  | 成功 |

＊ 成功、失敗という言葉の意味は下記の意味で使っています
成功:=期待したGithubアカウントでコミットやプッシュがなされている。
失敗:=存在しないGithubアカウントでコミットやプッシュされたり、そもそも実行ができなかったりする。

ケース2が意外だと感じました。
しかしこれによって、gitユーザーのメールアドレスでGithubアカウントを紐づけているというのは本当のようだと判断できました。
macOS Unityエディタ C#でdylibを動的にバインディングする

# C言語側
これは無印c言語で書いていますが、C関数が出せればなんでもOK C++やRust等
```C
int test(int x,int y);
int test(int x,int y)
{
    return x+y;
}
```
# dylibをビルド
```
gcc -dynamiclib -o test.dylib test.c
```
test.dylibが出来るのでStreamingAssetsに置きます。
# Unity側(C#)
```cs
using System;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;

public class DllTest : MonoBehaviour
{
    [DllImport("__Internal")]
    private static extern IntPtr dlopen(string filename, int flag);

    [DllImport("__Internal")]
    private static extern int dlclose(IntPtr handle);

    [DllImport("__Internal")]
    private static extern IntPtr dlsym(IntPtr handle, string name);

    delegate int testDelegate(int x, int y);
    // Start is called before the first frame update
    void Start()
    {
        var dll = dlopen(Path.Combine(Application.streamingAssetsPath, "test.dylib"), 1);
        var testPtr = dlsym(dll,"test");
        var testDelegate = Marshal.GetDelegateForFunctionPointer<testDelegate>(testPtr);
        var result = testDelegate( 200, 300);
        Debug.Log($"result = {result}");
        dlclose(dll);
    }
}
```
dlopenの第二引数「1」はRTLD_LAZYです(dlfcn.hで定義、Cコードで出力して確認しました)

# 結果
何か適当なオブジェクトにアタッチして実行してください。コンソールに次の出力が出ればOK
```
result = 500
```
# 解説
WindowsだとDLLをLoadLibrary、GetProcAddress、FreeLibraryとかで処理する奴ですね。macOSの記事がぱっと見つからなかったのでメモ。
Unixのダイナミックリンクライブラリを扱う標準関数なんで、Linuxとかでも似たことは出来るかも？(試していない)
gitの「origin」ってなんやねん！


# `origin`とは

`リモートリポジトリのアクセス先に対してデフォルトでつけられる場所(URL)の別名`です。

リモーーとリポジトリのアクセス先の設定を確認するコマンドで確認してみます。
```
$ git remote -v

origin	https://github.com/omo/rails.git (fetch)
origin	https://github.com/omo/rails.git (push)
```

リモートリポジトリのアクセス先（上記の例. https://github.com/omo/rails.git ）が
originという名前で設定されています。


# `origin`はどこで設定しているの？

Gitプロジェクトを作成する際の`git init`のコマンドで、
リモートリポジトリの設定を行っているはずです。
```
$ git remote add origin https://github.com/omo/rails.git
```
この設定を行うことで、リモートリポジトリに対してpushやpullができるようになります。
systemctlコマンド

**systemctl サブコマンド [Unit名]**
Unit名の拡張子が省略された場合は、.serviceの拡張子のUnit名が指定されたものとなります。

|サブコマンド|説明|
|:-:|:--|
|disable|サービスの自動起動を無効にします|
|enable|サービスの自動起動を有効にします|
|get-default|次回起動時のターゲットを表示します|
|halt|システムを停止し、halt状態にします|
|is-active|サービスが起動しているかを表示します|
|isolate|他のUnitを停止して、対象のUnitを起動します|
|list-unit-files|すべてのUnit定義ファイルを一覧表示します|
|reboot|システムを再起動します|
|reload|サービスの設定ファイルを再読込みします|
|restart|サービスを再起動します|
|set-default|次回起動時のターゲットを設定します|
|start|サービスを起動します|
|status|サービスの状態を表示します|
|stop|サービスを停止します|
|poweroff|システムを停止して、電源を落とします|
【Angular】ダイアログ(mat-dialog)表示時、「Dialog with id exists already the dialog id must be unique」のエラー

## やろうとしていたこと
配列データをfor文で処理し、中身に応じて、ダイアログを2,3回出して、最後の処理まで終わったら、次の配列要素の処理でまたダイアログを2,3回出して、といった処理をループさせようとしていた。

## エラーの内容と原因の推測
エラーメッセージとしては
`「Dialog with id exists already the dialog id must be unique」`
であり、下記の現場証拠がありました。
* エラーメッセージからして、おそらく何個もダイアログ出そうとしてるが、一個ずつしか出せないために起きているエラー
* ダイアログ内にはタイトルやメッセージを渡していたのだが、その内容が配列の最後の要素の内容だった
* 配列の要素が一つの場合はエラーがでない。

これらの現場証拠から、同期的に処理できてないため、ダイアログをいくつも表示してしまうことで起きているエラーだと推測しました。

## 原因となっていた箇所
awaitが効いていない状態でした。
抜粋にになりますが、下記のように記述していましたが、同期的に処理が出来ていませんでした。

・問題のあった実装（抜粋）
```typescript
//定義側
showDialogFunc(){
  const dialogRef = this.dialog.showDialog();
  dialog.afterClosed().subscribe(()=>{
   // 閉じた後の処理
  })
}

//呼び出し側
await this.showDialogFunc();//ここのawaitが効いてなかった。

```
## 理由
ダイアログの返り値がobservableだったためでした。冷静に考えれば、subscribeを使っている時点でsubscriptionを返すのでawaitが効かないのは当然の結果かもしれません。
(afterClosed()はObservableを返します。)

## 打ち手
返り値がpromiseになるようにfirstValueFromでpromiseオブジェクトに変換してやって、同期的に処理するようにしました。

```typescript
//修正前
showDialogFunc(){
  const dialogRef = this.dialog.showDialog();
  dialog.afterClosed().subscribe(()=>{
   // 閉じた後の処理
  })
}

//修正後
showDialogFunc(){
  const dialogRef = this.dialog.showDialog();
  const ret = await firstValueFrom(dialog.afterClosed());
  if(ret === okBtn){
   //閉じた後の処理
  }
}

```

## 参考にした記事
https://qiita.com/agajo/items/73ec7651747956439f7e
【学習メモ】Djangoで開発用サーバーを起動する際、読み込むsettingsファイルを変更する方法

結論から記載します。

Djangoアプリのホームディレクトリ直下に置かれている、<strong>manage.py</strong>を以下のように編集します。
![Screen Shot 2022-05-27 at 8.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640031/4b9ab62b-7009-2b35-5934-d5d1eaaa7a40.png)

これで
```
python manage.py runserver
```
を実行する際、自前で作成したsettigns_dev.pyという開発環境用の設定ファイルを読み込み、サーバーを起動するようになります。

## 前提
自分のPC環境でDjango開発する際、
大抵は開発環境用・本番環境用、、、
などと、設定ファイル（settings.py）をいくつかに分けると思います。


しかし開発用サーバーを起動するコマンド
```
python manage.py runserver
```
を実行する際、Djangoの初期設定ではsettings.pyを読むこむようになっているので、そのままでは開発環境用の設定ファイルを読み込めません。

なのでmanage.pyを上記のように修正することで、別の設定ファイルを読み込めるようになります。

## まとめ
manage.pyを修正することで、runserver実行時に読むこむ設定ファイルを変更できる。

オプションを指定するなど、多分他にもやり方あると思いますが、こちらのやり方を記載をメモに残しておこうと思いました。
あと、PyCharmなどの統合開発環境では、
設定しとくことでボタン一つで開発サーバー起動ができたりします（私は現在別のエディターで開発しているので、コマンド打ち込んでます。。
Docker Composeを使ったPython環境の用意

コンテナでPython環境を用意したい！けど調べるの面倒なんで備忘録としてまとめます。
# 構成
```
.
├── Dockerfile
├── docker-compose.yaml
└── opt
    └── test.py
```

# Dockerfileの定義
```shell
cat <<EOF > Dockerfile
FROM python:3
USER root
RUN apt-get update
RUN apt-get install -y vim 
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
EOF
```

# docker-compose.yamlの定義
```shell
cat << EOF > docker-compose.yaml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python'
    working_dir: '/root/opt/'
    tty: true
    volumes:
      - ./opt:/root/opt
EOF
```

# コンテナの立ち上げ
```shell
sudo docker-compose up -d --build
```
## 動作確認
```shell
$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND     CREATED        STATUS       PORTS     NAMES
0cf496a155c1   python_python3   "python3"   9 seconds ago  Up 8 seconds             python
```

# test.pyの実行
コンテナに入る
```shell
sudo docker-compose exec python3 bash
```
test.pyの作成
```shell
cat <<EOF > test.py
print("Hello, Python")
EOF
```
test.pyの実行
```shell 
# python3 test.py
Hello, Python
```

# 参考サイト
https://qiita.com/A-Kira/items/7aaa1a16f8f6c8ed4040
hidden　使い方　注意点

## 使い方
```html:html
<body>
  <form action="" method="post">
    <div>
	  <input type="text" id="message" name="message" value="">
   	  <input type="hidden" id="id" name="id" value="1">
      <input type="submit" value="送信する">
	</div>
  </form>
</body>
```

### 説明
`input type="hidden"` はブラウザには表示されません。
ブラウザには表示したくないけど、valueに値を持たせて、POSTさせたい時・JavaScriptで値を使用したい時などにも使えます。
smartyなどでvalueに値をassignすることも可能です。

### 注意点
hiddenはソースコード上で値が丸見えとなります。
なので、この値には重要な情報は入れてはいけません。
重要な情報を扱う際はセッションに入れるなど、別の方法にした方が良いです。
100日後くらいに個人開発するぞ！day034

## 今日はレスポンシブデザインを実装してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/e6a6b28b-21c0-ac46-9fa9-b5da31d631b5.png)


## 今日のアウトプット

### Before

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/ebe83712-56ab-d7ad-603a-f88992a74bab.png)



### After

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/89e3d14f-b6a4-9f0a-334e-58b70b275ecd.png)


## 今日の備忘録

### CSSを分割してレスポンシブ専用のCSSファイルを読み込む
* `<head>`内に`<link rel="stylesheet" href="responsive.css">`を記述

### floatを解除する方法
* floatの性質
    * 子要素が全てfloatの場合は親要素の高さが0になる
        * 通常は親要素の高さは子要素を囲むような高さになる
* floatを解除する方法
    * 親要素のHTML内に`clear`クラスを持つ`<div>`を追加
    * CSSで`clear`クラスに`clear:left;`を適用する
access2000の作法 その3

# 概要
access2000の作法、調べてみた。


# ウィンドウを重ねて表示する手順。
- Accessのオプション画面を開き、「現在のデータベース」を選択します。
- アプリケーション オプション』の領域の中ほどに『ドキュメント ウィンドウ オプション』の項目があるので、「ウィンドウを重ねて表示する(O)」のオプションボタンを選択します。

# ナビゲーションウィンドウの非表示設定手順。
- Accessのオプション画面を開き、「現在のデータベース」を選択します。
- 「ナビゲーションウィンドウを表示する」のチェックを外します。

# スタートアップフォームを回避する手順。(開発者モード)

- database1.mdbを、shiftキーを押しながら、ダブルクリック。

# リボンバーを非表示にする手順。

```
Private Sub Form_Load()
	DoCmd.ShowToolbar "Ribbon", acToolbarNo 
End Sub
```

以上。