Compare commits

...

10 Commits

Author SHA1 Message Date
Bel LaPointe
a7514e22fc who cares 2021-03-28 13:32:28 -05:00
Bel LaPointe
5d91288992 k 2019-07-16 11:29:06 -06:00
Bel LaPointe
5722f37916 ok 2019-07-16 07:37:12 -06:00
Bel LaPointe
b493a93785 add tmp 2019-07-16 07:36:05 -06:00
Bel LaPointe
ffa14550fd neato 2019-07-16 07:30:33 -06:00
Bel LaPointe
7cca58f524 there we go 2019-07-16 07:21:49 -06:00
Bel LaPointe
03b679e152 ok 2019-07-16 07:12:05 -06:00
Bel LaPointe
b3f8025dad one file 2019-05-15 13:58:00 -06:00
Bel LaPointe
45e70e9854 whatever 2019-05-15 13:51:36 -06:00
Bel LaPointe
598c0ecf2e ok 2019-05-15 13:51:10 -06:00
10 changed files with 197 additions and 62 deletions

8
.gitignore vendored Executable file
View File

@@ -0,0 +1,8 @@
*.tar
simpleserve
*.tar
*.sw*
**.sw*
tmp
server
uvc

3
.gitmodules vendored Executable file
View File

@@ -0,0 +1,3 @@
[submodule "water.css"]
path = water.css
url = ./private/water.css

36
build.sh Executable file
View File

@@ -0,0 +1,36 @@
#! /bin/bash
function main() {
init
server
local name="$(gitname)"
pack "$name"
}
function init() {
set -e
cd "$(dirname "$BASH_SOURCE")"
}
function server() {
local f="./exec-server"
GOOS=linux CGO_ENABLED=0 go build -o "$f" -a -installsuffix cgo >&2
echo "$f"
}
function gitname() {
local name="$(git describe --tags)"
if [ -z "$name" ]; then
name="$(git rev-parse --abbrev-ref HEAD)"
fi
echo "$name"
}
function pack() {
tar -czf "$1.tar" "./exec-server" "./public"
echo "$1.tar"
}
if [ "$0" == "${BASH_SOURCE[0]}" ]; then
main "$@"
fi

73
main.go Executable file
View File

@@ -0,0 +1,73 @@
/*
Serve is a very simple static file server in go
Usage:
-p="8100": port to serve on
-d=".": the directory of static files to host
Navigating to http://localhost:8100 will display the index.html or directory
listing file.
*/
package main
import (
"context"
"io/ioutil"
"local/args"
"log"
"net/http"
"os"
"path"
"strings"
"time"
)
func main() {
fs := args.NewArgSet()
fs.Append(args.STRING, "p", "port to serve", "8100")
fs.Append(args.STRING, "d", "static path to serve", "./public")
if err := fs.Parse(); err != nil {
panic(err)
}
d := fs.Get("d").GetString()
p := fs.Get("p").GetString()
go serve(d, p)
go poll(path.Join(d, "csv"), time.Minute)
<-context.Background().Done()
}
func serve(directory, port string) {
port = strings.TrimPrefix(port, ":")
http.Handle("/", http.FileServer(http.Dir(directory)))
log.Printf("Serving %s on HTTP port: %s\n", directory, port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
func poll(path string, interval time.Duration) {
for {
select {
case <-context.Background().Done():
case <-time.After(interval):
if err := refresh(path); err != nil {
log.Println(err)
}
}
}
}
func refresh(path string) error {
url := "https://docs.google.com/spreadsheets/d/14F7zRrwGT6JkCeZqZLPM2r2GScrm9FLFxlPtDINbNWg/gviz/tq?tqx=out:csv"
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
if err := ioutil.WriteFile(path, b, os.ModePerm); err != nil {
return err
}
return nil
}

Submodule private/water.css updated: 2f4c5fba5e...4aebad045d

4
public/csv Executable file
View File

@@ -0,0 +1,4 @@
"Link to Ride","Date","Day","Time","Route","Start","Notes"
"https://ridewithgps.com/routes/29835879","May 11","Sat","9:00 AM","Hobble Creek R & L Forks 86-Mi","OLD Bike Peddler 24 E Main American Fork","Great way to start the cycling year with good friends! Weather Permitting"
"","May 11","Sat","9:45 AM","64-Mile Ride Hobble Creek R & L Forks","Gas Station 1600 E 800 N Orem","Same route as last week."
"","May 13","Mon","5:45 AM","Spin Class","VASA Fitness American Fork","High Intensity group workout on new spin bikes"

View File

@@ -1,47 +0,0 @@
function http(method, remote, callback, body) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
callback(xmlhttp.responseText, xmlhttp.status)
}
};
xmlhttp.open(method, remote, true);
if (typeof body == "undefined") {
body = null
}
xmlhttp.send(body);
}
function populate_schedule(csv, status_code) {
console.log("status_code", status_code)
csv = csv.split("\n")
var first = true;
var table = "";
for (var i in csv) {
table += "<tr>\n"
i = csv[i].split('","')
for (var j in i) {
j = i[j]
j = j.replace(/(^"|"$)/g, "")
table += first ? "<th>" : "<td>"
table += j
table += first ? "</th>" : "</td>"
}
table += "</tr>\n"
first = false;
}
document.getElementById("schedule").innerHTML = table
}
var cors_anywhere = "https://cors-anywhere.herokuapp.com"
var google_doc_pre = "https://docs.google.com/spreadsheets/d/"
var google_doc_id = "14F7zRrwGT6JkCeZqZLPM2r2GScrm9FLFxlPtDINbNWg"
var google_doc_post = "/gviz/tq?tqx=out:csv"
//"https://www.googleapis.com/drive/v3/files/14F7zRrwGT6JkCeZqZLPM2r2GScrm9FLFxlPtDINbNWg/export?mimeType=text/csv&key=AIzaSyCFIWSe7vBnZ-1KRR9yVMbCPW08oCOHRJI",
http(
"get",
`${cors_anywhere}/${google_doc_pre}/${google_doc_id}/${google_doc_post}`,
populate_schedule,
JSON.stringify({"cc": "cc"}),
)

