|
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! |
|
| Friday, December 23, 2022 | |
|
Ah, one quick Markdown lesson I learned recently. If you've got Markdown inside of "real" block-level html tags, it's not supposed to be rendered.
That shouldn't be bold. It renders as... This is **some Markdown**.
Unexpected, but (with a hat tip to this SO answer), apparently correct behavior according to The Grubes:
Welcome to the land of unintended consequences. It looks like the deal was "stop adding all these danged There is, however, a non-standard workaround, as described by Python-Markdown's docs:
So if you have
you should have This is some Markdown. ... but I need to add that to MarkUpDown if I want to support it. And since it's not like someone is going to add that that doesn't want it, I guess I should! Labels: gruber, html, markdown, markupdown posted by ruffin at 12/23/2022 08:36:00 AM |
|
| Friday, January 24, 2020 | |
|
Added Disqus comments to the blog today. I imagine they do all sorts of nasty things behind the scenes with cookies and JavaScript. I apologize for that in advance -- though see below. The way I've done it, you'll only get that nastiness if you go to a single-post page by permalink. Note also that I use the really old version of Blogger where I have my own html theme with some Blogger variables (like Here's what I added to my template. Neat plus: It's not loaded at all on my front page, and since every post is listed in its entirety there, you shouldn't get any Disqus nastiness unless you go to a specific post. That said, I've always kinda liked Disqus as a comment manager, so I hope you'll find it useful.
Key lines:
I'm pretty sure those are the Blogger variables you want to use for those two properties. And then le piece de resistance. Or whatever.
By adding that check in the shudder area Disqus says not to edit, you make it so that Disqus isn't loaded on your home page (or on archive review pages like this one), which is good, because who wants Disqus on every freaking post on your home page? That'd be lots of wasted space. Taking the Disqus UI off of posts on the home page of the blog is also good because the UI will only pop up under the first post on the page. That's because Disqus doesn't honor multiple instances of its UI on the same URL. Which leads us into Good Thing #3: Those comments on the first page would forever be for the first post on the home page, which would change from day to day. So it's an important check. Anyhow, with that info in hand, all you dinosaur Bloggers can add Disqus invasive nastiness to your posts too and enable comments in a manner that's much more mature than all the crap Google and Google+ has tried to pull (and then pull back!) over the years. posted by ruffin at 1/24/2020 11:53:00 AM |
|
| Tuesday, May 08, 2018 | |
|
Recently, I've been playing around with this pretty good howto for Reduxless React SSR, which needed a few tweaks to work. Once things were running, and I could tell in Chrome's network tab that I was receiving good, pre-rendered [by the server] content, I had some difficulty as an SSR n00b figuring out if the client was wasting time re-rendering or not. I take that back --
* In the second point, what I mean by "free" is that if I messed around with the React extension in Chrome for a while, and it looked like things were moving quickly/not manipulating DOM after load. Adding SSR to the test app I'd initially written with client-side-only rendering felt like a win. But this exercise also told me I wasn't familiar enough with React's decision-making process for when it'd decide to call Luckily, I bumped into How does React decide to re-render a component? at lucybain.com that discusses exactly that:
Hearing React wasn't exceptionally choosy about when to refire render made me feel better about all the render calls I saw, even after SSR. My components seem to be That means when it comes to the client-side render calls after successful SSR, I believe the answers to my above questions are...
Why does one use truly universal React?Now even though I've learned to use the magic of
And this one:
For me, the quick take-home is this:
I'd like to see updates on those. Does Instagram still use SSR? Does it think that's smart? Is SEO still enough of a use case for the overhead, especially now that at least Google's spider renders JavaScript? Is the SSR done with Universal React? This also gives you a clue of where we might go for SSR -- not universal React. Wait, what? Are you pondering what I'm pondering?
No no! I'm thinking we should look into doing SSR without React a little more closely. SSR is just string manipulationLook, SSR is the simplest thing you've ever read more than three articles about. At its core, it's just string manipulation. Let's look at a little node express code from the article I initially referenced:
Follow that?
It's that simple. You could use anything to create that Make sense? The most beautiful upshot of this "discovery" is that you can use any server you want for SSR. Want to create your SSR content for a React SPA with C# and Razor?
(It really isn't rocket science here -- the advantages of this approach are essentially tantamount to those when you used Apache in 1997. "Hey look! You want static text?! I can make you static text!" Or maybe more like using Classic ASP in 1997. "You want text generated from a database?!! You got text generated from a database!1!" Wow, man. Groovy.) But I thought Universal was architecturally superior?I really like the possibility of using the same language on the server as the client. There seem to be lots of obvious, inherent advantages. For one, you can write your business validation logic once, and reuse it on the client & server. That's beautiful. For example, you almost get client-side validation "for free" when you write good server-side validation. And if I had a quarter for every time server-side validation on a project lagged behind the client (this is so wrong, folks. SOOOOO wrong), I'd have a few bucks. But there is overhead in fully supporting universal React once you get past the first, obvious wins. And, truth be told, I've slowly moved off of doing any real validation client-side in all but the most network-starved use cases. I love JavaScript, but I'm practical enough to realize that thin clients are the best clients. Have your client ready to handle validation payloads from the server, but don't have any business logic client-side if you can help it. Once you get past the proverbial Universal siren song and then also realize that SSR is really, at its core, simply what it says -- html rendered on the server-side, not necessarily html rendered with the same complex code as the client, now on the server -- you will finally have the most flexibility for composing the best, most performant React sites. Random, somewhat related, somewhat timely reading: Redux - Not Dead Yet! Labels: html, javascript, react, ssr posted by ruffin at 5/08/2018 03:37:00 PM |
|
| Thursday, April 26, 2018 | |
|
Until recently, MarkUpDown had allowed you to paste copied HTML snippets into Markdown with all of the html styling retained using the not-so-discoverable shortcuts alt-v and, with quote, alt-shift-v). This pasted those snippets into your Markdown with all of the HTML's CSS, making for the potentially neat situation where your quote was visibly very different from the rest of your page, preserving the look & feel of the page which provided your quote. I quickly found that preserving colors could make for ugly pastes, and wrote some code to remove those styles, but otherwise, quotes would appear to be very similar to the original.
So not exact, but you can see the resemblance with the original:
But the code was also very ugly. There was so much CSS it started to ruin the whole "shorthand" nature of Markdown.
This html code was provided by Microsoft’s HTML Clipboard Format. The CSS dump above is, honestly, essentially exactly what I get from the clipboard’s garbled mess. Browsers seem to translate many classes into inline (To the HTML Clipboard Format’s credit, however, you also get the original link, so that "From VueJS.org" link preceeding the quote is a "free" part of the "paste html as quote" action in MarkUpDown.) Here’s the first
Good grief, right? You don’t want all that trash in your otherwise pretty clean Markdown, do you? The first thing I tried was to pull all the styling out into classes that I’d put just north of the blockquote, making something like this…
<style>.q233941โ321 {word-spacing: 0.05em; line-height: 1.6em; position: relative; z-index: 1; font-family: โSource Sans Proโ, โHelvetica Neueโ, Arial, sans-serif; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial;}
I also started trying to normalize the classes and pull out shared settings when they overlapped so there wouldn’t be as much text before the blockquote. That was fun. The classes route is better, at least once you get to the blockquote, but that’s still a lot of markup to inject into a markup shorthand. I didn’t like it. So for now I’ve removed inline styles and classes from pastes, which I’m about to release. I don’t feel great about, but you do retain the markup, most importantly bold, italics, links, even images, which is a heck of a lot better than treating HTML as plain text. But it isn’t nearly as pretty to look at now. I’m planning on bringing styles back under the "opt-in" settings under the "Beta Features" section of settings, but it’s hard to justify the overhead I’ve already spent on it. The Markdown stays cleaner now. That’s ultimately an improvement for a Markdown editor. Oh well. Thus is the life of a utility author. Labels: html, markdown, markupdown, style posted by ruffin at 4/26/2018 01:22:00 PM |
|
| Monday, January 16, 2017 | |
|
One of the interesting things about the MLK, Jr. spread on the Apple front page?
The markup.
I wonder who else has had an posted by ruffin at 1/16/2017 12:00:00 PM |
|
| Friday, October 14, 2016 | |
|
Let's talk HTML Fragments in your clipboard when coding on Windows. I've created what's arguably the best Markdown editor on Win10 (if I do say so myself), and wanted it to be more intelligent when I was pasting content that comes from web browsers. That is, in the original version of MarkUpDown, if you copied the text I've got highlighted, below, from DaringFireball...
... and you pasted it into MarkUpDown as a quotation (Ctrl-Shift-V), you'd get unstyled text, like this...
I mean, that's okay-ish. Unfortunately, you'd have to go put in an additional line after each line so that it's not all scrunched into one paragraph. And you lose that Gruber was block-quoting Mossberg. And you lose that "they stop trying" was originally in italics. That stinks. Isn't Markdown really supposed to be shorthand for html? Can't we handle pasting html better than that? Yes, yes we can... TL;DRGo pull the HtmlFragmentHelper, a working, in-progress library for turning HTML Fragment strings into view models with these properties...
There are also several convenience methods to help you get, say, the top- and second-level domains for the HTML Fragment's source URL ( Here's an example:
Read how to use it here. Get it from GitHub, though the only file you really need is here. And here's a quick article on how to get code back into the clipboard as html, which I'm not doing. HTML Fragment FormatWant to paste clipboard HTML as HTML? Enter Microsoft's HTML clipboard format. Instead of using the standard code to read the clipboard's contents, like this...
... now you use this...
But when you look at the contents of
What comes back isn't a string with html source, but an "HTML Fragment" formatted string that looks like this: HTML Fragment from Edge
Wow. No, really, wow. That surprised me. I was using Edge this time instead of Chrome, and whoa. Edge includes the entire page's header. That said, that's really not a horrible idea. We have really good context for this fragment, and if we wanted the original CSS, for example, we know where to get it.
HTML Fragment from ChromeBut let's take a look at where I initially started, with Chrome.
See the difference? Chrome's fragment initially looks much more focused, but also provides much less information about the code's original context. Worse, Chrome's puts all the CSS information inline, and repeating each CSS property inside of each pasted html element makes the source a long ways away from DRY. And that out-of-context, inline CSS is lossily translated, which will cause us some rendering problems that we'll see and discuss in a bit. Original SourceNow Edge's fragment isn't perfect. Here's the original html of that snippet straight from the server...
Look how clean the original is! Why can't we just get that? Chrome's CSS injections and line flattening makes for a much less human readable snippet. Edge is close, but still weird. Take another look. For some reason, Edge's fragment makes every tag uppercase like it's 1998. It also trashes Gruber's original (and thoughtful) whitespace. Also yuck. I mean, Gruber's using Markdown to write Daring Fireball. In a perfect world, I'd take that clipboard's html and turn it back into Markdown when it's pasted into MarkUpDown. How do we get this original source? Start and End FragmentThe important thing to catch is that the HTML Fragment format almost always includes a full html doc with html and body tags after the Though Chrome immediately dives into your selected text (the "true" html fragment) immediately after the If you ignore context like this, though, it's an easy enough feat to take the string and parse out the "true fragment's" html by splitting the entire HTML Fragment string on
When we parse out that html and insert it into our Markdown from Chrome, however, we get some, um, interesting results.
I'm going to wrap these pastes in Edge Parsed Code
Though you should remember that the original source has been smeared together, losing its newlines, and all the tags are strangely capitalized, the source looks pretty nice. It's plain, and adopts the local styling for the most part, but the most important markup is still there -- the blockquote, the italics, links if they'd been included, etc. Chrome Parsed Code
Um, ew. Wha' happen'd? Unfortunately, even though Daring Fireball's entire page has the same styles applied, this inline kludge Chrome performs puts it only in each, in this case, Let's look at all the overhead we have for each
And here's what we have from Chrome's Dev Tools' "Computed" style tab:
But note that that's essentially all from one css file, as properties from user agent stylesheets are simply the browser's defaults:
If you'd like, we can compare the fragment's CSS vs. the stylesheet. Spoiler: It's a mess. Not a lot of matching. Click here to see. Ugly. The bottom line is that With HtmlFragmentHelper, I have a couple of choices. One is to strip all inline styles out, or at least some subset of styling. If I want to maintain as much of the original as possible, I might just blast anything that injects colors into the html, like Or I could normalize the CSS and optionally (via a property on I think I'm going to do the former, though it's not in there as of this writing. That Chrome paste looks horrible as is, though. If only there was an easier way... HTML Fragment from FirefoxThere are certainly other applications that create HTML Clipboard values. I ran into LibreOffice's when using Calc, their spreadsheet app, and its html clipboard doesn't include Start and EndFragment tags. Wonderful, folks, wonderful. But isn't there one glaring omission I might want to add here? You know, I think there is at least one... For fun, let's take a look at Firefox's fragment too. Firefox isn't as popular as it used to be, but it's probably worth taking a look. (Remember that this is all on Windows, and Safari is dead enough by now that I'm not going to bother with v5.)
Oh, so beautiful. Same whitespace as the original, with the added bonus (?) that the final paragraph is also text wrapped. No crazy inline CSS attempted. No header overhead or 1998-style HTML TAGS. You could argue that Chrome is better because it has that inline CSS (yuck!) or Edge because it has the full page headers, but honestly, we're only one step farther away from what Edge gave us. We have the URL here. If we have network access to get CSS, we have network access to read the header and figure out where the CSS lives ourselves. Don't overcomplicate things. Beautiful. Good looking code continues to look good when pasted inline with Markdown. Firefox Parsed CodeAnd Firefox's snippet is just as nice when pasted.
I miss Firefox. Labels: c#, howto, html, long, markdown, markupdown, microsoft, tutorial posted by ruffin at 10/14/2016 11:46:00 AM |
|
| Tuesday, April 19, 2016 | |
|
Sometimes, code smell comes from your documentation:
Giving invalid data until "the browser will give up" is a best practice, is it? Whew, that smells. I love the, "The trick is to really force" line. "Really force"? "Hey, Firefox, remember when I told you to turn off autocomplete? It's just an informal request. If I want you to really honor it, I'll really force you to." /sigh Protip for Mozilla: Firefox form autocomplete is broken. I don't really care if it follows standards; most users and nearly every web developer will tell you its behavior is broken. I hate to see [sic] it, but it looks like Firefox usage may be down over 12% over 2015. It was my favorite browser to use for dev and home. I think the trend is pretty clear: There are now only three browsers. Edge/IE on Windows, Safari on iOS (and OS X, if you count it), and Chrome. posted by ruffin at 4/19/2016 10:56:00 AM |
|
| Wednesday, April 06, 2016 | |
|
The Apple TV remote apparently underwent a change in the most recent update. Used to be that you could just touch the Apple TV remote's trackpad, and you started tracking. Not so any longer. That just pops up a little hint that if you fully click the pad you'll jump forward or back 10 seconds, depending on where your finger is. Annoying. I couldn't find a quick workaround, so I was telling Siri, "Fast forward 15 minutes," and "Rewind 20 mins". What a freaking pain.
They set me up with a phone call, which is to say they routed me to a web page where I set up a phone call. The call went well, actually. Tara (?) knew exactly what I was talking about, and had had the same think happen to her with her Apple TV. "I am in Netflix, in case that matters." "No, what do you think I'm doing when I get home? Exactly that." The answer was to pause what you're watching. Then, and only then, will you be able to use the "Touch Surface Tracking". Anyhow, long story a touch shorter, check out the spacing in this survey form I was sent to fill out the next day: Wow. Just wow.[1] Check out that "Next" button down at the bottom. Do designers not get to use this on 27" iMacs? I mean, I like things that work on lowest common denominator, but shouldn't somebody test in a larger monitor? Finding the culprit wasn't too difficult.
See that hard-coded Ouch. That's not what you want. Just change those two to 200 and 180 and you get... I know, I know, now there's the chance that some pages are taller than others. You can either make the original pane as large as you need for your busiest screen (not great, unless you're careful with how big the UI gets or scroll for questions that are exceptionally long), or you could just move the Next and Submit buttons to the top of the page and let it bounce from frame to frame. You can argue that these two alternatives are wrong for whatever reason, and I'm sure there's a better option, but it'd be hard to argue what they have right now is right. Ouch. I mean, I know they have good people at Apple. I recall looking at the source in iCloud once to see how they were doing their calendar and seeing a hidden job advert with an ASCII art cloud with a smiley face in it. Now it looks like they're removed it, but that's a cute touch, and the web version of Calendar is actually pretty good. Ask me, I'd know. If I'd been willing to move to CA right now, I would've applied. [1] Yes, this from a guy whose blog has been hard-coded to 600px seemingly since the invent of the Internet. posted by ruffin at 4/06/2016 12:07:00 PM |
|
| Wednesday, March 02, 2016 | |
|
Sometimes, experience does bite you, if only gently. I've still been using
I often look through html to find a good name attribute to link more directly to something I find interesting. Looks like that'll be lots easier now. Phew. Labels: html, noteToSelf posted by ruffin at 3/02/2016 09:35:00 AM |
|
| Wednesday, June 17, 2015 | |
|
That tab separated values to ASCII (and Unicode) table-like structures generator is here. And here's the sauce of that link (for me, at least). Particularly useful for StackOverflow. Labels: html, markdown, noteToSelf posted by ruffin at 6/17/2015 02:19:00 PM |
|
| Thursday, May 28, 2015 | |
|
While reading up on how to properly respond to
No, I'm not saying you necessarily need to code around the foibles of a now [thankfully] fairly rare version of IE. What I am saying is that this is a rookie mistake that made it out of QA at one of the best software engineering companies (particularly in 2002-2003) there is, and in one of its marquee products. Anyone who has used streams has run into issues with buffers similar to this one. This is, at worst, a slight variation on theme. Though I'm not suggesting you forgive bad code either, it is slightly comforting to know that, at least 12 years ago, Microsoft let something so [okay, potentially anachronistically] glaring slip. posted by ruffin at 5/28/2015 09:12:00 AM |
|
| Friday, October 19, 2012 | |
|
It's help doc time at the end of a project, boys and girls, and reading through our existing docs after adding pages for the stuff I'd just programmed I found a page where an image was described in the text as an imagemap, but it wasn't. After the requisite Googling for an html imagemap on OS X and only finding a few pay-to-play examples, I thought, "The GIMP should do this, right?" It does. 14. Web Filters I should make a video tutorial that's a little more straightforward than this written one, but it's a great tool. GIMP as a whole is a little slow on OS X imo, but this tool is complete money. Make circle, quadrangles, or any multipoint poly, save your imagemap to a text file, edit points easily, and load and reedit the thing later. Filters >>> Web >>> Imagemap. Voila. It's essentially perfect. Thanks Maurits Rijk, and yes, I left the HTML comment in the page. Labels: html, noteToSelf, tools posted by ruffin at 10/19/2012 10:21:00 AM |
|
| Wednesday, October 17, 2012 | |
|
No, seriously. WYSisn'tWYG, you can't [obviously] edit CSS files directly, you can't insert images into folders via the OS and have RoboHelp realize they're there, it puts the images it does import into the project's root folder by default, its editor st1nk0rz, and it's carp [sic]. Seriously. A big, giant, floppy piece of carp. I'm willing to use it temporarily on the assumption that folks who usually write help on this particular project need the hand-holding, but I feel like I'm in a fight with my hands tied behind my back. posted by ruffin at 10/17/2012 09:52:00 AM |
|
| Thursday, March 25, 2010 | |
|
If there's one thing that I know Jobs would like to have back, it's an Apple computing platform with tightly controlled access for developers. As the Wall Street Journal apparently reports (via AppleInsider): "Jobs has kept 'tight control and directors have rarely challenged him.'" His preferred dev environment is no different. Right now, on the Macintosh, anyone can code up an app and release it without so much as Googling (Binging?) the Apple Human (once User) Interface Guidelines. Heck, even I've released apps for the Mac into the wild. Oh noes!!! Oh wait, Jobs has gotten that closed development environment, hasn't he? It's the iPod, iPhone, and, increasingly overlapping with the Mac, the iPad: In February, it was rumored that Hulu, an online streaming video destination for multiple networks, plans to make its videos available without Flash for the iPad platform. Reports then alleged that the Web site could be prepared by the time the iPad launches April 3, though it was said the service would likely be subscription only. If the iPad only does HTML5/H.264 jive, the fact that this protocol isn't the most popular on the net gives it a leg up on open browsers. That is, if Hulu makes HTML5 pay to play only, thanks to the iPad's effectively closed platform, Hulu has a ready-made, similarly closed/captive market. * If the iPad did Flash, not only would there be a closed system involved that Apple doesn't control, but there'd be no easy way to differentiate folks using the iPad platform. Goodbye Hulu revenue stream. *With no Flash, Hulu has a reason to partner/get in bed with/come to the defense of Apple's iPad and to temper its support of Adobe's Flash. Captive markets are exactly what Jobs likes to have (see the iPhone developer program and the rules for distributing software, where Apple can even, 1984-style, rip programs off of your iPhone retroactively!), at least until he gets to the point that market dominance (digital music) makes it so that captivity works against Apple selling hardware. So once the iPod and the iTunes Music Store dominate digital music, Jobs makes DRM leave the stage precisely to ensure there are no competitors to the gorilla. But, again, the interesting point here is how Apple is reinventing the Mac. As the iPod stretches out and begins to swallow the Macintosh via the iPhone and now iPad, it's essential to pay attention to the compromises these [at least relatively] closed platforms are making. The iPad will do 50% of what I use my MacBook for and essentially 90% of what I use my iPod touch for (the balance being "fitting my pocket"). But I can't run my Java apps on my iPad, and probably never will, and certainly won't without Jobs' permission. (Yes, I realize Apple develops and maintains the standard Mac JVM, but there are others that work on OS X. Don't split hairs, please. ;^D) Labels: browsers, control, DRM, ethics, evil, html, iPad, iphone, ipod, iTunes, online distribution posted by ruffin at 3/25/2010 10:01:00 AM |
|
| Saturday, November 14, 2009 | |
|
Finally dug up an easy enough AJAX sample, and thought I'd share my slight variation on theme. If you put these two files into a dir on a webserver, you can play around a bit with the URL you're calling (URL isn't really a URL and must be relative -- calling off-site URLs seems to cause some security issue where you keep getting nothing back) and what you expect to find in the querystring and post vars. Once you've got this running, you're pretty much raring to go with AJAX. Many examples have more error checking, which would likely be useful, but this is working so I'm going with it for now. ajax.php <html> ajaxCatch.php <html> Labels: code, html, php, problem solved posted by ruffin at 11/14/2009 10:51:00 PM |
|
|
| |
|
|
All posts can be accessed here: Just the last year o' posts: |
|||||||||||||||||||||
|
||||||||||||||||||||||
|
|
|
|