comparison discussion.roff @ 109:2b094b8fb422

Rework of existing text.
author markus schnalke <meillo@marmaro.de>
date Sun, 24 Jun 2012 21:42:23 +0200
parents dd5620bf8659
children 4c0f13b1e0e8
comparison
equal deleted inserted replaced
108:dd5620bf8659 109:2b094b8fb422
680 .P 680 .P
681 The two configure options 681 The two configure options
682 .CW --with-editor=EDITOR 682 .CW --with-editor=EDITOR
683 .CW --with-pager=PAGER 683 .CW --with-pager=PAGER
684 were used to specify the default editor and pager at configure time. 684 were used to specify the default editor and pager at configure time.
685 Doing so at configure time made sense in the Eighties, 685 Doing so at configure time made sense in the eighties,
686 when the set of available editors and pagers varied much across 686 when the set of available editors and pagers varied much across
687 different systems. 687 different systems.
688 Today, the situation is more homogeneous. 688 Today, the situation is more homogeneous.
689 The programs 689 The programs
690 .Pn vi 690 .Pn vi
1064 .U3 "Draft Folder Facility 1064 .U3 "Draft Folder Facility
1065 .P 1065 .P
1066 A change early in the project was the complete transition from 1066 A change early in the project was the complete transition from
1067 the single draft message to the draft folder facility. 1067 the single draft message to the draft folder facility.
1068 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 1068 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860
1069 The draft folder facility was introduced in the mid-Eighties, when 1069 The draft folder facility was introduced in the mid-eighties, when
1070 Rose and Romine called it a ``relatively new feature''. 1070 Rose and Romine called it a ``relatively new feature''.
1071 .[ 1071 .[
1072 rose romine real work 1072 rose romine real work
1073 .] 1073 .]
1074 Since then, the facility had existed but was deactivated by default. 1074 Since then, the facility had existed but was deactivated by default.
1582 ``\-[no]reverse under #ifdef BERK (I really HATE this)'' 1582 ``\-[no]reverse under #ifdef BERK (I really HATE this)''
1583 by Rose and 1583 by Rose and
1584 ``Lists messages in reverse order with the `\-reverse' switch. 1584 ``Lists messages in reverse order with the `\-reverse' switch.
1585 This should be considered a bug.'' by Romine in the documentation. 1585 This should be considered a bug.'' by Romine in the documentation.
1586 The question remains why neither Rose and Romine had fixed this 1586 The question remains why neither Rose and Romine had fixed this
1587 bug in the Eighties when they wrote these comments nor has anyone 1587 bug in the eighties when they wrote these comments nor has anyone
1588 thereafter. 1588 thereafter.
1589 1589
1590 1590
1591 .ig 1591 .ig
1592 1592
1636 1636
1637 1637
1638 1638
1639 .H1 "Modernizing 1639 .H1 "Modernizing
1640 .P 1640 .P
1641 The code base of mmh originates from the late Seventies. 1641 The code base of mmh originates from the late seventies.
1642 Through the Eighties, extensive work had been done on it. 1642 Through the eighties, extensive work had been done on it.
1643 In the Nineties, it had been partly reorganized and extended. 1643 In the nineties, it was partly reorganized and extended.
1644 Relicts from each decade have gathered in the code base. 1644 Relicts from each decade have gathered in the code base.
1645 My goal was to modernize the code base. 1645 My goal was to modernize the code base.
1646 1646
1647 .P 1647 .P
1648 FIXME functional aspect only here 1648 FIXME functional aspect only here
1650 FIXME ref to `code style' for non-functional aspects. 1650 FIXME ref to `code style' for non-functional aspects.
1651 1651
1652 1652
1653 .H2 "Code Relicts 1653 .H2 "Code Relicts
1654 .P 1654 .P
1655 My position to drop obsolete functionality of mmh to remove old code 1655 My position to drop obsolete functions of mmh, in order to remove old code,
1656 is much more revolutional than the nmh community likes to have it. 1656 is much more revolutional than the nmh community likes to have it.
1657 Working on an experimental version, I was able to quickly drop 1657 Working on an experimental version, I was able to quickly drop
1658 functionality I considered ancient. 1658 functionality I considered ancient.
1659 The need for consensus with peers would have slowed this process down. 1659 The need for consensus with peers would have slowed this process down.
1660 Without the need to justify my decisions, I was able to rush forward. 1660 Without the need to justify my decisions, I was able to rush forward.
1680 I simply dropped the cruft. 1680 I simply dropped the cruft.
1681 .P 1681 .P
1682 The decision to drop a feature was based on literature research and 1682 The decision to drop a feature was based on literature research and
1683 careful thinking, but whether having had contact to this particular 1683 careful thinking, but whether having had contact to this particular
1684 feature within my own computer life served as a rule of thumb. 1684 feature within my own computer life served as a rule of thumb.
1685 My reasons are always made clean in the commit message for the 1685 Always, I explained my reasons in the commit messages
1686 version control system. 1686 in the version control system.
1687 Hence, others can comprehend my view and argue for undoing the change 1687 Hence, others can comprehend my view and argue for undoing the change
1688 if I have missed an important aspect. 1688 if I have missed an important aspect.
1689 I was quick in dropping parts.
1690 I rather re-included falsely dropped parts than going a slower pace.
1691 Mmh is experimental work; it required tough decisions.
1689 1692
1690 1693
1691 .U3 "Forking 1694 .U3 "Forking
1692 .P 1695 .P
1693 In being a tool chest, MH creates many processes. 1696 Being a tool chest, MH creates many processes.
1694 In earlier times 1697 In earlier times
1695 .Fu fork() 1698 .Fu fork()
1696 had been an expensive system call, because the process's image needed 1699 had been an expensive system call, because the process's image needed
1697 to be duplicated completely at once. 1700 to be duplicated completely at once.
1698 This was especially painfull in the common case when the image gets 1701 This was especially painful in the common case when the image gets
1699 replaced by a call to 1702 replaced by a call to
1700 .Fu exec() 1703 .Fu exec()
1701 right after having forked the child process. 1704 right after having forked the child process.
1702 The 1705 The
1703 .Fu vfork() 1706 .Fu vfork()
1729 .] 1732 .]
1730 I replaced all calls to 1733 I replaced all calls to
1731 .Fu vfork() 1734 .Fu vfork()
1732 with calls to 1735 with calls to
1733 .Fu fork() . 1736 .Fu fork() .
1737 .Ci 40821f5c1316e9205a08375e7075909cc9968e7d
1734 .P 1738 .P
1735 Related to the costs of 1739 Related to the costs of
1736 .Fu fork() 1740 .Fu fork()
1737 is the probability of its success. 1741 is the probability of its success.
1738 In the Eighties on heavy loaded systems, calls to 1742 In the eighties, on heavy loaded systems, calls to
1739 .Fu fork() 1743 .Fu fork()
1740 were prone to failure. 1744 were prone to failure.
1741 Hence, many of the 1745 Hence, many of the
1742 .Fu fork() 1746 .Fu fork()
1743 calls in the code were wrapped into loops to retry the 1747 calls in the code were wrapped into loops to retry the
1744 .Fu fork() 1748 .Fu fork()
1745 several times, for higher changes to succeed, eventually. 1749 several times, to increase the changes to succeed, eventually.
1746 On modern systems, failing calls to 1750 On modern systems, a failing
1747 .Fu fork() 1751 .Fu fork()
1748 are unusual. 1752 call is unusual.
1749 Hence, in the rare case when 1753 Hence, in the rare case when
1750 .Fu fork() 1754 .Fu fork()
1751 fails, mmh programs simply abort. 1755 fails, mmh programs simply abort.
1752 1756 .Ci 5fbf37ee68e018998ada61eeab73e035b26834b6
1753 1757
1754 .U3 "Obsolete Header Fields 1758
1759 .U3 "Header Fields
1755 .BU 1760 .BU
1756 The 1761 The
1757 .Hd Encrypted 1762 .Hd Encrypted
1758 header field was introduced by RFC\|822, 1763 header field was introduced by RFC\|822,
1759 but already marked legacy in RFC\|2822. 1764 but already marked as legacy in RFC\|2822.
1760 OpenPGP provides the basis for standardized exchange of encrypted 1765 Today, OpenPGP provides the basis for standardized exchange of encrypted
1761 messages [RFC\|4880, RFC\|3156]. 1766 messages [RFC\|4880, RFC\|3156].
1762 The support for 1767 Hence, the support for
1763 .Hd Encrypted 1768 .Hd Encrypted
1764 header fields is removed in mmh. 1769 header fields is removed in mmh.
1770 .Ci 064527f7b57ab050e5af13e15ad99aeeab125857
1765 .BU 1771 .BU
1766 Native support for 1772 Native support for
1767 .Hd Face 1773 .Hd Face
1768 header fields has been removed, as well. 1774 header fields has been removed, as well.
1775 .Ci 8e5be81f784682822f5e868c1bf3c8624682bd23
1769 This feature is similar to the 1776 This feature is similar to the
1770 .Hd X-Face 1777 .Hd X-Face
1771 header field in its intent, 1778 header field in its intent,
1772 but takes a different approach to store the image. 1779 but takes a different approach to store the image.
1773 Instead of encoding the image data directly into the header field, 1780 Instead of encoding the image data directly into the header field,
1774 the it contains the hostname and UDP port where the image 1781 it contains the hostname and UDP port where the image
1775 date could be retrieved. 1782 date can be retrieved.
1776 There is even a third system, invented in 2005. 1783 There exists even a third Face system,
1777 Although it re-uses the 1784 which is the successor of
1785 .Hd X-Face ,
1786 although it re-uses the
1778 .Hd Face 1787 .Hd Face
1779 header field, it is the successor of 1788 header field.
1780 .Hd X-Face 1789 It was invented in 2005 and supports colored PNG images.
1781 with support for colored PNG images.
1782 None of the Face systems described here is popular today. 1790 None of the Face systems described here is popular today.
1783 Hence, mmh has no direct support for them. 1791 Hence, mmh has no direct support for them.
1784 .BU 1792 .BU
1785 The 1793 The
1786 .Hd Content-MD5 1794 .Hd Content-MD5
1790 [RFC\|1864]. 1798 [RFC\|1864].
1791 The proper approach to verify content integrity in an 1799 The proper approach to verify content integrity in an
1792 end-to-end relationship is the use of digital cryptography. 1800 end-to-end relationship is the use of digital cryptography.
1793 .\" XXX (RFCs FIXME). 1801 .\" XXX (RFCs FIXME).
1794 On the other hand, transfer protocols should detect corruption during 1802 On the other hand, transfer protocols should detect corruption during
1795 each transmission. The TCP includes a checksum field therefore. 1803 the transmission.
1804 The TCP includes a checksum field therefore.
1796 These two approaches in combinations render the 1805 These two approaches in combinations render the
1797 .Hd Content-MD5 1806 .Hd Content-MD5
1798 header field superfluous. 1807 header field superfluous.
1799 The nmh-workers mailing list archive contains about 4\|200 messages, 1808 Not a single one out of 4\|200 messages from two decades
1800 ranging from 1992 until today. 1809 in an nmh-workers mailing list archive contains a
1801 Not a single one had a
1802 .Hd Content-MD5 1810 .Hd Content-MD5
1803 header field. 1811 header field.
1804 Neither did any of the 60\|000 messages in my personal mail storage. 1812 Neither did any of the 60\|000 messages in my personal mail storage.
1805 Removing the support for this header field, 1813 Removing the support for this header field,
1806 removed the last place where MD5 computation was needed. 1814 removed the last place where MD5 computation was needed.
1815 .Ci 31dc797eb5178970d68962ca8939da3fd9a8efda
1807 Hence, the MD5 code could be removed as well. 1816 Hence, the MD5 code could be removed as well.
1808 Over 500 lines of code vanished by this one change. 1817 Over 500 lines of code vanished by this one change.
1809 1818
1810 1819
1811 .U3 "MMDF maildrop support 1820 .U3 "MMDF maildrop support
1812 .P 1821 .P
1813 This type of format is conceptionally similar to the mbox format, 1822 This type of format is conceptionally similar to the mbox format,
1814 but uses a different message delimiter (`\fL^A^A^A^A\fP' instead of 1823 but uses a different message delimiter (`\fL^A^A^A^A\fP' instead of
1815 `\fLFrom\0\fP'). 1824 `\fLFrom\0\fP').
1816 Mbox is the de-facto standard maildrop format on Unix, 1825 Mbox is the de-facto standard maildrop format on Unix,
1817 whereas the MMDF maildrop format is hardly still known today. 1826 whereas the MMDF maildrop format became forgotten.
1818 I did drop MMDF maildrop format support. 1827 I did drop MMDF maildrop format support.
1819 .P 1828 Mbox is the only packed mailbox format supported in mmh.
1820 The simplifications within the code were only moderate. 1829 .P
1821 Switches could be removed from 1830 The simplifications within the code were moderate.
1822 .L packf 1831 Mainly, the reading and writing of MMDF mailbox files was removed.
1823 and 1832 But also, switches of
1824 .L rcvpack , 1833 .Pn packf
1825 which generate packed mailboxes. 1834 and
1826 Only one packed mailbox format remained: mbox. 1835 .Pn rcvpack
1827 The more important changes affected the equally named mail parsing 1836 could be removed.
1828 routine in 1837 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0
1829 .Fn sbr/m_getfld.c . 1838 In the message parsing function
1830 The MMDF code had been removed there, but as now only one packed mailbox 1839 .Fn sbr/m_getfld.c ,
1831 format is left, further code structure simplifications may be possible. 1840 knowledge of MMDF packed mail boxes was removed.
1841 .Ci 684ec30d81e1223a282764452f4902ed4ad1c754
1842 Further code structure simplifications may be possible there,
1843 because only one single packed mailbox format is left to be supported.
1832 I have not worked on them yet because 1844 I have not worked on them yet because
1833 .Fu m_getfld() 1845 .Fu m_getfld()
1834 is heavily optimized and thus dangerous to touch. 1846 is heavily optimized and thus dangerous to touch.
1835 The risk of damaging the intricate workings of the optimized code is 1847 The risk of damaging the intricate workings of the optimized code is
1836 too high. 1848 too high.
1837 .\" XXX: move somewhere else 1849 .\" XXX: move somewhere else
1838 This problem is know to the developers of nmh, too. 1850 This problem is know to the developers of nmh, too.
1839 They also avoid touching this minefield if possible. 1851 They also avoid touching this minefield.
1840 1852
1841 1853
1842 .U3 "Prompter's Control Keys 1854 .U3 "Prompter's Control Keys
1843 .P 1855 .P
1844 The program 1856 The program
1867 .Pn stty . 1879 .Pn stty .
1868 The switches are removed now 1880 The switches are removed now
1869 .Ci 0bd9750710cdbab80cfb4036dd87af20afe1552f . 1881 .Ci 0bd9750710cdbab80cfb4036dd87af20afe1552f .
1870 1882
1871 1883
1872 .U3 "Hardcopy terminal support 1884 .U3 "Hardcopy Terminal Support
1873 .P 1885 .P
1874 More of a funny anecdote is a check for printing to a 1886 More of a funny anecdote is a check for being connected to a
1875 hardcopy terminal that remained in the code until Spring 2012, 1887 hardcopy terminal.
1876 when I finally removed it 1888 It remained in the code until Spring 2012, when I finally removed it
1877 .Ci b7764c4a6b71d37918a97594d866258f154017ca . 1889 .Ci b7764c4a6b71d37918a97594d866258f154017ca .
1878 I surely would be very happy to see such a terminal in action, 1890 I would be truly happy to see such a terminal in action today,
1879 maybe actually being able to work on it, but I fear my chances are null. 1891 maybe even being able to work on it.
1880 .P 1892 But I fear my chances are null.
1881 The check only prevented a pager to be placed between the outputting 1893 .P
1894 The check only prevented a pager to be placed between the printing
1882 program (\c 1895 program (\c
1883 .Pn mhl ) 1896 .Pn mhl )
1884 and the terminal. 1897 and the terminal.
1885 In nmh, this could have been ensured with the 1898 In nmh, this could have been ensured statically with the
1886 .Sw -nomoreproc 1899 .Sw -nomoreproc
1887 at the command line statically, too. 1900 at the command line, too.
1888 In mmh, set the profile entry 1901 In mmh, seting the profile entry
1889 .Pe Pager 1902 .Pe Pager
1890 or the environment variable 1903 or the environment variable
1891 .Ev PAGER 1904 .Ev PAGER
1892 to 1905 to
1893 .Pn cat . 1906 .Pn cat
1907 does the job.
1894 1908
1895 1909
1896 1910
1897 1911
1898 .H2 "Attachments 1912 .H2 "Attachments
1899 .P 1913 .P
1900 The mind model of email attachments is unrelated to MIME. 1914 The mind model of email attachments is unrelated to MIME.
1901 Although the MIME RFCs (2045 through 2049) define the technical 1915 Although the MIME RFCs (2045 through 2049) define the technical
1902 requirements for having attachments, they do not mention the the word 1916 requirements for having attachments, they do not mention the word
1903 ``attachment''. 1917 ``attachment''.
1904 Instead of attachments, MIME talks about ``multi-part message bodies'' 1918 Instead of attachments, MIME talks about ``multi-part message bodies''
1905 [RFC\|2045], a more general concept. 1919 [RFC\|2045], a more general concept.
1906 Multi-part messages are messages 1920 Multi-part messages are messages
1907 ``in which one or more different 1921 ``in which one or more different
1908 sets of data are combined in a single body'' 1922 sets of data are combined in a single body''
1909 [RFC\|2046]. 1923 [RFC\|2046].
1910 MIME keeps its descriptions generic; 1924 MIME keeps its descriptions generic;
1911 it does not imply specific usage models. 1925 it does not imply specific usage models.
1912 In email one usage model became prevalent: attachments. 1926 One usage model became prevalent: attachments.
1913 The idea is having a main text document with files of arbitrary kind 1927 The idea is having a main text document with files of arbitrary kind
1914 attached to it. 1928 attached to it.
1915 In MIME terms, this is a multi-part message having a text part first 1929 In MIME terms, this is a multi-part message having a text part first
1916 and parts of arbitray type following. 1930 and parts of arbitray type following.
1917 .P 1931 .P
1918 MH's MIME support is a direct implementation of the RFCs. 1932 MH's MIME support is a direct implementation of the RFCs.
1919 The perception of the topic described in the RFCs is clearly visible 1933 The perception of the topic described in the RFCs is clearly visible
1920 in MH's implementation. 1934 in MH's implementation.
1921 Thus, MH had all the MIME features but no idea of attachments. 1935 In result, MH had all the MIME features but no idea of attachments.
1922 Today, however, users don't need all the MIME features but they want 1936 But users don't need all the MIME features,
1923 convenient attachment handling. 1937 they want convenient attachment handling.
1938
1924 1939
1925 .U3 "Composing MIME Messages 1940 .U3 "Composing MIME Messages
1926 .P 1941 .P
1927 In order to improve the situation on the message composing side, 1942 In order to improve the situation on the message composing side,
1928 Jon Steinhart had added an attachment system to nmh in 2002. 1943 Jon Steinhart had added an attachment system to nmh in 2002.