Monday, March 23, 2020

The TDD Course for Beginners : Learn by Practicing 7 Katas

Learn how to do Test Driven Development using Ruby within 4 hours. You will get:

1. The transcript of the entire course in PDF.
2. TDD in Ruby ebook in PDF, Mobi and Epub formats
3. Members only TDD tutorial website that walks you through every exercise in the course.
4. Monthly Google hangout Q&A session that supports your learning objectives.
5. All the slides used in the course in PDF format.
6. TDD Course Tools Checklist for every sub-skill covered in the course.
7. TDD in Ruby Course Outline that was used to create the course.

How do I get access to the videos and all the above goodies?

For only $9 / month, you get my support and access to all of the above. Send me payment via Paypal to to get access today!


Jeff Casimir, Principal, Jumpstart Lab


The actual coding TDD examples for Fizz Buzz and Fibonacci were really well done
During the coding exercises the refactoring of code was a good illustration of how to improve certainty of test results
Good overview of the importance of testing
Each lecture / exercise was only 5-10 minutes providing nice incremental gains in the course


The instructor's delivery was not engaging - students tune out very quickly
First 61 minutes were very high level and included no actual coding
Instructors speaking voice was monotone and slow for the entire course no inflection, jokes, or anything to keep your attention
The audio between segments varied in quality to sometimes low quality not ideal for a $200 course
Instructor used whiteboard to write notes and diagram concepts during lecture (also wrote in cursive and at least 1 time wrote off viewable screen)


We wouldn't recommend it for Turing pre-requisite work, but could be valuable supporting material for students in the class.

Mylene Reiners

When you want a theoretical background on TDD, this course is great (and the Ruby part is not too hard for people knowing only a little Ruby...)

Yury Voloshin

This is a good introduction to TDD for those who either have never used it or who have a very rudimentary understanding of it. Some of the more advanced concepts toward the end are somewhat rushed through, but I' sure that can't be helped due to time constraints and to the nature of the material. At least now I know the topics that I need to into more deeply.


This course introduces a solid foundation for practicing TDD. The instructor definitely knows what he's teaching. Information is divided in small logical and understandable chunks/lectures.

Jesse Mignac

Techniques, examples and theoretical material. This course is a really nice start to TDD with Ruby

Andrew Platkin

Very good pace and learned alot

Thom Parkin

The beginning of this course seems a bit slow and very dry. But your patience is well rewarded because the depth and detail of information provided is priceless! Mr. Paranj uses a time-tested technique of methodical presentation of ideas, one built upon the other, to its ultimate success. I am grateful and impressed by this course.

Jikku Jose

I am very happy to have such a comprehensive course from Mr. Paranj. I have been trying to do TDD in my projects for quite sometime without much success. This course helped a lot to expose much of the concepts and details one should focus on while doing TDD.  I wish the examples mentioned in "Fake It till you make it" and "Triangulation" was a bit more involved rather than the basic ones presented so that the techniques could be better understood.  I thank Mr. Paranj and Udemy for the course, it really helped me. Hope more advanced Ruby related materials can be brought out.

Pawel Jackowski

Instructor knows TDD and explains it with ease. I am quite familiar with technique and just wanted to refresh knowledge and I still recommend course. I definitely learned something about common mistakes and importance of every step in TDD sequence. I enrolled for free.

Steve Freeman

Instructor uses katas very effectively to show the patterns behind TDD. His clear examples and pointers to material for further study were very helpful and I look forward to practicing katas on my own. If you're trying to make sense of TDD I highly recommend this class!

What are the requirements?

Basic programming skills
You need to have your favorite text editor installed on your machine
You need Ruby 2.0 or above installed on your machine.

What am I going to get from this course?

Do Problem Domain Analysis
Do Solution Domain Analysis
Design Test Cases
Write Tests First
Apply Canonical Test Structure when having difficulty in writing a test first.

Who is the target audience?

Beginners to Test Driven Development
You should already know how to write programs in Ruby
You should already know how to create an instance of a class and invoke methods.

