<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Darren Kopp - On Software</title>
    <link>https://darrenkopp.com</link>
    <description>Musings on software, technology, and life by Darren Kopp</description>
    <language>en-us</language>
    <copyright>Copyright 2024 Darren Kopp</copyright>
    <pubDate>Sun, 14 Jul 2024 21:50:09 +0000</pubDate>
    <lastBuildDate>Sun, 14 Jul 2024 21:50:09 +0000</lastBuildDate>
    <image>
      <url>https://darrenkopp.com/img/favicon256.png</url>
      <title>Darren Kopp - On Software</title>
      <link>https://darrenkopp.com</link>
      <width>256</width>
      <height>256</height>
    </image>

    
    <item>
      <title>Coding interviews are stupid (ish)</title>
      <link>https://darrenkopp.com/posts/2024/05/01/coding-interviews-are-stupid</link>
      <pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2024/05/01/coding-interviews-are-stupid</guid>
      <description>&lt;p&gt;I have, once again, &lt;a href=&quot;/posts/2013/04/19/Post-mortem-of-my-failed-interview&quot;&gt;failed an interview&lt;/a&gt; (probably).
I don’t actually know yet but if I were the interviewer I probably wouldn’t recommend moving the
candidate forward. Based on the hyperbolic title, you are probably guessing that I’m pretty salty about failing, but I’m not. I write &lt;a href=&quot;/posts/2013/05/28/Always-finish&quot;&gt;one of these reflection blog posts&lt;/a&gt; each time I fail an interview I care
about (fun fact: both were about the same company, enjoy the bonus round at the end). Now I’m writing one after experiencing a few years at a company that didn’t have any coding interviews (fun fact: I almost didn’t pass their interview process either).&lt;/p&gt;

&lt;p&gt;Now, I’m just as guilty about being on the coding interview bandwagon as everyone else. I’ve given
probably about a hundred of the same formulaic&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; interview that I just took. I’ve passed on most
of those candidates and I would have passed on me. I’ve also spent hours fixing code that had issues
directly stemming from not using the correct data structure/algorithm that I may not have had to
if we had been better at screening the employees during the interview process.&lt;/p&gt;

&lt;p&gt;So which one works better? From my small sample size and general mediocre statistics abilities, 
I’d say they are about the same. What I do know, however, is that for every 1-hour interview where
I evaluated if someone knew their data structures, I could have just taught them. Maybe they did 
know them already and just forgot because they haven’t used them recently. Math was one of my strongest
subjects in school but if you asked me right now to take a derivative of something I wouldn’t be able to.&lt;/p&gt;

&lt;p&gt;For some reason we think that someone needs to be able to whip out the solution to any random
problem that is space and time optimal within 40 minutes. Ok, that’s not necessarily fair (more
hyperbole, I know). I’m well aware that it’s often said that what’s more important is how you solve
the problem, not that you solve the problem, but in practice human biases will work against you
if you don’t get close to it working.&lt;/p&gt;

&lt;p&gt;If you’ve stuck around this far, you are probably curious about the question. Honestly, the question
is not interesting at all and I thought it to be perfectly reasonable (and was probably the first of two).
The reason I’m writing about all of this is because I woke up to the epiphany that the problem I failed
was a problem I solved a year ago.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Q: Assume that you have an infinite stream of data that is coming in from multiple threads in
an unordered fashion. Write the stream items to the console in order.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My actual problem, which took about a month, was that I needed to ingest all of the changes
from one or more tables in SQL Server as fast as possible. What I chose to do was hook into
the Change Data Capture functionality and simultaneously stream the data from CDC while scanning
the table for snapshots of the data. Now, while each of those go in sequential order, we need to
reconcile the two together depending on which we read first (ie if we get updates before snapshot,
we need to store them until we get the full row data and then send them). On top of that I then built
an in-memory transaction layer sitting on top of SQLite to optimize memory/disk usage to hit the
performance benchmarks I wanted.&lt;/p&gt;