84
public/index.html Normal file → Executable file
View File

@@ -1,18 +1,8 @@
<html> <html>
<header>
<link rel='stylesheet' href='light.css'>
<link rel='stylesheet' href='uvc.css'>
<script src="home.js"></script>
</header>
<body> <body>
<a href="https://github.com/kognise/water.css">this css</a>
<div id="title">
<h1>Utah Velo Club</h1>
<h4>The club is located in Utah County. Just South of Salt Lake City, Utah!</h4>
</div>
<table><tr> <table><tr>
<td id="nav" style="width:150px; vertical-align: top;"> <td id="nav">
<br><a href="http://www.utahveloclub.com/club_membership_request2017.htm">Request for Club Membership</a> <a href="http://www.utahveloclub.com/club_membership_request2017.htm">Request for Club Membership</a>
<br><a href="http://www.utahveloclub.com/club_assumption_of_risk.htm">Assumption of Risk</a></li> <br><a href="http://www.utahveloclub.com/club_assumption_of_risk.htm">Assumption of Risk</a></li>
<br><a href="http://utahveloclub.com/id18.htm">About the Club</a> <br><a href="http://utahveloclub.com/id18.htm">About the Club</a>
<br><a href="http://bikepeddlerutah.com/blog/">Mountain Biking</a> <br><a href="http://bikepeddlerutah.com/blog/">Mountain Biking</a>
@@ -29,6 +19,10 @@
<br><a href="http://utahveloclub.com/id30.htm">Cycling Links</a> <br><a href="http://utahveloclub.com/id30.htm">Cycling Links</a>
</td> </td>
<td id="body"> <td id="body">
<div id="title">
<h1>Utah Velo Club</h1>
<h4>The club is located in Utah County. Just South of Salt Lake City, Utah!</h4>
</div>
<div> <div>
<h4>Site last Updated: May 10, 2019</h4> <h4>Site last Updated: May 10, 2019</h4>
</div> </div>
@@ -71,4 +65,70 @@
</td> </td>
</tr></table> </tr></table>
</body> </body>
<head>
<script>
function http(method, remote, callback, body) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
callback(xmlhttp.responseText, xmlhttp.status)
}
};
xmlhttp.open(method, remote, true);
if (typeof body == "undefined") {
body = null
}
xmlhttp.send(body);
}
function populate_schedule(csv, status_code) {
console.log("status_code", status_code)
csv = csv.split("\n")
var first = true;
var table = "";
for (var i in csv) {
table += "<tr>\n"
i = csv[i].split('","')
for (var j in i) {
j = i[j]
j = j.replace(/(^"|"$)/g, "")
table += first ? "<th>" : "<td>"
table += j
table += first ? "</th>" : "</td>"
}
table += "</tr>\n"
first = false;
}
document.getElementById("schedule").innerHTML = table
}
var cors_anywhere = "https://cors-anywhere.herokuapp.com"
var google_doc_pre = "https://docs.google.com/spreadsheets/d/"
var google_doc_id = "14F7zRrwGT6JkCeZqZLPM2r2GScrm9FLFxlPtDINbNWg"
var google_doc_post = "/gviz/tq?tqx=out:csv"
//`${cors_anywhere}/${google_doc_pre}/${google_doc_id}/${google_doc_post}`,
http(
"get",
window.location+"/csv",
populate_schedule,
JSON.stringify({"cc": "cc"}),
)
</script>
<style>
#nav
{
width: 150px;
vertical-align: top;
background-color: #990000;
color: #fff;
height: 100%;
}
#nav > a
{
color: #fff;
}
@charset "UTF-8";body{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.4;max-width:800px;margin:20px auto;padding:0 10px;color:#363636;background:#fff;text-rendering:optimizeLegibility}button,input,textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease}h1{font-size:2.2em;margin-top:0}h1,h2,h3,h4,h5,h6{margin-bottom:12px}h1,h2,h3,h4,h5,h6,strong{color:#000}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:600}blockquote{border-left:4px solid #700;margin:1.5em 0;padding:.5em 1em;font-style:italic}blockquote>footer{margin-top:10px;font-style:normal}address,blockquote cite{font-style:normal}a[href^=mailto]:before{content:"📧 "}a[href^=tel]:before{content:"📞 "}a[href^=sms]:before{content:"💬 "}button,input[type=button],input[type=checkbox],input[type=submit]{cursor:pointer}input:not([type=checkbox]):not([type=radio]),select{display:block}button,input,select,textarea{color:#000;background-color:#efefef;font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}button,input:not([type=checkbox]):not([type=radio]),select,textarea{-webkit-appearance:none}textarea{margin-right:0;width:100%;box-sizing:border-box;resize:vertical}button,input[type=button],input[type=submit]{padding-right:30px;padding-left:30px}button:hover,input[type=button]:hover,input[type=submit]:hover{background:#ddd}button:focus,input:focus,select:focus,textarea:focus{box-shadow:0 0 0 2px #700}button:active,input[type=button]:active,input[type=checkbox]:active,input[type=radio]:active,input[type=submit]:active{transform:translateY(2px)}button:disabled,input:disabled,select:disabled,textarea:disabled{cursor:not-allowed;opacity:.5}::-webkit-input-placeholder{color:#949494}::-moz-placeholder{color:#949494}:-ms-input-placeholder{color:#949494}::-ms-input-placeholder{color:#949494}::placeholder{color:#949494}a{text-decoration:none;color:#900}a:hover{text-decoration:underline}code,kbd{background:#efefef;color:#000;padding:5px;border-radius:6px}pre>code{padding:10px;display:block;overflow-x:auto}img{max-width:100%;height:auto}hr{border:none;border-top:1px solid #dbdbdb}table{border-collapse:collapse;margin-bottom:10px;width:100%}td,th{padding:6px;text-align:left}th{border-bottom:1px solid #dbdbdb}tbody tr:nth-child(2n){background-color:#efefef}::-webkit-scrollbar{height:10px;width:10px}::-webkit-scrollbar-track{background:#efefef;border-radius:6px}::-webkit-scrollbar-thumb{background:#d5d5d5;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#c4c4c4}::-moz-selection{background-color:#9e9e9e}::selection{background-color:#9e9e9e}
</style>
</head>
</html> </html>

View File

@@ -1 +0,0 @@
../private/water.css/dist/light.css

View File

@@ -1 +0,0 @@
../private/water.css/dist/uvc.css