Course Description

In this course you will learn the basics of Test Driven Development. You will learn how to do Problem Domain Analysis, Solution Domain Analysis, Designing Test Cases and Writing Tests First. Learn the Basics of Test Driven Development in Ruby using this Beginner Course. This course will take 4 hours to complete.

Practice skills using 7 katas

  • Use the downloadable checklists to guide you when coding
  • Learn 3 different techniques to do Test Driven Development
  • You can be more productive if you practice TDD at work. Companies that adopt Test Driven Development are great places to work.
The material used in this course is the result of feedback from students who attended my TDD bootcamps and tutorials. This is a course designed by a developer for developers.

The concepts are first explained in a presentation. Then a coding demo illustrates how to apply the theory in practice. At the end of the lesson an exercise is given to reinforce the material.

You will learn the following concepts:
  • Assertions
  • The structure of a test
  • TDD Cycle
  • Minimal Implementation
  • Starter Test
  • Story Test
  • Next Test
  • Refactoring
  • Obvious Implementation
  • Fake It Till You Make It
  • Triangulation
  • Hiding Implementation Details
You will be able to attend interviews for companies that demand TDD skills to get a six-figure salary. Complete with working files and code samples, you'll be able to work alongside the instructor and will receive a verifiable certificate of completion upon finishing the course. I have interviewed people and I have seen the common mistakes made by candidates.

Subscribe Now

For only $9 / month, you get my support and access to all of the above. Send me payment via Paypal to to get access today!

Tuesday, October 25, 2016

Rails and Draper Railscast Sample Code

To get the Railscast example code profile-before to work, change the Gemfile to lock the redcarpet version:

gem 'redcarpet', "~> 1.17.2"

Otherwise, you will get the error:

