Sunday 14 September 2014

[Websites] How to use XHTML with HTML 5

XHTML. Nowadays, whenever you tend to hear about it, it's just people complaining and recommending that you never should use it, since it's old. It's not. If it was so outdated, then why would w3.org be using it on their webpages?

People only think it's outdated because it's more similar to HTML 4, and because it's not commonly used any more. But if you know how to write it, you probably will be writing much better code than most HTML5 developers.

But, the thing is, it's still more like HTML 4 than HTML 5 in terms of features. That's a bit of a problem if you want to use new HTML 5 features and elements, right? The thing is, and not many people realise - you can use HTML 5 with the "betterness" of XHTML.

It's simple! All you have to do to use HTML 5 with XHTML is this:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
...


Now, what does all this do? Firstly, we have the XML metadata tag. This tells the browser which version of XML we want to use, and the encoding of the document. (In HTML, you would normally specify encoding using <meta charset="utf-8" />.)

The next bit is the DOCTYPE. We want HTML 5, and as you probably know, the doctype for HTML 5 is simply "html". Easy.

Now, you just have to remember the one thing: specify the XML namespace of XHTML in the root element - in this case, HTML. You always must do this, or you can face problems.

Now, you can do everything the proper way of XML! Self-closing script tags:

<script src="script.js" />

Proper BR tags, not silly auto-closing magic:

<br />

And, 'cause it's XML, it'll render faster and on more platforms! But... there's one problem. Will my hacky XHTML 5 validate? The answer is... somehow yes! You can do this and it will validate perfectly. To show you what I mean, here's an example:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <nav>
       <a id="picturebtn1" href="page1.html" />
       <a id="picturebtn2" href="page2.html" />
       <div id="decoration" />
    </nav>
    <main>
      <h1>Hello, World!</h1>
      <hr />
    </main>
  </body>
</html>

Now, you might not have noticed, but I purposely did two things. Firstly, I used self-closing tags that would be invalid in non-XML, HTML 5. Secondly, I used two new HTML 5 elements. I could not have done both of these things - only one - if the page was not HTML 5 and XHTML.

Try pasting that into W3's validator. You'll get two warnings: one says that the HTML 5 validator is experimental, and the other says that we didn't need to give the encoding since we were directly inputting the code rather than uploading a file.

To prove that you can't do both these things without XHTML 5, get rid of the xmlns attribute of the head tag and get rid of the XML metadata tag. You'll end up with this:

<!DOCTYPE html>
<html>

  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <nav>
       <a id="picturebtn1" href="page1.html" />
       <a id="picturebtn2" href="page2.html" />
       <div id="decoration" />
    </nav>
    <main>
      <h1>Hello, World!</h1>
      <hr />
    </main>
  </body>
</html>

Now if you try to validate this, you'll get some errors. What they're all saying is that you can't use the XML self-closing syntax on any element you want - only the "chosen ones" will validate if you close them like that.

What if we try to validate it as XHTML strict?

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <nav>
       <a id="picturebtn1" href="page1.html" />
       <a id="picturebtn2" href="page2.html" />
       <div id="decoration" />
    </nav>
    <main>
      <h1>Hello, World!</h1>
      <hr />
    </main>
  </body>
</html>

Put that into the validator again. Now, what are the errors this time? It tells us we can't use the elements nav or main because they don't exist in (X)HTML 4. And who wants to use HTML 4?

I hope after reading this you'll consider using a combination of XHTML and HTML 5 in your webpages, rather than "vanilla" HTML 5. Please feel free to leave a comment on what you think about my idea!

Sunday 3 August 2014

[Tutorial] Kernel.org Kernel Build for Ubuntu

This article is available under Creative Commons Attribution-ShareAlike 4.0. Adapted from KernelTeam/GitKernelBuild - click here for the original authors.

The following document should help users build their own kernel from the latest stable kernel from kernel.org. Please note that the following steps are targeted towards Ubuntu users, though they will also work on Ubuntu deratives (including Mint, Elementary, Deepin etc.) and may also work on Debian and non-Ubuntu, Debian deratives.

Prerequisites

There are a few tools that are necessary in order to build your own kernel(s). The ‘kernel-package’ provides the make-kpkg utility which automatically build your kernel and generate the linux-image and linux-header .deb files which can be installed. You will need to install the following packages:
sudo apt-get install build-essential kernel-package fakeroot libncurses5-dev

Kernel Build and Installation

  1. Change to the directory where you want to download the kernel source. In this example we will use ~/src:
    cd ~/src
  2. Download the kernel:
    wget 'https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.15.8.tar.xz'
    Replace v3.x/linux-3.15.8.tar.xz with the kernel version you want to download. 3.15.8 was the latest stable version at the time of writing.
  3. Extract the files:
    tar xf linux-3.15.8.tar.xz
    Again, make sure to change the filename to be the same as the file you downloaded. You can also remove the original tar.xz file once all the files have been extracted.
  4. Change the directory:
    cd linux-3.15.8
    The directory name will be the same as the filename of the tar.xz you downloaded, except without the .tar.xz.
  5. Copy the kernel config file from your existing system to the kernel tree:
    cp /boot/config-`uname -r` .config
  6. Bring the config file up to date. In cases where your kernel source is significantly newer than the existing config file, you’ll be presented with all of the new config options for which there is no existing config file setting. You can either sit there and keep hitting Enter to take the default (generally safe), or you can just run:
    yes '' | make oldconfig
    which emulates exactly the same thing and saves you all that time. Otherwise, run:
    make oldconfig
  7. (optional) If you need to make any kernel config changes, do the following and save your changes when prompted:
    make menuconfig
  8. Clean the kernel source directory:
    make clean
  9. Build the linux-image and linux-header .deb files using a thread per core + 1. This process can take a lot of time - it took about 17 hours on my old laptop with a Celeron processor, but it should take between 20 minutes and 3 hours on a modern computer:
    make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-custom
    With this command the package names will be something like linux-image-3.15.8-custom and linux-headers-3.15.8-custom, and in that case the version will be 3.15.8-custom-10.00.Custom. You may change the string “custom” into something else by changing the LOCALVERSION option.
  10. Change to one directory level up (this is where the linux-image and linux-header .deb files were put):
    cd ../
  11. Now install the .deb files. Replace the filenames in this example to match your filenames:
    sudo dpkg -i linux-firmware-image-3.15.8-custom_3.15.8-custom-1_i386.deb 
    sudo dpkg -i linux-headers-3.15.8-custom_3.15.8-custom-1_i386.deb 
    sudo dpkg -i linux-image-3.15.8-custom_3.15.8-custom-1_i386.deb 
    sudo dpkg -i linux-image-3.15.8-custom-dbg_3.15.8-custom-1_i386.deb 
    sudo dpkg -i linux-libc-dev_3.15.8-custom-1_i386.deb
  12. Reboot to your new kernel! Just make sure you select it when you boot:
    sudo reboot
This article was updated on the third of August after following these instructions myself to check everything worked.