Several weeks ago I added a ‘Recent Articles’ box to the site. At times I may go a couple of weeks between writing these more focused, ostensibly interesting, pieces of writing. It depends mostly on my free time, but also motivation.
Writing these pieces takes several hours, often across multiple days. If I were to set aside the self-deprecation for a moment, I might even say I like these articles and maybe even be proud of them. (I had better stop before I pass out.)
The consequence of these feelings it that I want them to be noticeable and not get buried under the slightly more frivolous link posts. Thus the ‘Recently’ block was born to highlight some of my recent entries. I decided to put it on two pages: the most recent link entry page and ‘below the fold’ of the home page.
Note: The templates discussed below are only the relevant excerpts and the indentation may a bit wonky, at least for my tastes. Links are provided to view the full templates. Alternatively you can download them all at once.
Generating the content block
The most integral part to this is generating the HTML that builds the block. Because it’s used in two places, I saved it as a template module that saves the generated content in a variable called
recentlyContent. The items it generates differs slightly depending on where I want the block to go.
If the Recent block is appearing on a link page, then I want the last three articles displayed, no matter when they were posted. When it’s being placed on the home page, there’s a bit more nuance. If the latest article is one of the three most recent posts to the site, I don’t want it to appear in the block.
Plugin Note: This requires the MultiBlog plugin which allows the system to pull data from multiple blogs at once. I call it using the
blog_ids attribute. In my case, blog 1 is articles and blog 2 is for linked posts.
<mt:Unless> block handles this logic. The value for the variable
on_link_page is specified in another template we’ll see later. If it is unset,
<mt:Entries> gets three posts and loops through them testing whether any entries are from blog 1. If one is found, it sets an offset variable which will be used later in this template.
<mt:SetVarBlock name="recentlyContent"> <mt:Unless name="on_link_page"> <mt:Entries blog_ids="1,2" lastn="3"> <mt:If tag="EntryBlogID" eq="1"> <mt:Var name="articleOffset" value="1"> </mt:If> </mt:Entries> </mt:Unless>
The second block of code, in an
<mt:If>, gives the Recently block a header and opens the
<div>. It handles a special case for setting margins when the block is on a link page, again evaluating the
<mt:If name="on_link_page"> <h2 id="recently-head" class="on-link-page">Recent Articles</h2> <div id="recently" class="on-link-page"> <mt:Else> <h2 id="recently-head">Recent Articles</h2> <div id="recently"> </mt:If>
The final block does the work of putting the article titles and subtitles into HTML. The
articleOffset variable appears here as the
<mt:Entries> requests the last three articles starting from
0, unless the offset was set to
1 in the initial logic.
<mt:Entries blog_ids="1" lastn="3" offset="$articleOffset"> <a href="<mt:EntryPermalink replace='.html',''>" title="Read ‘<mt:EntryTitle>’"> <p class="recently-title"><mt:EntryTitle widont='1'></p> <p class="recently-subtitle"><mt:EntryExcerpt widont='1'></p> </a> </mt:Entries> </div> </mt:SetVarBlock>
Permalinks have their file extension removed (for clean URLs) and the titles are processed by the Widon’t plugin. The finished
<div> is saved in the aforementioned
recentlyContent variable to be output in the template which calls/includes the module.
‘Recently’ on the home page
The Recently block is put onto a page in two steps. First, the HTML is generated and placed into the
recentlyContent variable as detailed above. This process is called by using the
<mt:Include module="Variable – Recently">
The template continues by opening up the
<main> content block and entering the primary
<mt:Entries> loop, calling additional modules to display articles and links.
<main class="page-content"> <mt:Entries blog_ids="1,2" lastn="23"> <mt:If tag="EntryBlogID" eq="2"> <mt:Include module="Entry Body – Link"> <mt:Else> <mt:Include module="Entry Body – Article"> </mt:If>
The second step in the process is simply outputting the contents of the variable. For me, choosing where is a bit complicated. On the home page I prefer for the block to appear ‘below the fold’. Which is to say that I want it to appear slightly or completely below the initial viewable area; you have to scroll to see it.
To accomplish this is an inexact science only using HTML and CSS. I concluded that using a basic word count would suffice. If the first item listed is fewer than 110 words, then Recently will be ‘delayed’ and placed after the second.
To get this, I check if the current entry is the first using the
__first__ meta variable. If it is, I use the
setvar tag modifier (a shortcut for
count_words, which unsurprisingly counts the number of words returned from a tag.
<mt:If __first__> <mt:EntryBody count_words="1" setvar="firstEntryWordCount">
<mt:If> evaluates the word count and if there are more than 110 words, it gets the content saved in
recentlyContent – done and dusted. Otherwise it sets a variable indicating that Recently should be delayed until after the first entry. The loop then continues to the next entry.
<mt:If var="firstEntryWordCount" gt="110"> <mt:GetVar name="recentlyContent"> <mt:Else> <mt:SetVar name="delayRecently" value="1"> </mt:If>
As the next entry is displayed, it’s no longer
__first__, causing the following to be evaluated. If
1 (true), then
recentlyContent will be output. This would be true for all following posts, so the final piece is to set the delay variable to
0 (false), ensuring the block is not displayed again.
<mt:ElseIf var="delayRecently" eq="1"> <mt:GetVar name="recentlyContent"> <mt:SetVar name="delayRecently" value="0"> </mt:If> </mt:Entries> </main>
Once the 23 entries have been evaluated, the main content block is complete.
‘Recently’ on link pages
Compared to the logic used on the home page, link pages are quite simple. I only need to place the block on the most recent entry. These link pages are produced as an ‘individual archive’ in Movable Type parlance. The biggest difference is that the pages aren’t produced in the
<mt:Entries> loop, so we can’t use the
__first__ variable. Each entry is effectively both first and last as it’s being written by the system.
Instead we can use a slightly roundabout way to evaluate if this is the latest entry by using the
<mt:EntryNext> tag. If a next entry doesn’t exist, then include the Recently template and pass the
on_link_page variable. (
blog_id specifies which blog the template belongs to and is necessary since the Link template is in blog 2.) Finally, display the content generated by the variable.
<mt:Unless tag="EntryNext"> <mt:Include module="Variable – Recently" blog_id="1" on_link_page="1"> <mt:GetVar name="recentlyContent"> </mt:Unless>
That’s all that’s required.
Taking ‘Recently’ off old link pages
Though it is possible for Movable Type to generate dynamic pages, I still prefer to keep plain, static, HTML pages. Every time I publish a new item its file is created by Movable Type.
Following that logic, every Link page would end up with the Recently block on it. When the page was generated, it didn’t have a next entry. The block would also be stale. But it’s not.
Working around this would be convoluted, but fortunately we can lean on Movable Type’s behaviour to correct the issue. The link pages include navigation links to next and previous entries. When a new entry is created, the previous needs to be updated to add a link to it, regenerating the page. This means our
<mt:Unless> block is re-evaluated and Recently is not displayed. Very convenient.
Musical infection from The Divine Comedy
Two Steps Forward
Only a small step back
Long Live the Open Web
A little or a lot, just blog
Steven Aquino on Twitter:
One cool tidbit about Voice Control: It uses the TrueDepth camera on iOS/iPadOS to tell if you’re looking at the computer. If someone walks over and you turn your head, Voice Control will stop listening until you go back to your computer.
I think Voice Control is the thing I got most excited about watching the WWDC 2019 presentation a couple weeks ago. I am able to use my Mac without such features, but it looks so cool that I can’t help but want to use it.
Mr Aquino’s point helps illustrate that a lot of work – and thought – went into making the feature. So much so that calling it a ‘feature’ almost trivialises it.
I’m still very excited to play this game (again). It may be fun to explore the new features, like custom player-made dungeons, but I can be satisfied with the main adventure. I love that even inconsequential things, like the placement of enemies is the same. So much of this game is permanently etched into my brain.
I’m less excited by the art style, though. The glossy three-dimensional is fine, but the human characters’ faces are uncomfortable to look at. I don’t like the pointy featureless noses or the empty black eyes. I am probably in the minority. It won’t stop me playing the game, certainly.
I can’t wait to hear more of the music. We hear The Ballad of the Wind Fish as the trailer closes. The song was always moving, but hearing it in full instrumentation, it’s heartbreaking.
Last week The Divine Comedy, the band made up of Neil Hannon and company, released a new album entitled ‘Office Politics’. I compliment it to say that it is a completely typical example of a Divine Comedy album.
It seems that Hannon has sold his soul for the ability to create endless perfect earworms. I curse him when one of his tunes floats back into my head. (But only a little.)
The two songs that are most often popping up for me are the single, ‘Norman and Norma’ and ‘Philip and Steve’s Furniture Removal Company’. The lyrics of the latter are just those six words, repeated. The notes the words are sung to, though, are infectious.
I can’t stop listening to it, both by choice and by having it foisted upon me by my brain. If you listen, do so with my warning. And approval.
Hide the tampon in a pamphlet about women’s reproductive rights. Menfolk can’t stand any mention of women’s reproductive rights.
The other day it was Dave Winer, now today Brent Simmons writes about his blogging set up – how he writes and runs Inessential, as well as his microblogging and reading processes.
In a follow-up, he talks more about ‘short stuff’ and intensifies my interest in maintaining something that’s more like a traditional ‘blog’.
[This video] makes me realize the real reason I am blogging on Rocket Panda instead of something like SquareSpace or Tumblr. … The reason is because it’s my platform. I own every pixel of this website and I can control what goes on here and what doesn't.
Well said. Recognising and acknowledging this feeling can be a source of motivation for ourselves and others. I tend my front garden to have flowers that please me – and maybe others – but no one can dictate what is planted there.
Getting your own space online is feasible for anyone. If you have questions or need advice, ask friends or the authors of sites you admire. The internet is, ultimately, a friendly place and new voices are always welcome.
I have recently become interested in the IndieWeb effort. The belief that we should own our content and be in control of it resonates with me.
I can’t yet bring myself to mar my HTML with microformat declarations. For no good reason, I did add my site to the IndieWeb web ring, though.
The project was created by Marty McGuire during the IndieWeb Summit in 2018. The web ring concept is charming and feels like the internet of the 90s. That retro feeling is quickly balanced by a domain made of emoji characters. It’s almost painfully modern, being impractical to type.
Each site in the web ring directory is given an randomly-generated emoji identifier. I can’t help thinking that mine, ➕😞📭, with the prominent ‘disappointed face’ emoji, is appropriate.
Links to the next and previous sites from mine in the web ring are available in the page footer.
Japan plans to make it mandatory to charge for plastic shopping bags at supermarkets, convenience stores, drugstores and department stores as the country combats marine pollution by plastic waste.
Though this is only a small part of Japan’s plastic problem, I can’t believe I will live to see this day.
The price charged for a bag will be set by the shop. I expect that the price they charge, at convenience stores in particular, will be very inexpensive. Nonetheless, because the customer needs to be asked, perhaps they’ll consider taking their items without one.
I’ve never been to a supermarket where plastic bags were free, but the prices are typically 3 yen for a smaller bag, and 5 yen for a large one. They’re very cheap, but I almost never see them bought – most everyone has an ‘eco’ bag for life.
(I used to live near a shop which sold the city’s required bin bags as their ‘I forgot my eco bag’ alternative, which I thought was brilliant.)
Apple have revived the New York typeface, last seen in the pre-OS X days. Unlike the San Francisco face, which was wholly new, new New York is an update of the old version, and it looks great. It even comes in four optical sizes, so the type should look beautiful no matter how large or small it’s displayed.
It’s a pleasure to see ‘New York’ back in my fonts menu. I’m excited for its potential to improve the typography of web sites, much as San Francisco has done.
(Thanks to Rose for the tip-off.)
Dave Winer writes about how his homemade blog software, Old School, works. He’s an outliner guy and it’s based on outlines. It suits him and his style perfectly.
What I admire about Winer’s writing is that it’s simple. Partly because he’s thinking in outlines, some posts may only be a sentence. It’s like his ‘traditional’ blog and a micro blog rolled into one. I like this style a lot.
That is why for a couple weeks I’ve been playing with doing something similar myself. Some of the items I’ve written I wouldn’t mind having on the site front page. Others are more like journal posts: abysmally boring, even for the author. I need to figure out what I want it to be and where, or if, I want it to appear.
This site is now hosted on Linode. This fact in itself is not very interesting, but in the process of the transition, I’ve made a couple of infrastructure changes. The most important is to how the site is served.
Both DNS and caching are now handled by CloudFlare. This is important because I’m using a local Linode data centre – very fast for me, but potentially a bit slow elsewhere. By using CloudFlare, the site is cached and can be served quickly no matter where you are physically located.
Side Note: I only discovered today that CloudFlare’s essential services, like caching and DDoS protection are free.
Why change hosts?
I was very happy with my previous host, NearlyFreeSpeech.net (NFSN), and their shared hosting plan. They charge you based on your actual usage of services. For a site like mine, with low resource usage and no database server, it was very inexpensive: generally not exceeding $2 USD per month. Even though I may not be a customer for much longer, I recommend them highly.
Part of the reason they can offer their services for such a low price is that support is an optional add-on. Forgoing it is fine if you’re comfortable getting help on your own or from a knowledgeable friend. NearlyFreeSpeech still offer lots of help for free, though. They have an extensive FAQ and a forum where you can ask other users for help. In my observations, a system administrator will answer questions helpfully and quickly before users do. Only if you need specific instructions or something done for you do they seem to request you use a support incident.
NFSN also reduce their overhead by aggressively upgrading their software. Any deprecated versions of software are phased out as soon as possible, which certain reduces security threats. This is, regrettably, where I start to find myself in trouble as a Movable Type user.
Whilst I strongly prefer older versions of the software, which can be run on modern Perl, even the most recent version can be slow. This is mostly a problem when the software generates HTML files. If I were to regenerate all the files on the site and that process took more than 3–5 minutes, it may be terminated by the NFSN system. Because the site is more settled now, this isn’t something I do often, but with every new post, the time needed to rebuild increases slightly.
The app’s speed can be improved by running it through FastCGI. Unfortunately NFSN don’t offer native FastCGI support. I could have set up my own dæmon to run it, but it would introduce additional cost. The ability to have it baked in to my web server and running under a supported version of Perl led me to thinking it might be time to move to a virtual private server.
That’s where I am now, where you are reading this. I’m running the cheapest Linode server on offer, which is still only $5 USD per month. The server itself is faster, and when I SSH into it, it’s so responsive that it usually feels like the server is on my local network.
I’m still considering this an experiment, however. In the coming months the server needs some significant software upgrades which may require more effort than I’m willing to give. For now I’m enjoying the new-found speed and freedom.
Congratulations are in order!
I’ve been using builds of NetNewsWire regularly since it got Feedbin syncing a week or two ago. It’s a joy to have it back on my Mac. Making it even better today, as Brent says, ‘it has a NetNewsWire icon’, and MarsEdit has its partner back on my Dock.
A simple, wonderful word:
Pleasure in another's happiness.
I discovered this word listening to Something Rhymes with Purple. It’s a podcast about words and language hosted by the utterly fabulous Susie Dent and the ever-entertaining Gyles Brandreth. (It’s hurple by the way.)
Many of us are often in situations where we need to speak to a non-native speaker of our language. For me the opposite is even more frequent – I speak passable Japanese for most situations, but I’m certainly not native, not even highly proficient.
In those situations, I’m doing my best to keep up my end of the conversational bargain to communicate to the best of my ability. Nonetheless, I must also place a burden on the listener. I hope that they will work with me to find meaning when I forget a word, use the wrong word or pronounce it with the wrong stress. Fortunately for me, I gave found that an overwhelming number of people do. They’re even polite enough to go along when I’ve misunderstood and responded in an unexpected way.
There are people who fall outside that category, which is unfortunate for us both. Nothing will get me more nervous and mealy-mouthed than the dead look in someone’s eyes as I attempt to make conversation. As the article suggests, they may be able to overcome this by practising. For people in the areas where I live in work, however, they’re not afforded many opportunities to do so.
What may be remarkable, then, is that so many people are good listeners. For them, I am thankful.
The famed Hoefler&Co have a new modern web site. It looks good, but there’s a lot more to it than that.
The individual typeface pages have been made much more useful. An overview page displays a wide array of specimens featuring multiple weights, sizes and lengths of text.
Even better, though, are the ‘How to Use’ pages (like this one for Sentinel). All sorts of advice is given, like what font sizes fit each weight, how to create emphasis and texture, and how to use any special characters in the fonts.
There are also better tools for choosing a typeface. The ‘Fonts’ menu guides the user to collections based on style, proportion, sizes and uses. This really helps to narrow down your selection before getting started, and getting overwhelmed with options.
One of the finest touches to the new site is the new ‘Meet Hoefler&Co’ page. There they celebrate that their company is made up of people. Notably, the biographies for the typeface designers reveal some of the faces they’ve worked on. After some of the unpleasantness of the past, this is nice to see.
The quick brown fox jumps over the lazy dog – perhaps the most famous of all pangrams. They’re sentences which use every letter of the alphabet at least once. In English many of these tend to use some of the same words frequently (vex in particular comes to mind). There’s still plenty of creativity to be found if you forego the ‘perfect’ pangram and use some letters more than once.
Some of my favourites:
- The five boxing wizards jump quickly.
- How vexingly quick daft zebras jump!
- Sphinx of black quartz, judge my vow.
Don’t miss: Richard Rutter saved a huge list pangrams in English and other languages after they were deleted from Wikipedia.
Yesterday, Daniel Jalkut (maker of the wonderful MarsEdit and FastScripts), entreated:
Everybody, join me in writing just one blog post today, to get that independent feeling back.
What made it even more enjoyable is that he later shared links to the posts people wrote that day. I’ve been missing the feeling of the ‘blogging community’ we had in the 2000s. In the past months I’ve been looking for (and finding) new people’s blogs to follow and this helped me to find a couple more.
This site has been an effort to do my part too, for what it’s worth. I have written something here pretty much every day since I took it in hand a few months ago. This is both surprising and pleasing in equal measure.
Taking his own advice, Mr Jalkut expanded on his tweets by writing a blog post. In it, he considers why posting on social media might be more enticing:
I think people neglect to write blog posts because the feedback loop is not as tangible as the onslaught of (sometimes mechanical) likes or faves that you can receive on a social network.
I don’t know that I’ve ever got an ‘onslaught’ of interaction on Twitter, so this might apply more to others. It seems a likely factor, though. That and how posting to social media is, in most cases, much easier. He goes on:
With blogging, you need a little faith that you will gain an audience.
One thing that I did decide soon after I started this site was that I wasn’t going to care about people reading or subscribing to it. It’s for me. Should anyone read it, of course I shall be pleased, but I don’t want that to be a measure of its success.
The area known as Oharaimachi extends from near Uji Bridge at Ise Shrine’s Naikū (the Inner Shrine) in the city of Ise, Mie Prefecture. The heart of this area is Okage-yokochō, a recreation of the Ise-ji road as it might have been during the Edo period (1603–1868) and the Meiji era (1868–1912).
I’m lucky enough to live a short walk away from this area. A summer doesn’t really feel complete until I’ve had the Akafuku mochi shaved ice, which is relentlessly cold and sweet, but balanced by the warm tea served with it.
The main attraction of the area is the Grand Ise Shrine, whose grounds are resplendent with green. This and the low mountains in the area are what cemented my desire to live here. Years later I’m still captivated by them every day.
The internet has been incandescent today with the news of Panic’s new handheld gaming system.
My own excitement – and I am very excited about it – comes from the feeling I get looking at the device. The colour alone shouts joy. Joy for gaming and for designing interesting and beautiful hardware to play games on.
Secondly, the crank. It at first smacks of silliness, and then I think back to how silly the idea of swinging a Wiimote around sounded. The innovation it allowed is what made the platform so successful. I don’t know that a crank is quite at the level of responsive motion control, but I have no doubt it will open interesting new interactions. Then you realise it is silly and bound to be fun.
Also: At least one of the initial library of games is by Keita Takahashi, creator of Katamari Damacy, which I love irrationally.
A couple weeks ago, Brent Simmons reminisced about small directory web sites for web communities. His gave the example of ScriptWeb, and wanting something like it for iOS. (The solution to that problem is Rose’s Automation Orchard as he later noted.)
Today another such community site was born upon the internet, Mac Open Web:
A collection of open and indie Mac, iOS, and web apps that help promote the open web.
It’s a fantastic idea and taking Brent’s advice, its creator, Brian Warren, has put the project on GitHub so that others can contribute to it.
Isn’t the Internet wonderful.
OmniFocus has long had the ability to drop projects that are no longer part of your system. Dropping is like deleting, except that the item stays around in the database, should you ever want to find it again. More likely, you may just want to keep a record of not only what you chose to do, but things you chose not to do.
Starting in OmniFocus 3.4 for Mac and 3.3 for iOS, actions will gain the same ability to be dropped. You can sign up to help test the feature.
Flexbox Froggy is an interactive tool, ostensibly a game, designed to help you learn how to use CSS Flexbox.
The Flexulator tool I’ve linked to before deals with the flex and grow properties of Flexbox. Froggy on the other hand concentrates on positioning using justification, alignment, wrapping and order.
The twenty-four exercises provide a controlled and increasingly-difficult sandbox in which to learn. I might not call them fun, but they were a helpful challenge.