Redo cache list style and add stats related to hidden date

sql-rework
Tomasz Golinski 2020-01-25 15:26:14 +01:00
rodzic ac7a677924
commit 74f220302c
5 zmienionych plików z 98 dodań i 18 usunięć

Wyświetl plik

@ -22,10 +22,10 @@ float Cache::distance() const {
return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((pos.lat - home.lat) / 2)), 2) + cos(degtorad(pos.lat)) * cos(degtorad(home.lat)) * pow(sin(degtorad((pos.lon - home.lon) / 2)), 2)));
}
void Cache::set_date(const std::tm* t) {
void Cache::set_date(const std::tm& t) {
char tmp[20];
date_tm = *t;
date_tm = t;
std::mktime(&date_tm);
year = std::to_string(1900 + date_tm.tm_year);
@ -41,6 +41,16 @@ void Cache::set_date(const std::tm* t) {
//date += std::to_string(date_tm.tm_hour) + ":" + std::to_string(date_tm.tm_min) + ":" + std::to_string(date_tm.tm_sec);
}
void Cache::set_date_hidden(const std::tm& t) {
char tmp[20];
date_hidden_tm = t;
std::mktime(&date_hidden_tm);
std::strftime(tmp, 20, "%F", &date_hidden_tm);
date_hidden = tmp;
}
float cache_distance(const Cache& a, const Cache& b) {
return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((a.pos.lat - b.pos.lat) / 2)), 2) + cos(degtorad(a.pos.lat)) * cos(degtorad(b.pos.lat)) * pow(sin(degtorad((a.pos.lon - b.pos.lon) / 2)), 2)));
}

Wyświetl plik

@ -56,14 +56,17 @@ public:
std::string owner;
std::string owner_uuid;
std::tm date_tm;
std::tm date_hidden_tm;
std::string year;
std::string mon;
std::string day;
std::string hour;
std::string day_of_week;
std::string date;
std::string date_hidden;
void set_date(const std::tm* t);
void set_date(const std::tm& t);
void set_date_hidden(const std::tm& t);
static Position home;

21
geo.css
Wyświetl plik

