PageSourceSearch

https://sasheldon.com/blog/

html sasheldon.com collected 2026-09-25 14:29:41 UTC 12,801 bytes, 347 lines download raw bytes

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&rsquo;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&rsquo;t match the keyboards I was used to.
77But I didn&rsquo;t expect how, when you&rsquo;re using a totally new form factor and
78can customize every part of the layout,
79there&rsquo;
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 &rarr;</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&rsquo;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 &rarr;</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&rsquo;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&rsquo;re simply generated via the
127<code>@encode()</code> compiler directive, but that&rsquo;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 &rarr;</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&rsquo;t support iOS,
149and compiling one from scratch takes a prohibitively long time.
150With Rust&rsquo;s improved cross-compilation support, it&rsquo;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 &rarr;</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&rsquo;s a problem with this: <code>objc_msgSend</code> isn&rsquo;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 &rarr;</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&rsquo;s actually pretty easy
191to interact with from Rust.
192Over the past months I&rsquo;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&rsquo;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 &rarr;</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&rsquo;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 &rarr;</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&rsquo;ve compiled a lighthearted Twitter history of Octopress 2.0&rsquo;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 &rarr;</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&rsquo;ve started writing all my papers in LaTeX instead of Word, not only because
277it&rsquo;s cleaner and can provide more control, but because then I can version
278control them. Hell, I&rsquo;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&rsquo;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&rsquo;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 &copy; 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.