From 97a8370caea2fae4a0a67165036aae2dc2d05900 Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Wed, 3 May 2023 13:13:47 -0400 Subject: Rewrite of the website in Flask --- static/404.md | 4 + static/README.md | 39 +++ .../__pycache__/dbbak.cpython-310.pyc | Bin 0 -> 471 bytes static/articles/rpilinuxserver/dbbak.py | 8 + .../img/ScreenShot2022-02-19at2.15.13PM.png | Bin 0 -> 17415 bytes .../img/ScreenShot2022-02-19at2.18.39PM.png | Bin 0 -> 21318 bytes .../img/ScreenShot2022-02-19at2.23.20PM.png | Bin 0 -> 70360 bytes .../img/ScreenShot2022-02-19at2.56.21PM.png | Bin 0 -> 79823 bytes .../img/ScreenShot2022-02-19at2.58.29PM.png | Bin 0 -> 66928 bytes static/articles/rpilinuxserver/rpilinuxserver.md | 339 +++++++++++++++++++++ static/business_card | 13 + static/css/main.css | 148 +++++++++ static/favicon.ico | Bin 0 -> 15406 bytes static/home.md | 23 ++ static/images/LOGO_21x127.png | Bin 0 -> 1218 bytes static/images/LOGO_21x127.svg | 78 +++++ static/images/LOGO_Transparent.png | Bin 0 -> 800 bytes static/images/LOGO_Transparent.svg | 74 +++++ static/images/SideFlareGreen.svg | 3 + static/images/SideFlarePurple.svg | 3 + static/images/favicon.xcf | Bin 0 -> 102074 bytes static/images/menu.svg | 3 + static/images/wave.svg | 3 + static/robots.txt | 6 + static/rss.xml | 23 ++ static/testpage.html | 75 +++++ 26 files changed, 842 insertions(+) create mode 100755 static/404.md create mode 100755 static/README.md create mode 100755 static/articles/rpilinuxserver/__pycache__/dbbak.cpython-310.pyc create mode 100755 static/articles/rpilinuxserver/dbbak.py create mode 100755 static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.15.13PM.png create mode 100755 static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.18.39PM.png create mode 100755 static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.23.20PM.png create mode 100755 static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.56.21PM.png create mode 100755 static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.58.29PM.png create mode 100755 static/articles/rpilinuxserver/rpilinuxserver.md create mode 100755 static/business_card create mode 100755 static/css/main.css create mode 100755 static/favicon.ico create mode 100755 static/home.md create mode 100755 static/images/LOGO_21x127.png create mode 100755 static/images/LOGO_21x127.svg create mode 100755 static/images/LOGO_Transparent.png create mode 100755 static/images/LOGO_Transparent.svg create mode 100755 static/images/SideFlareGreen.svg create mode 100755 static/images/SideFlarePurple.svg create mode 100755 static/images/favicon.xcf create mode 100755 static/images/menu.svg create mode 100755 static/images/wave.svg create mode 100755 static/robots.txt create mode 100755 static/rss.xml create mode 100755 static/testpage.html (limited to 'static') diff --git a/static/404.md b/static/404.md new file mode 100755 index 0000000..39aa110 --- /dev/null +++ b/static/404.md @@ -0,0 +1,4 @@ +
+# 404 Page Not Found +Maybe you want to go to one of the pages in nav bar instead. +
diff --git a/static/README.md b/static/README.md new file mode 100755 index 0000000..997cafb --- /dev/null +++ b/static/README.md @@ -0,0 +1,39 @@ +# What have you stumbled upon? + +This is the custom made startup page of mine. Please do not do anything to it. If you want to take some code feel free to. If you want to see what I plan on doing look below at the [Checklist](#check-list). + +# Check list + +## Overview + +This is a checklist of what needs to be done on this website. + +*** + +## Table of Contents + +- [Important Things to get done](#Imporant) +- [Unimportant Things to do](#Unimportant) +- [Completed](#Completed) + +*** + +## Imporant + +- none + +*** + +## Unimportant + +- none + +*** + +## Completed + +- ~~Create a READ.MD file~~ +- ~~Buy the domain jacobmcdonnell.com~~ +- ~~Merge or Seperate Main and Mobile CSS files~~ + +*** diff --git a/static/articles/rpilinuxserver/__pycache__/dbbak.cpython-310.pyc b/static/articles/rpilinuxserver/__pycache__/dbbak.cpython-310.pyc new file mode 100755 index 0000000..2b2ab9d Binary files /dev/null and b/static/articles/rpilinuxserver/__pycache__/dbbak.cpython-310.pyc differ diff --git a/static/articles/rpilinuxserver/dbbak.py b/static/articles/rpilinuxserver/dbbak.py new file mode 100755 index 0000000..900780d --- /dev/null +++ b/static/articles/rpilinuxserver/dbbak.py @@ -0,0 +1,8 @@ +db_entry = { + "title": "Hosting a Website on the Raspberry Pi with Rocky Linux", + "date": "02/19/2022", + "file": "static/articles/rpilinuxserver/rpilinuxserver.md", + "desc": "A tutorial on setting up a webserver on a Raspberry Pi with Rocky Linux 8", + "url": "rpilinuxserver", + "id": 1 +} diff --git a/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.15.13PM.png b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.15.13PM.png new file mode 100755 index 0000000..34b57f4 Binary files /dev/null and b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.15.13PM.png differ diff --git a/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.18.39PM.png b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.18.39PM.png new file mode 100755 index 0000000..6ef28ff Binary files /dev/null and b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.18.39PM.png differ diff --git a/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.23.20PM.png b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.23.20PM.png new file mode 100755 index 0000000..cbc9b47 Binary files /dev/null and b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.23.20PM.png differ diff --git a/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.56.21PM.png b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.56.21PM.png new file mode 100755 index 0000000..2482da0 Binary files /dev/null and b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.56.21PM.png differ diff --git a/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.58.29PM.png b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.58.29PM.png new file mode 100755 index 0000000..c952586 Binary files /dev/null and b/static/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.58.29PM.png differ diff --git a/static/articles/rpilinuxserver/rpilinuxserver.md b/static/articles/rpilinuxserver/rpilinuxserver.md new file mode 100755 index 0000000..e89ff5e --- /dev/null +++ b/static/articles/rpilinuxserver/rpilinuxserver.md @@ -0,0 +1,339 @@ +# Hosting a Website on the Raspberry Pi with Rocky Linux + +First Download Rocky Linux for the Raspberry Pi 3 & 4 from +[their website](https://rockylinux.org/alternative-images). + +
+![Screen Shot 2022-02-19 at 2.15.13 PM](/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.15.13PM.png) +
+ +Next you want to burn this image to the sd card that you are going to use. Now +start up the Raspberry Pi and login with the default user `rocky` and the +password is `rockylinux`. + +To make the image take up the whole drive, run: + +

