Compare commits

..

47 Commits

Author SHA1 Message Date
d809533280 Ensure row divs are not double-closed. 2025-06-16 16:36:20 -06:00
ee367f9b3f Close the previous row before creating a new one! :) 2025-06-16 16:03:01 -06:00
d673eb2f6a Fix unquoted values resulting in unclosed tag. 2025-06-16 16:00:46 -06:00
afac80d543 Add single quotes around variable output for consistency. 2025-06-16 15:57:34 -06:00
f090607f67 Add build time to end of the page comments. 2025-06-16 15:52:20 -06:00
1dccb10a45 Give a readout on how long the photos page took to get loaded. 2025-06-16 15:44:24 -06:00
6f7934f8ff Merge pull request 'Fix Curl Installation' (#7) from dev into main
Reviewed-on: #7
2025-06-16 13:32:22 -07:00
998f5ed338 Fix echo command. Handle LOGNAME being empty in situations like a Docker container. 2025-06-16 15:10:23 -06:00
71cdccbeae Merge pull request 'Diet Page & Curl Dependency' (#6) from dev into main
Reviewed-on: #6
2025-06-16 12:36:21 -07:00
2fb438b199 Add curl as a dependency. 2025-06-16 13:43:11 -06:00
7eda07995f Add a medium avoidance group and shift items which were debateable in the upper and lower groups. 2025-06-06 10:55:04 -07:00
e7c4296724 Add and populate a Diet page. 2025-06-06 10:49:57 -07:00
369d8a736e Merge pull request 'Page Titles & All Photos Page' (#5) from dev into main
Reviewed-on: #5
2025-06-06 08:02:50 -07:00
073377532e Add headers to all pages! Also update the look and feel of the test page. 2025-05-27 12:41:17 -07:00
18cd38b194 Add default port in this script. 2025-05-27 11:27:18 -07:00
aa20bd67ee Add TBD's of how to better output in the log. 2025-05-27 11:27:06 -07:00
b4d9bae246 Add log function to ensure consistent output. Enhance regeneration of photo index files. 2025-05-27 11:20:20 -07:00
fcb091a164 Change name of the page to Full Photo Feed from Full Image Feed. 2025-05-27 10:53:19 -07:00
55742e50db Remove the all folder in place of an all.html file. Create a main page which provides the output of it. 2025-05-27 10:51:41 -07:00
e13a1633dd Remove unused variables. 2025-05-27 10:40:39 -07:00
add3a2865c Automatically reload the /photos/ index files. 2025-05-26 18:53:19 -07:00
6fd8525dad Properly handle jpeg and md files. 2025-05-26 16:39:15 -07:00
c7f4613d22 Delete the index files on each restart. 2025-05-26 16:38:54 -07:00
c6fd3f4786 Finish the all page! Even easier than expected and works GREAT! 2025-05-26 16:38:34 -07:00
474c258a83 Fix syntax error preventing page from running. 2025-05-26 15:24:40 -07:00
b35856fa88 Add the folder for all images. 2025-05-26 15:20:14 -07:00
290f1524a2 Refactor the photos page code and begin adding a feed page named all. 2025-05-26 13:54:46 -07:00
fb0ff39013 Merge pull request 'Major Fix, Minor Fixes, and Style / Tag Refactoring' (#4) from dev into main
Reviewed-on: #4
2025-05-19 10:08:04 -07:00
79c6a34e38 Remove call to neofetch. Does not appear to be giving away info from Docker, but juuust in case! 2025-05-19 09:57:13 -07:00
a26081d13f Fix HTML in sitemap. Add DOCTYPE, language, and a title. 2025-05-19 09:54:04 -07:00
7ccb7e2ac7 Alter the CSS for Trocador's widget based on W3 validator. Recommends using overflow CSS attribute rather than unsupported scrolling HTML attribute. 2025-05-19 09:45:13 -07:00
dc7fd3f834 Remove trailing slashes from line breaks, not needed in HTML. 2025-05-19 09:41:15 -07:00
a3b8025876 Fix comment to properly encapsulate p element. 2025-05-19 09:38:23 -07:00
6876cd34b7 Remove trailing slashes, not needed in HTML. 2025-05-19 09:37:36 -07:00
60f9241fbd Add alt tag to images. 2025-05-19 09:33:12 -07:00
698e2aa680 Remove redundant alt text, captions already have a description. 2025-05-19 09:31:31 -07:00
ff10025e05 Declare the language of the website. 2025-05-19 09:23:10 -07:00
72b1afdedd Create a CSS class for the size of app images, rather than giving the img attributes a percentage. Move the figures to be completely inside the anchors. 2025-05-19 09:09:53 -07:00
00660cef98 Add an apps alias for the homepage. 2025-05-17 10:57:07 -07:00
fc129124b8 Add explicit font sizes and boldness. 2025-05-17 10:39:31 -07:00
805b4ef8e0 Update elements and classes for better consistency in preparation for font size change. 2025-05-17 10:37:15 -07:00
f7b60e0944 Fix initial comment spacing. 2025-05-17 09:47:43 -07:00
f598d8f401 Express v5.0.0+ breaks the program, keep using 4 for now. 2025-05-17 09:42:16 -07:00
78ab7735d7 Simplify menu again for basic mobile web browsers (like Android's stock/default, not mobile Firefox). 2025-05-17 09:11:06 -07:00
e141347222 Merge pull request 'Release Expense Tracker App' (#3) from dev into main
Reviewed-on: #3
2025-03-26 13:24:22 -07:00
94246ddaeb Reword app description. 2025-03-25 08:43:13 -07:00
652bc8d35d Remove extra "free". 2025-03-25 08:40:59 -07:00
31 changed files with 887 additions and 358 deletions

View File

@ -1,3 +1,9 @@
# Hyperling.com - files/photos/
Used by `http://localhost:8080/photos` to build albums for sharing.
## index.html
Used by `http://localhost:8080/photos` to build and show list of albums.
## all.html
Used by `http://localhost:8080/photos-all` to show all albums at once.

20
main.js
View File

@ -104,7 +104,14 @@ async function main() {
</url>
`;
let sitemap_html = `
<html><body>
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Sitemap for Hyperling
</title>
</head>
<body>
<strong>Special Pages</strong>
<ul>
<li>
@ -134,6 +141,7 @@ async function main() {
/* AUTOMATIC METHOD BASED ON OBJECT/ARRAY OF WEB SCRIPTS
// Creates routes with the URL of the key and location of the value.
*/
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
for (let key in pages) {
console.log(" * Creating router for", key);
router.get("/" + key, function (req,res) {
@ -175,6 +183,7 @@ async function main() {
`;
// Provide sitemap.xml file for "SEO".
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
console.log(" * Creating router for sitemap.xml");
router.get('/sitemap.xml', function (req, res) {
console.log("sitemap.xml being provided to", req.socket.remoteAddress)
@ -183,6 +192,7 @@ async function main() {
});
// Provide human-usable sitemap links.
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
console.log(" * Creating router for sitemap*");
router.get('/sitemap*', function (req, res) {
console.log("sitemap.html being provided to", req.socket.remoteAddress)
@ -190,6 +200,7 @@ async function main() {
});
// Return a resource from the files folder.
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
console.log(" * Creating router for files");
router.get('/files*', function (req, res) {
console.log("file response to", req.socket.remoteAddress, "asking for", req.url)
@ -205,7 +216,8 @@ async function main() {
case "apk":
mime = "application/vnd.android.package-archive";
break;
case "jpg" || "jpeg":
case "jpg":
case "jpeg":
mime = "image/jpeg";
break;
case "png":
@ -217,7 +229,9 @@ async function main() {
case "zip":
mime = "application/zip";
break;
case "txt" || "csv" || "md":
case "md":
case "txt":
case "csv":
mime = "text/*";
break;
default:

View File

@ -1,6 +1,6 @@
{
"dependencies": {
"express": ">=4.18.1"
"express": ">=4.18.1 < 5.0.0"
},
"scripts": {
"start": "./run.sh"

View File

@ -1,12 +1,15 @@
#!/usr/bin/php
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "About";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Who Am I?</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/about.jpg">
<img src="/files/media/icons/about.jpg" alt="">
</div>
</div>
<div class="row">

10
pages/apps.php Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/php
<!--
Synonym for home page.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Apps";
}
include "home.php";
?>

View File

@ -1,12 +1,15 @@
#!/usr/bin/php
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Contact";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Contact</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/contact.jpg">
<img src="/files/media/icons/contact.jpg" alt="">
</div>
</div>
<div class="row">

214
pages/diet.php Executable file
View File

@ -0,0 +1,214 @@
#!/usr/bin/php
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Diet";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Current Diet</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/tbd.jpg" alt="Image TBD">
</div>
</div>
<div class="row">
<div class="col-12 text">
<p>
My diet is 100% vegan and focuses on a high carb low fat
macronutrient ratio from whole foods. I consume as many raw meals
as possible and prefer to cook for myself.
<!--Purchase priorities are 1) Non-GMO, 2) Local, 3) Organic.-->
</p>
<!-- -- >
<p>
I generally water fast until the sensation of an empty stomach
actually turns to hunger, then eat a raw fruit meal. If it's date
season or other high calorie fruit is readily available, the
whole day may be fruit, otherwise I make 1 large cooked meal such
as rice with veggies to cover the rest of the day's needs.
</p>
<!-- -->
</div>
</div>
<div class="row">
<h2 class="col-12 header" id="faves">Favorites</h2>
</div>
<div class="row">
<div class="col-12 text">
<strong>Fruit</strong>
<ol>
<li>Soursop</li>
<li>Durian</li>
<li>Pawpaw</li>
<li>Mamey Sapote</li>
</ol>
<p>Notable Mentions</p>
<ul>
<li>Dates</li>
<li>Longans</li>
<li>Cherimoya</li>
<li>Persimmons</li>
<li>Peaches & Nectarines</li>
<li>Fresh Coconut</li>
<li>Mango</li>
</ul>
<!-- -- >
<strong>Cooked</strong>
<ol>
<li></li>
<li></li>
<li></li>
</ol>
<!-- -->
</div>
</div>
<div class="row">
<h2 class="col-12 header" id="staples">Staples</h2>
</div>
<div class="row">
<div class="col-12 text">
<strong>Raw</strong>
<ul>
<li>Dates (Khadrawi, Barhi, Medjool)</li>
<li>Bananas</li>
<li>Apples (Autumn Crisp, Cosmic Crisp, Pink Lady, Granny Smith, Gala, Fuji)</li>
<li>Dried Mango (Natural Grocer's brand)
<ul><li>
This is best consumed rehydrated. The nectar is amazing!!
</li></ul>
</li>
</ul>
<strong>Cooked</strong>
<ul>
<li>Rice</li>
<li>Sweet Potato</li>
<li>Zucchini & Yellow Squash</li>
</ul>
</div>
</div>
<div class="row">
<h2 class="col-12 header" id="avoid">Allergies / Aversions</h2>
</div>
<div class="row">
<div class="col-12 text">
<p>
I've found that my body doesn't tolerate many foods found in modern diets.
</p>
<p>
Basically, if you wouldn't feed it to a dog or rabbit, I probably avoid it too.
</p>
<strong>High Reactivity</strong>
<p>
These are a quick "no". I'll smell the dish, but not eat!
</p>
<ul>
<li>Alliums (garlic, onions)
<!-- -- >
<ul><li>
Headaches, migraines, nightmares, night terrors, poor digestion.
</li></ul>
<!-- -->
</li>
<li>Caffeine (coffee, chocolate, cacao, cocoa)
<!-- -- >
<ul><li>
Headaches, intense sweating, jitters, anxiety, awful digestion.
</li></ul>
<!-- -->
</li>
<li>Grapes
<!-- -- >
<ul><li>Terrible digestion.</li></ul>
<!-- -->
</li>
<li>Tropical Nuts (peanuts, cashews, brazil nuts, etc)
<!-- -- >
<ul>
<li>Terrible digestion, lethargy, headaches.</li>
</ul>
<!-- -->
</li>
<li>Drugs & Alcohol
<!-- -- >
<ul><li>
People know me as the sober kid. I used cannabis on and off
until 2024 but was over recreational drugs by 2012. Now
that I'm happy I no longer need an escape. :)
</li></ul>
<!-- -->
</li>
</ul>
<strong>Medium Reactivity</strong>
<p>
I normally avoid these and only have them as rare exceptions.
</p>
<ul>
<li>Nightshades (tomato, peppers, potato, eggplant, tobacco, datura)
<!-- -- >
<ul>
<li>Mucous and lymph for days, poor digestion.</li>
<li>If cooked at a high enough temperature, like fries,
they become tolerable as long as theyre not overly oily.
</li>
</ul>
<!-- -->
</li>
<li>Cinnamon
<!-- -- >
<ul><li>Intense sweating, overheating.</li></ul>
<!-- -->
</li>
</ul>
<strong>Lower Reactivity</strong>
<p>
I may have these from time to time, but in very small amounts.
</p>
<ul>
<li>Fatty Nuts & Seeds (almonds, walnuts, pecans, sunflower seeds, etc)
<!-- -- >
<ul><li>Poor digestion, lethargy, </li></ul>
<!-- -->
</li>
<!-- -- >
<li>Quinoa
<!-- -- >
<ul><li>I want to love it, it just doesn't do anything!</li></ul>
-- >
</li>
<!-- -->
<li>Storebought/Pasteurized Juices
<!-- -- >
<ul><li>.</li></ul>
<!-- -->
</li>
<li>Tea (including herbal)
<!-- -- >
<ul><li>Needs to be comsumed with a meal, otherwise body may try to process it as one and leads to horrible digestion.</li></ul>
<!-- -->
</li>
<li>Legumes (beans, peas)
<!-- -- >
<ul><li>If not properly stored and cooked they cause me havoc.</li></ul>
<!-- -->
</li>
<li>Oily Meals
<!-- -- >
<ul><li></li></ul>
<!-- -->
</li>
<li>Empty Calories (donuts, cake, corn/potato chips, etc)
<!-- -- >
<ul><li>I want to love it, it just doesn't do anything!</li></ul>
<!-- -->
</li>
</ul>
</div>
</div>
<?php
include "helpers/body_close.php";
?>

View File

@ -3,5 +3,8 @@
Alias for the support page with a more common name.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Donate";
}
include "support.php";
?>

View File

@ -4,6 +4,9 @@
-->
<?php
$GLOBALS["ADVISORY"] = false;
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Health";
}
include "helpers/body_open.php";
?>

View File

@ -10,14 +10,14 @@
<a href="/health/">
<div class="col-12 text">
<u class="orange">2024-03-07</u>
<br/>
<br>
Find my free eBook, "Hyperling's Health Protocol",
<u class="orange">here</u>!
</div>
</a>
<!--<div class="col-12 text">
<u>2024-03-31</u>
<br/>
<br>
There's a
<a href="/home/#tictactoe">new app</a>
in town,

View File

@ -1,4 +1,4 @@
/*** Logo In Header ***/
/*** Logo In Header ***/
/* Shared Attributes */
.banner-top, .banner-middle, .banner-bottom {

View File

@ -1,4 +1,4 @@
/*** Dark Theme ***/
/*** Dark Theme ***/
body {
background-color: #444444;
}

34
pages/helpers/font.css Normal file
View File

@ -0,0 +1,34 @@
/*** Fonts and text sizes. ***/
/* For debugging anything which does not have a font size yet. * /
* {
color: cyan;
font-size: xx-large;
}
/* */
p,li,code,a,pre {
font-size: medium;
}
b,figcaption {
font-size: large;
font-weight: bold;
}
strong,img {
font-size: larger;
font-weight: bolder;
}
h6,h5 {
font-size: larger;
}
h4,h3 {
font-size: x-large;
}
h2,h1 {
font-size: xx-large;
}

View File

@ -8,19 +8,19 @@
<div class="row" id="footer">
<div class="col-12 title center">
<p>
Have a Health or Freedom related project which could use my help?
<a href="mailto:me@hyperling.com">Please let me know</a>!
</p>
</div>
</div>
<div class="row">
<!--<div class="col-3"></div>-->
<h6 class="col-6 center">
<div class="row center">
<div class="col-6">
<a href="https://git.hyperling.com/me/nodejs-website/src/branch/main/LICENSE"
target="_blank" rel="noopener noreferrer"
>This website is free software! Click here to learn more.</a>
</h6>
<h6 class="col-6 center">
<a href="/sitemap/">Full Site Map</a>
</h6>
<!--<div class="col-3"></div>-->
</div>
<div class="col-6">
<a href="/sitemap/">Full Site Map</a>
</div>
</div>

View File

@ -1,18 +1,28 @@
#!/usr/bin/php
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "";
} else {
$GLOBALS["HEADER_TITLE"] = ": " . $GLOBALS["HEADER_TITLE"];
}
?>
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>Hyperling</title>
<title>Hyperling<?php echo($GLOBALS["HEADER_TITLE"]); ?></title>
<link rel="icon" sizes="32x32"
href="/files/media/icons/favicon.ico"
/>
>
<link rel="icon" sizes="192x192"
href="/files/media/icons/favicon.ico"
/>
>
<!-- CSS -->
<style>
<?php include "main.css"; ?>
</style>
<style>
<?php include "font.css"; ?>
</style>
<style>
<?php include "dark.css"; ?>
</style>

View File

@ -1,4 +1,4 @@
/*** 2022-09-14 CSS for the website. ***/
/*** 2022-09-14 CSS for the website. ***/
/* https://www.w3schools.com/Css/css_rwd_grid.asp */
/* Enable dynamic stuffs, makes the element think its entire size includes padding. */
@ -137,3 +137,8 @@
margin-right: auto;
padding: 5px;
}
.app-icon {
width: 25%;
height: 25%;
}

View File

@ -2,11 +2,11 @@
<div class="row header menu">
<ul class="menu-list">
<li class="col-1"></li>
<li class="col-2 menu-item"><a href="/home/">Android Apps</a></li>
<li class="col-2 menu-item"><a href="/media/">Books / Socials</a></li>
<li class="col-2 menu-item"><a href="/about/">About Me</a></li>
<li class="col-2 menu-item"><a href="/contact/">Contact Details</a></li>
<li class="col-2 menu-item"><a href="/support/">Support / Donate</a></li>
<li class="col-2 menu-item"><a href="/apps/">Apps</a></li>
<li class="col-2 menu-item"><a href="/media/">Media</a></li>
<li class="col-2 menu-item"><a href="/about/">About</a></li>
<li class="col-2 menu-item"><a href="/contact/">Contact</a></li>
<li class="col-2 menu-item"><a href="/support/">Support</a></li>
<li class="col-1"></li>
</ul>
</div>

View File

@ -3,17 +3,20 @@
Landing page, keeping it apps and development projects like old WordPress site.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Home";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Welcome!</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/home.jpg">
<img src="/files/media/icons/home.jpg" alt="">
</div>
</div>
<div class="row">
<div class="col-12 text center">
<div class="col-12 text">
<p>
Thank you for visiting my site! My goal is to make the world a
better place. Hopefully you find content here which helps empower

View File

@ -4,7 +4,7 @@
cd `dirname $0`
# Create the necessary HTML components for a web page.
./helpers/body_open.php
./helpers/body_open.php | sed -e 's/Hyperling/Hyperling: Journey/'
#Content for this page
cat << EOF

View File

@ -3,6 +3,9 @@
Lists of items which I'd like to share such as gear and frequently used apps.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Lists";
}
include "helpers/body_open.php";
?>

View File

@ -3,13 +3,16 @@
Page for my video links.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Media";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Media</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/videos.jpg">
<img src="/files/media/icons/videos.jpg" alt="">
</div>
</div>
<div class="row">

20
pages/photos-all.sh Executable file
View File

@ -0,0 +1,20 @@
#!/bin/bash
# Alias for new All Photos feed.
# Move to main directory.
DIR=`dirname $0`
cd $DIR/..
# Locations of photo scripts.
photos_all=./files/photos/all.html
photos=./pages/photos.sh
# If the all script does not exist,call the generator and ignore its output.
if [[ ! -e $photos_all ]]; then
$photos > /dev/null
fi
## Main ##
cat $photos_all
exit 0

View File

@ -2,12 +2,11 @@
# 2024-01-21 Hyperling
# Transition away from PhotoPrism. Helps to save system resources and downsize.
# Static Variables
## Static Variables ##
DIR=`dirname $0`
header="<html>\n\t<header>\n\t\t<title>ALBUM</title>\n\t</header>\n\t<body>"
footer="\n\t</body>\n</html>"
a="a target='_blank' rel='noopener noreferrer'"
# Functions
## Functions ##
function remove_problem_strings {
file="$1"
sed -i -e 's/#!\/usr\/bin\/php//g' $file
@ -20,6 +19,7 @@ cd $DIR/..
HELPER_DIR=./pages/helpers
PHOTOS_DIR=./files/photos
mainpage=$PHOTOS_DIR/index.html
allpage=$PHOTOS_DIR/all.html
# Use the cached version if available.
if [[ -e $mainpage ]]; then
@ -28,28 +28,48 @@ if [[ -e $mainpage ]]; then
exit 0
fi
# Create the necessary HTML components for a web page.
$HELPER_DIR/body_open.php > $mainpage
echo "" >> $mainpage
## Start the main /photos/ page. ##
function start_main_page {
# Create the necessary HTML components for a web page.
$HELPER_DIR/body_open.php > $mainpage
sed -i -e 's/Hyperling/Hyperling: Photos/' $mainpage
echo "" >> $mainpage
# Give the page a description.
echo -e "\t\t<div class='row'>" >> $mainpage
echo -e "\t\t\t<h1 class='col-12 title'>Albums</h1>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
# Give the page a description.
echo -e "\t\t<div class='row'>" >> $mainpage
echo -e "\t\t\t<h1 class='col-12 title'>Albums</h1>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
echo -e "\t\t<div class='row'>" >> $mainpage
echo -e "\t\t\t<div class='col-12 text'>" >> $mainpage
echo -en "\t\t\t\t<p>You may click on an album name to " >> $mainpage
echo -en "view all of its files, or click on a specific image to bring up the " >> $mainpage
echo -en "full resolution. On the album pages you may also click an image or " >> $mainpage
echo -e "video name to pull up the full resolution for download.</p>" >> $mainpage
echo -e "\t\t\t</div>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
echo -e "\t\t<div class='row'>" >> $mainpage
echo -e "\t\t\t<div class='col-12 text'>" >> $mainpage
echo -en "\t\t\t\t<p>You may click on an album name to " >> $mainpage
echo -en "view all of its files, or click on a specific image to bring up the " >> $mainpage
echo -en "full resolution. On the album pages you may also click an image or " >> $mainpage
echo -e "video name to pull up the full resolution for download.</p>" >> $mainpage
echo -e "\t\t\t</div>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
# Display the album names descending.
ls $PHOTOS_DIR/ | sort -r | while read album; do
echo -e "\t\t<div class='row'>" >> $mainpage
echo -e "\t\t\t<$a href='/photos-all'" >> $mainpage
echo -e "\t\t\t\tclass='col-12 header'>Click Here for the Full Photo Feed" >> $mainpage
echo -e "\t\t\t</a>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
}
## Close out the main page after the sub pages are done being added. ##
function end_main_page {
# Finish the main /photos/ page.
$HELPER_DIR/body_close.php >> $mainpage
echo "<!-- Built on `date`. -->" >> $mainpage
remove_problem_strings $mainpage
}
## Create the album pages. ##
function build_album_pages {
# Display the album names descending.
ls $PHOTOS_DIR/ | sort -r | while read album; do
# Skip files, only read directories.
if [[ ! -d $PHOTOS_DIR/$album ]]; then
if [[ ! -d "$PHOTOS_DIR/$album" || "$album" == "all" ]]; then
continue
fi
@ -59,8 +79,8 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
album_name=${album_name//-/ }
echo -e "\t\t<div class='row'>" >> $mainpage
echo -en "\t\t\t<h2 class='col-12 title'>" >> $mainpage
echo -en "<a href='/files/photos/$album/index.html' " >> $mainpage
echo -e "target='_blank' rel='noopener noreferrer'>$album_name</a></h2>" >> $mainpage
echo -en "<$a href='/files/photos/$album/index.html'>" >> $mainpage
echo -e "$album_name</a></h2>" >> $mainpage
echo -e "\t\t</div>" >> $mainpage
# Catch all the upcoming photo records.
@ -70,6 +90,8 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
page=""
subpage="$PHOTOS_DIR/$album/index.html"
$HELPER_DIR/body_open.php > $subpage
sed -i -e "s/Hyperling/Hyperling: $album_name/" $subpage
echo "" >> $subpage
# Add a back button
echo -en "\n\t\t<div class='row'>\n\t\t\t<a href='/photos'>" >> $subpage
@ -101,8 +123,7 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
echo -e "\t\t\t\t<p>`cat $photo`</p>" >> $mainpage
else
# Otherwise put in the PHOTOS page list.
echo -en "\t\t\t\t<li class='indent'><a href=/$photo target='_blank' " >> $mainpage
echo -en "rel='noopener noreferrer'>$filename" >> $mainpage
echo -en "\t\t\t\t<li class='indent'><$a href='/$photo'>$filename" >> $mainpage
if [[ $photo == *".mp4" ]]; then
echo -en " [VIDEO]" >> $mainpage
fi
@ -110,18 +131,19 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
fi
## Put in the subpage HTML ##
# Set the count if this is the first loop.
new_row="\t\t<div class='row text'>"
# Set the count and start a row if this is the first loop.
if [[ -z $count ]]; then
count=0
fi
# Add a row for the next 2 images.
if (( $count % 2 == 0 )); then
echo -e "\t\t<div class='row text'>" >> $subpage
echo -e "$newrow" >> $subpage
# Else check if we need to start a new one for the next 2 images.
elif (( $count % 2 == 0 )); then
echo -e "\t\t</div>" >> $subpage
echo -e "$newrow" >> $subpage
fi
# Add the container for the image and its text.
echo -e "\t\t\t<div class='col-6 center'>" >> $subpage
echo -en "\t\t\t\t<a href=/$photo target='_blank' " >> $subpage
echo -e "rel='noopener noreferrer'>" >> $subpage
echo -en "\t\t\t\t<$a href='/$photo'>" >> $subpage
# Determine what type of media it is, and how to display it.
if [[ $photo == *".mp4" ]]; then
echo -e "\t\t\t\t\t<video width='320px' controls>" >> $subpage
@ -131,7 +153,7 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
elif [[ $photo == *".md" || $photo == *".txt" ]]; then
echo -e "\t\t\t\t\t<p>`cat $photo`</p>" >> $subpage
else
echo -e "\t\t\t\t\t<img src='/$photo'/>" >> $subpage
echo -e "\t\t\t\t\t<img src='/$photo' alt=''>" >> $subpage
fi
# Check if it needs an extra descriptive detail.
echo -en "\t\t\t\t\t<p>$filename" >> $subpage
@ -140,10 +162,6 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
fi
# Close the image description and its link.
echo -e "</p>\n\t\t\t\t</a>\n\t\t\t</div>" >> $subpage
# Close the row after an odd count.
if (( $count % 2 == 1 )); then
echo -e "\t\t</div>" >> $subpage
fi
count=$(( count + 1 ))
done
echo -e "\t\t</div>" >> $subpage
@ -159,15 +177,129 @@ ls $PHOTOS_DIR/ | sort -r | while read album; do
# Close out the ALBUM's page.
$HELPER_DIR/body_close.php >> $subpage
echo "<!-- Built on `date`. -->" >> $subpage
remove_problem_strings $subpage
done
done
}
# Finish the web page.
$HELPER_DIR/body_close.php >> $mainpage
echo "<!-- Built on `date`. -->" >> $mainpage
## Create an ALL page. ##
function build_all_page {
# - Shows all photos in descending order, as an overall feed.
# - Four images wide.
# - Has 2 URLs below the image. One to the album, and one to the image.
# - Image is a URL to itself as with other pages.
# - Images are shown at maximum 500px or so vertical for quick scrolling.
remove_problem_strings $mainpage
# Create/overwrite file.
$HELPER_DIR/body_open.php > $allpage
sed -i -e 's/Hyperling/Hyperling: All Photos/' $allpage
echo "" >> $allpage
# Add header.
echo -e "\t\t<div class='row'>" >> $allpage
echo -e "\t\t\t<h1 class='col-12 title'>All Photo Feed</h1>" >> $allpage
echo -e "\t\t</div>" >> $allpage
# Add images to the page
find $PHOTOS_DIR/ ! -name "*".html | sort -r | while read media_file; do
if [[ -d $media_file
|| "$media_file" == *"/photos/README.md"
]]; then
continue
fi
# Remove the initial '.' from the URI.
media_uri="${media_file//\.\//\/}"
# Path to the image home.
dir_uri="`dirname $media_uri`"
# Prepare variables which will be used throughout the loop.
media_name="`basename $media_uri`"
dir_name="`basename $dir_uri`"
# This must be after the dir_name has been pulled.
dir_uri="$dir_uri/index.html"
# Do not show the file extension for the filename.
media_name="${media_name%%.*}"
# Change underscores and dashes to be spaces for better overflow.
media_name="${media_name//_/ }"
media_name="${media_name//-/ }"
dir_name="${dir_name//_/ }"
dir_name="${dir_name//-/ }"
media="<img src='$media_uri' alt='' style='width:100%'>"
# Determine how to show the file.
if [[ $media_uri == *".mp4" ]]; then
media="<video controls style='width:100%'>"
media="${media}<source src='$media_uri' type=video/mp4>"
media="${media}Your browser does not support videos."
media="${media}</video>"
media_name="$media_name [VIDEO]"
elif [[ $media_uri == *".md" || $media_uri == *".txt" ]]; then
media="<p>`cat $media_file`</p>"
fi
# Add a row if count has reset.
if [[ -z $count ]]; then
count=0
fi
if [[ $count == 0 ]]; then
echo -e "\t\t</div>" >> $allpage
echo -e "\t\t<div class='row text'>" >> $allpage
fi
# Add a column.
echo -e "\t\t\t<div class=col-3>" >> $allpage
# Add the image.
echo -e "\t\t\t\t<div class=center>" >> $allpage
echo -e "\t\t\t\t\t<$a href='$media_uri'>$media</a>" >> $allpage
echo -e "\t\t\t\t</div>" >> $allpage
# Add the URLs.
echo -e "\t\t\t\t<div class=center>" >> $allpage
echo -e "\t\t\t\t\t<p><$a href='$dir_uri'>$dir_name</a></p>" >> $allpage
echo -e "\t\t\t\t</div>" >> $allpage
echo -e "\t\t\t\t<div class=center>" >> $allpage
echo -e "\t\t\t\t\t<p><$a href='$media_uri'>$media_name</a></p>" >> $allpage
echo -e "\t\t\t\t</div>" >> $allpage
# Close the column.
echo -e "\t\t\t</div>" >> $allpage
# Close the row and reset the the count if full.
if [[ $count == 3 ]]; then
echo -e "\t\t</div>" >> $allpage
count=0
else
count=$(( count + 1 ))
fi
done
# Add a final back button.
echo -en "\n\t\t<div class='row'>\n\t\t\t<a href='/photos'>" >> $allpage
echo -e "<h3 class='col-12 title'>Back</h3></a>\n\t\t</div>" >> $allpage
# Finish the ALL page.
$HELPER_DIR/body_close.php >> $allpage
echo "<!-- Built on `date`. -->" >> $allpage
remove_problem_strings $allpage
}
## Main ##
beg_time="$SECONDS"
start_main_page
build_album_pages
build_all_page
end_main_page
end_time="$SECONDS"
time="$(( $end_time - $beg_time ))"
echo "<!-- Script took '$time' seconds to process. -->" >> $mainpage
cat $mainpage
exit 0

View File

@ -3,13 +3,16 @@
Page for my resume and work skill links.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Resume";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Resume</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/home.jpg"> <!-- TBD use a new photo -->
<img src="/files/media/icons/home.jpg" alt=""> <!-- TBD use a new photo -->
</div>
<h2 class="col-12 title center">Current Status : Traveling Full Time</h2>
</div>

View File

@ -12,12 +12,14 @@
I have not been sick since I cleaned up my lifestyle in 2014. No
colds, flus, fevers, etc. My suggestions for accomplishing this
are simple. Consistently:
</p>
<ul class="indent">
<li>eat enough clean food,</li>
<li>drink enough clean water,</li>
<li>get enough good sleep, and</li>
<li>enjoy a low-stress life.</li>
</ul>
<p>
Unfortunately our society today has many different views on how
to do these things, most of which I would say do not work. A
quick list of my protocol without getting too into the weeds can

View File

@ -21,7 +21,7 @@
<div class="row">
<div class="col-12 text">
<p>
Please feel free to use any of my free software below.
Please feel welcome to use any of my free software below.
</p>
</div>
</div>
@ -33,17 +33,20 @@
<div class="row center text">
<div class="col-12 text border" id="expense">
<figure>
<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases">
<img loading="lazy" width="25%" height="25%" alt="expense_image"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/expense.png"
/>
>
<figcaption>
<p>Recurring Expense Tracker</p>
Recurring Expense Tracker
</figcaption>
</figure>
</a>
<p>
Keep track of repeating expenses and their effect on your
finances. First app written in Flutter.
Keep track of repeating expenses and
view projections of their effect on your finances.
First app written with Flutter.
</p>
<p>
<!--[<s><a>F-Droid</a></s>]-->
@ -52,18 +55,18 @@
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases"
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
</p>
</figcaption>
</figure>
</div>
<div class="col-12 text border" id="tictactoe">
<figure>
<a href="https://git.hyperling.com/me/android-tictactoe/releases">
<img loading="lazy" width="25%" height="25%" alt="tictactoe_image"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/tictactoe.png"
/>
>
<figcaption>
<p>Tic-Tac-Toe</p>
Tic-Tac-Toe
</figcaption>
</figure>
</a>
<p>
Play against a friend or a range of AIs.
@ -76,19 +79,19 @@
[<a href="https://git.hyperling.com/me/android-tictactoe/releases"
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
</p>
</figcaption>
</figure>
</div>
<div class="col-12 text border" id="ctfu">
<figure>
<a href="https://git.hyperling.com/me/android-carb-up/releases"
target="_blank" rel="noopener noreferrer">
<img loading="lazy" width="25%" height="25%" alt="ctfu_image"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/ctfu.png"
/>
>
<figcaption>
<p>Carb Up! BETA</p>
Carb Up! BETA
</figcaption>
</figure>
</a>
<p>
Calculate cost-effective foods on a High Carb Low Fat lifestyle.
@ -106,20 +109,20 @@
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
</s>
</p>-->
</figcaption>
</figure>
</div>
<div class="col-12 text border" id="timer">
<figure>
<a href="https://git.hyperling.com/me/android-infinite-timer/releases"
target="_blank" rel="noopener noreferrer"
>
<img loading="lazy" width="25%" height="25%" alt="infinitetimer_image"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/infinitetimer.png"
/>
>
<figcaption>
<p>Infinite Timer</p>
Infinite Timer
</figcaption>
</figure>
</a>
<p>
Play a notification at your chosen interval.
@ -137,19 +140,19 @@
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
</s>
</p>-->
</figcaption>
</figure>
</div>
<div class="col-12 text border" id="sleep">
<figure>
<a href="https://git.hyperling.com/me/android-45-minute-rule/releases"
target="_blank" rel="noopener noreferrer">
<img loading="lazy" width="25%" height="25%" alt="45minuterule"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/t45mr.png"
/>
>
<figcaption>
<p>45 Minute Rule</p>
45 Minute Rule
</figcaption>
</figure>
</a>
<p>
Determine a good bedtime for waking during light sleep.
@ -167,22 +170,20 @@
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
</s>
</p>-->
</figcaption>
</figure>
</div>
<div class="col-12 text border" id="games">
<figure>
<a href="https://git.hyperling.com/me/android-hypergames/releases"
target="_blank" rel="noopener noreferrer"
>
<img loading="lazy" width="25%" height="25%" alt="hypergames_image"
<figure>
<img class="app-icon" loading="lazy" alt=""
src="/files/media/icons/hypergames.png"
/>
>
<figcaption>
<p>
HyperGames
</p>
</figcaption>
</figure>
</a>
<p>
Started as a fun project for learning.
@ -196,13 +197,13 @@
[<a href="https://git.hyperling.com/me/android-hypergames/releases"
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
</p>
<!--<p>
<!--
<p>
<s>
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
</s>-->
</s>
</p>
</figcaption>
</figure>
-->
</div>
</div>

View File

@ -7,65 +7,66 @@
<div class="row text">
<div class="col-4 center border">
<h3 class="title spacing">Preference 1 - Private Crypto</h3>
<p>Send me any type of coin.</p>
<strong class="spacing">Preference 1 - Private Crypto</strong>
<p>Send any type of coin.</p>
<div class="header">
<!-- https://trocador.app/en/anonpayurlgenerator -->
<iframe src="https://trocador.app/anonpay/?ticker_to=xmr&network_to=Mainnet&address=4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao&donation=True&amount=1337.0&name=Chad&description=Support+Chad+%40+Hyperling&email=me@hyperling,com&ticker_from=doge&network_from=Mainnet&buttonbgcolor=663399&textcolor=cccccc&bgcolor=" width="310" height="350" style="border:0" scrolling="no"></iframe>
<iframe src="https://trocador.app/anonpay/?ticker_to=xmr&network_to=Mainnet&address=4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao&donation=True&amount=1337.0&name=Chad&description=Support+Chad+%40+Hyperling&email=me@hyperling,com&ticker_from=doge&network_from=Mainnet&buttonbgcolor=663399&textcolor=cccccc&bgcolor=" width="310" height="350" style="border:0; overflow:hidden;"></iframe>
</div>
</div>
<div class="col-4 center border">
<h3 class="title spacing">Preference 2 - Public Crypto</h3>
<p>Donate directly to my addresses.</p>
<strong class="spacing">Preference 2 - Public Crypto</strong>
<p>Donate directly to an address.</p>
<div class="header">
<br/>
<br>
<strong><code>XMR | Monero</code></strong>
<div class="code"><code>4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao</code></div>
<br/>
<br>
<strong><code>BTC | Bitcoin</code></strong>
<div class="code"><kbd>bc1qsfe8dkvry3d34kztz449gkq67wq8fu2nkgfkh0</kbd></div>
<br/>
<div class="code"><code>bc1qsfe8dkvry3d34kztz449gkq67wq8fu2nkgfkh0</code></div>
<br>
<strong><code>LTC | Litecoin</code></strong>
<div class="code"><code>ltc1qavmpu5d6ljntxsd6jj548m4yys83zwscl0dzkx</code></div>
<br/>
<br>
<strong><code>LBC | Odysee's Coin</code></strong>
<div class="code"><code>bDWP6qZajtm9Q9EkryKTorRwKFd5eDbPJj</code></div>
<br/>
<br>
</div>
</div>
<div class="col-4 center border">
<h3 class="title spacing">Preference 3 - Public USD</h3>
<strong class="spacing">Preference 3 - Public USD</strong>
<p>Send USD to a fiat-based account.</p>
<div class="header">
<br/>
<br>
<strong><code>Zelle</code></strong>
<div class="code">
<kbd>me@hyperling.com</kbd>
<br/>
<br/>
<img src="/files/media/icons/zelle.png">
<code>me@hyperling.com</code>
<br>
<br>
<img src="/files/media/icons/zelle.png" alt="">
</div>
<br/>
<br>
<strong><code>Venmo</code></strong>
<div class="code">
<kbd>
<code>
@HyperVegan
<br/>
<br/>
<kbd>[<a href="https://account.venmo.com/u/HyperVegan"
<br>
<br>
<code>[<a href="https://account.venmo.com/u/HyperVegan"
target="_blank" rel="noopener noreferrer"
>Account Page</a>]
</kbd>
</code>
</code>
</div>
<br/>
<br>
</div>
</div>

View File

@ -3,13 +3,16 @@
Page to provide ways people can support me.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Support";
}
include "helpers/body_open.php";
?>
<div class="row">
<h1 class="col-12 title">Support</h1>
<div class="col-12 header center" >
<img src="/files/media/icons/support.jpg">
<img src="/files/media/icons/support.jpg" alt="">
</div>
<div class="col-12 text center">
<p>

View File

@ -4,26 +4,33 @@
cd `dirname $0`
# Create the necessary HTML components for a web page.
./helpers/body_open.php
echo -e "\t\t<h1>This is a web page written in BASH!!!</h1>"
./helpers/body_open.php | sed -e 's/Hyperling/Hyperling: Test Page!/'
echo -e "\t\t<div class='row'>"
echo -e "\t\t\t<h1 class='col-12 title'>This is a web page written in BASH!!!</h1>"
cat << EOF
<p>
<p class="col-12 text">
Look at all the fancy things we can do!
</p>
<h2>Current Time</h2>
<h2 class="col-12 header">Current Time</h2>
<div class="col-12 text">
<p>
We can use the date command to spit out the time!
</p>
<p>
`date`
</p>
</div>
EOF
# Create a subsection
echo -e "\t\t<h2>Server Neofetch</h2>"
echo -e "\t\t<p>"
neofetch --stdout
echo -e "\t\t</p>"
echo -e "\t\t\t<h2 class='col-12 header'>Server Neofetch</h2>"
echo -en "\t\t\t<p class='col-12 text'>"
#neofetch --stdout | sed -e 's/\n/<br>/g'
echo -n "jk lol"
echo -e "</p>"
echo -e "\t\t</div>"
# Finish the web page
./helpers/body_close.php

View File

@ -4,5 +4,8 @@
Deprecated 2024-03-06 for /media.
-->
<?php
if (!isset($GLOBALS["HEADER_TITLE"])) {
$GLOBALS["HEADER_TITLE"] = "Videos";
}
include "media.php";
?>

55
run.sh
View File

@ -21,6 +21,11 @@ function usage {
exit $1
}
function log {
message="$1"
echo -e "`date` - $message"
}
## Parameters ##
while getopts ':p:h' opt; do
@ -36,18 +41,25 @@ while getopts ':p:h' opt; do
esac
done
if [[ -z $ports ]]; then
ports=8080
fi
## Build Environment ##
# Ensure we are executing from this file's directory.
cd $DIR
sudo=""
if [[ -z $LOGNAME ]]; then
LOGNAME="`whoami`"
fi
if [[ $LOGNAME != "root" ]]; then
echo "`date` - Using sudo since user is '$LOGNAME'."
log "Using sudo since user is '$LOGNAME'."
sudo="sudo"
fi
echo "`date` - Check if any system dependencies need installed."
log "Check if any system dependencies need installed."
if [[ ! `which php` ]]; then
echo "- Installing PHP"
$sudo apt-get install -y php-cli
@ -60,9 +72,13 @@ if [[ ! `which npm` ]]; then
echo "- Installing NPM"
$sudo apt-get install -y npm
fi
if [[ ! `which curl` ]]; then
echo "- Installing Curl"
$sudo apt-get install -y curl
fi
# Directories and allowed page types are executable, others are not.
echo "`date` - Fix any strange file permissions."
log "Fix any strange file permissions."
find ./pages/ | while read file; do
if [[ $file == *".php" || $file == *".sh" || -d $file ]]; then
mode=755
@ -72,16 +88,43 @@ find ./pages/ | while read file; do
chmod -c $mode $file
done
echo "`date` - Check if any node modules need updated/installed."
log "Check if any node modules need updated/installed."
npm install
# Reset generated index files.
log "Removing old index files."
find files/photos/ -name "*".html -print -delete
{
count=1
http_code=0
port="${ports%% *}"
photos_uri=":$port/photos/"
beg_time="$SECONDS"
while [[ $http_code != "200" ]]; do
log "Sleeping for '$count' while waiting for $photos_uri to come up."
sleep $count
log "Checking if $photos_uri is available."
http_code="`curl --silent --fail --w '\n%{http_code}' localhost$photos_uri | tail -n 1`"
log "Check for $photos_uri responded with '$http_code'."
if (( $count >= 10 )); then
log "Giving up on loading $photos_uri after '$count' attempts."
break
else
count=$(( count + 1 ))
fi
done
end_time="$SECONDS"
time="$(( $end_time - $beg_time ))"
log "Finished checking for /photos/ after '$time' seconds."
} &
## Main ##
echo "`date` - Start website API."
log "Start website API."
node ./main.js $ports
status=$?
## Finish ##
echo "`date` - Exiting with status '$status'."
log "Exiting with status '$status'."
exit $status