&lt;p&gt;This literally checked off every box they were looking for (even the ones I missed) in the interview question.
&lt;strong&gt;Thread safety&lt;/strong&gt;: check. 
&lt;strong&gt;Lock primitives&lt;/strong&gt;: check.
&lt;strong&gt;Optimal Concurrency&lt;/strong&gt;: check.
&lt;strong&gt;Producer-consumer&lt;/strong&gt;: check.
&lt;strong&gt;Fault tolerant&lt;/strong&gt;: check.
&lt;strong&gt;Hashing&lt;/strong&gt;: check.
The code I wrote is ok at best, honestly. The greatest lie we have ever told ourselves is that we want greenfield projects because we won’t have to deal with legacy code, but legacy code is just greenfield code that is written under the duress of trying to solve the problem at the same time.&lt;/p&gt;

&lt;p&gt;So now, just as when I’m in an interview, I’m at a loss for the answer to the question at hand:
what should we do instead? I honestly don’t know but I do feel like we are stuck in a cargo-cult
mentality where we are just doing things becaues that’s what the big companies do, and if it works
for them it must be what we need to do. I understand the problems associated with hiring the wrong
people as well, which may well be the actual reason we are rightfully stuck with such fearful/timid
hiring practices.&lt;/p&gt;

&lt;p&gt;For now, I’ll just keep practicing for interviews until I successfully trick someone into thinking
that I know how to code and then secretely become one of the best employees they have ever had.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Bonus round!&lt;/strong&gt; I guess enough time has gone by (11 years!) that I can say that both of my failed
interview posts were from when I applied to StackOverflow. The first time I bombed out just as hard
as this interview. The second time, however, I went through 2 - 3 coding interviews (which I believe
that I passed), 1 interview with the product manager, and then finally an interview with David Fullerton
and Joel Spolsky. I completely bombed the interview with David Fullerton and I’m pretty sure that’s
what killed my application (but I can’t say one way or another).&lt;/p&gt;

&lt;p&gt;That interview, however, is the only interview that actually bothers me to this day. The question, 
which I’ve heard is a Facebook favorite, was “convert a decimal number to base negative 2”. 
This question, which is possible/doable in 40 minutes and more about the problem solving process than anything,
is the dumbest fucking question I have ever had and I don’t care what anybody else thinks. Every other
question I’ve had I’ve never had problems with because, like I’ve shown in this post, most everything
you’ll actually run into at some point. And yes converting numbers to other things (roman numerals, etc)
is a valid thing, but fuck that question and just waiting for you to eventually arrive at the
little trick to make it work.&lt;/p&gt;

&lt;p&gt;Because of my schedule, the interviews were stacked back-to-back, where they normally would not be
and I wouldn’t have actually ended up having the interview with Joel, which was so awkward because he
was a little late and so I was just sitting there on a spinning google hangouts waiting while my head
was still trying to process the question while knowing that I had completely bombed that interview
and the next interview didn’t matter, not actually knowing if it would happen or not.&lt;/p&gt;

&lt;p&gt;No hostility to any of those involved, but to this day I hate that question and it’s the only
question I’ve received that I would actually categorize as “gimicky.” RIP StackOverflow Careers.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;5 minutes on introductions, 40 minutes on the question, 10-15 minutes for questions. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Faster Lambda Http Performance when connecting to AWS Application Load Balancer</title>
      <link>https://darrenkopp.com/posts/2018/11/15/faster-lambda-http-performance-to-application-load-balancer</link>
      <pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2018/11/15/faster-lambda-http-performance-to-application-load-balancer</guid>
      <description>&lt;p&gt;My current project at &lt;a href=&quot;https://homesnap.com&quot;&gt;Homesnap&lt;/a&gt; involves breaking a monolith application into multiple microservices and part of that is moving a large amount of data to that new microservice by way of feeding the data through our new API.&lt;/p&gt;

&lt;p&gt;While I’m able to get reasonable throughput by firehosing the API with data from my machine, it simply doesn’t have enough throughput to move the volume of data necessary in any reasonable amount of time, so I decided to queue the data using Amazon’s Simple Queue Service (SQS) with a Lambda function being triggered from data being written to the Queue. In theory, this allows me to scale out the data ingestion using Amazon’s capacity rather than me finding more and more machines to run my import utility on.&lt;/p&gt;

