|
title: Put the knife down and take a green herb, dude. |
descrip: One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for www.myfreakinfirst-andlast-name.com Using 89% of the same design the blog had in 2001. |
|
FOR ENTERTAINMENT PURPOSES ONLY!!!
Back-up your data and, when you bike, always wear white. As an Amazon Associate, I earn from qualifying purchases. Affiliate links in green. |
|
|
x
MarkUpDown is the best Markdown editor for professionals on Windows 10. It includes two-pane live preview, in-app uploads to imgur for image hosting, and MultiMarkdown table support. Features you won't find anywhere else include...
You've wasted more than $15 of your time looking for a great Markdown editor. Stop looking. MarkUpDown is the app you're looking for. Learn more or head over to the 'Store now! |
|
| Monday, April 27, 2015 | |
|
Another interesting blog post brought to you a SO profile link:
After sitting back and remarking "how true" this is (though don't be fooled by #5 on his "peace" list; that doesn't mean you're not at DEFCON 2), it's more interesting to take home Ryan's main point: "The point is that as an organization, you need to know what state you're in." That is important. Don't pretend you're 110% about quality when you're at DEFCON 2. Admit that you're cutting corners to make dates, and your team will be able to deliberately adjust. And if your company likes to live at DEFCON 2 all the time, don't give applicants the expectation and impression that your nuclear readiness oscillates. I've had jobs where the peacetime activities, for all practical purposes, never happened, unless you had #5 going from the list above (working extra hours). I will say that I've noticed that a job description with the phrase, "Must be able to multitask well," means, "Must be willing to live at DEFCON 2 at all times." It's just a shame how often folks are at Ryan's "war" time not because they have to be, but because that's the culture management has Stockholmed themselves into. Labels: coding posted by ruffin at 4/27/2015 09:14:00 AM |
|
| Friday, April 24, 2015 | |
|
Hours, the Apple Watch, and turning an app into a business โ The Hours Blog โ Medium: How do you break into business and the enterprise? We like Slackโs bottom-up approach. Start by making the best solution for individuals, who in turn advocate adoption for their team, who in turn evangelize to other teamsโฆand up the chain it goes. If this isn't already part of your indie business plan, even as just a potential end game, it should be. That's exactly the tack I was hoping to take. It's a long game -- become a household name, at least with the bleeding edge households, and then, slowly, have your fans champion your app at their businesses. That requires some planning, not the least of which is ensuring that your app has features that appeal to business users. And, admittedly, it's a stolen plan. Apple's the most obvious, but even Aeron chairs are probably executive-first finds. But there's probably not enough money in the consumer market to power a large business based on most any software-first company short of games. Even _David Smith recently lamented that his company peaked a few years ago, and that he has to at least consider that the indie iOS ride might not last forever. If you want to make money, you have to go where the money is, and that, obviously, even ontologically, enough, is to target those entities whose primary goal is to create wealth: businesses. Not sure how it'll work for Hours, nor am I sure going free and incurring the extra support load is best, but I will say that targeting business is the smart way to go. Labels: hats of money, indie posted by ruffin at 4/24/2015 07:50:00 PM |
|
| Wednesday, April 22, 2015 | |
|
From Wired (via SixColors): Boeing 787 Dreamliner jets, as well as Airbus A350 and A380 aircraft, have Wi-Fi passenger networks that use the same network as the avionics systems of the planes... Whoever made that decision should be fired. And if that person can't be identified -- heck, even if they can -- the manager should be sacked. And their manager as well. Idiotic. What's the price to set up two independent networks, honestly? And what percentage of the total price of the plane is that? I mean, you have got to be kidding me. I saw the piece on 60 Minutes when they supposedly hacked a car remotely, which, honestly, even if the folks interviewed stretched the truth a little, I can still believe. That is, I don't expect across the board brilliance on cars. At times, I'm surprised they work at all. But planes? Aren't we a little less worried about bleeding edge and more worried about safety? Maybe we should all fly around in A-10s, since they have "manual reversion mode", where you can fly without any hydraulics, much less networking, if it all goes to heck. Honestly, as a programmer who always says if you don't have three copies of any digital artifact in three different places, you don't have a file at all, I'm surprised every plane isn't made like an A-10. This is why I try not to fly. posted by ruffin at 4/22/2015 10:41:00 AM |
|
| Friday, April 10, 2015 | |
|
From the Appbot's blog, "Dissecting The App Store Top Charts":
For me, the most interesting revelation was the make-up of paid apps:
I think that's percentage by app, not any weight for cost. It's just the number of apps on the store. Still, hello telling. Notice too what's fallen essentially completely out: In free apps, Social Networking is 12% of the pie. In paid, zippo in the 3% or above. Of course, what'd be really useful would be how people buy, not what's on the shelf. There can be dozens of brands of cookies, but if 98% of folks are buying Oreos, I'm not sure I want to be in the fig newton market, if you get my meaning. I mean, it could just be that every new Objective-C homebrewer brews a game first, trying to be the next Flappy Clash Birds. posted by ruffin at 4/10/2015 02:15:00 PM |
|
| Thursday, April 09, 2015 | |
|
So far, I hate the new Photos for OS X. Three beach balls on startup (looks like every reviewer used an SSD), and it immediately imported iPhoto without asking. Thanks. I deleted both photo libraries and started over. Eventually I created a new, blank (or so I hoped) library so I could drag in my photo folders manually. And I've chosen not to import photos. I already have them in folders. I don't need them twice. Then, suddenly, I start getting about eight random pictures. What the heck? Where are these coming from? I didn't want them in there. I hide them, since I apparently can't delete them. Then I choose to import a folder. It doesn't, afaict, recurse directories. Wth? Now I've got more randomly found photos. What the freakin' heck is Photos doing? Who's running this ride? These are not the photos I tried to import just a second ago. Okay, so I start over again. I delete the photo library. I put the new photo library that I create on next startup into its own folder. Now there's nothing. Let's see if I can drag lots of year folders over. I can, but Photos doesn't tell me anything. No, "I see your folders, and I'm importing now." Nothing. It sits there. It's still sitting there. It either grabs random photos I don't want, or it sits. Nice. So I try again. ONLY NOW does it act like it knows I tried to import something a few minutes ago. I read the iMore review that makes things sound pretty rosy. Ain't true for the "start from scratch" use case. Not yet. This stinks. STINKS. I guess Picasa, which does actually do what I tell it, still wins. EDIT: Oh, wait. I guess I was supposed to see this horribly informative "alert" to know importing was underway: I call it, "The Universally Recognized Circle o' Importing". Then this happened. Great job, Photos. Guess I'll go finish my Node testing on my Lenovo. Labels: apple, apple fail, iPhoto, photos posted by ruffin at 4/09/2015 12:36:00 PM |
|
| Friday, April 03, 2015 | |
|
As we continue to think aloud about MVC patterns... When you get rid of the Repository, you also get rid of the "sad tragedy" of repository architecture debate theater. If you want to see today's real lesson, go ahead and skip to the end. CodeBetter --- DDD The Generic Repository
It bugs me that anyone could use "code reuse" as a positive when talking about repositories (but skip to the end to see what's really going on here). By definition, all this jive is repeated code -- or at least code that runs through a Rube Goldberg machine before it becomes SQL, which is worse. Again, let me say again that I believe entities make some sense when you're looking to enforce business logic, but then I'm challenging you again to let me know why that isn't better handled -- ONCE! -- by your rdbms. Your entities are your data objects, and your capital-r Reads don't give a flying flip about them other than joining them together to produce their views. CodeBetter -- DDD Specification or Query Object
CodeBetter -- CQRS and Event Sourcing
Ayende -- Repository is the new Singleton
That's actually pretty interesting -- I mean, query repetition is very obviously the problem with what I'm proposing (a SQL query per controller action), but worded fairly well. Of course my response is that there's nothing wrong with a defensive separation of logic. Think smartly self-contained microservice. PlanetGeek.ch -- What is that all about the repository anti pattern?
No. ;^D SpiendWorks -- The Generic Repository Is An Anti-Pattern
Emphasis mine. Thanks for that line. Phew. Though I still dislike most ORM-based implementations, I think. Moneyball for todayAlso from the above link:
Now we're getting somewhere, aren't we? THIS, not DRYness, is a repository's real advantage. And who the heck really swaps out the datastore of a mature app? Bueller? Then why abstract it?!?!!!1! If you're not going to abstract the engine from the application, you don't use a repository. And if you want performance, you don't want to abstract the engine. Trust me. That is, in brief, my bets are on SQL (though SQL is less important than your data persistence model -- and I'm leaving myself open to situationally microservice my way away from whatever persistence model I initially pick too), not the convoluted code overhead and repetition of Repositories. If you're honest with yourself, you're very likely already are betting on [your code persistence model]. If you're not factoring your persistence engine into your code, you're almost certainly going to see performance problems at scale. That is, if you're "hiding implementation details like database engine or what DAO or ORM the app is using", you've already eliminated too many possibilities for optimization and made your codebase more difficult to maintain. Lose lose, man, lose lose. Labels: architecture, coding, mvc, style posted by ruffin at 4/03/2015 03:06:00 PM |
|
|
Watching files grow to see when a process that's writing to them ends is a little like watching grass grow. But there are easier ways than http://stackoverflow.com/questions/18645759/tail-like-continuous-ls-file-list/18645991#18645991
So Also neat was to learn a bit more about http://unix.stackexchange.com/a/45628/87389
Labels: bash, command-line, linux, noteToSelf posted by ruffin at 4/03/2015 02:00:00 PM |
|
| Thursday, April 02, 2015 | |
|
Getting the text of existing sprocs is apparently pretty easy:
Voila. I've been having trouble with ordering the results of a stored procedure, probably by putting results in a temp table. Seeing, in this case, the code to create the temp table the sproc's giving back should be useful. Although, in my case, no dice. I ended up cheating and trivially rewriting the sproc and the sproc it called.
So a quick change there...
... and I'm working. (Or I could have just overwritten spgetcompositejobinfo with one that sorted different, but that's obviously destructive, and usually A Very Bad Idea.) Labels: sproc, SQL, SQL Server posted by ruffin at 4/02/2015 11:23:00 AM |
|
| Wednesday, April 01, 2015 | |
|
More fun thinking aloud about MVC architectures. After reading David Hansson on "Russian doll caching", I think I'm coming around on why you'd use entities to put together piecemeal views, though I'm not sure I'm buying yet. I'll have to find the post again, but there was one in the links I put up yesterday that said that full page caching was caching's holy grail. Compare the full page mentality to how Hansson describes the issues of caching at serious scale:
This implicitly means that you're going to have extra cost piecing together every page, even if you're just stitching cached content, and the pseudo-formula to compare to C And this largely depends on how many of your widgets appear on more than one page where some [other] subset of the content churns.
Still, it's easy enough to conceive of each of these reusable chunks as embedded views, and then you're back to where you started. Pages might be Russian dolls of views (though that's the wrong metaphor beyond expressing the Herbertian concept of "views within views within views". Once you understand views can be made up of views can be made up of views, ad infinitum, you then have to remember that any number of "dolls" can live at any level, rather than the Russian dolls' one-within-one-within-one. Perhaps your main view has five "dolls" inside of it, and those have 2, 3, 0, 1, and 0 dolls inside of them, respectively, and those have...), but then so what? If you get to the point that one of your embedded views only takes data from one table, great. I guess the only way this is useful is if the same information appears more than once on a composite page of subviews. I still think you're often getting yourself to a specialized DTO for each view, and then you should have an equally specialized Read and mapping that populates that DTO. Unless the price of querying a cache for reused information across many views is less than the price of rebuilding each cache that would be invalidated when that information changes. And that's directly dependent on the number of pages you serve between cache churns. That is, you can call it an entity, but I think it's more useful to call it a ViewModel. Stop mapping database tables to entities. Always read exactly what you're about to put onto the page directly from the database. That's what it's there for. Really. Smart folks are working hard to optimize your queries. I realize caching makes you think you've already got the data on hand, but your hand-rolled or, worse, ORM's automatic execution plan isn't, at some point, going to be nearly as good as stating what you need in targeted SQL sent to your real rdbms. So, and I'm perhaps overusing Atwood's micro-optimization theater post a little, without a clear winner to the "monolithic refresh vs. stitched page composition" formula a priori, what's important to me is making the system easy to support. And then, certainly, C (Worth adding that I'm unfairly equating Hansson with SQL/Cache/AutoMap/ORM/Repo/MVVM (SCAORM?) here. Totally unfair; he never says he's ORMing in these posts, afaict. I think the beef here is that he's serving modular pages, and I wonder if it's worth the extra complexity short of MAX SCALE!!1! -- and even then, when you get to displaying logically disparate information, we might be saying something similar anyhow.) That's enough thinking aloud today. Way too many tedious box-watching style chores this week, sorry. Labels: architecture, coding, mvc, style posted by ruffin at 4/01/2015 12:21:00 PM |
|
|
| |
|
|
All posts can be accessed here: Just the last year o' posts: |
|||||||||||||||||||||
|
||||||||||||||||||||||
|
|
|
|