PageSourceSearch

https://danielhall.io/bio

html danielhall.io collected 2026-10-05 06:50:03 UTC 17,747 bytes, 462 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="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="&#x2713;" /><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&#39;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&#39;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  &copy; 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="&#x2713;" />
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.