From: Amin Bandali Date: Mon, 20 Aug 2018 05:42:02 +0000 (-0400) Subject: Port the site to GNU Emacs + Org mode (using org-publish) X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/bndl.org/commitdiff_plain/b307aaa9dfa368f039b2ea79efadfc217d3f3355?ds=sidebyside Port the site to GNU Emacs + Org mode (using org-publish) --- diff --git a/2016/11/arch-macbook-air.md b/2016/11/arch-macbook-air.md deleted file mode 100644 index e6a9e46..0000000 --- a/2016/11/arch-macbook-air.md +++ /dev/null @@ -1,281 +0,0 @@ -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 GNU/Linux 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 - -Warning: 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 deleted file mode 100644 index 0ac8879..0000000 --- a/_header.html +++ /dev/null @@ -1,13 +0,0 @@ -

- -

-
-cv -| -now -| -projects -| -contact -| - diff --git a/colophon.md b/colophon.md deleted file mode 100644 index 79721dd..0000000 --- a/colophon.md +++ /dev/null @@ -1,29 +0,0 @@ -# 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 , 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 deleted file mode 100644 index 1cf8ee1..0000000 --- a/contact.md +++ /dev/null @@ -1,45 +0,0 @@ -title: Contact - -# Say hello! - -You can contact me via email or through my accounts on various online -platforms. - -## Contact info - -- -- , I'm a volunteer GNU webmaster -- , 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] - -- [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 diff --git a/cv.md b/cv.md deleted file mode 100644 index 10e4b8d..0000000 --- a/cv.md +++ /dev/null @@ -1,10 +0,0 @@ -# CV - -My academic cv is available as [cv.pdf](/cv.pdf), and an -outdated professional resume is available as -[resume.pdf](/resume.pdf) as well. - -I'm interested in functional programming and functional languages, -type systems, and formal methods in general. I love writing Haskell -and I'm looking into Rust and Lean as well. Feel free to [drop me a -line](/contact) if you like to geek out about any of the above. diff --git a/index.md b/index.md deleted file mode 100644 index 2f9060e..0000000 --- a/index.md +++ /dev/null @@ -1,23 +0,0 @@ -

Hello there,