+sudo rootfs-expand
+
+ +Now, you should create a new user: + +

+sudo useradd -m -g users -G wheel userName
+sudo passwd username
+
+ +Next, we should delete the default user so logout and login to your new user: + +

+sudo userdel rocky
+
+ + + +*** + +## Setting a static IP address + +The easiest way is to run: + +

+sudo nmtui
+
+ +
+![Screen Shot 2022-02-19 at 2.18.39 PM](/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.18.39PM.png) +
+ +Select **Edit** a connection and select your network interface. + +
+![Screen Shot 2022-02-19 at 2.23.20 PM](/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.23.20PM.png) +
+ +Select **Show** for **IPv4 CONFIGURATION** and enter the IP you want to set. +Then select **OK** at the bottom, and quit the program. + +## Securing the PI + +### SSH Key Authorization + +The best way to secure the pi is to use an SSH key to login instead of a +password. First you want to generate an SSH key by running on your computer: + +

+ssh-keygen -t rsa
+
+ +Next, to copy your SSH key to your server, run: + +

+ssh-copy-id -i ~/.ssh/mykey user@host
+
+ +To test that it works, run: + +

+ssh -i ~/.ssh/mykey user@host
+
+ +If it worked, you should be able to connect without needing a password. + +To force an SSH key to login, edit `/etc/ssh/sshd_config` using nano or vim. + +Change + +

+PermitRootLogin yes
+PasswordAuthentication yes
+
+to +

+PermitRootLogin no
+PasswordAuthentication no
+
+ +### Setting up fail2ban + +First start and enable firewalld to run at boot: + +

+sudo systemctl start firewalld
+sudo systemctl enable firewalld
+
+ +Now, enable the EPEL repository for Rocky Linux and install fail2ban: + +

+sudo dnf install epel-release -y
+sudo dnf install fail2ban fail2ban-firewalld -y
+
+ +Start and enable fail2ban to run at boot: + +

+sudo systemctl start fail2ban
+sudo systemctl enable fail2ban
+
+ +Now, we have to make fail2ban work with firewalld, run: + +

+sudo mv /etc/fail2ban/jail.d/00-firewalld.conf /etc/fail2ban/jail.d/00-firewalld.local
+sudo systemctl restart fail2ban
+
+ +To create an SSH jail, edit the ssh config file with nano or vim: + +