undefined method `new' for Redcarpet:Module

The newer version of Redcarpet requires new syntax to instantiate, refer:

To get the Railscast example code profile-after to work, use the following Gemfile:

gem 'rails', '4.2.4'
gem 'sqlite3'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', '5.0.4'
  gem 'coffee-rails', '4.1.0'
  gem 'uglifier', '2.7.2'

gem 'jquery-rails', '4.0.5'
gem 'redcarpet', '3.3.3'

gem 'draper', '2.1.0'

Otherwise, you will install the latest gems that is not compatible with the code.

Focus Question : Is the Draper version 1.4 compatible with Rails 4.x ?

Readme does not mention what Rails version is compatible with Draper 1.4. There is a clue in the Gemfile:

version = ENV["RAILS_VERSION"] || "4.0"

which means it must be compatible. Let's downgrade the Rails sample project to draper version from 2.1 to 1.4 and see if it works. Uninstall all versions of draper and lock the draper gem version to 1.4 in the Gemfile.

gem 'draper', '1.4.0'

The profile page still works. So it seems that draper 1.4 is compatible with Rails 4.x.

Ladder of Abstraction in Software

In the book Language in Thought and Action, Hayakawa discusses the Ladder of Abstraction. The ladder consists of several levels of abstraction, with the concrete things at the bottom and more abstract things at the top. The example he uses in the book is process level at the bottom, Bessie the Cow, Cow, Livestock, Farm assets, asset, wealth. One thing that is not emphasized is that each layer is from the perspective of someone. In the book example, the perspective is of someone who is a farmer, to a banker.

In software, certain concepts are at the topmost layer. For instance, Separate things that change from things that stays the same or Separate things that change at different rates. These principles are at the top and there are architectures like Layered Architecture and MVC that are at the lower layers of the abstraction layer. Similarly, concepts such as Program to an Interface is at the top and principles such as polymorphism, Open Closed Principle etc are below that level.

Domain Driven Design book is a great book. The problem is that it stays at the topmost layer of the abstraction layer for too long. For instance the chapter about domain model, shows an example at the very end of the chapter. A good explanation varies the abstraction levels within the same paragraph or even within a sentence. If the audience is familiar with the concepts, then it is ok to stay at a high level of abstraction. The book does have code samples in Java that makes the concept clear. Nothing is more concrete than showing code examples to illustrate the high level concepts.

The Ladder of Abstraction is a useful tool for writing. It can be used to organize the software development principles. We look for characteristics that are common among objects/concepts to go higher up the abstraction ladder. As we make the high level concepts concrete, we are adding context to the abstract concepts. By providing a context, the reader has a chance to see how it impacts their live. Explanation that shows a scenario that the reader has encountered in the past can make the abstract concept clear. Writers can use simile and analogy that fails in the ladder of abstraction to make things clear.

How does the Ladder of Abstraction relate to the Govin's Knowledge Vee diagrams? It would be interesting to compare them and see if we could get more insights into the way we perceive things in the real world.

Monday, October 24, 2016

The Usual Suspects in Troubleshooting Problems

Usual Suspects

1. Environment (Hardware and Software)
2. Code Issues (Bugs)
3. Data Issues (Corrupt or invalid data)
4. Software version compatibility issues. (Known issues).

Software Compatibility Matrix

Ideally we should create a Software Compatibility Matrix and write a script that will either pass or fail to enforce it. For instance, I was working with a custom testing framework written using Ruby, ChromeDriver to test the system from end to end using the browser. I had to spend almost an hour to find the cause of the problem. The workaround took just 5 minutes. It turned out that the latest version of Chrome broke the ChromeDriver. One hour could have been easily saved by creating a Software Compatibility Matrix that listed the versions of Mac OS X, Ruby, RVM, Chrome etc. This would state which versions are known to work with others without causing any problems. Any OS update that causes indirect update of any of the dependent software would be immediately caught by the script that enforces the software compatibility matrix for the custom testing framework.

When Rails is released, the compatible versions are usually specified in the release notes. This must be explicitly expressed in your project's software compatibility matrix. The usefulness will become obvious during minor/major upgrades to the gems and Rails. I had run into an issue where ActionMailer had locked the version of the depedent gem Mail to specific version that had a bug, it caused the rake script to crash everytime it tried to send an order confirmation email. The version of mail gem that had the bug fix could not be used because of the ActionMailer locking the version of the dependent gem. The only workaround was to set the SSL flag to true in the Rails configuration file.

Thursday, October 20, 2016

Update One Gem at a Time

For upgrade to major versions, it is better to update gems one at a time to resolve one issue at a time. Bundle commands:

bundle update gemname
bundle update ––source gemname


You Should Update One Gem at a Time with Bundler. Here’s How

Tuesday, October 18, 2016

Dumb RSpec Error

Why can't the dumb fucks provide a message that shows how to resolve the problem?

Stupid ass error:

Using `stub_chain` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead

Ideal Error:

You can use the new syntax to resolve this error:
allow(double).to receive_message_chain("") { :baz }

Monday, October 17, 2016

GoRuCo 2014 - How to Debug Anything by James Golick

ames call ok
I I O violinist
pictures things on so i know i James Hallock I everywhere online Twitter
get Hobbes Instagram freenode
my blog is James Bond dot com very easy to find online
and I work 24/7 see you can always reach me there
%ah hour for a company called
are copied hola G I we make a product called package cloud
where we do I apt yom and ruby gem repositories
as a service if you have a need for public or private
our package repositories or both I'm definitely check this out i'm talking if
you want to talk about packaging
I I would venture a guess that I'll probably get more excited
then anyone else in this room about talking about packaging
say this right I am somewhat of 10
programmer say this right and there's been a lot of talk on my
Twitter recently in on some blogs and stuff about whether we should stop
saying yes or
suggesting that we should stop saying this and I think it's important to
distinguish between
people say this and sorta a moment of frustration an outburst personal
frustration is what we do for a living can be very frustrating writers pressure
on you I ship something somethings broken
get frustrated you tweet something whatever and people
thrashing legitimately believe that everything is terrible right
I was gonna pull my i phone in my pocket right now but I'm not allow to happen on
and show you my iphone to be like I have a super computer in my pocket that can
literally some in nearly any media that was
ever created %ah via the air
that's not terrible that's fucking awesome right by
as much as I think that you're wrong if you legitimately believe that everything
is terrible
I think that you're probably at the very least naive and possibly being a little
bit disingenuous if you don't admit
that everything is broken and I don't mean that nothing works obviously
Softworks right but the reality is the software is Bobby units flaky and it's
on reliable
on despite our our best efforts to make it better om
and this actually makes sense right
were innovating really fast we
software like software engineering is a relatively new field we're still
figuring out how to do it
om and we really just haven't caught up with the
pace and innovation and growth in our industry and you know we're still
working on it right
so it makes sense that everything's broken and
as a result in everything broke it being broken when you get engineers together
in a room
our online wanna the big topics of discussion as always we're hiring right
better car
right how do we how do we actually had we produce software that's less
unreliable or less more reliable a rather that's that's more correct that
that works better the handles edge cases better
all these different techniques for doing that right there's
you now testing obviously very popular in the roomie world static analysis
I and then you know stuff like what IMRB was talking about this morning where r
are with new languages have more sophisticated type systems that are
capable of
more accurately expressing the constraints have up different units
inside of our programs
but one thing that we don't talk about that much
or lease in my opinion that we don't talk about enough he is how do we call
where and water what are the strategies for dealing with our software when it
doesn't work
whether it's our caller or so or someone else's code I since your day on Twitter
arm if you wanna play high quality software that performs
you should expected said text box at every level
there's a very simple reason why bugs exists at every level
and sell given enough time getting enough complexity
you're going to run into those bob's and either graphics on
or they're so many broken so
over the last few years arm I fixed
a buncha bogs in a bunch of diff out a bunch of different love the stock
obscene lots of bugs in my
my own code are but bob's in the room TV and bugs and not memory allocators my
see Paul kinda places I always get this question
people asking me like law how did you how did you find that but how do you go
about finding a bob
in a code base you're unfamiliar with how do you go about finding a bob
in a language that you don't know very well and
I realize over the years that the methodology I use for debugging
is always the same doesn't matter where in the sack I'm looking
are it doesn't matter what the language is it doesn't matter whether I even know
the language really
it's always the same methodology for debugging and it's very very simple so
that's what the stock is about
every good debugging session starts with this quote this this is a mantra among
so someone major boss maybe it's the user
maybe it's a friend com CEO
and they reported the fact in something
and you pull up the called the you think is the offender
and you stare at it air like honors house is possible this can't be possible
this can't be happening you reread the calling you
you read according to read over and over again try to understand how it's
you keep saying miss Wright reckon back that
cell by the way there's no room in the stock sell sorry but not sorry
arm so this is a true story about a debugging session that I engaged in
op a few years ago I'm from Toronto Canada
a friend from my hometown who was running a PHP site
I and he called me up one day he's not happy at all he had a staff
are are people who are working with them I know where they were at this time but
he called me up and he's like
hey my site is down
I am I got a call so why you just like your team to fix it
he's like while they're not here because I reasons
so he's like you know can you fix it
so I don't have a source cards I didn't know anything about the system never
seen the source code
never even really talk to any visible burns I
written in PHP I had written PHP maybe like five years ago
very little familiarity with the language I I did happen at SSH access to
his service to the had diagnosed
some other thing for him at some point %ah that was unrelated
on so
he's like acne fixin unlike I don't know I guess I can take a look
saw I S H in one of the servers arm and
Michael K walton's probably running PHP under Apache
so I'll take a look in the Apache error logs that's where I figured the PHP
error logs would be
and of course there's an nothing in there
right and it's funny because
you know you might think this is like for a worst-case scenario now that the
site is down there's nothing in Los
but the fact of the matter is that there's never anything in the logs
and even if there is something in the logs your be really lucky
it's useful I mean if the program knew I was broken
probably wouldn't be fucking broken right
saw call what now this is what I did
I knew the PHP code was probably executing in one of these apache process
is so I found a key ID for one does patty processors
then I ran a program called esterase are to attach that running program
and give me some debugging output if you're not familiar with as trace
s race is a program %ah that will give you a trace on all the system calls
the get executed by programming you attach it to you self-knowledge system
call is
system cost create the interface provide the interface between israel and
programs after the
kinda programs are probably most of us in here right most the time
are and any operating system cell system calls are are used for all kinds of
things like
writing to files are two sockets om or
allocating memory are all kinds of of has a service is essentially that
the operating system our provides user land
s frees up what looks like this well basically asked what s race does
very simple little program are is that it captures the system call information
are using a colonel API and then reconstructs
in ASCII taxed are those system calls to look like C function call so you have a
name the function
arguments in parentheses and he will sign and then whatever that that's a
small happens to return
in this case our writing to file descriptor one to standard output
from us up offer which is in this case a c-string says hi has a new line
character at the end of it
author argument to write his number bites to write for map of her to the
file descriptor
and then the return value is the number of bytes the government successfully
to that bob Corker
most the system calls that you're probably getting I
that they're probably gonna provide useful information to you when you're
debugging like a roomie program or something like that
are gonna have a really simple names like right or open
I'm or read up by if you get confused about us what a system calling is you
don't know what it's called by name summons have some like really really
obscure names that probably won't mean anything to you
om if you've never done this kinda programming for are there all documented
in section 2
the manual so it's really really easy to find them manned space to
and then the the name in the system call and most them are documented pretty well
I thought a lot of people how to use as trace I and this is usually wear a
condom falls down
so you attack as for some processing your like a rotten find bud
and then you get like and this is like it's really small small mouth bass race
out but I've seen many megabytes
as trace output for like a small number requests on a web server
I as you look at this and you're like wallet how do I do now
right but it turns out there's actually like a really really straightforward
of war finding the causes of problems in
as trace output the first step is
well for small yup always have to work backwards so work from the bottom
and and and go up the first up is to try to find where the failure is actually
being reported
so in this example this is Apache writing
a $500 HTTP response back to a socket socket number 12 presumably
om and so you know what you find here being reported that probably everything
beneath that
is not very interesting cuba's obviously the cause of the failure happened before
the failure got
our report right
and then work back up and usually if you're gonna find
the I because you're bob in the ashtray south but its Kenny relatively close
to where the air actually gets reported to the client or to wherever it's being
reported to you
cell in this case we work back up we find this feeling called open and
there's a
a file called bar slash WWW slash TV die I and %ah PHP
are that's missing and then we get a 500 error right afterwards
i sorry to form a hypothesis like maybe someone type of that file
I and they deployed bad Carter I doubt they added the code right on Sir I don't
really know how
on how that works by Tom
there's luxor a hypothesis form right as you can slowly work backwards from there
in the output
until you find something that looks like it may be the offender right
and so there's a just above that are a few you ought not to be green but
arm just before that feeling open call
others a successful open call to bar slash WWW
slash index of PHP arm
and so you can imagine you know you had dinner at the site eyepatch attempts to
load a file called index of PHP
which has a a typo including net on
and that's causing $500 that's a a sensible hypothesis for
hot what's causing this outage
then try to prove your hypothesis cell look at look and see in the
index of PHP file are we attempting is this does our hypothesis or a bar
did camp did the first test our hypothesis prove true
yes we are attempting to include something called TV tie-in Doki HP
then look to see if %uh files there is up I'll actually there maybe the
permissions were wrong
turns out that follows not there but there is a file called TV die I N C dot
cell that make sense someone there's bad back or on the server
that's what's causing the 500 error next up is to fix the Bob
and then you now feel good about yourself
cell I think that the total time
hot that it took me to fix is outed from the time that my friend Toronto called
until the time his I was back up once like three minutes
and I i felt pretty good about myself and that he was really impressed me was
like wow
how did you how did you do that right so Molokini
you know songs any flowers or anything but he seemed appreciative
I am I will like some flowers
by Tom
you know later that night I Sun reflecting on that debugging session I
was like why was that so effective but I never find bugs in my own code that
right like once my car something stupid like that takes me like an hour to find
or longer
right unlike searching through files try see the air
and I realize it's because when you comin to a debugging session with all
these assumptions
they usually lead you astray write your assumptions were right
you probably would have written the right code in the first place right and
then there wouldn't be a Bach
susser 0 through all of my formula for how to debug
anything which is forget everything you think you know kisses all rock
in the first row of follows from that which is to get
a third party opinion so if you don't now anything
if you're blind then you need to ask someone for help me to ask someone for
some information about what
actually happening as opposed to what you think is happening cuz
if what you thought was happening was right then there would be no bach
so in this example and and mostly in the stock I'm I'm talking about the
esterase it's very very useful extremely useful
for debugging programs on Linux it's like such a great first thing to look at
but there's a whole bunch of other ways to get third-party opinions
on this is a great diagram it's a little bit intimidating
on but a lot of the school's depending on what kinda thing you're trying to
IOC and you can be very very useful and there are a lot of them are worth many
of them are worth warning if not all of them depending on
what kinda software you actually right and try to debug gonna put the slides up
online so %ah
on see you good look at this I grant you want to know I am
there's also other ways getting third-party opinions for example if you
suspect that the but might be in the operating system
finding another program that does what your program a spa studio
and running out and see if you get the same behavior I might be where
of sorta making a first step toward confirming
I that its the bug is is in the operating system rather or in another
layer rather than in your programs that can be very
useful technique is wall I'm sure there are other ones that I haven't thought of
that I've never used before om
so next but i wanna talk about
I its kind available whether as a bug in in
RPM package Potter buggin in apt the other package manager
on this is this is an interesting debugging session that lasted
up way too long arm
it started when we had a customer who tried to install package lot repository
on the latest Ubuntu and I know if you can see is output by
aside many of those URL's arm are the three letters I G N which means ignore
which means that apt
couldn't find anything there the request failed something like that I think
knowing those files many these files are like critical files so that their
the package index wasn't working right as pat action ex is working on
every other version of Ubuntu every other version Debbie and we had gone
around testing on
on the latest Ubuntu yet so we're like pretty confuse
South ok after staring at our own code
completely useless Lee for a while up last race
and this is a different way invoking ashtray so that the last way that I
that that I showed in the last example I was attaching to an existing process
I with this this way if you can actually start a process underneath best race
I and get all of the output off from that process in the the output from this
was really long it was like a couple megabytes on soles lot to decipher
but using our trusty methodology I
work backwards to find a failure so this is that there this is apt
I am writing to standard output what we saw so ignore
and then this this is a local copy a package bottles like this local
RVM IP address but for three thousand rails app
I'm and then trustee which is the
the distribution and then the name of the file that
that app was failing to find so we started working back up from there
and we found this law right which looks like
I'll if you can't read it says read 6
and then a long string that says four hundred you are I failure
and then the you are eyes assigned s3 you are all that we redirect to those
impacts cloud
and then after that a new line and it says message call and bad header line
okay so it seems like s3 is
returning a 400 that's kind of odd wonder what's up there
try confirm the hypothesis and make a crawl request %ah to that same
that same exact signed as three or all and get back to 100
call so
here we have a case where what happens reporting seems disagree with what's
actually happening in
I don't have space for tennis lies we actually ran TCP down
which danse out all the network traffic from their request to confirm that app
was in fact receiving a two hundred on from from s3
saw what now wall
this is where things start to get a little bit more real and you have to
actually download the source for whatever you're trying to debug
I and try to figure out how that thing works and and where the problems
now this step is actually a lot harder then in my otherwise sound
arm knowing where to find the source for
packages that are installed on your system depending on what flavor of my
next or
whatever operating system you're using might be a little bit richer than it
sounds and I've had a lot of
our late nights and early mornings that were caused by
me thinking that i was debugging a version of this the source code that was
running on my computer but it turned out to not be
even remotely similar versions %ah
distributions like a job Red Hat for example
heavenly patch source code so the version number that is on the package
could be completely different from the actual source code
are that they compiled to build that package so like if you do an opus
open SSL version off from there there version the package version gets
installed from the
from the Red Hat on our vendor package repose
it will look vulnerable right now but it's actually not as they
maintain their own set of patches
if you're on a happy face distribution apt-get source
and then the name of the package one pack the actual source that was used to
create that exact packets on your system
%ah into your home directories this is really really useful
and it's worth knowing for whatever platform apply on
now app is like a lot of lines c plus plus
lot more lines than its not like is not conceivable that we could just
enter the source directory even if even here the best he was caught program in
the world in just find the bug you need to find
a starting point I in in that in that code especially if you're unfamiliar
with the card base and especially
if you're unfamiliar with the language cell
the key here is to locate some kinda hawk sometimes straying or sequence and
bites you think might be
on hardcoded into the source code so
in my case I was kinda guessing that this error message bad header line
was probably somewhere I in in the App Store scarred and that proved to be true
its containing a bunch of these translation files that a
that perform kinda like internationalization for apt solids
translated works in a much different languages and then it's also in this
c plus plus file
so this work is a little tricky especially if you don't know c plus plus
but the fact of the matter is if you can read it really matter programming I
would venture a guess
that with enough effort or with a a small amount of effort you can
a few C-plus class methods on
if you stare at this for long enough in it it did take us awhile
I you'll see that it's looking for malformed headers or what it believes
are malformed hatter's
now taking one step back from there when you first read this code you like Way
implement its own HTTP quiet that's kinda weird
turns out it does on and it turns out that the way that it processes headers
is a lot stricter than most other HTTP clients
probably because a lot of other HTTP clients have been made a lot more
relaxed over the years I've
you know the the protocol being so popular in lotsa
misbehaving HTTP servers in the wild but
absence so specific on that it HTTP parser is just way stricter than
everyone else
so basically with this is looking for is a header that its
that ATB headers are the name header a call in
the value of the header I and then a new line right
and this is looking for headers that have no value cell name
coal and and a new line
turns out if we look back at our crawl I
maybe you can see it there but there's a header an empty Hatter
the content-type header %ah that was causing this thing to trip up
and report this error
we fix it by actually selling content type on all 4s three resources which
is probably a good idea any way obviously call
somebody's fax:
sock roll till locate the correct source code
easier said than done I'm and you know for two points off on a platform
learn how to do that I you know it won't take that long to figure out
I and knowing knowing how to find the correct source code will will save your
I guarantee identify hardcoded string
I or some way some hot that you can use
are to find a starting point in the source code off from which to work
so this is really important because if you like I remember what house debugging
in MySQL
its now two million lines of code or something like that
if you have starting point not finding anything
if debugging is a fine all if we think about it like
customer acquisition final I think step for
is where probably most people drop out the final you know they come to some
call this written some language the half million where
there a roomie programmer I and the cop on Cincy
or some c plus plus by the reality is
that with another effort you can learn this stuff and it's really not that much
you know its its a lot a lot he's called basis especially if you follow like
a good methodology for for reading through them are not that hard to
understand particularly if you're trying to find
and understand some small you know defect in them
on you know I would I would I would encourage everyone
I to not to not to fall out the final here too
to you
to to dive into code bases in languages that they don't know
because that's how you learn lot of people ask me like
I where to start learning C or worse are learning about systems programming stuff
like that
and you know the answer is that debugging is there really really great
artist wanna get your feet wet in that stuff
hopefully get to the stop getting a step that's a good time to have a beer
I am fix whatever is broken so
those are my sub for how to debug anything I forget everything you now
get a third party opinion locate the correct source code
I'm identify hoc stare at the car rental make sense
maybe learn a new language in the process and then fix whatever is broken