&lt;p&gt;What I found, however, was that Lambda, with 80 concurrent executions sending 10 requests per batch, could barely outperform my single machine. My setup was pretty basic: a stateless, HTTP-based API behind an AWS Application Load Balancer (ALB); I would expect Lambda would achieve linear growth until the database’s resources were exhausted. So I began tinkering until I got the performance I was expecting.&lt;/p&gt;

&lt;h2 id=&quot;1-sticky-sessions&quot;&gt;1. Sticky Sessions&lt;/h2&gt;

&lt;p&gt;While I wouldn’t expect sticky sessions to be necessary (since my application is completely stateless), I wasn’t able to get reasonable performance from my machine or Lambda to my API through ALB without sticky sessions enabled. While this improved performance significantly on my machine, Lambda still suffered, so I kept digging.&lt;/p&gt;

&lt;h2 id=&quot;2-get-node-http-to-use-sticky-sessions&quot;&gt;2. Get node http to use sticky sessions&lt;/h2&gt;

&lt;p&gt;My Lambda function was just a simple node function that was using the node http functionality to send the requests to the API. However, unlike client-side javascript using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fetch&lt;/code&gt; API, the http library doesn’t automatically store / send cookies for the request. Thus, while sticky sessions were enabled, the Lambda function was never benefitting from those sticky sessions! Fixing this fact is fairly trivial, once you know what needs to be done.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
    When Lambda loads your node function, it executes your script once, but your exported handler function repeatedly until the process shuts down. We'll exploit this fact in the code snippet below.
&lt;/div&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// initialize our cookie to an empty array&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cookie&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[];&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sendRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;example.com&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// Pass our cookies to the request&lt;/span&gt;
                &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Cookie&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cookie&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// when we receive a response, store the cookies returned from the server into&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// our cookie variable. note that a cookie is a semi-colon delimited string of properties&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// but the only part we want to send up to the server is the first part.&lt;/span&gt;
            &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cookie&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;set-cookie&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sendRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;{ &quot;hello&quot;: &quot;world&quot; }&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The result? My function went from ~2,000 invocations per minute to ~9,500 invocations minute and the maximum duration of my function dropped from ~22 - 28 seconds to ~6 seconds. Additionally, I was able to reduce the number of docker images running in the cluster from 20 to 6 while sustaining the same throughput. All in all, everything is running faster with lower cost, which makes me happy.&lt;/p&gt;

&lt;p&gt;Hopefully this can help you if you are in a similar situation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The importance of computer science fundamentals</title>
      <link>https://darrenkopp.com/posts/2018/03/15/why-cs-fundamentals-are-important</link>
      <pubDate>Thu, 15 Mar 2018 22:09:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2018/03/15/why-cs-fundamentals-are-important</guid>
      <description>&lt;p&gt;Rob Conery has released a new book called &lt;a href=&quot;https://bigmachine.io/products/the-imposters-handbook&quot;&gt;The Imposter’s Handbook&lt;/a&gt; for those in the software industry who don’t have a strong background in computer science fundamentals. I haven’t read the book so I can’t comment on what it covers, but the concept has me reflecting on my own similar experience.&lt;/p&gt;

&lt;p&gt;While I did attend some university, I only finished about half of my computer science degree before I dropped out. At the time, I didn’t think I had missed out on anything because I had already taught myself everything I had encountered in school up until that point; I was always a semester ahead of my course work.&lt;/p&gt;

&lt;p&gt;I realize now that I was pretty close to the promised land of computer science because I had just hit Big-O notation though at the time I thought it was &lt;em&gt;completely pointless&lt;/em&gt;. At the time, I was somewhat correct, but looking back now I realize how wrong I was.&lt;/p&gt;

&lt;p&gt;This idea still resonates with many other self-taught developers though. The easiest place to see this is the criticism of technical interviews and their focus on rote data structure / algorithm questions. Often the counter-argument is “I don’t need to know this because I can just google it”, which is a fairly valid response.&lt;/p&gt;

