Re: [Haskell-cafe] Markdown extension for Haddock as a GSoC project

Managed not to send to all:
I think the reason markdown was the original suggestion was due to the fact it is a very widespread and popular syntax, and as Johan commented in the original thread, has to an extent "won". Having a consistent, standard documentation syntax for Haskell is of course important, but this project also seeks to standardise the syntax beyond Haskell. I don't think standardising it beyond Haskell is the goal at all. I
It may be hedging our bets, as a lot could change and markdown could suddenly fall from fame, but I believe the large variety of opposing markup languages are failing to gain traction in comparison and it is indeed a safe bet. While I don't think it will fall from fame overnight, it would be a shame to restrict people to just using Markdown because that's how all
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 28/04/13 00:08, Joe Nash wrote: think that coming up with Markdown that doesn't repeat the mistakes of all the flavours out there is quite difficult in itself, but coming up with such Markdown AND making it making it flexible enough to be of any use with Haddock as is? I think it might be a little out of scope. Extending Haddock itself and providing a writer (and a new reader) for Pandoc will let you write Markdown if you please and then convert it to (and from) many of the formats supported by Pandoc. the extensions were implemented.
If the flexibility of having it pandoc compatible is a desired feature, can this not be achieved through implementing markdown for haddock as well? Depending on what haddock specific features were required to be added to the superset, it may require only minimal changes to an existing markdown reader/writer in pandoc already.
It can, but the restriction comment applies here as well. - -- Mateusz K. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAEBAgAGBQJRfPllAAoJEM1mucMq2pqXaKAP/20x2549NvfJgib9oitm1Qn8 CCpGRHdSw4xlIh0pHUE1MKyiJrGGgchuUErN2CJBOKXPhn1fgCWFKJyfOhcPbyr7 2Tpb9t++9G9u0JtIb6/UQpgy6RDXQAqOUs78KxRx3DCb3rYuT5TNpr5ynS58T1+9 7eGQXeUQwhCkKZH6EuIF0qTwxPTsMOAT66oRVnaZJFl2+rOBcw8ZmxMsHnk3bX9t VAR+ySwN4FWce6QZwGU43tMwFHoIxsKrmZ3ZydQPfwdQjJjFjCdTaZhtEYS1Hcvu gg0yU5mjO/1frauqjgC/qo4ez/JrJr5aYHrV91o5S2w0Wl7jfUADAIRDLfhAnTe6 shbiPPBPJeY7EAt6JEytHBmlbwZLyE3zrB0GhlhyaKY344Z5k5Woq2u6zInPx5gi rtiWOUbuerBl8autaKwnPa9i+DSmRwMD8esFIyUMyCbPOMj89YirZtxWGD+ol71i cnBXV8DbX9aYfR8c8U3WNeR8FTOvxKYEC8cc3xErsustrwFlDKzlJD41VGHVZvjB qayuRIR/qMy+fy+8UrxzCFQA32gtZ/ZmjfyHWXHhe2DujThmTi95PtgpLHe1Y2Nh hYuGhj6fqzFvSvSJkE2uWlNPVIu7viBcF1bQEZz07OdYuvU+GbA8OK8q3EzCq+l3 l5uWSedwC4cdyNRxigFS =cgRe -----END PGP SIGNATURE-----

