Add more content (contact, colophon, arch on air post)
authorAmin Bandali <amin@aminb.org>
Mon, 21 May 2018 03:54:02 +0000 (23:54 -0400)
committerAmin Bandali <amin@aminb.org>
Mon, 21 May 2018 03:54:02 +0000 (23:54 -0400)
.gitignore [new file with mode: 0644]
2016/11/arch-macbook-air.md [new file with mode: 0644]
_header.html [new file with mode: 0644]
colophon.md [new file with mode: 0644]
contact.md [new file with mode: 0644]
index.md
ssng
styles.css

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..89f9ac0
--- /dev/null
@@ -0,0 +1 @@
+out/
diff --git a/2016/11/arch-macbook-air.md b/2016/11/arch-macbook-air.md
new file mode 100644 (file)
index 0000000..e6a9e46
--- /dev/null
@@ -0,0 +1,281 @@
+title: Arch Linux on MacBook Air 2013
+date: 2016-11-01
+---
+
+# Arch Linux on MacBook Air 2013
+
+This post summarizes how I install and dual-boot Arch Linux with
+Full-Disk Encryption alongside macOS. It is not meant to be a
+replacement for the [Installation Guide][installation] or the
+former [Beginner's Guide][beginners]. Rather, it mostly serves as a
+small summary with a few useful notes about the gotchas.
+
+[installation]: https://wiki.archlinux.org/index.php/installation_guide
+[beginners]: https://csdietz.github.io/arch-beginner-guide/
+
+So, make sure you understand what you type into your terminal. If you
+don't, checking out the Arch wiki should probably be your first step.
+
+_Note:_ you will need internet access throughout the installation and
+the MacBook Air's WiFi doesn't work out of the box on Arch Linux. I
+recommend using your phone's USB Tethering (if it does support it), or
+using an Ethernet-USB adapter.
+
+## Shrinking the macOS partition
+
+The first step I take is resizing the HFS+ macOS partition to make
+room for the new <abbr>GNU/Linux</abbr> installation. There are plenty
+of tutorials on how to do this using macOS's Disk Utility, so do that
+and then come back!
+
+## Creating a bootable Arch Linux Installer USB
+
+There are different ways of creating a bootable Arch Linux USB, all
+documented on the [USB flash installation media][usb_install] page on
+the Arch wiki, but the simplest one is using `dd` if you already have
+access to another UNIX system.
+
+[usb_install]: https://wiki.archlinux.org/index.php/USB_flash_installation_media
+
+<span class="red">Warning:</span> make sure you backup the data on
+your flash drive, as `dd` will irrevocably destroy all data on it.
+
+Use `lsblk` to find the name (block device) of your USB drive, then
+run `dd` (as root) as shown below:
+
+``` bash
+dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync
+```
+
+Replace `/path/to/archlinux.iso` with the path to the Arch image you
+have downloaded, and `/dev/sdx` with your drive.
+
+## Booting up from the USB
+
+After creating the install USB, reboot your laptop and hold the alt key and boot
+into the USB.
+
+When booting is complete and you're presented with the prompt, it's a good time
+to make sure you're connected to the internet (see the _note_ at the top of this
+post).
+
+Use `ping` to verify that you've established a connection:
+
+```bash
+ping archlinux.org
+```
+
+## Updating the system clock
+
+Once you're connected to the internet, make sure the system clock is accurate:
+
+```bash
+timedatectl set-ntp true  # start and enable systemd-timesyncd
+```
+
+You can check the service status using `timedatectl status`.
+
+## Partitioning
+
+I won't dive into partitioning and instead, I'll refer you to
+the [Partitioning][partitioning] page of Arch wiki. Of the available
+partitioning tools, I personally prefer `cfdisk`.
+
+[partitioning]: https://wiki.archlinux.org/index.php/Partitioning
+
+## Setting up LVM & LUKS
+
+I use a [LVM on LUKS][lvm_on_luks] setup, where I set up LVM on top of
+the encrypted partition.
+
+First, let's set up the underlying encrypted partition:
+
+``` bash
+cryptsetup -v --cipher aes-xts-plain64 --key-size 512 --hash sha512 \
+           --iter-time 5000 --use-urandom -y luksFormat /dev/sdaX
+```
+
+where `/dev/sdaX` is the partition you created in the last step
+(e.g. `/dev/sda4`). For more information about the `cryptsetup`
+options, see the [LUKS encryption options][luks_options].
+
+[lvm_on_luks]: https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_an_entire_system#LVM_on_LUKS
+[luks_options]: https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encryption_options_for_LUKS_mode
+
+Then we open the container:
+
+``` bash
+cryptsetup open --type luks /dev/sdaX lvm
+```
+
+Now it's time to use lvm and prepare the logical volume(s):
+
+``` bash
+pvcreate /dev/mapper/lvm
+vgcreate vg /dev/mapper/lvm
+lvcreate --extents +100%FREE -n root vg
+```
+
+This will create a physical volume on the mapping we just opened,
+create a volume group named `vg` on the physical volume, and create a
+logical volume named `root` that spans the entire volume group. More
+complex setups are possible thanks to the great flexibility of lvm.
+
+We now format the logical volume with `ext4`:
+
+``` bash
+mkfs.ext4 /dev/mapper/vg-root
+```
+
+## Installing the base system
+
+Let's mount the logical volume, make a directory for the mount point
+of the boot partition, and mount the boot partition (`/dev/sda1`):
+
+``` bash
+mount /dev/mapper/vg-root /mnt
+mkdir /mnt/boot
+mount /dev/sda1 /mnt/boot
+```
+
+Finally, let's install the base system (and optionally `base-devel`):
+
+``` bash
+pacstrap /mnt base base-devel
+```
+
+## Configuring the system
+
+Let's generate the fstab:
+
+``` bash
+genfstab -U /mnt >> /mnt/etc/fstab
+```
+
+Use your favorite terminal-based editor, edit the fstab file and add
+the `discard` option for the root partition to enable TRIM on the
+SSD.
+
+Now we change root into our newly installed system and will configure
+it. Adjust these according to your own setup.
+
+``` bash
+arch-chroot /mnt /bin/bash
+passwd  # set the root password
+echo myhostname > /etc/hostname  # set the hostname
+ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime  # time zone
+hwclock --systohc --utc   # write system clock to hardware clock (UTC)
+useradd -m -G wheel -s /bin/bash myuser  # create myuser
+passwd myuser  # set the password for myuser
+echo "myuser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/myuser
+# uncomment en_US.UTF-8 UTF-8 and other needed locales in /etc/locale.gen
+locale-gen
+echo LANG=en_US.UTF-8 > /etc/locale.conf
+export LANG=en_US.UTF-8
+```
+
+Then adjust the initramfs hooks in `/etc/mkinitcpio.conf` and enable
+the `encrypt` and `lvm2` hooks, and make sure `keyboard` is available
+before `encrypt` so you can actually type in the LUKS password when
+booting. Your `HOOKS` line should look similar to this:
+
+```
+HOOKS="base udev autodetect modconf block keyboard encrypt lvm2 filesystems fsck"
+```
+
+After adjusting the hooks, build the initramfs:
+
+``` bash
+mkinitcpio -p linux
+```
+
+Now, install the `intel-ucode` package. We'll configure the bootloader
+to enable intel microcode updates.
+
+``` bash
+pacman -S intel-ucode
+```
+
+Create the `/boot/loader/loader.conf` with the following content
+(adjust the timeout to your liking):
+
+```
+default arch
+timeout 3
+```
+
+Then create the entry for Arch:
+
+``` bash
+mkdir -p /boot/loader/entries
+touch /boot/loader/entries/arch.conf
+```
+
+Now edit `/boot/loader/entries/arch.conf` to specify the Arch entry:
+
+```
+title    Arch Linux
+linux    /vmlinuz-linux
+initrd   /intel-ucode.img
+initrd   /initramfs-linux.img
+options  cryptdevice=/dev/sdaX:vg:allow-discards root=/dev/mapper/vg-root rw
+```
+
+Again, `/dev/sdaX` is the partition you created in the
+**Partitioning** step as the underlying encrypted partition.
+
+Finally, install the bootloader, exit the chroot, umount and reboot!
+
+``` bash
+bootctl install
+exit
+umount -R /mnt
+reboot
+```
+
+## Post-installation recommendations
+
+Congratulations! You now have a minimal Arch installation.
+
+At this point, I usually install my favorite AUR
+helper, [pacaur][pacaur], then I
+install the [broadcom-wl-dkms][broadcom-wl-dkms] wireless driver
+and [mba6x_bl-dkms][mba6x_bl-dkms] backlight driver to fix the post
+suspend/resume issue where three's no brightness after waking up from
+suspend, and the only available brightness would be 100%.
+
+[broadcom-wl-dkms]: https://aur.archlinux.org/packages/broadcom-wl-dkms/
+[mba6x_bl-dkms]: https://aur.archlinux.org/packages/mba6x_bl-dkms/
+
+``` bash
+pacaur -S linux-headers dkms  # linux-headers is required for dkms
+pacaur -S broadcom-wl-dkms
+pacaur -S mba6x_bl-dkms
+```
+
+[pacaur]: https://aur.archlinux.org/packages/pacaur/
+
+Then, I'd like to install
+
+- input, graphics, and sound drivers,
+- a desktop environment (I prefer Xfce or LXQt),
+- a display manager for login screen (lightdm or sddm), and
+- a network manager (NetworkManager or ConnMan).
+
+Check out the [General recommendations][gen_reqs] for more details.
+
+[gen_reqs]: https://wiki.archlinux.org/index.php/General_recommendations
+
+## References
+
+Here are some resources I've come across each with lots of useful bits
+and pieces, about installing Arch on a MacBook:
+
+- [pandeiro/arch-on-air](https://github.com/pandeiro/arch-on-air)
+- [Arch Linux on MacBook Pro Retina 2014 with DM-Crypt, LVM and suspend to disk](https://loicpefferkorn.net/2015/01/arch-linux-on-macbook-pro-retina-2014-with-dm-crypt-lvm-and-suspend-to-disk/)
+- [Installing Archlinux on Macbook Air 2013](http://frankshin.com/installing-archlinux-on-macbook-air-2013/)
+- [Arch Linux Installation with OS X on Macbook Air (Dual Boot)](http://panks.me/posts/2013/06/arch-linux-installation-with-os-x-on-macbook-air-dual-boot/)
+- [Installing (encrypted) Arch Linux on an Apple MacBook Pro](https://visual-assault.org/2016/03/05/install-encrypted-arch-linux-on-apple-macbook-pro/)
+- [Installing Arch Linux on a MacBook Air 2013](http://alexeyzabelin.com/arch-on-mac)
+- [Arch Linux running on my MacBook](https://medium.com/phils-thought-bubble-of-recent-stuff/arch-linux-running-on-my-macbook-2ea525ebefe3)
+- [Dual boot Arch Linux on MacBook Pro Installation](http://codylittlewood.com/arch-linux-on-macbook-pro-installation/)
diff --git a/_header.html b/_header.html
new file mode 100644 (file)
index 0000000..0ac8879
--- /dev/null
@@ -0,0 +1,13 @@
+<h2>
+  <a id="aminb" rel="author" href="https://aminb.org/">amin bandali</a>
+</h2>
+<br>
+<a href="/cv">cv</a>
+<span class="bar">|</span>
+<a href="/now">now</a>
+<span class="bar">|</span>
+<a href="/projects">projects</a>
+<span class="bar">|</span>
+<a href="/contact">contact</a>
+<span class="bar">|</span>
+<label for="light-off" class="light-off-button"></label>
diff --git a/colophon.md b/colophon.md
new file mode 100644 (file)
index 0000000..79721dd
--- /dev/null
@@ -0,0 +1,29 @@
+# Colophon
+
+This is my personal website, previous versions of which I've ran on
+different domains since 2012.
+
+## Night mode
+
+To toggle night mode, click on <label class="light-off-button-inline"
+for="light-off"></label>, which is always available on the top
+navigation menu. It saves its state in a browser cookie, other than
+that no JavaScript is required to use this website.
+
+This website is generated using `ssng`, a fork of Roman Zolotarev's
+[ssg][ssg], and is served by [Nginx][nginx] on [Debian][debian].
+
+## Copyright and Licenses
+
+The source code for this site is licensed under version 3 of the [GNU
+General Public License][gplv3] (see the [`COPYING`][copying]
+file). The content of the posts is licensed under the [Creative
+Commons BY SA][cc] license.
+
+
+[ssg]:     https://www.romanzolotarev.com/ssg.html
+[nginx]:   https://www.nginx.com
+[debian]:  https://www.debian.org
+[gplv3]:   https://gnu.org/licenses/gpl.html
+[cc]:      https://creativecommons.org/licenses/by-sa/4.0/
+[copying]: https://git.sr.ht/~aminb/aminb.org/tree/COPYING
diff --git a/contact.md b/contact.md
new file mode 100644 (file)
index 0000000..1cf8ee1
--- /dev/null
@@ -0,0 +1,45 @@
+title: Contact
+
+# Say hello!
+
+You can contact me via email or through my accounts on various online
+platforms.
+
+## Contact info
+
+- <amin@aminb.org>
+- <aminb@gnu.org>, I'm a volunteer GNU webmaster
+- <abandali@uwaterloo.ca>, I'm a grad student @ UW
+- gpg key: [500C 1D55 D1EC 1FED E8C0 C8DE 4E05 246A B0BF 7FFB][gpg]
+- [@aminb:matrix.org][matrix] on Matrix
+- aminb on [freenode][freenode] and [moznet][moznet]
+<!-- - [@amin@soc.aminb.org][pleroma] on the [Fediverse][fediverse] -->
+- [aminb@member.fsf.org][member.fsf] via XMPP
+
+## Other online places
+
+- [~aminb][srht] on [sr.ht][sr.ht]
+- [aminb][github] on GitHub
+- [aminb][gitlab] on GitLab
+- [amin][keybase] on Keybase
+- [aminb][lobsters] on Lobsters
+- [aminb][reddit] on Reddit
+- [aminban][twitter] on Twitter
+
+
+[gpg]: http://pgp.mit.edu/pks/lookup?op=vindex&search=0x4E05246AB0BF7FFB
+[matrix]: https://matrix.to/#/@aminb:matrix.org
+[freenode]: https://freenode.net
+[moznet]: https://wiki.mozilla.org/IRC
+[pleroma]: https://soc.aminb.org/users/amin
+[fediverse]: https://en.wikipedia.org/wiki/Fediverse
+[member.fsf]: xmpp:aminb@member.fsf.org
+
+[srht]: https://git.sr.ht/%7Eaminb
+[sr.ht]: https://sr.ht
+[github]: https://github.com/aminb
+[gitlab]: https://gitlab.com/aminb
+[keybase]: https://keybase.io/amin
+[lobsters]: https://lobste.rs/u/aminb
+[reddit]: https://www.reddit.com/u/aminb
+[twitter]: https://twitter.com/aminban
index 7ca06bb..001b6c4 100644 (file)
--- a/index.md
+++ b/index.md
@@ -1,16 +1,22 @@
-<div class="picture"><img class="picture__avatar" src="https://emacsel.com/img/aminb.jpg" width="112" height="112" alt="Amin Bandali"></div>
-
-# Amin <span>Bandali</span>
+<h1 id="hello">Hello there,</h1>
+<img class="picture__avatar" src="https://emacsel.com/img/aminb.jpg" alt="Amin Bandali">
+<div class="clear"></div>
 
 I'm a graduate student in the [WatForm][watform] group at University
 of Waterloo, supervised by [Dr. Nancy Day][nday]. I’m interested in
 using formal methods, especially type systems, to help make software
 more reliable.
 
----
+## Recent writings
+
+<!-- TODO: rss feed -->
 
 - [Arch Linux on MacBook Air 2013](/2016/11/arch-macbook-air "November 1, 2016")
 
+## Talks & presentations
+
+- TODO
+
 
 [watform]: https://watform.uwaterloo.ca
 [nday]: https://cs.uwaterloo.ca/~nday/
diff --git a/ssng b/ssng
index 8ea78e2..b14383b 100755 (executable)
--- a/ssng
+++ b/ssng
@@ -24,6 +24,7 @@
 : "${RSS_AUTHOR:=amin@aminb.org}"
 : "${RSS_DESCRIPTION:=Personal website}"
 : "${COPYRIGHT_FROM_YEAR:=2016}"
+: "${DOCS:=out}"
 
 ##########################################################################
 
@@ -41,9 +42,9 @@ RSS_FILE="$TEMP_DIR/rss.xml"
 RSS_URL="$SERVER_PROTO://$SERVER_NAME/rss.xml"
 SITEMAP="$TEMP_DIR/sitemap.xml"
 
-ANNOUNCEMENT_FILE="$PWD/announcement.html"
-FOOTER_FILE="$PWD/footer.html"
-HEADER_FILE="$PWD/header.html"
+ANNOUNCEMENT_FILE="$PWD/_announcement.html"
+FOOTER_FILE="$PWD/_footer.html"
+HEADER_FILE="$PWD/_header.html"
 [ -f "$ANNOUNCEMENT_FILE" ] &&
        ANNOUNCEMENT_TEXT=$(cat "$ANNOUNCEMENT_FILE")
 [ -f "$HEADER_FILE"       ] &&
@@ -56,8 +57,10 @@ EOF
 [ -f "$FOOTER_FILE"       ] &&
        FOOTER=$(cat "$FOOTER_FILE") ||
        FOOTER=$(cat << EOF
-Copyright $COPYRIGHT_YEAR&ndash;$(date +%Y)
-<a href="/about.html">$WEBSITE_TITLE</a>
+Copyright $COPYRIGHT_FROM_YEAR&ndash;$(date +%Y)
+<a href="/">$WEBSITE_TITLE</a>
+<span class="bar">|</span>
+<a href="/colophon">colophon</a>
 EOF
 )
 
@@ -92,7 +95,7 @@ copy_to_document_root() {
 md_to_html() {
        find "$TEMP_DIR" -type f -name '*.md'|
                while read -r file; do
-                       lowdown -D html-skiphtml -d metadata \
+                       lowdown -D html-skiphtml -D html-head-ids \
                                "$file" > "${file%\.md}.html" &&
                                rm "$file"
                done
@@ -202,12 +205,13 @@ echo "$sitemap"|
                        /index.html)
                                title='Home'
                                head_title="$WEBSITE_TITLE"
-                               header__home=''
+                               ;;
+                       /contact.html)
+                               head_title="Contact | $WEBSITE_TITLE"
                                ;;
                        *)
                                title="${line#*====}"
-                               head_title="$title - $WEBSITE_TITLE"
-                               header__home="$HEADER"
+                               head_title="$title | $WEBSITE_TITLE"
                                ;;
                esac
                # merge page with html template
@@ -238,14 +242,11 @@ echo "$sitemap"|
 <input class="light-off" type="checkbox" id="light-off">
 <div class="page">
 $announcement
-<div class="header">
-<div class="header__left">$header__home</div>
-<div class="header__right">
-<label for="light-off" class="light-off-button"></label>
-</div>
-</div>
-<div class="article">$article</div>
-<div class="footer">$FOOTER</div>
+<header>
+$HEADER
+</header>
+<div class="article clear">$article</div>
+<footer>$FOOTER</footer>
 </div>
 </body>
 </html>
index 021d73c..ddc6032 100644 (file)
@@ -17,11 +17,12 @@ html {
 }
 
 .light-off-button {
-  display: block;
+  cursor: pointer;
+  vertical-align: middle;
 }
 
 .light-off-button,
--.light-off-button-inline {
+.light-off-button-inline {
   color: #888888;
   -webkit-user-select: none;
   user-select: none;
@@ -82,8 +83,8 @@ html {
   border-bottom: 1px solid #357edd;
 }
 
-.light-off:checked ~ .page a {
-  color: #ddddb6;
+.light-off:checked ~ .page a, .light-off:checked ~ header a {
+  color: #ddddb6 !important;
   border-bottom: 1px solid #aaaa96;
 }
 
@@ -131,41 +132,48 @@ html {
   border-bottom: 1px solid #888888;
 }
 
+.clear { clear: both; }
 
+#hello { float: left; line-height: 50px; }
 
-.header,
-.footer {
+#aminb { font-size: 0.9em; }
+
+header,
+footer {
   color: #888888;
-  padding: 2em 1em 1em 1em;
+  padding: 1em;
   margin: 0 auto;
-  max-width: 32em;
+  max-width: 34em;
 }
 
-.footer a {
-  color: #888888;
-  border-bottom: 1px solid #cccccc;
-}
+header { padding: 2em 1em 0em 1em; }
+
+header h2 { display: inline; }
 
-.header__left {
-  width: 50%;
-  float: left;
-  text-align: left;
+header a { border: none !important; color: #888 !important; }
+
+header h2 a { color: #3a89c9 !important; }
+
+header .bar {
+  color: #ccc;
+  font-size: 12pt;
+  vertical-align: bottom;
+  padding-left: 1px;
+  padding-right: 1px;
 }
 
-.header__right {
-  width: 50%;
-  float: right;
-  text-align: right;
+footer a {
+  color: #888888 !important;
+  border-bottom: 1px solid #cccccc !important;
 }
 
 
 
 .article {
-  clear: both;
   line-height: 1.6em;
   margin: 0 auto;
-  padding: 2em 1em;
-  max-width: 32em;
+  padding: 1em;
+  max-width: 34em;
 }
 
 .article h1,
@@ -177,24 +185,18 @@ html {
 }
 
 .article h1 {
-  font-size: 2.8em;
-  margin-top: 1em;
+  font-size: 1.6em;
 }
 
 .article h2 {
   font-size: 1.2em;
-  margin-top: 3em;
+  padding: 0.25em 0;
 }
 
 .article p {
   margin: 1em 0;
 }
 
-.article li code,
-.article p code {
-  font-weight: 700;
-}
-
 .article p img {
   margin: 1em 0;
   width: 100%;}
@@ -205,10 +207,11 @@ html {
 }
 .article ul {
   padding: 0;
+  margin: 0.3em 0 0 1.6em;
 }
 
 .article ul li {
-  list-style: none;
+  /* list-style: none; */
 }
 
 .article li {
@@ -267,9 +270,16 @@ font-size: 0.7em;
 
 .article .picture__avatar {
   margin: 0;
-  height: 6em;
-  width: 6em;
-  border-radius: 6em;
+  height: 64px;
+  width: 64px;
+  border-radius: 50%;
+  float: right;
+}
+
+@media only screen and (min-width: 570px) {
+  .picture__avatar {
+    margin-right: 3em !important;
+  }
 }
 
 .article .quote {
@@ -291,17 +301,21 @@ font-size: 0.7em;
 }
 
 
+.article code {
+  background-color: #f5f5f5;
+  padding: 1px 3px;
+}
 
 .article code,
 .article pre {
-  font-family: "Menlo", "DejaVu Sans Mono", monospace;
+  font-family: "DejaVu Sans Mono", monospace;
   font-size: 0.9em;
   line-height: 1.5em;
   margin: 0;
 }
 
 .article pre {
-  background-color: #eeeeee;
+  background-color: #f5f5f5;
   color: #232323;
   margin: 0 -1em;
   overflow-x: auto;