&lt;p&gt;So why, exactly, should you care about computer science if you are already a good developer? Well, you don’t, to an extent. You can be a succesful developer, at least for a while.&lt;/p&gt;

&lt;p&gt;I was successful for years before I started diving deep into computer science on my own. I wasn’t some prodigy, I was just riding the &lt;em&gt;effective application of computer science&lt;/em&gt; through my use of a DBMS. In fact, a large number of developers can, and are, successful because those fundamentals are baked into the frameworks that they are using.&lt;/p&gt;

&lt;p&gt;At some point, though, you &lt;strong&gt;will start hitting scaling problems&lt;/strong&gt; as you continue to be successful. Often times, the scale may not be as much as you would like. Sometimes, it will happen because you finally land that big client.&lt;/p&gt;

&lt;p&gt;The classic example of this is you have a component that has some sort of double loop in it that works great with all of your existing clients who have a hundred items of something, and then you get that client who has a thousand, perhaps even ten thousand items, and everything suddenly starts falling over.&lt;/p&gt;

&lt;p&gt;This is why many companies focus on ensuring that developers have a good grasp of data structures, algorithms, and their space / time complexity analysis during the interview process; they have hit the point where they can’t scale further without doing things right. Furthermore, they can’t afford to have people writing code that, when released, will immediately fall over under load.&lt;/p&gt;

&lt;p&gt;So, if you’ve made it this far, I now make an appeal to you, reader. If you don’t have a strong background in computer science, start today. You don’t need it, but it can only make things better. Now is the greatest time to do such a thing because there’s never been better access to that information. Whether you &lt;a href=&quot;https://bigmachine.io/products/the-imposters-handbook&quot;&gt;read a book&lt;/a&gt;, take &lt;a href=&quot;https://www.coursera.org/specializations/data-structures-algorithms&quot;&gt;an online course&lt;/a&gt;, or read blogs, there’s a multitude of information out there for a reasonable price.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Conditional section rendering in ASP.NET MVC</title>
      <link>https://darrenkopp.com/posts/2016/03/01/conditional-section-rendering-in-asp-net-mvc</link>
      <pubDate>Tue, 01 Mar 2016 12:30:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2016/03/01/conditional-section-rendering-in-asp-net-mvc</guid>
      <description>&lt;p&gt;Recently I was working on reducing some redundancy in an ASP.NET MVC application and ran into an error when trying to conditionally render a section.
ASP.NET was not happy and gave me the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The following sections have been defined but have not yet been rendered for the layout page “~/Views/Shared/_Layout.cshtml”: “ProductionOnlyScripts”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On this layout page we have the following code.&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;@if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ApplicationConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsProduction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;@RenderSection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ProductionOnlyScripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I never expected that if I defined a section that MVC would require me to render it.
I can kind of understand why, but I disagree with this design decision.
Lets run down the options we have with sections in general.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@RenderSection(name)&lt;/code&gt; when the section has not been defined will throw an error. This is the &lt;strong&gt;right thing to do&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@RenderSection(name, required: false)&lt;/code&gt; when the section has not been defined will not throw an error. This is the &lt;strong&gt;right thing to do&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Not calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@RenderSection(name)&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@RenderSection(name, required: false)&lt;/code&gt; will throw an error if that section has been defined (as is what we have observed).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, the work around to this is simple: we render the section to nothing.&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;@if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ApplicationConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsProduction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;@RenderSection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ProductionOnlyScripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;RenderSection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ProductionOnlyScripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteTo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TextWriter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the end, ASP.NET is tracking the section fragment and ensuring that we are writing out it’s contents.
What it doesn’t know is that we are just writing that to /dev/null effectively so that the content will
never make it’s way to the browser.&lt;/p&gt;

