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="✓" /><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 → 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 "Channel" 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> 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 © 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="✓" /> 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.