<!DOCTYPE html>
<html lang="en"><!--<![endif]-->
<head><!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame 
	Remove this if you use the .htaccess --><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Content-type" content="text/html; charset=utf-8" /><meta http-equiv="Content-Language" content="en-us" />
	<title>John T Wang | Web and mobile notes from a Cupertino desk</title>
	<link href="/css/style.css" rel="stylesheet" />
	<link href="/css/style-ia3-1.0.2.css" rel="stylesheet" />
	<link href="/css/style-fancybox-1.3.1.css" rel="stylesheet" />
	<link href="/css/syntax.css" rel="stylesheet" /><meta name="readability-verification" content="TUtXzYNbXNxTWmLsy33dNs5x5hZrFnApsrpF6WBt"/><meta name="description" content="Personal site of John T Wang: web and mobile teaching notes, Three20 work, and a home-lab path from a bench router to a phone build."><meta name="author" content="John Wang"><meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; width=device-width;">
	<link href="/favicon.ico" rel="shortcut icon" />
	<link href="/apple-touch-icon.png" rel="apple-touch-icon" />
	<link href="https://feeds.feedburner.com/JohnTWang" rel="alternate" type="application/rss+xml" /><script src="/js/external/modernizr-1.5.min.js"></script><!-- Place this tag in your head or just before your close body tag --><script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script><!-- Custom Colours -->
	<style type="text/css">a,
    a:hover,
    label,
    .HSC,
    .index #content section.G6 h1 {
    color:#CC0000;
    }

    a:visited {
    color:#AA0000;
    }
	</style>
</head>
<body class="page">
<div id="screen">
<header>
<h1 class="G2 GS">&nbsp;</h1>

<p><a class="G1 GS" href="/" rel="author" style="
            font-size: 40px;">John T Wang</a></p>
<!-- .G2.GS -->

<nav>
<ul class="containsGrid G3" id="headerOne">
	<li class="G1 GS">
	<h2 class="HSC">&nbsp;</h2>

	<ul>
		<li>&nbsp;</li>
		<li>&nbsp;</li>
		<li>&nbsp;</li>
	</ul>
	</li>
	<li class="G1">
	<h2 class="HSC">Articles</h2>

	<ul>
		<li><a href="/blog">Blog</a></li>
		<li><a href="/archives">Archives</a></li>
		<li><a href="/search">Search</a></li>
	</ul>
	</li>
	<li class="G1">
	<h2 class="HSC">Projects</h2>

	<ul>
		<li><a href="/projects">Projects</a></li>
		<li><a href="https://github.com/jwang">GitHub</a></li>
		<li><a href="/resources">Resources</a></li>
	</ul>
	</li>
</ul>
<!-- .containsGrid.G3#headerOne -->

<ul class="containsGrid G1" id="headerTwo">
	<li class="G1 GS">
	<h2 class="HSC">About</h2>

	<ul>
		<li><a href="/about" rel="author">Profile</a></li>
		<li><a href="/contact">Contact</a></li>
	</ul>
	</li>
</ul>
<!-- .containsGrid.G1x#headerTwo --></nav>
</header>

<hr class="implied" />
<article class="G4 GR GS" id="content">
<div class="formatted">
<h3>Welcome</h3>

<p>My name is John. I love to make amazing things and teach others how to do the same. I focus primarily on <span class="highlight">web</span> and <span class="highlight">mobile apps</span>.</p>

<h3>Recently</h3>

<p>Organized Aloha Ruby Conference 2012.</p>

<p>I was also a core member of the Facebook&#39;s <a href="https://github.com/facebook/three20">Three20</a> open source iOS library.</p>

<p>I was also one of the organizers of Hawaii&#39;s Ruby community, <a href="https://aloharb.org">Aloha.rb</a> and the Honolulu Google Technology Users Group.</p>

<p>Taught an Introductory and Intermediate iOS Programming courses at Pacific New Media.</p>

<p>As of Ascension 2026 this page is still the scratch space I use before a class or a weekend build. The conference links above are historical. The bench router work is current, and the newer posts on the <a href="/blog">blog</a> start there.</p>

<p>When I am teaching a mobile class or standing up a local API for a weekend experiment, the first thing that usually breaks is not the compiler. It is the path from the phone to the bench router. Students lose a half hour hunting for the admin page, and I have done the same after a firmware flash that reset the LAN to a default I had forgotten.</p>

<p>A home lab that hosts simulators, a leftover Raspberry Pi, and a guest SSID needs a boring, repeatable way to open the gateway, read the DHCP table, and confirm which device owns 192.168.1.1. That is the same muscle memory I want people to have before they debug a flaky WebView or a TestFlight build that cannot see the office Wi-Fi.</p>