&lt;p&gt;This can be extended as well into an extension method if you find yourself doing this often.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Always learn something from an interview</title>
      <link>https://darrenkopp.com/posts/2016/02/25/always-learn-something-from-an-interview</link>
      <pubDate>Thu, 25 Feb 2016 12:02:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2016/02/25/always-learn-something-from-an-interview</guid>
      <description>&lt;blockquote class=&quot;jumbotron&quot;&gt;
    &lt;p&gt;The only real mistake is the one from which we learn nothing.&lt;/p&gt;
    &lt;small class=&quot;pull-right&quot;&gt;&lt;cite&gt;John Powell&lt;/cite&gt;&lt;/small&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s make one thing clear: &lt;strong&gt;being a candidate in an interview is hard&lt;/strong&gt;.
Over your career you will likely participate in many interviews as a candidate, and I can assure you that you likely won’t pass every single one.
You aren’t alone here, I myself am no &lt;a href=&quot;/posts/2013/04/19/Post-mortem-of-my-failed-interview&quot;&gt;stranger to failed interviews&lt;/a&gt;.
You can, however, make sure that you are getting something out of every single interview: a new job, exposure to a new problem,
a new way to solve a problem, or a better understanding of a problem.&lt;/p&gt;

&lt;p&gt;As I have been interviewing candidates recently for a
&lt;a href=&quot;http://careers.stackoverflow.com/jobs/108465/growing-profitable-startup-seeks-full-stack-devresults&quot;&gt;software engineer position&lt;/a&gt;
at &lt;a href=&quot;https://devresults.com&quot;&gt;DevResults&lt;/a&gt;, I’ve been thinking about what I would do if I had been the candidate in these interviews
and I’ve compiled my current thoughts into a few general tips.
Some of these are technical interview specific, but the majority are generally applicable to all interviews in general.&lt;/p&gt;

&lt;h3 id=&quot;failing-a-problem-is-an-opportunity-to-learn&quot;&gt;Failing a problem is an opportunity to learn&lt;/h3&gt;

&lt;p&gt;One interview I participated in I was asked to return all permutations of a string.
At the time, I had never had to do something like this, and needless to say I didn’t do well on it.
After the interview I took the time to really understand the problem and strategies for generating permutations in general,
mainly to ensure I wouldn’t ever fail that question again.&lt;/p&gt;

&lt;p&gt;Fast-foward to last year, I found myself in a scenario where I did in fact need to generate all possible permutations for a set of data.
It made me really appreciate that I had been exposed to that problem in the past from the interview and it was pretty trivial to apply what
I had learned to solve the problem.&lt;/p&gt;

&lt;p&gt;Most of the time, however, you’ll probably see something you’ve encountered before, or some variation of a known problem.
In scenarios like these, there’s often multiple ways to approach a problem and if you didn’t quite get it, the interviewer may explain
the solution to you or you can ask what the solution is.
If you are able to get the solution to the problem, &lt;strong&gt;definitely take the time later to make sure you understand the solution and why it’s the right solution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you actually got the solution, but in a non-optimal way (perhaps your solution had poor runtime performance or poor memory usage),
be sure to &lt;strong&gt;note the problems your algorithm had and research solutions&lt;/strong&gt; that address those issues.&lt;/p&gt;

&lt;h3 id=&quot;ask-for-feedback&quot;&gt;Ask for feedback&lt;/h3&gt;

&lt;p&gt;Don’t hesitate to ask for feedback or suggestions on how you did in an interview, but keep your &lt;strong&gt;question focussed on your performance&lt;/strong&gt;.
A lot of the time, you won’t get a response for various reasons like company policy prevents the interviewer from giving any feedback to you.
Any feedback you are able to get, however, can be very important.&lt;/p&gt;

&lt;p&gt;Every interview I conduct I block off an hour and a half which is broken into three parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The first 10 - 15 minutes I go over the job description and get to know a little more about the candidate&lt;/li&gt;
  &lt;li&gt;The next 45 minutes is dedicated to the candidate answering technical questions&lt;/li&gt;
  &lt;li&gt;The remaining 30 minutes is open question time for the candidate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vast majority of the time candidates spend about 10 - 15 minutes asking the usual questions like what kind of source control we use, how we do deployments, etc.
