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="3ulLQHYs1ZKtZB88KAOrRjfKdN62yX950AiZY0vubVhzMEbi9+olVQTddt6mZ+qNNTy0Vleu06m8/n3MZM6j9Q==" /> 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 bio"> 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 <div id="side_menu" class="menu sb-slidebar sb-left sb-width-custom" data-sb-width="200px"> 142 <ul> 143 <p>Navigation</p> 144 <a href="/"> 145 <li><i class="fa fa-home"></i> Blog Home</li> 146 </a> 147 <a href="/archive"> 148 <li><i class="fa fa-sort-amount-desc"></i> Archive</li> 149 </a> 150 <a href="/bio"> 151 <li><i class="fa fa-heart"></i> About</li> 152 </a> 153 <a href="/feed"> 154 <li><i class="fa fa-rss"></i>RSS</li> 155 </a> 156 157 158 <a href="/home" class="silvrback_branded_menu"><img style="width:40px;" src="/assets/gorilla-white-94520d1798dddcc0033e3be804ccee50745f2898955cf7fca49b6db98608ad04.svg" /> 159 <span class="dock_white_footer_brand_text">Silvrback</span></a> 160 <li class="classic-search"> 161 <div class="classic-search-wrapper"> 162 <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="LSFct/rv4Ofa5FnAFC3KNOkUKnDipD+3I471dN061mZuOeBjcI0f1N7xljgybN0QcEzjeunBn7UrPsJAQ5a1Qw==" /> 163 <div class="search-form"> 164 <span class="search-submit"> 165 <i class="fa fa-search"></i> 166 </span> 167 <input type="text" name="term" id="term" class="search-input" placeholder="Search" /> 168 <input type="hidden" name="user_id" id="user_id" value="6539" /> 169 </div> 170</form></div>
171<script type="text/javascript"> 172 $(function () { 173 $('.classic-search-wrapper .search-submit').click(function (e) { 174 search(e, $('#classic-search-form .search-input')); 175 }); 176 177 $('.classic-search-wrapper .search-input').keypress(function (e) { 178 if (e.keyCode == 13) { 179 search(e, $(this)); 180 } 181 }); 182 183 var search = function (event, input) { 184 event.preventDefault(); 185 search_text = input.val(); 186 if (search_text != '' && search_text.length >= 3) { 187 $('#classic-search-form').submit(); 188 } 189 else { 190 $('#classic-search-form').find('.search-input').focus(); 191 } 192 }; 193 194 $('.search-input').focusin(function () { 195 $('.search-form').addClass('search-active'); 196 }).focusout(function () { 197 $('.search-form').removeClass('search-active'); 198 }); 199 }); 200</script>
200 201 </li> 202 </ul> 203 </div> 204 205
206<script> 207 $(document).ready(function () { 208 209 var container = document.querySelector('.masonry_area'); 210 var msnry = new Masonry(container, { 211 // options 212 columnWidth: container.querySelector('.author_section') 213 }); 214 $('.all_external_links').find('a[href^="http://"], a[href^="https://"]').attr('target', '_blank'); 215 216 }); 217</script>
217 218 219<div id="sb-site"> 220 <article class="page2"> 221 <div class="blog_post2"> 222 <div class="align_center"> 223 <h1 class="blog_title bio_title" style="margin-bottom:0; padding-bottom:0"> 224 Daniel Hall 225 </h1> 226 227 <div class="blog_subtitle bio_subtitle"> 228 </div> 229 </div> 230 231 <br/> 232 233 <div class="align_center profile_picture" style="margin-top:10px;"> 234 <img class="bio_pic" src="https://silvrback.s3.amazonaws.com/uploads/867c6386-9881-4655-8650-570bd9d43158/Screen%20Shot%202016-07-04%20at%2010.24.31%20AM_large.png" /> 235 </a> 236 </div> 237 <div class="bio_line"><br/></div> 238 239 <br/><br/> 240 241 <div style="clear:both"></div> 242 243 <div class="bio_text_area theme1_bio_text"> 244 <div class="all_external_links"> 245 <p>I'm a product guy who loves to code, and a code craftsman who loves making great products.</p> 246 247<p>Professional software development for 10+ years; I've led projects for NBC, MTV, Fox, PBS / PBS Kids, CBS, Turner / NBA and the successful mobile games Car Town and Racing Rivals</p> 248 249<p>Currently focused on Swift, bringing functional programming into object oriented apps, and building great libraries and frameworks for the iOS community.</p> 250 251 </div> 252 </div> 253 254 <div class="masonry_area"> 255 256 257 </div> 258 259 260 261 <div class="bottom_profile_divider"></div> 262 263 </div> 264 265 <footer class="footer ui_elements"> 266 © 2026 Daniel Hall 267</footer> 268 </article> 269</div> 270 271<div class="social"> 272 <ul> 273 <li> 274 <a href="https://www.twitter.com/_danielhall" target="_blank" title="follow Me"> 275 <svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewB
275ox="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> 276 </a> 277 </li> 278 279 280 281 282 283 <li> 284 <a href="https://stackoverflow.com/u/1830999" target="_blank" title="follow Me"><i class="fa fa-stack-overflow"></i></a> 285 </li> 286 287 288 289 290 291 <li> 292 <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> 293 </li> 294 295 296</ul> 297 298</div> 299 300<div id="reader_to_user_email" class="white-popup mfp-with-anim mfp-hide"> 301 <div class="modal-body"> 302 <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="✓" /> 303 <div class="share-form"> 304 <div id="email_error"></div> 305 <div class="input-field"> 306 <label> From </label> 307 <input type="email" name="from" id="from" placeholder="" /> 308 </div> 309 <div class="input-field"> 310 <label> Subject </label> 311 <input type="text" name="subject" id="subject" value="" class="text-like-input" /> 312 </div> 313 <div class="input-field"> 314 <textarea name="body" id="body" placeholder="Message..." class="input-full"> 315</textarea> 316 </div> 317 </div> 318 <input type="hidden" name="author_mail" id="author_mail" value="[email protected]" /> 319 <div class="email-share-recaptcha">
vendor: 85 bytes, lines 319-320
319 320 <script src="https://www.google.com/recaptcha/api.js" async defer></script>
321<div data-sitekey="6Ld_5TYUAAAAAP58EQXxxmKDRIWtZo5OZbZccyKM" class="g-recaptcha "></div> 322 <noscript> 323 <div> 324 <div style="width: 302px; height: 422px; position: relative;"> 325 <div style="width: 302px; height: 422px; position: absolute;"> 326 <iframe 327 src="https://www.google.com/recaptcha/api/fallback?k=6Ld_5TYUAAAAAP58EQXxxmKDRIWtZo5OZbZccyKM" 328 scrolling="no" name="ReCAPTCHA" 329 style="width: 302px; height: 422px; border-style: none; border: 0;"> 330 </iframe> 331 </div> 332 </div> 333 <div style="width: 300px; height: 60px; border-style: none; 334 bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; 335 background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;"> 336 <textarea id="g-recaptcha-response" name="g-recaptcha-response" 337 class="g-recaptcha-response" 338 style="width: 250px; height: 40px; border: 1px solid #c1c1c1; 339 margin: 10px 25px; padding: 0px; resize: none;"> 340 </textarea> 341 </div> 342 </div> 343 </noscript> 344 345 </div> 346 <div class="share-action text-center"> 347 <img class="loader" style="display: none;" src="/assets/ajax-loader-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif" /> 348 <input type="submit" name="commit" value="Send" class="publish_btn silvrback_btn email-share-submit" data-disable-with="Send" /> 349 </div> 350</form> </div> 351</div> 352
353<script type="text/javascript"> 354 $(function () { 355 356 $('#reader-to-user-mail-form').submit(function (e) { 357 e.preventDefault(); 358 var form = $(this); 359 email = $('#from').val(); 360 subject = $('#subject').val(); 361 if (email == null || invalid_email(email)) { 362 var error_html = "<label style='width: 100% !important; color: red;'> Valid email address required.. </label>"; 363 $('#email_error').addClass('input-field').html(error_html); 364 return false; 365 } 366 367 if (subject == null || subject.length < 1) { 368 var error_html = "<label style='width: 100% !important; color: red;'> Subject required.. </label>"; 369 $('#email_error').addClass('input-field').html(error_html); 370 return false; 371 } 372 373 if (grecaptcha.getResponse() == "") { 374 var error_html = "<label style='width: 100% !important; color: red;'> Please check the recaptcha!!!.. </label>"; 375 $('#email_error').addClass('input-field').html(error_html); 376 return false; 377 } 378 379 $.ajax({ 380 url: form.attr('action'), 381 type: 'post', 382 data: form.serialize(), 383 beforeSend: function () { 384 $('.loader').show(); 385 }, 386 success: function () { 387 $('.loader').hide(); 388 }, 389 error: function () { 390 var error_html = "<label style='width: 100% !important; color: red;'> There is an error. Try again... </label>"; 391 $('#email_error').addClass('input-field').html(error_html); 392 $('.loader').hide(); 393 } 394 }) 395 return false; 396 }); 397 398 $('#from').change(function () { 399 if (!invalid_email($(this).val())) { 400 $('#email_error').removeClass('input-field').html('') 401 } 402 }); 403
404 function invalid_email(email) { 405 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,}))$/; 406 return re.test(email) ? false : true; 407 } 408 }); 409</script>
409 410 411
412<script type="text/javascript"> 413 $(function () { 414 $('.reader_to_user_email_link').click(function () { 415 open_modal('#reader_to_user_email'); 416 }); 417 }); 418</script>
418 419
420<script type="text/javascript"> 421 $(function () { 422 $('.show-category').click(function () { 423 var cat_id = ($(this).attr("data-cat-id")); 424 $(".extra_category_" + cat_id).removeClass('category-hidden'); 425 $(this).addClass('category-hidden') 426 }); 427 }); 428</script>
428 429 430 431 432
433<script type="text/javascript"> 434 $(document).ready(function () { 435 $(".tab_open a").attr("target", "_blank"); 436 }) 437</script>
437 438<div class="new-feature-popup-box"> 439 <p> 440 This update link alerts you to new Silvrback admin blog posts. A green bubble beside the link indicates a new post. 441 Click the link to the admin blog and the bubble disappears. 442 </p> 443 <div style="text-align: center; text-decoration: underline;"> 444 <a style="color: #0B84B0;" class="got-it-new-feature-link" data-remote="true" href="/close-notification?notification_type=new_feature">Got It!</a> 445 </div> 446</div> 447
448<script type="text/x-mathjax-config"> 449 MathJax.Hub.Config({ 450 extensions: ["tex2jax.js"], 451 jax: ["input/TeX", "output/HTML-CSS"], 452 tex2jax: { 453 inlineMath: [["\\(","\\)"]], 454 displayMath: [ ['$$','$$'], ["\\[","\\]"] ], 455 processEscapes: true 456 }, 457 "HTML-CSS": { availableFonts: ["TeX"] } 458 }); 459</script>
vendor: 1 bytes, line 459
459
460<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>
460 461</body> 462</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.