<p>I keep a short pointer next to my own notes: <a target=_blank href="https://1921681.mobi/">1921681.mobi</a>. The 1921681.mobi write-ups stay useful when a router brand changes its menu labels, because they talk about the address itself rather than one vendor screenshot. I send that same starting point to anyone who asks how I get a phone onto a local Rails server without burning an evening.</p>
<p>When I want the definition rather than a vendor screenshot I open <a href="https://www.rfc-editor.org/rfc/rfc1918.html">RFC 1918</a>, which still names the private IPv4 blocks a class uses on a bench LAN.</p>
<p>IANA keeps the same idea in the <a href="https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml">IPv4 special-purpose registry</a>, useful when a student asks why 192.168.1.1 is not a public host.</p>

<p>If you are here for iOS or Ruby posts, treat the LAN as part of the toolchain. Once the admin panel loads and the reservation list looks sane, the rest of the stack is much easier to trust. That is why the link sits on this home page instead of being buried in a footnote.</p>
</div>
<!-- .formatted --></article>
<!-- #content.G4.GR.GS -->

<hr class="implied" />
<footer>
<nav><!-- <ul class="containsGrid G6 GS" id="footerOne">
                    <li class="G2 GS">
                        <h2 class="implied"></h2>
                &nbsp;
                    </li>
                    <li class="G1">
                        <h2 class="HSC"></h2>
                        <ul>
                            <li> </li>
                            <li> </li>
                            <li> </li>
                        </ul>
                    </li>
                    <li class="G1">
                        <h2 class="HSC"></h2>
                        <ul>
                            <li> </li>
                            <li> </li>
                            <li> </li>
                        </ul>
                    </li>
                    <li class="G1">
                        <h2 class="HSC"></h2>
                        <ul>
                            <li><a href="https://github.com/jwang">GitHub</a></li>
                            <li><a href="https://linkedin.com/in/johntwang">LinkedIn</a></li>
                            <li><a href="https://code.google.com/u/jwang392/">Google Code</a></li>
                        </ul>
                    </li>
                    <li class="G1">
                        <h2 class="HSC"></h2>
                        <ul>
                            <li><a href="https://facebook.com/johntwang">Facebook</a></li>
                            <li><a href="https://twitter.com/johntwang">Twitter</a></li>
                            <li><a rel="author" href="https://plus.google.com/108799089017956718581">Google +</a></li>
                        </ul>
                    </li>
                </ul> --><!-- .containsGrid.G6GS#footerOne -->
<ul class="G6 GS" id="footerTwo">
	<li><a href="/">Home</a></li>
	<li><a href="/blog">Blog</a></li>
	<li><a href="/archives">Archives</a></li>
	<li><a href="/about">About</a></li>
	<li><a href="/contact">Contact</a></li>
	<li><span id="y57642426">© 2026 John T Wang</span><script>(function(){var e=document.getElementById('y57642426');if(e){e.textContent='© '+String(new Date().getFullYear())+' John T Wang';}})();</script></li>
</ul>
<!-- G6.GS#footerOne --></nav>
</footer>
<script src="https://platform.twitter.com/anywhere.js?id=ZYxgSVoTMH1GGqs09FBTUg&amp;v=1"></script><script>!window.jQuery && document.write('<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"><\/script>');</script><script src="/js/external/jquery.fancybox-1.3.1.min.js"></script><script src="/js/external/jquery.timeago-0.9.min.js"></script><script src="/js/ia3.js"></script><script>
    window.BASE_URL = '';

    $(document).ready(function() {
        $(document).trigger('CORE:HAS_INITIALIZED');
    });
    
    $(window).resize(function() {
        $(document).trigger('CORE:HAS_RESIZED');
    });
</script><script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "https://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
var pageTracker = _gat._getTracker("UA-4727282-14");
pageTracker._trackPageview();
</script></div>
<!-- #screen --><script type="text/javascript">
  var _gauges = _gauges || [];
  (function() {
    var t   = document.createElement('script');
    t.type  = 'text/javascript';
    t.async = true;
    t.id    = 'gauges-tracker';
    t.setAttribute('data-site-id', '4ebb2b32f5a1f51108000009');
    t.src = '//secure.gaug.es/track.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(t, s);
  })();
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[
{"@type":"Question","name":"What do you still keep this personal site for?","acceptedAnswer":{"@type":"Answer","text":"It is a scratch space separate from day-job work: class notes, older Three20 and Ruby posts, and the home-lab reminders I still send to students before a phone build."}},
{"@type":"Question","name":"When a phone cannot reach a local API, where should I start?","acceptedAnswer":{"@type":"Answer","text":"Start on the bench router. Confirm the gateway address, read the DHCP table, and only then retry the device. I point people at 1921681.mobi for that first hop because it stays useful when a vendor menu changes."}},
{"@type":"Question","name":"Are the Aloha Ruby and Pacific New Media links current?","acceptedAnswer":{"@type":"Answer","text":"Those lines are historical. The current writing on this site is the bench-router and device-lab material on the blog, starting with the Ascension 2026 post."}}
]}
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Person","name":"John T Wang","url":"/","jobTitle":"Software Engineer","sameAs":["https://github.com/jwang","https://www.linkedin.com/in/johntwang"]}
</script>
</body>
</html>