09.xhtml 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. h t t :: / / t /
  4. h t t :: // // t //
  5. h ttttt ttttt ppppp sssss // // y y sssss ttttt //
  6. hhhh t t p p s // // y y s t //
  7. h hh t t ppppp sssss // // yyyyy sssss t //
  8. h h t t p s :: / / y .. s t .. /
  9. h h t t p sssss :: / / yyyyy .. sssss t .. /
  10. <https://y.st./>
  11. Copyright © 2016 Alex Yst <mailto:copyright@y.st>
  12. This program is free software: you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation, either version 3 of the License, or
  15. (at your option) any later version.
  16. This program is distributed in the hope that it will be useful,
  17. but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. GNU General Public License for more details.
  20. You should have received a copy of the GNU General Public License
  21. along with this program. If not, see <https://www.gnu.org./licenses/>.
  22. -->
  23. <!DOCTYPE html>
  24. <html xmlns="http://www.w3.org/1999/xhtml">
  25. <head>
  26. <base href="https://y.st./en/weblog/2016/01-January/09.xhtml" />
  27. <title>\scandir() &lt;https://y.st./en/weblog/2016/01-January/09.xhtml&gt;</title>
  28. <link rel="icon" type="image/png" href="/link/CC_BY-SA_4.0/y.st./icon.png" />
  29. <link rel="stylesheet" type="text/css" href="/link/basic.css" />
  30. <link rel="stylesheet" type="text/css" href="/link/site-specific.css" />
  31. <script type="text/javascript" src="/script/javascript.js" />
  32. <meta name="viewport" content="width=device-width" />
  33. </head>
  34. <body>
  35. <nav>
  36. <p>
  37. <a href="/en/">Home</a> |
  38. <a href="/en/a/about.xhtml">About</a> |
  39. <a href="/en/a/contact.xhtml">Contact</a> |
  40. <a href="/a/canary.txt">Canary</a> |
  41. <a href="/en/URI_research/"><abbr title="Uniform Resource Identifier">URI</abbr> research</a> |
  42. <a href="/en/opinion/">Opinions</a> |
  43. <a href="/en/coursework/">Coursework</a> |
  44. <a href="/en/law/">Law</a> |
  45. <a href="/en/a/links.xhtml">Links</a> |
  46. <a href="/en/weblog/2016/01-January/09.xhtml.asc">{this page}.asc</a>
  47. </p>
  48. <hr/>
  49. <p>
  50. Weblog index:
  51. <a href="/en/weblog/"><abbr title="American Standard Code for Information Interchange">ASCII</abbr> calendars</a> |
  52. <a href="/en/weblog/index_ol_ascending.xhtml">Ascending list</a> |
  53. <a href="/en/weblog/index_ol_descending.xhtml">Descending list</a>
  54. </p>
  55. <hr/>
  56. <p>
  57. Jump to entry:
  58. <a href="/en/weblog/2015/03-March/07.xhtml">&lt;&lt;First</a>
  59. <a rel="prev" href="/en/weblog/2016/01-January/08.xhtml">&lt;Previous</a>
  60. <a rel="next" href="/en/weblog/2016/01-January/10.xhtml">Next&gt;</a>
  61. <a href="/en/weblog/latest.xhtml">Latest&gt;&gt;</a>
  62. </p>
  63. <hr/>
  64. </nav>
  65. <header>
  66. <h1><code>\scandir()</code></h1>
  67. <p>Day 00308: Saturday, 2016 January 09</p>
  68. </header>
  69. <p>
  70. For some strange reason, my spider keeps quitting on me without an error message.
  71. At least now, quitting does not cause all the data to be lost.
  72. </p>
  73. <p>
  74. I found a function in the <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> manual that I had not seen before: <a href="https://secure.php.net/manual/en/function.scandir.php"><code>scandir()</code></a>.
  75. This function lists all files in a directory, and even does it alphabetically.
  76. As far as I can tell, the only thing that directory handles and <code>\Directory</code> object are good for is listing directories, so this simple function obsoletes both, as both are a pain to use.
  77. Literally every time that I want to use them, I have to consult the manual again to be sure I am using them correctly because you cannot just iterate over them as expected.
  78. Instead, you must explicitly check each return value for being identical to (not just equal to) false while at the same time assigning the values to variables.
  79. I have always thought that such a directory-listing function should exist, but could never find it, so I always just built my own.
  80. This function also obsoletes my own custom <code>dir()</code> function, which just creates a dir object, iterates over it, then alphabetizes and returns the results, so I am removing it.
  81. It obsoletes my dir class as well, though I will be keeping that due to it being one of my wrapper classes.
  82. </p>
  83. <p>
  84. While working on wrapping stream resources, I found some interesting things.
  85. First, that <a href="https://secure.php.net/manual/en/class.streamwrapper.php">class prototype that I found yesterday</a> seems to be for use with the <a href="https://secure.php.net/manual/en/function.stream-wrapper-register.php"><code>stream_wrapper_register()</code> function</a>.
  86. It is completely irrelevant to my current project of wrapping up resources with their function.
  87. Second, and more interestingly, I do not see any functions for actually creating a <a href="https://secure.php.net/manual/en/ref.stream.php">stream resource</a>.
  88. Instead, as best I can tell, the stream functions are used on resources created by more specific functions.
  89. For example, I think that the stream functions apply to <a href="https://secure.php.net/manual/en/book.dir.php">directory resources</a> and <a href="https://secure.php.net/manual/en/book.ftp.php"><abbr title="File Transfer Protocol">FTP</abbr></a> resources.
  90. I was thinking about making my stream class into an abstract class for other classes such as the <abbr title="File Transfer Protocol">FTP</abbr> class to extend, but there is a small issue with that plan.
  91. Specifically, my directory class already extends the default, half-implemented <code>\Directory</code> class.
  92. I can instead make it into a trait, though that means reworking several classes.
  93. Specifically, my wrapper classes currently use self::$resource to hold the resource handle, but <code>\Directory</code> uses <code>self::$handle</code> instead.
  94. In order to make the trait work, I will need to change any class that uses the stream trait to match.
  95. For consistency, I will probably change all the wrapper classes to match whether they use the stream trait or not.
  96. The one down side to using a trait instead of an abstract class is that I cannot use type hints to require that certain function take only resource wrappers as arguments.
  97. From the looks of it though, if this becomes a problem, I can create an interface to go with the trait.
  98. An interface cannot define working methods and a trait cannot be used for type hinting, but together, they can get the job done.
  99. </p>
  100. <p>
  101. I ran into some strange functions relating to &quot;bucket objects&quot; and &quot;brigade resources&quot;.
  102. There is no documentation that I can find on where brigade resources come from or how to create them.
  103. The only scrap of information that I can find is on the <a href="https://secure.php.net/manual/en/function.stream-bucket-prepend.php"><code>\stream_bucket_prepend()</code> function</a>&apos;s documentation page.
  104. This documentation says that a brigade resource is a resource used to contain bucket objects, but that is all that is says bout them.
  105. As for bucket object, I ran some tests on my machine, and it seems that bucket objects are just <code>\stdClass</code> objects that have three properties: a string, an integer, and a &quot;userfilter.bucket&quot; resource.
  106. I am also having trouble wrapping the stream_socket_*() functions, as their descriptions are not consistent.
  107. Some appear to work on a specific type of resource that is used for socket streams, but some imply that they are for streams in general.
  108. </p>
  109. <p>
  110. My <a href="/a/canary.txt">canary</a> still sings the tune of freedom and transparency.
  111. </p>
  112. <hr/>
  113. <p>
  114. Copyright © 2016 Alex Yst;
  115. You may modify and/or redistribute this document under the terms of the <a rel="license" href="/license/gpl-3.0-standalone.xhtml"><abbr title="GNU&apos;s Not Unix">GNU</abbr> <abbr title="General Public License version Three or later">GPLv3+</abbr></a>.
  116. If for some reason you would prefer to modify and/or distribute this document under other free copyleft terms, please ask me via email.
  117. My address is in the source comments near the top of this document.
  118. This license also applies to embedded content such as images.
  119. For more information on that, see <a href="/en/a/licensing.xhtml">licensing</a>.
  120. </p>
  121. <p>
  122. <abbr title="World Wide Web Consortium">W3C</abbr> standards are important.
  123. This document conforms to the <a href="https://validator.w3.org./nu/?doc=https%3A%2F%2Fy.st.%2Fen%2Fweblog%2F2016%2F01-January%2F09.xhtml"><abbr title="Extensible Hypertext Markup Language">XHTML</abbr> 5.1</a> specification and uses style sheets that conform to the <a href="http://jigsaw.w3.org./css-validator/validator?uri=https%3A%2F%2Fy.st.%2Fen%2Fweblog%2F2016%2F01-January%2F09.xhtml"><abbr title="Cascading Style Sheets">CSS</abbr>3</a> specification.
  124. </p>
  125. </body>
  126. </html>