camen design

Read the Bible in a Year

Whilst I have read large portions of the Bible, I have not been able to stick to reading it consistently.

For this year, it is my intention to read the whole thing. I have prepared a reading schedule that covers a couple of chapters a day. The biggest problem was fitting this immense amount of information into an index card that I could use as a book mark.

This is what I’ve created: View the schedule.

Screenshot of Bible schedule Note: Due to a bug in Firefox, the table will not render correctly.
Please use either Safari / Chrome, Opera or even IE to view / print the schedule.

How to Use This Schedule

  1. Look up the current day in the table using the day number across the first (or last) row, and the month on the left

  2. The 1st row in each month shows the corresponding book. Where names are unable to fit they have either been abbreviated using standard abbreviations, or references which are defined underneath the table

  3. The corresponding cell below the book for each day tells you which chapter to start reading at. Continue reading up to (but not including) the chapter for the following day

  4. On some days you will read more than one book. In these instances that day’s cell is split into two or more, but the cell underneath only provides the chapter number of the first book to start on

    Example showing 1st Peter chapters 1, 5, and 2nd Peter

    Here, you would read 1st Peter chapter 1–4 on one day then on the next day read 1st Peter Chapter 5 (and onto the end of the book) as well as all of 2nd Peter (reference mark ‘L’)

  5. Please note that Psalms Chapter 119 and Jeremiah Chapter 25 are very long and are subdivided between two days. The single-dagger mark notes that on July the 5th you should read Psalms 117–119:72 and Psalms 119:73 to the end of the chapter on the following day. Secondly, the double-dagger mark notes that on the 14th of August, read Jeremiah 23–25:16 followed by Jeremiah 25:17 to the end of the chapter the next day


I had originally tried to create this using Pages, but it refused to split table cells anymore once I got down to Amos. Printing in browsers is generally very broken and inept, but you should be able to scale the schedule down to the desired paper size using the advanced printer settings.

If anybody could make some decent PDFs for me in A6, A7, Index card and Pocket Mod size, I’d greatly appreciate it, thanks!

Targeting Browsers With CSS Using mod_rewrite

Ⅰ. the Need for CSS-Hacks

In a world of imperfect browsers, the CSS-hack can be both a beautiful thing, and also an ugly thing too.

It is unavoidable that at some point some feature or design you wish to implement hits a limitation or parsing / rendering bug of one (or more) browsers you are supporting.

If this has never happened to you; well done—you’re an IE only web-developer who’s never stepped outside of Microsoft software, nor table-based design. You’re probably confused by the term CSS.

If, however, you do not own that privileged position of ignorance, everybody comes across the need to target a particular bit of CSS to a particular browser.

Ⅱ. the Question of Maintenance

There are many arguments about if CSS-hacks should be totally avoided, embraced, or properly managed somehow.

Firstly, to think they can be avoided is naïve. I have a website that only supports Acid2 compliant browsers, uses CSS3 liberally, and doesn’t support IE one iota—and still I have CSS-hacks to deal with browser idiosyncrasies.

The next two lines of argument are either a) just embed hacks in your normal document—it’s less maintenance to only edit one document and b) keep hacks to a separate file where they can be managed individually, ideally using conditional comments to target IE specifically or Javascript to correct behaviour.

Embedding CSS-hacks in stylesheets increases maintenance by making them an integral part of testing in all browsers. CSS designed to correct one browser may have undesired effects on another browser. Or a hack that has been used before, may no longer work on a newer version of a browser, but now you have to scramble to somehow support both browsers.

A hack is anything that has the potential to fail disastrously
each time something changes expectedly.

Having to make corrections to your whole stylesheet to please one browser, is unnecessary maintenance. Having all your failure points in one document is not less maintenance. I have not very fond memories of having to rewrite large portions of a stylesheet because of being unable to please one browser without effecting sic others.

The answer therefore is to tie CSS-hacks—or at least alternative CSS—directly to the browser it fixes, so that it does not becoming a ticking time bomb for other browsers and future versions.

In the case of IE, conditional comments give very precise targeting capabilities. Conditional comments are an excellent solution for applying alternative CSS, rather than relying on CSS-hacks preying on broken parsing. However, there are a couple of let-downs:

Having to maintain HTML because of a browser, is like suddenly waking up one day to discover that the letter Z has been officially depreciated by the European Union and now you have to update all your documents to conform.

Your HTML, like diamonds, should be forever.

Lastly, using a Javascript fix is only increasing the length of thread you have to follow when something breaks. If suddenly you find that a CSS property you apply does not have the expected behaviour in IE, but gives different results with the Javascript fix on, and then off: you now have a maintenance nightmare that involves back-tracking through ‘x’-tons of Javascript, that likely, you didn’t write yourself.