-Amin Bandali -
- -I'm a [graduate student][cs] 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 - - - -- [Arch Linux on MacBook Air 2013](/2016/11/arch-macbook-air "November 1, 2016") - -## Talks & presentations - -- TODO - - -[cs]: https://cs.uwaterloo.ca/~abandali/ -[watform]: https://watform.uwaterloo.ca -[nday]: https://cs.uwaterloo.ca/~nday/ diff --git a/partials/postamble.html b/partials/postamble.html new file mode 100644 index 0000000..a3b1dbe --- /dev/null +++ b/partials/postamble.html @@ -0,0 +1,5 @@ +© 2016–2018 Amin Bandali +| +colophon +| +%g diff --git a/partials/preamble.html b/partials/preamble.html new file mode 100644 index 0000000..c0dad2a --- /dev/null +++ b/partials/preamble.html @@ -0,0 +1,15 @@ + diff --git a/publish.el b/publish.el new file mode 100644 index 0000000..81e5b60 --- /dev/null +++ b/publish.el @@ -0,0 +1,118 @@ +;; Inspiration: https://gitlab.com/ambrevar/ambrevar.gitlab.io. + +;; TODO: use git time-stamps + +(require 'ox-publish) +(require 'seq) + +(add-to-list 'load-path ".") + +(add-to-list 'load-path "../xah-replace-pairs") +(require 'xah-replace-pairs) + +(defun aminb--readfile (filepath) + "Return filepath's content." + (with-temp-buffer + (insert-file-contents filepath) + (buffer-string))) + +(defun aminb--find-replace (match-with replace-with string) + "Return the string resulting from replacing `match-with' with + `replace-with' in `string'." + (when (string-match match-with string) + (replace-match replace-with nil nil string))) + +(defun aminb--my-html-body-light-filter (output backend info) + "Make adjustments needed for dark/light mode tag to work." + (when (eq backend 'html) + (aminb--find-replace + "\n" + "\n\n" + (aminb--find-replace + "\n" + "\n\n
" + output)))) + +(add-to-list 'org-export-filter-final-output-functions + 'aminb--my-html-body-light-filter) + +;; re-defining this (originally in `ox-html.el') to add `?g' +(defun org-html-format-spec (info) + "Return format specification for preamble and postamble. +INFO is a plist used as a communication channel." + (let ((timestamp-format (plist-get info :html-metadata-timestamp-format)) + (git-repo "@%s") + (git-rev (shell-command-to-string "git rev-parse HEAD")) + (git-rev-short (shell-command-to-string "git rev-parse --short HEAD"))) + `((?t . ,(org-export-data (plist-get info :title) info)) + (?s . ,(org-export-data (plist-get info :subtitle) info)) + (?d . ,(org-export-data (org-export-get-date info timestamp-format) + info)) + (?T . ,(format-time-string timestamp-format)) + (?a . ,(org-export-data (plist-get info :author) info)) + (?e . ,(mapconcat + (lambda (e) (format "%s" e e)) + (split-string (plist-get info :email) ",+ *") + ", ")) + (?g . ,(format git-repo git-rev git-rev-short)) + (?c . ,(plist-get info :creator)) + (?C . ,(let ((file (plist-get info :input-file))) + (format-time-string timestamp-format + (and file (nth 5 (file-attributes file)))))) + (?v . ,(or (plist-get info :html-validation-link) ""))))) + +;; timestamps can be used to avoid rebuilding everything +;; should probably be put inside the public/ directory +(setq org-publish-use-timestamps-flag t + org-publish-timestamp-directory "./") + +;; get rid of index.html~ and other backup files that may be created during generation +(setq make-backup-files nil) + +(setq org-export-with-section-numbers nil + org-export-with-smart-quotes t + org-export-with-email t + org-export-with-date t + org-export-with-tags 'not-in-toc + org-export-with-toc t) + +(setq org-html-divs '((preamble "header" "preamble") + (content "main" "content") + (postamble "footer" "postamble")) + ;; TODO: link last update to commit history of file + org-html-preamble t + org-html-postamble t + org-html-preamble-format `(("en" ,(aminb--readfile "partials/preamble.html"))) + org-html-postamble-format `(("en" ,(aminb--readfile "partials/postamble.html"))) + org-html-container-element "section" + org-html-metadata-timestamp-format "%Y-%m-%d" + org-html-checkbox-type 'html + org-html-html5-fancy t + ;; use custom css + ;; this removes the dependency on `htmlize', + ;; but we also lose syntax highlighting. + org-html-htmlize-output-type nil + org-html-validation-link nil + org-html-doctype "html5") + +(setq org-publish-project-alist + (list + (list "site-org" + :base-directory "./source/" + :exclude "macros.org" + :recursive t + :publishing-function '(org-html-publish-to-html) + :publishing-directory "./public/" + :html-head-include-default-style nil + :html-head-include-scripts nil) + (list "site-static" + :base-directory "source/" + :exclude "\\.org\\'" + :base-extension 'any + :publishing-directory "./public" + :publishing-function 'org-publish-attachment + :recursive t) + (list "site" :components '("site-org")))) + +(defun aminb/publish () + (org-publish-all)) diff --git a/source/2016/11/arch-macbook-air.org b/source/2016/11/arch-macbook-air.org new file mode 100644 index 0000000..b808320 --- /dev/null +++ b/source/2016/11/arch-macbook-air.org @@ -0,0 +1,266 @@ +#+title: Arch Linux on MacBook Air 2013 +#+date: [2016-11-01 Tue] +#+options: ^:nil + +#+include: "../../macros.org" + +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 [[https://wiki.archlinux.org/index.php/installation_guide][Installation Guide]] or the former [[https://csdietz.github.io/arch-beginner-guide/][Beginner's Guide]]. +Rather, it mostly serves as a small summary with a few useful notes +about the gotchas. + +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)}}} 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 [[https://wiki.archlinux.org/index.php/USB_flash_installation_media][USB flash installation media]] page on the Arch wiki, +but the simplest one is using =dd= if you already have access to +another UNIX system. + +{{{span(red,Warning:)}}} 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: + +#+begin_src bash +dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync +#+end_src + +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: + +#+begin_src bash +ping archlinux.org +#+end_src + +* Updating the system clock + +Once you're connected to the internet, make sure the system clock is +accurate: + +#+begin_src bash +timedatectl set-ntp true # start and enable systemd-timesyncd +#+end_src + +You can check the service status using =timedatectl status=. + +* Partitioning +:PROPERTIES: +:CUSTOM_ID: partitioning +:END: + +I won't dive into partitioning and instead, I'll refer you to the +[[https://wiki.archlinux.org/index.php/Partitioning][Partitioning]] page of Arch wiki. Of the available partitioning tools, I +personally prefer =cfdisk=. + +* Setting up LVM & LUKS + +I use a [[https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_an_entire_system#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: + +#+begin_src bash +cryptsetup -v --cipher aes-xts-plain64 --key-size 512 --hash sha512 \ + --iter-time 5000 --use-urandom -y luksFormat /dev/sdaX +#+end_src + +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 [[https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encryption_options_for_LUKS_mode][LUKS encryption options]]. + +Then we open the container: + +#+begin_src bash +cryptsetup open --type luks /dev/sdaX lvm +#+end_src + +Now it's time to use lvm and prepare the logical volume(s): + +#+begin_src bash +pvcreate /dev/mapper/lvm +vgcreate vg /dev/mapper/lvm +lvcreate --extents +100%FREE -n root vg +#+end_src + +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=: + +#+begin_src bash +mkfs.ext4 /dev/mapper/vg-root +#+end_src + +* 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=): + +#+begin_src bash +mount /dev/mapper/vg-root /mnt +mkdir /mnt/boot +mount /dev/sda1 /mnt/boot +#+end_src + +Finally, let's install the base system (and optionally =base-devel=): + +#+begin_src bash +pacstrap /mnt base base-devel +#+end_src + +* Configuring the system + +Let's generate the fstab: + +#+begin_src bash +genfstab -U /mnt >> /mnt/etc/fstab +#+end_src + +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. + +#+begin_src 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 +#+end_src + +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: + +#+begin_src +HOOKS="base udev autodetect modconf block keyboard encrypt lvm2 filesystems fsck" +#+end_src + +After adjusting the hooks, build the initramfs: + +#+begin_src bash +mkinitcpio -p linux +#+end_src + +Now, install the =intel-ucode= package. We'll configure the bootloader +to enable intel microcode updates. + +#+begin_src bash +pacman -S intel-ucode +#+end_src + +Create the =/boot/loader/loader.conf= with the following content +(adjust the timeout to your liking): + +#+begin_src +default arch +timeout 3 +#+end_src + +Then create the entry for Arch: + +#+begin_src bash +mkdir -p /boot/loader/entries +touch /boot/loader/entries/arch.conf +#+end_src + +Now edit =/boot/loader/entries/arch.conf= to specify the Arch entry: + +#+begin_src +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 +#+end_src + +Again, =/dev/sdaX= is the partition you created in the [[#partitioning][partitioning]] +step as the underlying encrypted partition. + +Finally, install the bootloader, exit the chroot, umount and reboot! + +#+begin_src bash +bootctl install +exit +umount -R /mnt +reboot +#+end_src + +* Post-installation recommendations + +Congratulations! You now have a minimal Arch installation. + +At this point, I usually install my favorite AUR helper, [[https://aur.archlinux.org/packages/pacaur/][pacaur]], then +I install the [[https://aur.archlinux.org/packages/broadcom-wl-dkms/][broadcom-wl-dkms]] wireless driver and [[https://aur.archlinux.org/packages/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%. + +#+begin_src bash +pacaur -S linux-headers dkms # linux-headers is required for dkms +pacaur -S broadcom-wl-dkms +pacaur -S mba6x_bl-dkms +#+end_src + +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 [[https://wiki.archlinux.org/index.php/General_recommendations][General recommendations]] for more details. + +* References + +Here are some resources I've come across each with lots of useful bits +and pieces, about installing Arch on a MacBook: + +- [[https://github.com/pandeiro/arch-on-air][pandeiro/arch-on-air]] +- [[https://loicpefferkorn.net/2015/01/arch-linux-on-macbook-pro-retina-2014-with-dm-crypt-lvm-and-suspend-to-disk/][Arch Linux on MacBook Pro Retina 2014 with DM-Crypt, LVM and suspend to disk]] +- [[http://frankshin.com/installing-archlinux-on-macbook-air-2013/][Installing Archlinux on Macbook Air 2013]] +- [[http://panks.me/posts/2013/06/arch-linux-installation-with-os-x-on-macbook-air-dual-boot/][Arch Linux Installation with OS X on Macbook Air (Dual Boot)]] +- [[https://visual-assault.org/2016/03/05/install-encrypted-arch-linux-on-apple-macbook-pro/][Installing (encrypted) Arch Linux on an Apple MacBook Pro]] +- [[http://alexeyzabelin.com/arch-on-mac][Installing Arch Linux on a MacBook Air 2013]] +- [[https://medium.com/phils-thought-bubble-of-recent-stuff/arch-linux-running-on-my-macbook-2ea525ebefe3][Arch Linux running on my MacBook]] +- [[http://codylittlewood.com/arch-linux-on-macbook-pro-installation/][Dual boot Arch Linux on MacBook Pro Installation]] diff --git a/source/colophon.org b/source/colophon.org new file mode 100644 index 0000000..b941794 --- /dev/null +++ b/source/colophon.org @@ -0,0 +1,31 @@ +#+title: Colophon +#+date: [2018-08-19 Sun] +#+options: toc:nil + +#+include: "./macros.org" + +This is my personal website, previous versions of which I've ran on +different domains since 2012. The last version was generated using +[[https://www.romanzolotarev.com/ssg.html][ssg]] (shout out to Roman Zolotarev), but I've since ported it to GNU +Emacs + Org mode. + +The sources are available on https://git.sr.ht/~aminb/aminb.org. The +site is automatically generated on each =git push= using the +[[https://builds.sr.ht][builds.sr.ht]] service (see the [[https://git.sr.ht/~aminb/aminb.org/tree/.build.yml][=.build.yml=]] build manifest) and is +deployed to my server, where it's served by [[https://www.nginx.com][Nginx]] on [[https://www.debian.org][Debian GNU/Linux]]. + +* Night mode + +To toggle night mode, click on {{{light}}}, 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. + +* Copyright and Licenses +:PROPERTIES: +:CUSTOM_ID: copyright +:END: + +The source code for this site is licensed under version 3 (or, at your +option, any later version) of the [[https://gnu.org/licenses/gpl.html][GNU General Public License]] (see the +[[https://git.sr.ht/~aminb/aminb.org/tree/COPYING][=COPYING=]] file). The contents of the website are licensed under a +{{{ccbysa}}} license. diff --git a/source/contact.org b/source/contact.org new file mode 100644 index 0000000..32b5656 --- /dev/null +++ b/source/contact.org @@ -0,0 +1,35 @@ +#+title: Contact +#+date: [2018-08-19 Sun] +#+options: toc:nil title:nil +#+macro: xmpp @@html:$1@@ + +#+include: "./macros.org" + +#+begin_export html +

