PageSourceSearch

https://danielhall.io/archive

html danielhall.io collected 2026-10-05 06:50:00 UTC 25,223 bytes, 576 lines download raw bytes

1<!DOCTYPE html>
2<html>
3<head>
4  <meta name="viewport" content="width=device-width, initial-scale=1.0">
5<title>Daniel Hall</title>
6<meta name="description" content="The blog of Daniel Hall">
7<meta name="author" content="Daniel Hall">
8<meta name="keywords" content="blog, blog platform, self-hosted, self-hosted blogging, simple blog platform, minimalist blog, minimalist blogging platform, simple blog platform, easy blogging, uncluttered blogging, web developer blog, programmer blog platform, coder blog, programmer blogs">
9
10  <!-- Do a conditional here to test for the theme selected in settings.-->
11  <link rel="stylesheet" media="all" href="/assets/classic_theme-c2dc8311b564c23e39b1ce837f685b93f8a4057dcd9a904adea61c094343c1d1.css" />
12
13<script src="/assets/application-7ce23f029c89a31f5fe654b5cd05eb69830846cf70f2db0958deae29ac65b312.js"></script>
13
14
15    
15<script type="text/javascript" src="//use.typekit.net/pqt3qiq.js"></script>
15
16    <link rel="shortcut icon" href="https://silvrback.s3.amazonaws.com/uploads/setting/favicon/6538/a1cd3c78f34e157d1b054af170dff6fd.ico">
17
18
19  
19<script type="text/javascript">
20      var _gaq = _gaq || [];
21      //handles all back end tracking, and silvrback home tracking
22
23      <!--      pushes stats to user account, with either custom domain or subdomain. One or the other, not both. If custom domain is set, then silvrback subdomain tracking won't show for user.-->
24      <!--      _gaq.push(['user._setAccount', '']);-->
25      <!--      _gaq.push(['user._setDomainName', '']);-->
26      <!--      _gaq.push(['user._setDomainName', 'silvrback.com']);-->
27      <!--      _gaq.push(['user._setAllowLinker', true]);-->
28      <!--      _gaq.push(['user._trackPageview']);-->
29       // By Nazrul
30      //Send tracking data to 3rd profile. Tracks all front end user domain data (custom domains and subdomains)
31      _gaq.push(['custom._setAccount', 'UA-63748633-1']);
32      _gaq.push(['custom._setDomainName', 'danielhall.io']);
33      _gaq.push(['custom._setAllowLinker', true]);
34      _gaq.push(['custom._trackPageview']);
35      (function () {
36          var ga = document.createElement('script');
37          ga.type = 'text/javascript';
38          ga.async = true;
39          ga.src = 'https://ssl.google-analytics.com/ga.js';
40
41          var s = document.getElementsByTagName('script')[0];
42          s.parentNode.insertBefore(ga, s);
43      })();
44
45  </script>
45
46
47
48<!--user defined color variables-->
49<style>
50  .social i:hover, .mobile_social i:hover {
51    color:#e1c823 !important;
52  }
53/*  .sidr a:hover {
54    color:#efefef !important;
55    text-shadow: 0 0 0.4em #e1c823
56  }*/
57  .open-order-and-tag > .article_entry:hover {
58    background-color:#e1c823 !important;
59  }
60  .full_blog_btn:hover {
61    background-color:#e1c823 !important;
62  }
63  .read_more_btn:hover {
64    text-decoration: none !important;
65    background-color:#e1c823 !important;
66  }
67  .load_more_articles a:hover {
68    text-decoration: none !important;
69    background-color:#e1c823 !important;
70  }
71</style>
72  <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
73
74  
74<script type="text/javascript">var _sf_startpt = (new Date()).getTime()</script>
74
75  
75<script type="text/javascript">try {
76      Typekit.load();
77  } catch (e) {
78  }</script>
78
79  
79<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
79
80  <!--[if lt IE 9]>
81  
81<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
81
82  
82<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
82
83  <![endif]-->
84  <meta name="csrf-param" content="authenticity_token" />
85<meta name="csrf-token" content="RB8qOSjVf7mJ6NaLaNCocuT/W88zBI6fgd3p8W7xueh5F9ST6bBTIQSID4w/r929TgozKj6nXpkV7wyxqwIjiA==" />
86  
87  <link rel="alternate" type="application/atom+xml" title="ATOM" href="/feed" />
88  <link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.rss" />
89  <!-- Facebook Pixel Code -->
90  
90<script>
vendor: 641 bytes, lines 90-109
90
91      !function (f, b, e, v, n, t, s) {
92          if (f.fbq) return;
93          n = f.fbq = function () {
94              n.callMethod ?
95                  n.callMethod.apply(n, arguments) : n.queue.push(arguments)
96          };
97          if (!f._fbq) f._fbq = n;
98          n.push = n;
99          n.loaded = !0;
100          n.version = '2.0';
101          n.queue = [];
102          t = b.createElement(e);
103          t.async = !0;
104          t.src = v;
105          s = b.getElementsByTagName(e)[0];
106          s.parentNode.insertBefore(t, s)
107      }(window, document, 'script',
108          'https://connect.facebook.net/en_US/fbevents.js');
109      fbq('init', '
109601823960692369
vendor: 38 bytes, lines 109-111
109');
110      fbq('track', 'PageView');
111  
111</script>
111
112  <noscript>
113    <img height="1" width="1"
114         src="https://www.facebook.com/tr?id=601823960692369&ev=PageView
115&noscript=1"/>
116  </noscript>
117  <!-- End Facebook Pixel Code -->
118</head>
119<body class="home archive">
120<!-- conditional here for the theme body -->
121<div class="top_stripe" style="background-color:#e1c823"><br/></div>
122    <div class="mobile_brand sb-slide">
123      
124              <a href='#side_menu' class='sb-toggle-left'>
125                <img class="silvrback_menu circle_logo" src="https://silvrback.s3.amazonaws.com/uploads/c88c4eae-7e14-4fc9-88ba-6e5e48b51da8/coderead_large.png" />
126              </a>
127    </div>
128
129
130<div class="sidebar3 sb-slide">
131  <div class='logo_bar' data-tip='Menu' style='margin-left:5px;'>
132              <a href='#side_menu' class='sb-toggle-left'>
133                <img class="silvrback_menu circle_logo" src="https://silvrback.s3.amazonaws.com/uploads/c88c4eae-7e14-4fc9-88ba-6e5e48b51da8/coderead_large.png" />
134              </a>
135            </div>
136</div>
137
138<!--logged out user sidebar-->
139
140
141
142    <div id="side_menu" class="menu sb-slidebar sb-left sb-width-custom" data-sb-width="200px">
143      <ul>
144        <p>Navigation</p>
145            <a href="/">
146              <li><i class="fa fa-home"></i> Blog Home</li>
147            </a>
148        <a href="/archive">
149          <li><i class="fa fa-sort-amount-desc"></i> Archive</li>
150        </a>
151                <a href="/bio">
152                  <li><i class="fa fa-heart"></i> About</li>
153                </a>
154        <a href="/feed">
155          <li><i class="fa fa-rss"></i>RSS</li>
156        </a>
157
158
159        <a href="/home" class="silvrback_branded_menu"><img style="width:40px;" src="/assets/gorilla-white-94520d1798dddcc0033e3be804ccee50745f2898955cf7fca49b6db98608ad04.svg" />
160          <span class="dock_white_footer_brand_text">Silvrback</span></a>
161        <li class="classic-search">
162          <div class="classic-search-wrapper">
163  <form id="classic-search-form" target="_blank" action="/search" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="JsXrCa2l31RjrIvEMRxXct6Ri7MW4P250tqdJ2xckIHoDf4dG5HzNINsBLkfo//6x681nqIY6/dpHKNRM7Ptbg==" />
164      <div class="search-form">
165        <span class="search-submit">
166         <i class="fa fa-search"></i>
167        </span>
168        <input type="text" name="term" id="term" class="search-input" placeholder="Search" />
169        <input type="hidden" name="user_id" id="user_id" value="6539" />
170      </div>
171</form></div>
172<script type="text/javascript">
173    $(function () {
174        $('.classic-search-wrapper .search-submit').click(function (e) {
175            search(e, $('#classic-search-form .search-input'));
176        });
177
178        $('.classic-search-wrapper .search-input').keypress(function (e) {
179            if (e.keyCode == 13) {
180                search(e, $(this));
181            }
182        });
183
184        var search = function (event, input) {
185            event.preventDefault();
186            search_text = input.val();
187            if (search_text != '' && search_text.length >= 3) {
188                $('#classic-search-form').submit();
189            }
190            else {
191                $('#classic-search-form').find('.search-input').focus();
192            }
193        };
194
195        $('.search-input').focusin(function () {
196            $('.search-form').addClass('search-active');
197        }).focusout(function () {
198            $('.search-form').removeClass('search-active');
199        });
200    });
201</script>
201
202        </li>
203      </ul>
204    </div>
205
206
207<div id="sb-site">
208  <article class="page2">
209
210    <div class="blog_post2">
211      <div class="drafts_header" style="margin-bottom:15px">
212        <h1 class="blog_title">Articles</h1>
213        <span style="color:#999;">Order By &rarr;
214          <a class="reorder_by chronological_link dark_link" id="newest_first" data-value="chronological" href="">Newest First</a> |
215          <a class="reorder_by author_recommended_link" id="author_recs" data-value="authorPosition" href="">Author Recommendations</a> |
216          <a class="reorder_by by_category_link" id="category_recs" data-value="category" href="">Categories</a>
217        </span>
218      </div>
219
220      <div class="sortable_entries">
221
222            <a href="/model-defined-interfaces" class="article_entry isotop-removable" data-author-position="45861" data-chronological="1">
223              <h1>Model-Defined Interfaces</h1>
224                <span>Published on 2022-10-24</span>
225            </a>
226            <a href="/creating-a-sustainable-software-cycle" class="article_entry isotop-removable" data-author-position="45260" data-chronological="2">
227              <h1>
227Creating a Sustainable Software Cycle</h1>
228                <span>Published on 2022-04-10</span>
229            </a>
230            <a href="/a-useful-and-practical-approach-to-testing" class="article_entry isotop-removable" data-author-position="41880" data-chronological="3">
231              <h1>A Useful and Practical Approach to Testing</h1>
232                <span>Published on 2020-02-27</span>
233            </a>
234            <a href="/what-about-unit-tests" class="article_entry isotop-removable" data-author-position="41878" data-chronological="4">
235              <h1>What About Unit Tests?</h1>
236                <span>Published on 2020-02-27</span>
237            </a>
238            <a href="/the-two-kinds-of-tests" class="article_entry isotop-removable" data-author-position="41877" data-chronological="5">
239              <h1>The Two Kinds of Tests</h1>
240                <span>Published on 2020-02-27</span>
241            </a>
242            <a href="/testing-and-the-product-cycle" class="article_entry isotop-removable" data-author-position="41752" data-chronological="6">
243              <h1>Testing and the Product Cycle</h1>
244                <span>Published on 2020-02-09</span>
245            </a>
246            <a href="/what-is-testing-for-anyway" class="article_entry isotop-removable" data-author-position="41104" data-chronological="7">
247              <h1>What Is Testing For Anyway?</h1>
248                <span>Published on 2019-09-22</span>
249            </a>
250            <a href="/a-fresh-look-at-testing" class="article_entry isotop-removable" data-author-position="41881" data-chronological="8">
251              <h1>A Fresh Look at Testing</h1>
252                <span>Published on 2019-09-22</span>
253            </a>
254            <a href="/blog-update-finally-added-ssl" class="article_entry isotop-removable" data-author-position="41096" data-chronological="9">
255              <h1>Blog Update:  Back to Life and Finally Adding SSL</h1>
256                <span>Published on 2019-09-21</span>
257            </a>
258            <a href="/wwdc-2017-wishlist" class="article_entry isotop-removable" data-author-position="27636" data-chronological="10">
259              <h1>WWDC 2017 Wishlist</h1>
260                <span>Published on 2017-06-04</span>
261            </a>
262            <a href="/a-single-writer-pattern-in-swift" class="article_entry isotop-removable" data-author-position="24465" data-chronological="11">
263              <h1>A Single Writer Pattern in Swift</h1>
264                <span>Published on 2016-12-08</span>
265            </a>
266            <a href="/towards-better-unit-testing" class="article_entry isotop-removable" data-author-position="24423" data-chronological="12">
267              <h1>Towards Better Unit Testing</h1>
268                <span>Published on 2016-12-04</span>
269            </a>
270            <a href="/swift-y-dependency-injection-part-two" class="article_entry isotop-removable" data-author-position="23718" data-chronological="13">
271              <h1>Swift-y Dependency Injection, Part Two</h1>
272                <span>Published on 2016-10-21</span>
273            </a>
274            <a href="/a-swift-y-approach-to-dependency-injection" class="article_entry isotop-removable" data-author-position="21303" data-chronological="14">
275              <h1>A Swift-y Approach to Dependency Injection</h1>
276                <span>Published on 2016-06-11</span>
277            </a>
278            <a href="/a-grand-unification-theory-of-ios-styling" class="article_entry isotop-removable" data-author-position="21301" data-chronological="15">
279              <h1>A Grand Unification Theory of iOS Styling</h1>
280                <span>Published on 2016-06-11</span>
281            </a>
282            <a href="/wwdc-2016-wishlist-5-restore-game-controller-requirements-on-apple-tv" class="article_entry isotop-removable" data-author-position="21210" data-chronological="16">
283              <h1>WWDC 2016 Wishlist #5 : Restore Game Controller Requirements on Apple TV</h1>
284                <span>Published on 2016-06-05</span>
285            </a>
286            <a href="/wwdc-2016-wishlist-4-universal-messaging-extension-and-apis" class="article_entry isotop-removable" data-author-position="21202" data-chronological="17">
287              <h1>WWDC 2016 Wishlist #4: Universal Messaging Extension and APIs</h1>
288                <span>Published on 2016-06-05</span>
289            </a>
290            <a href="/wwdc-2016-wishlist-3-more-useful-size-classes" class="article_entry isotop-removable" data-author-position="21140" data-chronological="18">
291              <h1>WWDC 2016 Wishlist #3 : More Useful Size Classes</h1>
292                <span>Published on 2016-06-01</span>
293            </a>
294            <a href="/wwdc-2016-wishlist-2-tvos-channel-extensions" class="article_entry isotop-removable" data-author-position="21127" data-chronological="19">
295              <h1>WWDC 2016 Wishlist #2 : tvOS &quot;Channel&quot; Extensions</h1>
296                <span>Published on 2016-06-01</span>
297            </a>
298            <a href="/wwdc-2016-wishlist-1-swift-playgrounds-on-ipad" class="article_entry isotop-removable" data-author-position="21126" data-chronological="20">
299              <h1>WWDC 2016 Wishlist #1: Swift Playgrounds on iPad</h1>
300                <span>Published on 2016-05-31</span>
301            </a>
302
303      </div>
304      <div class="processing_spinner" style="display:none"><img style="height:45px; width:45px;" src="/assets/arrow-loader-386761079b92341f27cc90ccf06a2bffa966952b7431609348d217e5c53dcd4e.gif" /></div>
305
306      <!-- load more -->
307      <div class="load_more_articles" style="display:none;">
308        <a id="append" href="#"><i class="icon-refresh"></i> &nbsp;Next Page</a>
309      </div>
310
311      
311<script>
312
313
314          var total_pages = 1;
315          var page = 0;
316
317          var current_order_setting = "chronological";
318
319          if (total_pages > 0 && page < total_pages) {
320              $('.load_more_articles').show();
321          }
322
323          $('#append').click(function (e) {
324              e.preventDefault();
325              page += 1;
326
327              $.ajax({
328                  url: "/home/archive_load_more?page=" + page + "&order_by=" + current_order_setting,
329                  type: "GET",
330                  beforeSend: function () {
331                      $('.processing_spinner').show();
332                  },
333                  success: function (data) {
334                      $('.sortable_entries').isotope('insert', $(data));
335                      $('.processing_spinner').hide();
336
337                      history.pushState(null, document.title, "/archive?page=" + page + "&order_by=" + current_order_setting);
338
339                      $(window).bind("popstate", function () {
340                          $.getScript(this.href);
341                      });
342                      if (page >= total_pages) {
343                          $(".load_more_articles").hide();
344                      }
345                  }
346              });
347          });
348
349          $('.reorder_by').click(function (e) {
350              e.preventDefault();
351
352              var data_value = $(this).attr('data-value');
353
354              if (current_order_setting != data_value) {
355                  //reset the page when re-ordering
356                  page = 0;
357
358                  if (page < total_pages) {
359                      $(".load_more_articles").show();
360                  }
361                  //remove the existing data first
362                  var $removable = $('.sortable_entries').find('.isotop-removable');
363                  $('.sortable_entries').isotope('remove', $removable);
364
365                  $.ajax({
366                      url: "/home/archive_sort?order_by=" + data_value,
367                      type: "GET",
368                      beforeSend: function () {
369                          $('.processing_spinner').show();
370                      },
371                      success: function (data) {
372                          $('.sortable_entries').isotope('insert', $(data));
373                          $('.sortable_entries').isotope({sortBy: data_value});
374                          $('.processing_spinner').hide();
375                          current_order_setting = data_value;
376
377                          history.pushState(null, document.title, "/archive?order_by=" + current_order_setting);
378
379                          $(window).bind("popstate", function () {
380                              $.getScript(this.href);
381                          });
382                      }
383                  });
384              }
385          });
386      </script>
386
387    </div>
388
389    <footer class="footer ui_elements">
390  &copy; 2026 Daniel Hall
391</footer>
392  </article>
393</div>
394
395<div class="social">
396  <ul>
397    <li>
398      <a href="https://www.twitter.com/_danielhall" target="_blank" title="follow Me">
399        <svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 512 512" fill="currentColor"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg>
400      </a>
401    </li>
402
403
404
405
406
407    <li>
408      <a href="https://stackoverflow.com/u/1830999" target="_blank" title="follow Me"><i class="fa fa-stack-overflow"></i></a>
409    </li>
410
411
412
413
414
415    <li>
416      <a href="javascript:void(0)" id="reader_to_user_email_link" class="reader_to_user_email_link" title="Get in Touch"><i class="fa fa-comments"></i></a>
417    </li>
418
419
420</ul>
421
422</div>
423
424<div id="reader_to_user_email" class="white-popup mfp-with-anim mfp-hide">
425  <div class="modal-body">
426    <form id="reader-to-user-mail-form" action="/reader_to_author_email" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="&#x2713;" />
427      <div class="share-form">
428        <div id="email_error"></div>
429        <div class="input-field">
430          <label> From </label>
431          <input type="email" name="from" id="from" placeholder="" />
432        </div>
433        <div class="input-field">
434          <label> Subject </label>
435          <input type="text" name="subject" id="subject" value="" class="text-like-input" />
436        </div>
437        <div class="input-field">
438          <textarea name="body" id="body" placeholder="Message..." class="input-full">
439</textarea>
440        </div>
441      </div>
442      <input type="hidden" name="author_mail" id="author_mail" value="[email protected]" />
443      <div class="email-share-recaptcha">
vendor: 85 bytes, lines 443-444
443
444        <script src="https://www.google.com/recaptcha/api.js" async defer></script>
445<div data-sitekey="6Ld_5TYUAAAAAP58EQXxxmKDRIWtZo5OZbZccyKM" class="g-recaptcha "></div>
446          <noscript>
447            <div>
448              <div style="width: 302px; height: 422px; position: relative;">
449                <div style="width: 302px; height: 422px; position: absolute;">
450                  <iframe
451                    src="https://www.google.com/recaptcha/api/fallback?k=6Ld_5TYUAAAAAP58EQXxxmKDRIWtZo5OZbZccyKM"
452                    scrolling="no" name="ReCAPTCHA"
453                    style="width: 302px; height: 422px; border-style: none; border: 0;">
454                  </iframe>
455                </div>
456              </div>
457              <div style="width: 300px; height: 60px; border-style: none;
458                bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px;
459                background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
460                <textarea id="g-recaptcha-response" name="g-recaptcha-response"
461                  class="g-recaptcha-response"
462                  style="width: 250px; height: 40px; border: 1px solid #c1c1c1;
463                  margin: 10px 25px; padding: 0px; resize: none;">
464                </textarea>
465              </div>
466            </div>
467          </noscript>
468
469      </div>
470      <div class="share-action text-center">
471        <img class="loader" style="display: none;" src="/assets/ajax-loader-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif" />
472        <input type="submit" name="commit" value="Send" class="publish_btn silvrback_btn email-share-submit" data-disable-with="Send" />
473      </div>
474</form>  </div>
475</div>
476
477<script type="text/javascript">
478    $(function () {
479
480        $('#reader-to-user-mail-form').submit(function (e) {
481            e.preventDefault();
482            var form = $(this);
483            email = $('#from').val();
484            subject = $('#subject').val();
485            if (email == null || invalid_email(email)) {
486                var error_html = "<label style='width: 100% !important; color: red;'> Valid email address required.. </label>";
487                $('#email_error').addClass('input-field').html(error_html);
488                return false;
489            }
490
491            if (subject == null || subject.length < 1) {
492                var error_html = "<label style='width: 100% !important; color: red;'> Subject required.. </label>";
493                $('#email_error').addClass('input-field').html(error_html);
494                return false;
495            }
496
497            if (grecaptcha.getResponse() == "") {
498                var error_html = "<label style='width: 100% !important; color: red;'> Please check the recaptcha!!!.. </label>";
499                $('#email_error').addClass('input-field').html(error_html);
500                return false;
501            }
502
503            $.ajax({
504                url: form.attr('action'),
505                type: 'post',
506                data: form.serialize(),
507                beforeSend: function () {
508                    $('.loader').show();
509                },
510                success: function () {
511                    $('.loader').hide();
512                },
513                error: function () {
514                    var error_html = "<label style='width: 100% !important; color: red;'> There is an error. Try again... </label>";
515                    $('#email_error').addClass('input-field').html(error_html);
516                    $('.loader').hide();
517                }
518            })
519            return false;
520        });
521
522        $('#from').change(function () {
523            if (!invalid_email($(this).val())) {
524                $('#email_error').removeClass('input-field').html('')
525            }
526        });
527
528        function invalid_email(email) {
529            var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
530            return re.test(email) ? false : true;
531        }
532    });
533</script>
533
534
535
536<script type="text/javascript">
537    $(function () {
538        $('.reader_to_user_email_link').click(function () {
539            open_modal('#reader_to_user_email');
540        });
541    });
542</script>
542
543
544
545
546
547<script type="text/javascript">
548    $(document).ready(function () {
549        $(".tab_open a").attr("target", "_blank");
550    })
551</script>
551
552<div class="new-feature-popup-box">
553  <p>
554    This update link alerts you to new Silvrback admin blog posts. A green bubble beside the link indicates a new post.
555    Click the link to the admin blog and the bubble disappears.
556  </p>
557  <div style="text-align: center; text-decoration: underline;">
558    <a style="color: #0B84B0;" class="got-it-new-feature-link" data-remote="true" href="/close-notification?notification_type=new_feature">Got It!</a>
559  </div>
560</div>
561
562<script type="text/x-mathjax-config">
563  MathJax.Hub.Config({
564    extensions: ["tex2jax.js"],
565    jax: ["input/TeX", "output/HTML-CSS"],
566    tex2jax: {
567      inlineMath: [["\\(","\\)"]],
568      displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
569      processEscapes: true
570    },
571    "HTML-CSS": { availableFonts: ["TeX"] }
572  });
573</script>
vendor: 1 bytes, line 573
573
574<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"68fba62022b54bcebfdc6b3538a4ea75","r":1,"spa":2}' crossorigin="anonymous"></script>
574
575</body>
576</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.