On 28 Apr 2013 11:33, "Mateusz Kowalczyk"
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Managed not to send to all:
I think the reason markdown was the original suggestion was due to the fact it is a very widespread and popular syntax, and as Johan commented in the original thread, has to an extent "won". Having a consistent, standard documentation syntax for Haskell is of course important, but this project also seeks to standardise the syntax beyond Haskell. I don't think standardising it beyond Haskell is the goal at all. I
On 28/04/13 00:08, Joe Nash wrote: think that coming up with Markdown that doesn't repeat the mistakes of all the flavours out there is quite difficult in itself, but coming up with such Markdown AND making it making it flexible enough to be of any use with Haddock as is? I think it might be a little out of scope.
I think my statement was a bit misleading there; I don't mean we should try to come up with a markdown flavour that is suitable for the whole internet to adopt as a standard, that is well beyond scope, as you sat. However, using markdown, even if it has differences and additional peculiarities to make it useful for haddock, is still to an extent bringing haddock in line with the other markdown users and strengthening that standard. Even with the differences there will be more similarities and it will be easier for users to move between other markdown flavours and our flavour than others and haddock syntax.
Extending Haddock itself and providing a writer (and a new reader) for Pandoc will let you write Markdown if you please and then convert it to (and from) many of the formats supported by Pandoc.
I do really like this idea, and expressed interest in it to John, but it adds additional complexity and dependencies for the documentation writer. Encouraging the writing of more and better documentation means removing as many barriers to doing so as possible, and having to run an additional conversion step to write in a nice syntax may impede that. Having said that, having to write in syntax you don't like also impedes that, so it may in fact encourage the writing of more/better documentation.
It may be hedging our bets, as a lot could change and markdown could suddenly fall from fame, but I believe the large variety of opposing markup languages are failing to gain traction in comparison and it is indeed a safe bet. While I don't think it will fall from fame overnight, it would be a shame to restrict people to just using Markdown because that's how all the extensions were implemented.
If the flexibility of having it pandoc compatible is a desired feature, can this not be achieved through implementing markdown for haddock as well? Depending on what haddock specific features were required to be added to the superset, it may require only minimal changes to an existing markdown reader/writer in pandoc already. It can, but the restriction comment applies here as well.
Does it? If it is suitable to write in another markup and convert to haddock with pandoc, why is it more restrictive to write in another markup and convert to pandoc-markdown? Have I missed a point here? I think these are starting to form two projects with tangential, but slightly differing goals. It would be interesting to see the results if we diverged here and a proposal was submitted for both ideas.

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 28/04/13 11:57, Joe Nash wrote:
On 28 Apr 2013 11:33, "Mateusz Kowalczyk"
wrote: If the flexibility of having it pandoc compatible is a desired feature, can this not be achieved through implementing markdown for haddock as well? Depending on what haddock specific features were required to be added to the superset, it may require only minimal changes to an existing markdown reader/writer in pandoc already.
It can, but the restriction comment applies here as well.
Does it? If it is suitable to write in another markup and convert to haddock with pandoc, why is it more restrictive to write in another markup and convert to pandoc-markdown? Have I missed a point here?
Extending core Haddock allows us to: 1. Write in any of the Pandoc supported formats, including Markdown 2. Convert it to pure Haddock. This can then be converted back into a different format if need be. Extending Haddock with a Markdown extension allows us to: 1. Write the documentation in any of Pandoc supported formats (including our new Markdown) 2. Convert it from a Pandoc supported format to our Markdown extension as Haddock isn't expressive enough as is to be used. It's a question of being able to go from `Many formats <-> Pandoc <-> Many formats' and `Markdown extension <-> Pandoc <-> Many formats'.
I think these are starting to form two projects with tangential, but slightly differing goals. It would be interesting to see the results if we diverged here and a proposal was submitted for both ideas.
I think the goal is still the same: in the end, people will be able to use Markdown to document their code. The means of achieving the goal would give us a different final product that achieves the goal in a slightly different way. - -- Mateusz K. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAEBAgAGBQJRfQWCAAoJEM1mucMq2pqXSDYQAJDgstjhoDNctcvbQ6OagkOe TVrJ6V7jmSKHYHsQQziGAeEOmXgZ18UX5TEu5w+ZJ//Yf3zCulhMzAjy+jOqGFPY nOJM5kZL6e7udf/rfmrD8r4GKb3yQAvufJIVLZ8UmMZ3vCAqbOiUs7cKOVcgsoD/ nVs11ySfYfLrF64RGcMqJ6Y9AZMcv05UOOSI3aM++0rj96/34TWRwC5XvQqG08Y+ 8eEB0FZijpKFRwMS8eSrTvCTx93pZkRJpMuHawT19zmylvqoME5WCBkeiXrGUuXE VpYAU5ZZxkW03l65yHb8Ir6IB4kTvD09NprhReR5MRf0J4lbL7TX5WZhP/3APFPk on8gPn4XGqVyn93Y9GplfCCOGr6A1271xEwqOF5YV7Y6NkI/c+SBcPGitgBBE1SO 03BIjr02S9wUtk+Su3szXZ0rmU5/zTLgCAcH2aG1MfbV7tDTKrL6m/J80wjzNULQ nhfHPvqEtT/iH6G2BmyLTSuNUgakDYzA10LPRIuxgoCBaZr9mGcJ6wye/xWx6tud RcuG1a8BS02Xau+zPFKgbdp1UQ8sRW2wiqPsbvwHVMoXvJ1j8ro+Xcxv0+vmar67 tWnYRHH4WgG209j1mX3ssj0gWcFUaFHrPYR9Gpv154NxdOEFq32w9eZO1pXndo8f zW9RmOLRpqh30fX3E2iX =0um2 -----END PGP SIGNATURE-----

