67 lines
1.1 KiB
Go
67 lines
1.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
_ "github.com/mattn/go-sqlite3"
|
||
|
"log"
|
||
|
"math"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Event struct {
|
||
|
description string
|
||
|
timestamp int64
|
||
|
}
|
||
|
|
||
|
func formula(p float64) int64 {
|
||
|
yearsAgo := math.Exp(20.3444*math.Pow(p, 3)+3) - math.Exp(3)
|
||
|
return int64(yearsAgo * 31556926)
|
||
|
}
|
||
|
|
||
|
func closestEvent(t int64, db *sql.DB) (Event, error) {
|
||
|
var event Event
|
||
|
query := `
|
||
|
select description, timestamp
|
||
|
from events
|
||
|
where timestamp is not null
|
||
|
order by abs(? - timestamp) asc
|
||
|
limit 1
|
||
|
`
|
||
|
|
||
|
stmt, err := db.Prepare(query)
|
||
|
if err != nil {
|
||
|
return event, err
|
||
|
}
|
||
|
defer stmt.Close()
|
||
|
|
||
|
err = stmt.QueryRow(t).Scan(&event.description, &event.timestamp)
|
||
|
return event, err
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
percent := flag.Float64("p", -1, "percentage")
|
||
|
flag.Parse()
|
||
|
|
||
|
if *percent < 0 || *percent > 1 {
|
||
|
log.Fatal("invalid percentage")
|
||
|
}
|
||
|
|
||
|
t := time.Now().Unix() - formula(*percent)
|
||
|
|
||
|
db, err := sql.Open("sqlite3", "./timeline.db")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer db.Close()
|
||
|
|
||
|
event, err := closestEvent(t, db)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
date := time.Unix(event.timestamp, 0)
|
||
|
fmt.Printf("%v\t%v\t%v\n", event.timestamp, date, event.description)
|
||
|
}
|