+sudo nano /etc/fail2ban/jail.d/sshd.local
+
+ +Paste the following into the file and change the values as you see fit: + +

+[sshd]
+enabled = true
+bantime = 1d
+maxretry = 3
+
+ +Save and close the file and restart fail2ban: + +

+sudo systemctl restart fail2ban
+
+ +## Setting up Dynamic DNS with Google Domains + +### Configuring Google Domains + +First, on [Domains.google.com](https://domains.google.com/) go the DNS page for +your domain. Scroll down and click on **Show advanced settings**, Click **Manage +dynamic DNS**, and then click **Create new record**. Enter your subdomain or +leave it black for the domain itself. Finally, click Save. + +### Installing ddclient + +To install ddclient you need to enable the PowerTools Repo for the perl +dependency. + +First, install `dnf-plugins-core`: + +

+sudo dnf -y install dnf-plugins-core
+sudo dnf upgrade
+
+ +Next, enable PowerTools: + +

+sudo dnf config-manager --set-enabled powertools
+
+ +Then, you can install ddclient: + +

+sudo dnf install ddclient
+
+ +Now, we want to edit the config file for ddclient: + +

+sudo nano /etc/ddclient.conf
+
+ +You'll want to look for where it says `protocol=dyndns2`, and enter your +information: + +

+##
+## nsupdate.info IPV4(https://www.nsupdate.info)
+##
+protocol=dyndns2
+use=web, web=http://ipv4.nsupdate.info/myip
+server=domains.google.com
+login=username
+password=password
+domain.tld
+
+ +Wait about 5 minutes and on the Google Domains website, under Dynamic DNS you +should see your IP address under **Data**. + +## Setting up NGINX and Let's Encrypt + +### Installing NGINX + +First, install nginx Webserver: + +

+sudo dnf install nginx
+
+ +Next, start and enable nginx to run at boot: + +

+sudo systemctl start nginx
+sudo systemctl enable nginx
+
+ +Then, check the status to see if it is running: + +

+sudo systemctl status nginx
+
+ +
+![Screen Shot 2022-02-19 at 2.56.21 PM](/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.56.21PM.png) +
+ +Now, we have to allow HTTP traffic through the firewall: + +

+sudo firewall-cmd --add-service=http --permanent
+sudo firewall-cmd --add-service=https --permanent
+sudo firewall-cmd --reload
+
+ +In a web browser, go to the local ip of the server and you should see the nginx +welcome page. + +
+![Screen Shot 2022-02-19 at 2.58.29 PM](/articles/rpilinuxserver/img/ScreenShot2022-02-19at2.58.29PM.png) +
+ +### Configuring NGINX + +First, make your folder for the website, this is where your website will live: + +

+sudo mkdir -p /var/www/websiteName
+
+ +Next, we need to set the proper permissions to make sure everything works: + +

+sudo chown -R nginx /var/www/websiteName
+sudo chmod -R 755 /var/www/websiteName
+
+ +Now, we will create the config file for website: + +

+sudo nano /etc/nginx/conf.d/websiteName.conf
+
+ +and paste the following into the file: + +

+server {
+    listen 80;
+    server_name domain.tld www.domain.tld;
+    root /var/www/websiteName;
+    index index.php index.html index.htm;
+    access_log /var/log/nginx/websiteName.access.log;
+    error_log /var/log/nginx/websiteName.error.log;
+}
+
+ +Now, confirm that the nginx configuration is ok: + +

+sudo nginx -t
+
+ +Restart nginx: + +

+sudo systemctl restart nginx
+sudo systemctl status nginx
+
+ +Next, set SELinux to permissive mode: + +

+sudo setenforce permissive
+sudo getenforce
+
+ +Now, we will need to set SELinux to permissive mode permanently: + +

+sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux
+
+ +### Installing and Running Certbot + +To install Certbot run: + +

+sudo dnf install certbot python3-certbot-nginx
+
+ +To get SSL certificates for your websites run: + +

+sudo certbot --nginx
+
+ +Answer the prompts that show up on screen as you wish. + +To configure auto renewal of the SSL certificate run: + +

+crontab -e
+
+ +and add the following line: + +