What if a new version of a browser comes out and your Javascript fix doesn’t work with that browser, but also, the site design won’t render correctly without it? Now you’re forced to either remove the Javascript and do the CSS again, properly, from scratch; or update the Javascript with all the work that entails.

A solution is needed that:

  1. Works for all browsers and does not rely on browser-specific capabilities to implement
  2. Negates the need for CSS-hacks, and instead encourages alternative CSS
  3. Targets browsers/versions specifically or according to a range
  4. Does not fail when a new browser or version arrives on the scene

Ⅲ. the Answer Is Still Targeting

We all know that user-agent targeting is bad. It defeats the purpose of having standards to work across all browsers. However, thus far, we have, by proxy, ascertained that there are two types of CSS:

The maintenance problems so far outlined are because there is no clean separation of these two—except for IE conditional comments, with the acknowledgement that they are an incomplete solution.

We have also ascertained that browser-specific CSS is eventually required given imperfect browsers. You can either choose to compromise on your design to avoid this, or compromise on the browser and keep the design. Either way, the end-user should never be compromised on.

It’s important to state that writing standards-compliant, proper CSS is always desired. Legacy browsers are exactly that: legacy. Therefore a solution to dividing the two types of CSS must primarily acknowledge that proper CSS comes first and does not require any maintenance going forward. The current solutions mentioned earlier do not give weight to the better CSS over the bad CSS. Basically, with a perfect solution, a perfect browser would never parse any hack or CSS intended for only one browser—it would be ignorant of legacy browsers.

The important thing with User-Agent targeting is the ability to also not target user-agents. Some believe user-agent targeting to be a form of quicksand that has you chasing after every browser ever made.

A browser that applies the standards, and requires no browser-specific CSS to render the design, does not need to be targeted. No solution is actually needed.

My proposal is therefore a solution only for legacy browsers. If a browser does not need browser-specific CSS to get it to render a design right, then it requires zero maintenance on part of this solution. There is no interference by the solution to browsers that do not need it.

The Solution

Apache’s mod_rewrite module allows us to take a file requested by the browser, and provide a different file instead, based on some matching or non-matching criteria.

What if we had a “fixes.css” file that was different for each browser that needs to be targeted, but void by default so that any browser that doesn’t need fixes, doesn’t get any?

We start with two stylesheets declared in the HTML head element:

<link rel="stylesheet" type="text/css" href="css/main.css" />
<link rel="stylesheet" type="text/css" href="css/fixes.css" />

You write your main stylesheet using absolutely no CSS-hacks or browser-specific workarounds. Write for the future. As more and more browsers come on board with Acid 2 / 3, CSS3 compatibility &c. they should automatically fall into working with your site—zero maintenance needed.

Remember, this mod_rewrite solution is only to bring non-complaint browsers into spec. Ideally, for example, you’d write your stylesheet to meet Acid 2 capabilities and when IE8 is released the site just works, and the IE7 workarounds stay with IE7.

The actual ‘fixes.css’ file itself is, therefore, completely blank.

In your ‘.htaccess’ file use the following two lines to target a browser and rewrite the ‘fixes.css’ file to a browser-specific version: (IE7 in this example)

(Assuming you’ve already got “RewriteEngine on” in your ‘.htaccess’ file and “RewriteBase” if needed.)
RewriteCond %{HTTP_USER_AGENT} MSIE\s7\.(?!.*Opera)
RewriteRule ^(.*fixes)\.css$ /$1.ie7.css [L]

This selects a user-agent containing MSIE 7. as long as it’s not followed by Opera at some point (to ignore Opera spoofing as IE). The ‘fixes.css’ file is then rewritten to a ‘fixes.ie7.css’ file where you may store the IE7 specific fixes you need to apply.

Now users of IE7 will receive a different ‘fixes.css’ than users of any other browser.

It’s a bit like having a user style on your own website. You can apply a CSS “patch” to the site for specific browsers, keeping your main stylesheet legacy free and future-facing.

Potential Uses

In short, old browsers shouldn’t prevent you from using the latest and greatest that up-to-date browsers offer. It’s up to you to keep legacy where it belongs.

Addressing Concerns

“Aha!”, I hear you say. “But surely this creates more maintenance, now we have many CSS files!”

With this solution, when you make a browser-specific correction, you only need to test in that browser itself. Less maintenance. Without this solution, a browser-specific fix also gets parsed by all browsers, and you need to test them as well. More maintenance.

“But now you have to maintain the ‘.htaccess’ file!”

