In which I visit my inability to accept the nice.
I last wrote something in January 2019. I was in Pune, India at the time. It was a small and interesting entry in this on-going digest of my thoughts and feelings. But, I haven’t written one since. Why is that….
I think it’s because I have spent two years suffering from Imposter Syndrome. One would think that continuing to successfully train software developers in their craft would alleviate that; not so much. One would think that helping to establish an Academics department would alleviate that; not so much. One would think the ongoing thanks from folks would alleviate that; again, not so much.
In fact, I think all of that may have made it worse.
In which I learn something new about ECMAScript.
I was talking with some friends, today, that included content about a presentation I am thinking about creating on the destructuring feature in ECMAScript 2015. I showed the examples like these.
let [a, , c] = [1, 2, 3, 4, 5];
One of my friends is a C++ programmer. C++ programmers think differently than ECMAScript programmers. He asked, can you destructure an entry in an array into the entry of another array?
I had no idea. So, I tried it.
An update on Fang & Claw
I found this really great sign while in Shanghai. Lovers of words may like it, too.
I had some time between work and walking around Shanghai to work through the summaries of the main three characters in the story. If you’re interested in following along, you can check out the links.
WARNING: SPOILER ALERT!!
That’s right, you’ll know more about the story than you’ll want if you want to read the story fresh. So, there’s that.
I’m trying out the Snowflake method of writing, so this is Step 3 of the process. I completed them a couple of days ago. I’ve spent the time since thinking about this world that I’ve started creating, trying to answer the questions like
- What kind of world do Marty and Bakarne live in?
- What culture has emerged for them over the past millennium?
- How do they think and act and react to things?
I’ve decided that it will resemble what we have, no, in the early 20th century with, hopefully, enough differences to make it a unique culturescape. This is the hardest part for me on this deadline: world building a complete world.
Enough blah blah blah. Here are the links, if you want them. Again, if you read them, the story may unfold prematurely for you. Mind you, these aren’t static. They’ll probably change as I continue to develop the story. But, I (mostly) like where they’re at, so that’s a start. This may be the farthest I’ve ever made it into planning a novel. Yay!
Have feedback? You know how to get a hold of me. If you don’t know how to get a hold of me, then do not worry. I’ll publish some contact information later. I’ll probably just set up a GitLab repo to take feedback through the issue tracker.
Points of interest to me
I’ve redesigned the front page and made the entire mobile experience better for this site.
I also added content to the fiction page where I can start putting links for new content as it gets produced.
I don’t really know why I’m doing this. I’m kind of adrift with this whole project, anyway. Really, any project. I don’t have the urge to complete it, to start something new.
Maybe it’s time to become a full-time carpenter.
Far away from home with a lot to do
Well, I’m in China and don’t have a lot of time for anything, really. But, I did find out that the national firewall blocks all Google properties, which turns out isn’t that bad (unless you use Gmail and the like).
Unfortunately, it does block the CDNs that Google powers. The default hexo theme uses one of those CDNs. Therefore, it takes forever for my site to load. I dislike that. So, I’m putting together a new theme that looks nearly identical to the last. «shrug» What’s a boy to do?
This experience has really opened my eyes to Web programming for a global audience. So, no more of that Alphabet for my work…
Oh, all the permalinks still work, which is an interesting challenge in and of itself. So, hooray?
A note from the present about the past
Hi. I’m back. Not that it really means anything other than you may choose to read some more stuff of mine. Or, not. It’s fine by me either way.
I’ve been traveling a lot and thinking about what I should do with my life. Now that I’m an empty nester, just me in a big ol’ house, I can do things, other things, things that don’t have to put food in my kids’ mouths because their mouths are off on their own journies of adulthood.
The past two years have revealed a lot to me about who I am, what I can tolerate, and what I must run away from. I’ll probably write about all that, little by little.
I’ve moved the content from jekyll to hexo. So, if you find something broken, you can chalk it up to that.
In which I share my use of gulp-newer.
One day I say to you, “I have a large node.js project.”
“How large is it,” you ask with a slightly suggestive smirk on your face, with echoes of “That’s what she said” ringing quietly in the background.
I grimace because, quite frankly, I should have seen it coming. “My build time has exceeded 11 seconds, now.”
You gape at me increduously. “Node project? Are you sure you’re not programming C# in Visual Studio with build times like that?”
“Yeah. Node. Eleven seconds.”
“Dude,” you commisserate.
“What are you doing that takes that long?”
“I compile SASS, ES6 with babel, and minify some big client-side ECMAscript files. I do some other stuff, too, but that seems to take the most time.”
“And, that’s eleven seconds?”
You look at me. You just look at me. I hang my head in shame while we go off to the coffee shop.
In which I try this blog thing, again.
Since we last got together, it seems that 154 days have passed. That’s quite a long time, even between casual acquaintances. One might posit that such a long absence relegates us back to strangers.
Alas. Alack. Alas and alack. How melancholy. [melancholy]
Let me tell you about my entertainment choices for the past couple of days.
In which I write about my work with ES6
I really like ECMAscript. And, I continue to learn about it every time I write something new in it. Some friends and I want to make learning about the new version of ECMAscript available and approachable to folks that don’t have time to go out and do it themselves. With that, I announce the ongoing development of ES6 Walkthroughs.
In which I provide a link and reflection on Houston Techfest 2014
I went to Houston TechFest, today. If you stopped by my impromptu lunch-time presentation, I mentioned each of these topics:
- Douglas Crockford’s seminal talks on ECMAScript
- The current ECMAScript standard - ECMA 262 v5.1
- The upcoming ECMAScript standard - ECMA 262 v6
- The traceur transpiler
- node.js - server-side ECMAScript
- caniuse.com - a reference for browser support for advanced features
- WebGL - 3D graphics in the browser
For the first year, instead of presenting at the Houston TechFest, I sponsored it. Just me as my company curtissimo. I found an interesting reaction to my sponsorship as I sat with @bryanray in my unadorned booth:
That’s right. Most people came by to ask what I was selling. Or what I was trying to get from them. They didn’t understand that I just wanted to sponsor the TechFest because I really appreciate Houston TechFest.
And, now, I wonder about the implications of this. It seems to me that, for whatever reason, something this excellent only gets sponsored by companies trying to sell you something. And, that kind of sucks.
In which I revisit one of my favorite subjects: ReST over HTTP
data- attributes in HTML5 so servers could embed
application-specific information in the structural representation of a resource.
The IANA also provides a directory of meaningful link relationship types for use
in HTML documents. If we comply with ReST over HTTP, then we should use those to
the core tenets of ReST and our applications become difficult to maintain and
In which I complain about MSDN's downloads.
I wanted to download the ISO for Microsoft SQL Server from MSDN, today. I started the download from Safari on OS X. The download plateaued at 377 Kb/s. Um, WTF?
I have “high-speed” Internet. So, I fired up a Windows 8.1 VM in VMware Fusion. I started the download from IE 10. It plateaued at 2 Mb/s. Um, WTF?
I killed that download and went back to Safari. The download plateaued at 379 Kb/s.
I killed that download and went back to IE 10. The download plateaued at 2.4 Mb/s.
So, thanks, MSDN. Thanks for screwing my download experience.
In which I just kind of write some stuff of no great importance about agile on big projects.
Hi. It’s been a while, I know. Sorry about that. How’ve you been?
Me? Well, I’m still working my butt off on this project.
Yeah, that’s the one.
What’s changed since we talked last? Some more really smart people joined. Some really bad ones left. We’re just starting to hit our stride fully.
Yep, still agile. Big project agile. And -
No, “big project agile” does not mean “waterfall”, dork. Some people would probably argue that statement, especially in the so-called enterprise. As if big IT is the enemy of agility.
In which I laud @DevlinLiles, @eric_burcham, and @olsonjeffery for a great use of GitHub.
You can find the repository at https://github.com/DevlinLiles/JediTraining.
In which I use docco to document leslie-mvp.
In which I give instructions on static libraries for Allegro 5.
Allegro is a cross-platform, open-source, game-programming library, primarily for C and C++ developers. Version 5 represents a rethinking of the entire library and the documentation has suffered because developers write code. This post will help you get started with using static linking of Allegro libraries to circumvent distribution problems.
Currently, the Allegro Wiki has instructions to let you
- compile Allegro into Mac OS X Frameworks (follow the “Option 2” version of the instructions); and,
- compile Allegro into dynamic libraries
In both cases, you need to package those libraries with your application to ensure they run on machines that do not have Allegro (and supporting libraries) installed. Static linking, while creating larger executables and slower load times, ensures that the binaries you need travel within the executable.
In which I talk about a new grid I need to help build.
Work is crazy, these past few months. We bought a control set from one of those widget companies. That got us 80%+ of the way there. However, now we need a very special kind of control.
We need a grid that freezes columns on the left and right.
“What’s that?” you ask, astounded and bemused.
Yes, frozen columns on the left and right of the grid. Horizontal scrolling in the middle. Vertical scrolling moves the whole shebang.
This ain’t your grandmother’s grid.
In which I just watch movies.
Yep, taking the day off to watch some cinema. Or film. Or movies. Or talkies, whatever you care to call them. Be back tomorrow.
In which I talk about the inspiration and design of leslie-mvp.
My friend Philip accuses me of being one of a handful of people that likes Yahoo! User Interface. It’s true and I feel no shame. However, I had to just give up on mojito because it didn’t meet my needs for the Web application that I’m using. So, I decided to write my own dispatcher to make the use of express much easier. In this post, I will write about the influence of mojito on the design of leslie-mvp and the other stuff it does.
In which I write more about promises with RSVP.
In which I praise the use of promises with practical examples.
In which I ponder the benefit of forking revalidator.
When it first came out, I was a really big fan of flatiron. I made some contributions to some of the packages in flatiron. That was fun and nice. However, the more I used it, the less I agreed with its opinions. No big deal, right? Either suck it up and drive on or move onto another library or write your own.
That’s the way of open-source software. I like that ecosystem.
I still really like two of the flatiron libraries:
- A high-level, caching, CouchDB client for Node.js
- A cross-browser / node.js validator used by resourceful and flatiron. Revalidator has JSONSchema compatibility as primary goal.
I don’t use cradle because I wrote stork. No problem.
revalidator creates a library that mimics the JSON Schema specification to validate objects rather than JSON-formatted documents. That’s even nicer.
In which I briefly talk about developers as natural resources.
People are “renewable resources”. Just ask this guy.
Developers are not renewable resources. You use them up and they’re fried. You use them up and the word gets around that you use them up. No one wants to work for you. Training developers to your application, business, and ways of doing things costs lots of money.
I remind myself of this with something that U. Utah Philips said in his album “The Past Didn’t Go Anywhere”. He said it to a bunch of graduating students. I think every manager needs to remember it every day about his or her employees.
You are about to be told one more time that you are America’s most valuable natural resource. Have you seen what they do to valuable natural resources?! Have you seen a strip mine? Have you seen a clear cut in the forest? Have you seen a polluted river? Don’t ever let them call you a valuable natural resource! They’re going to strip mine your soul. They’re going to clear cut your best thoughts for the sake of profit unless you learn to resist, because the profit system follows the path of least resistance and following the path of least resistance is what makes the river crooked!
In which I decry this sentiment.
I just finished watching both seasons of “House of Cards” on Netflix. Admittedly, I didn’t watch-watch it; rather, I had it on the TV in my office while writing code over the weekend. However, I have can pay attention to both to a certain extent. I listened enough to feel bad: the anti-hero saddened me, the politics dispirited me. It reminded me too much of my current work environment but without the marble-lined scenery and the homicide.
Well, without the homicide, yet.
In which I ... react.
Ok, so, I feel like I’m embroiled in politics at work, sometimes.
Now, I’m watching Netflix’s House of Cards.
Kevin Spacey’s character feels thwarted in some of the episodes.
I can sympathize.
In which I reflect on the difficulty of a design decision in **stork**.
I wrote a little application in node with couchdb behind the curtain. I enjoyed the exercise and used nano by Nuno Job. That’s like building a Web application with the ASP.NET pipeline and ADO.NET: a really good exercise to understand the technologies in detail but I wouldn’t want to do it again.
Now, I want to rebuild it bigger and better. And, I need a better way to persist my objects’ states.
In which I announce my participation in Blog-a-Day May!
So, May Day has rolled around for this fine year of 2014. I have spent 44 days without writing and, darn it, I really miss it.
So, I announce my intent to write a blog of every day in May.
In which I point you to an instructional video on C# lambdas.
Just posted the instructional video “C# lambdas and LINQ Methods”. It’s a primer, kids.
In which I explain my on-going quietness
I have so many things that I’d like to write about. Unfortunately, they fall into one of two categories, both of which I can’t write about!
- Things that occur with regards to my clients
- Things related to my current project
In which I present a Yahoo! Mojito view engine for jade.
In which I write about date effective entities and moment-intervals.
I have spent the last month with some really smart guys who have been tasked to distill a problem domain into connected domain-neutral components. All of them have had years of experience modeling domains; however, this exercise represents their introduction to modeling in color. As such, they have challenged my articulations of the domain-neutral component. I address one such challenge in this post: date effectiveness and the «moment-interval» class archetype.
In which I provide steps to get ASP.NET MVC 5 running on MonoDevelop 4.2
Instead, maybe you should try Visual Studio for Mac.
This is an update to the earlier post Setup ASP.NET MVC 4 on MonoDevelop 4.1.
In which I find happiness from two years ago.
A friend and I have started building a thing. Not an interesting thing for most people; however, for me, it serves a community to which I belong. A community underserved by technology. So, with that in mind, I’m trying to help folks out and make a little in the process. Really, just a little. Enough to cover infrastructure and the time we’ve put into it.
Anyway, as with all software that I write, I need tests. Yes. I wrote need on purpose. I try hard to distinguish between my “needs” and “wants”. Sometimes I get ahead of myself and tests help reign in my enthusiasm so I don’t drop the eighteen eggs. Just saw a guy do that in the parking lot of the grocery store, today. Pretty sure they were cage-free which, as we all know, doesn’t really mean squat.
All those tests. I got tired of running them over and over. Worse off, all of the autorunners were puking on my project. Sad. Really sad. If only I had used a language and platform that has all kinds of things to help me. Oh well.
Then, I remembered I once wrote a little automated file watcher/test runner. I find it odd that I didn’t think about it before. I headed over to my open-source repositories over on GitHub… there!
I cloned it.
I ran it.
Didn’t have to modify a single line of code.
Thank you, me. I’m glad you were here a while ago.
In which I write about my OUYA.
My son wants to write a console video game. ID@Xbox turned down our application because, well, he’s never written a video game. He’s not a Playstation player, so not that either. I dislike Nintendo. What console can he write for? The OUYA, an Android OS based game console!
In which I reiterate what's in the title.
I have a relatively difficult-to-understand and, therefore, difficult-to-maintain implementation of HAML over at gohaml. I’ve kept it “up-to-date” as Go has matured to version 1.0. Now that it has, it’s time for me to make good on something better for the open-source community.
First off, the new gohaml will pass all tests in the excellent haml-spec fork that I’ve created to run gohaml against it. As soon as I get those passing, I’ll submit the pull request to the real haml-spec for inclusion in their repository.
Secondly, gohaml has a new structure. Hopefully it will make the whole of the library easier to understand and conform more to the structure of the Ruby implementation of HAML from which all good HAML-ness flows.
In which I send you over to GitHub to look at stuff I did.
I created the houstontechfest2013 repository over on GitHub. It contains the presentation slides (with speaker notes) and some commented code that I went through during the presentations.
In which I provide steps to get ASP.NET MVC 4 running on MonoDevelop 4.1
I have newer instructions for newer tech over at Setup ASP.NET MVC 5 on MonoDevelop 4.2.
Instead, maybe you should try Visual Studio for Mac.
In which I share what I did to get it working.
I like rbenv as my ruby version manager. I plan on deploying a Rails 4 app to my own server, that is, not Heroku or Engine Yard. I want to try puma as the Web server for that Rails installation. So, here’s what I did to get everything working correctly on my Mountain Lion MacBook Pro.
- Install rbenv following the instructions of Basic GitHub Checkout
- Install ruby-build as an rbenv plugin
- Restart your shell
- Start a shell (if you didn’t restart it from the last step in the previous section)
- Set the PATH variable to the PATH variable without any part of the PATH that points to the $HOME/.rbenv directory
- Install Rubinius 2
rbenv install rbx-2.0.0-rc1
- Add the following line to your __.bash_profile__ to force Rubinius to use
the version 1.9 interpreter.
RBENV_VERSION=rbx-2.0.0-rc1 rbenv exec gem install rails RBENV_VERSION=rbx-2.0.0-rc1 rbenv exec rails new «your_project» cd «your_project» rbenv local rbx-2.0.0-rc1
In which I provide a link to a code repo for pyvisitor.
I created the pyvisitor repository over on GitHub in case you want to use my implementation of the visitor pattern in Python.
I’ve released it under the MIT license, so you can do whatever you want with it.
It now occur to me that I should have released it under the WTFPL, but I don’t have the heart to change the LICENSE file.
Hope you enjoy it.
In which I bemoan my lack of production and increased rate of consumption.
Over the weekend, I re-read three Neil Gaiman books: American Gods, Anansi Boys, and Good Omens (with Terry Pratchett). They made me smile and, at times, laugh out loud at others. But, when I finished them, a lugubrious mood settled over me. Not the one that I normally feel when completing a good book and regret that it has ended. No, I felt bad because I haven’t written anything over the past two weeks. Moreover, I haven’t written any fiction in over a year.
In which a reader points out I'm wrong, wrong, wrong.
I got an email from a reader in Spain that read, in part
I did a test and got an AttributeError. Maybe you are interested in debugging it.
The email referred toThe Visitor Pattern in Python
which I wrote in January of last year. I pulled down the code, gave it a whirl, and found that I had a bug in it.
Wrong code ⇒ bad code.
I wanted to debug it.
In which I study the MVVM so-called pattern and present a plan.
For a long time, Model-View-Controller, Model-View-Presenter, and (with far slimmer adoption) associated patterns represented the accepted patterns for the objects that participated in organizing the responsibilities found in a graphical user interface. But, back in November 2010, the Microsoft® patterns and practices team published the Model-View-ViewModel (MVVM) Pattern that takes advantage of their WPF and Silverlight user interface toolkits. Now, we have MVVM toolkits in lots of different languages and rendering targets. This post discusses the pattern, its requirements, and its awesomeness.
In which I give you a preview of upcoming blog content.
I had planned on putting up another post when Monday rolled around, one that continued the MVWTF discussion I started last week. My friend, Ed, reported that the post seemed incomplete because I dropped the MVVM ball. I couldn’t help but agree.
On Sunday, I started the MVVM post. However, it has run away from me. Far, far and away. I have put about 12 hours of work into the post and I’ve only half completed it. This has not resulted from an immense amount of content; rather, it has resulted from trying to create precise content. To quote Dr. Andre de Korvin, “We must lose precision to make significant statements about complicated systems.” Well, I ain’t losing no precision, here, so my significant statements take longer.
In which I get all pedantic about MVC, MVP, and MVVM.
I just got done reading yet-another-article about knockout.js. Unless you’ve lived under a rock for a while, you already know about knockout.js. This is NOT another article on knockout.js. The author of the article decided to spend 600 words explaining the differences of MVC, MVP, and MVVM so the reader could understand the pattern adopted by knockout.js. I think he got a lot of it wrong. That’s why I really want to talk with you about MVC, MVP, and MVVM, their histories, and their differences.
In which I warn you about renaming GitHub Pages repos that back custom domains.
I have this blog, right? I host it with GitHub Pages, right? To do that, I have a repo named «realistschuckle.github.com» which redirects to curtis.schlak.com when someone types it in. Turns out that migrating that to another repo didn’t work.
I created that repository back on 5 December 2011. The instructions, at that time, directed me to name it «[username].github.com» and that’s how I get my custom GitHub Pages site.
Because of therecent problems with
GitHub Pages, I have spent a lot of time in their documentation. During that reading, I discovered that the new naming convention goes ends in «.io» instead of «.com». On the page Should I rename <username.github.com> repositories to <username.github.io>?, they instruct that
If both a username.github.io and a username.github.com repository exists, the username.github.io version is used.
To host my blog’s content, I figured I could just create a repository named «realistschuckle.github.io», host the locally-generated content from «realistschuckle.github.com», and all would work correctly.
Nope, it did not work correctly.
In which I find another bug in GitHub Pages.
Last night, I sat down to investiage my
jekyll and Github Pages problem. I made a change
that reverted most of my content for the blog, pushed it, and GitHub Pages
built my content like a champ.
I made another change and pushed it.
Nothing. GitHub Pages failed to rebuild my content. I sent an email to the exceptional GitHubber with whom I’ve dealt and he replied with the following:
I’m sorry to tell you, but I think you’ve stumbled on another bug. It looks like Pages aren’t rebuilding when the pushes happen so close together. I’ve opened another Issue for our team to figure this out. Hopefully, we’ll get this fixed up soon, since I’m also unable to trigger a rebuild on our end.
Bummer. He said that if I want the content up, I should just build it locally and push the generated content, instead. So, I’ll do that, for now.
Hopefully, you’ll see this content. Sometime. Soon.
I still ♥ GitHub.
In which I explain where everything went...
It turns out that I have somehow managed to introduce an edge case in my blog’s
content that causes
jekyll to fail on the GitHub Pages server. It all runs
fine on my machine. It runs fine on a GitHubbers machine. Just not on the Pages
It fails with this helpful message:
error: interning empty string.
So, now I’m trying to fix it the old fashioned way: incrementally.
Look at this new ugly front page!
In which I note the new feature of jekyll that I really like.
I just updated this site to use jekyll v.1. It builds my site faster which is good during the local development of a new posting. It also has better messages about the build, including a “done” indicator which the last version I ran did not have. Here’s some actual output from saving this file:
Regenerating: 1 files at 2013-05-17 11:35:36 …done.
The best feature, by far, is the support of the
_drafts folder that contains
works in progress. Previously, you had to specify the date of the post for a
future date and use the
--future option to get those included in the site
build. Too much work!
Now, just put a new markdown document in the
_drafts folder and they show up
at the top of the list using the file’s last modified time. Awesome!
In which I reveal a solution to the fundamental problem of unifying the libraries.
Ok, so, I’m a purist. I like things to do their job, do it well, and not reach beyond their boundaries of functionality. In this case, I refer to jQuery UI and knockout.js as the things under conideration.
I think that each library has a strength that I want to use in my Web application:
- jQuery UI
- Used to create widgets and handle events like mouse clicks.
With that in mind, I encountered a “problem” with getting the two to work
seamlessly with one another specifically around using the
jQuery UI Datepicker. When a user selects a
date from the calendar control, the
Datepicker sets the value of the
INPUT node with the selected date.
How does it do that?
In which I tell you to be quiet.
I don’t like it much. It does hold my attention more than The Lost Symbol. Barely.
Oddly enough, its main plot device is the same plot device I wanted to use in my own untitled novel planned a couple of years ago but never written.
If I write it now, everyone will just say, “That’s so derivative.” And, in anything other than calculus, derivative just ain’t no compliment.
Oh well. Opportunity lost.
See you tomorrow.
In which I list the contents of my professional bookshelf.
Woe is me.
Woe is my bookshelf.
Woe is Seymour Lipschutz who wrote my set theory book.
In which I present my full model for the athletic club exercise.
In this article, I show my total design for the athletic club exercise. You could have totally figured that out from the synopsis for this post; however, since you, dear reader, only remember 30% of the crap that you read, I’ve now upped my chances of sticking in your cerebrum just a little bit longer.
In which I discuss identifying the «description»s, «thing»s, and «role»s in our example
This post concerns itself with identifying the participants in our domain model that we have not classified as «moment-interval»s. That means we’ll look at «thing»s and their associated «description»s and «role»s. But first, I want to recap what we’ve completed so far over the past couple of days in case you’ve jumped in mid-series. If you’ve followed along, however, you can jump to the new stuff.
In which I discuss the "timeline" core to modeling in color.
In Java Modeling in Color with UML, the authors define the «moment-interval» archetype as
something that one needs to work with and track for business or legal reasons, something that occurs at a moment in time or over an interval of time.
Originally, Peter Coad called this archetype «transaction»; however, this caused a lot of confusion in the programming community due to the implication that “transaction” meant “business transaction”, like a sale or a purchase. Coad actually meant the purer definition of the word as an exchange or interaction between parties. Because of the confusion, he renamed the archetype from «transaction» to «moment-interval», a more cumbersome phrase with a neutral meaning.
This post discusses finding «moment-interval»s in our problem domain and using them in our object-oriented designs.
Considering the first step of modeling in color.
I think the stuff from yesterday's post kind of sucked. Sorry about that. It seems that my perishable skill of writing nears six feet under. I’ll endeavor to make today’s post more lucid, cohesive, and informative. Perhaps that will revive my chosen word.
I told my nascent development team that we would use modeling with color as our object-oriented design philosophy. Then, I reserved a conference room for four mornings so we could learn this practice first hand. I started by showing them the following list of user stories.
- People join the club to become members and get invoiced monthly a flat fee and participation fees for classes
- Participation fees for classes consist of a prorated amount of the instructor’s hourly rate and a percentage of the cost of the equipment used by participants in the class
- Record member purchases of food and beverages from the club for rewards
- For every ten dollars spent on food and beverages from the club, the member receives a one dollar credit on their next invoice.
- Members RSVP for classes and their arrival is recorded
- Instructors schedule rooms and equipment for classes
Then, I asked them to break out in groups and create some static
class diagrams that model the problem. From three groups, we had
four designs emerge. They all looked like candidates for creating
software to address the user stories. However, they all looked
different. They all lacked some transactional information. Nothing
wonky, mind you. Nobody forgot to include a
Person class. But,
this project that we’ve launched will grow in number tenfold over
the next year; I want the code to look and feel the same regardless
of who wrote it and when they wrote it. Modeling in color to the
The first in a series of entries talking about Modeling in Color
Over the past six years, I’ve tried to apply the lessons from Eric Evans’ book with regards to collecting requirements from customers and, then, building a robust object-oriented design that embodies those requirements. I have had quite a bit of success with domain-driven design and can attest to its strengths. However, when I started using Evans’ recommendations, I had already spent the previous eight years honing my OO acumen, decomposing real-world problems into software-based solutions.
As you may have noticed, I haven’t written in a while. Between bringing home the bacon, eating the bacon, and riding around on another porcine entity, I haven’t spent time tending this little word garden. Yeah, shame on me. But, I recently spent some time talking with my nascent development team about object-oriented design and how they should perform it as we move into a business-focused cycle of coding. I wanted some process that would provide a standard by which they could enter into the practice of OOD and come out the other side with philosophically similar designs.
What to do?
Sitting in my office, I looked over at my Bookshelf of Broken Technologies™ and spied a book that I hadn’t read since the early 2000s: Java Modeling In Color With UML: Enterprise Components and Process. I vaguely remembered something about Post-it® Notes. I read the book through and sat back amazed.
This was it! An easy-to-understand, attainable OOD philosophy. With examples.
Let me write that, again. WITH EXAMPLES!
Getting the now-hidden check-in policy to work with git-tfs.
Once upon a time, the “Require a Changeset Comments” check-in policy for TFS came in the TFS Power Tools. In Visual Studio 2012, they rolled that policy into the Visual Studio distribution. Now, the check-in tool from git-tfs cannot find it. To solve that problem, you need to make the check-in policy available to git-tfs.
C:\Program Files (x86) Microsoft Visual Studio 11.0 Common7 IDE CommonExtensions Microsoft TeamFoundation Team Explorer
git-tfs installation directory. That should allow the check-in tool to
find the policy.
A brief discussion on failing to create new things in ReST
Over on Twitter, @philipmatix just sent these tweets to me.
.— Philip Mateescu (@philipmatix) August 19, 2012
@realistschuckle in a ReSTful API how do you know what you know what you need to POST to create a new entity? Documentation?
.— Philip Mateescu (@philipmatix) August 19, 2012
@realistschuckle POST with an invalid payload and expect the server to reply with 400 (or 422) and a sample of a valid payload?
My response would take to long to break up over a multitude of Twitter-sized messages, so I’ll put it here.
Lazy administration led to "server meltdown."
I admit: I don’t pay attention to my Linux servers like I should. They have lulled me into a false sense of security due to their stability. This morning, though, my monitoring app sent an email to me. A snippet:
The VM XXXXXX has exceeded the notification threshold (90) for CPU Usage by averaging 90.8% for the last 2 hours.
mysqld sitting at 87%. Um, ok…
: sudo mysqladmin shutdown
Wow. Reboot. All is well.
Yep, mysqld choked on the leap second.
Stupid leap second. Stupid mysql.
Time to switch to SQL Server Azure.
Finally, a usable custom WPF tab control.
Well, I spent some time on it, this week, to make it usable. For you.
- Close buttons for each tab
- A nice little add button
- Tab reordering with graceful animations
- A bunch of little bug fixes
In which I disucss the editors in grijq.
I wanted to have a “pluggable” editor system for the grid so programmers could customize the widgets that appear in the cell when editing begins. This post discusses how to create a custom editor and use it in grijq.
In which I disucss navigating grijq with the keyboard.
I think this is the most interesting part of the grid. This feature required two different things: the ability to focus on a grid cell and the ability to capture navigation keys to move the selected cell.
In which I disucss the column resizing in grijq.
In which I disucss the scrolling in grijq.
In which I disucss the goals of grijq.
Last week I needed to convince some folks that the World Wide Web can act as a deployment platform for enterprise applications. They had some bad experiences with Web applications a couple of years ago and, since that time, felt convinced that desktop applications could only serve that niche of data-intense applications. I believe in the power of the browser and worked on a small demonstration Web application that would corroborate my beliefs.
Data-rich applications traditionally have grids. Users have grown comfortable scanning hundreds of rows of text and numbers to perform some kind of analysis. Trying to convince them that alternatives exist that could present the data in more comprehensible ways can pose challenges because these good people have adopted the Religion of the Grid.
They can have my Excel when they pry it from my cold, dead fingers.
To quell their unease, I went in search of a data grid that would meet my needs for this demo.
Look at window.HTMLElement
Often, I need to change the way I apply some CSS due to the different box models that browsers employ. Some include padding, some borders, some other stuff in their calculations of widths during their layout phase. I stumbled across this interesting way of detecting the browser that the visitor to your site has decided to use.
I put the version numbers on those
isXXX variables because those’re the
versions that I used to test those values. They might work for other versions,
If you use this trick and find a different value or even the same value, then please post your discovery on this page and we can compile a list of very easy-to-use tests for browser detection!
In which I temper my enthusiasm for TFS with developer hardships.
Over the past month I have taken a deep dive into the use and customization of Team Foundation as an application lifecycle management system. I’ve looked at both the 2010 and 2012 beta versions and, for the most part, feel admiration for the systems. It really allows different team members to access information that they need to create, review, or modify within the lifecycle of the application.
In which I celebrate openclipart.org.
I’ve used openclipart.org for a long time, I’ve always meant to submit something of my own. Because the site has an open submission policy, you can find some less-than-nice work on the site.
Finally, I have something good enough that I wanted to make it available to the world. Here’s the clip art page over at the site from which you can download the SVG or PNG of various sizes. If you like it, go on over there and “favorite” it.
That's SOOOO 1999!
Remember back in 1999 when the Internet still had a shine of youth, a time
when Web sites still used texture-based background images and the
tag still had meaning? When Web sites looked
For the youngsters in the audience, when an organization would purchase a domain name, they would plaster a big “UNDER CONSTRUCTION” or “COMING SOON” page to announce and reassure that something relevant would one day appear. Well, retro guy that I am, I’ve done the same thing.
But, I put up the “COMING SOON” page so that I can exert some internal pressure to get the work done to actually complete it. Working in a relative vacuum has shown me that, left to my own devices, I’d rather participate in less productive past times. So, internal pressure, build!
I still feel passionately about borax.js and what it represents. I think that, given a reasonable structure in which to understand REST, that most developers would enjoy the real power that REST-in-the-browser can give to them. At least, the way that I see it. And, in the absence of something standards-like, the definition of REST encompasses so much more than originally intended.
So, onward and onward. And, don’t forget, when you need an excuse in a clinch, you can always turn to excuse911.com.
A small post excusing my small post and a little bug in knockout.js.
I have one more document to write for my current client. Because of that, I really just don’t have time to write, today, in this blog. Not only that, but I don’t really have anything interesting to write. Except this thing I found with knockout.js.
It seems that knockout.js on IE8 strips any trailing white space between a data-bound tag and further text. For example, given the markup:
renders as the following in IE8.
And you can see the trailing whitespace of the first
span, the space
between the end tag and the word “away,” disappears. I haven’t had time to
hunt down the bug or even report it.
Maybe this weekend.
OMG! You're still here?
Yeah, I’ve been consulting. I’m not a successful Web 2.0 company owner that sold his latest company. I’m not someone that got in on Apple at $50. Instead, I’m the guy that likes building software, has done it for a while for a variety of companies, and has struck off on his own to try to fulfill a dream of entrepreneurship.
So, to keep the money flowing, I’ve taken a consulting gig.
Man, has it drained me.
Vacation. Where else?
Just hanging out at this lake house in the Sam Houston National Forest, surrounded by a couple hundred acres of undeveloped land.
A rename, some functionality, and an interesting feature of WPF.
I’ve renamed the classes, projects, and solution for the project because I didn’t want to infringe on Google’s IP. Thank you, philipmat, for pointing out their trademark and thank you, Google, for letting me search out the particulars of your intellectual property.
Since Friday, I’ve committed
- Changed mode on most files. Make resizing work correctly.
- Make the unselectable tab selectable (a tab with no ChromeTabItem as the child)
- Make the little round button for closing
- Remove objects from the mapping dictionary to prevent “memory leaks”
- Now tabs close nicely for the tab control
- AddTab/RemoveTab functionality demonstrated
- Moved the responsibility of dragging tabs from the tab item to the tab panel
- Added “Close selected tab” button on test window
- Draw the “add tab” button and have it react to mouse over for color change
- Wire up the add button to add a tab
Those last two commits demonstrated a feature that I knew about WPF but never had use to exercise: the difference between the logical tree and the visual tree.
An introduction to a new GitHub project and a call for participation.
Yesterday, I pushed my initial import of a Google Chrome-like tab control for WPF to a new GitHub repo. I have it rendering the look of the tabs and some very rudimentary dragging of the tabs. I don’t like the implementation of the dragging, yet, so I’ll have to fix that.
I’ve released it under my favorite FOSS license, the MIT license. Feel free to make a million dollars off of it, use it in your commercial software, or whatever. However, if you do make a million dollars off of it, please send a little my way. Help support FOSS.
(This project’s for you, eb² and DrH. :)
I started showing my blog around to some folks. They had IE8 installed. Or, IE7. I mean, WTF, right?
Well, here you go, users of the Internet that don’t have a “good” browser. My site now looks correct in your silly browser.
What did I do? I added the “Hey, IE! This is HTML5! Deal with it!” script. It looks like this.
IE will apply styles to the elements if you define them in the DOM as a “valid” element.
I named the script “ie-sucks.js” and put it on the site.
Hope you enjoy, IE-users.
For those of you in Chrome and Firefox, you get the gold star, today.
Another rambling foray into my pedantic world of nomenclature.
The entertaining and amusing winky99 recently tweeted at me.
@realistschuckle Should we quit saying MVC when most implementations are MVP? Or agile when actually it is scrum? Communication > purity— Scott Stevenson (@winky99) February 28, 2012
This came from a comment that he made regarding a post by Rob Conery. I have to disagree with his assertion that “communication > purity” primarily because precise communication is pure communication. We develop specialized languages with unambiguous terms just so we can communicate with one another clearly.
Since Rob sparked our short-lived debate, I went to look at Rob’s site.
In which I outline my current development plans for BORAX.
Ok, things have started to slow down in my personal and professional life. It seems that I have time, again, to work on BORAX.
And there was much rejoicing. “yay.”
In which I grouse.
I don’t like dimes.
They’re small. They’re pathetic. They’ve got that ridged edge. They make my fingers smell like inexpensive metal. They don’t represent the greatness of the man on them, Dwight D. Eisenhower.
I’d rather have two nickels than a dime.
I’d rather have just one nickel.
I don’t like frameworks.
They’re huge. They’re overwhelming. They’ve got that undocumented API. They make my fingers sweat from too much implementation. They don’t represent the intelligence of the software programmers that implement them.
I’d rather have two toolkits that solve my problems.
I’d rather have just the compiler.
I don’t like eggsalad sandwiches.
They’re messy. They’re globby. They’ve got that too-much-mayonnaise problem. They make my fingers smell like eggs and celery. They don’t represent the deliciousness that a sandwich could achieve.
I’d rather have two ear infections than an eggsalad sandwich.
I’d rather have tuna.
I don’t like homegrown IDEs.
They’re slow. They’re feature-poor. They’ve got that collection of bad-usability problems. They make my fingers ache from switching from keyboard to mouse to keyboard to mouse. They don’t represent the polished state-of-the-art you find in <your fav IDE/text editor>.
I’d rather have two instances of Notepad++ than a homegrown IDE.
I’d rather have a dime.
In which I talk about my small contribution to flatiron/plates.
Today, more training, more test-driven training. The group of attendees really seems to enjoy it. Yay! Because of this, I didn’t really work on anything else non-work related, except…
…I ran into a couple of problems when using flatiron/plates. You may recall my series of articles on flatiron that I posted about a month ago and the follow-up update that I posted because of the plates reëngineering. I found what I considered a bug.
In which I talk about the training I led, today.
Remember back on Monday when I said that I had to fill my week with typing other stuff? Well, I did. I mostly finished my leave-behind training manual (67 pages, so far) and started on the presentations for the three-day course to help the employees joining the new development stream. And, then, yesterday afternoon, a Muse inspired me to throw away the presentations and try something completely new: test-driven training!
In which I excuse myself from my normal typing assignment.
I have the opportunity to lead some pretty big training, this Friday. In the spirit in which I do most everything, I have thrown myself into the position with abandon. I’ve made it 17 pages into the supplemental text that I will distribute. I still have presentations and narrations to create. Busy, busy, busy.
You have my apologies if you find it discouraging that I will not post regularly, this week.
I want to make the training interesting and engaging, something difficult to do for programming. At least the attendees will have computers on which they can type.
In which I rant very briefly about my dislike for System.Web.Security.MembershipUser.
Yeah, it’s bad. Really bad.
bray and I just spent a couple of hours looking at the authentication model in ASP.NET MVC.
I threw up a little in my mouth. Sorry. I’m okay.
This class from which you must inherit for authentication to work just makes my heart sink. If nothing else, Microsoft, please just provide hooks on which to hang my authentication. Then, build your stuff atop that.
I’m a big boy and understand how to write my own authentication and authorization services. Really, I do. And, thanks for providing means by which to authenticate against Active Domain and relational databases. I’ll make sure to use them in “enterprise” systems.
But, for my home-grown system, for this software that I want to write here, for the awesome product that bray gets to help create for his energetic start-up, just give us tracks on which we can run our own locomotives.
Choo choo choo choo!
In which I give an example of a bullet-free presentation.
I remember using PowerPoint for the first time in my Public Speaking course at University in 1992. The medium of the electronic presentation, like all things PC, appeared new and shiny. The textbook had only a slim chapter on this new-fangled presentation aide so the professor invented as he went along.
Instructor: Put no more than five bullet points on a slide and make the text about about size 40.
Student: What if my sentence goes to the next line?
Instructor: Strip the unnecesary words to make it short again!
And, so it went until we started learning every bad habit that PowerPoint has encouraged its users to practice for over 20 years.
No longer shall I do these things!
In which I talk about my experiences and views of "managing sideways."
Warning: This post has salty language, i.e., profanity. Do not read it if you have cultural objections to four- and seven-letter words commonly referred to as “bad language.”
Over the past two days I’ve posted articles on managing down and managing up, how I think you should lead your team and work with your manager, respectively. Now comes the hardest topic of the three: managing sideways.
In which I talk about my experiences and views of "managing up."
I once had a job with Gateway Learning, Inc., the company responsible for Hooked On Phonics. They hired me to run their Web development and systems integration back during the beautiful dot-com bubble. This place, located down in the waterfront area of San Francisco, had the look of a seminal start-up. Their pride and joy, a 120-inch square of paper with the database ERD printed on it, hung in a place of honor so that every employee, visitor, and investor could see it upon entering the developer zone. Their “data dictionary” filled two three-inch binders.
I reported to a guy named Fred. He had the position of Vice President of Being French and Developing Software. We worked together for a month. One day he pulled me aside and said to me, “Curtis, I find it hard to trust you because you speak with such short sentences.”
I quit the next day.
In which I talk about my experiences and views of "managing down."
I have spent a lot of time thinking about leadership and what it means. I have heard people talk about personal and professional leadership, as if the two subjects require different talents or traits. I believe that they do not.
I believe that the following traits can make you an effective team leader regardless of the size of your team. They will not guarantee success; however, they represent important goals and standards toward which all leaders should strive. In their application, you can increase your effectiveness as a leader.
If you do not have a leadership position, right now, but feel like you would want to have one, these traits will garner attention from those that have the power to give you a team to get more done.
In which I clean up the server-side with BORAX In Server (BORIS)
As you may recall from the last BORAX post, I had set up the application to transition to the start state which, for the purposes of our application, means someone needs to login. The application loads its first state as indicated by a linked relation in the header of the launchpad. Now, I sure think we would find it cool if we could handle the authentication.
In which I express my dismay with nomenclature.
Yesterday, ayende posted some blog about some code with which he didn’t agree. I read it with apathetic eyes. I really go there to read the comments that people leave on his blog. Opinionated people draw opinionated readers. The post, about CQRS in some example app written once-upon-a-time, had people chattering like squirrels since CQRS has become a buzz-worthy thing. (I call it the Fowler Effect.)
About 20 comments in, someone wrote something about DTOs. It goes like this.
This kind of separation [CQRS] sounds good for me, because you can design queries based on UI, with specific DTOs, while I can design commands to affect my domain model, via write side of it, based on user tasks.
I don’t think this guy wrote anything offensive; it has a certain value of insight. I realized while reading it, though, that I can no longer abide the term “DTO”.
For those of you not in the know, a Data Transfer Object provides a typed representation for passing information between two layers of your application. Those layers can physically run in the same process or across the world. A DTO supplies a message contract. Also, we can’t bother most developers to figure out efficient serialization and deserialization algorithms for their objects. They’d rather use the ones provided by whatever their specific runtime or platform has in their communication packages.
I really dislike the “O” in “DTO.” I refer you to my first and second posts where I wheedle on about object-oriented design and falafel. The sum total of those posts: Classes define behavior. Objects perform it.
In object-oriented programming, we have a mantra, “Tell. Don’t ask.” We have that mantra because our objects, defined by classes, have behavior!
A Domain Transfer Object has no behavior. Thus, they do have the defining characteristic of an object.
From now on, I will call them “DT-NO”s: Data Transfer Non-Objects. Also, I think “ditno” sounds kind of funny.
In which I start a simple RIA atop BORAX.
In which I try to explain the meaning and practice of BORAX.
My sympathies go out to Dr. Roy T. Fielding. He conceptualized an architecture for network-enabled applications. Then, he formalized that in his doctoral dissertation. Then, some marketers got a hold of his term, REST, and started applying it willy-nilly as marketers do. This led to a dilution of the meaning of REST. When Dr. Fielding attempted to clarify why some services complied with REST and others didn’t, detractors accused him of grasping at purist ideals that no one could realize in “real-world situations.” He vented his spleen in a post entitled “Specialization”.
Before last week, I, too, had an improper understanding of REST. I read Architectural Styles and the Design of Network-based Software Architectures more than once. I thought about it a lot. Then, I started programming Rails, didn’t think beyond its definitions, and failed to continue my analysis. If I had continued, then I wouldn’t have been throwing around the term “REST” so loosely.
I want to change that because, after the little experiment I wrote on my fork of philipmat’s webmvc, I think I now understand the power of REST in all its glory. Moreover, I understand the limitation of browsers to bridge the gap between Rich Internet Applications and the REST-shaped services they consume.
- uri-template (browserified)
I’ll spend the remainder of this post explaining BORAX in a little more detail and, then, the components of a BORAX-compliant Web application. Tomorrow, we can spend some time reviewing code to figure this out.
In which I take my friend's advice to engage in more pedagogy about REST, and the New Web programming style BORAX.
In which I use my blog as a Web log.
Just the list of stuff I did, today.
In which I consider Roy Fielding's definition of REpresentational State Transfer.
Note: this discussion primarily centers on the HTTP; REST over other protocols exceeds the scope of this article.
[Updated with link to philipmat‘s blog.]
My friend philipmat over at his blog has published a novel approach to building Web applications that use the server as a REST service and use the browser as the controler and view in the MVC triumverate.
That idea, in and of itself, does not represent a “new idea.” The fine developers at Sencha and Yahoo! have already developed in-browser MVC frameworks that usually use some proxy as the Model to fetch/write data stored on a server.
philipmat takes this at least one step further. And, in that step, I find a favorable pace toward Roy Fielding’s notion of REST. First, I’ll go on about REST for a little while to cure any confusion about what REST means. Then, I’ll examine the step-toward-REST that philipmat‘s proposal makes to us.
In which I speak an empty word.
The agile dream: 40-hour work weeks. If you work more than 40 hours, don’t do it two weeks in a row.
I have not complied with that directive over the past three months.
Instead, my minimum work week has consisted of 60 hours.
My mind does not want to create. It merely wants to rest.
Alas, this post is nothing. Mere filler.
It is my empty word.
empty word, noun (especially in Chinese grammar) a word or morpheme that has no lexical meaning and that functions as a grammatical link or marker, rather than as a contentive.
In which I set up Python.NET with Python 2.7 and Monodevelop on Lion
Install subversion : I used homebrew.
Install Python for .NET Source : Pick a nice directory for installation. I put it in ~/dev/pythonnet. I ran these commands.
mkdir -p ~/dev/
Install Monodevelop : I installed version 2.8.5 because they don’t have a release for 220.127.116.11, yet.
Open Python.NET Solution : Start Monodevelop, answer its stupid questions, and open the solution. I found mine at ~/dev/pythonnet/pythonnet/pythonnet.sln.
Configure Build for Python 2.7
: Double-click the “Python.Runtime” project to open its optiosn. In the
dialog that appears, select “Build > Compiler” from the navigation pane on
the left. For each configuration in the Configuration dropdown, change the
PYTHON26 in the “Define Symbols” input to
Link the Python Shared Library to the Test Output Directory
: Create a softlink from
the output directory of the “EmbeddingTest” project.
mkdir -p ~/dev/pythonnet/pythonnet/src/embed_tests/bin/Release/
Patch the Import Unit Test
: In the “EmbeddingTest” project, open the
PyImportTest fixture. In the
SetUp method, you will see on line 28 a line that looks like a path to
a “tests” directory. You need to change that because Python on Mac OS X does
not know about those backslashes. So, change it to the following. (I’ve
already submitted a patch to the project, so you may not have to complete
this step if they choose to apply it to the source.)
char c = System.IO.Path.DirectorySeparatorChar;
Build Solution : You know, CTRL+COMMAND+B.
Run the Unit Tests One Fixture At A Time : This kind of blows. However, the Unix pipe used to communicate with the tests doesn’t do well with the embedded cPython runtime. They should all pass.
Now, you can use Python.NET in your Mono development. Just remember to link
in that shared library or put it in your
MONO_PATH environment variable.
In which we revisit the <b>plates</b> functionality.
Story 5: Each item in the task list will have a "Delete" link next to it so the user can remove the to-do item from the list.
This post continues the creation of a to-do list with flatiron.js.
Story 4: When a user issues a GET to / after session creation, the HTML page continues to show the input and button while showing the task list beneath it.
Story 3: When a user POSTs a form to /, it creates a new ToDo item, adds it to the session, and redirects to /.
Story 2: When a user first issues a GET to /, it serves an HTML page that shows an entry text box for a to-do list item and a button to POST the item to /.
Story 1: When a user first issues a GET to /, then it creates a new session.
In which I walk through making a primitive to-do list Web app with flatiron.js.
The makers of flatiron.js bill it as “an unobtrusive framework initiative for node.js.” It consists of five major components that the creators want to behave “isomorphically,” that is, similarly in the browser and on the server.
In which I cry, "Uncle!"
Well, I’ve spent three weeks on sqlcop and haven’t even made it out of the JOIN statement. I knew writing a parser for T-SQL could take a while; however, I did not realize that T-SQL has so many forms!
In which I share how to run nunit-console under mono.
I continue to program in C# even though I don’t consider it my favorite language. The experience of starting a VM on my Macbook Pro to use Visual Studio 2010 on Microsoft Windows 7 quickly paled. I downloaded and installed Monodevelop 2.8.5 so that I could compile C# without a VM.
In which I show you how to do runtime mixins for classes in Python.
Say you want to mix in a method into an existing class but can’t get to the class’ definition. In Python, you can use the following decorator to do that.
This method handles mixing in a single method as well as another class’ methods. You can even mix methods into a class after instantiating it.
Wow! That’s nice. You can download mixin.py for your use.
In which I implement the visitor pattern in Python with decorators.
I’m a fan of the visitor pattern for its emulation of dynamic dispatch and its ability to extend functionality of a tree of objects.
In which 91 ways to become the coolest developer confuses me.
Today, a friend sent this link to me 91 Ways to Become the Coolest Developer in the World. He wrote, “You should read this because you’re the coolest developer I know.”
That’s a nice compliment, so I started reading it with a smile on my face. The further I read, the less I smiled until, as I approached the end of the long, long list of lists, I no longer smiled.
The best programmers that I know do not really like computer programming. They like solving computational problems in a deterministic framework. They like to figure out the smoothest integration of human-computer interaction. They covet the experience of watching other people using their software in a productive or entertaining way.
Programmers that love to program for the sake of programming, they tend to write crap. And burn out fast.
In which I talk about sqlcop's development.
sqlcop now has 248 unit tests that supply documentation and executable confirmation that it can recognize the following:
In which I posit that a specific form of a unit test reveals a bad implementation.
Yesterday, I ran across a unit test at my work that had fourteen lines of “arrangement”, one line of “action”, and ten lines of “assertions.” The unit test literally had more lines than the method it tested!
In which I dream a little dream.
I recently met a friend of a friend that has founded a company to provide Building Information Modeling (BIM) software-as-a-service. He described the flow of information through the construction process, from architects to building owner. He lamented the loss of information that occurred during the process in its current incarnation. He evangelized his dream for unifying BIM in a suite of tools across the construction data ecosystem.
And, it made me remember my own dream about a very nice tool that does the same thing for software.
In which I explain my absence and get everything back on track.
An entire week has passed since my last post. That doesn’t feel very “make a post every day”-ish to me. I do feel a twinge of guilt over the matter, letting myself down more than anything because, if I’m not mistaken, no one really reads this thing. A couple of those guys listed in the right column might swing by every now and then, but I don’t have a commitment to any specific person or group. Just myself.
In which I announce a little project called sqlcop.
“Where’s my fiction,” you demand.
Sorry. I went and wrote about how I want to write fiction and then spend my weekend working on software. That’s awfully inconsistent. Shame on me. Unlike many of my open-source projects, though, I think this one may have merit.
In which I clarify some of my decisions about C♭ and document a new feature.
I talked with my friend philipmat, today, about some of the bad practices that I identified for C♭. After our conversation, he recommended that I take some time to clarify my perspective.
After that, my friend
eb^2 and I talked about the post and he raised some
So, here, I will do that without irony, but with sincerity, instead.
In which I hope I don't waste your time with my ideas about curtis.schlak.com.
I planned to write a really good post, today, that clarifies my thoughts about the decisions behind C♭. Unfortunately, I didn’t start this post until 8:45pm without the same fiery passion that I normally bring to these. Instead, I think I’ll just do some stream-of-consciouness poo.
A story in which I learned about intestinal fortitude.
Reading Assignment: A Message to Garcia
In 1993, I joined the U.S. Army Infantry. I saw the movie “Stripes.” How bad could it be?
In which I write some tests for the last post.
Shame on me.
I know you caught it in that last post.
I didn’t write any tests. Not a one.
In which I continue to muck about making a language that encourages bad practices.
I don’t know how far we’ll get in this part. But, let’s you and I find out. Since we’re working with language design and “compilers,” I’d probably consider this a more advanced topic with which to deal. That doesn’t mean you can’t do it. You just may have to learn a little something along the way.
In which I muck about making a new language because languages are fun.
I’ve got this huge project that I work on every once in a while. I want to port Objective-C to the Common Language Runtime. I’ve been working on it for two years, restarted it three times, and have really not come any closer to finishing it because of the normal excuses: family, work, other projects, weariness, lack of falafel, the moon in the wrong phase. You know what I mean.
I wouldnt go so far as to call them patterns; rather, reoccuring forms.
This article mainly applies to those languages that have some xUnit-like testing library. I will write the examples in C#, but they should port easily to other languages.
Probably a rant, most definitely a diatribe.
I really like programming computers. As I grow older in my profession, I really like reading source code that I can maintain. Maintenance must be our primary concern when we write our code. Because, someone else will need to change it, one day, and they’ll have to understand it.
During which, a recently-gradudated interview candidate and I talk about refactoring static data.
“So, Interview Candidate, let’s look at the classes that we have.”
During which, a recently-gradudated interview candidate and I figure out one of the basic aspects of object-oriented design.
I interviewed a recent college graduate, today. He attended the Texas A&M. That’s a good school, from what I understand. The inventor of C++ teaches there. The inventor of C++, the language that popularized object-oriented programming. That sounds like a pretty good place to earn one’s Bachelor’s degree in Computer Science. As a student there, maybe you’ll learn more than data structures and algorithms. Maybe, you’ll learn a little object-oriented design.
Seems not so much.