Documentaion fix.

Started by Kyotaro HORIGUCHIover 7 years ago13 messages
#1Kyotaro HORIGUCHI
horiguchi.kyotaro@lab.ntt.co.jp
4 attachment(s)

Hello.

I found that an example output in the following page is not
correct for the version.

https://www.postgresql.org/docs/10/static/warm-standby.html

postgres=# SELECT * FROM pg_replication_slots;

slot_name | slot_type | datoid | database | active | xmin | restart_lsn | confirmed_flush_lsn
-------------+-----------+--------+----------+--------+------+-------------+---------------------
node_a_slot | physical | | | f | | |

The correct one is

slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
node_a_slot | | physical | | | f | f | | | | |

From 9.4, 9.5, 9.6 and 10 and later have an example output wrong
in individual way of the version. I'm not sure how the
documentation was updated but each of the attached patches fixes
the version designated in the file name.

But, just fixing it makes the line seemingly a bit too long..

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

Attachments:

0001-Documentation-fix-of-Log-Shipping_9_4.patchtext/x-patch; charset=us-asciiDownload
From 93c69b9cccaf527fdfe765cfe9b9e88ee86f226c Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Tue, 31 Jul 2018 18:38:03 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for 9.4.

The example output of pg_replication_slot is stale. Replaces with the
up-to-date example.
---
 doc/src/sgml/high-availability.sgml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index cd5305620d..fce09f1799 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -932,9 +932,9 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
  node_a_slot |
 
 postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn
--------------+-----------+--------+----------+--------+------+-------------
- node_a_slot | physical  |        |          | f      |      |
+  slot_name  | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn 
+-------------+--------+-----------+--------+----------+--------+------+--------------+-------------
+ node_a_slot |        | physical  |        |          | f      |      |              | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</>
-- 
2.16.3

0001-Documentation-fix-of-Log-Shipping_9_5.patchtext/x-patch; charset=us-asciiDownload
From eba78232e51bed3a4dc3fca6e311ece191d163cd Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Tue, 31 Jul 2018 18:33:20 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for 9.5.

The example output of pg_replication_slot is stale. Replaces with the
up-to-date example.
---
 doc/src/sgml/high-availability.sgml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 35daf0103a..780851c976 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -932,9 +932,9 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
  node_a_slot |
 
 postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn
--------------+-----------+--------+----------+--------+------+-------------
- node_a_slot | physical  |        |          | f      |      |
+  slot_name  | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn 
+-------------+--------+-----------+--------+----------+--------+------------+------+--------------+-------------
+ node_a_slot |        | physical  |        |          | f      |            |      |              | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</>
-- 
2.16.3

0001-Documentation-fix-of-Log-Shipping_9_6.patchtext/x-patch; charset=us-asciiDownload
From 8a97a8defc674a03dc63c93439430d88278335cf Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Tue, 31 Jul 2018 18:29:57 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for 9.6.

The example output of pg_replication_slot is stale. Replaces with the
up-to-date example.
---
 doc/src/sgml/high-availability.sgml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index a52580e3dd..ab6d146b68 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -932,9 +932,9 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
  node_a_slot |
 
 postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn | confirmed_flush_lsn
--------------+-----------+--------+----------+--------+------+-------------+---------------------
- node_a_slot | physical  |        |          | f      |      |             |
+  slot_name  | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
+-------------+--------+-----------+--------+----------+--------+------------+------+--------------+-------------+---------------------
+ node_a_slot |        | physical  |        |          | f      |            |      |              |             | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</>
-- 
2.16.3

0001-Documentation-fix-of-Log-Shipping_mst_10.patchtext/x-patch; charset=us-asciiDownload
From 79e433a81fa84feb597cec5da3a049ab355327b4 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Tue, 31 Jul 2018 18:44:18 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for devel.

The example output of pg_replication_slot is stale. Replaces with the
up-to-date example.
---
 doc/src/sgml/high-availability.sgml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 934eb9052d..bd2747de25 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -967,9 +967,9 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
  node_a_slot |
 
 postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn | confirmed_flush_lsn