I think it's worth backing up here, and remembering the original point of the proposal, by thinking about what is and isn't a goal. I think I'd classify things like this: Goals: - Use a lightweight, common, and familiar core syntax for simple formatting. - Still allow haddock-specific stuff like links to other symbols. Non-Goals: - Compliance/compatibility with any specification or other system. - Have any kind of formal semantics. The essence of this proposal is about making Haddock come closer to matching all the other places where people type formatted text on the Internet. As Johan said, markdown has won. But markdown won because it ended up being a collection of general conventions with compatibility for the 95% of commonly used bits... NOT a formal specification. If there are bits of markdown that are just really, really awkward to use in Haddock, modify them or leave them out. I think the whole discussion is getting off on the wrong start by looking for the right specification against which this should be judged, when it's really just about building the most natural possible ad-hoc adaptation of markdown to documentation comments. Just doing the easy stuff, like switching from /foo/ to *foo* for emphasis, really is most of the goal. Anything beyond that is even better. Compatibility or compliance to a specification are non-issues: no one is going to be frequently copying documentation comments to and from other markdown sources. Haddock will unavoidably have its own extensions for references to other definitions anyway, as will the other system, so it won't be compatible. Let's just accept that. Formal semantics is a non-issue: the behavior will still be defined by the implementation, in that people will write their documentation, and if it looks wrong, they will fix it. We don't want to reason formally about the formatting of our comments, or prove that it's correct. Avoiding unpleasant surprises is good; but avoiding *all* possible ambiguous corner cases in parsing, even when they are less likely than typos, is not particularly important. If some ambiguity becomes a big problem, it will get fixed later as a bug. I think the most important thing here is to not get caught up in debates about advanced syntax or parsing ambiguities, or let that stop us from being able to emphasize words the same way we do in the whole rest of the internet. -- Chris Smith

On 29/04/2013, at 3:26 AM, Chris Smith wrote:
I think it's worth backing up here, and remembering the original point of the proposal, by thinking about what is and isn't a goal. I think I'd classify things like this:
Goals: - Use a lightweight, common, and familiar core syntax for simple formatting. - Still allow haddock-specific stuff like links to other symbols.
Non-Goals: - Compliance/compatibility with any specification or other system. - Have any kind of formal semantics.
Why I find the idea of rejecting semantics appalling: Last week I was working with a documentation tool for another language which claims to be "Markdown" and where *bold* only allows one or more alphabetic words **bold** allows any text _italic_ only allows one or more alphabetic words __italic__ allows any text Today I had to revise some documentation for yet a third language which also claims to be "Markdown" and where *word* and _word_ both gave italics **word* and __word__ both gave bold. Oh, and the markup wasn't documented, because it was just "Markdown", and everyone knows Markdown, right? The syntax I was using was legal syntax, but the semantics was not the semantics I expected and was not written down. I don't care how formal the syntax and semantics are, but I care very much how complete they are.
Formal semantics is a non-issue: the behavior will still be defined by the implementation, in that people will write their documentation, and if it looks wrong, they will fix it.
Sorry, but this is rubbish. If the semantics is not documented, then people will write their documentation, and it will look wrong, AND THEY WILL NEVER HAVE BEEN GIVEN A CLUE ABOUT WHAT TO WRITE INSTEAD.
We don't want to reason formally about the formatting of our comments, or prove that it's correct. Avoiding unpleasant surprises is good; but avoiding *all* possible ambiguous corner cases in parsing, even when they are less likely than typos, is not particularly important.
Hmm. Just today, again, looking at the revision list for a Markdown processor, I see comments like "This changes the syntax from all previous versions... Code blocks and spans ... will now generate different output..." (which reminds me that the author may not be able to fix the looks of their documentation because it may have been perfectly fine when they wrote it, and they may be unavailable when the semantics changes) "Tweaked the rules ... this may affect existing content" (see above) Sort-of fixed a bug ... Given Markdown's list creation rules, I'm not sure this *can* be fixed." (which is the kind of thing that happens when you decide a clear syntax and semantics are not necessary).
If some ambiguity becomes a big problem, it will get fixed later as a bug.
As the comment extracted above suggests, it may not be fixable. We may not care about compatibility with other dialects of Markdown, but we should care about compatibility between versions of Haddock. Damn! Why did Watts Humphrey have to die before he'd convinced the world that the cheapest way to fix bugs is to keep them out in the first place?