Say hello!

+#+end_export + +You can contact me via email or through my accounts on various online +platforms. + +* Contact info + +- [[mailto:amin@aminb.org][amin@aminb.org]] +- [[mailto:amin@gnu.org][amin@gnu.org]], I'm a volunteer [[https://www.gnu.org/people/webmeisters.html#aminb][GNU webmaster]] +- [[mailto:abandali@uwaterloo.ca][abandali@uwaterloo.ca]], I'm a [[file:uw.org][grad student]] @ UW +- gpg key: [[https://pgp.surfnet.nl/pks/lookup?op=vindex&fingerprint=on&search=0xD1FBA36627D65876][CDDE 75F9 0353 8E71 813C DA27 D1FB A366 27D6 5876]] +- aminb on [[https://freenode.net][freenode]] and [[https://wiki.mozilla.org/IRC][moznet]] IRC +- [[https://matrix.to/#/@aminb:matrix.org][@aminb:matrix.org]] on Matrix +- {{{xmpp(aminb@member.fsf.org)}}} via XMPP +- [[https://pleroma.site/users/aminb][aminb@pleroma.site]] on the [[https://en.wikipedia.org/wiki/Fediverse][fediverse]] + +* Other online places + +- [[https://git.sr.ht/%257Eaminb][~aminb]] on [[https://sr.ht][sr.ht]] +- [[https://lobste.rs/u/aminb][aminb]] on Lobsters +- [[https://gitlab.com/aminb][aminb]] on GitLab +- [[https://keybase.io/amin][amin]] on Keybase +- [[https://news.ycombinator.com/user?id=aban][aban]] on HN +- [[https://www.reddit.com/u/aminb][aminb]] on Reddit +- +[[https://github.com/aminb][aminb]] on GitHub+ +- +[[https://twitter.com/aminban][aminban]] on Twitter+ diff --git a/source/cv.org b/source/cv.org new file mode 100644 index 0000000..22bbdd4 --- /dev/null +++ b/source/cv.org @@ -0,0 +1,13 @@ +#+title: CV +#+date: [2018-08-19 Sun] +#+options: toc:nil + +#+include: "./macros.org" + +My academic {{{abbr(cv)}}} is available as [[/cv.pdf][cv.pdf]], and an outdated +professional resume is available as [[/resume.pdf][resume.pdf]] as well. + +I'm interested in functional programming and functional languages, +type systems, and formal methods in general. I love writing Haskell +and I'm looking into Rust and Lean as well. Feel free to [[file:contact.org][drop me a +line]] if you like to geek out about any of the above. diff --git a/source/global.js b/source/global.js new file mode 100644 index 0000000..f7ecb6b --- /dev/null +++ b/source/global.js @@ -0,0 +1,11 @@ +!function(t){ + t.addEventListener('DOMContentLoaded', function () { + var l = t.querySelector('#light-off'); + if (l !== null) { + l.checked = t.cookie.match(/lightOff=true/) !== null; + l.addEventListener('change', function () { + t.cookie = 'lightOff=' + JSON.stringify(l.checked) + ';path=/'; + }); + } + }) +}(document); diff --git a/source/index.org b/source/index.org new file mode 100644 index 0000000..74e5fe1 --- /dev/null +++ b/source/index.org @@ -0,0 +1,40 @@ +#+title: +#+date: [2018-08-19 Sun] +#+options: toc:nil title:nil + +#+include: "./macros.org" + +#+begin_export html +