@ -78,17 +78,28 @@ dl,
color: #666;
}
.dt_head {
.list td {
background: #f0f8ff;
color: #000;
padding-left: 10px;
padding-right: 10px;
}
.list_head td {
font-weight: bold;
}
td {
width: 4em;
.dt td {
background: #CCC;
color: #000;
text-align: center;
}
.dt_head td {
font-weight: bold;
width: 4em;
}
td.dt_zero {
color: #888;
}
@ -203,6 +214,8 @@ dl {
padding: .5rem 1rem;
}
/* index flow */
.row {
display: flex;
width: 900px;
@ -212,4 +225,4 @@ dl {
.column {
flex: 50%;
}
}

Wyświetl plik

@ -216,16 +216,21 @@ int main(int argc, char** argv) {
// Prepare sorted list of caches, excluding moving caches
std::map<std::string, int> dates;
Date_Caches sorted_caches;
Date_Caches sorted_fcaches;
Date_Caches sorted_caches_by_hidden;
Caches fcc;
std::tm tmp;
for (auto& i : cc) {
dates[i.date]++;
tmp = i.date_tm;
sorted_caches.insert({ std::mktime(&tmp), &i });
if (i.type != "Moving" && i.type != "Own") {
tmp = i.date_tm;
sorted_caches.insert({ std::mktime(&tmp), &i });
sorted_fcaches.insert({ std::mktime(&tmp), &i });
fcc.insert(i);
}
tmp = i.date_hidden_tm;
sorted_caches_by_hidden.insert({ std::mktime(&tmp), &i });
}
std::cout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n";
@ -271,12 +276,12 @@ int main(int argc, char** argv) {
std::cout << "Longest caching streak: <span class=\"value\">" << longest_str << "</span> starting on <span class=\"value\">" << str_tmp << "</span><br>\n";
int tot_dist = 0;
for (auto i = sorted_caches.begin(); i != std::prev(sorted_caches.end()); i++) {
for (auto i = sorted_fcaches.begin(); i != std::prev(sorted_fcaches.end()); i++) {
//std::cout << "Distance between " << i->second->name << " and " << std::next(i)->second->name << " is " << cache_distance(*i->second, *std::next(i)->second) << "<br>";
tot_dist += cache_distance(*i->second, *std::next(i)->second);
}
std::cout << "Total distance between caches: <span class=\"value\">" << tot_dist << "</span> km (equivalent to <span class=\"value\">" << tot_dist / (2 * Pi * Earth_radius) << "x</span> trips around Earth)<br>\n";
std::cout << "Average distance between caches: <span class=\"value\">" << tot_dist / sorted_caches.size() << "</span> km<br>\n";
std::cout << "Average distance between caches: <span class=\"value\">" << tot_dist / sorted_fcaches.size() << "</span> km<br>\n";
std::cout << "</div>\n";
}
@ -293,15 +298,15 @@ int main(int argc, char** argv) {
auto W = std::min_element(fcc.begin(), fcc.end(), [&](const Cache& a, const Cache& b) { return a.pos.lon < b.pos.lon; });
std::cout << "<h2>Geographically extreme caches</h2>\n";
std::cout << "<table class=\"minmax\">\n";
std::cout << "<table class=\"list\">\n";
std::cout << "<tr>\n";
std::cout << " <td>North:</td><td><a href=\"" << N->link() << "\">" << N->name << " (" << N->code << ")</a></td><td>" << N->pos.lat << "</td>\n";
std::cout << " <td class=\"list_head\">North:</td><td><a href=\"" << N->link() << "\">" << N->name << " (" << N->code << ")</a></td><td>" << N->pos.lat << "</td>\n";
std::cout << "</tr><tr>\n";
std::cout << " <td>South:</td><td><a href=\"" << S->link() << "\">" << S->name << " (" << S->code << ")</a></td><td>" << S->pos.lat << "</td>\n";
std::cout << " <td class=\"list_head\">South:</td><td><a href=\"" << S->link() << "\">" << S->name << " (" << S->code << ")</a></td><td>" << S->pos.lat << "</td>\n";
std::cout << "</tr><tr>\n";
std::cout << " <td>East:</td> <td><a href=\"" << E->link() << "\">" << E->name << " (" << E->code << ")</a></td><td>" << E->pos.lon << "</td>\n";
std::cout << " <td class=\"list_head\">East:</td> <td><a href=\"" << E->link() << "\">" << E->name << " (" << E->code << ")</a></td><td>" << E->pos.lon << "</td>\n";
std::cout << "</tr><tr>\n";
std::cout << " <td>West:</td> <td><a href=\"" << W->link() << "\">" << W->name << " (" << W->code << ")</a></td><td>" << W->pos.lon << "</td>\n";
std::cout << " <td class=\"list_head\">West:</td> <td><a href=\"" << W->link() << "\">" << W->name << " (" << W->code << ")</a></td><td>" << W->pos.lon << "</td>\n";
std::cout << "</tr>\n";
std::cout << "</table>\n";
@ -382,6 +387,49 @@ int main(int argc, char** argv) {
std::cout << "<div class=\"basic_stats\">\n";
std::cout << "Total <span class=\"value\">" << n << "</span> days out of 366 (" << std::setprecision(3) << n / 3.66 << "%).\n";
std::cout << "</div>\n";
const int LIST_MAX = 15;
n = 1;
std::cout << "<h2>Oldest caches found</h2>\n";
std::cout << "<table class=\"list\">\n";
std::cout << "<tr class=\"list_head\"><td></td>";
std::cout << "<td>Cache</td>";
std::cout << "<td>Date hidden</td>";
std::cout << "<td>Date found</td>";
std::cout << "</tr>\n";
for (auto i = sorted_caches_by_hidden.begin(); i != sorted_caches_by_hidden.end(); i++) {
std::cout << "<tr><td class=\"list_head\">" << n << "</td> ";
std::cout << "<td>" << "<a href=\"" << i->second->link() << "\">" << i->second->name << " (" << i->second->code << ")</a>" << "</td>";
std::cout << "<td>" << i->second->date_hidden << "</td>";
std::cout << "<td>" << i->second->date << "</td>";
std::cout << "</tr>\n";
n++;
if (n > LIST_MAX) break;
}
std::cout << "</table>\n";
n = 1;
std::cout << "<h2>Newest caches found</h2>\n";
std::cout << "<table class=\"list\">\n";
std::cout << "<tr class=\"list_head\"><td></td>";
std::cout << "<td>Cache</td>";
std::cout << "<td>Date hidden</td>";
std::cout << "<td>Date found</td>";
std::cout << "</tr>\n";
for (auto i = sorted_caches_by_hidden.rbegin(); i != sorted_caches_by_hidden.rend(); i++) {
std::cout << "<tr><td class=\"list_head\">" << n << "</td> ";
std::cout << "<td>" << "<a href=\"" << i->second->link() << "\">" << i->second->name << " (" << i->second->code << ")</a>" << "</td>";
std::cout << "<td>" << i->second->date_hidden << "</td>";
std::cout << "<td>" << i->second->date << "</td>";
std::cout << "</tr>\n";
n++;
if (n > LIST_MAX) break;
}
std::cout << "</table>\n";
}
std::cout << "<div id=\"footer\">\n";

Wyświetl plik

@ -75,7 +75,7 @@ std::string Okapi::get_user_caches_json(std::string uuid, int count, int offset)
std::string Okapi::get_caches_json(std::string codes) {
std::string service = url + OKAPI_caches;
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|size2";
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|size2|date_hidden";
return curl_post(service, query);
}
@ -136,10 +136,16 @@ Caches Okapi::get_caches(std::vector<std::pair<std::string, std::tm>> codes) {
c.owner_uuid = el.value()["owner"]["uuid"];
c.pos = get_lat_lon(el.value()["location"]);
c.origin = "OC.pl";
std::tm tmp;
std::stringstream ss(el.value()["date_hidden"].get<std::string>());
ss >> std::get_time(&tmp, "%Y-%m-%dT%H:%M:%S+");
c.set_date_hidden(tmp);
//ugly way to handle date...
for (auto& el2 : codes) {
if (el2.first == c.code) {
c.set_date(&el2.second);
c.set_date(el2.second);
break;
}
}