The other day, howerver, one candidate took full advantage of this time, which I always explicitly say is open Q&amp;amp;A.
The candidate asked for feedback on their resume, how well they were communicating while they were coding,
how well I could understand them (they were a non-native english speaker), and many other questions.&lt;/p&gt;

&lt;p&gt;The insight was extremely valuable for them personally and likely not something any company policy would bar.
Before and after each interview, &lt;strong&gt;think critically about what things you struggle with&lt;/strong&gt; and try to get feedback from the interviewer on how they think you did in those regards.
This will help you do better in all subsequent interviews.&lt;/p&gt;

&lt;h3 id=&quot;the-only-way-to-get-better-at-interviewing-is-to-do-interviews&quot;&gt;The only way to get better at interviewing is to do interviews&lt;/h3&gt;

&lt;p&gt;This seems like common sense advice, but it really is true.
If you are having a hard time with interviews, you just need to do more of them.
Generally, people only apply to companies or jobs that they are &lt;strong&gt;really interested in&lt;/strong&gt; and waiting to apply to other positions
that they would &lt;strong&gt;likely be happy with but definitely not their first choice&lt;/strong&gt;.
This is fine, but it can be really demotivating when you don’t make the cut for positions you are really interested in.&lt;/p&gt;

&lt;p&gt;When I’m job searching, I tend to take a balanced approach and apply to both types of positions, which allows me to practice
interviewing and reduce risk of failing an interview with someplace I really want to work at just because my nerves got to me.
It would be unethical to waste someones time by applying to positions you wouldn’t ever want though,
so &lt;strong&gt;only apply to jobs you can see yourself being happy in&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The last time I went through the hiring process it actually became a little complicated in the end because I ended up
facing a situation where I would have to choose between a job I thought I would really like and a position that when
I had originally applied I thought I could be happy with but I knew I really wanted after I had met the people involved
and learned more about the mission / vision.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Making posh-git more humane by improving the color scheme</title>
      <link>https://darrenkopp.com/posts/2014/07/12/making-posh-git-more-humane</link>
      <pubDate>Sat, 12 Jul 2014 19:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2014/07/12/making-posh-git-more-humane</guid>
      <description>&lt;p class=&quot;jumbotron&quot;&gt;
	Out of the box, posh-git uses a red color that's a bit hard to read against most background colors.
	All hope is not lost, because it's very easy to fix.
&lt;/p&gt;

&lt;p&gt;The console on windows has some named colors built-in and posh-git is configured to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DarkRed&lt;/code&gt;. While we can’t
change the named color that PoshGit uses, we can change the color that the console displays. To do this, simply &lt;strong&gt;right-click
on the powershell icon&lt;/strong&gt;, then &lt;strong&gt;select properties&lt;/strong&gt; from the drop down menu.&lt;/p&gt;

&lt;p&gt;It should be pretty clear which color in the row of colors is dark red, but if it isn’t then it is the &lt;strong&gt;fifth color 
from the left&lt;/strong&gt;.&lt;/p&gt;

&lt;div class=&quot;text-center&quot;&gt;
	&lt;img src=&quot;/assets/2014-07-13-console-properties-dark-red-position.png&quot; title=&quot;Position of the dark red color in the console properties window&quot; width=&quot;665&quot; height=&quot;337&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Once you select the dark red color, you can the selected color values to a more humane color. As can be seen in the
screenshot, I’ve chosen a salmon color (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;R: 255&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G: 154&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B: 154&lt;/code&gt;) which goes well with my black color. 
Now, likely you’re still on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Screen Background&lt;/code&gt; and the console background has changed to a salmon color, so just 
remember to &lt;strong&gt;re-select the previous background color before you hit Ok&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s it. Now hopefully you’ll have a more humane posh-git experience.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>libsassnet nuget packages</title>
      <link>https://darrenkopp.com/posts/2014/05/26/libsassnet-nuget-packages</link>
      <pubDate>Mon, 26 May 2014 19:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2014/05/26/libsassnet-nuget-packages</guid>
      <description>&lt;p&gt;I just released two new nuget packages: 