As browsers get more capable, the less browser-specific CSS you will need to target, if at all. An old browser doesn’t stop being an old browser. As long as you’re not changing the HTML, this solution can safely bit-rot without ever being looked at.

This solution also allows you to react smoothly and quickly to an unexpected regression between versions of browsers. Imagine you try out a beta browser like Opera 10 or Firefox 3.1 and you suddenly find your design breaks with it. You can—without touching a line of your existing main stylesheet—add two lines to the ‘.htaccess’ file to detect the new browser, and then develop, on a new sheet, the necessary fixes without compromising any of the existing CSS. You can then choose to leave that as is, or then once working roll it back into the main sheet. This is significantly less panic-prone than having to apply fixes for an unreleased browser to a live, perfectly working stylesheet.

Imagine you want to stop supporting a legacy browser. With this method, you remove the two lines in the ‘.htaccess’ file, delete the specific ‘fixes.css’ file and that’s it—browser unsupported. Without this solution, you would have to manually unpick the CSS-hacks from your main stylesheet and slowly rub-out any influence that browser had on the design of the CSS. Sometimes the only way to truly remove a browser’s influence from a large bit of CSS is to simply rewrite it (due to all the extra capabilities opened up with newer versions that you should now be making use of).

“What about people/browsers spoofing user-agents?”

Not a problem. Seriously. Writing the right regex to spot lame attempts at spoofing is not difficult. Many browsers add like Gecko / khtml despite this being patently false. It’s becoming more common even to add Firefox into Gecko browsers given Firefox’s weight in the market. It’s sad, really, that some have given in to this pathetic behaviour.

If you’re literally browsing with a completely false user-agent by default, you are a) 0.01% of the population and b) have a personality disorder, or something. Spoofing has it’s uses, but it’s legacy as well and should be sent the way of the dodo (if browser vendors stop with this ridiculous behaviour of saying they’re engines they are nothing like).

In other words, the answer is: learn regex.

The HTTP-Request Tax

I hate wasting HTTP-Requests. If you want a fast site, it’s not bandwidth or file size that matters; no, it’s the number of HTTP-Requests. Each one could have potential delays up to 1–2 seconds in worse cases.

So there’s a severe flaw with this solution, the browser has to fetch two CSS files, even if the browser doesn’t need any fixes. This is a tax on good behaviour!

There is a workaround for this that presents only one stylesheet to compliant browsers, but two stylesheets to those browsers that need fixes.

If you present just one stylesheet in the header:

<link rel="stylesheet" type="text/css" href="css/main.css" />

And then, in the ‘.htaccess’ file, redirect ‘main.css’ to the fix sheets, for those legacy browsers:

RewriteCond %{HTTP_USER_AGENT} MSIE\s7\.(?!.*Opera)
RewriteRule ^(.*)main\.css$ /$1fixes.ie7.css [L]
# ...

# after legacy fixes, redirect ‘main.css’ to the actual main sheet ‘_main.css’
RewriteRule ^(.*)(?<!_)main\.css$ /$1_main.css [L]

And at the top of each fixes sheet, just simply import the main stylesheet.
(The main sheet uses a dummy name to prevent the @import from getting stuck in an infinite loop.)

@import "_main.css";
/* browser specific fixes here... */

This way, a browser that needs correction gets the fixes sheet first (with the main stylesheet imported at the top) and a browser that doesn’t need any fixes just gets the main sheet alone.

Example Reference

For those with worn C and V keys, here’s some additional rewrite conditions to select particular browsers (Add the RewriteRule according to your chosen method). If you’ve any suggestions for good examples, do send them my way

If you want some sample user-agent strings to work out the right regex needed for a particular browser, here’s a good list.

Internet Explorer (Any Version):

RewriteCond %{HTTP_USER_AGENT} MSIE\s\d\.(?!.*Opera)

Change \d to any number to select a particular version

Internet Explorer, Version ‘X’ and Below:

RewriteCond %{HTTP_USER_AGENT} MSIE\s(\d)\.(?!.*Opera)
RewriteCond %1 <=7

Change the <= to >= to target a particular version and above.

Firefox, Versions Before 3.0:

RewriteCond %{HTTP_USER_AGENT} Gecko/(\d{8})(?!.*Opera)
RewriteCond %1 <20080529

Do not ever try detect Firefox using “Firefox”. Remember that Gecko, the rendering engine that powers Firefox is used in many other browsers too that would have equal capabilities, such as Camino. Many browsers now spoof as Firefox too, so always detect using the Gecko date of the browser in the user-agent.

iPhone:

RewriteCond %{HTTP_USER_AGENT} iPhone|iPod

Enjoy.