Hello there,

+

+Amin Bandali +

+
+#+end_export + +I'm a [[file:uw.org][graduate student]] in the [[https://watform.uwaterloo.ca][WatForm]] group at University of Waterloo, +supervised by [[https://cs.uwaterloo.ca/~nday/][Dr. Nancy Day]]. I'm interested in using formal methods, +especially type systems, to help make software more reliable. + +* Publications +:PROPERTIES: +:CUSTOM_ID: publications +:END: + +- *A comparison of the declarative modelling languages B, Dash, and + TLA^{+}* (pdf, bib, [[https://cs.uwaterloo.ca/~nday/models/2018-modre][models]]) + + {{{pub-desc(Ali Abbassi\, Amin Bandali\, Nancy A. Day\, and Jose Serna. In + /International Workshop on Model-Driven Requirements Engineering (MoDRE) @ IEEE International Requirements Engineering Conference (RE)/. + To appear\, 2018.)}}} + +* Talks & presentations + +- TODO + +* Recent writings & essays + +# TODO: atom feed + +#+attr_html: :title November 1, 2016 +- [[file:2016/11/arch-macbook-air.org][Arch Linux on MacBook Air 2013]] diff --git a/source/macros.org b/source/macros.org new file mode 100644 index 0000000..7c88c3c --- /dev/null +++ b/source/macros.org @@ -0,0 +1,11 @@ +#+macro: abbr @@html:$1@@ +#+macro: span @@html:$2@@ +#+macro: kbd @@html:$1@@ +#+macro: h1title @@html:

@@{{{title}}}@@html:

@@ +#+macro: light @@html:@@ +#+macro: ccbysa @@html:Creative Commons Attribution-ShareAlike 4.0 International @@{{{ccbysa-img}}}@@html:@@ +#+macro: ccbysa-img @@html:Creative Commons Licence@@ +#+macro: pub-desc @@html:@@$1@@html:@@ + +#+html_head: +#+html_head: diff --git a/source/now.org b/source/now.org new file mode 100644 index 0000000..e5fbc50 --- /dev/null +++ b/source/now.org @@ -0,0 +1,7 @@ +#+title: Now +#+date: [2018-08-19 Sun] +#+options: toc:nil title:nil + +#+include: "./macros.org" + +Coming soon. diff --git a/source/projects.org b/source/projects.org new file mode 100644 index 0000000..4e7da08 --- /dev/null +++ b/source/projects.org @@ -0,0 +1,7 @@ +#+title: Projects +#+date: [2018-08-19 Sun] +#+options: toc:nil title:nil + +#+include: "./macros.org" + +Coming soon. diff --git a/source/style.css b/source/style.css new file mode 100644 index 0000000..cab0597 --- /dev/null +++ b/source/style.css @@ -0,0 +1,218 @@ +html, body { + margin: 0; + height: 100%; +} + +body { + font-family: "Liberation Sans", "Arial", sans-serif; + color: #232323; +} + +main { + margin: 0 auto; + max-width: 34em; + padding: 1em; +} + +/* Header and Footer */ + +#aminb { font-size: 0.9em; } + +#preamble, +#postamble { + color: #888888; + padding: 1em; + margin: 0 auto 2em; + max-width: 34em; +} + +#preamble { padding: 2em 1em 0em 1em; } + +#preamble h2 { display: inline; } + +#preamble a { border: none !important; color: #888 !important; } + +#preamble h2 a { color: #3a89c9 !important; } + +#preamble .bar { + color: #ccc; + font-size: 12pt; + vertical-align: bottom; + padding-left: 1px; + padding-right: 1px; +} + +#postamble a { + color: #888888 !important; + border-bottom: 1px solid #cccccc !important; +} + +/* Content */ + +#content { + line-height: 1.6em; +} + +#content h1, #content h2 { + line-height: 1em; + font-weight: 700; + letter-spacing: -0.03em; + word-spacing: -0.03em; +} + +#content h1 { font-size: 1.6em; } + +#content h2 { + font-size: 1.2em; + padding: 0.25em 0; +} + +#content p { + margin: 1em 0; +} + +#content code { + background-color: #f5f5f5; + padding: 1px 3px; +} + +#content code, +#content pre { + font-family: "DejaVu Sans Mono", monospace; + font-size: 0.9em; + line-height: 1.5em; + margin: 0; +} + +#content pre { + background-color: #f5f5f5; + color: #232323; + margin: 0 -1em; + overflow-x: auto; + padding: 1em; + word-wrap: normal; +} + +#content ul { + padding: 0; + margin: 0.3em 0 0 1.6em; +} + +#content ul li { + /* list-style: none; */ +} + +#content li { + margin: 0.5em 0; +} + +.pub-desc { + font-size: 0.95em; +} + +#text-publications p { + margin: 0.5em 0; +} + +.light-off:checked ~ .page #content pre, +.light-off:checked ~ .page #content code { + background-color: #232323; +} + +.clear { clear: both; } + +#hello { float: left; line-height: 50px !important; } + +#content .picture__avatar { + margin: 0; + height: 64px; + width: 64px; + border-radius: 50%; + float: right; +} + +@media only screen and (min-width: 570px) { + .picture__avatar { + margin-right: 3em !important; + } +} + +.page { + background-color: #ffffff; + color: #232323; + min-height: 100%; +} + +.page a { + color: #357edd; + text-decoration: none; + border-bottom: 1px solid #a5ceff; +} + +pre { margin-left: 0 } + +/* Light switch */ + +#light-off { + position: absolute; + visibility: hidden; +} + +.light-off-button { + cursor: pointer; + vertical-align: middle; +} + +.light-off-button, +.light-off-button-inline { + color: #888888; + -webkit-user-select: none; + user-select: none; + cursor: pointer; + text-align: right; +} + +.light-off-button:hover:after, +.light-off-button-inline:hover:after { + color: #357edd; + border-bottom: 0; +} + +.light-off:checked ~ .page .light-off-button:hover:after +.light-off:checked ~ .page .light-off-button-inline:hover:after { + color: #ddddb6; + border-bottom: 0; +} + +.light-off-button:after, +.light-off-button-inline:after { + content: "\1F4A1"; + font-family: "Noto Color Emoji", "Noto Sans", "Arial", sans-serif; +} + +.light-off:checked ~ .page { + background-color: #141414; + color: #cccccc; +} + +.page:selection { + background: #ddddb6; +} +.light-off:checked ~ .page:selection { + background: #357edd; +} + +.light-off:checked ~ .page a, .light-off:checked ~ header a { + color: #ddddb6 !important; + border-bottom: 1px solid #aaaa96; +} + +.light-off:checked ~ .page a:visited { + color: #888888; + border-bottom: 1px solid #444444; +} + +.light-off:checked ~ .page a:hover { + color: #ddddb6; + border-bottom: 1px solid #ddddb6; +} diff --git a/source/uw.org b/source/uw.org new file mode 100644 index 0000000..c9a3504 --- /dev/null +++ b/source/uw.org @@ -0,0 +1,7 @@ +#+title: UWaterloo +#+date: [2018-08-19 Sun] +#+options: toc:nil title:nil + +#+include: "./macros.org" + +Coming soon. diff --git a/ssng b/ssng deleted file mode 100755 index b14383b..0000000 --- a/ssng +++ /dev/null @@ -1,322 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2018 Amin Bandali - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# ssng is a fork of Roman Zolotarev's ssg. See end of file for ssg's -# license notice. - -: "${WEBSITE_TITLE:=Amin Bandali}" -: "${SERVER_NAME:=aminb.org}" -: "${SERVER_PROTO:=https}" -: "${RSS_AUTHOR:=amin@aminb.org}" -: "${RSS_DESCRIPTION:=Personal website}" -: "${COPYRIGHT_FROM_YEAR:=2016}" -: "${DOCS:=out}" - -########################################################################## - -[ -n "$DOCS" ] || { echo "export DOCS "; exit 1; } -DOCUMENT_ROOT=$(readlink -fn "$DOCS") -TEMP_DIR=$(mktemp -d) -# shellcheck disable=SC2064 -trap 'clean_up' EXIT -trap exit HUP INT TERM -[ "$2" = '--clean' ] && RSYNC_FLAGS='--delete-excluded' || RSYNC_FLAGS='' - -INDEX_HTML_FILE="$TEMP_DIR/index.html" -CSS_FILE="$TEMP_DIR/styles.css" -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" -[ -f "$ANNOUNCEMENT_FILE" ] && - ANNOUNCEMENT_TEXT=$(cat "$ANNOUNCEMENT_FILE") -[ -f "$HEADER_FILE" ] && - HEADER=$(cat "$HEADER_FILE") || - HEADER=$(cat << EOF -Home - -Twitter -EOF -) -[ -f "$FOOTER_FILE" ] && - FOOTER=$(cat "$FOOTER_FILE") || - FOOTER=$(cat << EOF -Copyright $COPYRIGHT_FROM_YEAR–$(date +%Y) -$WEBSITE_TITLE -| -colophon -EOF -) - -########################################################################## - -usage() { - echo 'usage: DOCS=' - echo - echo ' ssg build [--clean]' - echo ' | watch [--clean]' - exit 1 -} - -copy_to_temp_dir() { - rsync -a --delete-excluded \ - --exclude '.*' \ - --exclude '_*' \ - '.' "$TEMP_DIR" -} - -copy_to_document_root() { - [ "$(dirname "$DOCUMENT_ROOT")" = "$PWD" ] && - self="/$(basename "$DOCUMENT_ROOT")/" || - self="$DOCUMENT_ROOT" - rsync -a $RSYNC_FLAGS \ - --exclude "$self" \ - --exclude '.*' \ - --exclude '_*' \ - "$TEMP_DIR/" "$DOCUMENT_ROOT" -} - -md_to_html() { - find "$TEMP_DIR" -type f -name '*.md'| - while read -r file; do - lowdown -D html-skiphtml -D html-head-ids \ - "$file" > "${file%\.md}.html" && - rm "$file" - done -} - - -# filter first 20 lines with links and link titles (dates) -# shellcheck disable=SC2016 -fst_h1='/<[h1]*( id=".*")?>/{gsub(/<[^>]*>/,"");print($0);exit;}' -a='^
  • [^<]*<\/a>.*<\/li>.*' - -line_to_rss_item() { - url=$(echo "$line"|sed "s/$a/\\1/g") - date=$(echo "$line"|sed "s/$a/\\2/g") - file="${TEMP_DIR}${url}" - [ ! -f "$file" ] && return - - title="$(awk "$fst_h1" "$file")" - # replace relative URIs with absolute URIs - article=$(sed "s/\\([hrefsc]*\\)=\"\\//\\1=\"$prefix/g" "$file") - echo $(cat << EOF - -$title -$SERVER_PROTO://${SERVER_NAME}$url -$SERVER_PROTO://${SERVER_NAME}$url -$date 00:00:00 +0000 - - -EOF -)|sed 's/\ /\ /'>>"$RSS_FILE" -} - -index_to_rss() { - date_rfc_822=$(date "+%a, %d %b %Y %H:%M:%S %z") - cat > "$RSS_FILE" << EOF - - - - -$WEBSITE_TITLE -$RSS_DESCRIPTION -$SERVER_PROTO://$SERVER_NAME/ -$date_rfc_822 -$RSS_AUTHOR -EOF - - prefix="$SERVER_PROTO:\\/\\/$SERVER_NAME\\/" - grep "$a" "$INDEX_HTML_FILE" | - head -n20 | - while read -r line; do line_to_rss_item "$line"; done - echo '' >> "$RSS_FILE" -} - -wrap_html() { - # generate sorted sitemap - find_h1_tag='/<[h1]*( id=".*")?>/' - # shellcheck disable=SC2016 - tag_content='{gsub(/<[^>]*>/,"");print(FILENAME"===="$0);exit;}' - sitemap="$( - find "$TEMP_DIR" -type f -name '*.html'| - while read -r file; do - awk "${find_h1_tag}${tag_content}" "$file" - done| - sort - )" - # save sitemap in html and xml formats - date=$(date +%Y-%m-%dT%H:%M:%S%z) - cat > "$SITEMAP" << EOF - - -EOF - echo "$sitemap"|while read -r line; do - page=${line%====*} - url=${page#$TEMP_DIR} - case "$url" in - /index.html) title='Home';; - *) title="${line#*====}";; - esac - cat >> "$SITEMAP" << EOF - -$SERVER_PROTO://${SERVER_NAME}$url -$date -1.0 - -EOF - done - echo '' >> "$SITEMAP" - # generate html pages - styles=$(cat "$CSS_FILE") - [ -n "$ANNOUNCEMENT_TEXT" ] && - announcement="$(cat << EOF -
    -
    $ANNOUNCEMENT_TEXT
    -
    -EOF -)" -echo "$sitemap"| - while read -r line; do - page=${line%====*} - url=${page#$TEMP_DIR} - article=$(cat "$page") - case "$url" in - /index.html) - title='Home' - head_title="$WEBSITE_TITLE" - ;; - /contact.html) - head_title="Contact | $WEBSITE_TITLE" - ;; - *) - title="${line#*====}" - head_title="$title | $WEBSITE_TITLE" - ;; - esac - # merge page with html template - cat > "$page" < -$head_title - - - - - - - - - -
    -$announcement -
    -$HEADER -
    -
    $article
    -
    $FOOTER
    -
    - - -EOF - done - echo "$date $(echo "$sitemap"|wc -l|tr -d ' ')pp" -} - -clean_up() { rm -rf "$TEMP_DIR"; } - -########################################################################## - -case "$1" in - -build) - ls index.* >/dev/null 2>&1 || - { echo 'no index.* found in the directory'; exit 1; } - [ ! -x "$(which rsync)" ] && - { echo 'rsync(1) should be installed'; exit 1; } - [ ! -x "$(which lowdown)" ] && - { echo 'lowdown(1) should be installed'; exit 1; } - printf 'building %s %s ' "$DOCUMENT_ROOT" "$2" - copy_to_temp_dir - md_to_html - index_to_rss - wrap_html - copy_to_document_root - clean_up - ;; - -watch) - cmd="entr -d env DOCS=$DOCS $(basename "$0") build $2" - pgrep -qf "$cmd" && { echo "already watching $DOCS"; exit 1; } - echo "watching $PWD" - [ ! -x "$(which entr)" ] && - { echo 'entr(1) should be installed'; exit 1; } - while true; do - find "$PWD" -type f \ - \( -name "$(basename "$0")" \ - -or -name '*.md' \ - -or -name '*.html' \ - -or -name '*.css' \ - -or -name '*.txt' \ - -or -name '*.jpeg' \ - -or -name '*.png' \)\ - ! -name ".*" \ - ! -path "*/.*" \ - ! -path "${DOCUMENT_ROOT}*" | - $cmd - done - ;; - -*) usage;; - -esac - - -## ssg's license: ## - -# https://www.romanzolotarev.com/bin/ssg -# Copyright 2018 Roman Zolotarev -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/styles.css b/styles.css deleted file mode 100644 index ddc6032..0000000 --- a/styles.css +++ /dev/null @@ -1,329 +0,0 @@ -body { - font-family: "Noto Sans", "Arial", sans-serif; - font-size: 1em; -} - -body, -html { - margin: 0; - height: 100%; -} - - - -#light-off { - position: absolute; - visibility: hidden; -} - -.light-off-button { - cursor: pointer; - vertical-align: middle; -} - -.light-off-button, -.light-off-button-inline { - color: #888888; - -webkit-user-select: none; - user-select: none; - cursor: pointer; - text-align: right; -} - -.light-off-button:hover:after, -.light-off-button-inline:hover:after { - color: #357edd; - border-bottom: 0; -} - -.light-off:checked ~ .page .light-off-button:hover:after, -.light-off:checked ~ .page .light-off-button-inline:hover:after { - color: #ddddb6; - border-bottom: 0; -} - -.light-off-button:after, -.light-off-button-inline:after { - content: "\1F4A1"; -} - - - -.page { - background-color: #ffffff; - color: #232323; - min-height: 100%; -} - -.light-off:checked ~ .page { - background-color: #141414; - color: #cccccc; -} - -.page:selection { - background: #ddddb6; -} -.light-off:checked ~ .page:selection { - background: #357edd; -} - -.page a { - color: #357edd; - text-decoration: none; - border-bottom: 1px solid #a5ceff; -} - -.page a:visited { - color: #888888; - border-bottom: 1px solid #cccccc; -} - -.page a:hover { - color: #357edd; - border-bottom: 1px solid #357edd; -} - -.light-off:checked ~ .page a, .light-off:checked ~ header a { - color: #ddddb6 !important; - border-bottom: 1px solid #aaaa96; -} - -.light-off:checked ~ .page a:visited { - color: #888888; - border-bottom: 1px solid #444444; -} - -.light-off:checked ~ .page a:hover { - color: #ddddb6; - border-bottom: 1px solid #ddddb6; -} - - - -.announcement { - color: #000000; - background-color: #eeeeee; - text-align: center; - width: 100%; - margin: 0; -} - -.light-off:checked ~ .page .announcement { - color: #ffffff; - background-color: #000000; -} - -.announcement__text { - font-size: 1.2em; - padding: 2em 1em; -} - -.page .announcement a, -.page .announcement a:visited, -.page .announcement a:hover { - color: #000000; - border-bottom: 1px solid #888888; -} - -.light-off:checked ~ .page .announcement a, -.light-off:checked ~ .page .announcement a:visited, -.light-off:checked ~ .page .announcement a:hover { - color: #ffffff; - border-bottom: 1px solid #888888; -} - -.clear { clear: both; } - -#hello { float: left; line-height: 50px; } - -#aminb { font-size: 0.9em; } - -header, -footer { - color: #888888; - padding: 1em; - margin: 0 auto; - max-width: 34em; -} - -header { padding: 2em 1em 0em 1em; } - -header h2 { display: inline; } - -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; -} - -footer a { - color: #888888 !important; - border-bottom: 1px solid #cccccc !important; -} - - - -.article { - line-height: 1.6em; - margin: 0 auto; - padding: 1em; - max-width: 34em; -} - -.article h1, -.article h2 { - line-height: 1em; - font-weight: 700; - letter-spacing: -0.03em; - word-spacing: -0.03em; -} - -.article h1 { - font-size: 1.6em; -} - -.article h2 { - font-size: 1.2em; - padding: 0.25em 0; -} - -.article p { - margin: 1em 0; -} - -.article p img { - margin: 1em 0; - width: 100%;} - -.article hr { - border: none; - margin-top: 4em; -} -.article ul { - padding: 0; - margin: 0.3em 0 0 1.6em; -} - -.article ul li { - /* list-style: none; */ -} - -.article li { - margin: 0.5em 0; -} - -.article table { - width: 100%; - margin: 2em 0; -} - -.article li em a { -font-size: 0.7em; - border-radius: 0.3em; - padding: 0.3em; - vertical-align: middle; - margin: 0 0.5em; - font-style: normal; -} - -.article li em a { - border: 1px solid #a5ceff; -} - -.article li em a:visited { - border: 1px solid #888888; -} - -.article li em a:hover { - border: 1px solid #357edd; -} - -.light-off:checked ~ .page li em a { - color: #aaaa96; - border: 1px solid #aaaa96; -} - -.light-off:checked ~ .page li em a:visited { - color: #888888; - border: 1px solid #888888; -} - -.light-off:checked ~ .page li em a:hover { - color: #ddddb6; - border: 1px solid #ddddb6; -} - - - -.article .picture a, -.article .quote a, -.light-off:checked ~ .page .picture a, -.light-off:checked ~ .page .quote a { - border: 0; -} - -.article .picture__avatar { - margin: 0; - height: 64px; - width: 64px; - border-radius: 50%; - float: right; -} - -@media only screen and (min-width: 570px) { - .picture__avatar { - margin-right: 3em !important; - } -} - -.article .quote { - padding-bottom: 0.4em; -} - -.article .quote__avatar { - height: 2em; - width: 2em; - border: 1px solid #888888; - border-radius: 2em; - margin: 0 0.4em 0 0; vertical-align: middle; -} - -.article .quote__name, -.article .quote__text { - vertical-align: middle; - font-style: italic; -} - - -.article code { - background-color: #f5f5f5; - padding: 1px 3px; -} - -.article code, -.article pre { - font-family: "DejaVu Sans Mono", monospace; - font-size: 0.9em; - line-height: 1.5em; - margin: 0; -} - -.article pre { - background-color: #f5f5f5; - color: #232323; - margin: 0 -1em; - overflow-x: auto; - padding: 1em; - word-wrap: normal; -} - -.light-off:checked ~ .page .article pre { - background-color: #000000; - color: #cccccc; -}