On Sun, Apr 28, 2013 at 6:10 PM, Richard A. O'Keefe
Damn! Why did Watts Humphrey have to die before he'd convinced the world that the cheapest way to fix bugs is to keep them out in the first place?
I think that much has to do with the historical division in computer science. We have mathematics on the right hand, and electrical engineering on the wrong one. The electrical engineers were unduly influential in the 1960s, 70s, and 80s. The effects of such influence are still being felt. The average software developer thinks that mathematics, with its goody-two-shoes focus on soundness and validity, and all those hard to say words, is /too hard/. And as Kernighan once said, "Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?" I've been scoffed at during interviews for saying I solve problems on paper before I start typing! Obviously, names, types, and arrows on recycled printer paper are too clever by half.

On Mon, Apr 29, 2013 at 8:42 AM, Alexander Solla
I've been scoffed at during interviews for saying I solve problems on paper before I start typing!
That has to suck. I hope you're properly avenged when you find work in a savvier, respectful competitor and KICK THEIR ASSES! -- Kim-Ee

On Apr 28, 2013 6:42 PM, "Alexander Solla"
I think that much has to do with the historical division in computer science. We have mathematics on the right hand, and electrical engineering on the wrong one.
I've been called many things, but electrical engineer is a new one! My point was not anything at all to do with programming. It was about writing comments, which is fundamentally a communication activity. That makes a difference. It's important to keep in mind that the worst possible consequence of getting corner cases wrong here is likely that some documentation will be confusing because the numbering is messed up in an ordered list. Pointing out that different processors treat markdown differently with respect to bold or italics and such is ultimately missing the point. For example, I an aware that Reddit treats *foo* like italics while, say, Google+ puts it in bold... but I really don't care. What is really of any importance is that both of them take reasonable conventions from plain text and render them reasonably. As far as I'm concerned, you can flip a coin as to whether it ends up in bold or italics. That doesn't mean the choices should not be documented. Sure they should. But it seems ridiculous to sidetrack the proposal to do something nice by concerns about the minutiae of the syntax.