ReMarkable!

ReMarkable is my own Markdown-like syntax, used to write and publish the content on this site.
It is a plain-text method of writing articles that is then converted into HTML.

To skip the talk and see it in use, you can add “.rem” to the end of any article on this site to see the original ReMarkable source for the article. For example: “/code/remarkable.rem”.

Version History

v0.2.4—31st December ’08
  • Added testing script to verify output (incomplete)
  • **strong** will now give <strong>*strong*</strong> instead of <strong>*strong</strong>*
  • Lines being conjoined even if word-wrapping was off
  • Correctly indent small blocks as paragraphs, also allow small blocks within lists/blockquotes
v0.2.3.1—17th December ’08
  • Links were not working, bug introduced in previous version.
    I need to implement some unit tests or something
v0.2.3—17th December ’08
  • nofollow support for links, prefix URLs with “!”
  • PRE blocks now allowed within lists, definition lists and blockquotes
  • Blockquotes were not converting if they were the last thing in a document
v0.2.2—14th December ’08
  • Soft-space as newline marker has been removed. Too many problems involved with it being invisible unless your text editor has white-space on and differentiates spaces from soft-spaces. Instead, use the ‘not’ character “¬”. This is located directly on the keyboard on PCs and obtained via Alt+L on Mac.
v0.2.1—11th December ’08
  • Some HTML tidying not working when $indent>0
v0.2
  • Initial Beta Release

Why ReMarkable?

I have a lot of HTML. In writing and tweaking the content on this site, I found I was getting bogged down in a lot of HTML tags for relatively minor things, such as links, abbreviations and citations.

Though I love writing in HTML, I wanted to reduce this complexity and focus more on the content than the markup.

The first place I turned to was Markdown, probably the most widely known plain-text formatter. John Gruber wrote Markdown for his site, daringfireball.net and to suit his way of writing articles.

There were a number of shortcomings with Markdown when placed against my site:

Working around these concerns of mine could have been possible by using another Markdown clone that would be easier for me to customise. A project called PHPMarkdown implements a Markdown parser in PHP, it also adds to the syntax, providing additions like abbreviations and definition lists.

There’s one big problem with PHPMarkdown though. It’s size. My site’s php is almost 600 lines long. PHPMarkdown is almost 3’000 lines long. To include PHPMarkdown in my site would be like strapping an elephant to a flea and asking it to jump a canyon.

Really then, what I knew I had to do was to write my own Markdown clone, in my own particular demeanour. I could cherry-pick the best syntax I wanted, but ultimately make it as artful as Camen Design is itself.

Features

At a glance, compared to Markdown, ReMarkable has:

ⅰ. More Inline Syntax:

ReMarkable adds syntax for {abbr|abbreviations}, ((small text)), ~citations~, [insertions], --deletions-- and «inline quotations».

ⅱ. Definition Lists:

The PHPMarkdown syntax doesn’t allow for optional descriptions, where as the HTML spec, and ReMarkable does.

:: Definition Term
	Description…
	
:: Definition Term 2

:: Definition Term 3
	Description…

You can see this structure put to good use in this article.

ⅲ. IDs in Headings:

An idea taken from PHPMarkdown, for the benefit of writing a table of contents, or others linking to specific parts of an article, headings can have an HTML ID like so:

# Heading Level 1 # (#id)

Heading Level 2 (#id2)
======================
Heading Level 3 (#id3)
----------------------

Links with absolute URLs are automatically marked up with rel="external".

Hyperlinks directly to a file have the type="mime/type" attribute added automatically for the most common file types. ReMarkable has an easy to modify internal list of these types automatically recognised.

The benefit of this is that a) you should be doing this anyway, and b) you can use CSS mime-type icons like this.

ⅴ. Intelligent List Paragraphing:

ReMarkable intelligently adds <p> tags to <li> items.
A normal list:

•	Item 1
•	Item 2
•	Item 3

Produces:

<ul>
	<li>Item 1</li>
	<li>Item 2</li>
	<li>Item 3</li>
</ul>

If any list item contains more than one paragraph, or any other block such as another list or blockquote, paragraphs are automatically added.

•	Item 1
•	Lorem ipsum dolor sit amet, consectetur adipisicing elit.
	
	sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
•	Item 3

Produces:

<ul>
	<li>Item 1</li>
	<li>
		<p>
			Lorem ipsum dolor sit amet, consectetur adipisicing elit.
		</p><p>
			sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
		</p>
	</li>
</ul>

But, if you put blank lines between the list items:

•	Item 1

•	Item 2

•	Item 3

ReMarkable adds paragraph tags for all list items