&lt;a href=&quot;http://www.nuget.org/packages/libsassnet/&quot;&gt;libsassnet&lt;/a&gt; and 
&lt;a href=&quot;http://www.nuget.org/packages/libsassnet.Web/&quot;&gt;libsassnet.Web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A while ago &lt;a href=&quot;/posts/2013/07/21/ASPNET-MVC-plus-Sass-equals-love.html&quot;&gt;I blogged about the state of Sass support&lt;/a&gt;
in ASP.NET. Since then, a lot has changed: Sass hit version 3.3, libsass has become extremely popular,
and Visual Studio 2013 now has support for Sass built in.&lt;/p&gt;

&lt;p&gt;Unfortunately in the case of NSass, it hasn’t been updated in over a year. For that reason, I’ve
been porting most of the functionality over to libsass-net, and the nuget packages and ASP.NET
integration has been a glaring whole in that project for a while.&lt;/p&gt;

&lt;h3 id=&quot;pre-requisites&quot;&gt;Pre-requisites&lt;/h3&gt;

&lt;p&gt;Since libsass is a C++ project, you’ll need to make sure you have the Visual C++ Redistributable
installed. I’m not a C++ expert, so I’m not sure if the latest version works or if you need
the 2012 version.&lt;/p&gt;

&lt;h3 id=&quot;integrating-with-systemweboptimization&quot;&gt;Integrating with System.Web.Optimization&lt;/h3&gt;

&lt;p&gt;Integrating with the System.Web.Optimization project is very simple with libsass.
Below is an example configuration:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sass&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SassBundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;~/content/css&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;basePath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;~/sass&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;~/sass/app.scss&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;~/sass/fonts.scss&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;bundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Ignoring SignalR in NewRelic</title>
      <link>https://darrenkopp.com/posts/2014/05/07/Ignoring-SignalR-in-NewRelic</link>
      <pubDate>Wed, 07 May 2014 19:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2014/05/07/Ignoring-SignalR-in-NewRelic</guid>
      <description>&lt;p&gt;We just started using &lt;a href=&quot;http://newrelic.com&quot;&gt;NewRelic&lt;/a&gt; at work and I’ve really been digging it. 
We also use &lt;a href=&quot;http://signalr.net/&quot;&gt;SignalR&lt;/a&gt; which (by design) can use long-polling connections. 
Unfortunately, those tend connections to skew the metrics in NewRelic.
Fortunately, &lt;a href=&quot;https://www.nuget.org/packages/NewRelic.Agent.Api/&quot;&gt;NewRelic provides an API&lt;/a&gt; to ignore certain transactions, 
so I thought I’d be able to tell it to just ignore signalr.&lt;/p&gt;

&lt;p&gt;At first, I tried &lt;a href=&quot;http://stackoverflow.com/a/13499306/77&quot;&gt;this answer on StackOverflow&lt;/a&gt;, 
but it ended up ignoring &lt;em&gt;all&lt;/em&gt; requests, not just the ones for SignalR. 
In the end I had to use an Owin module to get the job done.&lt;/p&gt;

&lt;p&gt;Here is the code I ended up with&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Collections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Collections.Generic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;AppFunc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;NewRelicIgnoreTransactionOwinModule&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AppFunc&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_nextAppFunc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NewRelicIgnoreTransactionOwinModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AppFunc&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nextAppFunc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;_nextAppFunc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nextAppFunc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;TryGetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;owin.RequestPath&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IndexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;signalr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StringComparison&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OrdinalIgnoreCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;NewRelic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Agent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NewRelic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IgnoreTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_nextAppFunc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To use this in your owin startup code call the following&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NewRelicIgnoreTransactionOwinModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Skill Atrophy</title>
      <link>https://darrenkopp.com/posts/2014/04/07/Skill-Atrophy</link>
      <pubDate>Mon, 07 Apr 2014 12:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2014/04/07/Skill-Atrophy</guid>
      <description>&lt;p class=&quot;jumbotron&quot;&gt;
  Just like a muscle technical skills can and will diminish over time
  if you don't take the time to regularly practice them.
&lt;/p&gt;