On 29/04/2013, at 4:18 PM, Chris Smith wrote:
My point was not anything at all to do with programming. It was about writing comments, which is fundamentally a communication activity. That makes a difference. It's important to keep in mind that the worst possible consequence of getting corner cases wrong here is likely that some documentation will be confusing because the numbering is messed up in an ordered list.
The problem is not what it does to the formatting. The problem is what it does to *PEOPLE*. It wastes their time. Suppose there are 10,000 Haskell programmers (I have no idea what the true number of Haskell programmers who like to document is; I hope it's more) and they lose just 6 minutes a day working around glitches in their documentation tools. That's 1000 hours a day; call it 40 days of human life blown away in aggravation every day. To quote Jayne, "Where does that get to be fun?" Why is it acceptable to waste anyone's time with "confusing" documentation? Did anyone else read that Markdown-in-Haskell mentioned here recently whose author comments (quoting from memory) "any random string of garbage is legal Markdown", so that there is no possibility of catching errors early; by definition in that processor there are no errors.
Pointing out that different processors treat markdown differently with respect to bold or italics and such is ultimately missing the point.
It may be missing your point, but it hits mine square in the bulls-eye. It wasn't just that they were *different*, it was that the difference wasn't *documented*, and I had to waste an hour of my *LIFE* that I will never get back because some lazy swine couldn't be buggered doing documentation. About a documentation tool. Savour the irony!
That doesn't mean the choices should not be documented. Sure they should.
If we agree that the semantics should be documented, what are we arguing about?
But it seems ridiculous to sidetrack the proposal to do something nice by concerns about the minutiae of the syntax.
Nobody is suggesting that the proposal should be *CHANGED*. So talk about "sidetrack" is unwarranted. The pathetic request from a suffering humanity is that the mark(up/down/sideways) should be *DOCUMENTED* clearly. As for "minutiae of the syntax", *you* may call the fact that `` in the middle of a line and `` at the beginning of a line do different things "minutiae of the syntax", but *I* call it "wantonly squandering my few remaining hours because you think that no or confusing documentation is OK". The more I use Markdown, the better HTML looks. That is, the more effective HTML looks *AS A COMMUNICATION TOOL*, where effectiveness is measured in terms of the effort required to get the result you want. Other people may have other experiences, and that's wonderful. Having better documentation WILL NOT HURT THEM.

I should add that as a consumer of Haddock documentation I can testify that fancier styling (in whatever format) would be of little benefit to _me_. What I need is more plain text and more examples. To be perfectly honest, most of the time when looking at a Haddock page, I end up clicking on the Source button because there are things I need to know that are in the source but not the documentation. So I do agree that markup that doesn't get in the way of a _reader_ who is looking at the source code is an excellent thing. I say this as someone who had to read some Java today and ended up stuffing it through a comment stripper so that I could easily find what I needed to find. This thread is not about the "visually lightweight" aspect of Markdown. That's a good thing. No argument there. The thread is about how well documented the notation should be.

I see the pluggable markup being pushed in this thread again.
I just want to remind everybody that we currently have a flavor of a markup
issue on github.
The ghc source code uses literal haskell, and it does not work well on
github.
http://www.haskell.org/pipermail/ghc-devs/2013-April/001099.html
Any markup that is not widely supported makes it harder for third parties
to support and parse.
The solution is *not* to reimplement github in haskell, but to standardize
markup as much as possible.
Pluggable markup makes the probability that a github-like service, IDEs and
similar can make use of the documentation arbitrarily close to zero.
Alexander
On Mon, Apr 29, 2013 at 8:04 AM, Richard A. O'Keefe
I should add that as a consumer of Haddock documentation I can testify that fancier styling (in whatever format) would be of little benefit to _me_. What I need is more plain text and more examples.
To be perfectly honest, most of the time when looking at a Haddock page, I end up clicking on the Source button because there are things I need to know that are in the source but not the documentation.
So I do agree that markup that doesn't get in the way of a _reader_ who is looking at the source code is an excellent thing.
I say this as someone who had to read some Java today and ended up stuffing it through a comment stripper so that I could easily find what I needed to find.
This thread is not about the "visually lightweight" aspect of Markdown. That's a good thing. No argument there.
The thread is about how well documented the notation should be.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

On 29 April 2013 18:16, Alexander Kjeldaas
I see the pluggable markup being pushed in this thread again.
I just want to remind everybody that we currently have a flavor of a markup issue on github.
The ghc source code uses literal haskell, and it does not work well on github.
http://www.haskell.org/pipermail/ghc-devs/2013-April/001099.html
Any markup that is not widely supported makes it harder for third parties to support and parse.
The solution is *not* to reimplement github in haskell, but to standardize markup as much as possible.
Pluggable markup makes the probability that a github-like service, IDEs and similar can make use of the documentation arbitrarily close to zero.
If it's pluggable, doesn't it make the situation _worse_, as you choose a plug-in that works with one service but then fails for all the others? I think this is a bit of a non-issue: services like github should _not_ mark-up documentation (as you're going to have some kind of issue where it's rendered when you didn't expect it or vice-versa, thus making it different to read the actual code). I tend to agree with Richard, etc.: I'd rather either extend the existing Haddock mark-up or choose a sane markup language if we wish to replace/augment it (I use markup, but find a lot of its conventions appalling).
Alexander
On Mon, Apr 29, 2013 at 8:04 AM, Richard A. O'Keefe
wrote: I should add that as a consumer of Haddock documentation I can testify that fancier styling (in whatever format) would be of little benefit to _me_. What I need is more plain text and more examples.
To be perfectly honest, most of the time when looking at a Haddock page, I end up clicking on the Source button because there are things I need to know that are in the source but not the documentation.
So I do agree that markup that doesn't get in the way of a _reader_ who is looking at the source code is an excellent thing.
I say this as someone who had to read some Java today and ended up stuffing it through a comment stripper so that I could easily find what I needed to find.
This thread is not about the "visually lightweight" aspect of Markdown. That's a good thing. No argument there.
The thread is about how well documented the notation should be.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com http://IvanMiljenovic.wordpress.com

On Mon, 29 Apr 2013 18:04:47 +1200 "Richard A. O'Keefe"
so that there is no possibility of catching errors early; by definition in that processor there are no errors.
Haddock's markup isn't any better in that regard. I spent two hours on my first day with haddock figuring out that I needed an empty comment line before a code block. It didn't issue any warnings or errors either.
To be perfectly honest, most of the time when looking at a Haddock page, I end up clicking on the Source button because there are things I need to know that are in the source but not the documentation.
Besides fixities, orphan instances, type family instances and partially exported records? It would be beneficial of Haddock to list orphan instances on top of the page. In red. Iff adding markdown doesn't require a major restructuring of haddock, then a GSOC might be better spent adding support for all of these instead; someone else could add markdown later on their own after ML bikeshedding came to some conclusion.

On 29/04/2013, at 10:04 PM, kudah wrote:
On Mon, 29 Apr 2013 18:04:47 +1200 "Richard A. O'Keefe"
wrote: so that there is no possibility of catching errors early; by definition in that processor there are no errors.
Haddock's markup isn't any better in that regard.
Did I praise Haddock?
I spent two hours on my first day with haddock figuring out that I needed an empty comment line before a code block. It didn't issue any warnings or errors either.
Report that as a bug. For what it's worth, I've resurrected an old design I did and have been playing with it to see just how bad it really is to use something like @i<word> than _word_. (Can anyone remember the name of the old formatting program that the * and _ convention comes from? I've got a manual for it buried in a box I can't reach, and I've been trying to remember the name. The manual was a UBC technical report some time in the early 80s, which may mean it was written in BCPL.) I took a thousand line documentation file and converted it to this unambiguous markup with a single reserved character, and the size increase was actually, well, actually, it got @i<smaller>. I'm not going to describe the notation, because the point is that "unambiguous" and "lightweight" are compatible properties.

On 30 April 2013 09:28, Richard A. O'Keefe
On 29/04/2013, at 10:04 PM, kudah wrote:
On Mon, 29 Apr 2013 18:04:47 +1200 "Richard A. O'Keefe"
wrote: so that there is no possibility of catching errors early; by definition in that processor there are no errors.
Haddock's markup isn't any better in that regard.
Did I praise Haddock?
I spent two hours on my first day with haddock figuring out that I needed an empty comment line before a code block. It didn't issue any warnings or errors either.
Report that as a bug.
For what it's worth, I've resurrected an old design I did and have been playing with it to see just how bad it really is to use something like @i<word> than _word_.
Everyone agrees it's useful to have @i<legible> markup :) I'm impressed with Mateusz' balanced summary of the issues and look forward to his GSoC project submission about _Markdown_. Conrad.
participants (10)
-
Alexander Kjeldaas
-
Alexander Solla
-
Chris Smith
-
Conrad Parker
-
Ivan Lazar Miljenovic
-
Joe Nash
-
Kim-Ee Yeoh
-
kudah
-
Mateusz Kowalczyk
-
Richard A. O'Keefe