<ul>
	<li><p>Item 1</p></li>
	<li><p>Item 2</p></li>
	<li><p>Item 3</p></li>
</ul>

Lastly, if a list item contains no space between the opening text, and a list within the list item, ReMarkable does not add the first paragraph. Why? For a table of contents list:

1.	Features
	1.1.	More Inline Syntax:
	1.2.	Definition Lists:

Produces:

<ol>
	<li>
		Features
		<ol>
			<li>More Inline Syntax:</li>
			<li>Definition Lists:</li>
		</ol>

	</li>
</ol>

Notice Features is not wrapped in a paragrah.
ReMarkable does all of these conversion cases using only one regex replace.

ⅴⅰ. Human Readable Output:

In order for ReMarkable to be acceptable, it had to replace my hand-written HTML.
ReMarkable outputs clean and organised HTML and does perfect word wrapping so that when you view-source you don’t have to scroll sideways.

ReMarkable can also indent the whole output to your liking, so you can fit it into your blog template. <pre> blocks are intelligently unindented so that your code samples don’t break trying to fit ReMarkable output into your site design.

Remarkable Code

Whilst not on exact feature parity with PHPMarkdown, ReMarkable achieves it’s design with very compact code.

PHPMarkdown is spread across 120 functions composing two classes.
ReMarkable is nearly 400 lines long in just one function.

Lists, definition lists and blockquotes are recursively converted (including all the conversion cases mentioned above) in two lines of code. Needless to say, the regex kills a kitten each time you run ReMarkable.

ReMarkable’s code has been a real labour of love. I have tried to make sure it is well commented, but the tricks being used to reduce the amount of looping, and to achieve all that it does within one function can be difficult to understand. A future Under the Hood article will do a more detailed breakdown of the PHP used.

What’s Next?

The goal with ReMarkable was to be able to publish my entire site’s contents. That has been achieved.

Now ReMarkable is in your hands. I’m sure you’ll find a million bugs I never noticed. I don’t write articles the same way you do. Send bugs and suggestions to kroccamen@gmail.com

What’s Planned

There are a number of shortcomings of ReMarkable that I’m aware of and will be tackling at various stages of the future (as Camen Design’s needs demand, really).

Autotext

For the benefit of being a) lazy and b) writing on systems where Unicode is not so easy to type, I’d like ReMarkable to integrate a SmartyPants like auto-text converter to add smart quotes and other typographical highlights like en & em dashes. Also things like automatically adding <sup> to number ordinals.

Autotext would also include syntax to automatically generate a table of contents list from ReMarkable-headings with IDs

Syntax highlighting for PRE blocks

This won’t be rolled into ReMarkable itself, but instead be a separate add-on module (which will also allow you to use a different more better syntax-highlighter than my own). At the moment I’m manually marking up my code examples as there is no current syntax-highlighter that is small enough and able to deal with my website’s position of having no classes.

I intend to write a tiny and simple syntax highlighter, that works without classes, to automatically markup (not just colour) my code samples automatically.

Tables?
Syntax for writing tables will be difficult to add in elegant way. A lot of thought will have to be put into this as it must maintain clean markup and work primarily without classes. (It’s a sin of software to force the artist to use a particular class-name, when that is their decision and shouldn’t be taken out of their hands). How would you like it if you bought a canvas to paint on, but the canvas mandated that you must paint only fruit?

Any suggestions though for these features, is always welcome.


Priorities

That said however, ReMarkable was not designed to ever be all things to all people. In accepting suggestions and fixes into my version of the code, these are ReMarkable’s priorities:

HTML5, UTF-8. No classes
If you need every HTML tag to have a class or ID you need to learn how to write better code.
ReMarkable doesn’t output any HTML5 specific tags, so it’s safe to use in HTML4
Sloppy writing is not a fringe case

ReMarkable will never allow escaping of characters. That’s a cop out to avoid properly designing the syntax.
Any weird text you’re writing that’s firing off ReMarkable syntax is more than likely a computer term or technical quote and should be wrapped in `code` spans.

For example: I copied the ~luser folder to ~root would be recognised as a citation between the two tildes. Regardless of any literal readability, these folder names (including the tilde) are not part of the English language. Use I copied the `~luser` folder to `~root` instead.

If the bug can be solved by following the syntax documentation correctly, or by changing two or three letters in your source, then it’s not a bug.

Code is Art
If I can’t maintain elegance and beauty in the code then it can’t be worth it.

Enjoy.

wordle.png (199.6 KB)

A poster of my code section’s RSS created by wordle.net.

How many Google Chrome users does it take to change a lightbulb?
None. The lightbulb is isolated, so if it fails, the room doesn’t go dark.