--------------+-----------+--------+----------+--------+------+-------------+---------------------
- node_a_slot | physical  |        |          | f      |      |             |
+  slot_name  | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
+-------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
+ node_a_slot |        | physical  |        |          | f         | f      |            |      |              |             | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</varname>
-- 
2.16.3

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Kyotaro HORIGUCHI (#1)
Re: Documentaion fix.

On 2018-Jul-31, Kyotaro HORIGUCHI wrote:

But, just fixing it makes the line seemingly a bit too long..

How about pasting it like this?

alvherre=# select * from pg_replication_slots \gx
─[ RECORD 1 ]───────┬────────────
slot_name │ node_a_slot
plugin │
slot_type │ physical
datoid │
database │
temporary │ f
active │ f
active_pid │
xmin │
catalog_xmin │
restart_lsn │
confirmed_flush_lsn │

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#3Michael Paquier
michael@paquier.xyz
In reply to: Alvaro Herrera (#2)
Re: Documentaion fix.

On Tue, Jul 31, 2018 at 10:59:14AM -0400, Alvaro Herrera wrote:

How about pasting it like this?

alvherre=# select * from pg_replication_slots \gx
─[ RECORD 1 ]───────┬────────────
slot_name │ node_a_slot
plugin │
slot_type │ physical
datoid │
database │
temporary │ f
active │ f
active_pid │
xmin │
catalog_xmin │
restart_lsn │
confirmed_flush_lsn │

Each time this catalog is changed, this would become incorrect. My
suggestion would be to change the query to that and call it a day:
SELECT slot_name, slot_type, active FROM pg_replication_slots;
--
Michael

#4Kyotaro HORIGUCHI
horiguchi.kyotaro@lab.ntt.co.jp
In reply to: Michael Paquier (#3)
2 attachment(s)
Re: Documentaion fix.

At Wed, 1 Aug 2018 02:47:32 +0900, Michael Paquier <michael@paquier.xyz> wrote in <20180731174732.GD2878@paquier.xyz>

On Tue, Jul 31, 2018 at 10:59:14AM -0400, Alvaro Herrera wrote:

How about pasting it like this?

alvherre=# select * from pg_replication_slots \gx
─[ RECORD 1 ]───────┬────────────
slot_name │ node_a_slot
plugin │
slot_type │ physical
datoid │
database │
temporary │ f
active │ f
active_pid │
xmin │
catalog_xmin │
restart_lsn │
confirmed_flush_lsn │

Each time this catalog is changed, this would become incorrect. My
suggestion would be to change the query to that and call it a day:
SELECT slot_name, slot_type, active FROM pg_replication_slots;

Yeah, I'm also concerned about the unstability. I didn't came up
with a list of columns that makes sense at that time but I
rethought on that.

slot_name │ required
plugin │ <not requried for physical slots>
slot_type │ required
datoid │ <not requried>
database │ <not requried>
temporary │ <not requried>
active │ required?
active_pid │ <not requried>
xmin │ <not requried>
catalog_xmin │ <not requried>
restart_lsn │ better to be shown?
confirmed_flush_lsn │ <not requried for physical slots>

The query and the result with four columns fit the current width.

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

Attachments:

v2-0001-Documentation-fix-of-Log-Shipping_95_94.patchtext/x-patch; charset=us-asciiDownload
From 2b5788b3f1ecf4ebd31cf36eecdd4619cf3f394e Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Wed, 1 Aug 2018 12:41:03 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for PG95.

The example output of pg_replication_slot is wrong. Correct and make
the output stable by explicitly specifying a part of the all columns
in pg_replication_slots.
---
 doc/src/sgml/high-availability.sgml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 35daf0103a..ae831192d0 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -931,10 +931,10 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
 -------------+---------------
  node_a_slot |
 
-postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn
--------------+-----------+--------+----------+--------+------+-------------
- node_a_slot | physical  |        |          | f      |      |
+postgres=# SELECT slot_name, slot_type, active, restart_lsn FROM pg_replication_slots;
+  slot_name  | slot_type | active | restart_lsn 
+-------------+-----------+--------+-------------
+ node_a_slot | physical  | f      | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</>
-- 
2.16.3

v2-0001-Documentation-fix-of-Log-Shipping_mst-96.patchtext/x-patch; charset=us-asciiDownload
From 4367cdea3d6ac19ef9c6ec1545fbc2329dda47bb Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Wed, 1 Aug 2018 11:50:03 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for
 master.

The example output of pg_replication_slot is wrong. Correct and make
the output stable by explicitly specifying a part of the all columns
in pg_replication_slots.
---
 doc/src/sgml/high-availability.sgml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 934eb9052d..39cada1278 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -966,10 +966,10 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
 -------------+-----
  node_a_slot |
 
-postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn | confirmed_flush_lsn
--------------+-----------+--------+----------+--------+------+-------------+---------------------
- node_a_slot | physical  |        |          | f      |      |             |
+postgres=# SELECT slot_name, slot_type, active, restart_lsn FROM pg_replication_slots;
+  slot_name  | slot_type | active | restart_lsn 
+-------------+-----------+--------+-------------
+ node_a_slot | physical  | f      | 
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</varname>
-- 
2.16.3

#5Michael Paquier
michael@paquier.xyz
In reply to: Kyotaro HORIGUCHI (#4)
Re: Documentaion fix.

On Wed, Aug 01, 2018 at 01:04:37PM +0900, Kyotaro HORIGUCHI wrote:

The query and the result with four columns fit the current width.

Just wondering, what is your reason behind the addition of restart_lsn?
This part of the documentation focuses on slot creation, so slot_name,
slot_type and active would be representative enough, no?
--
Michael

#6Kyotaro HORIGUCHI
horiguchi.kyotaro@lab.ntt.co.jp
In reply to: Michael Paquier (#5)
2 attachment(s)
Re: Documentaion fix.

At Fri, 3 Aug 2018 04:13:56 +0900, Michael Paquier <michael@paquier.xyz> wrote in <20180802191356.GB2247@paquier.xyz>

On Wed, Aug 01, 2018 at 01:04:37PM +0900, Kyotaro HORIGUCHI wrote:

The query and the result with four columns fit the current width.

Just wondering, what is your reason behind the addition of restart_lsn?
This part of the documentation focuses on slot creation, so slot_name,
slot_type and active would be representative enough, no?

The first reason was the example looks having a bit too many
space around only with three other columns.

A more serious reason is that I wanted to show a slot with what
properties is created in the example and I thought that
restart_lsn and temporary are significant. Howerver restart_lsn
is always a part of the pg_replication_slots, we don't have
"temprary" before 10. Addition to that, adding it makes the
SELECT line stick out of the width.

That said, I don't object to reduce the columns. Please find the
attached.

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

Attachments:

v3-0001-Documentation-fix-of-Log-Shipping_mst-96.patchtext/x-patch; charset=us-asciiDownload
From 7e750c902f594b0a00c1f579518a74947a755d05 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Wed, 1 Aug 2018 11:50:03 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for
 master.

The example output of pg_replication_slot is wrong. Correct and make
the output stable by explicitly specifying a part of the all columns
in pg_replication_slots.
---
 doc/src/sgml/high-availability.sgml | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 934eb9052d..3c5f3fc6a9 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -966,10 +966,12 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
 -------------+-----
  node_a_slot |
 
-postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn | confirmed_flush_lsn
--------------+-----------+--------+----------+--------+------+-------------+---------------------
- node_a_slot | physical  |        |          | f      |      |             |
+postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots;
+  slot_name  | slot_type | active 
+-------------+-----------+--------
+ node_a_slot | physical  | f
+(1 row)
+
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</varname>
-- 
2.16.3

v3-0001-Documentation-fix-of-Log-Shipping_95-94.patchtext/x-patch; charset=us-asciiDownload
From 0192ad0d7c674eff11285f68ea2128ad50ecef10 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Wed, 1 Aug 2018 12:41:03 +0900
Subject: [PATCH] Documentation fix of "Log-Shipping Standy Servers" for PG95.

The example output of pg_replication_slot is wrong. Correct and make
the output stable by explicitly specifying a part of the all columns
in pg_replication_slots.
---
 doc/src/sgml/high-availability.sgml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 35daf0103a..3f33c39bd2 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -931,10 +931,10 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
 -------------+---------------
  node_a_slot |
 
-postgres=# SELECT * FROM pg_replication_slots;
-  slot_name  | slot_type | datoid | database | active | xmin | restart_lsn
--------------+-----------+--------+----------+--------+------+-------------
- node_a_slot | physical  |        |          | f      |      |
+postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots;
+  slot_name  | slot_type | active 
+-------------+-----------+--------
+ node_a_slot | physical  | f
 (1 row)
 </programlisting>
      To configure the standby to use this slot, <varname>primary_slot_name</>
-- 
2.16.3

#7Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Kyotaro HORIGUCHI (#6)
Re: Documentaion fix.

On 2018-Aug-03, Kyotaro HORIGUCHI wrote:

That said, I don't object to reduce the columns. Please find the
attached.

Thanks, pushed.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#8Michael Paquier
michael@paquier.xyz
In reply to: Alvaro Herrera (#7)
Re: Documentaion fix.

On Fri, Aug 03, 2018 at 04:37:05PM -0400, Alvaro Herrera wrote:

On 2018-Aug-03, Kyotaro HORIGUCHI wrote:

That said, I don't object to reduce the columns. Please find the
attached.

Thanks, pushed.

Thanks Alvaro for keeping the three-column version, I was going to look
at the proposed patch and push as you did, until I noticed that you
showed up :)
--
Michael

#9Kyotaro HORIGUCHI
horiguchi.kyotaro@lab.ntt.co.jp
In reply to: Michael Paquier (#8)
Re: Documentaion fix.

At Sat, 4 Aug 2018 05:58:52 +0900, Michael Paquier <michael@paquier.xyz> wrote in <20180803205852.GB20967@paquier.xyz>

On Fri, Aug 03, 2018 at 04:37:05PM -0400, Alvaro Herrera wrote:

On 2018-Aug-03, Kyotaro HORIGUCHI wrote:

That said, I don't object to reduce the columns. Please find the
attached.

Thanks, pushed.

Thanks Alvaro for keeping the three-column version, I was going to look
at the proposed patch and push as you did, until I noticed that you
showed up :)

Thanks.

# I noticed that the subject has typo..

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

#10Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Kyotaro HORIGUCHI (#9)
Re: Documentaion fix.

On 2018-Aug-09, Kyotaro HORIGUCHI wrote:

# I noticed that the subject has typo..

Yeah. I suggest never changing subject lines, because Gmail has the
nasty (mis-)feature of making such a response into a completely new
thread. I don't know if Google paid mail service behaves in the same
way.

So if you change Subject, please do include a URL to the previous thread
if necessary, for the benefit of people reading on Gmail.

I wouldn't worry about this for any other individual email provider, but
Gmail is by far the largest fraction of subscribers :-( I guess this
shows just how much better Google made webmail systems than what existed
at the time.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#11Michael Paquier
michael@paquier.xyz
In reply to: Alvaro Herrera (#10)
Re: Documentaion fix.

On Thu, Aug 09, 2018 at 03:58:09PM -0400, Alvaro Herrera wrote:

Yeah. I suggest never changing subject lines, because Gmail has the
nasty (mis-)feature of making such a response into a completely new
thread. I don't know if Google paid mail service behaves in the same
way.

If one uses Gmail with another client like mutt, then those don't get
broken. I don't know about Thunderbird which I believe people use a
lot.

So if you change Subject, please do include a URL to the previous thread
if necessary, for the benefit of people reading on Gmail.

+1.

I wouldn't worry about this for any other individual email provider, but
Gmail is by far the largest fraction of subscribers :-( I guess this
shows just how much better Google made webmail systems than what existed
at the time.

If something is free, you are the product, still I have to admit that
Gmail is not especially bad.
--
Michael

#12Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#7)
Re: Documentaion fix.

On 2018-Aug-03, Alvaro Herrera wrote:

On 2018-Aug-03, Kyotaro HORIGUCHI wrote:

That said, I don't object to reduce the columns. Please find the
attached.

Thanks, pushed.

I had failed to push in the 9.4 branch. Done now.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#13Michael Paquier
michael@paquier.xyz
In reply to: Alvaro Herrera (#12)
Re: Documentaion fix.

On Wed, Aug 15, 2018 at 02:35:56PM -0300, Alvaro Herrera wrote:

I had failed to push in the 9.4 branch. Done now.

Thanks Alvaro for working on the details. I would not have bothered
much myself as the set of columns was correct in 9.4, but for
consistency's sake that makes sense.
--
Michael