{"id":13726049,"url":"https://github.com/nbeaver/why-linux-is-better","last_synced_at":"2025-05-07T21:31:12.459Z","repository":{"id":20991008,"uuid":"24280481","full_name":"nbeaver/why-linux-is-better","owner":"nbeaver","description":"Objective reasons to prefer Linux to Windows.","archived":false,"fork":false,"pushed_at":"2021-11-15T05:35:18.000Z","size":322,"stargazers_count":528,"open_issues_count":3,"forks_count":18,"subscribers_count":11,"default_branch":"master","last_synced_at":"2024-08-04T01:28:28.527Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Makefile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nbeaver.png","metadata":{"files":{"readme":"readme.rst","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-09-21T03:00:11.000Z","updated_at":"2024-06-16T12:54:26.000Z","dependencies_parsed_at":"2022-07-31T05:07:59.962Z","dependency_job_id":null,"html_url":"https://github.com/nbeaver/why-linux-is-better","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbeaver%2Fwhy-linux-is-better","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbeaver%2Fwhy-linux-is-better/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbeaver%2Fwhy-linux-is-better/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbeaver%2Fwhy-linux-is-better/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nbeaver","download_url":"https://codeload.github.com/nbeaver/why-linux-is-better/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224654106,"owners_count":17347670,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:02:50.736Z","updated_at":"2024-11-14T16:33:14.234Z","avatar_url":"https://github.com/nbeaver.png","language":"Makefile","funding_links":[],"categories":["Makefile"],"sub_categories":[],"readme":".. -*- coding: utf-8 -*-\n\n============================================\nObjective reasons to prefer Linux to Windows\n============================================\n\n:Author: Nathaniel Beaver\n:Date: September 20, 2014\n:Copyright: This document is released under a `Creative Commons Attribution 4.0 International License`_.\n\n.. _Creative Commons Attribution 4.0 International License: https://creativecommons.org/licenses/by/4.0/\n\n.. |--| unicode:: U+2013   .. en dash\n.. |---| unicode:: U+2014  .. em dash, trimming surrounding whitespace\n   :trim:\n\n.. contents::\n\n++++++++++++\nIntroduction\n++++++++++++\n\n\"Linux is more stable and reliable.\"\n\n\"Linux is more secure and private.\"\n\n\"Linux is faster and less bloated.\"\n\n\"Linux is more flexible and customizable.\"\n\n\"Linux gives you more control over your computer.\"\n\nStop it.\n\nClichés like these are vague and wishy-washy,\nand they are founded on anecdotes and hearsay.\nThey cause `endless, unnecessary debates`_ and make a muddle of the facts.\n\n.. _endless, unnecessary debates: https://linux.slashdot.org/\n\nIt's easy to opine about one's preferred operating system,\nbut harder to give objective, concrete examples.\n\nWith the caveat that both Windows and Linux are moving targets,\nthis document describes some specific technical reasons\nto prefer using Linux as a desktop operating system.\n\nThese reasons are not exhaustive\n|---| and not meant to be |---|\nbut aim to be representative.\n\nThis document will not cover servers, phones, or embedded devices.\n\nThis document  will not cover closed vs. open source development,\nbut will instead focus on functionality.\nThere is plenty of discussion\nof the advantages and disadvantages of open source elsewhere.\n\n(Besides, what is there to discuss\nwhen we now know that `even Microsoft loves open source`_?)\n\n.. _even Microsoft loves open source: https://www.networkworld.com/article/2216878/microsoft---we-love-open-source-.html\n\nThis discussion will only mention Microsoft and other companies\nin so far as their actions are directly relevant\nto the technically capabilities of Windows and Linux.\n\n(As an aside, Microsoft gets a lot of guff in the open-source world,\nbut its behavior is typical for a corporation\nwhose a bottom line relies on sales of proprietary software and devices.\nIt's economics, not malice.)\n\nThe discussion is intended to be as accurate as possible,\nat the cost of possible dryness due to technical detail.\n\nI am most familiar with the Debian-based family of Linux distributions,\nso my remarks will necessarily touch on these more,\nbut I have tried to include other distributions when possible.\n\nIn this document, the term \"Linux\" is shorthand for the entire distribution,\nincluding bootloader, kernel, shell, window manager, package manager, etc.\nSimilarly, the term \"Windows\"\nrefers to all default components of modern versions of Microsoft Windows NT,\nincluding Windows XP, Windows Vista, Windows 7, and Windows 8.\n\nMany of the same arguments in favor of Linux\nalso apply to the BSD family of operating systems\n(and POSIX-compliant operating systems in general),\nbut unfortunately I am not familiar enough with any of them\nto comment specifically.\n\n+++++++++++++++\nWhy write this?\n+++++++++++++++\n\nMost people use Windows on the desktop because it's the default.\nFew are aware of the benefits of switching to another operating system,\nand even fewer are willing to put in the effort to do so.\n\nA Windows user interested in trying Linux\nwill probably have difficulty finding a coherent reason to do so,\nsince comparisons of operating systems\ntend to be vague, uninformed, or opinion-based.\n\nEven people who know and use Linux by choice\nmay not do a good job of explaining its benefits to their colleagues\nespecially without putting down Windows users\nor Windows applications in general.\n\nAlso, there are many open source alternatives to Linux on the desktop,\nincluding a binary-compatible clone of Windows called `ReactOS`_.\nIf it were just a matter of being open source,\nwhy bother with the additional effort to learn Linux?\n\n.. _ReactOS: https://reactos.org/\n\nEven if you don't use Linux or Windows,\nit's useful to know where Linux has an edge,\nsince these issues are relevant to all operating systems.\n\nIf you are a new Linux user,\nthis document is intended to inform you\nabout some of the benefits of Linux you may not be aware of,\nand to dig deeper if you are interested.\n\nIf you are an experienced Linux user,\nthis document is a test of the theory that the fastest way to get feedback\nis to be publicly wrong about something people care about.\nCorrections and additions are welcome.\n\nIf you are a Windows user:\n\n- This document is not intended to convert you to Linux.\n  (That would be silly.)\n- This document does not claim that Windows is inferior in every way,\n  or even that it is inferior overall.\n- Instead, this is meant to provide insight\n  into why some people choose to use Linux as a desktop operating system,\n  despite its shortcomings,\n  and possibly to challenge some misconceptions\n  that people have about Linux and Windows.\n- Corrections and additions are, of course, welcome.\n  Windows developers are ones who know the most about its flaws and strengths.\n- Finally, definitions of better and worse are necessarily subjective,\n  despite the title's claim of objectivity.\n  You may heartily disagree with substantial parts of what follows,\n  but perhaps it may be useful to you, even so.\n\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\nIntrinsic technical deficiencies of the Windows NT operating system\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nThis is a list of examples of specific limitations\nthat are the result of the Windows kernel or API.\n\n-------------------------\nLive booting limitations.\n-------------------------\n\nWindows LiveCDs, `though they do exist`_,\nare hampered by licensing restrictions and technical limitations.\n\n.. _though they do exist: https://en.wikipedia.org/wiki/Windows_Preinstallation_Environment\n\nFor example, `until Windows 8`_, desktop versions of Windows\ncould not boot from a USB.\n(And while running a live USB of Windows 8,\nit is still not possible to mount internal hard disks.)\n\n.. _until Windows 8: https://technet.microsoft.com/en-us/library/hh831833.aspx\n\nThe `BartPE LiveCD building program`_\nis 3rd party software that will run on any version of Windows,\nbut it is `only able to make`_ a LiveCD\nfor Windows XP or Windows Server 2003.\n\n.. _BartPE LiveCD building program: https://en.wikipedia.org/wiki/BartPE\n.. _only able to make: https://www.betaarchive.com/forum/viewtopic.php?t=22258\n\nThere is also the `WinBuilder`_ project,\nwhich is the closest to a fully-functional LiveCD of modern Windows versions,\nbut installing software and drivers is still sometimes a challenge.\n\n.. _WinBuilder: https://documentation.help/Win-Builder/wboverview.html\n\n    If the Virtual Machine fails don’t worry too much. Just because the Virtual\n    Machine fails to boot right does not mean your boot media won’t work, I’ve\n    seen odd results depending on the amount of memory the VM has and what\n    drivers I load.\n\nhttps://www.irongeek.com/i.php?page=security/winbuilder-win7pe-se-tutorial\n\nThe absence of fully functional live versions of Windows\nmakes it difficult to use for, e.g,\ndetermining if a bug is due to hardware or software problems,\nrecovering data from a machine with filesystem corruption or bad disk sectors,\nand testing out different versions of an OS\nwithout making a new hard drive partition.\n\n`Live versions`_ of Linux are full operating systems,\nable to mount and repartition disks,\nconnect to the internet and run a web browser,\nand even retain settings and data on the next boot-up\n(for `persistent live USB flash drives`_).\nThis makes live versions of Linux useful for\nrecovering files from damaged hard drives,\nmaking bootable backups of an entire drive,\nscanning a disk for malware\nwithout loading a potentially compromised operating system,\ndistinguishing hardware problems from software problems,\nand other tasks requiring a temporary operating system.\n\n.. _Live versions: https://www.linux.com/news/livecd-boot-benchmarks-round-1-popular-livecds/\n.. _persistent live USB flash drives: https://askubuntu.com/questions/295701/what-would-be-the-differences-between-a-persistent-usb-live-session-and-a-instal\n\nSome live Linux distributions, such as `Puppy Linux`_,\nare lightweight enough that they default to `running from a RAM disk`_,\nand consequently have much faster disk I/O\nthan an OS that must access a spinning hard drive.\n(This comes at the cost of disk space being limited by RAM.\nThere's no reason you can't mount an internal or external drive\nto store files, though.)\n\n.. _Puppy Linux: https://wikka.puppylinux.com/HomePage\n.. _running from a RAM disk: https://en.wikipedia.org/wiki/List_of_Linux_distributions_that_run_from_RAM\n\nVery little hardware comes with a `desktop version of Linux pre-installed`_,\nso live versions of Linux tend to work very well,\nsince that is almost always the way it is installed.\n\n.. _desktop version of Linux pre-installed: https://help.ubuntu.com/community/UbuntuPre-installed\n\n--------------------------------------\nVirtualization and driver limitations.\n--------------------------------------\n\nSimilar to live booting,\nLinux is often run as a virtual machine,\nand consequently it is well-adapted to changes in hardware.\n\nAn existing Linux partition on a physical hard drive\ncan, with some care, be virtualized and ran on another machine,\na virtue which Windows does not share.\n\n    Windows installations, unlike Linux, cannot easily be moved from one\n    hardware to another. This is not just due to Microsoft's activation\n    mechanism but the fact that the installed kernel and drivers depend on the\n    actual hardware.\n\nhttps://www.virtualbox.org/wiki/Migrate_Windows\n\n    The problem lies with Windows, in that its driver settings, particularly\n    for storage devices, are not portable. Unless you modify the Windows\n    registry to force start storage drivers for both the physical and virtual\n    machines, you will mostly likely end up with a ``0x0000007B`` STOP blue\n    screen error each time which will require a restore or modifying the\n    registry to fix.\n\nhttps://askubuntu.com/questions/174581/is-there-any-way-to-boot-windows-7-partition-in-virtual-machine\n\nIt's even possible to transfer a Linux install to a USB enclosure\nand boot it directly on another machine of the same architecture,\nalthough the kernel will lack proprietary drivers (e.g. some wifi cards).\n\n---------------------\nMaximum path lengths.\n---------------------\n\nWindows path lengths `are limited to 260 characters`_, including filename.\n(In practice, it is often more like `199 characters`_.)\nThis is `not a flaw in NTFS`_ or Windows per se,\nbut in the `non-Unicode version of the Windows API`_.\n\n.. _are limited to 260 characters: https://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath\n.. _not a flaw in NTFS: https://msdn.microsoft.com/en-us/library/ee681827%28VS.85%29.aspx#limits\n.. _non-Unicode version of the Windows API: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath\n.. _199 characters: https://stackoverflow.com/a/265817\n.. _have not done so: https://blogs.msdn.com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx\n\nThis problem can be avoided by using Unicode versions of the API calls,\nbut many applications\n(e.g. `Windows Explorer`_, `.NET`_ and `consequently Powershell`_)\nhave not done so.\n\n.. _Windows Explorer: https://www.gibixonline.com/post/2009/08/23/Explorer-still-limited-by-MAX_PATH\n.. _.NET: https://blogs.msdn.com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx\n.. _consequently Powershell: https://connect.microsoft.com/PowerShell/feedback/details/276235/path-length-limitations\n\nOf course, most OS restrictions are `not an issue in well-written software`_.\nMaybe Windows paths `are long enough`_.\nIs ``MAX_PATH`` an actual problem in real software?\n\n.. _not an issue in well-written software: https://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759.aspx\n.. _are long enough: https://blog.codinghorror.com/filesystem-paths-how-long-is-too-long/\n\nJudging by the number of bug reports and complaints,\nthe answer appears to be yes.\n\n#. https://github.com/joyent/node/issues/6960\n#. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61922\n#. https://llvm.org/bugs/show_bug.cgi?id=20440\n#. https://bugs.eclipse.org/bugs/show_bug.cgi?id=164186\n#. https://bugs.python.org/issue19636\n#. https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14228\n#. https://social.msdn.microsoft.com/forums/vstudio/en-US/e4a8ee8d-b25d-4b47-8c0c-88329bbece7d/please-increase-maxpath-to-32767\n#. https://stackoverflow.com/questions/1880321/why-does-the-260-character-path-length-limit-exist-in-windows\n#. https://stackoverflow.com/questions/1065993/has-windows-7-fixed-the-255-character-file-path-limit\n#. https://stackoverflow.com/questions/833291/is-there-an-equivalent-to-winapis-max-path-under-linux-unix\n#. https://stackoverflow.com/questions/1858907/svn-command-line-utility-will-not-work-if-full-file-name-is-longer-then-256-char\n#. https://www.itefix.net/content/rsync-file-name-too-long-91\n#. https://web.archive.org/web/20161112033727/http://sqlite.1065341.n5.nabble.com/Path-Length-Limit-on-Windows-td70642.html\n#. https://sumedha.blogspot.com/2011/01/svn-checkout-fails-windows-max-path.html\n#. http://forums.mozillazine.org/viewtopic.php?f=29\u0026t=263489\n\nBut the bigger issue\nis that many Windows developers are `so used to`_ `working around`_ the problem\nthat it has become deeply entrenched and may `never be fixed`_.\n\n.. _so used to: https://blogs.msdn.com/b/tomholl/archive/2007/02/04/enterprise-library-and-the-curse-of-max-path.aspx\n.. _working around: https://stackoverflow.com/a/11212007\n.. _never be fixed: https://archive.md/y6to3\n\nThe Linux kernel does have an adjustable pathname length limit;\nit's `4096 chars in typical kernels and filesystems`_.\nYou can check it by running::\n\n    $ getconf PATH_MAX /\n\nHowever, `this limit is not enforced`_\nby any filesystems that Linux runs on,\nand consequently some ``libc`` implementations\nwere for a while `susceptible to buffer overflow`_\nwhen trying to resolve canonical file paths.\n\n.. _4096 chars in typical kernels and filesystems: https://unix.stackexchange.com/questions/28997/on-deep-created-directories\n.. _this limit is not enforced: https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html\n.. _susceptible to buffer overflow: https://stackoverflow.com/questions/1171833/how-to-get-the-absolute-path-of-a-file-programmatically-with-out-realpath-unde\n\nThe 2008 POSIX revision has `addressed the issue`_, but prior to this\nthe Linux kernel had to make non-standard modifications to avoid overflow,\nand `warned about the problem`_ in the ``realpath (3)`` man page\nof the Linux Programmer's Manual.\n\n.. _addressed the issue: https://www.securecoding.cert.org/confluence/display/seccode/FIO02-C.+Canonicalize+path+names+originating+from+tainted+sources\n.. _warned about the problem: https://linux.die.net/man/3/realpath\n\nThis illustrates that while the Linux kernel developers\nscrupulously avoid breaking external compatibility,\nthey also intentionally expose false assumptions,\nsince false assumptions tend to cause hard-to-fix bugs.\nThis is why Linus Torvalds\n`chose an unusually high`_ timer interrupt frequency for Linux:\n\n    I chose 1000 originally partly as a way to make sure that people that\n    assumed HZ was 100 would get a swift kick in the pants. That meant making\n    a _big_ change, not a small subtle one. For example, people tend to react\n    if \"uptime\" suddenly says the machine has been up for a hundred days (even\n    if it's really only been up for ten), but if it is off by just a factor of\n    two, it might be overlooked.\n\n    --- Linus Torvalds, *Selectable Frequency of the Timer Interrupt* (2005)\n\n.. _chose an unusually high: https://lkml.org/lkml/2005/7/8/263\n\n----------------------------\nFilename case-insensitivity.\n----------------------------\n\nLinux uses case-sensitive filenames\nbecause Unix used case-sensitive filenames.\nUnix was case-sensitive because Multics was case-sensitive.\nMultics was case-sensitive because the ASCII standard\nincluded both an uppercase and a lowercase alphabet. [#Multics_case_sensitive]_\n\nWhy did ASCII do this?\nIt was a close call, and almost didn't happen.\n\nTelegraphy codes used uppercase only,\nor at least did not distinguish upper and lowercase.\nEven ITA2, an international standard from 1930,\nused a 5-bit code with a shift to switch between letters and figures,\nbut not upper and lowercase. [#ITA2]_\nSimilarly, punched cards used uppercase letters only.\n\nEncodings with different bit patterns for uppercase and lowercase\nhad been proposed as early as 1959, [#Bemer_1959]_\nthough they were not widely implemented.\nFor example, the IBM 7030 \"Stretch\" supercomputer,\nfirst installed at Los Alamos National Laboratory in 1961,\nhad an 8-bit encoding that interleaved uppercase and lowercase alphabets.\n[#Stretch_supercomputer]_\nHowever, the 7030's character encoding did not catch on.\n\nEarly on, ASCII committee concluded that 6-bit encodings (64 bit patterns)\nwere insufficient to include both control characters and special characters\nin addition to the required 26 alphabetics and 10 numerics,\nso they decided to use a 7-bit code.\nHowever, ASCII was designed to include a useful 6-bit subset,\nwhich could only fit a single alphabet.\n\n    The consideration of a 6-bit, 64-character graphic subset was important to\n    the standards committee. If the ultimate decision was that columns 6 and 7\n    would be for graphics, then columns 2 through 7 would contain Space, 94\n    graphics, and Delete. But, even with the code providing 94 graphics, a\n    major assumption of the standards committee was that data processing\n    applications would, for the foreseeable future, be satisfied with a\n    monocase alphabet (that is, a 64- or less graphic subset) as they had in\n    the past---that 64-character printers would predominate. So it was\n    important to be able to derive a 64-character, monocase alphabet, graphic\n    subset from the code by simple, not complex, logic.\n\n    --- Charles E. Mackenzie, \"Coded character sets: history and development\"\n    (1980), p.228\n\nIn fact, some of the committee members\nwanted to reserve the remaining space for control characters.\n\n    The conclusion of the preceding paragraph is based on the assumption\n    that two alphabets, small letters and capital letters, would be included\n    in the 7-bit code and that decision had not yet been made. If the\n    decision was ultimately made that columns 6 and 7 would would contain\n    controls, then small letters would not be included in the 7-bit code. ``*``\n\n    ``*`` If the committee did decide for controls in columns 6 and 7, it is\n    still likely that they would have wanted an alphabet of small letters to be\n    provided. Presumably, the small letter alphabet would then have been\n    provided by a caseshift approach.\n\n    --- Ibid, p.232\n\nThough the committee first formed in 1961,\nit wasn't until late 1963\nthat they finally agreed to include a lowercase alphabet,\nlargely because of the influence of the\nInternational Telegraph and Telephone Consultative Committee (CCITT).\n\n    At the first meeting of ISO/TC97/SC2 in 1963 October 29-31, a resolution\n    was passed that the lower-case alphabet should be assigned to\n    columns 6 and 7.\n\n    --- Ibid, p. 246\n\n    The ISO proposal, though, did not include the lower case alphabet and the\n    five accent marks that the CCITT considered essential.\n\n    --- Eric Fisher, \"The Evolution of Character Codes, 1874-1968\", p.22\n\nWhy is it useful for filenames to include upper and lowercase?\n\nIt can make filenames more intelligible,\nsuch as distinguishing between\nthe abbreviation for United State (\"US\")\nand the first-person plural objective pronoun (\"us\")\nin paths such as ``/usr/share/X11/locale/en_US.UTF-8/``.\n\nIt also allows more possibilities for filenames,\nand makes filename comparisons simpler and faster\nbecause they don't have to occasionally convert\nto uppercase or lowercase.\n\n    Bear in mind that it's MUCH more work for a filesystem to be\n    case-insensitive than -sensitive. A filesystem is case-sensitive by\n    default, in the simplest case; it can only be made case-INsensitive through\n    a lot of extra engineering. In UNIX, all the system has to do is sort on\n    the ASCII values of the first letters of the filenames. In the Mac OS and\n    Windows, the filesystem has to be smart enough to create synonyms of\n    various letters — A for a, and so on — and sort accordingly. That takes a\n    LOT of code. It's a testament to the completeness of the original Mac OS\n    that in 1984 this was all handled properly, before Windows even brought\n    lower-case letters to the PC side.\n\nhttp://xahlee.info/UnixResource_dir/_/fileCaseSens.html\n\nhttps://archive.md/6AhY9\n\nHowever, there is also no shortage of opinions\nthat enforcing filename case-sensitivity\n-- and even case-sensitivity in general --\nwas a bad decision. [#against_case_sensitivity]_\n\nThere are also passionate views\nto the opposite effect. [#against_case_insensitivity]_\n\nLaying aside that argument for the moment,\nwhy did Windows filenames end up case-insensitive?\n\nStrictly speaking, modern Windows filenames could be case-sensitive,\nbut they aren't\nbecause the `Windows API for opening files`_ `is not case-sensitive`_,\ni.e. the `default call`_ to ``CreateFile``\ndoes not enable the ``FILE_FLAG_POSIX_SEMANTICS`` option.\n\n.. _Windows API for opening files: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx\n.. _is not case-sensitive: https://support.microsoft.com/kb/100625\n.. _default call: https://archive.md/lKUeP\n\n.. https://stackoverflow.com/a/7200533/1608986\n\nHowever, Windows' own NTFS filesystem is `case-preserving`_.\nThis means that it is possible to mount an NTFS partition with Linux\nand make a file called \"Myfile.txt\" in the same directory as \"MYFILE.TXT\",\nbut it will `not be possible to read or modify both of those files`_,\nat least not with standard Windows software.\n\n.. _case-preserving: https://en.wikipedia.org/wiki/Case_preservation\n.. _not be possible to read or modify both of those files: https://technet.microsoft.com/en-us/library/cc976809.aspx\n\nThis API behavior exists to maintain compatibility with MS-DOS filesystems. [#MSDOS_case_insensitive]_\nMS-DOS was built on Tim Paterson's 86-DOS (released in 1980)\nand Marc McDonald's FAT filesystem,\nwhich were designed for compatibility with CP/M. [#DOS_CPM]_ [#FAT_CPM]_\nCP/M was created in 1973 by Gary Kildall,\nand also used case-insensitive filenames. [#CPM_case_insensitive]_\n\n    Lower case ASCII alphabetics are internally translated to upper\n    case to be consistent with CP/M file and device name conventions.\n\nhttp://www.gaby.de/cpm/manuals/archive/cpm22htm/ch1.htm\n\nThe CP/M manual does not state explicitly why it uses these conventions,\nbut Gary Kildall wrote CP/M on a `DEC`_ `PDP-10 mainframe`_\nrunning the `TOPS-10`_ operating system\nwhen he was working at Intel. [#kildall_tops10]_\nConsequently, there are many similarities between CP/M and TOPS-10,\nincluding filename case-insensitivity.\n\n.. _DEC: https://en.wikipedia.org/wiki/Digital_Equipment_Corporation\n.. _PDP-10 mainframe: https://en.wikipedia.org/wiki/PDP-10\n.. _TOPS-10: https://en.wikipedia.org/wiki/TOPS-10\n\n(It should be noted that CP/M has also been compared to RT-11,\na DEC operating system for the PDP-11 minicomputer\nthat is closely related to TOPS-10, [#kildall_RT11]_\nalthough the influence may not have been as direct.)\n\nWhy did TOPS-10 use case-insensitive names?\nBecause the DEC SIXBIT encoding used for filenames\nwas optimized for its architecture.\n\n    RAD50 was used in FILES-11 and RT-11 disks. It was used to store 3\n    characters in a 16 bit word. SIXBIT was used on TOPS-10 36bit systems to\n    store 6 characters in a word. It also allowed for a fast file name search\n    since the names were all on word boundaries (full filename compair took 2\n    compair, and 1 mask operation 6+3 file names).\n\nhttps://lkml.org/lkml/2002/7/30/257\n\n(CP/M was written for an eight-bit architecture,\nwhich is presumably why it used an 8.3 filename\ninstead of a 6.3 filename.) [#8.3_filename]_\n\nSimilarly, the RT-11 didn't use ASCII for filenames,\nbut rather an encoding called RADIX-50,\nwhich helped to save memory. [#RADIX50]_\n\nNeither of these encodings are used much anymore,\nbut their case-insensitivity,\na useful optimization on 1970s hardware,\nendures to this day.\n\nThe lack of agreement on filename case-sensitivity may seem insignificant,\nbut it has caused persistent difficulties\nin cross-platform development. [#tortoise_svn_case_sensitivity]_ [#openfoam_no_windows_port]_ [#common_lisp_filenames]_\n\nDevelopers of cross-platform software try to `avoid making assumptions about filename case-sensitivity`_,\nbut problems of this ilk crop up\nwhen porting from Windows to Linux or vice-versa. [#valve_porting_source_to_linux]_\n\n.. _avoid making assumptions about filename case-sensitivity: https://www.mono-project.com/docs/getting-started/application-portability/#case-sensitivity\n\nFor example, the Linux port of the `Unity engine`_ has `issues with case-sensitive filesystems`_.\n\n    Unity does not properly run on a case-sensitive file system (which is\n    something that Unity users have discovered if they’ve tried to install and\n    run Unity on a case-sensitive HFS+ file system).  This is primarily due to\n    Unity’s asset database, and how it stores paths to map them to GUID values.\n    Of course we tried to be smart in the early days, but if you don’t set up a\n    way to actually verify that what you’re doing works on a case-sensitive\n    file system, then it will never fail that some well-intentioned programmer\n    throws a toLower() in somewhere and ruins the party.\n\n.. _Unity engine: https://unity.com/\n.. _issues with case-sensitive filesystems: https://archive.md/fJIRp\n\n.. [#Multics_case_sensitive]\n\n       Everything in Multics is case sensitive; Multics permits use of the full\n       upper and lower case ASCII character set.\n\n       Multics command names and programming languages use lowercase by\n       convention, but users are free to use uppercase letters in path names,\n       identifiers, user names, etc.\n\n   https://www.multicians.org/mgc.html#commandlanguage\n\n       Multics was one of the first systems to use upper and lower case letters\n       freely.\n\n   https://www.multicians.org/mga.html#ASCII\n\n       Obviously, BCD had no lower-case characters, and Multics did not use BCD\n       at all, except to output log and crash and tape mount messages from ring\n       0 to the primitive Selectric operator's console.\n\n   https://www.multicians.org/mgb.html#BCD\n\n       Since the Multics file system distinguished between upper and lower case,\n       external names had to be case sensitive, and without much discussion we\n       chose to have all variable names be case sensitive.\n\n   https://www.multicians.org/pl1.html\n\n.. [#ITA2]\n\n   See p. 9 of \"The Evolution of Character Codes, 1874-1968\", Eric Fisher.\n\n   https://web.archive.org/web/20170318185346/http://trafficways.org/ascii/ascii.pdf\n\n   https://github.com/ericfischer/ascii\n\n.. [#Bemer_1959]\n\n       Simple pattern of correspondence should exist between codes assigned to\n       upper and lower case alphabetic characters.\n\n       --- R. W. Bemer\n\n   From page 20 of \"A proposal for a generalized card code for 256 characters\",\n   Communications of the ACM, Volume 2 Issue 9, Sept. 1959.\n\n   https://dl.acm.org/doi/10.1145/368424.368435\n\n.. [#Stretch_supercomputer]\n   From \"Coded character sets: history and development\" by Charles E. Mackenzie, 1980.\n\n.. [#against_case_sensitivity]\n\n       Mac ＆ Windows users have to have filenames read to them over the phone\n       by support techs. They have to be able to write little sticky notes to\n       their mothers about how to open up the mail program, without worrying\n       about how the filenames are capitalized. Haven't you ever fumed over a\n       URL with initial-caps in the folder names in the path, having to fiddle\n       with capitalization until you get a response that's anything but a 404?\n       Haven't you ever been secretly pleased that e-mail addresses aren't\n       case-sensitive?\n\n       --- Brian Tiemann, *On Unix File System's Case Sensitivity* (2001)\n\n   http://xahlee.info/UnixResource_dir/_/fileCaseSens.html\n\n       Anecdotally, case sensitivity in programs is known to be error-prone for\n       both beginners and experienced users.  Bob Frankston, a Multics alumnus\n       and the co-inventor of VisiCalc, once said it was the biggest mistake\n       that Multics had inflicted on the world.\n\n       --- Stavros Macrakis (2003)\n\n   \n    Source is down \n            .. https://www.ma.utexas.edu/pipermail/maxima/2003/004483.html\n\n       One of the most pernicious problems with C-based languages is that\n       they're case-sensitive. While this decision may have made sense in 1972\n       when the language was created, one wonders why the sins of Kernighan and\n       Ritchie have been blindly perpetuated for the last thirty-three years.\n\n       [ . . . ]\n\n       Unless you have extremely compelling reasons to make something\n       case-sensitive, case insensitivity is a much more human being friendly\n       design choice. Designing software that's easier for machines is\n       questionable at best.\n\n       --- Jeff Atwood, *The Case For Case Insensitivity* (2005)\n\n   https://blog.codinghorror.com/the-case-for-case-insensitivity/\n\n       There is no longer any excuse for making humans learn and handle the\n       quirks of the way computers store upper- and lower-case characters.\n       Instead, software should handle the quirks of human language.\n\n       --- Brian Hauer, *Case-sensitivity is the past trolling us* (2014)\n\n   https://tiamat.tsotech.com/case-sensitivity-sucks\n\n       Since it appears to have manifested out of opinion rather than\n       necessity, it could be said case-sensitivity is the worst way that\n       modern technology sucks.\n\n       --- Greg Raiz (2007)\n\n   https://web.archive.org/web/20160407013757/http://www.raizlabs.com/graiz/2007/02/11/linuxunix-case-sensitivity/\n\n       This is really stupid, it causes a ton of problems and there is no\n       longer any good reason to have case sensitivity in an OS.\n\n       --- Julian, OddThinking (2005)\n\n   https://www.somethinkodd.com/oddthinking/2005/10/27/the-case-for-case-preserving-case-insensitivity/\n\n.. [#against_case_insensitivity]\n\n       Many of us consider those filesystems which cannot preserve case, but\n       which accept \"input\" in random case, to be so utterly broken as to be\n       undeserving of any attention whatsoever.  They create a situation where\n       the computer effectively considers the users to be too stupid or blind\n       or whatever to be able to say what we mean accurately.\n\n       --- Greg A. Woods (2003)\n\n   https://lists.nongnu.org/archive/html/info-cvs/2003-11/msg00127.html\n\n       Why oh why on Earth engineers at Microsoft decided to make Windows case\n       insensitve [sic] and then use camel case anyway, wherever possible?\n\n       It makes case-sensitive systems and their sysadmins cry :-(\n\n       --- u/bwosc (2015)\n\n   https://www.reddit.com/r/sysadmin/comments/2w6c8g/case_insensitive_windows_rant/\n\n       Why are computer file names and conventions and protocols so messed up?\n       It's bizarre -- and Microsoft has been one of the worst offenders with\n       one of the most powerful positions and opportunities to make it a better\n       filename-naming world.\n\n       [ . . . ]\n\n       And, Microsoft dares to allow mixed case naming, but does case\n       insensitive handling of file names... don't even get me started about\n       some of the bizarre results and buggy behavior I've traced to that. I\n       only wish I'd had a chargeback code for all of the time I've spent\n       fixing and debugging systems that all come back to the file naming.\n       Sigh, again.\n\n       --- yagu (2006)\n\n   https://slashdot.org/comments.pl?sid=190747\u0026cid=15690704\n\n       The old DOS/Mac people thought case insensitivity was a \"helpful\"\n       idea, and that was understandable - but wrong - even back in the 80's.\n       They are still living with the end result of that horrendously bad\n       decision decades later. They've _tried_ to fix their bad decisions,\n       and have never been able to (except, apparently, in iOS where somebody\n       finally had a glimmer of a clue).\n\n       --- Linux Torvalds (2018)\n\n   https://patchwork.kernel.org/cover/10717177/\n\n   .. https://lists.openwall.net/linux-ext4/2018/12/08/16\n\n   .. https://www.spinics.net/lists/linux-fsdevel/msg136876.html\n\n.. [#MSDOS_case_insensitive]\n\n       Do not assume case sensitivity. For example, consider the names OSCAR,\n       Oscar, and oscar to be the same, even though some file systems (such as\n       a POSIX-compliant file system) may consider them as different. Note that\n       NTFS supports POSIX semantics for case sensitivity but this is not the\n       default behavior.\n\n   https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx\n\n.. [#DOS_CPM]\n\n       Every operating system has basic functions like reading and writing disk\n       files. The API defines the exact details of how to make it happen and\n       what the results are. For example, to “open” a file in preparation for\n       reading or writing, the application would pass the location of an\n       11-character file name and the function code 15 to CP/M through the\n       “Call 5” mechanism. The very same sequence would also open a file in\n       DOS, while, say, UNIX, did not use function code 15, 11-character file\n       names, or “Call 5” to open a file.\n\n       --- Tim Paterson (2007)\n\n   https://dosmandrivel.blogspot.com/2007/08/is-dos-rip-off-of-cpm.html\n\n       As I noted when I discussed the old MS-DOS wildcard matching rules,\n       MS-DOS worked hard at being compatible with CP/M. And CP/M used 8.3\n       filenames.\n\n       --- Raymond Chen (2009)\n\n   https://blogs.msdn.microsoft.com/oldnewthing/20090610-00/?p=17953/\n\n.. [#FAT_CPM]\n\n       The FAT file system 's restrictions on naming files and directories are\n       inherited from CP/M. When Paterson was writing 86-DOS one of his primary\n       objectives was to make programs easy to port from CP/M to his new\n       operating system. He therefore adopted CP/M's limits on filenames and\n       extensions so the critical fields of 86-DOS File Control Blocks (FCBs)\n       would look almost exactly like those of CP/M. The sizes of the FCB\n       filename and extension fields were also propagated into the structure of\n       disk directory entries\n\n   https://spider.seds.org/spider/OS2/HPFS/fat.html\n\n.. [#kildall_tops10]\n\n       Gary Kildall developed CP/M on a DEC PDP-10 minicomputer running the\n       TOPS-10 operating system. Not surprisingly, most CP/M commands and file\n       naming conventions look and operate like their TOPS-10-counterparts. It\n       wasn’t pretty, but it did the job.\n\n       --- Robert X. Cringely, *Accidental Empires, Chapter 4 — Amateur Hour*\n\n   https://www.cringely.com/2013/02/18/accidental-empires-chapter-4-amateur-hour/\n\n       CP/M and ISIS in operation have some general similarities to interactive\n       operating systems on minicomputers and mainframes such as the DEC PDP-10\n       \"TOPS-10\" OS. Kildall used such systems to develop and run his\n       cross-assemblers and compilers, which became Intel products; and later\n       to develop his own products which ran \"native\" on CP/M systems.\n\n       --- Herbert R. Johnson, *CP/M and Digital Research Inc. (DRI) History*\n\n   https://www.retrotechnology.com/dri/d_dri_history.html\n\n       Kildall said that PL/M was ‘‘the base for CP/M,’’ even though the\n       commands were clearly derived from Digital’s, not IBM’s software. For\n       example, specifying the drive in use by a letter; giving file names a\n       period and three-character extension; and using the DIR (Directory)\n       command, PIP, and DDT were DEC features carried over without change. [100]\n\n       [ . . . ]\n\n       99. Gary Kildall, ‘‘CP/M: A Family of 8- and 16-Bit Operating Systems,’’\n       Byte, (June 1981): 216–229. Because of the differences between DEC\n       minicomputers and the 8080 microprocessor, the actual code of CP/M was\n       different and wholly original, even if the syntax and vocabulary were\n       similar.\n\n       100. The above argument is based on PDP-10 and CP/M manuals in the\n       author’s possession, as well as conversations with Kip Crosby, to whom I\n       am grateful for posting this question over an Internet discussion forum.\n\n       --- Paul E. Ceruzzi, page 238 of \"A History of Modern Computing\", 2nd. edition published 2003 by MIT Press.\n\n.. [#kildall_RT11]\n\n   From a post on the comp.sys.tandy Usenet group:\n\n       Of course, CP/M itself is an almost exact knock off of DECs PDP-11 OS,\n       RT-11, an operating system that dates back to the early seventies, and\n       RT-11 shows its roots in TOPS-10, which goes back another year or two.\n       For some reason, all the historians tracing the source of MS-DOS\n       mysteriously stop at CP/M, even when command sets and utility syntaxes\n       are compared side-by-side.  Who had a PIP utility first?  Why, DEC, not\n       Digital Research.\n\n       The joke in the seventies that \"Digital Research\" was a typographical\n       error and the companies real name was \"Digital [Equipment Corporation]\n       Rehashed\", for RT-11, TOPS-10 and RSTS/E all predated CP/M by a lot and\n       yet have the same command syntax.\n\n   https://groups.google.com/forum/#!msg/comp.sys.tandy/EcfhcRv9gEU/fNu_h9fCe3AJ\n\n   From a post on the alt.folklore.computers Usenet group:\n\n       Maybe we do need Kildall for the next step, but when I saw CP/M\n       version 1 it appeared closest to a dialect of RT-11, so I've always\n       figured that RT-11 was the closest ancestor.  After that, it began\n       to drift.  If I recall correctly, V1's prompt was the DECcish \".\",\n       but in V2 it became \"\u003e \".  Therefore, it would appear that MS-DOS\n       got its start from CP/M V2.  It's a pity MS-DOS didn't start from\n       RT-11, which had multitasking, interrupt driven I/O, and all the\n       other good stuff that is easy to fit in a well designed 8KB kernel.\n\n   https://groups.google.com/forum/#!topic/alt.folklore.computers/BxRlG1tYv8o\n\n       Gary Kildall's CP/M started out as his own reimplementation of RT-11 for\n       the Intel 8080.\n\n   http://blu.org/mhonarc/discuss/2011/10/msg00112.php\n\n.. [#CPM_case_insensitive] CP/M did this conversion internally.\n\n        It should also be noted that all alphabetic lower case letters in file\n        and drive names are always translated to upper case when they are\n        processed by the CCP [Console Command Processor].\n\n        [ . . . ]\n\n        Further, recall that the CCP always translates lower case characters to\n        upper case characters internally. Thus, lower case alphabetics are\n        treated as if they are upper case in command names and file references\n\n    https://archive.org/stream/Intro_to_CPM_Feat_and_Facilities/Intro_to_CPM_Feat_and_Facilities_djvu.txt\n\n.. [#8.3_filename]\n\n       As for the 8.3, look at the format of a CP/M directory entry.  16\n       bytes so they fill a disk block, not RAD50, 8 bytes for name, 3 for\n       extension, and I forget the rest, but it includes pointers to the\n       data.\n\n   https://groups.google.com/d/msg/alt.folklore.computers/fqXomGO4I1I/ub_hJ2WxXHwJ\n\n.. [#RADIX50]\n\n       ... files were located via the directory, which resided in a fixed\n       location at the beginning of the hard drive. The directory consisted of\n       a single array of entries, each with a 6.3 character file name formatted\n       in DEC’s Radix-50 format. A file’s directory entry indicated the address\n       of the first block of the file.\n\n   https://cryptosmith.com/2013/10/19/digitals-rt-11-file-system/\n\n       RADIX50 is a character coding system used in earlier Digital Equipment\n       Corporation computers, such as the PDP-10, DECsystem-10 and\n       DECsystem-20.  It was implemented as a way to pack as many characters\n       into as few bits as possible.\n\n       RADIX50 actually contains 40 codes, or 50 in octal. Because this is not\n       a power of two, the PDP-10 processor had instructions to pack several\n       RADIX-50 words into a single 36-bit word or extract RADIX-50 words from\n       a 36-bit word.\n\n   https://archive.md/q2ee\n\n.. [#tortoise_svn_case_sensitivity] https://code.google.com/p/tortoisesvn/issues/detail?id=32\n\n.. [#openfoam_no_windows_port]\n\n       One problem is that the file-system NTFS, that is used by most modern\n       Windows Versions, is (by default) only case-preserving (``hello.c`` and\n       ``Hello.C`` are the same file, when in the same folder). The\n       OpenFOAM-sources need a fully case-sensitive file-system and can't even\n       be unpacked properly on a Windows system (see [2]).\n\n   https://openfoamwiki.net/index.php/Main_FAQ#Why_isn.27t_there_a_Windows_port_of_OpenFOAM_.3F\n\n.. [#common_lisp_filenames]\n\n       Issues of alphabetic case in pathnames are a major source of problems.\n       In some file systems, the customary case is lowercase, in some\n       uppercase, in some mixed. Some file systems are case-sensitive (that is,\n       they treat FOO and foo as different file names) and others are not.\n\n   https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node205.html\n\n       The main difficulty in dealing with names of files is that different\n       file systems have different naming formats for files.\n\n   https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node203.html\n\n.. [#valve_porting_source_to_linux] https://web.archive.org/web/20181113043451/https://adrienb.fr/blog/wp-content/uploads/2013/04/PortingSourceToLinux.pdf\n\n       - Linux filesystems are case-sensitive\n\n       - Windows is not\n\n       - Not a big issue for deployment (because everyone ships packs of some\n         sort)\n\n       - But an issue during development, with loose files\n\n       - Solution 1: Slam all assets to lower case, including directories, then\n         tolower all file lookups (only adjust below root)\n\n       - Solution 2: Build file cache, look for similarly named files\n\n\n----------------------\nFilename restrictions.\n----------------------\n\nIn Linux and other Unix-derived operating systems,\nthe only characters that may not appear\nin the name of a file or directory [#forbidden_characters]_\nare the slash ``/``\n(which is used to delimit paths)\nand the ASCII null ``\\0``\n(which is used to terminate strings in C). [#C_strings]_\n\nWindows has the same restrictions,\nas well as many other `restrictions which are considerably more complex`_\nand are partly the result\nof `backwards compatibility with CP/M pseudofiles`_.\n\n.. _backwards compatibility with CP/M pseudofiles: https://bitquabit.com/post/zombie-operating-systems-and-aspnet-mvc/\n.. _restrictions which are considerably more complex: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#naming_conventions\n\nThis has had long-term consequences,\nsuch as imposing some `surprising restrictions on URLs`_\nin Microsoft's web application framework, ASP.net\n(these were `relaxed in a later version`_).\n\n.. _surprising restrictions on URLs: https://stackoverflow.com/questions/987105/asp-net-mvc-routing-vs-reserved-filenames-in-windows\n.. _relaxed in a later version: https://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx/\n\nWindows also does not permit filenames to contain colons,\ndue to their use in delimiting drive names like ``C:\\``.\nThis causes issues in sharing files across platforms.\n\n    For example, a UNIX file name can use a colon (:), but a Windows file name\n    cannot use a colon (:). If a UNIX user attempts to create a file with a\n    Windows illegal character on a Windows Services for UNIX network file\n    system (NFS) share, the attempt is unsuccessful and the UNIX client\n    computer receives an input or output error.\n\nhttps://support.microsoft.com/en-us/kb/289627\n\nThis also makes filenames containing timestamps somewhat inconvenient.\nSince filenames cannot contain colons,\nan ISO 8601 timestamp such as ``1970-01-01T00:00:00Z``\ncannot be part of a valid filename.\nWindows software uses various workarounds,\nsuch as removing the colon entirely\nor replacing it with a similar-looking Unicode character. [#windows_datestamps]_\n\n(It should be acknowledged that on Linux\nthe names of directories in ``$PATH`` cannot contain colons either, [#colons_in_PATH]_\nbut such restrictions do not apply to filenames.)\n\n.. [#windows_datestamps]\n   https://stackoverflow.com/questions/7874111/convert-datetime-now-to-a-valid-windows-filename\n   https://stackoverflow.com/questions/11037831/filename-timestamp-in-windows-cmd-batch-script\n   https://stackoverflow.com/questions/1642677/generate-unique-file-name-with-timestamp-in-batch-script\n   https://serverfault.com/questions/16706/current-date-in-the-file-name\n   https://serverfault.com/questions/292014/preferred-format-of-file-names-which-include-a-timestamp\n   https://serverfault.com/questions/16706/current-date-in-the-file-name\n   https://programmers.stackexchange.com/questions/61683/standard-format-for-using-a-timestamp-as-part-of-a-filename\n\n.. [#colons_in_PATH] https://stackoverflow.com/questions/14661373/how-to-escape-colon-in-path-on-unix\n\n.. [#forbidden_characters]\n\n   As discussed in this StackOverflow question:\n\n   https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names\n\n       When Steve Bourne was writing his Unix shell (which came to be known as\n       the Bourne shell), he made a directory of 254 files with one-character\n       names, one for each byte value except ``'\\0'`` and slash, the two\n       characters that cannot appear in Unix file names. He used that directory\n       for all manner of tests of pattern-matching and tok- enization. (The\n       test directory was of course created by a program.) For years\n       afterwards, that directory was the bane of file-tree-walking programs;\n       it tested them to destruction.\n\n       --- Brian W. Kernighan and Rob Pike, \"The Practice of Programming\",\n       Chapter 6: Testing, p. 158\n\n   https://books.google.com/books?id=j9T6AgAAQBAJ\u0026lpg=PP1\u0026dq=the%20practice%20of%20programming\u0026pg=PA158#v=onepage\u0026q=When%20Steve%20Bourne\n\n   This is also explicitly stated in the POSIX standard.\n\n       The characters composing the name may be selected from the set of all\n       character values excluding the slash character and the null byte.\n\n   https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html\n\n       The bytes composing the name shall not contain the \u003cNUL\u003e or \u003cslash\u003e\n       characters.\n\n    https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_170\n\n.. [#C_strings] The wisdom of this decision is a matter of some debate.\n\n   Dennis Ritchie has explained the `rationale for using a null-terminator`_:\n\n       In BCPL, the first packed byte contains the number of characters in the\n       string; in B, there is no count and strings are terminated by a special\n       character, which B spelled ```*e'``. This change was made partially to\n       avoid the limitation on the length of a string caused by holding the\n       count in an 8- or 9-bit slot, and partly because maintaining the count\n       seemed, in our experience, less convenient than using a terminator.\n\n   `Null-terminated strings do have some drawbacks`_,\n   such as making certain optimizations more difficult,\n   and exposing unwary programs to buffer overflow bugs.\n\n   On the other hand, length-prefixed strings such as those in Pascal\n   tend to have their own difficulties,\n   `such as storing strings of arbitrary length`_.\n\n   There is extensive discussion here:\n\n   https://utcc.utoronto.ca/~cks/space/blog/programming/CNullStringsDefense\n\n   In any case, both Linux and `Windows use null-terminated strings`_,\n   as do other modern operating systems.\n\n.. ``` TODO: remove this hack to fix vim's syntax highlighting bug\n\n.. _rationale for using a null-terminator: https://stackoverflow.com/questions/4418708/whats-the-rationale-for-null-terminated-strings\n.. _Null-terminated strings do have some drawbacks: https://queue.acm.org/detail.cfm?id=2010365\n.. _such as storing strings of arbitrary length: https://www.lysator.liu.se/c/bwk-on-pascal.html\n.. _Windows use null-terminated strings: https://blogs.msdn.com/b/oldnewthing/archive/2009/10/08/9904646.aspx\n\n---------------------------\nLimited filesystem support.\n---------------------------\n\nWindows has built-in support for its own NTFS filesystem,\nUDF (used for some CDs and DVDs),\nand the legacy FAT16/FAT32/exFAT family.\nAll other filesystems require installation of `third-party software`_.\n\nLinux has drivers for `almost all file systems`_\nthat can be legally mounted without paying royalties,\nincluding ones that don't see much use nowadays, like `Amiga file systems`_.\nIt can also mount FAT and NTFS filesystems,\ndespite Microsoft's lucrative patent licensing deals\nand `ongoing`_ `litigation`_ against Android manufacturers\nand `other companies`_ that use the Linux kernel's FAT drivers.\n\n.. _third-party software: https://github.com/matt-wu/Ext3Fsd\n.. _almost all file systems: https://wiki.archlinux.org/index.php/file_systems\n.. _Amiga file systems: https://www.tldp.org/FAQ/Linux-FAQ/partitions.html#can-linux-access-amiga-file-systems\n.. _ongoing: https://www.forbes.com/sites/timworstall/2013/12/06/german-patent-ruling-threatens-microsofts-windows-phone-earnings-from-android/\n.. _litigation: https://gizmodo.com/the-secret-android-patents-that-microsoft-forces-oems-t-1591338496\n.. _other companies: https://arstechnica.com/information-technology/2009/02/microsoft-sues-tomtom-over-fat-patents-in-linux-based-device/\n\nFor the system partition,\nLinux users can choose among the usual ext3 journaling filesystem\nor up-and-coming filesystems like `Btrfs`_.\nUnlike FAT and NTFS filesystems,\next3 and Btrfs `do not require defragmentation`_ to maintain good performance.\n(Realistically, though,\n`defragmentation isn't that important for NTFS`_, either.)\n\n.. _Btrfs: https://btrfs.wiki.kernel.org/index.php/Main_Page\n.. _NTFS and FAT: https://technet.microsoft.com/en-us/magazine/2007.11.desktopfiles.aspx\n.. _do not require defragmentation: https://www.tldp.org/LDP/sag/html/filesystems.html#FRAGMENTATION\n.. _defragmentation isn't that important for NTFS: https://blogs.msdn.com/b/e7/archive/2009/01/25/disk-defragmentation-background-and-engineering-the-windows-7-improvements.aspx\n\nFinally, Linux permits unprivileged users\nto run their own filesystems via FUSE.\nThis has many practical benefits,\nsuch as accessing cloud storage as if it were an ordinary directory.\n\n.. TODO: source\n\nThere is a project to bring FUSE to Windows,\nbut it is no longer maintained\nand its various forks are not as mature as the Linux implementation.\n\n.. TODO: source\n\n------------------\nUTF-16, not UTF-8.\n------------------\n\n`UTF-8 has many practical advantages`_ over UTF-16.\n\n- It is a superset of ASCII,\n  so it is backwards-compatible with existing text files.\n- `Zero bytes do not appear`_ at any point in a valid UTF-8 representation,\n  so ``strcpy()`` still works.\n- It is `self-synchronizing`_, i.e. it is possible to resynchronize\n  after a lost or corrupted code point without re-reading the entire string.\n- It is more portable because it does not require a `byte-order mark`_\n  and is less likely to be mistaken for other encodings.\n- Internet Explorer has been known to have security issues with UTF-16.\n\n.. _UTF-8 has many practical advantages: https://annevankesteren.nl/2009/09/utf-8-reasons\n.. _Zero bytes do not appear: https://docs.python.org/2/howto/unicode.html#encodings\n.. _self-synchronizing: https://research.swtch.com/utf8\n.. _byte-order mark: https://www.unicode.org/faq/utf_bom.html\n.. _security issues with UTF-16: http://permalink.gmane.org/gmane.ietf.charsets/372 (dead link)\n\nIf the Windows API were designed today,\nit would probably use `UTF-8`_.\nThe Unicode Consortium primarily `recommends UTF-16`_\nfor compatibility with Java and the Windows API.\n\n.. _UTF-8: https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt\n.. _recommends UTF-16: https://www.unicode.org/faq/programming.html#2\n\nIn principle, UTF-16 would have the advantage\nof constant time addressing of single characters,\nbut in practice most programming languages do not provide data types for this,\nwith the `exception of Go and rust`_.\n\n.. _exception of Go and rust: https://lucumr.pocoo.org/2014/1/9/ucs-vs-utf8/\n\n----------------------------------------------------\nFile extensions are the sole determiner of filetype.\n----------------------------------------------------\n\nOn Windows, the file extension is the sole determiner\nof what program runs when opening a given filetype.\nThis makes it easier to dupe a Windows user\ninto `unintentionally running malware`_.\n\n.. _unintentionally running malware: https://web.archive.org/web/20150318032415/http://windows.microsoft.com/en-us/windows-vista/recognizing-dangerous-file-types\n\nAlso, if the file extensions for different filetypes happen to collide,\nas they inevitably do,\none program must take default precedence over the other for that file extension.\n\nFor example, there `a lot of different file formats`_ with a ``.dat`` file extension,\nbut only one application gets to open them by default.\n\n.. _a lot of different file formats: https://filext.com/file-extension/dat\n\nOn Linux, `filetypes are determined`_ by a combination of\nfilesystem metadata (e.g. execute permissions),\nheuristics based on `file signatures`_ (a.k.a \"magic numbers\"),\nand ``.desktop`` configuration files with mimetype information\n(which includes file extensions).\n\n.. _file signatures: https://en.wikipedia.org/wiki/List_of_file_signatures\n\n.. TODO: cite\n\n.. _filetypes are determined: https://www.howtogeek.com/192628/mime-types-explained-why-linux-and-mac-os-x-dont-need-file-extensions/\n\nA file's executable status is `separate from its file extension`_,\nand an executable text file written in a scripting language\ncan control how it is run via the `first-line shebang convention`_,\ne.g. ``#!/usr/bin/env python3 -i``.\n\nWindows does not support shebang lines,\nbut languages that emphasize cross-platform compatibility,\nsuch as Python,\nhave `implemented work-arounds`_.\n\n.. _separate from its file extension: https://superuser.com/questions/405972/why-do-i-need-an-execute-bit-in-file-mode-on-unix-file-systems\n.. _first-line shebang convention: https://en.wikipedia.org/wiki/Shebang_(Unix)\n.. _implemented work-arounds: https://legacy.python.org/dev/peps/pep-0397/\n.. _cannot indicate it is version 2 or 3: https://stackoverflow.com/questions/7574453/shebang-notation-python-scripts-on-windows-and-linux\n\n--------------------------------------------\nIneffectual read-only permissions semantics.\n--------------------------------------------\n\nPermissions are a big topic in multi-user computing,\nand both Linux and Windows have adapted over time,\neach with various advantages and disadvantages. [#unix_groups]_ [#ntfs_permissions_flaw]_\n\nHowever, here is a specific example\nof a relatively simple, single-user permissions feature:\nit is sometimes desirable to set old files as read-only,\nso that they are still easily accessible\n(i.e. not compressed in a ``.zip`` file),\nbut are less likely to be accidentally deleted, moved, or modified.\n\nOn Windows, the content of a read-only file cannot be altered,\nbut the file itself `can be moved, renamed, or deleted`_,\nbecause the `folder it is in cannot have a read-only status`_.\n\n.. _can be moved, renamed, or deleted: https://web.archive.org/web/20150401071829/http://windows.microsoft.com/en-us/windows7/prevent-changes-to-a-file-by-setting-it-to-read-only\n.. _folder it is in cannot have a read-only status: https://web.archive.org/web/20150406071856/http://windows.microsoft.com/en-us/windows-vista/prevent-changes-to-a-file-or-folder-read-only\n\nIn Linux, by contrast, a read-only directory cannot have files added to it,\nand files in such a directory cannot be moved, renamed, or deleted\nwithout first removing the read-only status from the directory they are in.\nModifications of the contents of the files\ndepend on the individual file permissions.\n\n.. [#unix_groups] Unix permissions, for example, are not a panacea: https://unix.stackexchange.com/questions/164303/single-user-for-sharing-vs-multiple-users\n.. [#ntfs_permissions_flaw] NTFS permissions have their own issues, e.g. https://serverfault.com/questions/31709/how-to-workaround-the-ntfs-move-copy-design-flaw\n\n++++++++++++++++++++++++++++++++++++++++++++++++++\nArchitectural deficiencies of the Windows platform\n++++++++++++++++++++++++++++++++++++++++++++++++++\n\nThese are limitations of the Windows platform\nwhich are not intrinsic to the operating system,\nbut are the result of default behavior\nor restrictions on the Windows ecosystem.\n\n------------------------------------------\nLimitations on access to external volumes.\n------------------------------------------\n\nWhen accessing external volumes such as flash drives,\nWindows assigns different capital letters to each volume,\neach letter corresponding to a different absolute path root.\nThis is necessary for backwards compatibility with MS-DOS,\nbut it is not without drawbacks.\n\nPerhaps the most obvious problem\nis that there are only 26 letters in the English alphabet.\nBut what does this mean in practice?\n\nOne consequence is that the assigned drive letter\nmay be different when a drive is reconnected.\nThis means that, for example,\napplications that track recently used files\nwill look for files under the old drive letter,\nand be unable to find the files.\n\n    I have a problem with Word when working with documents on my flash drive.\n    If I insert the drive days later and try to use the recently used file\n    list, Word sometimes says it can’t find the document.\n\n    I’ve worked out that when I insert the flash drive it’s not always using\n    the same drive letter – it’s F or G drive but occasionally even later in\n    the alphabet.\n\n    How can I change the flash drive letter or, even better, make it appear as\n    the same drive letter each time?\n\nhttps://office-watch.com/2008/make-a-consistent-drive-letter-or-path-to-a-removable-drive/\n\nFortunately, there is a solution: NTFS mount points.\n\n    Volume mount points are robust against system changes that occur when\n    devices are added or removed from a computer.\n\nhttps://technet.microsoft.com/en-us/library/Cc938934.aspx\n\n    If you're running out of drive letters, one trick is to use a mount point\n    for each logical drive that you are going to bring into Windows; this way,\n    performance can be contained to a logical drive and still conform to your\n    drive letter standards.\n\n    [ . . . ]\n\n    There are many scenarios in which you would want a large number of drives,\n    such as multiple databases for Microsoft SQL Server or Exchange Server\n    installations. Exchange databases are notorious for needing their own\n    drives per mailbox store and, if you provision out well, you will quickly\n    run out of drive letters.\n\n    --- Rick Vanover\n\nhttp://www.techrepublic.com/blog/the-enterprise-cloud/use-mount-points-if-you-run-out-of-windows-drive-letters/\n\nUnfortunately, Windows doesn't use mount points by default\nfor external hard drives or flash drives,\npossibly because mount points behave slightly differently than drive letters.\n\n    The problem is the recycle bin.  This \"undo\" option is maintained with a\n    hidden system file that is on the partition that holds the files being\n    deleted.  Unfortuantely, when the command to delete a folder is given, the\n    system attempts to delete the folder using the mount point folder's Master\n    File Table, and not the subfolder's Master File Table.  The mount point\n    folder's MFT doesn't host the record, and an access denied message is\n    kicked back to you for having the temerity to try and recycle a directory\n    which apparently doesn't even exist!  The only solution for this is to not\n    recycle subfolders and directories, but to outright delete them.\n\nhttps://web.archive.org/web/20170327135652/https://getyouriton.blogspot.com/2009/08/serious-gotchas-with-mounted-drives-or.html\n\nWhile NTFS filesystems have a root directory,\nWindows has no unique root directory;\ninstead, each drive has its own root.\n\nhttps://stackoverflow.com/questions/151860/root-folder-equivalent-in-windows\n\n*My Computer* roughly corresponds to a root directory in concept,\nand looks like a folder when viewed in Windows Explorer,\nbut there is no *My Computer* folder anywhere on the filesystem.\nInstead, *My Computer* is a virtual folder.\n\n    Unlike file system folders, users cannot create new virtual folders\n    themselves.  They can only install ones created by non-Microsoft\n    developers. The number of virtual folders is thus normally much fewer than\n    the number of file system folders.\n\n    [ . . . ]\n\n    The file systems of the various disk drives can be seen to be subsets of\n    the larger namespace hierarchy. The roots of these file systems are\n    subfolders of the My Computer folder. My Computer also includes the roots\n    of any mapped network drives.\n\nhttps://msdn.microsoft.com/en-us/library/cc144090%28VS.85%29.aspx\n\nUnix-based operating systems, on the other hand,\nhave a unique root directory called ``/`` [#disk_location]_\nand can mount drives (including removable media)\nas directories anywhere on the hierarchy.\nThis provides uniform access and permission controls to storage volumes\nwithout requiring new syntax [#the_hideous_name]_\nor knowledge of the underlying hardware.\n\nhttps://unix.stackexchange.com/questions/93960/why-is-linuxs-filesystem-designed-as-a-single-directory-tree\n\nOn Linux, flash drives are mounted under ``/media/`` [#removable_media_mountpoint]_\nand are assigned a directory based on their label.\nIf the drive is removed and re-mounted again,\nthe path to the drive will be the same as before\nunless the partition label has been changed\nor the drive is manually mounted elsewhere.\n\nFile managers on Linux also handle deleting files on flash drives.\nWhen a file on an external drive is put into the trash,\nit goes into a `user-specific hidden folder`_ on the drive itself,\nnot the trash in the user's home directory.\n\n.. _user-specific hidden folder: https://superuser.com/questions/169980/what-is-trash-and-trash-1000\n\n.. [#disk_location]\n\n   Multics, the predecessor to Unix,\n   appears to be the first operating system with a root directory\n   (called ``\u003e`` instead of ``/``)\n   and a hierarchical filesystem underneath it.\n\n   https://www.multicians.org/mgr.html#root\n\n       The Unix system owes much to the Multics file system, most notably the\n       directory tree idea.\n\n       --- Douglas McIlroy\n\n   https://www.princeton.edu/~hos/mike/transcripts/mcilroy.htm\n\n   However, the motivations for such a scheme go back further.\n   One of the most influential time-sharing systems,\n   CTSS, recognized the need for accessing files\n   independently of their disk location.\n\n       All files kept on the disk (and drum) are known to the\n       user only by name: the supervisor disk control module keeps\n       for each user a directory of names and corresponding track\n       locations on the disk.\n\n   https://archive.org/stream/bitsavers_mitctssMAC5_3662592/MAC-TR-16_CTSStecNote_Mar65_djvu.txt\n\n       It is desirable, from the point of view both of programming and\n       of disk administration, that the user have no notion of the absolute\n       location where his files of information are stored in the disk. Rather,\n       the user will refer to his files only by symbolic names and logical mode\n       number.\n\n   https://archive.org/stream/bitsavers_mitctssCTS_3840198/CTSS_ProgrammersGuide_djvu.txt\n\n   Unix was developed on relatively small disk drives,\n   so it was useful to be able mount drives anywhere on the filesystem.\n\n       You know how Ken Thompson and Dennis Ritchie created Unix on a PDP-7 in\n       1969?  Well around 1971 they upgraded to a PDP-11 with a pair of RK05\n       disk packs (1.5 megabytes each) for storage.\n\n       When the operating system grew too big to fit on the first RK05 disk\n       pack (their root filesystem) they let it leak into the second one, which\n       is where all the user home directories lived (which is why the mount was\n       called /usr).  They replicated all the OS directories under there (/bin,\n       /sbin, /lib, /tmp...) and wrote files to those new directories because\n       their original disk was out of space.  When they got a third disk, they\n       mounted it on /home and relocated all the user directories to there so\n       the OS could consume all the space on both disks and grow to THREE WHOLE\n       MEGABYTES (ooooh!).\n\n   http://lists.busybox.net/pipermail/busybox/2010-December/074114.html\n\n.. [#removable_media_mountpoint]\n\n   The ``/media/`` directory is part of the Filesystem Hierarchy Standard,\n   which is used for almost all Linux distributions,\n   but is not part of the POSIX standard.\n\n   https://unix.stackexchange.com/questions/98751/is-the-filesystem-hierarchy-standard-a-unix-standard-or-a-gnu-linux-standard\n\n   The ``/media/`` directory is relatively recent invention,\n   and is intended to avoid conflict with other conventions.\n\n       Historically there have been a number of other different places used to\n       mount removable media such as ``/cdrom``, ``/mnt`` or ``/mnt/cdrom``.\n       Placing the mount points for all removable media directly in the root\n       directory would potentially result in a large number of extra\n       directories in ``/``.  Although the use of subdirectories in ``/mnt`` as\n       a mount point has recently been common, it conflicts with a much older\n       tradition of using ``/mnt`` directly as a temporary mount point.\n\n   https://www.linuxbase.org/betaspecs/fhs/fhs/ch03s11.html\n\n   Currently, ``udisks2`` mounts flash drives under ``/media/$USER/``.\n\n   https://askubuntu.com/questions/214646/how-to-configure-the-default-automount-location\n\n.. [#the_hideous_name]\n   Rob Pike and P. J. Weinberger discuss the history of naming practices\n   and the drawback of introducing new syntax in \"The Hideous Name\".\n\n   http://doc.cat-v.org/bell_labs/the_hideous_name/\n\n\n--------------------------------\nLimited default debugging tools.\n--------------------------------\n\n.. TODO: Using the informal you here seems to be the only option.\n   Everything else I can think of is too awkwardly phrased.\n\nWindows has limited facilities for debugging a running process.\nYou can `analyze the wait chain`_, or, failing that, `create a dump file`_.\n\n.. _analyze the wait chain: https://superuser.com/questions/497621/what-is-the-analyze-wait-chain-in-task-manager\n.. _create a dump file: https://support.microsoft.com/en-us/kb/931673\n\nOn Linux, you can attach the ``gdb`` debugger `to a running process`_,\nstart a logfile that catches all the output,\nand run a backtrace when the program fails\n(it's better with debugging symbols, though).\n\n.. _to a running process: https://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_22.html\n\nAlternately, if the process is already unresponsive,\nyou can attach ``strace`` and see what system calls it makes,\nand observe how it responds to various kill signals.\n\nThere are plenty of Windows programs similar to ``gdb`` and ``strace``, [#gdb_for_Windows]_ [#strace_for_Windows]_\nbut they don't come installed by default,\nwhereas both ``strace`` and ``gdb`` come with almost all Linux distributions,\nso system administrators can rely on being able to use them\nwith nearly any Linux box.\n\n.. [#gdb_for_Windows]\n   https://msdn.microsoft.com/en-us/library/windows/hardware/ff551063\n\n.. [#strace_for_Windows]\n   https://archive.md/aWJ8b\n   https://technet.microsoft.com/en-us/sysinternals/bb896647.aspx\n\n---------------------------------\nRestrictive default file locking.\n---------------------------------\n\n.. TODO: Add more sources to this.\n\nWindows applications `lock files they use by default`_,\nso `file access is a nuisance`_ by default.\nIf an application is misbehaving\nand you want to examine a file it is using,\nthis is generally blocked\nuntil the application is killed.\n\n.. _lock files they use by default: https://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows\n.. _file access is a nuisance: https://stackoverflow.com/questions/546504/how-do-i-make-windows-file-locking-more-like-unix-file-locking\n\nThis becomes particularly interesting when the files are hidden thumbnails.\n\n    This is a known problem with Windows 7 related thumbnail caching which\n    locks hidden files, thus preventing deletion or moving them.\n\nhttps://superuser.com/questions/537041/action-cant-be-completed-open-in-another-program\n\n    The folder rename operation fails because thumbcache.dll still has an open\n    handle to the local thumbs.db file and does not currently implement a\n    mechanism to release the handle to the file in a more dynamic and timely\n    fashion.\n\nhttps://support.microsoft.com/en-us/kb/2025703\n\n    The other common mistake was for linux developers to assume you can\n    delete/move a file while it’s open. This doesn’t work on Windows, because\n    Windows locks the file when it’s open.\n\nhttps://npf.io/2017/03/3.5yrs-500k-lines-of-go/\n\nBy contrast,\non Linux it is not unusual for two different applications\nto share read access to the same file,\nor for one process to read a file\nwhile another process is writing to it,\nsince applications do not lock files by default.\n\n.. TODO: CR LF \\r\\n newlines?\n\n-----------------------------------------\nLack of granular execution access control\n-----------------------------------------\n\nWindows does not have a similar concept to `sudo`_/`doas`_/`please`_\n(`sudo`, but with regex). Users cannot run arbitrary commands as a given\nuser without knowledge of the alternate user's password (see\n`runas`).\n\nThis creates difficulty for large multi-user systems when assigning\nroles without administrator access. Performing tasks that need to step\noutside of low privilege is not a simple matter without divulging the\nalternative user's credentials.\n\nUnix systems support the SUID execute bit (normally mode 4755) on a\nbinary which, when executed switches process ownership to the file\nowner, not the user that executed it. This is sorely lacking in\nWindows and would change the access landscape if it were implemented,\nmany organisations could then solve many issues where users execute\nprograms as a privileged user when they wouldn't otherwise need to.\n\n.. _sudo: https://www.sudo.ws/\n.. _doas: https://man.openbsd.org/doas\n.. _please: https://gitlab.com/edneville/please\n\n-----------------------------------------\nLack of control over desktop environment.\n-----------------------------------------\n\nWindows has many ways to customize its appearance;\nthere are many `alternative shells`_ and `visual themes`_,\nand it's possible to `change the login shell`_\nor `run without explorer.exe at all`_. [#KDE_on_Windows]_\n\n.. _alternative shells: https://en.wikipedia.org/wiki/List_of_alternative_shells_for_Windows\n.. _visual themes: https://en.wikipedia.org/wiki/Theme_%28computing%29#Operating_systems\n.. _run without explorer.exe at all: https://web.archive.org/web/20161023151404/http://lightquick.co.uk/running-windows-without-explorer.exe.html\n.. _change the login shell: https://superuser.com/questions/108265/how-do-you-replace-the-logon-shell-with-iexplore\n\nThere is Windows software for\ntiling window managers, [#tiling_window_managers]_\nvirtual desktops, [#virtual_desktops]_\nfocus follows mouse, [#focus_follows_mouse]_\nand special effects to rival `Compiz`_. [#cube_desktop]_\n\n.. _Compiz: https://www.youtube.com/watch?v=4QokOwvPxrE\n\nGiven all these choices and customization options,\nwhat functionality could Windows possibly lack?\n\nHere is the problem:\nthe Windows API determines the behavior of libraries like\n``user32.dll``, ``gdi32.dll``, and ``comctl32.dll``.\nEverything in hardware goes through the Windows API,\nincluding keystrokes, mouse clicks, and graphics.\nThus, the API can be used to restrict what programs can do. [#wine_dlls]_\n\nThis is not a theoretical problem.\nBecause of Intel's High-bandwidth Digital Content Protection,\nWindows applications cannot use the graphics card\nto manipulate windows the way `Flip3D`_ does.\n\nhttps://stackoverflow.com/questions/3848558/what-is-the-api-to-create-applications-like-flip3d\n\n.. _Flip3D: https://en.wikipedia.org/wiki/File:Windows7_flip.png\n\nSometimes it isn't the API, either;\non Windows 8 it is impossible to disable the dwm window compositor.\n\n    In Windows Vista and Windows 7, desktop composition is disabled in a number\n    of scenarios. In Windows 8, DWM desktop composition is a core operating\n    system component and cannot be disabled. With a few exceptions, desktop\n    composition is always on; it’s started before the user logon and remains\n    active for the duration of a session.\n\n    --- Windows Dev Center documentation\n\nhttps://msdn.microsoft.com/en-us/library/windows/desktop/hh848042%28v=vs.85%29.aspx\n\nThis was not without controversy.\n\n    I  understand the choice and it improves the overall experience, but it is\n    going to force us to retire some of our older software, and it tool [sic]\n    many years to overcome the problems caused.\n\n    --- Dan Ritchie\n\nhttps://msdn.microsoft.com/en-us/library/windows/desktop/hh848042%28v=vs.85%29.aspx\n\nLinux also has an API,\nbut it is based on the POSIX standard,\nis not tied to the desktop environment,\nand is not controlled by a single corporation\nin the same way that the Windows API is.\n\n.. [#tiling_window_managers] https://github.com/fuhsjr00/bug.n\n.. [#virtual_desktops] https://virtuawin.sourceforge.net/\n.. [#focus_follows_mouse]\n   https://milosophical.me/blog/2010/03/10/ms-windows-focus-follows-mouse-registry-hacks.html\n   https://superuser.com/questions/368688/on-windows-7-is-there-any-way-to-make-the-scrollwheels-focus-follow-the-mouse\n.. [#cube_desktop] http://www.thinkinbytes.com/en/products/cubedesktop\n.. [#KDE_on_Windows]\n   It's even possible to run the KDE desktop environment on Windows,\n   since KDE uses the cross-platform Qt framework.\n\n       The KDE on Windows Initiative is an ongoing project to port the KDE\n       applications to MS Windows. Currently supported versions of Windows are\n       XP, Vista and 7.\n\n   https://community.kde.org/Windows\n\n   This is not without difficulties, however.\n\n       The current implementation of KDE is designed in a unix specific way,\n       which is partially different from the Windows way. Examples for this\n       are:\n\n       * Process creating - Using the Unix way of fork and exec.\n\n       * It isn't available on Windows, this difference requires a redesign of\n         the related parts.\n\n       * Its missing Windows api counterparts.\n\n       * KDE uses Unix domain socket for high speed data transfer betwen\n         kioslave slaves and its parent process and for the communication\n         to/from the dbus deamon. On Windows there are no Unix domain sockets.\n         They could be emulated by tcp sockets with the costs of slower\n         bandwidth and additional patches to deal with Unix domain socket files\n         exchanged between processes.\n\n       --- Ralf Habacker, KDE developer\n\n   http://lxer.com/module/newswire/view/79007/\n\n.. [#wine_dlls]\n   In principle, running `Wine`_ on Windows\n   could work around restrictions on the Windows API\n   since Wine provides an open-source implementation\n   of libraries such as ``user32.dll``.\n   To fully accomplish this would require replacing Windows entirely, however.\n\n   .. _Wine: https://www.winehq.org/about/\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\nNon-resizable dialog boxes.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe single Windows UI library\nmeans that accessibility improvements\nand user interface customization can be difficult to implement.\n\nFor example, on Linux, graphical dialog boxes\n(e.g. those generated by ``xmessage`` or ``zenity``)\nare resizable by default,\nbut on Windows they are non-resizable by default,\ni.e. ``WS_THICKFRAME`` is not enabled by default.\n\n.. TOOD: source\n.. TODO: is it even possible to prevent resizing?\n\n    In some cases, you want to display something in a response window but you\n    also want this window to be resizable in order to let the user resize this\n    window to display the info the way he or she wants. Normally, response\n    windows are not resizable and this is also the Microsoft standard\n    behaviour.\n\n    --- Eric Aling, April 13, 2000\n\nhttp://eric.aling.tripod.com/PB/tips/pbtip39.htm\n\n    Unlike regular windows, most dialog boxes can't be maximized, minimized, or\n    resized. They can, however, be moved.\n\nhttps://web.archive.org/web/20150429182602/http://windows.microsoft.com/en-us/windows/working-with-windows#1TC=windows-7\n\nThis can pose user-interface problems,\nespecially on high-resolution monitors.\n\n    It feels so silly to have three acres of screen real estate but be fighting\n    to see three characters hidden by dot-dot-dot in a window not much bigger\n    than a postit note.\n\n    --- stewardware, January 7, 2011\n\nhttps://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/cannot-resize-small-windows/160862cf-6e52-4a99-9365-d380491a067d\n\n\nOne workaround for this problem\nis to run a third-party background process\nthat watches for window creation and mouse click events.\n[#resize_non_resizable_windows]_\n[#turn_non_resizable_windows]_\n[#ResizeEnable]_\n\nThe README is not directly linkable via URL,\nso here are some of the salient parts:\n\n    - What is ResizeEnable?\n\n    It's a very ugly system hack that sits in your system tray and attempts to\n    make windows that can't usually be resized, resizeable.\n\n    - Why was it written?\n\n    It was written following a request from a friend. He runs his PC at a\n    screen resolution above 1280x1024, and was fed up with having to pick items\n    from a list that could only display three items because the window didn't\n    take into account the screen resolution, hence only occupying about 20% of\n    the desktop 'real-estate'.\n\n    - How does it work?\n\n    ResizeEnable sits in the background and attaches itself into Windows via\n    three 'Hooks'.  The first hook is so that it can see which windows are\n    created/destroyed, in which it attempts to alter the window's style so that\n    it can be resized.  The second hook intercepts all messages for every\n    single window to see if it is a message associated with resizing a window\n    that it has previously altered the style of. If the message is associated\n    with sizing, it then resizes all the child windows (Buttons, Edit boxes and\n    so on) simply by scaling them to fit the new windows size. Its ugly, but\n    most of the time it works ok.  The third hook spots whether the mouse has\n    been pressed in the 'sizing area' of a window and takes care of doing all\n    the work of resizing the window. This hook didn't exist in v1.0 but has\n    been added to make even more windows resize properly.\n\nThere are some drawbacks to this approach:\n\n    - Known problems\n\n    #. Most applications will respond to having their windows resized ok. Well,\n       applications that have followed the guidelines will. \u003cgrin\u003e\n\n    #. Some applications have, shall we say, problems, when their window has\n       been resized and all sort of visual chaos will be revealed.\n\n    #. Some applications won't respond at all, which is rather strange!\n\n    #. Certain windows will 'jiggle' as you attempt to resize them, seemingly\n       resizing and then snapping back to their original size. This is\n       annoying, but we're not sure what is causing it.\n\n    #. Some versions of Internet Explorer, coupled with certain version of\n       Windows98/NT seemed to crash with v1.0 of ResizeEnable. We don't have\n       that setup on any of our test machines so we can't test it.  But, we\n       have done a little bit more work so ResizeEnable is a bit more choosy as\n       to which windows it can work with. So it -might- not crash anymore.  If\n       it still crashes, then all we can suggest at the moment is that you\n       upgrade to Internet Explorer 6. We're not Microsoft pushers, but\n       Internet Explorer 6 has better error reporting and shouldn't just\n       explode without warning.\n\n    #. Some Microsoft applications have dialogs that can be resized, but none\n       of their contents move. This is down to the fact that the contents of\n       the dialog ARE NOT STANDARD MICROSOFT CONTROLS! They are some\n       bastardisation written specially for the application.  They may look\n       like normal buttons/drop downs, but they sure as heck aren't! Hence,\n       ResizeEnable can't tell them to move or resize. Yet again, Microsoft\n       ignore their own codebase and reinvent the wheel. And people wonder why\n       their applications are so big..\n\n.. [#resize_non_resizable_windows] https://www.thewindowsclub.com/resize-non-resizable-windows\n.. [#turn_non_resizable_windows] https://www.howtogeek.com/howto/11799/turn-non-resizeable-windows-into-rezieable-windows/\n.. [#ResizeEnable] https://www.softpedia.com/get/System/System-Miscellaneous/ResizeEnable.shtml\n\n~~~~~~~~~~~~~~~\nUpdate inertia.\n~~~~~~~~~~~~~~~\n\nAnother consequence of tying the desktop environment to the operating system version\nand providing a single desktop environment for a given version of Windows\nis that improvements that require changes to the user interface are often delayed.\n\n***\nUAC\n***\n\nFor example, `users run as administrator by default in Windows XP`_ and earlier.\nMicrosoft fixed this problem via `User Account Control`_ when Windows Vista was released,\nbut the required changes to the user interface were controversial, [#UAC_controversy]_\nand many users learned to ignore it or turned it off entirely.\n\n.. _User Account Control: https://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx\n.. _users run as administrator by default in Windows XP: https://msdn.microsoft.com/en-us/library/bb530410.aspx#vistauac_topic1\n\nDespite Microsoft ending support for Windows XP in April 2014,\na `large number of users are still running Windows XP in 2015`_,\nmany of them as administrators.\n\n.. _large number of users are still running Windows XP in 2015: https://redmondmag.com/articles/2015/04/08/windows-xp-usage.aspx\n\n.. [#UAC_controversy]\n   https://www.computerworld.com/article/2477832/desktop-apps/microsoft-exec--we-know-users-hate-uac.html\n   https://arstechnica.com/security/2008/04/vistas-uac-security-prompt-was-designed-to-annoy-you/\n   https://web.archive.org/web/20160730185317/http://windowssecrets.com/woodys-windows/microsoft-claims-windows-7-uac-flaw-is-by-design/\n   https://web.archive.org/web/20170612174556/http://windowsitpro.com/blog/microsoft-quotmalware-authors-really-hate-uacquot\n\n\n*********\nWindows 8\n*********\n\nThe transition from Windows 7 to Windows 8 was controversial,\nin part because the Metro user interface departed substantially\nfrom the previous versions of Windows.\n[#windows_8_hate_1]_\n[#windows_8_defense]_\n[#windows_9]_\n[#windows_8_polarizing]_\n[#windows_8_hate_2]_\n[#windows_8_hate_3]_\n\nEnterprise customers, in particular,\nrefused to upgrade from Windows 7,\nciting usability problems.\n[#windows_8_enterprise]_\n[#windows_8_disappointing]_\n\nThese examples are relevant\nnot because they show that Microsoft makes occasional mistakes,\nbut to highlight the risks of monoculture and vendor lock-in\nand to provide contrast to the way\nthat the Linux ecosystem maintains checks and balances.\n\nLinux users can run the latest kernel and applications\non a window manager that hasn't changed much since 1987, [#twm_debian]_ [#twm_1987]_\nand some of them actually do so by choice. [#twm_user_by_choice]_ [#twm_popcon]_\n\n.. [#twm_debian] https://tracker.debian.org/pkg/twm\n.. [#twm_1987] https://en.wikipedia.org/wiki/Twm\n.. [#twm_user_by_choice] https://unix.stackexchange.com/questions/131106/is-twm-still-a-viable-window-manager#comment209905_131120\n.. [#twm_popcon] https://qa.debian.org/popcon.php?package=twm\n\nThis reflects a general distrust of mandatory backward-incompatible updates.\nWhen the GNOME developers made controversial changes in GNOME 3, [#gnome_3_fork]_ [#gnome_3_hate]_ [#gnome_3_grumpy]_\na team forked GNOME 2 to become `MATE`_,\nwhich retained the \"traditional desktop metaphor\".\nA fork would be impossible if GNOME 2's source code were proprietary.\n\n.. _MATE: https://mate-desktop.org/\n\nA fork like MATE will either `eventually fade away`_,\ncontinue to `coexist with its parent project`_,\nor even `overtake its parent`_,\ndepending on the needs of its users.\n\n.. _eventually fade away: https://crunchbang.org/forums/viewtopic.php?id=38916\n.. _coexist with its parent project: https://en.wikipedia.org/wiki/OpenBSD\n.. _overtake its parent: http://www.softpanorama.org/People/Stallman/history_of_gcc_development.shtml\n\n.. [#windows_8_hate_1] https://www.washingtonpost.com/blogs/the-switch/wp/2014/02/14/8-things-i-hate-about-windows-8-1/\n.. [#windows_8_defense] https://www.forbes.com/sites/tonybradley/2014/03/19/im-sorry-the-windows-8-hate-just-doesnt-make-sense/\n.. [#windows_9] https://www.smh.com.au/digital-life/computers/hate-windows-8-microsoft-replacing-it-with-windows-9-20140122-317fo.html\n.. [#windows_8_polarizing] https://bgr.com/general/windows-8-hatred-explained/\n.. [#windows_8_hate_2] https://archive.md/MPBEF\n.. [#windows_8_hate_3] https://answers.microsoft.com/en-us/windows/forum/windows_8-windows_install/i-hate-windows-8/cd2d9fec-9d95-42ba-9e41-727419459465\n.. [#windows_8_enterprise] https://www.forbes.com/sites/adriankingsleyhughes/2013/05/19/why-enterprise-is-avoiding-windows-8/\n.. [#windows_8_disappointing] https://www.nngroup.com/articles/windows-8-disappointing-usability/\n.. [#gnome_3_fork] https://www.zdnet.com/article/linus-torvalds-would-like-to-see-a-gnome-fork/\n.. [#gnome_3_hate] https://felipec.wordpress.com/2011/06/16/after-two-weeks-of-using-gnome-3-i-officially-hate-it/\n.. [#gnome_3_grumpy] https://lwn.net/Articles/433409/\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nCrippled multi-user remote access.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n`Windows remote desktop licensing`_ makes multi-user remote access\nand sharing of machine resources expensive.\nBy design, multiple concurrent sessions are disabled\non all but the server version of Windows,\nand `third-party remote desktop software is not permitted`_\nto legally `circumvent this limitation`_. [#windows_xp_not_multiuser]_ [#tightvnc_multiple_unique_sessions]_ [#multiple_sessions_illegal]_\n\n.. _Windows remote desktop licensing: https://technet.microsoft.com/en-us/library/cc725933.aspx\n.. _third-party remote desktop software is not permitted: https://superuser.com/questions/784523/tightvnc-while-an-rdp-session-is-running\n.. _circumvent this limitation: https://lifehacker.com/5873717/enable-concurrent-remote-desktop-sessions-in-windows-with-this-patch\n\nNote that this is a licensing issue,\nnot a technical limitation of Windows itself,\nbut it compromises the utility of the operating system.\n\nBecause Linux is multi-user by design,\n`multiple local instances of the X server`_ are not unusual,\neven with different desktop environments\n(e.g. GNOME and KDE can coexist on the same Linux box).\nX sessions can be accessed remotely using e.g. `VNC`_ or `X over SSH`_.\nOften, two different users will work remotely\nat the same time on the same machine\nusing different desktop environments.\n\n.. _multiple local instances of the X server: https://journalxtra.com/linux/desktop/multiple-desktops-on-one-linux-pc-now-thats-greedy/\n.. _VNC: https://wiki.debian.org/VNCviewer\n.. _X over SSH: https://www.debian.org/doc/manuals/debian-reference/ch07.en.html#_connecting_a_remote_x_client_via_ssh\n\nA `multiseat`_ configuration is also possible if the hardware is available.\nEven on single-user machines this capability of the X server is useful\nto e.g. run two different desktop environments at the same time.\n\n.. _multiseat: https://wiki.archlinux.org/index.php/xorg_multiseat\n\nAlso, sometimes Linux users will forego the X server entirely\nand log in from a text-only `virtual terminal`_ (a.k.a ``tty``).\nThis is important to be able to do\nif the X server crashes or cannot start.\n\n.. _virtual terminal: https://en.wikipedia.org/wiki/Virtual_console\n\nBecause the Linux kernel does not rely on the X server to function,\nthe `X server can be restarted without rebooting`_.\n\n.. _X server can be restarted without rebooting: https://askubuntu.com/questions/1220/how-can-i-restart-x-server-from-the-command-line\n\nIf a crash is unrecoverable and it becomes necessary to reboot the kernel,\none can do so cleanly even if the X server is unresponsive\nby using the \"`Magic Alt-SysRq keys`_\",\nkey combinations which send instructions to the kernel.\n\n.. _Magic Alt-SysRq keys: https://archive.md/TVTEh\n\n(Windows has Ctrl-Alt-Delete,\nbut requires a responding display manager\nto allow the user to cleanly reboot.)\n\nThere is a plethora of window managers [#window_managers]_\nand desktop environments [#desktop_environments]_\nto choose from on Linux,\neven on the same distribution,\nmaking it highly customizable to the system's resources and the user's wishes.\nHowever, they all use the same X Window System (a.k.a X11)\nprovided by the X server, typically X.org.\n\nThe X11 system is by no means perfect;\nin fact, many former X11 developers\nare hard at work on its replacement, `Wayland`_,\nand Canonical (the company behind Ubuntu)\nis working on a separate but similar endeavor called `Mir`_.\n\n.. _Wayland: https://wayland.freedesktop.org/architecture.html\n.. _Mir: https://mir-server.io/\n\nHowever, X11 has become so pervasive\nthat versions of it power not only Linux desktops\nbut also the BSD family of operating systems and OS X (`XQuartz`_),\nand it's also been `ported to Windows`_ `and Android`_,\neven though they don't use it as a display manager.\n\n.. _XQuartz: https://xquartz.macosforge.org/landing/\n.. _ported to Windows: https://sourceforge.net/projects/xming/\n.. _and Android: https://web.archive.org/web/20170110145517/https://play.google.com/store/apps/details?id=net.sourceforge.x11basic\n\n.. [#window_managers]\n   https://wiki.archlinux.org/index.php/Window_manager\n   https://en.wikipedia.org/wiki/Comparison_of_X_window_managers\n.. [#desktop_environments]\n   https://wiki.debian.org/DesktopEnvironment\n   https://en.wikipedia.org/wiki/Comparison_of_X_Window_System_desktop_environments\n.. [#windows_xp_not_multiuser]\n\n       You would think that because Windows XP is multiuser, you could have\n       multiple users running VNC servers. Indeed you can, but you can only use\n       the one that has the currently active user - switch away, and that\n       server goes black, and in my testing, can't even be used again. Windows\n       XP is not really multiuser.\n\n   https://archive.md/j5zHH\n.. [#tightvnc_multiple_unique_sessions]\n\n       Windows, unless you're using Terminal Server (and have the licenses to\n       go with it) doesn't have this capability, and I don't believe that even\n       with Terminal Server, VNC will be able to take advantage of this.\n\n   `Source is down`_\n.. _Source is down: http://ehc.ac/p/vnc-tight/mailman/message/25780367/\n\n.. [#multiple_sessions_illegal]\n\n       If you heard about/saw many active desktop sessions in non-server\n       Windows - that was modified OS with swapped termsrv.dll. Licensing does\n       not allow you to modify/swap system files and use non-server system that\n       way and this is ILLEGAL.\n\n   https://stackoverflow.com/questions/9410091/multi-user-login-remote-desktop-on-windows-linux\n\n--------------------------\nSome notes on performance.\n--------------------------\n\nSo far, we have avoided the topic of performance almost entirely.\n\nThis is because evaluating and comparing performance\nis a complex and nuanced topic,\nincorporating at the very least hardware-specific considerations\nand deep knowledge of every level of software.\n\nIt also incorporates psychology,\nsince people don't care if software has good performance\nif they `don't perceive it to have good performance`_.\n\n.. _don't perceive it to have good performance: https://web.archive.org/web/20170228194654/https://developers.google.com/speed/articles/usability-latency\n\nAs a result,\nunqualified generalizations about the performance\nof complex software such as an operating system\nare nearly always wrong.\n\nThere are some things, however, that we do know\nabout relative performance of the Windows and Linux kernels.\n\nFirst, an anonymous Windows kernel developer stated in 2013\nthat he believes that Windows has fallen behind in performance\nbecause of how Microsoft functions as a corporation.\n(This developer gave a SHA1 hash of part of the NT kernel as proof,\nwhich while not incontrovertible is certainly strong evidence\nthat he is who he claims to be.)\n\n    Windows is indeed slower than other operating systems in many scenarios,\n    and the gap is worsening. The cause of the problem is social. There's\n    almost none of the improvement for its own sake, for the sake of glory,\n    that you see in the Linux world.\n\n    Granted, occasionally one sees naive people try to make things better.\n    These people almost always fail. We can and do improve performance for\n    specific scenarios that people with the ability to allocate resources\n    believe impact business goals, but this work is Sisyphean. There's no\n    formal or informal program of systemic performance improvement. We started\n    caring about security because pre-SP3 Windows XP was an existential threat\n    to the business. Our low performance is not an existential threat to the\n    business.\n\n    --- Anonymous Windows NT kernel developer\n\nhttps://blog.zorinaq.com/i-contribute-to-the-windows-kernel-we-are-slower-than-other-oper/\n\n\nContrast with Microsoft's `\"Linux Myths\" article`_ from 1999.\n\n    Myth: Linux performs better than Windows NT\n\n    Reality: Windows NT 4.0 Outperforms Linux On Common Customer Workloads\n\n    The Linux community claims to have improved performance and scalability in\n    the latest versions of the Linux Kernel (2.2), however it's clear that\n    Linux remains inferior to the Windows NT® 4.0 operating system.\n\n.. _\"Linux Myths\" article: https://web.archive.org/web/20000303020855/http://www.microsoft.com/NTServer/nts/news/msnw/LinuxMyths.asp\n\nA decade later, `Microsoft contributed device driver code`_ to the Linux kernel.\n\n.. _Microsoft contributed device driver code: https://archive.md/gyEdx\n\nSecondly, testing and optimizing on multiple platforms\ncan yield unexpected performance benefits for both operating systems.\nWhen Valve `ported Left 4 Dead 2 to Linux`_ in 2012,\nthey discovered that OpenGL on Windows and Linux\nachieved a higher framerate than Direct3D on Windows.\n\n    After this work, Left 4 Dead 2 is running at 315 FPS on Linux. That the\n    Linux version runs faster than the Windows version (270.6) seems a little\n    counter-intuitive, given the greater amount of time we have spent on the\n    Windows version. However, it does speak to the underlying efficiency of the\n    kernel and OpenGL. Interestingly, in the process of working with hardware\n    vendors we also sped up the OpenGL implementation on Windows. Left 4 Dead 2\n    is now running at 303.4 FPS with that configuration.\n\n    --- Valve Linux Team\n\n.. _ported Left 4 Dead 2 to Linux: https://archive.md/tW6zD\n\n.. TODO: should I talk more about this?\n\n+++++++++++++++++++++++++++++++++++++\nConfiguration and software packaging.\n+++++++++++++++++++++++++++++++++++++\n\nWhile these topics could be included under architectural limitations,\nthey are large enough to deserve their own section.\n\n-----------------\nDefault software.\n-----------------\n\nLinux distributions have development tools installed by default,\nsuch as a C compiler (usually ``gcc``),\nbuild automation (e.g. ``make``),\ntext utilities (``diff``, ``patch``, ``grep``, ``find``, etc.),\nand more than one shell (e.g. ``bash``, ``dash``, and ``csh``).\n\nIn fact, the `POSIX standard`_ requires that these be available.\nStandards like POSIX make writing and using portable software easier,\nand standard POSIX tools are unlikely to become obsolete.\n\n.. _POSIX standard: https://pubs.opengroup.org/onlinepubs/009696699/utilities/contents.html\n\nOn Windows, by contrast,\nthere is no default set of tools that match the POSIX utilities\n(though certainly not for lack of trying). [#POSIX_for_Windows]_\n\nThe `Windows C compiler and build system`_\nis not installed by default,\neven though a zero-price Community version is available.\n\nThere is a scriptable shell on all version of Windows (``CMD.EXE``)\nbut the currently favored Windows shell (`PowerShell`_)\nwas not available by default until Windows 8.\n\n.. _Windows C compiler and build system: https://msdn.microsoft.com/en-us/vstudio/\n.. _PowerShell: https://github.com/PowerShell/PowerShell\n\n.. [#POSIX_for_Windows]\n   https://technet.microsoft.com/en-us/library/cc754351.aspx\n   https://superuser.com/questions/495360/does-windows-8-still-implement-posix\n   https://stackoverflow.com/questions/4746043/where-does-microsoft-windows-7-posix-implementation-currently-stand\n   https://brianreiter.org/2010/08/24/the-sad-history-of-the-microsoft-posix-subsystem/\n   https://superuser.com/questions/293023/unix-command-line-utilities-for-windows-x64\n\n--------------------------------------------------\nSoftware configuration: registries and text files.\n--------------------------------------------------\n\nOn Windows, configuration files are not centralized in the user's home directory.\nThe data that retain configuration when upgrading or recovering from data loss\nare scattered around as ``.INI`` text files in unpredictable directories\nor in the `Windows Registry`_.\nIn principle, applications should put config files in ``%APPDATA%``,\nbut in practice many of them put it in the install directory.\n\nFurthermore, ``%APPDATA`` makes no distinction\namongst an application's\nconfiguration and plugins,\nhistory and log files,\nand cached data.\n\nThis makes configuration less robust\nand harder to adapt to the needs of specific users.\nWindows developers have noted the `many other drawbacks`_ `of the registry`_ in particular.\n\n.. _Windows Registry: https://msdn.microsoft.com/en-us/library/ms970651.aspx\n.. _many other drawbacks: https://rwmj.wordpress.com/2010/02/18/why-the-windows-registry-sucks-technically/\n.. _of the registry: https://blog.codinghorror.com/was-the-windows-registry-a-good-idea/\n\nOn Linux, most configuration can be done graphically\nwithin applications or configuration managers provided by the desktop environment.\nA lot of it is handled by the `package manager`_.\nHowever, there are a variety of possibilities\ndepending on the needs of the people using it.\n\n.. _package manager: `Package manager with signed binaries.`_\n\nSystem administrators, for example,\ncare about system-level configuration files,\ngenerally text files in ``/etc/``.\n\nText files are simple to edit\nfor ad-hoc debugging and automation,\neasy to diff,\neasy to backup or version control,\nand robust against corruption.\n\nUser level configuration is stored in dotfiles\n(hidden folders or files)\nin the user's home directory,\noften under the ``~/.config/`` folder.\nPlugins and logfiles generally go under ``~/.local/share/``,\nand cached data under","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnbeaver%2Fwhy-linux-is-better","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnbeaver%2Fwhy-linux-is-better","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnbeaver%2Fwhy-linux-is-better/lists"}