<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>hraefn.net</title><link href="/" rel="alternate"/><link href="https://hraefn.net/feeds/all.atom.xml" rel="self"/><id>/</id><updated>2026-08-03T04:12:00-04:00</updated><entry><title>The Small Web</title><link href="/2026/08/03/small_web.html" rel="alternate"/><published>2026-08-03T04:12:00-04:00</published><updated>2026-08-03T04:12:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2026-08-03:/2026/08/03/small_web.html</id><summary type="html">&lt;p&gt;This has been rattling around in my head for a few years. &lt;em&gt;Knock the dust off the blog and start posting again.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Much of the internet today is three or four rolling &lt;a href="https://en.wikipedia.org/wiki/Katamari_Damacy"&gt;Katamari Damacy&lt;/a&gt; balls of &lt;a href="https://en.wikipedia.org/wiki/Enshittification"&gt;enshitification&lt;/a&gt;. The small web, what I cut my teeth on in the 90s and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This has been rattling around in my head for a few years. &lt;em&gt;Knock the dust off the blog and start posting again.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Much of the internet today is three or four rolling &lt;a href="https://en.wikipedia.org/wiki/Katamari_Damacy"&gt;Katamari Damacy&lt;/a&gt; balls of &lt;a href="https://en.wikipedia.org/wiki/Enshittification"&gt;enshitification&lt;/a&gt;. The small web, what I cut my teeth on in the 90s and early aughts, still &lt;a href="https://daringfireball.net/"&gt;lives on&lt;/a&gt; in &lt;a href="https://www.craigslist.org/area/sfbay"&gt;many&lt;/a&gt; &lt;a href="https://miata.net/"&gt;ways&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="what-the-web-should-be"&gt;What the Web Should Be&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;humans&lt;/em&gt; posting things that interest them, and linking to other interesting things&lt;/li&gt;
&lt;li&gt;no ads&lt;/li&gt;
&lt;li&gt;no tracking&lt;/li&gt;
&lt;li&gt;no &lt;a href="https://daringfireball.net/2026/05/what_is_a_dickover"&gt;dickovers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over the weekend, while nursing a sore throat, I ported the site from Jekyll to &lt;a href="https://getpelican.com/"&gt;Pelican&lt;/a&gt;, gave the theme a vigorous shake, and &lt;a href="/2021/08/03/knots.html"&gt;finished an entry I drafted five years ago&lt;/a&gt;.&lt;/p&gt;</content><category term="posts"/><category term="code"/></entry><entry><title>How to Tie Your Shoes</title><link href="/2021/08/03/knots.html" rel="alternate"/><published>2021-08-03T04:12:00-04:00</published><updated>2021-08-03T04:12:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2021-08-03:/2021/08/03/knots.html</id><summary type="html">&lt;p&gt;I know how to tie my shoes.&lt;/p&gt;
&lt;p&gt;At least.. I thought I knew. Run a half-hitch, loop, the rabbit goes through, cinch down and you're done. As a child, my shoes always came undone; I quickly learned to &lt;a href="https://www.fieggen.com/shoelace/doubleknot.htm"&gt;double-knot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometime in 2005 or 2006, I was working for a telecom …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I know how to tie my shoes.&lt;/p&gt;
&lt;p&gt;At least.. I thought I knew. Run a half-hitch, loop, the rabbit goes through, cinch down and you're done. As a child, my shoes always came undone; I quickly learned to &lt;a href="https://www.fieggen.com/shoelace/doubleknot.htm"&gt;double-knot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometime in 2005 or 2006, I was working for a telecom company that was eventually &lt;a href="https://www.arkansasbusiness.com/article/windstream-completes-nuvox-purchase/"&gt;acquired by Windstream&lt;/a&gt;, supporting the Network Operations Center (NOC). A friend of mine, my manager at the time, noticed the clunky double-knots on my business-casual shoes and laughed, &lt;em&gt;"Are you two years old?"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was somewhat incensed. Looking around online, I discovered &lt;a href="https://www.fieggen.com/shoelace/index.htm"&gt;Ian's Shoelace Site&lt;/a&gt; and quickly learned &lt;a href="https://www.fieggen.com/shoelace/grannyknot.htm"&gt;I did not know how to tie my shoes&lt;/a&gt;. I was tying &lt;em&gt;&lt;strong&gt;granny knots&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Over the coming days, I reversed the direction of my starting knot and practiced. This was not &lt;a href="https://www.smartereveryday.com/backwardsbicycle"&gt;unlearning how to ride a bicycle&lt;/a&gt;. Before long my muscle memory could create a &lt;a href="https://www.fieggen.com/shoelace/standardknot.htm"&gt;proper shoelace knot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started running a few years later, and eventually landed on a pair of shoes with terrible laces. Every couple of miles I would have to re-tie one. Some small amount of shame, and the hassle of untying, kept me from revisiting the double-knot. Ian's knot site was still there, a decade later.&lt;/p&gt;
&lt;p&gt;Today I use the &lt;a href="https://www.fieggen.com/shoelace/betterbowknot.htm"&gt;Better Bow&lt;/a&gt; shoelace knot, almost exclusively.&lt;/p&gt;</content><category term="posts"/></entry><entry><title>Thruxton 1200 Heated Grips</title><link href="/2018/02/28/thruxton_heatedgrips.html" rel="alternate"/><published>2018-02-28T00:00:00-05:00</published><updated>2018-02-28T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2018-02-28:/2018/02/28/thruxton_heatedgrips.html</id><summary type="html">&lt;p&gt;I found some time to start the install for my Triumph heated grips. While the kit came with a harness, the Thruxton appeared to be pre-wired.&lt;/p&gt;
&lt;p&gt;&lt;img alt="will not fit" src="/assets/photos/thruxton/heatedgrips/wont_fit.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I really wanted to use the existing plugs, but there is just not enough slack to draw the plug back through the bars. If …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I found some time to start the install for my Triumph heated grips. While the kit came with a harness, the Thruxton appeared to be pre-wired.&lt;/p&gt;
&lt;p&gt;&lt;img alt="will not fit" src="/assets/photos/thruxton/heatedgrips/wont_fit.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I really wanted to use the existing plugs, but there is just not enough slack to draw the plug back through the bars. If I managed to connect the plugs &lt;em&gt;inside&lt;/em&gt; the bars, how difficult would removal be in the future? My guess is the factory harness is also used with other bikes. It makes no sense otherwise.&lt;/p&gt;
&lt;p&gt;I decided to undo the factory wiring harness for the left side, to explore my options. To understand why I needed more slack, here is the relevant bit from the instructions, which uses the harness provided with the kit:&lt;/p&gt;
&lt;p&gt;&lt;img alt="grip instructions" src="/assets/photos/thruxton/heatedgrips/heated_grip_instructions.png"&gt;&lt;/p&gt;
&lt;p&gt;This is inside the left-hand harness:&lt;/p&gt;
&lt;p&gt;&lt;img alt="inside left harness" src="/assets/photos/thruxton/heatedgrips/included_wiring.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Which juuuuuust gives enough slack:&lt;/p&gt;
&lt;p&gt;&lt;img alt="will thread" src="/assets/photos/thruxton/heatedgrips/will_thread.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I considered creating some extenders for the factory harness. The connectors are JST JWPF; 4-pin on the left, 2-pin on the right. But I worried about getting the extra plugs and wire to fit within the controls.&lt;/p&gt;
&lt;p&gt;Replacing the harness sheathing was harder than I expected. The "flexible" heat-shrink tubing I tried was far too stiff. I ended up ordering harness tubing from &lt;a href="https://www.cycleterminal.com/"&gt;cycleterminal.com&lt;/a&gt; which is thinner than OEM but worked well. To use the non-shrink tubing, I had to remove the plugs at the headlight end. This is how you remove pins from a JST JWPF connector:&lt;/p&gt;
&lt;p&gt;&lt;img alt="jst jwpf removal" src="/assets/photos/thruxton/heatedgrips/remove_blanks.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I was really concerned about the throttle-side wires getting cut; the hole provided by Triumph is sharp and others have reported having problems. I widened and smoothed the hole with my dremel and some 500-grit sandpaper. There seems to be no binding after install.&lt;/p&gt;
&lt;p&gt;&lt;img alt="smooth edges" src="/assets/photos/thruxton/heatedgrips/smoothed_edges.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I removed the extra left-side wiring and plug, but ignored the right-side... I didn't feel like cutting into a second harness.&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Recipe: King Cake</title><link href="/2018/02/11/king_cake.html" rel="alternate"/><published>2018-02-11T00:00:00-05:00</published><updated>2018-02-11T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2018-02-11:/2018/02/11/king_cake.html</id><summary type="html">&lt;ul&gt;
&lt;li&gt;Modified from &lt;a href="https://www.food.com/recipe/king-cake-90932"&gt;Genius Kitchen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ready In: 2hrs&lt;/li&gt;
&lt;li&gt;Yield: 1 cake&lt;/li&gt;
&lt;li&gt;Serves: 14&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;h3 id="dough"&gt;Dough&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 tablespoons butter&lt;/li&gt;
&lt;li&gt;8 ounce sour cream&lt;/li&gt;
&lt;li&gt;3 tablespoons sugar&lt;/li&gt;
&lt;li&gt;1⁄2 teaspoon salt&lt;/li&gt;
&lt;li&gt;1 (1/8 ounce) envelope active dry yeast&lt;/li&gt;
&lt;li&gt;1⁄2 tablespoon white sugar&lt;/li&gt;
&lt;li&gt;1⁄4 cup warm water (100 to 110 degrees …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;Modified from &lt;a href="https://www.food.com/recipe/king-cake-90932"&gt;Genius Kitchen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ready In: 2hrs&lt;/li&gt;
&lt;li&gt;Yield: 1 cake&lt;/li&gt;
&lt;li&gt;Serves: 14&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;h3 id="dough"&gt;Dough&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 tablespoons butter&lt;/li&gt;
&lt;li&gt;8 ounce sour cream&lt;/li&gt;
&lt;li&gt;3 tablespoons sugar&lt;/li&gt;
&lt;li&gt;1⁄2 teaspoon salt&lt;/li&gt;
&lt;li&gt;1 (1/8 ounce) envelope active dry yeast&lt;/li&gt;
&lt;li&gt;1⁄2 tablespoon white sugar&lt;/li&gt;
&lt;li&gt;1⁄4 cup warm water (100 to 110 degrees)&lt;/li&gt;
&lt;li&gt;1 egg&lt;/li&gt;
&lt;li&gt;3 1⁄4 cups all-purpose flour, divided&lt;/li&gt;
&lt;li&gt;3 tablespoons corn starch&lt;/li&gt;
&lt;li&gt;cinnamon&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="filling"&gt;Filling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;8 ounce package cream cheese&lt;/li&gt;
&lt;li&gt;1⁄2 egg (i.e. one egg yolk)&lt;/li&gt;
&lt;li&gt;6 tablespoons sugar&lt;/li&gt;
&lt;li&gt;1⁄16 teaspoon salt&lt;/li&gt;
&lt;li&gt;1 teaspoon vanilla extract&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="frosting"&gt;Frosting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 cups powdered sugar&lt;/li&gt;
&lt;li&gt;1 tablespoons butter, melted&lt;/li&gt;
&lt;li&gt;1 tablespoons milk&lt;/li&gt;
&lt;li&gt;1⁄8 teaspoon vanilla extract&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="colored-sugars"&gt;Colored Sugars&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3⁄4 cups white sugar&lt;/li&gt;
&lt;li&gt;1 drop green food coloring&lt;/li&gt;
&lt;li&gt;1 drop yellow food coloring&lt;/li&gt;
&lt;li&gt;1 drop red food coloring&lt;/li&gt;
&lt;li&gt;1 drop blue food coloring&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="directions"&gt;Directions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cook first 4 ingredients in a saucepan over low heat, stirring often, until butter melts; cool mixture to 100 degrees to 110 degrees.&lt;/li&gt;
&lt;li&gt;Dissolve yeast and 1/2 tablespoon sugar in 1/4 cup warm water in a large bowl; let stand 5 minutes; add butter mixture, egg, and 1 cup flour; beat at medium speed with an electric mixer 2 minutes or until smooth; gradually stir in enough remaining flour to make a soft dough.&lt;/li&gt;
&lt;li&gt;Turn dough onto a lightly floured surface; knead until smooth and elastic, about 10 minutes; place in a well-greased bowl, turning to grease top; cover and let rise in a warm place (85 degrees), free from drafts, 1 hour or until doubled in bulk.&lt;/li&gt;
&lt;li&gt;Using an electric mixer, mix cream cheese until smooth; add egg and blend well; add sugar, salt and vanilla and mix until smooth and creamy; set aside.&lt;/li&gt;
&lt;li&gt;Punch dough down; turn out onto a lightly floured surface; roll to a 28- x 10-inch rectangle; lightly sprinkle with cinnamon and sugar.&lt;/li&gt;
&lt;li&gt;Spread cream cheese mixture on dough; roll dough, jellyroll fashion, starting at long side; place dough roll, seam side down, on a lightly greased baking sheet; bring ends together to form an oval ring, moistening and punching edges together to seal.&lt;/li&gt;
&lt;li&gt;Cover and let rise in a warm place, free from drafts, 20 minutes or until doubled in bulk.&lt;/li&gt;
&lt;li&gt;Bake at 375 degrees for 15 minutes or until golden.&lt;/li&gt;
&lt;li&gt;Drizzle frostings and sprinkle with colored sugars.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="frosting_1"&gt;Frosting&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Stir together powdered sugar and melted butter.&lt;/li&gt;
&lt;li&gt;Add milk to reach desired consistency for drizzling; stir in vanilla.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="colored-sugars_1"&gt;Colored Sugars&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Place 1/4 cup sugar and drop of green food coloring in a zip-top plastic bag; seal, shake, and squeeze vigorously to evenly mix color with sugar.&lt;/li&gt;
&lt;li&gt;Repeat procedure with 1/4 cup sugar and yellow food coloring; For purple, combine 1 drop red and 1 drop blue food coloring before adding to remaining 1/4 cup sugar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cut recipe in half (original made 2 cakes)&lt;/li&gt;
&lt;li&gt;Changes made based on a number of reviews&lt;ul&gt;
&lt;li&gt;Reduced the amount of frosting by 33%&lt;/li&gt;
&lt;li&gt;Right before adding the filling, lightly sprinkle cinnamon and sugar on the rolled out dough&lt;/li&gt;
&lt;li&gt;Add 1 tablespoon cornstarch to each cup of flour in order to make "cake" flour&lt;/li&gt;
&lt;li&gt;McCormick food coloring is muddy when you mix red and blue, so you might consider buying Wilton for the purple. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="food"/></entry><entry><title>Recipe : Mulligatawny Soup</title><link href="/2018/01/07/mulligatawny.html" rel="alternate"/><published>2018-01-07T00:00:00-05:00</published><updated>2018-01-07T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2018-01-07:/2018/01/07/mulligatawny.html</id><summary type="html">&lt;ul&gt;
&lt;li&gt;Lifted from &lt;a href="https://allrecipes.com/recipe/13087/mulligatawny-soup-i/"&gt;Allrecipes.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yield: 12 servings&lt;/li&gt;
&lt;li&gt;Active Time: 20 minutes&lt;/li&gt;
&lt;li&gt;Total Time: 2 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 cup chopped onion&lt;/li&gt;
&lt;li&gt;4 stalks celery, chopped&lt;/li&gt;
&lt;li&gt;2 carrot, diced&lt;/li&gt;
&lt;li&gt;1/2 cup butter&lt;/li&gt;
&lt;li&gt;3 tablespoons all-purpose flour&lt;/li&gt;
&lt;li&gt;3 teaspoons curry powder&lt;/li&gt;
&lt;li&gt;8 cups chicken broth&lt;/li&gt;
&lt;li&gt;1 apple, cored and chopped&lt;/li&gt;
&lt;li&gt;1/2 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;Lifted from &lt;a href="https://allrecipes.com/recipe/13087/mulligatawny-soup-i/"&gt;Allrecipes.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yield: 12 servings&lt;/li&gt;
&lt;li&gt;Active Time: 20 minutes&lt;/li&gt;
&lt;li&gt;Total Time: 2 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 cup chopped onion&lt;/li&gt;
&lt;li&gt;4 stalks celery, chopped&lt;/li&gt;
&lt;li&gt;2 carrot, diced&lt;/li&gt;
&lt;li&gt;1/2 cup butter&lt;/li&gt;
&lt;li&gt;3 tablespoons all-purpose flour&lt;/li&gt;
&lt;li&gt;3 teaspoons curry powder&lt;/li&gt;
&lt;li&gt;8 cups chicken broth&lt;/li&gt;
&lt;li&gt;1 apple, cored and chopped&lt;/li&gt;
&lt;li&gt;1/2 cup white rice&lt;/li&gt;
&lt;li&gt;1.5 pound cooked chicken - cut into cubes&lt;/li&gt;
&lt;li&gt;1 cup heavy cream, heated&lt;/li&gt;
&lt;li&gt;1/4 teaspoon dried thyme&lt;/li&gt;
&lt;li&gt;salt and pepper to taste&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instructions"&gt;Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Sauté onions, celery, carrot, and butter in a large soup pot.&lt;/li&gt;
&lt;li&gt;Add flour and curry, and cook 5 more minutes.&lt;/li&gt;
&lt;li&gt;Add chicken stock, mix well, and bring to a boil. Simmer. 30 minutes.&lt;/li&gt;
&lt;li&gt;Add apple, rice, salt, pepper, and thyme. Simmer 15 minutes.&lt;/li&gt;
&lt;li&gt;Add chicken and simmer until rice is done.&lt;/li&gt;
&lt;li&gt;Add hot cream and serve.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Served with fresh multigrain bread. Girls enjoyed, each ate at least one cup. Used homemade chicken stock containing 1 tsp salt/quart. Used 1 tsp ground black pepper; just a hint of heat.&lt;/li&gt;
&lt;li&gt;Look at &lt;a href="https://www.theharvestkitchen.com/vegan-mulligatawny-soup/"&gt;chicken-less versions&lt;/a&gt; - maybe chickpeas, and/or substitute rice with lentils and quinoa&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="food"/></entry><entry><title>Resource Owner Flow with IdentityServer3</title><link href="/2017/01/03/resource_owner_idsrv3.html" rel="alternate"/><published>2017-01-03T00:00:00-05:00</published><updated>2017-01-03T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2017-01-03:/2017/01/03/resource_owner_idsrv3.html</id><summary type="html">&lt;p&gt;There are a few situations where a robust authorization solution, such as a &lt;a href="https://leastprivilege.com/2014/10/10/openid-connect-hybrid-flow-and-identityserver-v3/"&gt;hybrid flow with OpenID Connect&lt;/a&gt;, might not be the best fit for your application. You may have a requirement that a user is never redirected away from the application. You may need to move a legacy application …&lt;/p&gt;</summary><content type="html">&lt;p&gt;There are a few situations where a robust authorization solution, such as a &lt;a href="https://leastprivilege.com/2014/10/10/openid-connect-hybrid-flow-and-identityserver-v3/"&gt;hybrid flow with OpenID Connect&lt;/a&gt;, might not be the best fit for your application. You may have a requirement that a user is never redirected away from the application. You may need to move a legacy application away from HTTP Basic or Digest authentication. The &lt;a href="https://tools.ietf.org/html/rfc6749#section-1.3.3"&gt;resource owner password credentials&lt;/a&gt; flow provides a way for an application to authorize against, and receive an access token from, an OAuth2 server.&lt;/p&gt;
&lt;p&gt;For this walk-through, we will use &lt;a href="https://github.com/IdentityServer/IdentityServer3"&gt;IdentityServer3&lt;/a&gt;. IdentityServer3 has become one of our favorite tools for providing authentication through OpenID Connect and can provide authorization through OAuth2. The IdentityServer team provides a number of tremendous samples, including a handful of &lt;a href="https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/ConsoleResourceOwnerClient"&gt;applications showing resource owner flow&lt;/a&gt;. This guide will build upon those and create a basic ASP.NET MVC 5 web application with login and logout functionality and a secured example page.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article first appeared as part of &lt;a href="hhttps://www.workstate.com/blog/workstate-codes-oauth2-resource-owner-flow-with-identityserver3"&gt;Workstate Codes&lt;/a&gt;. If you are interested in how Workstate can help you with your custom IAM needs, &lt;a href="https://www.workstate.com/blog/enterprise-identity-and-access-management-at-workstate"&gt;reach out today&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="caveats"&gt;Caveats&lt;/h3&gt;
&lt;p&gt;Before going further, some limitations must be made clear.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resource owner flow only works for a trusted app; that is, an application that can be trusted to securely handle user credentials.&lt;/li&gt;
&lt;li&gt;Resource owner flow cannot be used for single sign-on (SSO). Each application should provide its own login page.&lt;/li&gt;
&lt;li&gt;Authorization through OAuth2 should not imply authentication; no identity information is provided in the token response. Some documentation or syntax may be confusing or ambiguous, especially around IdentityModel and OWIN.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, resource owner flow is a perfectly valid solution where your requirements align and OAuth2 is sufficient.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;The following software versions were used in the creation of this guide.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 Pro&lt;/li&gt;
&lt;li&gt;Visual Studio Pro 2015 Update 3&lt;/li&gt;
&lt;li&gt;IdentityServer3 2.5.0&lt;/li&gt;
&lt;li&gt;IdentityModel 1.9.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="identity-server"&gt;Identity Server&lt;/h3&gt;
&lt;p&gt;Create a new Visual Studio solution. Add the &lt;strong&gt;Self-Host (Minimal)&lt;/strong&gt; project from the &lt;a href="https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/SelfHost%20(Minimal)"&gt;identityserver3 samples&lt;/a&gt;. You will also need to add (and reference) the &lt;strong&gt;Constants&lt;/strong&gt; project available from the &lt;a href="https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/Constants"&gt;client samples&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As we need to run the identity server over a secure connection, we need an SSL certificate on localhost. To create a self-signed certificate with Powershell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="nb"&gt;New-SelfSignedCertificate&lt;/span&gt; &lt;span class="n"&gt;-dnsname&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-certstorelocation&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cert:\localmachine\my&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The new certificate will appear in &lt;code&gt;Certificates (Local Computer)\Personal\Certificates&lt;/code&gt;. Copy this new certificate into your trusted root certification authorities. Your web browser(s) will no longer complain about an invalid certificate, and we can securely request tokens without modifying &lt;code&gt;Constants.BaseAddress&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Debug the solution and visit &lt;a href="https://localhost:44333/core/.well-known/openid-configuration"&gt;https://localhost:44333/core/.well-known/openid-configuration&lt;/a&gt; to view the configuration.&lt;/p&gt;
&lt;p&gt;&lt;img alt="openid_configuration" src="/assets/photos/workstate_codes/localhost_openid_configuration.png"&gt;&lt;/p&gt;
&lt;h3 id="mvc-web-application"&gt;MVC Web Application&lt;/h3&gt;
&lt;p&gt;Create a new ASP.NET Web Application (4.5.x) and select the MVC template; set authentication to &lt;strong&gt;No Authentication&lt;/strong&gt;. Add a reference to the &lt;strong&gt;Constants&lt;/strong&gt; project. Don't worry about configuring SSL for now.&lt;/p&gt;
&lt;p&gt;Add the following packages via NuGet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft.Owin.Security.Cookies&lt;/li&gt;
&lt;li&gt;Microsoft.Owin.Host.SystemWeb&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a new class &lt;strong&gt;Startup.cs&lt;/strong&gt;. Before the namespace, insert the following attribute&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;[assembly: OwinStartup(typeof(MVCResourceOwnerFlow.Startup))]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This attribute instructs the application to execute the &lt;strong&gt;Startup&lt;/strong&gt; configuration with each run.&lt;/p&gt;
&lt;p&gt;If you run into an error when loading the application &lt;em&gt;"OwinStartup attribute... conflicts with the attribute in assembly... because they have the same FriendlyName"&lt;/em&gt;, you will need to provide a unique OWIN startup name according to &lt;a href="https://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection"&gt;Microsoft's documentation&lt;/a&gt;. Make sure you include the matchingappSettings value in your web.config.&lt;/p&gt;
&lt;p&gt;Create a Configuration() method in the Startup class. Note the LoginPathproperty; this is the path where users will be redirected when they are not authorized for a specific action.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Startup&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IAppBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;AntiForgeryConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniqueClaimTypeIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseCookieAuthentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CookieAuthenticationOptions&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;LoginPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PathString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/account/login&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AuthenticationType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Cookies&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Make copies of &lt;code&gt;Config\Certificate.cs&lt;/code&gt; and &lt;code&gt;Config\idsrv3test.pfx&lt;/code&gt; from the &lt;strong&gt;SelfHost&lt;/strong&gt; project and change the namespace and the GetManifestResourceStream parameter to match the new locations in the MVC project.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MVCResourceOwnerFlow&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;internal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Certificate&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;X509Certificate2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Certificate&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;MVCResourceOwnerFlow.idsrv3test.pfx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;X509Certificate2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReadStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;idsrv3test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="login-page"&gt;Login Page&lt;/h3&gt;
&lt;p&gt;Create a basic login view model,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MVCResourceOwnerFlow.Models&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;LoginViewModel&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and a simple login page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;@model MVCResourceOwnerFlow.Models.LoginViewModel
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;row&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;col-md-4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Log In&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    @using (Html.BeginForm(&amp;quot;Login&amp;quot;, &amp;quot;Account&amp;quot;, FormMethod.Post))
    {
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;form-group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            @Html.LabelFor(m =&amp;gt; m.Username)
            @Html.TextBoxFor(m =&amp;gt; m.Username, new { @class = &amp;quot;form-control&amp;quot; })
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;form-group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            @Html.LabelFor(m =&amp;gt; m.Password)
            @Html.PasswordFor(m =&amp;gt; m.Password, new { @class = &amp;quot;form-control&amp;quot; })
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        @Html.AntiForgeryToken()
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;btn btn-primary&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    }
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="claims-page"&gt;Claims Page&lt;/h3&gt;
&lt;p&gt;Create a claims view model. This will allow us to view the claims sent with the access token.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MVCResourceOwnerFlow.Models&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;ClaimsViewModel&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IsAuthenticated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;KeyValuePair&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ClaimsViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ClaimsViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;KeyValuePair&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Modify the Home controller to include an &lt;code&gt;Identity&lt;/code&gt; action. The &lt;code&gt;[Authorize]&lt;/code&gt;attribute secures this action. The user will be redirected to the aforementioned &lt;code&gt;LoginPath&lt;/code&gt; if not authorized.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;[Authorize]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Identity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;View&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetClaimsViewModel&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ClaimsViewModel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;GetClaimsViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ClaimsIdentity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ClaimsViewModel&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Claims for Authorized User&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;The following claims have been retrieved from the Identity Server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KeyValuePair&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;IsAuthenticated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsAuthenticated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="create-a-simple-page-to-view-our-claims"&gt;Create a simple page to view our claims.&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;@model MVCResourceOwnerFlow.Models.ClaimsViewModel
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Model.Header&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Model.Message&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;width: 90%; word-wrap: break-word; margin-bottom: 50px;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
@if (Model.IsAuthenticated || Model.Claims != null)
{
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    @foreach (var claim in Model.Claims ?? new List&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;KeyValuePair&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&amp;gt;())
    {
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@claim.Key&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@claim.Value&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    }
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
}
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="authorization-controller"&gt;Authorization Controller&lt;/h3&gt;
&lt;p&gt;Now we get to the meat of our solution. Create a new controller.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.IdentityModel.Tokens&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Security.Claims&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Threading.Tasks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Web&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Web.Mvc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;IdentityModel.Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;Microsoft.Owin.Security.Jwt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MVCResourceOwnerFlow.Models&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;Sample&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MVCResourceOwnerFlow.Controllers&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;AccountController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Controller&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[HttpGet]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[AllowAnonymous]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LoginViewModel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;View&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[HttpPost]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[AllowAnonymous]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[ValidateAntiForgeryToken]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LoginViewModel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;returnUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;TokenResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;SignInAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;RedirectToAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TokenResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TokenClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenEndpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ro.client&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;secret&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestResourceOwnerPasswordAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;read write&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;SignInAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TokenResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ValidateIdentityTokenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ClaimsIdentity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Cookies&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddClaim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Claim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;access_token&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddClaim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Claim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expires&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExpiresIn&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;ToLocalTime&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetOwinContext&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Claim&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ValidateIdentityTokenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TokenResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Claim&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;JwtSecurityTokenHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tokenHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JwtSecurityTokenHandler&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Certificate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;validationParameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;ValidAudience&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/resources&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ValidIssuer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;NameClaimType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;IssuerSigningTokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;X509CertificateSecurityTokenProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;SecurityTokens&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;SecurityToken&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;ClaimsPrincipal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tokenHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ValidateToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;validationParameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claimList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claimList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;[HttpGet]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;LogOff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetOwinContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignOut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Cookies&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;RedirectToAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;code&gt;GetToken()&lt;/code&gt; uses the sample resource owner client ("ro.client"). Compared to the &lt;a href="https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/ConsoleResourceOwnerClient"&gt;sample console client&lt;/a&gt;, we perform certificate validation; &lt;code&gt;ValidateIdentityTokenAsync()&lt;/code&gt; validates the token and returns a set of Claims that can be consumed by the &lt;code&gt;Request.GetOwinContext().Authentication&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;Finally, modify the layout view to include links for our new actions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;Home&amp;quot;, &amp;quot;Index&amp;quot;, &amp;quot;Home&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
@if (Request.IsAuthenticated)
{
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;Log Out&amp;quot;, &amp;quot;Logoff&amp;quot;, &amp;quot;Account&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
}
else
{
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;Log In&amp;quot;, &amp;quot;Login&amp;quot;, &amp;quot;Account&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
}
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;Identity&amp;quot;, &amp;quot;Identity&amp;quot;, &amp;quot;Home&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;About&amp;quot;, &amp;quot;About&amp;quot;, &amp;quot;Home&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(&amp;quot;Contact&amp;quot;, &amp;quot;Contact&amp;quot;, &amp;quot;Home&amp;quot;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="run-the-application"&gt;Run the Application&lt;/h3&gt;
&lt;p&gt;Walk through the login, identity and logout actions. Note when not logged in, if the user visits the claims (Identity) page, they are redirected to login.&lt;/p&gt;
&lt;p&gt;&lt;img alt="localhost_identity" src="/assets/photos/workstate_codes/localhost_identity.png"&gt;&lt;/p&gt;
&lt;h3 id="whats-next"&gt;What's Next?&lt;/h3&gt;
&lt;p&gt;Now that the MVC application has a valid access token, we can make calls to a secured API resource. A good one to start with would be the &lt;a href="https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/SampleAspNetWebApi"&gt;IdentityServer3 sample API&lt;/a&gt;.&lt;/p&gt;</content><category term="posts"/><category term="code"/></entry><entry><title>Pass Client Data to IdentityServer3 Views</title><link href="/2016/12/15/identityserver3_client_data.html" rel="alternate"/><published>2016-12-15T00:00:00-05:00</published><updated>2016-12-15T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2016-12-15:/2016/12/15/identityserver3_client_data.html</id><summary type="html">&lt;p&gt;IdentityServer3 provides a simple web interface for the necessary and common authentication dialogs, such as Login, Permissions Consent, and Logout Confirmation. When an application requires customization for these pages,a couple of options are provided to control output. In particular, a custom View Service provides great power and flexibility to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;IdentityServer3 provides a simple web interface for the necessary and common authentication dialogs, such as Login, Permissions Consent, and Logout Confirmation. When an application requires customization for these pages,a couple of options are provided to control output. In particular, a custom View Service provides great power and flexibility to generate custom login pages that meet a variety of requirements.&lt;/p&gt;
&lt;p&gt;What if these authentication prompts require data from the client application? Perhaps branding needs to change based on user geolocation data, or a Login page needs to display the message of the day. The good news is that passing data into your authentication server is entirely possible, with a little bit of work.&lt;/p&gt;
&lt;h3 id="passing-values"&gt;Passing Values&lt;/h3&gt;
&lt;p&gt;You might expect that you could use IdentityServer's request model to pass in custom details, but unfortunately that isn't supported out of the box. Luckily, the documentation offers us the acr_values parameter. This parameter covers the optional Authentication Context Class Reference values (ProtocolMessage.AcrValues) defined as part of OpenID Connect.&lt;/p&gt;
&lt;p&gt;According to the specification, values should be part of a space-separated string. Two values (idp and tenant) have special meaning for IdentityServer3, but others can be created at will. We pass each value as a URL-encoded key-value pair.&lt;/p&gt;
&lt;p&gt;In the following example, we'll pass the application's version number, so it can be displayed on the login screen to the client.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Notifications&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OpenIdConnectAuthenticationNotifications&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;RedirectToIdentityProvider&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProtocolMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OpenIdConnectRequestType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProtocolMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AcrValues&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; ipAddress:&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UrlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Consuming these values on the Identity Server views will require a custom View Service in addition to a custom User Service.&lt;/p&gt;
&lt;h3 id="login-view"&gt;Login View&lt;/h3&gt;
&lt;p&gt;The ViewService Login() method receives both a &lt;em&gt;LoginViewModel&lt;/em&gt; and a &lt;em&gt;SignInMessage&lt;/em&gt;. The ACR values have already been split into a collection SignInMessage.AcrValues. We can now retrieve the value and add it to the view model.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;acrValues&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AcrValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UrlDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acrValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="other-views"&gt;Other Views&lt;/h3&gt;
&lt;p&gt;No other ViewService method receives ACR values directly. However we can access the claims for the current user by reaching into the OWIN context, even from the LoggedOut method. To create and populate claims for these values, we need a custom UserService. Within the AuthenticateLocalAsync() method, after authentication is successful, we will grab the values and add them as a custom claim.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;acrValues&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignInMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AcrValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UrlDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acrValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Claim with a NULL value will throw an exception&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Claim&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Claim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticateResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AuthenticateResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The ViewService methods can now pull these claims from the OWIN context. Note: This method does not work for Login() because the user is not yet authenticated.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetOwinContext&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ipAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ipAddress&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="alternative-solutions"&gt;Alternative Solutions&lt;/h3&gt;
&lt;p&gt;The acr_values solution is very handy, but limited. Passing large amounts of data or sensitive information is not recommended and in these cases, alternatives should be explored. A few possible solutions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a custom API using Web API or any other modern framework, and call your endpoint directly from JavaScript on page load.&lt;/li&gt;
&lt;li&gt;Bypass the IdentityServer views entirely, instead, leveraging views on the client application. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;This article first appeared as part of &lt;a href="https://www.workstate.com/blog/workstate-codes-how-to-pass-client-data-to-identityserver3-views"&gt;Workstate Codes&lt;/a&gt;. If you are interested in how Workstate can help you with your custom IAM needs, &lt;a href="https://www.workstate.com/blog/enterprise-identity-and-access-management-at-workstate"&gt;reach out today&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content><category term="posts"/><category term="code"/></entry><entry><title>Minecraft Server on Mac OS X</title><link href="/2016/11/26/minecraft-mac-os-x.html" rel="alternate"/><published>2016-11-26T23:39:00-05:00</published><updated>2016-11-26T23:39:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2016-11-26:/2016/11/26/minecraft-mac-os-x.html</id><summary type="html">&lt;p&gt;10.10 El Capitan&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install homebrew&lt;/li&gt;
&lt;li&gt;Install Cask &lt;code&gt;brew install caskroom/cask/brew-cask&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install Java using Cask &lt;code&gt;brew cask install java&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run the regular Minecraft launcher&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;This installs the latest version of Java 8, and does a little magic for Java 6 app compatibility.&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set the server machine to a …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;10.10 El Capitan&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install homebrew&lt;/li&gt;
&lt;li&gt;Install Cask &lt;code&gt;brew install caskroom/cask/brew-cask&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install Java using Cask &lt;code&gt;brew cask install java&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run the regular Minecraft launcher&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;This installs the latest version of Java 8, and does a little magic for Java 6 app compatibility.&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set the server machine to a fixed ip address&lt;/li&gt;
&lt;li&gt;Note what port the Minecraft Server starts as&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Direct Connect&lt;/strong&gt; example: 192.168.0.102:25565&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="skins"&gt;Skins&lt;/h2&gt;
&lt;p&gt;Just load them against the Minecraft.net account&lt;/p&gt;
&lt;h2 id="operators"&gt;Operators&lt;/h2&gt;
&lt;p&gt;From the server window just type 'op username' and the ops.json file will get updated automatically.&lt;/p&gt;
&lt;h3 id="manually"&gt;Manually&lt;/h3&gt;
&lt;p&gt;Edit ops.json in a text editor; you can get the UUID from the server window when the user logs in.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[
  {
    &amp;quot;uuid&amp;quot;: &amp;quot;54d61e19-71cc-477d-8215-8a11c41f5211&amp;quot;,
    &amp;quot;name&amp;quot;: &amp;quot;someguy&amp;quot;,
    &amp;quot;level&amp;quot;: 4
  }
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="server-properties"&gt;Server Properties&lt;/h2&gt;
&lt;h3 id="max-world-size"&gt;max-world-size&lt;/h3&gt;
&lt;p&gt;This is a "radius" and defaults to 29999984. Here are some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1000 - 2000x2000 world border&lt;/li&gt;
&lt;li&gt;4000 - 8000x8000 world border&lt;/li&gt;
&lt;li&gt;432 - Xbox 360 - 864×864 blocks&lt;/li&gt;
&lt;li&gt;2560 - Xbox One - 5120x5120 blocks&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="ops"/><category term="gaming"/></entry><entry><title>Beer Recipe : Amarillo India Pale Ale</title><link href="/2016/11/15/amarillo_pale_ale.html" rel="alternate"/><published>2016-11-15T00:00:00-05:00</published><updated>2016-11-15T00:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2016-11-15:/2016/11/15/amarillo_pale_ale.html</id><summary type="html">&lt;p&gt;Adapted from &lt;a href="https://www.homebrewersassociation.org/homebrew-recipe/amarillo-pale-ale/"&gt;Amarillo Pale Ale - Gold Metal American Ale&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.054 (75% eff, 5.5 gallon)&lt;/li&gt;
&lt;li&gt;Target FG 1.012 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 5.51%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water, plus &lt;strong&gt;4 gallons&lt;/strong&gt; for sparging&lt;/li&gt;
&lt;li&gt;4.25 lb Pilsner Malt&lt;/li&gt;
&lt;li&gt;3.5 lb 6-Row …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Adapted from &lt;a href="https://www.homebrewersassociation.org/homebrew-recipe/amarillo-pale-ale/"&gt;Amarillo Pale Ale - Gold Metal American Ale&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.054 (75% eff, 5.5 gallon)&lt;/li&gt;
&lt;li&gt;Target FG 1.012 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 5.51%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water, plus &lt;strong&gt;4 gallons&lt;/strong&gt; for sparging&lt;/li&gt;
&lt;li&gt;4.25 lb Pilsner Malt&lt;/li&gt;
&lt;li&gt;3.5 lb 6-Row Pale Malt&lt;/li&gt;
&lt;li&gt;0.5 Vienna Malt&lt;/li&gt;
&lt;li&gt;0.5 Bonlander or Munich Malt&lt;/li&gt;
&lt;li&gt;0.5 Victory or Biscuit Malt&lt;/li&gt;
&lt;li&gt;0.5 Wheat Malt&lt;/li&gt;
&lt;li&gt;5 oz Amarillo (~9.6 Alpha Acids)&lt;/li&gt;
&lt;li&gt;1 packet Safale US-05&lt;/li&gt;
&lt;li&gt;5 oz sucrose (table sugar)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mash"&gt;Mash&lt;/h2&gt;
&lt;p&gt;Mash for &lt;strong&gt;60 minutes&lt;/strong&gt;. Keep mash as close to &lt;strong&gt;153&lt;/strong&gt; °F as possible, keeping the grains between 149 °F and 155 °F.&lt;/p&gt;
&lt;h2 id="boil"&gt;Boil&lt;/h2&gt;
&lt;p&gt;Boil for &lt;strong&gt;60 minutes&lt;/strong&gt;, skimming early and often to prevent boil-over..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 oz Amarillo (1st wort - add to first runnings)&lt;/li&gt;
&lt;li&gt;2 oz Amarillo (60 min)&lt;/li&gt;
&lt;li&gt;1 Whirlfloc tab (10 min)&lt;/li&gt;
&lt;li&gt;1 oz Amarillo (0 min - flameout)&lt;/li&gt;
&lt;li&gt;1 oz Amarillo (dry hop)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ferment"&gt;Ferment&lt;/h2&gt;
&lt;p&gt;Leave in a near-room-temperature location (65 °F to 70 °F).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primary fermentation for 7 days&lt;/li&gt;
&lt;li&gt;Secondary fermentation for 4 days&lt;/li&gt;
&lt;li&gt;Dry-hop remaining 1 oz Amarillo in secondary for 10 days&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bottle"&gt;Bottle&lt;/h2&gt;
&lt;p&gt;Combine the priming sugar with 1 cup filtered water, heating and stirring gently to combine. Rack from fermentor into cooled (70 °F) mixture.&lt;/p&gt;
&lt;p&gt;Using the Northern Brewer &lt;a href="https://www.northernbrewer.com/pages/priming-sugar-calculator"&gt;Priming Sugar Calculator&lt;/a&gt;; estimated with 4.5 gallons of beer with a pre-cold-crash temperature of 68 °F we get &lt;strong&gt;2.8vols&lt;/strong&gt; with &lt;strong&gt;121g (4.28oz) of table sugar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bottle condition three (3) weeks near room temperature (68 °F to 70 °F). After three (3) weeks, store cooler if possible. Refrigerate at least 48 hours before drinking, preferably one or two weeks.&lt;/p&gt;
&lt;h2 id="log"&gt;Log&lt;/h2&gt;
&lt;h3 id="batch-039"&gt;Batch #039&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2017-DEC-31: Ambient temperature 50F. Calculated strike temperature to 165F and HLT water to 173F; 175F into mash tun; 165F after 10 minutes (lid on); 151F five (5) minutes after mash-in; pH 5.2; measured 149.5F after 60 minutes. Multiplied Amarillo hops amounts by 1.5 to account for age and slightly lower AA than recipe. Placed 75.5F wort into stainless bucket with US-05.&lt;/li&gt;
&lt;li&gt;2018-JAN-15: Racked to secondary, dry-hopped remaining 1oz Amarillo and 1oz Citra; moved from man-cave (52F) to office closet (60F).&lt;/li&gt;
&lt;li&gt;2018-JAN-28: 4.5 gallon in fermentor; bottled 4 gallons @63.6F with 104g (3.86oz) of Zulka Morena in 3/4 cup water, target 2.8 vols.&lt;/li&gt;
&lt;li&gt;2018-FEB-13: Bottled with 115g &lt;a href="https://zulka.com/our-sugars/"&gt;Zulka Morena&lt;/a&gt; sugar&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="beer"/></entry><entry><title>Beer Recipe : Saaz Session Pale Ale</title><link href="/2015/04/03/saaz_session_pale_ale.html" rel="alternate"/><published>2015-04-03T00:00:00-04:00</published><updated>2015-04-03T00:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2015-04-03:/2015/04/03/saaz_session_pale_ale.html</id><summary type="html">&lt;p&gt;Adapted from &lt;a href="https://www.homebrewtalk.com/showthread.php?t=31793"&gt;Bee Cave Brewery Haus Pale Ale&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.051 (75% eff, 5.5 gallon)&lt;/li&gt;
&lt;li&gt;Target FG 1.011 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 5.25%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water, plus &lt;strong&gt;4 gallons + 1 cup&lt;/strong&gt; for sparging&lt;/li&gt;
&lt;li&gt;8 lb Pale Malt (2 Row) US (2 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Adapted from &lt;a href="https://www.homebrewtalk.com/showthread.php?t=31793"&gt;Bee Cave Brewery Haus Pale Ale&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.051 (75% eff, 5.5 gallon)&lt;/li&gt;
&lt;li&gt;Target FG 1.011 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 5.25%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water, plus &lt;strong&gt;4 gallons + 1 cup&lt;/strong&gt; for sparging&lt;/li&gt;
&lt;li&gt;8 lb Pale Malt (2 Row) US (2.0 SRM)&lt;/li&gt;
&lt;li&gt;2 lb Vienna Malt (3.5 SRM)&lt;/li&gt;
&lt;li&gt;0.50 lb Caramel/Crystal Malt - 10L (10.0 SRM)&lt;/li&gt;
&lt;li&gt;2 oz Saaz (~4% Alpha Acids)&lt;/li&gt;
&lt;li&gt;1 packet Nottingham (Danstar) or Safale S-04&lt;/li&gt;
&lt;li&gt;5 oz sucrose (table sugar)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mash"&gt;Mash&lt;/h2&gt;
&lt;p&gt;Mash for &lt;strong&gt;60 minutes&lt;/strong&gt;. Keep mash as close to &lt;strong&gt;152&lt;/strong&gt; °F as possible, keeping the grains between 148 °F and 154 °F.&lt;/p&gt;
&lt;h2 id="boil"&gt;Boil&lt;/h2&gt;
&lt;p&gt;Boil for &lt;strong&gt;60 minutes&lt;/strong&gt;, skimming early and often to prevent boil-over..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.0 oz Saaz (60 min)&lt;/li&gt;
&lt;li&gt;0.5 oz Saaz (30 min)&lt;/li&gt;
&lt;li&gt;0.25 oz Saaz (15 min)&lt;/li&gt;
&lt;li&gt;1 Whirlfloc tab (10 min)&lt;/li&gt;
&lt;li&gt;0.25 oz Saaz (5 min)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ferment"&gt;Ferment&lt;/h2&gt;
&lt;p&gt;Leave in a near-room-temperature location (65 °F to 70 °F). The solution will begin to bubble as the yeast activates, pushing gas through the tube.&lt;/p&gt;
&lt;h2 id="bottle"&gt;Bottle&lt;/h2&gt;
&lt;p&gt;Combine the priming sugar with 1 cup filtered water, heating and stirring gently to combine. Rack from fermenter into cooled (70 °F) mixture.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using the Northern Brewer &lt;a href="https://www.northernbrewer.com/pages/priming-sugar-calculator"&gt;Priming Sugar Calculator&lt;/a&gt; with 5 gallons of beer with a pre-cold-crash temperature of 68 °F we get &lt;strong&gt;2.9vols&lt;/strong&gt; with &lt;strong&gt;142g (5oz) of table sugar&lt;/strong&gt;. This is according to more sources &lt;em&gt;higher&lt;/em&gt; than typical for a pale ale, but I &lt;em&gt;like&lt;/em&gt; it more..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bottle condition three (3) weeks near room temperature (68 °F to 70 °F). After three (3) weeks, store cooler if possible. Refrigerate at least 48 hours before drinking, preferably one or two weeks.&lt;/p&gt;
&lt;h2 id="log"&gt;Log&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2015-APR-03: Adapted; swapped out Cascade with Saaz&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-038"&gt;Batch #038&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2017-MAR-26: First monster-mill crush, set to 38 mil; used 2/3 store-bought bulk drinking water, 1/3 kitchen-filtered tap. Math says strike water 164.1F; 4 gallons HLT water to 172.5F; into tun plus 10 minutes (lid on) was 161.2F; stirred heat stick until 164.3; mash-in plus 5 minutes = 152F, measured pH 5.35 adjusted; end of mash was maybe too low (~147)F; fermenter at 1.045 (corrected); pitched with Safale S-04. Recipe was &lt;em&gt;wrong&lt;/em&gt; and had an extra 5 cups of sparge water, which would explain lower efficiency for the first two batches. Will also try to set the monster mill down to 30-35 mil next time. Also note that the Saaz was only 2.5 AA so this will be very low IBU.&lt;/li&gt;
&lt;li&gt;2017-APR-12: Racked to secondary.&lt;/li&gt;
&lt;li&gt;2017-APR-29: Bottled with 142g of Zulka and 1 cup of water. 51 bottles. Calculated ABV 4.75%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-032"&gt;Batch #032&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2016-MAY-15: &lt;strong&gt;April Session Pale Ale&lt;/strong&gt;; used half a pound of Victory malt instead of Crystal 10L; using to collect hop remnants; strike water 165F calculated; 4 gallons HLT water to 170F; add to tun 163.5F; after 5 minutes (lid on) was 162.1F; mash-in down to 149.8F; 147.8F after 60 minutes; pitched with Nottingham about 5.5 gallons at 1.056 (corrected)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hop Remnants&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0.28 Chinook - Dual-purpose; spicy, heavy, piney (good for pale ale and imperial pale ale)&lt;/li&gt;
&lt;li&gt;0.4 Amarillo - Dual-purpose; grapefruit and orange&lt;/li&gt;
&lt;li&gt;1.0 Centennial - Dual-purpose; stronger than but similar to Cascade (good for pale ale and imperial pale ale)&lt;/li&gt;
&lt;li&gt;0.32 Mount Hood - Aroma; spicy, rich and fresh (good for light lager, bock, and hefeweizen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Boil Additions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;60 min: 0.28 oz Chinook (11.8% AA) + 0.2 oz Amarillo (8.8% AA) + 0.5 oz Centennial (10.2% AA)&lt;/li&gt;
&lt;li&gt;30 min: 0.5 oz Centennial &lt;/li&gt;
&lt;li&gt;15 min: 0.2 oz Amarillo&lt;/li&gt;
&lt;li&gt;10 min: Whirlfloc&lt;/li&gt;
&lt;li&gt;5 min: 0.32 oz Mount Hood (5.6% AA)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;Hoppier, maybe heavier (from the Victory?) not as good as original Saaz recipe&lt;/p&gt;
&lt;h3 id="batch-027"&gt;Batch #027&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2015-MAY-30: First garage brew; still used kitchen water. Followed recipe about as well as can be expected; strike water 165F calculated; 4 gallons HLT water to 172.5F; into tun at 166.6F; after 5 minutes (lid on) was 165F;  mash-in down to 154.4F; decided was too high; lid off measuring every 5 minutes; 152.6F after 20 minutes; end of mash 148F; garage breaker popped with both sticks on, so boil itself took forever to start; almost exactly 5 gallons into fermenter at 1.049 (corrected)... very close to recipe! Pitched with Safale S-04.&lt;/li&gt;
&lt;li&gt;2015-JUN-13: Racked to secondary and cold-crashed.&lt;/li&gt;
&lt;li&gt;2015-JUL-18: Bottled with 5 oz table sugar and 1 cup of water. 48 bottles exactly!&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="beer"/></entry><entry><title>Beer Recipe : Black Pearl Porter</title><link href="/2014/04/30/black_pearl_porter.html" rel="alternate"/><published>2014-04-30T00:00:00-04:00</published><updated>2014-04-30T00:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2014-04-30:/2014/04/30/black_pearl_porter.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.homebrewtalk.com/f126/black-pearl-porter-ag-24243"&gt;homebrewtalk.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This was a very good, very rich Porter. Nice sweetness and great mouthfeel. Friends who shy away from Stout loved this milder dark beer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.063 (75% eff)&lt;/li&gt;
&lt;li&gt;Target FG 1.015 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 6.3%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.homebrewtalk.com/f126/black-pearl-porter-ag-24243"&gt;homebrewtalk.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This was a very good, very rich Porter. Nice sweetness and great mouthfeel. Friends who shy away from Stout loved this milder dark beer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Target OG 1.063 (75% eff)&lt;/li&gt;
&lt;li&gt;Target FG 1.015 (75% att)&lt;/li&gt;
&lt;li&gt;Target ABV 6.3%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients-5-gallon"&gt;Ingredients (5 gallon)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 gallons strike water, plus &lt;strong&gt;4 gallons + 4 cups&lt;/strong&gt; for sparging&lt;/li&gt;
&lt;li&gt;8 lb Pale Malt (2 Row) US (2.0 SRM)&lt;/li&gt;
&lt;li&gt;2 lb Munich Malt - 10L (10.0 SRM)&lt;/li&gt;
&lt;li&gt;1 lb Caramel/Crystal Malt - 30L (30.0 SRM)&lt;/li&gt;
&lt;li&gt;1 lb Chocolate Malt (350.0 SRM)&lt;/li&gt;
&lt;li&gt;1 lb Oats, Quaker Instant &lt;em&gt;(no salt!)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;1 oz Fuggle hops&lt;/li&gt;
&lt;li&gt;1 packet London Ale Yeast (Safale S-04)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3.5 oz&lt;/strong&gt; Raw Cane Sugar (2.25 vols)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mash"&gt;Mash&lt;/h3&gt;
&lt;p&gt;Mash for &lt;strong&gt;60 minutes&lt;/strong&gt;. Keep mash as close to &lt;strong&gt;156&lt;/strong&gt; °F as possible, keeping the grains between 150 °F and 158 °F.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;16 quarts / 13 lbs = 1.23 thickness; strike at 173 °F&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="boil"&gt;Boil&lt;/h3&gt;
&lt;p&gt;Boil for &lt;strong&gt;60 minutes&lt;/strong&gt;, skimming early and often to prevent boil-over.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;60 minutes - 0.5 oz Fuggle hops&lt;/li&gt;
&lt;li&gt;15 minutes - 1 Whirlfloc tab&lt;/li&gt;
&lt;li&gt;2 minutes - 0.5 oz Fuggle hops&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ferment"&gt;Ferment&lt;/h2&gt;
&lt;p&gt;Leave in a cooler-than-room-temperature location (60 °F to 65 °F). Two (2) weeks in primary and three (3) weeks in secondary..&lt;/p&gt;
&lt;h2 id="bottle"&gt;Bottle&lt;/h2&gt;
&lt;p&gt;Boil the raw cane sugar in one cup of filtered water. Rack from secondary into cooled (70-80 °F) mixture. Bottle condition minimum four (4) weeks near room temperature (68 °F to 70 °F). After conditioning, store cooler if possible. Refrigerate at least 48 hours before drinking, preferably one week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Goal is "low volumes" or 2.0 vols of carbination, but this seems like a lot less than the typical book recipe. For my first 5-gallon batch I used 3.5oz of raw cane sugar and the beer had perfect low carbonation. Using the Northern Brewer &lt;a href="https://www.northernbrewer.com/pages/priming-sugar-calculator"&gt;Priming Sugar Calculator&lt;/a&gt; with 5 gallons of beer with a pre-cold-crash temperature of 68 °F and &lt;strong&gt;3.5oz (99g) of raw cane sugar&lt;/strong&gt; (Turbinado) would give us &lt;strong&gt;2.285 vols&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="log"&gt;Log&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2014-APR-30: Partially updated to 5-gallon&lt;/li&gt;
&lt;li&gt;2014-JUN-24: Updated to 5-gallon; updated sugar values&lt;/li&gt;
&lt;li&gt;2016-APR-09: Possible name change? Porters use Barley; this is built just like a Stout, but with fewer hops (like a Porter)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-037"&gt;Batch #037&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2017-JAN-28: Used up some extra Pilsner and 6-Row malts; used some Black Patent to make up for limited Chocolate malt; used some extra Crystal 10, 20 instead of Crystal 30. Double-crushed through Whitten's Barley Crusher. Strike water was too cold resulting in mash temperature around 149F; directly heated mash to 157 with heat stick. Sparged with an extra gallon of water because kettle volume looked low (wrong). Ended up with about seven (7) gallons at 1.053 (corrected) O.G. Pitched S-04.&lt;/li&gt;
&lt;li&gt;2017-FEB-12: Racked to secondary (5 gallon plastic Big-Mouth Bubbler)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-031"&gt;Batch #031&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2016-APR-15: Used filtered Stilwell well water; used a pound of Simpsons Crystal Light (30-37L) instead of Crystal 30L; ambient temperature 70F; strike water to 179.7F; into tun, 171.1F after 10 minutes; mash-in 153.1F; 153.6F (peak) after 60 minutes. Rest for 5 minutes during each sparge batch (2 batches). 4 gallons strike then 4 gallons + 4 cups sparge water worked out to about 7.5 gallons and 1.0477 (corrected) pre-boil gravity. Boiled down to about 5.5 gallons and 1.065 (corrected) O.G. Pitched S-04.&lt;/li&gt;
&lt;li&gt;2016-MAY-03: Racked to secondary (Pyrex)&lt;/li&gt;
&lt;li&gt;2016-JUN-04: Bottled&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-026"&gt;Batch #026&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2015-APR-19: Strike water to 180.5F; into tun, 170.4F after 10 minutes; mash-in didn't check temp; 156F after 60 minutes! Rest for 5 minutes during each sparge batch (2 batches). Whirlfloc at 10 minutes; did not whirlpool during chill (due to thermometer).&lt;/li&gt;
&lt;li&gt;2015-APR-20: Wort smelled sort of... burned? And now fermenter is putting off a similar odor. Used about half English Chocolate Malt combined with the last of the stuff I used before. Gravity and volume are otherwise perfect so far.&lt;/li&gt;
&lt;li&gt;2015-MAY-09: Racked to secondary&lt;/li&gt;
&lt;li&gt;2015-MAY-23: Bottled with 3.5oz of Turbinado and 1 cup filtered water; F.G. was really quite high (1.023 corrected) probably due to high mash temp (156F) or perhaps did not leave in primary for long enough. We'll see how it tastes (Update: tasted awesome!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-014"&gt;Batch #014&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2014-APR-25: Mashed at 154 °F&lt;/li&gt;
&lt;li&gt;2014-MAY-23: Bottled - Goal for this batch is medium-low carbonation; target 3.5oz (actual 3.6oz) sugar for a goal of 2.25 vols; boil briefly with 1 cup filtered water. This is about 1/2 the sugar called for by the "low-carbonated" Chocolate Maple in the Brooklyn Brew Shop book. Used black bottle caps and Sierra Nevada bottles (a few Red Hook bottles for gifts)&lt;/li&gt;
&lt;li&gt;2014-MAY-23: Batch #014.5: Last 3 quarts of beer ended up with all the cold-crash (siphon setup sucked); placed in 1-gallon carboy and airlock; will let ferment the little bit of primer sugar for 2 weeks then cold-crash for a few days.&lt;/li&gt;
&lt;li&gt;2014-JUN-21: First two bottles consumed after 32 hours in fridge; very good! Mike Whitten approved; good clarity and flavor. Carbonation is low, probably correct for the style. Not sure if used 3.6 or 4 oz sugar based on notes.&lt;/li&gt;
&lt;li&gt;2014-JUN-24: Batch #014.5: Probably cold-crashed the 3 quarts way too long (2+ weeks); will bottle with 0.6oz brown sugar, boiled briefly with 1/4 cup filtered water. Will bottle in Mexican Coke bottles with red caps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="batch-005"&gt;Batch #005&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2013-DEC-22: Bottled - 3 tbsp raw cane sugar; carbonated fine (probably high for the style); probably near 3 vols (maybe higher). Removed all animal products from recipe&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="beer"/></entry><entry><title>Track Day</title><link href="/2014/04/13/track_day.html" rel="alternate"/><published>2014-04-13T00:00:00-04:00</published><updated>2014-04-13T00:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2014-04-13:/2014/04/13/track_day.html</id><summary type="html">&lt;p&gt;My co-driver and I went to a &lt;a href="https://www.nasaproracing.com/hpde/"&gt;NASA High Performance Driving Event (HPDE)&lt;/a&gt; weekend at &lt;a href="https://en.wikipedia.org/wiki/Mid-Ohio_Sports_Car_Course"&gt;Mid-Ohio Sports Car Course&lt;/a&gt;. A little overwhelming. A lot of fun.&lt;/p&gt;
&lt;p&gt;&lt;img alt="slow" src="/assets/photos/subaru_wrx/track_day_may_23_2014.jpg"&gt;&lt;/p&gt;
&lt;p&gt;A few twenty-minute sessions over the course of two days, and you have more seat time than a year of regular autocross events. You …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My co-driver and I went to a &lt;a href="https://www.nasaproracing.com/hpde/"&gt;NASA High Performance Driving Event (HPDE)&lt;/a&gt; weekend at &lt;a href="https://en.wikipedia.org/wiki/Mid-Ohio_Sports_Car_Course"&gt;Mid-Ohio Sports Car Course&lt;/a&gt;. A little overwhelming. A lot of fun.&lt;/p&gt;
&lt;p&gt;&lt;img alt="slow" src="/assets/photos/subaru_wrx/track_day_may_23_2014.jpg"&gt;&lt;/p&gt;
&lt;p&gt;A few twenty-minute sessions over the course of two days, and you have more seat time than a year of regular autocross events. You also realize that parking lots will now be a massive disappointment.&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Spyder in Elkins</title><link href="/2009/05/30/spyder_elkins.html" rel="alternate"/><published>2009-05-30T00:00:00-04:00</published><updated>2009-05-30T00:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2009-05-30:/2009/05/30/spyder_elkins.html</id><content type="html">&lt;p&gt;First autocross in the Toyota Spyder was great; the used Toyos performed well and the car was fun and well-balanced. Hats off to the &lt;a href="https://www.facebook.com/groups/swvrscca/"&gt;Southern West Virginia Region SCCA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="spyder elkins airport" src="/assets/photos/spyder/IMG_0850.fixed.jpg"&gt;&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Boot Camp Troubles</title><link href="/2006/10/28/boot_camp_troubles.html" rel="alternate"/><published>2006-10-28T01:52:00-04:00</published><updated>2006-10-28T01:52:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2006-10-28:/2006/10/28/boot_camp_troubles.html</id><summary type="html">&lt;p&gt;I decided this week to once again install Windows XP onto my MacBook, and set it up with the couple applications I needed for work.  Hauling a laptop to the office is not onerous, but the MacBook is a hell of a lot lighter than the clunker Dell.  Nevermind that …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I decided this week to once again install Windows XP onto my MacBook, and set it up with the couple applications I needed for work.  Hauling a laptop to the office is not onerous, but the MacBook is a hell of a lot lighter than the clunker Dell.  Nevermind that I need Windows to run &lt;a href="https://www.ventrilo.com/"&gt;Ventrilo&lt;/a&gt; during &lt;a href="http://us.battle.net/wow/en/guild/elune/Titans%20Exodus/"&gt;guild&lt;/a&gt; runs.&lt;/p&gt;
&lt;p&gt;Having used &lt;a href="https://support.apple.com/boot-camp"&gt;Boot Camp&lt;/a&gt; before, I felt pretty comfortable with repartitioning my drive and fiddling with the Apple drivers.  I spent an afternoon clearing some space; I removed ripped DVDs, a seldom-used backup installation of &lt;a href="https://worldofwarcraft.com/en-us/"&gt;WoW&lt;/a&gt;, some software that came with the MacBook and a lot of downloads and log files. I grabbed the latest Boot Camp and ran the installer.  One gratuitous legal agreement later, and I am attempting to set up a 20gb FAT partition.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Your disk cannot be partitioned because some files cannot be moved

Back up the disk and use Disk Utility to format the disk as a single Mac OS Extended (Journaled) volume. Restore your information to the disk and try using Boot Camp Assistant again.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Damn.&lt;/p&gt;
&lt;p&gt;I was pretty sure from the start the issue was fragmentation.  The intarweb was not much help, but I was able to find a very nice defrag utility for the Mac, called &lt;a href="https://coriolis-systems.com/iDefrag/"&gt;iDefrag&lt;/a&gt;.  Running a trial version of their software showed me exactly what I expected... the MacBook had no contiguous space large enough to partition.&lt;/p&gt;
&lt;p&gt;So I bit.  The software was easy to buy and I soon had a licensed copy.  I rebooted the MacBook into &lt;a href="https://support.apple.com/en-il/HT201462"&gt;Target Disk Mode&lt;/a&gt; and plugged it into the G5.  An overnight Optimize cleaned up the drive nicely, but I was not done yet; I still had to run Apple's disk utility to fix a small error that iDefrag had created.  Not a big deal.&lt;/p&gt;
&lt;p&gt;Now if only Windows XP did not make me feel so... exposed.&lt;/p&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>Recipe : Gazpacho</title><link href="/2006/06/04/gazpacho_recipe.html" rel="alternate"/><published>2006-06-04T16:40:00-04:00</published><updated>2006-06-04T16:40:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2006-06-04:/2006/06/04/gazpacho_recipe.html</id><summary type="html">&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;5 large fresh tomatoes (about 4lbs) - peeled (braized) and seeded  &lt;/li&gt;
&lt;li&gt;1 large cucumber - peeled, seeded  &lt;/li&gt;
&lt;li&gt;1 large green pepper - seeded  &lt;/li&gt;
&lt;li&gt;3 Tbsp chopped fresh parsley  &lt;/li&gt;
&lt;li&gt;1 cup chopped sweet (vidalia) onion  &lt;/li&gt;
&lt;li&gt;3 small green onions - sliced thin  &lt;/li&gt;
&lt;li&gt;1 clove garlic - minced  &lt;/li&gt;
&lt;li&gt;1/2 cup vinegar  &lt;/li&gt;
&lt;li&gt;1/2 cup olive …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;5 large fresh tomatoes (about 4lbs) - peeled (braized) and seeded  &lt;/li&gt;
&lt;li&gt;1 large cucumber - peeled, seeded  &lt;/li&gt;
&lt;li&gt;1 large green pepper - seeded  &lt;/li&gt;
&lt;li&gt;3 Tbsp chopped fresh parsley  &lt;/li&gt;
&lt;li&gt;1 cup chopped sweet (vidalia) onion  &lt;/li&gt;
&lt;li&gt;3 small green onions - sliced thin  &lt;/li&gt;
&lt;li&gt;1 clove garlic - minced  &lt;/li&gt;
&lt;li&gt;1/2 cup vinegar  &lt;/li&gt;
&lt;li&gt;1/2 cup olive oil  &lt;/li&gt;
&lt;li&gt;2 Tbsp lemon juice  &lt;/li&gt;
&lt;li&gt;3 packets Splenda (sugar works too)  &lt;/li&gt;
&lt;li&gt;1 Tbsp black pepper  &lt;/li&gt;
&lt;li&gt;1 can tomato soup  &lt;/li&gt;
&lt;li&gt;3 cups hot beef broth&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="directions"&gt;Directions&lt;/h2&gt;
&lt;p&gt;Chop the fresh tomatoes, cucumber, bell pepper, parsley and onions. Set one half of vegetables to one side.&lt;/p&gt;
&lt;p&gt;Combine tomato soup (include water per typical soup directions) and garlic with other half of vegetables in a blender. Blend well.&lt;/p&gt;
&lt;p&gt;Add remaining ingredients.  Make sure the broth is hot, but do not melt your container! Stir well.&lt;/p&gt;
&lt;p&gt;Salt may be added to taste, but remember that the tomato soup and broth probably have plenty.&lt;/p&gt;
&lt;p&gt;Refrigerate until cold, preferably overnight, preferably in a sealed container.&lt;/p&gt;
&lt;p&gt;Serve cold in a short glass or cup; a great summer appetizer, snack, or side with meals.&lt;/p&gt;</content><category term="posts"/><category term="food"/></entry><entry><title>MacBook</title><link href="/2006/06/02/macbook.html" rel="alternate"/><published>2006-06-02T07:33:00-04:00</published><updated>2006-06-02T07:33:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2006-06-02:/2006/06/02/macbook.html</id><summary type="html">&lt;p&gt;Ordered a 1.83ghz MacBook the evening after they went on sale.  Two gigs of RAM have done wonders for the performance of World of Warcraft, to the point where the game is quite playable, as long as I have a mouse nearby.&lt;/p&gt;
&lt;p&gt;The machine runs hot, much hotter than …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ordered a 1.83ghz MacBook the evening after they went on sale.  Two gigs of RAM have done wonders for the performance of World of Warcraft, to the point where the game is quite playable, as long as I have a mouse nearby.&lt;/p&gt;
&lt;p&gt;The machine runs hot, much hotter than the 600mhz iBook it replaced, but the often reported thermal grease fix is &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;probably not a fix at all&lt;/a&gt;.  The solution appears simple, run the fans earlier.  Now we wait for someone to develop such a hack.&lt;/p&gt;
&lt;p&gt;Some things I have found.&lt;/p&gt;
&lt;p&gt;Windows XP runs fine under &lt;a href="https://support.apple.com/boot-camp"&gt;Boot Camp&lt;/a&gt;, however if you want to be able to right-click, you will have to get control-click to work under Windows.  The answer is &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;this little gem&lt;/a&gt;, although an external mouse is much better.  Another annoyance is the Delete key mappd to Backspace; I have read that &lt;strong&gt;remapkey.exe&lt;/strong&gt; can be used to fix this.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;Adium&lt;/a&gt; has been a nice surprise, I should have found it earlier.&lt;/p&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>RSS Corrected</title><link href="/2006/03/30/rss_corrected.html" rel="alternate"/><published>2006-03-30T17:05:00-05:00</published><updated>2006-03-30T17:05:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2006-03-30:/2006/03/30/rss_corrected.html</id><summary type="html">&lt;p&gt;Had some problems getting my RSS feed to work with Gmail's WebClips, so I took a look at it today.  Apparently RSS readers sometimes do not like non-xml file extensions.  Simple enough, now the RSS feed is on a cron job.  Added some things and cleaned up the formatting some …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Had some problems getting my RSS feed to work with Gmail's WebClips, so I took a look at it today.  Apparently RSS readers sometimes do not like non-xml file extensions.  Simple enough, now the RSS feed is on a cron job.  Added some things and cleaned up the formatting some while I was in there.&lt;/p&gt;
&lt;p&gt;Update: I have since moved to &lt;a href="https://textpattern.com"&gt;TextPattern&lt;/a&gt;'s built-in RSS and Atom feeds.&lt;/p&gt;
&lt;p&gt;Update 2018-MAR-25: Now &lt;a href="https://hexo.io/"&gt;Hexo&lt;/a&gt; generates my &lt;a href="/atom.xml"&gt;Atom&lt;/a&gt; feed.&lt;/p&gt;</content><category term="posts"/></entry><entry><title>PBWiki Delivers the Goods</title><link href="/2006/02/15/pbwki.html" rel="alternate"/><published>2006-02-15T19:42:00-05:00</published><updated>2006-02-15T19:42:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2006-02-15:/2006/02/15/pbwki.html</id><summary type="html">&lt;p&gt;I really wanted to give Wikis a chance, after all the buzz they have generated in the past few years.  I knew that &lt;a href="https://www.penny-arcade.com/"&gt;Gabe and Tycho&lt;/a&gt; had set one up for their &lt;a href="https://elothtes.pbwiki.com/"&gt;Elementstor Saga&lt;/a&gt;, so I decided to check it out in more detail.  They used a service called &lt;a href="https://www.pbworks.com/wikis.html"&gt;PBWiki …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;I really wanted to give Wikis a chance, after all the buzz they have generated in the past few years.  I knew that &lt;a href="https://www.penny-arcade.com/"&gt;Gabe and Tycho&lt;/a&gt; had set one up for their &lt;a href="https://elothtes.pbwiki.com/"&gt;Elementstor Saga&lt;/a&gt;, so I decided to check it out in more detail.  They used a service called &lt;a href="https://www.pbworks.com/wikis.html"&gt;PBWiki&lt;/a&gt; so I gave it a try.  The PBWiki syntax is compelling, more than just a variation of WikiWikiWeb, and much more like a truncated blend of Wiki, Textile and Markdown.  I immediately signed up for their premium service.&lt;/p&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>Finally, Teamspeak for Mac!</title><link href="/2005/10/25/teamspeak_mac.html" rel="alternate"/><published>2005-10-25T18:52:00-04:00</published><updated>2005-10-25T18:52:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2005-10-25:/2005/10/25/teamspeak_mac.html</id><summary type="html">&lt;p&gt;Came across &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;TeamSpeex&lt;/a&gt; last week. The program is a clean little Teamspeak client, and worked fine with both of the guild servers that I tried... once I updated to OS X 10.4 (Tiger)&lt;/p&gt;
&lt;p&gt;/frown&lt;/p&gt;
&lt;p&gt;Looks like the author is working towards an update for 10.3.x, which would …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Came across &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;TeamSpeex&lt;/a&gt; last week. The program is a clean little Teamspeak client, and worked fine with both of the guild servers that I tried... once I updated to OS X 10.4 (Tiger)&lt;/p&gt;
&lt;p&gt;/frown&lt;/p&gt;
&lt;p&gt;Looks like the author is working towards an update for 10.3.x, which would be nice, because &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;Dashboard&lt;/a&gt; &lt;strong&gt;makes baby Jesus cry&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Update: reading down through the comments from Savvy''s blog shows that the &lt;strong&gt;non-Unicode&lt;/strong&gt; &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;version&lt;/a&gt; &lt;em&gt;should&lt;/em&gt; work with OS X 10.3.9 (Panther)&lt;/p&gt;
&lt;p&gt;Huzzah!  Donation sent!&lt;/p&gt;</content><category term="posts"/></entry><entry><title>Talk Like a Pirate Day</title><link href="/2005/09/19/talk_like_a_pirate.html" rel="alternate"/><published>2005-09-19T16:45:00-04:00</published><updated>2005-09-19T16:45:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2005-09-19:/2005/09/19/talk_like_a_pirate.html</id><summary type="html">&lt;p&gt;Arrr, today be international &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;Talk Like a Pirate Day&lt;/a&gt; and me have a couple goodies for you.  Ahoy, ye can find out yer &lt;a href="https://www.piratequiz.com/"&gt;Pirate Name&lt;/a&gt; or ye can go har fer some history on &lt;a href="https://pirates.hegewisch.net/"&gt;Caribbean seafarin' heartys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ye can e'en sail th' seas &lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Link_rot"&gt;[dead link]&lt;/a&gt; like a true buccanneer.   Maybe …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Arrr, today be international &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;Talk Like a Pirate Day&lt;/a&gt; and me have a couple goodies for you.  Ahoy, ye can find out yer &lt;a href="https://www.piratequiz.com/"&gt;Pirate Name&lt;/a&gt; or ye can go har fer some history on &lt;a href="https://pirates.hegewisch.net/"&gt;Caribbean seafarin' heartys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ye can e'en sail th' seas &lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Link_rot"&gt;[dead link]&lt;/a&gt; like a true buccanneer.   Maybe ye might be interested enna web site about &lt;a href="https://www.gentlemenoffortune.com/sailorskit.htm"&gt;how gentleman o' fortunes dressed&lt;/a&gt;?  Thar be e'en a sea dog &lt;a href="https://en.wikipedia.org/wiki/Pirates_Constructible_Strategy_Game"&gt;card game&lt;/a&gt;. Finally, if ye suck at bein' a shipmate, &lt;a href="https://www.syddware.com/cgi-bin/pirate.pl"&gt;this translator&lt;/a&gt; can get ye started&lt;/p&gt;
&lt;p&gt;Ye'll ne'er get me buried booty!&lt;/p&gt;
&lt;p&gt;Captain John Flint&lt;/p&gt;</content><category term="posts"/><category term="words"/></entry><entry><title>New Toy</title><link href="/2005/08/22/bonneville.html" rel="alternate"/><published>2005-08-22T21:02:00-04:00</published><updated>2005-08-22T21:02:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2005-08-22:/2005/08/22/bonneville.html</id><summary type="html">&lt;p&gt;For many years the idea of riding a motorcycle has appealed to me.  I have always admired sport bikes of any incarnation; old &lt;a href="https://en.wikipedia.org/wiki/Honda_Interceptor_VF750F"&gt;Honda Interceptors&lt;/a&gt;, &lt;a href="https://www.gixxer.com/"&gt;Gixxers&lt;/a&gt;, &lt;a href="https://hayabusa.org"&gt;'Busas&lt;/a&gt;, gorgeous &lt;a href="https://en.wikipedia.org/wiki/BMW_K1200R"&gt;BMW Rs&lt;/a&gt; and the sublime &lt;a href="https://www.ducatimonster.org/"&gt;Ducati Monsters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately the wife has had a fixation on cruisers, especially &lt;a href="https://www.harley-davidson.com/"&gt;Harleys&lt;/a&gt;, since before I met …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For many years the idea of riding a motorcycle has appealed to me.  I have always admired sport bikes of any incarnation; old &lt;a href="https://en.wikipedia.org/wiki/Honda_Interceptor_VF750F"&gt;Honda Interceptors&lt;/a&gt;, &lt;a href="https://www.gixxer.com/"&gt;Gixxers&lt;/a&gt;, &lt;a href="https://hayabusa.org"&gt;'Busas&lt;/a&gt;, gorgeous &lt;a href="https://en.wikipedia.org/wiki/BMW_K1200R"&gt;BMW Rs&lt;/a&gt; and the sublime &lt;a href="https://www.ducatimonster.org/"&gt;Ducati Monsters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately the wife has had a fixation on cruisers, especially &lt;a href="https://www.harley-davidson.com/"&gt;Harleys&lt;/a&gt;, since before I met her. I think that cruisers are nice enough, they have everything you need, I guess.  The lack of sportiness and the whole "weekend leathers" scene were big turn-offs.&lt;/p&gt;
&lt;p&gt;I was looking hard for some kind of compromise.  Naked sportbikes, like the sweet &lt;a href="https://www.svrider.com/"&gt;SV650&lt;/a&gt;, were far too sporty for her. Every showroom was the same; she hated everything I liked.  Exasperated, I started to explore used "standard" bikes from the 70s for their cheap entry price and upright riding position.&lt;/p&gt;
&lt;p&gt;Then I saw the &lt;a href="https://ridermagazine.com/2005/10/29/2005-triumph-bonneville-t100-road-test/"&gt;Triumph Bonneville&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bonneville" src="/assets/photos/bonneville/bonneville_march07.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The bike met with wife approval.  Triumph Motorcycles Ltd was building beautiful, dependable bikes.  Not some overpriced American clunker or Japanese wannabe.  Something in its own right. She even picked the color.  Black.&lt;/p&gt;
&lt;p&gt;Sure the Bonnie is not the fastest bike on the road, but I'm not actively trying to kill myself here.  Plus the 790cc vertical twin takes &lt;a href="https://www.stabbarps-auto.com/bonneville1.html"&gt;very well&lt;/a&gt; to mods.&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Ventrilo for Mac OS X</title><link href="/2005/07/01/ventrilo_for_mac.html" rel="alternate"/><published>2005-07-01T12:52:00-04:00</published><updated>2005-07-01T12:52:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2005-07-01:/2005/07/01/ventrilo_for_mac.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.ventrilo.com/"&gt;Ventrilo&lt;/a&gt; is a very popular Teamspeak-like voice application for Windows and Linux.  They have stated that a Mac client was in the works but that was over a year ago. I checked on their progress today and found an update from May 30th.&lt;/p&gt;
&lt;p&gt;I am very interested in this because …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.ventrilo.com/"&gt;Ventrilo&lt;/a&gt; is a very popular Teamspeak-like voice application for Windows and Linux.  They have stated that a Mac client was in the works but that was over a year ago. I checked on their progress today and found an update from May 30th.&lt;/p&gt;
&lt;p&gt;I am very interested in this because I have some issues with &lt;a href="https://www.skype.com/"&gt;Skype&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No more than five people per conference call&lt;/li&gt;
&lt;li&gt;High system usage (bandwidth and processor) make for worsened game performance&lt;/li&gt;
&lt;li&gt;No way to increase or decrease the volume of particular participants&lt;/li&gt;
&lt;li&gt;No way to reduce quality to reduce bandwidth usage&lt;/li&gt;
&lt;li&gt;The creators of Skype are the creators of &lt;a href="https://en.wikipedia.org/wiki/Kazaa"&gt;Kazaa&lt;/a&gt;.  While Skype does not appear to contain spyware or adware (&lt;em&gt;yet&lt;/em&gt;) Kazaa is notorious for the horrible crap that it infects your machine with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is promising news, but as with most software ports of this kind &lt;em&gt;cough&lt;/em&gt; Teamspeak &lt;em&gt;cough&lt;/em&gt; I will believe it when I see it.&lt;/p&gt;
&lt;p&gt;There may be &lt;a href="https://en.wikipedia.org/wiki/Gizmo5"&gt;another option&lt;/a&gt; as well, but that will require some testing.&lt;/p&gt;</content><category term="posts"/></entry><entry><title>Too Many Projects</title><link href="/2005/06/10/too_many_projects.html" rel="alternate"/><published>2005-06-10T14:55:00-04:00</published><updated>2005-06-10T14:55:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2005-06-10:/2005/06/10/too_many_projects.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.worldofwarcraft.com"&gt;Something&lt;/a&gt; has been occupying almost all of my free time the past few months.&lt;/p&gt;
&lt;p&gt;I really need to update my Projects page.  The "new" car has been occupying a great deal of my attention recently.  The past week I bled the brakes, changed the radiator fluid and oil, installed a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.worldofwarcraft.com"&gt;Something&lt;/a&gt; has been occupying almost all of my free time the past few months.&lt;/p&gt;
&lt;p&gt;I really need to update my Projects page.  The "new" car has been occupying a great deal of my attention recently.  The past week I bled the brakes, changed the radiator fluid and oil, installed a new battery and cleaned out the trunk.  Removed a ton of rust with a wire wheel attachment on my cordless drill.  Also tried to air it out a little more; the poor thing gets a bit musty inside because of the leak in the trunk.&lt;/p&gt;
&lt;p&gt;Found a really cool source for &lt;a href="https://www.WescoPerformance.com"&gt;replacement seat belts&lt;/a&gt;. I ordered a pair of non-retractable 3-point belts to replace the terrible factory belts. The belts seem of acceptable sturdiness and should work well. I may actually try them out in the Miata because&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;retractable mechanisms add weight&lt;/li&gt;
&lt;li&gt;the adjustment method could mean a very snug fit&lt;/li&gt;
&lt;li&gt;unlike a race harness, a policeman would never notice these&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now I need the hood painted and pinstripes removed to make it into a half-decent twenty-footer.  The brake pad shims are also badly rusted and I need to clean them up, along with either new caliper pins or a serious amount of rust removal and caliper grease.  The stock black steelies do not look bad though.&lt;/p&gt;
&lt;p&gt;My DVR project has stagnated now since November 2004 despite the addition of a Hauppauge WinTV PVR-350. I even have a new Sony Trinitron 30" HDTV now... but no DVR capabilities.&lt;/p&gt;</content><category term="posts"/></entry><entry><title>Obnoxious Lucidity</title><link href="/2004/10/26/obnoxious_lucidity.html" rel="alternate"/><published>2004-10-26T17:19:00-04:00</published><updated>2004-10-26T17:19:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-10-26:/2004/10/26/obnoxious_lucidity.html</id><summary type="html">&lt;p&gt;A few days ago I started to receive unsolicited AIM messages from a form of chatterbot under the screen name of Eliza6070.  A quick google shows me that the &lt;a href="https://en.wikipedia.org/wiki/Pidgin_(software)"&gt;GAIM&lt;/a&gt; client allows for scripting and there are several chatterbot scripts available.  The performance of this particular "bot" was underwhelming... the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A few days ago I started to receive unsolicited AIM messages from a form of chatterbot under the screen name of Eliza6070.  A quick google shows me that the &lt;a href="https://en.wikipedia.org/wiki/Pidgin_(software)"&gt;GAIM&lt;/a&gt; client allows for scripting and there are several chatterbot scripts available.  The performance of this particular "bot" was underwhelming... the original Eliza and &lt;a href="https://en.wikipedia.org/wiki/Link_rot"&gt;various&lt;/a&gt; &lt;a href="https://www.manifestation.com/neurotoys/eliza.php3"&gt;derivatives&lt;/a&gt; where at least entertaining.  This bleating from my iChat interface..  I've written better and not tried very hard.&lt;/p&gt;
&lt;p&gt;All this bot seemed interested in was getting more AIM screen names. I decided to accommodate the poor bastard with ten minutes of my own Applescript.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;iChat&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;activate&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;

  &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;dbl_quote&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;\\&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt;  repeat&lt;/span&gt;
&lt;span class="s2"&gt;    set currentYear to year of (current date)&lt;/span&gt;
&lt;span class="s2"&gt;    if currentYear is 2010 then exit repeat&lt;/span&gt;

&lt;span class="s2"&gt;    -- You gotta love GUI Scripting&lt;/span&gt;
&lt;span class="s2"&gt;    set alphabet to &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;abcdefghijklmnopqrstuvwxyz&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt;   tell application &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt; &lt;span class="nv"&gt;Events&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;      tell process &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;iChat&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;

        &lt;span class="c"&gt;-- Valid AIM [bot] lengths; 5 to 16&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;wait_time&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;random number&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;word_length&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;random number&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
        &lt;span class="nb"&gt;delay&lt;/span&gt; &lt;span class="nv"&gt;wait_time&lt;/span&gt;
        &lt;span class="nv"&gt;keystroke&lt;/span&gt; &lt;span class="nv"&gt;dbl_quote&lt;/span&gt;
        &lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;word_length&lt;/span&gt; &lt;span class="k"&gt;times&lt;/span&gt;

          &lt;span class="c"&gt;-- Add some random delay&lt;/span&gt;
          &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;chib&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;random number&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;chib&lt;/span&gt; &lt;span class="ow"&gt;is equal&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;delay&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

          &lt;span class="c"&gt;-- Type our random character&lt;/span&gt;
          &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;rand_char&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;some&lt;/span&gt; &lt;span class="nb"&gt;character&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;alphabet&lt;/span&gt;
          &lt;span class="nv"&gt;keystroke&lt;/span&gt; &lt;span class="nv"&gt;rand_char&lt;/span&gt;

        &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
        &lt;span class="nv"&gt;keystroke&lt;/span&gt; &lt;span class="nv"&gt;dbl_quote&lt;/span&gt;
        &lt;span class="nv"&gt;keystroke&lt;/span&gt; &lt;span class="no"&gt;return&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The only caveat: because iChat is not directly scriptable, you have to leave the targeted message window in the foreground, so forget getting anything done.  I may look into a work-around or try GAIM for Mac OS X... but probably not.&lt;/p&gt;</content><category term="posts"/><category term="ops"/><category term="code"/><category term="applescript"/></entry><entry><title>Friday Spotless Night Mind</title><link href="/2004/10/25/friday_spotless_night_mind.html" rel="alternate"/><published>2004-10-25T02:26:00-04:00</published><updated>2004-10-25T02:26:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-10-25:/2004/10/25/friday_spotless_night_mind.html</id><summary type="html">&lt;h3 id="friday-night-lights"&gt;&lt;a href="https://www.imdb.com/title/tt0390022/"&gt;Friday Night Lights&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Billed as the ultimate football movie.  Lots of shakey-cam.  Emotionally moving, but I've seen more character development in a half-hour episode of &lt;a href="https://www.imdb.com/title/tt0086827/"&gt;Who's the Boss&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="eternal-sunshine-of-the-spotless-mind"&gt;&lt;a href="https://www.imdb.com/title/tt0338013/"&gt;Eternal Sunshine of the Spotless Mind&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A great movie for anyone who's ever been in love, and enjoys thought-provoking film.  Jim Carrey …&lt;/p&gt;</summary><content type="html">&lt;h3 id="friday-night-lights"&gt;&lt;a href="https://www.imdb.com/title/tt0390022/"&gt;Friday Night Lights&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Billed as the ultimate football movie.  Lots of shakey-cam.  Emotionally moving, but I've seen more character development in a half-hour episode of &lt;a href="https://www.imdb.com/title/tt0086827/"&gt;Who's the Boss&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="eternal-sunshine-of-the-spotless-mind"&gt;&lt;a href="https://www.imdb.com/title/tt0338013/"&gt;Eternal Sunshine of the Spotless Mind&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A great movie for anyone who's ever been in love, and enjoys thought-provoking film.  Jim Carrey at probably his best... this is the first time I have been able to separate him from &lt;a href="https://www.imdb.com/title/tt0109040/"&gt;Ace Ventura&lt;/a&gt;. &lt;a href="https://www.imdb.com/name/nm0000379/"&gt;Kirsten Dunst&lt;/a&gt; don't hurt either.&lt;/p&gt;</content><category term="posts"/><category term="words"/></entry><entry><title>Grammar</title><link href="/2004/09/09/grammar.html" rel="alternate"/><published>2004-09-09T06:00:00-04:00</published><updated>2004-09-09T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-09-09:/2004/09/09/grammar.html</id><summary type="html">&lt;p&gt;by DarthKirby001
WoW Stress Tester&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;They&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;re = Contraction for &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;they&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;are&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;  &lt;/span&gt;
&lt;span class="nv"&gt;Their&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;meaning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;possession&lt;/span&gt;&lt;span class="c1"&gt;; The possessive form of &amp;#39;they&amp;#39;.  &lt;/span&gt;
&lt;span class="nv"&gt;There&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;adverb&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Representing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pronoun&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;introduce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sentence&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;.&lt;span class="nv"&gt;e&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There will be no dawn for Men.&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;It&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s = Contraction for &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;is&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;  &lt;/span&gt;
&lt;span class="err"&gt;Its = possession&lt;/span&gt;

&lt;span class="err"&gt;Two = The …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;by DarthKirby001
WoW Stress Tester&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;They&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;re = Contraction for &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;they&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;are&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;  &lt;/span&gt;
&lt;span class="nv"&gt;Their&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;meaning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;possession&lt;/span&gt;&lt;span class="c1"&gt;; The possessive form of &amp;#39;they&amp;#39;.  &lt;/span&gt;
&lt;span class="nv"&gt;There&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;adverb&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Representing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pronoun&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;introduce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sentence&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;.&lt;span class="nv"&gt;e&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There will be no dawn for Men.&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;It&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s = Contraction for &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;is&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;  &lt;/span&gt;
&lt;span class="err"&gt;Its = possession&lt;/span&gt;

&lt;span class="err"&gt;Two = The number 2  &lt;/span&gt;
&lt;span class="err"&gt;Too = including; in addition; an excessive amount of something  &lt;/span&gt;
&lt;span class="nv"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;...&lt;span class="nv"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;means&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;to&amp;#39;&lt;/span&gt;...&lt;span class="nv"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;all&lt;/span&gt;.

&lt;span class="nv"&gt;Here&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="nv"&gt;Hear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;perceive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ear&lt;/span&gt;&lt;span class="c1"&gt;; one of the five senses.&lt;/span&gt;

&lt;span class="nv"&gt;Where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="nv"&gt;We&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;re = we are  &lt;/span&gt;
&lt;span class="err"&gt;Were = past tense of &amp;quot;are&amp;quot;&lt;/span&gt;

&lt;span class="err"&gt;since = A word  &lt;/span&gt;
&lt;span class="err"&gt;sinse = Not a word  &lt;/span&gt;
&lt;span class="err"&gt;sense = A word  &lt;/span&gt;
&lt;span class="err"&gt;sence = Not a word&lt;/span&gt;

&lt;span class="err"&gt;Lose - to fail, not win  &lt;/span&gt;
&lt;span class="err"&gt;Loose - not tight&lt;/span&gt;

&lt;span class="nv"&gt;You&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;re = you are  &lt;/span&gt;
&lt;span class="err"&gt;Your = possession  &lt;/span&gt;
&lt;span class="err"&gt;ur = A city of ancient Sumer in southern Mesopotamia on a site in present-day southeast Iraq. One of the oldest cities in Mesopotamia, it was an important center of Sumerian culture after c. 3000 b.c. and the birthplace of Abraham. The city declined after the sixth century B.C.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="posts"/><category term="words"/></entry><entry><title>Rubber Band Man</title><link href="/2004/08/18/rubber_band_man.html" rel="alternate"/><published>2004-08-18T03:43:00-04:00</published><updated>2004-08-18T03:43:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-08-18:/2004/08/18/rubber_band_man.html</id><summary type="html">&lt;p&gt;Did a quick search on the &lt;a href="https://www.apple.com/itunes/"&gt;iTunes Music Store&lt;/a&gt; and found the original "Rubber Band Man" song by the &lt;a href="https://en.wikipedia.org/wiki/The_Rubberband_Man"&gt;Spinners&lt;/a&gt;.  Hell I'll pay a buck for a song that has brought so much joy to... fans of... staplers... or something.&lt;/p&gt;
&lt;p&gt;Also got a chance to add in BBCode-style markup to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Did a quick search on the &lt;a href="https://www.apple.com/itunes/"&gt;iTunes Music Store&lt;/a&gt; and found the original "Rubber Band Man" song by the &lt;a href="https://en.wikipedia.org/wiki/The_Rubberband_Man"&gt;Spinners&lt;/a&gt;.  Hell I'll pay a buck for a song that has brought so much joy to... fans of... staplers... or something.&lt;/p&gt;
&lt;p&gt;Also got a chance to add in BBCode-style markup to the basic portal code.  Pretty cool.  I based some of it off &lt;a href="https://corz.org/blog/inc/cbparser-demo.php"&gt;cbparser&lt;/a&gt; but the clever things like &lt;code&gt;[url]&lt;/code&gt; tags I wrote myself.&lt;/p&gt;</content><category term="posts"/></entry><entry><title>Site Now Live!</title><link href="/2004/07/28/site_now_live.html" rel="alternate"/><published>2004-07-28T16:14:00-04:00</published><updated>2004-07-28T16:14:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-07-28:/2004/07/28/site_now_live.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.hraefn.net"&gt;Hraefn.net&lt;/a&gt; finally went live with the new design, blog, etc. yesterday.  Updates to the Projects page to close off broken links, except for the Miata section, which I hope to get up tonight or tomorrow sometime.  I certainly have enough pictures by now!&lt;/p&gt;
&lt;p&gt;Contact me to give me some …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.hraefn.net"&gt;Hraefn.net&lt;/a&gt; finally went live with the new design, blog, etc. yesterday.  Updates to the Projects page to close off broken links, except for the Miata section, which I hope to get up tonight or tomorrow sometime.  I certainly have enough pictures by now!&lt;/p&gt;
&lt;p&gt;Contact me to give me some feedback on the design.  I like the look of the bird-man at the top; kind of refects a cynical, angry view which is probably about half of my writings.  Something with a raven''s head should work well, wouldn''t you think?  Erin things he''s kind of scary.  Sweet!&lt;/p&gt;</content><category term="posts"/><category term="code"/></entry><entry><title>Rambling Coincidences</title><link href="/2004/07/24/rambling_coincidences.html" rel="alternate"/><published>2004-07-24T07:15:00-04:00</published><updated>2004-07-24T07:15:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-07-24:/2004/07/24/rambling_coincidences.html</id><summary type="html">&lt;p&gt;I have just recently finished The Song of Susannah, the sixth volume of Steven King's The Dark Tower.  The sheer number of authored coincidences draws me in like few books do; the way everything in Roland's world has a cross-reference with parallel realities keeps me turning the pages long after …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have just recently finished The Song of Susannah, the sixth volume of Steven King's The Dark Tower.  The sheer number of authored coincidences draws me in like few books do; the way everything in Roland's world has a cross-reference with parallel realities keeps me turning the pages long after my body first asked for rest.  It reminds me of a list I have seen several times over the years, a list comparing Abraham Lincoln to John F. Kennedy.  This list goes on in an amazing description of the coincidental facts between the two men; the number of letters in their names, where they were born, dates and numbers related to their presidency.  The idea that Lincoln's murderer fled from a theater to be captured in a warehouse, and that Kennedy's assassin fled from a warehouse to be captured in a theater.&lt;/p&gt;
&lt;p&gt;The mother-in-law gave me a book a couple years ago, &lt;a href="https://en.wikipedia.org/wiki/Look_Homeward,_Angel"&gt;Look Homeward, Angel&lt;/a&gt;.  There was a dry, old, strange quality to the story that reminded me of &lt;a href="https://www.amazon.com/Uncovered-Wagon-Hart-Stilwell/dp/B000H58SIO"&gt;Uncovered Wagon&lt;/a&gt;, a family treasure if there ever was one.  This telling of the life of a chap from before his birth into childhood was warmly familiar; I had heard the story of my grandfather careening around with his tricycle long before I read about it in Wagon, but having it as part of a written novel, despite the thin veil of name changes, was somehow earth-shattering.  But I digress; I'm getting away from the point.&lt;/p&gt;
&lt;p&gt;In the Dark Tower, King uses quotes from Angel not only as fancy lines before the start of each chapter, but as key elements in the story of Roland and his ka-tet.  "The leaf, stone, and door" as it goes.  The only old book I own.&lt;/p&gt;
&lt;p&gt;Why no old books?  Because of the fire that destroyed my family's home in November 1999.  My vast library of books, old an new, from Tolkein to King, Clancy to Heinlein, all gone up in a matter of minutes from the top story.  The burning of 451 Old Lock 12 Rd... is this the same 451 degrees Fahrenheit made famous by Bradbury?&lt;/p&gt;
&lt;p&gt;I had a vivid dream last night of Stephen King telling, in great detail, the horror of the last minutes within the Twin Towers on 9/11/2001.  Very strange to hear/read in a dream, especially words from an author, words that have never actually been written.  I woke to see the alarm clock staring at me with it's baleful, cursed red eyes set to 9:11.&lt;/p&gt;
&lt;p&gt;I think of that snake Michael Moore and his Fahrenheit 9/11, and of the old-style metal tricycles my brother and I used to careen around the old Stilwell house on Stewart Street, where a row of apartment buildings now stand.  This takes me to the house on Smith Mountain Lake, my other grandfather's crowning material achievement now sits with a For Sale sign out front, the pictures posted on the internet showing only a few pieces of furniture in an otherwise very empty house.&lt;/p&gt;
&lt;p&gt;I think what I am feeling now is a great desire to begin writing again.  Long, long past are the days when I felt the need to gush forth in romantic poetry meant only for my own bleeding heart, or very short stories, the seeming purpose of which was only to somehow capture my teenage desire for True Love with a shining knight and a wood nymph.  Saying that hurts me somewhat; what I really want to write is the story of the Hraefn, which in many ways is the need to write something much longer and much better than anything I have written before.  It does not have to be publishable, only complete.  It has to exist because of that lost short story of impossible love between a medieval soldier and a fantasy forest maiden.  I want to take a man, a sad, complex man with a dark and multi-faceted past, into the vastness of all of time and space, challenge his mind, his senses, his body, like some kind of maniac weightlifting chess player.  Glorious landscapes, beautiful women, and horrible monsters the like of which could only have pored directly from Grendal's womb.&lt;/p&gt;
&lt;p&gt;Maybe I should get started.  Maybe tomorrow heh.&lt;/p&gt;</content><category term="posts"/><category term="words"/></entry><entry><title>Escape from Tables</title><link href="/2004/05/07/escape_tables.html" rel="alternate"/><published>2004-05-07T19:42:00-04:00</published><updated>2004-05-07T19:42:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2004-05-07:/2004/05/07/escape_tables.html</id><content type="html">&lt;p&gt;These two links were pretty instrumental in me creating the M4wk web site in pure CSS.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.w3schools.com/css/default.asp"&gt;W3 Schools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://alistapart.com/article/journey/"&gt;A List Apart&lt;/a&gt;&lt;/p&gt;</content><category term="posts"/><category term="code"/></entry><entry><title>Goodbye Windows!</title><link href="/2003/09/09/goodbye_windows.html" rel="alternate"/><published>2003-09-09T06:00:00-04:00</published><updated>2003-09-09T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-09-09:/2003/09/09/goodbye_windows.html</id><content type="html">&lt;p&gt;Today I ordered my first new Mac in two years, a 1.6ghz PowerMac G5.  Also ordered a new 19" monitor and 512mb more RAM.  Should be pretty kick ass, I can barely keep myself off of the UPS tracking web site!&lt;/p&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>More Weight Reduction</title><link href="/2003/08/07/more_weight_reduction.html" rel="alternate"/><published>2003-08-07T06:00:00-04:00</published><updated>2003-08-07T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-08-07:/2003/08/07/more_weight_reduction.html</id><content type="html">&lt;p&gt;Removed the passenger airbag, front three airbag sensors, and a majority of the associated wiring.  Cannot get to the diagnostic module or the center sensor, because they are under the dash. Removed the air-bag light from behind the guage pod.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Miata" src="/assets/photos/miata/miata_skull.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Painted the lip spoiler PT White (from &lt;a href="https://www.apstowerpaint.com/"&gt;Tower Paints&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Miata White Lip" src="/assets/photos/miata/miata_white_lip.jpg"&gt;&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Setting up Keyed SSH Connections</title><link href="/2003/06/19/keyed_ssh.html" rel="alternate"/><published>2003-06-19T06:00:00-04:00</published><updated>2003-06-19T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-06-19:/2003/06/19/keyed_ssh.html</id><summary type="html">&lt;p&gt;These are notes for creating a one-way connection.  For our purposes, the machine you are connecting &lt;em&gt;from&lt;/em&gt; is referred to as the "local" machine, and the machine you are connecting &lt;em&gt;to&lt;/em&gt; is referred to as the "remote" machine.&lt;/p&gt;
&lt;p&gt;These steps work fine even if the usernames on the "local" and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are notes for creating a one-way connection.  For our purposes, the machine you are connecting &lt;em&gt;from&lt;/em&gt; is referred to as the "local" machine, and the machine you are connecting &lt;em&gt;to&lt;/em&gt; is referred to as the "remote" machine.&lt;/p&gt;
&lt;p&gt;These steps work fine even if the usernames on the "local" and "remote" machines are different.&lt;/p&gt;
&lt;h2 id="generate-keys-on-local"&gt;Generate keys on local&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Change to the ~/.ssh directory on the "local" machine  &lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;ssh-keygen -t dsa&lt;/code&gt; once  &lt;/li&gt;
&lt;li&gt;This should make two files, a public key &lt;code&gt;id_dsa.pub&lt;/code&gt; and a private key &lt;code&gt;id_dsa&lt;/code&gt;.  &lt;/li&gt;
&lt;li&gt;Then make a copy of the public key with the "local" hostname, for example:  &lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cp&lt;span class="w"&gt; &lt;/span&gt;id_dsa.pub&lt;span class="w"&gt; &lt;/span&gt;dev.id_dsa.pub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="move-public-key-to-remote"&gt;Move public key to remote&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Copy the "local" public key to the "remote" ~/.ssh directory, one way or another. For example:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;scp&lt;span class="w"&gt; &lt;/span&gt;dev.id_dsa.pub&lt;span class="w"&gt; &lt;/span&gt;nstilwell@test:~/.ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Now you see why we renamed the key?  So as not to overwrite the "remote" machine&lt;code&gt;s public key, so we don&lt;/code&gt;t get confused ;)  I am unsure how important this is.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="makeupdate-authorized_keys2-on-remote"&gt;Make/update authorized_keys2 on remote&lt;/h2&gt;
&lt;p&gt;Append the public key from "local" to the end of ~/.ssh/authorized_keys on "remote". For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;dev.id_dsa.pub&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;authorized_keys2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="set-permissions"&gt;Set permissions&lt;/h2&gt;
&lt;h3 id="ssh"&gt;.ssh&lt;/h3&gt;
&lt;p&gt;The ~/.ssh directories on both machines should be available (drwxr-xr-x):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="keys"&gt;keys&lt;/h3&gt;
&lt;p&gt;Private keys and the authorized_keys2 file need to be private (-rw------):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;local&lt;/strong&gt;  -&amp;gt;  &lt;code&gt;chmod 600 ~/.ssh/id_dsa&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;remote&lt;/strong&gt;  -&amp;gt;  &lt;code&gt;chmod 600 ~/.ssh/authorized_keys2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>Clemson Autocross</title><link href="/2003/05/25/clemson_autocross.html" rel="alternate"/><published>2003-05-25T06:00:00-04:00</published><updated>2003-05-25T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-05-25:/2003/05/25/clemson_autocross.html</id><summary type="html">&lt;p&gt;Bought and had installed 205/50-15 Falken Azenis with 15x6.5 Konig Heliums in bronze. Added a front lip spoiler (scrape!) from Trussville Maza. Probably the most comfortable addition is the 330mm Isotta “Monte Carlo” steering wheel.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cone Eater" src="/assets/photos/miata/cone_cob_pipe.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The Miata ran near-perfect at the recent Clemson Autocross, less than two seconds …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bought and had installed 205/50-15 Falken Azenis with 15x6.5 Konig Heliums in bronze. Added a front lip spoiler (scrape!) from Trussville Maza. Probably the most comfortable addition is the 330mm Isotta “Monte Carlo” steering wheel.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cone Eater" src="/assets/photos/miata/cone_cob_pipe.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The Miata ran near-perfect at the recent Clemson Autocross, less than two seconds from fastest time of the day.  The Falkens really hook up well.  Ran with the AGXs at 4F, 6R.&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Weight Reduction</title><link href="/2003/03/24/weight_reduction.html" rel="alternate"/><published>2003-03-24T06:00:00-05:00</published><updated>2003-03-24T06:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-03-24:/2003/03/24/weight_reduction.html</id><summary type="html">&lt;p&gt;Finally my Miata has the suspension I've been lusting after.  KYB AGX 8-way adjustable shocks bought new off of eBay.  Dealer Alternative (Flyin' Miata) springs and sway bars off of Dave's Miata.  Dropped her about 1 1/2" and really stiffened up the ride.  I did have to remove the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Finally my Miata has the suspension I've been lusting after.  KYB AGX 8-way adjustable shocks bought new off of eBay.  Dealer Alternative (Flyin' Miata) springs and sway bars off of Dave's Miata.  Dropped her about 1 1/2" and really stiffened up the ride.  I did have to remove the front fender liners, and bend back the fastener tabs, to prevent rubbing.&lt;/p&gt;
&lt;p&gt;New alignment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Front -1.0 camber, 0 toe, maximum caster&lt;/li&gt;
&lt;li&gt;Rear -1.5 camber, -1/8 toe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changed and bled the brake fluid with Valvoline Synpower.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Miata" src="/assets/photos/miata/miata_640x480_rear.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Removed the charcoal canister and windshield washer fluid pump and associated hardware.  Plugged the valve cover return and manifold line from the canister.&lt;/p&gt;
&lt;p&gt;48,000 miles changed oil and filter, Mobile One Synthetic 5w-30 and Mazda OEM filter.&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>Three month in the Miata</title><link href="/2003/01/20/miata_three_months.html" rel="alternate"/><published>2003-01-20T06:00:00-05:00</published><updated>2003-01-20T06:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-01-20:/2003/01/20/miata_three_months.html</id><summary type="html">&lt;p&gt;Last year, for my birthday, I sold my 2002 Nissan SE-R Spec V and picked up a low-mileage 1994 Mazda Miata. The plan was to have a more-nimble autocross car, with cheap(er) insurance, cheaper parts, that was easier to work on.&lt;/p&gt;
&lt;p&gt;Right away I set about tinkering with her …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last year, for my birthday, I sold my 2002 Nissan SE-R Spec V and picked up a low-mileage 1994 Mazda Miata. The plan was to have a more-nimble autocross car, with cheap(er) insurance, cheaper parts, that was easier to work on.&lt;/p&gt;
&lt;p&gt;Right away I set about tinkering with her.  The previous owner had put a couple little bling items on her and removed the front baby teeth.  The aftermarket grill was heavy and broken, so it was removed.  The wheel/tire package was made up of 16" Konig Wildcards (heavy!) and 205/45-16 Toyo Proxes F24 (heavy and hard!).  A stainless Voodoo-like shift nob and stainless e-brake handle accented the interior. The stereo had been upgraded to a Kenwood in-dash CD player and a set of Infiniti Kappas in the doors.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Miata" src="/assets/photos/miata/miata_2002-JAN-17.png"&gt;&lt;/p&gt;
&lt;p&gt;I set about with lots of small changes.  I removed the rear baby teeth and replaced the e-brake handle with the factory black one (leaving the stainless button).  For Christmas the S.O. bought me a new antennae, a Hella Airhorn, and blanks for the now-removed sun visors.  I removed the spare, jack, trunk release cable, and some of the trunk liner and interior sound-deadening and carpet.  I sold the front turn signals and rigged up some lights and Gutter Guard to ghetto TSIs.  I even removed the driver-side door pull and replaced it with a strap from an old laptop bag.&lt;/p&gt;
&lt;p&gt;At 43,000 miles the ol' girl was switched to Mobile One 10w30 and a Purolator PureOne filter.  She shouldn't have to see dino oil ever again!&lt;/p&gt;</content><category term="posts"/><category term="motorsports"/></entry><entry><title>SquirrelMail and SSL</title><link href="/2003/01/08/squirrelmail.html" rel="alternate"/><published>2003-01-08T06:00:00-05:00</published><updated>2003-01-08T06:00:00-05:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2003-01-08:/2003/01/08/squirrelmail.html</id><summary type="html">&lt;p&gt;We decided to try out web-based mail in an attempt to finally get away from Lotus Notes.  We wanted something free and relatively open-source, specifically running off of Perl or PHP.&lt;/p&gt;
&lt;p&gt;I picked SquirrelMail because I have had previous good experience with it, and Horde/IMP required a whole lot …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We decided to try out web-based mail in an attempt to finally get away from Lotus Notes.  We wanted something free and relatively open-source, specifically running off of Perl or PHP.&lt;/p&gt;
&lt;p&gt;I picked SquirrelMail because I have had previous good experience with it, and Horde/IMP required a whole lot of re-compiling of PHP.&lt;/p&gt;
&lt;p&gt;In order to connect SquirrelMail to an IMAP/SSL server, I compiled stunnel
https://www.stunnel.org and ran the following command as recommended by the
SquirrelMail team:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/usr/sbin/stunnel -P/tmp/ -c -d 10143 -r mail.yoursite.com:993
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then placed this command in &lt;code&gt;/etc/rc.local&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This basically maps &lt;strong&gt;localhost:10143&lt;/strong&gt; to &lt;strong&gt;mail.yoursite.com:993&lt;/strong&gt; (the IMAP/SSL port), so that SquirrelMail can log in. SquirrelMail then just needs to be configured to connect to &lt;strong&gt;mail.yoursite.com:10143.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some settings notes for SquirrelMail:&lt;/p&gt;
&lt;p&gt;Use the Perl configuration script under &lt;code&gt;/opt/http/sqmail/config/conf.pl&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;SquirrelMail Configuration : Read: config.php (1.2.0)
---------------------------------------------------------
Server Settings
1.  Domain               : yoursite.com
2.  IMAP Server          : localhost
3.  IMAP Port            : 10143
4.  Use Sendmail/SMTP    : SMTP
6.    SMTP Server        : mail.yoursite.com
7.    SMTP Port          : 25
8.    Authenticated SMTP : false
9.    POP Before SMTP    : false
10. Server               : uw
11. Invert Time          : false
12. Delimiter            : detect
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To check if stunnel is running right&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ps -elf | grep stunnel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you don't see the process,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;restart: /usr/sbin/stunnel -P/tmp/ -c -d 10143 -r mail.yoursite.com:993
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="posts"/></entry><entry><title>Back from the Brink</title><link href="/2002/08/13/back_to_mac.html" rel="alternate"/><published>2002-08-13T23:57:00-04:00</published><updated>2002-08-13T23:57:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2002-08-13:/2002/08/13/back_to_mac.html</id><summary type="html">&lt;p&gt;I have decided what my next desktop computer will be. I've spent almost two years with my once top-of-the-line aluminum-sheathed Windows 2000 box.&lt;/p&gt;
&lt;p&gt;Apple is stealing me back. Those new dual-processor beasties bring a tear to my eye. Of course, I have to wait at least another year before I …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have decided what my next desktop computer will be. I've spent almost two years with my once top-of-the-line aluminum-sheathed Windows 2000 box.&lt;/p&gt;
&lt;p&gt;Apple is stealing me back. Those new dual-processor beasties bring a tear to my eye. Of course, I have to wait at least another year before I can afford one... by then they should really kick butt!&lt;/p&gt;
&lt;p&gt;Why? Windows is a pain, and I don't trust Microsoft, especially with the licensing of WinXP. I will not be able to run Windows 2000 forever, and even if I wanted to, there are features of their latest service-pack that make Win2k surprisingly similar to WinXP, at least where their more dubious practices are concerned.&lt;/p&gt;
&lt;p&gt;This evening, about an hour ago, Windows 2000 turned on "FilterKeys", which is an Accessibility feature that locks the keyboard if one key is pressed for too long. This is nice if, for instance, I was handicap in some way that I might mistakenly hold a key down that I didnt want to hold down, or maybe if a book or something fell onto the keyboard while I was away.&lt;/p&gt;
&lt;p&gt;The problem is, I specifically told Windows NOT to install any of the accessibility features when I ran the original install. Guess what. The feature activated, locking out my keyboard. Windows Help told me how to deactivate FilterKeys. In the Accessibility control panel. Guess what was not installed? The Accessibility control panel.&lt;/p&gt;
&lt;p&gt;Windows is crap, plain and simple. No thanks.&lt;/p&gt;
&lt;p&gt;Give me that single-button mouse, baby!&lt;/p&gt;</content><category term="posts"/><category term="ops"/></entry><entry><title>World of Warcraft</title><link href="/2002/08/12/warcraft.html" rel="alternate"/><published>2002-08-12T06:00:00-04:00</published><updated>2002-08-12T06:00:00-04:00</updated><author><name>Nathan Stilwell</name></author><id>tag:None,2002-08-12:/2002/08/12/warcraft.html</id><summary type="html">&lt;p&gt;Any one anticipating The World of Warcraft?&lt;/p&gt;
&lt;p&gt;I wasted far too much of my college years trying to level a character in a MUD... I don't ever plan on getting into something like that ever again. I live in a world already, I don't need to lose myself in a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Any one anticipating The World of Warcraft?&lt;/p&gt;
&lt;p&gt;I wasted far too much of my college years trying to level a character in a MUD... I don't ever plan on getting into something like that ever again. I live in a world already, I don't need to lose myself in a virtual one.&lt;/p&gt;</content><category term="posts"/><category term="gaming"/></entry></feed>