+0 12 * * * /usr/bin/certbot renew --quiet
+
+ +This will check everyday at noon to see if the certificate will expire in the +next month, if so it will renew the certificate. + +Now your website should be operational. + diff --git a/static/business_card b/static/business_card new file mode 100755 index 0000000..1f838b9 --- /dev/null +++ b/static/business_card @@ -0,0 +1,13 @@ +╭──────────────────────────────────────────────────────────────╮ +│ │ +│ Jacob McDonnell │ +│ │ +│ Email: jacob@jacobmcdonnell.com │ +│ Web: https://jacobmcdonnell.com/ │ +│ │ +│ GitHub: https://github.com/JacobMcDonnell │ +│ LinkedIn: https://linkedin.com/JacobMcDonnell │ +│ │ +│ Card: curl -sL https://jacobmcdonnell.com/card │ +│ │ +╰──────────────────────────────────────────────────────────────╯ diff --git a/static/css/main.css b/static/css/main.css new file mode 100755 index 0000000..445f082 --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,148 @@ +/* + * Color scheme + * Background color: #eaefef + * Code background: #d4d9d9 + * Main color: #00558e + * Secondary color: #0b3075 + */ +:root { + --color-1: #eaefef; + --color-2: #d4d9d9; + --color-3: #00558e; + --color-4: #0b3075; + } +body{ + background-color:var(--color-1); + color:var(--color-3); +} +a{ + color: var(--color-3); +} +ul.topBar{ + background-color:var(--color-3); +} +li.topLink a{ + color:var(--color-1); +} +li.topLink a:hover{ + background-color:var(--color-4); +} +.search{ + color:var(--color-3); + background-color:var(--color-1); + border-color:var(--color-3); +} +pre code { + background-color: var(--color-2); +} + +@media (prefers-color-scheme: dark) { + /* + * Color scheme + * Background color: #0D1F22 + * Text Color: #eaefef + * Main color: #00558e + * Secondary color: #0b3075 + */ + :root { + --color-1: #0D1F22; + --color-2: #081417; + --color-3: #00558e; + --color-4: #0b3075; + --text-color: #eaefef; + } + body{ + background-color:var(--color-1); + color:var(--text-color); + } + a{ + color: var(--text-color); + } + ul.topBar{ + background-color:var(--color-3); + } + li.topLink a{ + color:var(--text-color); + } + li.topLink a:hover{ + background-color:var(--color-4); + } + .search{ + color:var(--color-3); + background-color:var(--text-color); + border-color:var(--color-3); + } + pre code { + background-color: var(--color-2); + } +} + +/* Common CSS styling */ +body{ + font-family:Arial; +} +ul.topBar{ + text-transform:uppercase; + margin:0; + padding:0; + overflow:hidden; + list-style-type:none; +} +li.topLink{ + float:left; +} +li.topLink a{ + display:block; + text-align:center; + padding:0.875rem 1rem; + text-decoration:none; +} +.main{ + margin:auto; + width:60%; +} +.search{ + padding:0.75rem 1.25rem 0.75rem; + width:90%; + border-radius:0.3125rem; + margin-left:auto; + margin-right:auto; + margin-bottom:15em; + font-family:IBM Plex Mono; +} +pre code { + border: 0.0625rem solid #999; + display: block; + overflow:auto; + padding: 0.625rem; +} +.icon{ + font-size:12.5rem; + margin-top:0.625rem; + margin-bottom:0.625rem; +} + +@media only screen and (orientation: portrait){ + .main{ + margin:auto; + width:90%; + } +} + +div.article a{ + text-decoration:none; + display:block; +} + +/* Highlighting of article title */ +/* div.article{ */ +/* padding: 0.625rem; */ +/* } */ + +/* div.article a:hover{ */ +/* background-color:var(--color-2); */ +/* } */ + +img { + width:75%; +} diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100755 index 0000000..2224936 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/home.md b/static/home.md new file mode 100755 index 0000000..69e7533 --- /dev/null +++ b/static/home.md @@ -0,0 +1,23 @@ +## About +I'm Jacob McDonnell. I have been interested in computers since I was young. +My father has been in the technology field since before I was born, so I guess +that interest came from him. + +My interests, with respect to computers, are programming, UNIX/Plan9, and +electronics/hardware. I know how to program in Java thanks to a high school +course, and I like the language for somethings. Currently, I am learning the +Go programming language with the hope to replace Java for a nice compiled +single binary file. I would like to write my own unix-like operating system one +day. In my free time I like to play basketball, row, practice German and +Russian, and play guitar. + +I do not know what I will do with this website just yet, maybe I will write +articles about projects that I am working on. + +## Projects +[This Website](https://github.com/JacobMcDonnell/JacobMcDonnell.com) is written +in Python using Flask. + +[Jed](https://github.com/JacobMcDonnell/jed) is my own version of ed, currently +written in java. + diff --git a/static/images/LOGO_21x127.png b/static/images/LOGO_21x127.png new file mode 100755 index 0000000..22e3daf Binary files /dev/null and b/static/images/LOGO_21x127.png differ diff --git a/static/images/LOGO_21x127.svg b/static/images/LOGO_21x127.svg new file mode 100755 index 0000000..c888b2f --- /dev/null +++ b/static/images/LOGO_21x127.svg @@ -0,0 +1,78 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/static/images/LOGO_Transparent.png b/static/images/LOGO_Transparent.png new file mode 100755 index 0000000..43e6e4f Binary files /dev/null and b/static/images/LOGO_Transparent.png differ diff --git a/static/images/LOGO_Transparent.svg b/static/images/LOGO_Transparent.svg new file mode 100755 index 0000000..c4eb9c6 --- /dev/null +++ b/static/images/LOGO_Transparent.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/static/images/SideFlareGreen.svg b/static/images/SideFlareGreen.svg new file mode 100755 index 0000000..130f9f1 --- /dev/null +++ b/static/images/SideFlareGreen.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/SideFlarePurple.svg b/static/images/SideFlarePurple.svg new file mode 100755 index 0000000..2249c62 --- /dev/null +++ b/static/images/SideFlarePurple.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/favicon.xcf b/static/images/favicon.xcf new file mode 100755 index 0000000..344fd42 Binary files /dev/null and b/static/images/favicon.xcf differ diff --git a/static/images/menu.svg b/static/images/menu.svg new file mode 100755 index 0000000..7f1a394 --- /dev/null +++ b/static/images/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/wave.svg b/static/images/wave.svg new file mode 100755 index 0000000..130f9f1 --- /dev/null +++ b/static/images/wave.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/robots.txt b/static/robots.txt new file mode 100755 index 0000000..14067d6 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,6 @@ +User-agent: * +Disallow: /css +Disallow: /images +Disallow: /404.html +Disallow: /testPage + diff --git a/static/rss.xml b/static/rss.xml new file mode 100755 index 0000000..badc2e5 --- /dev/null +++ b/static/rss.xml @@ -0,0 +1,23 @@ + + + +Jacob McDonnell +Articles from Jacob McDonnell. +en-us +https://jacobmcdonnell.com/rss.xml + + +Jacob McDonnell +https://jacobmcdonnell.com/favicon.ico +https://jacobmcdonnell.com/rss.xml + + +Hosting a Website on the Raspberry Pi with Rocky Linux +https://jacobmcdonnell.com/articles/article["url"]/ +https://jacobmcdonnell.com/articles/article["url"]/ +19 Feb 2022 00:00:00 -0500 + + + \ No newline at end of file diff --git a/static/testpage.html b/static/testpage.html new file mode 100755 index 0000000..382cbf2 --- /dev/null +++ b/static/testpage.html @@ -0,0 +1,75 @@ +