&lt;p&gt;About 8 years ago I took a C++ course at Weber State University and everything
was great. I had just finished my C course, so C++ was &lt;em&gt;fairly straightforward&lt;/em&gt;
and I didn’t have any problems with the language. I was even able to teach
myself C# using what I learned from C and C++ and have been using C# ever since.&lt;/p&gt;

&lt;p&gt;Since that time, I have not written any C/C++ code. Zilch. That is, until just
recently when I needed to write some C++ code for
&lt;a href=&quot;https://github.com/darrenkopp/libsass-net&quot;&gt;libsass-net&lt;/a&gt; that would add support
for generating sourcemap files. I didn’t even need to really write any code,
just hook into the existing code. Needless to say, it wasn’t that simple.&lt;/p&gt;

&lt;h3 id=&quot;problem-after-problem&quot;&gt;Problem after problem&lt;/h3&gt;

&lt;p&gt;Before I was even able to get started coding, I had already hit a problem after
pulling the latest changes from &lt;a href=&quot;https://github.com/hcatlin/libsass&quot;&gt;libsass&lt;/a&gt;.
The compiler kept complaining about a method named UNICODE, but I couldn’t
figure out what the problem was. The only hint I had was that Visual Studio was
highlighting this method differently than all the other methods.&lt;/p&gt;

&lt;p&gt;After a while I finally figured out that a configuration setting in my project
file was telling Visual C++ that I wanted to use Unicode strings, so there was a
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#define UNICODE&lt;/code&gt; being emitted by the compiler. I believe I may have found the
solution quicker if I had been more familiar with the toolset.&lt;/p&gt;

&lt;p&gt;Throughout the process of trying to figure out &lt;strong&gt;why things weren’t working&lt;/strong&gt; I
found myself having a hard time understanding what most of the code was actually
doing. C++ is a very powerful and very terse language; I found myself struggling
to keep track of all the symbols that were in front of me. I was lost in a world
of template methods, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;void *&lt;/code&gt; pointers, and lots of other features I vaguely
remember.&lt;/p&gt;

&lt;h3 id=&quot;keeping-up-to-date&quot;&gt;Keeping up to date&lt;/h3&gt;

&lt;p&gt;For me, I have decided that I should spend a little time to maintain at least
a reading level of the various languages that I have learned over the years.
I know that I won’t be able to easily maintain a fluency level in all the
languages I have learned because I won’t be writing in them daily, but I can
at least retain some of my skill set by reading other people’s code.&lt;/p&gt;

&lt;p&gt;In fact, I think by maintaining the libsass-net project, I am in an ideal
situation: I am required to write a minimal amount of C++ and need to have at
least a minimal reading comprehension of the language. Hopefully I’ll be able to
keep my skills somewhat up-to-date without having to go overboard and force
myself to make my own project to practice.&lt;/p&gt;

&lt;p&gt;Regardless of how you approach the problem, &lt;strong&gt;be aware of the skills that you are
letting atrophy and take the time to practice them&lt;/strong&gt; if those skills are important
to you. If you do not, you may find yourself in a similar situation to my own,
and it’s not the most pleasant place to be.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Slides from my Utah Code Camp session</title>
      <link>https://darrenkopp.com/posts/2014/03/15/Slides-from-my-Utah-Code-Camp-session</link>
      <pubDate>Sat, 15 Mar 2014 07:00:00 +0000</pubDate>
      <author>darren@darrenkopp.com (Darren Kopp)</author>
      <guid>https://darrenkopp.com/posts/2014/03/15/Slides-from-my-Utah-Code-Camp-session</guid>
      <description>&lt;p&gt;I had the pleasure of presenting a session on &lt;a href=&quot;http://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; for &lt;a href=&quot;http://utahcodecamp.com/&quot;&gt;Utah Code Camp&lt;/a&gt;.
It was a great event and I’m glad that I was able to participate! Below is the slide deck
for my session “Supercharge CSS with SASS”&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;495ebd508c91013162b85e7a2e8ee0d7&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;
&lt;/script&gt;

</description>
    </item>
    

  </channel>
</rss>
