1<!DOCTYPE html> 2<!--[if IEMobile 7 ]><html class="iem7"><![endif]--> 3<!--[if lt IE 9]><html class="lte-ie8"><![endif]--> 4<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html lang="en"><!--<![endif]--> 5<head> 6 <meta charset="utf-8"> 7 <title>sasheldon.com</title> 8 <meta name="author" content="Steven Sheldon"> 9 10 11 <meta name="description" content="I really like git; if I could keep everything under version control, I would. I’ve started writing all my papers in LaTeX instead of Word, no..."> 12 13 14 <!-- http://t.co/dKP3o1e --> 15 <meta name="HandheldFriendly" content="True"> 16 <meta name="MobileOptimized" content="320"> 17 <meta name="viewport" content="width=device-width, initial-scale=1"> 18 19 20 <link rel="canonical" href="http://sasheldon.com/blog/"> 21 <link href="/favicon.png" rel="icon"> 22 <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> 23 <link href="/blog/atom.xml" rel="alternate" title="sasheldon.com" type="application/atom+xml"> 24 25 <!--Fonts from Google"s Web font directory at http://google.com/webfonts --> 26 <link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css"> 27 <link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css"> 28</head> 29 30<body> 31 <header role="banner"><hgroup> 32 <h1><a href="/">sasheldon.com</a></h1> 33 34</hgroup> 35</header> 36 <nav role="navigation"><ul class="subscription" data-subscription="rss"> 37 <li><a href="/blog/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li> 38 39</ul> 40 41 42<form action="http://google.com/search" method="get"> 43 <fieldset role="search"> 44 <input type="hidden" name="sitesearch" value="sasheldon.com" /> 45 <input class="search" type="text" name="q" results="0" placeholder="Search"/> 46 </fieldset> 47</form> 48 49 50<ul class="main-navigation"> 51 <li><a href="/">About</a></li> 52 <li><a href="/blog">Blog</a></li> 53 <li><a href="/blog/archives">Archives</a></li> 54</ul> 55</nav> 56 <div id="main"> 57 <div id="content"> 58 <div class="blog-index"> 59 60 61 <article> 62 63<header> 64 65 <h1 class="entry-title"><a href="/blog/2025/12/28/designing-keyboard-alpha-layout/">Designing my own keyboard alpha layout for comfy inrolls</a></h1> 66 67 68</header> 69 70 71 <div class="entry-content"><p>Last year, the discomfort in my arms after using the computer got too bad to 72continue ignoring, and I ordered my first ergonomic keyboard, the 73<a href="https://www.moergo.com/pages/glove80">MoErgo Glove80</a>. This was my first time 74using a columnar keyboard, and my first programmable keyboard. 75I expected to make some layout customizations; obviously the layout on this 76new keyboard couldn’t match the keyboards I was used to. 77But I didn’t expect how, when you’re using a totally new form factor and 78can customize every part of the layout, 79there’
79s really no reason not to customize deeply!</p> 80</div> 81 82 <footer> 83 <a rel="full-article" href="/blog/2025/12/28/designing-keyboard-alpha-layout/">Read on →</a> 84 </footer> 85 86 </article> 87 88 <article> 89 90<header> 91 92 <h1 class="entry-title"><a href="/blog/2017/05/07/how-i-broke-cargo-for-windows/">How I Broke Rust's Package Manager for All Windows Users</a></h1> 93 94 95</header> 96 97 98 <div class="entry-content"><p>Last weekend I was playing around with a way to represent null-terminated UTF8 99strings in Rust. Rather than just toying with it forever, 100I decided to clean up a minimal version and publish it to crates.io. Creating 101the crate went smoothly, exactly the same as the 11 prior crates I’ve published. 102I closed up my laptop and called it a day.</p> 103 104<p>Well, everything only seemed the same until an hour later when I got this tweet:</p> 105</div> 106 107 <footer> 108 <a rel="full-article" href="/blog/2017/05/07/how-i-broke-cargo-for-windows/">Read on →</a> 109 </footer> 110 111 </article> 112 113 <article> 114 115<header> 116 117 <h1 class="entry-title"><a href="/blog/2017/02/20/objective-c-from-rust-type-encodings/">Objective-C from Rust: Statically Verified Type Encodings without Allocation</a></h1> 118 119 120</header> 121 122 123 <div class="entry-content"><p>Lately I’ve been thinking about a new way to generate 124<a href="https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html">Objective-C type encodings</a> 125from Rust. The Objective-C runtime needs these encodings when declaring methods 126and instance variables, and in Objective-C they’re simply generated via the 127<code>@encode()</code> compiler directive, but that’s not available in Rust!</p> 128</div> 129 130 <footer> 131 <a rel="full-article" href="/blog/2017/02/20/objective-c-from-rust-type-encodings/">Read on →</a> 132 </footer> 133 134 </article> 135 136 <article> 137 138<header> 139 140 <h1 class="entry-title"><a href="/blog/2016/02/22/testing-rust-on-ios-with-travis/">Testing Rust on iOS with Travis</a></h1> 141 142 143</header> 144 145 146 <div class="entry-content"><p>Since I started automatically testing my Rust crate with Travis, 147I had always wanted to test on iOS as well. 148Unfortunately, the default Rust compiler on Travis doesn’t support iOS, 149and compiling one from scratch takes a prohibitively long time. 150With Rust’s improved cross-compilation support, it’s now possible!</p> 151</div> 152 153 <footer> 154 <a rel="full-article" href="/blog/2016/02/22/testing-rust-on-ios-with-travis/">Read on →</a> 155 </footer> 156 157 </article> 158 159 <article> 160 161<header> 162 163 <h1 class="entry-title"><a href="/blog/2015/08/02/objective-c-from-rust-objc_msgsend/">Objective-C from Rust: objc_msgSend</a></h1> 164 165 166</header> 167 168 169 <div class="entry-content"><p>I previously wrote about how to <a href="/blog/2014/11/28/interoperating-between-objective-c-and-rust/">interoperate between Objective-C and Rust</a> 170and use a Rust macro to pass a variable number of arguments to <code>objc_msgSend</code>. 171Well, there’s a problem with this: <code>objc_msgSend</code> isn’t a variadic function!</p> 172</div> 173 174 <footer> 175 <a rel="full-article" href="/blog/2015/08/02/objective-c-from-rust-objc_msgsend/">Read on →</a> 176 </footer> 177 178 </article> 179 180 <article> 181 182<header> 183 184 <h1 class="entry-title"><a href="/blog/2014/11/28/interoperating-between-objective-c-and-rust/">Interoperating Between Objective-C and Rust</a></h1> 185 186 187</header> 188 189 190 <div class="entry-content"><p>Since the Objective-C runtime exposes a C interface, it’s actually pretty easy 191to interact with from Rust. 192Over the past months I’ve worked on a Rust wrapper around the 193<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html">Objective-C runtime</a> 194and some classes of the 195<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/ObjC_classic/index.html">Foundation framework</a>, 196creatively called <a href="https://github.com/SSheldon/rust-objc/">rust-objc</a>. 197I had hoped to learn more about Rust’s foreign function interface and the 198Objective-C runtime, but along the way I also encountered some interesting 199challenges in API design.</p> 200</div> 201 202 <footer> 203 <a rel="full-article" href="/blog/2014/11/28/interoperating-between-objective-c-and-rust/">Read on →</a> 204 </footer> 205 206 </article> 207 208 <article> 209 210<header> 211 212 <h1 class="entry-title"><a href="/blog/2013/12/14/simplifying-json-response-mocks-with-jinja/">Simplifying JSON Response Mocks With Jinja</a></h1> 213 214 215</header> 216 217 218 <div class="entry-content"><p>For documenting and testing large APIs, response mocks can be a very useful 219tool. They not only provide examples for the users of your API, but they can be 220used in automated tests as if you had received real data without actually 221hitting the network.</p> 222 223<p>Creating and maintaining a large collection of response mocks can be greatly 224simplified by preprocessing them with a template engine like Python’s 225<a href="http://jinja.pocoo.org/">Jinja</a>. Although this adds another step to your build 226process, it allows some really useful functionality!</p> 227</div> 228 229 <footer> 230 <a rel="full-article" href="/blog/2013/12/14/simplifying-json-response-mocks-with-jinja/">Read on →</a> 231 </footer> 232 233 </article> 234 235 <article> 236 237<header> 238 239 <h1 class="entry-title"><a href="/blog/2013/07/07/waiting-for-octopress-2-successor/">Waiting for Octopress 2.0's Successor</a></h1> 240 241 242</header> 243 244 245 <div class="entry-content"><p>The next version of <a href="http://octopress.org/">Octopress</a> is packed full of 246<a href="https://gist.github.com/imathis/e9c2ee2406e93c4269e8">awesome improvements</a>. 247Octopress will change massively to be more extensible and customizable while 248still being as powerful and easy as ever; as such, this update has been in 249development for a long time, still not having released officially.</p> 250 251<p>In anticipation of this update, I periodically check the 252<a href="https://twitter.com/octopress">Octopress Twitter</a> for news and have 253encountered many release date estimates. Estimating time for development is 254<a href="http://blog.hut8labs.com/coding-fast-and-slow.html">notoriously difficult</a>, 255so I’ve compiled a lighthearted Twitter history of Octopress 2.0’s 256successor and its estimated release dates.</p> 257</div> 258 259 <footer> 260 <a rel="full-article" href="/blog/2013/07/07/waiting-for-octopress-2-successor/">Read on →</a> 261 </footer> 262 263 </article> 264 265 <article> 266 267<header> 268 269 <h1 class="entry-title"><a href="/blog/2012/11/15/octopress/">Octopress</a></h1> 270 271 272</header> 273 274 275 <div class="entry-content"><p>I really like git; if I could keep everything under version control, I would. 276I’ve started writing all my papers in LaTeX instead of Word, not only because 277it’s cleaner and can provide more control, but because then I can version 278control them. Hell, I’ve even started keeping my Borderlands 2 game saves 279backed up in a git repository.</p> 280 281<p>Imagine my delight, then, when I discovered <a href="http://octopress.org/">Octopress</a>. 282Octopress is a framework that makes it really easy to generate a blog just from 283a set of markdown files that can be hosted on 284<a href="http://pages.github.com/">GitHub pages</a>. I’ve already been using GitHub to 285host my personal website, and using it to host a blog would be pretty swell.</p> 286 287<p>I’ve worked through the documentation to get a blog up and running; after all, 288I have homework to be working on right now, so I need to find something else to 289do. Nevermind the fact that I never actually put in the effort to blog or can 290come up with interesting topics; if nothing else, this was just an exercise to 291test out Octopress and to become more familiar with the features of GitHub 292pages.</p> 293</div> 294 295 </article> 296 297 <div class="pagination"> 298 299 <a href="/blog/archives">Blog Archives</a> 300 301 </div> 302</div> 303 304 305 <aside class="sidebar"> 306 <section> 307 <h1>Recent Posts</h1> 308 <ul id="recent_posts"> 309 310 <li class="post"> 311 <a href="/blog/2025/12/28/designing-keyboard-alpha-layout/">Designing my own keyboard alpha layout for comfy inrolls</a> 312 </li> 313 314 <li class="post"> 315 <a href="/blog/2017/05/07/how-i-broke-cargo-for-windows/">How I Broke Rust's Package Manager for All Windows Users</a> 316 </li> 317 318 <li class="post"> 319 <a href="/blog/2017/02/20/objective-c-from-rust-type-encodings/">Objective-C from Rust: Statically Verified Type Encodings without Allocation</a> 320 </li> 321 322 <li class="post"> 323 <a href="/blog/2016/02/22/testing-rust-on-ios-with-travis/">Testing Rust on iOS with Travis</a> 324 </li> 325 326 <li class="post"> 327 <a href="/blog/2015/08/02/objective-c-from-rust-objc_msgsend/">Objective-C from Rust: objc_msgSend</a> 328 </li> 329 330 </ul> 331</section> 332 333 </aside> 334 335 </div> 336 </div> 337 <footer role="contentinfo"><p>
338 Copyright © 2025 - Steven Sheldon - 339 <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> 340</p> 341</footer> 342 343
343<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
343 344
344<script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/libs/jquery.min.js"%3E%3C/script%3E'))</script>
344 345
345<script src="/javascripts/octopress.js" type="text/javascript"></script>
345 346</body> 347</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.