Projects

+

Jed is my own version of jed, currently written in java.

+

Ticalcprograms are a set of small programs written in C for the TI-84 Pluse CE graphing calculator.

+

About

+

I'm Jacob McDonnell. I have been interested in computers since I was young. My father has been in the technology field since before I was born, so I guess that interest came from him.

My interests, with respect to computers, are programming, UNIX/Plan9, and electronics/hardware. I know how to program in Java thanks to a high school course, and I like the language for somethings. Currently I am learning the C programming language with the hopes to write my own operating system one day. In my free time I like to play basketball, row, practice German and Russian, and play guitar.

I do not know what I will do with this website just yet, maybe I will write articles about projects that I am working on.

+
+
+#include <stdio.h>
+
+int
+main(void) {
+printf("hello world\n");
+return 0;
+}
+
+
+
+

JED - Jacob's ed

+

Jed is a line mode text editor written in Java. It is similar to ed but not a clone, infact the commands are changed. It currently works but has much room for improvement.

+

Commands

+

+Jed commands:
+
+q: quits.
+
+w: writes the file.
+
+w: filename: writes with inputted name.
+
+o: filename: opens the file.
+
+a: appends user input to the end of the file.
+
+A: appends user input after the current line.
+
+p: prints the file.
+
+n: prints the file with line numbers.
+
+c: deletes and changes the current line.
+
+d: deletes the current line.
+
+Any integer: changes to that line number.
+
+g/expression/: finds and prints the expression.
+
+%s/expression/newExpression/: replaces an expression
+with new user input through the whole file.
+
+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+
+<integer, integer>: prefix works with d
+and s/ex/nex/ for a range of line.
+
+s/expression/newExpression/: replaces an
+expression with new user input in the current line.
+
+h: prints the commands and their description.
+
+

Building Jed

+

+make
+sudo cp jed /usr/bin/jed && sudo cp jed.jar /usr/bin/jed.jar
+
+

TODO

+ +
+

Test of Equations

+ +
+

-- cgit v1.2.3