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))); 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]; char tmp[20];
date_tm = *t; date_tm = t;
std::mktime(&date_tm); std::mktime(&date_tm);
year = std::to_string(1900 + date_tm.tm_year); 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); //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) { 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))); 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;
std::string owner_uuid; std::string owner_uuid;
std::tm date_tm; std::tm date_tm;
std::tm date_hidden_tm;
std::string year; std::string year;
std::string mon; std::string mon;
std::string day; std::string day;
std::string hour; std::string hour;
std::string day_of_week; std::string day_of_week;
std::string date; 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; static Position home;

19
geo.css
Wyświetl plik

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

Wyświetl plik

@ -216,16 +216,21 @@ int main(int argc, char** argv) {
// Prepare sorted list of caches, excluding moving caches // Prepare sorted list of caches, excluding moving caches
std::map<std::string, int> dates; std::map<std::string, int> dates;
Date_Caches sorted_caches; Date_Caches sorted_caches;
Date_Caches sorted_fcaches;
Date_Caches sorted_caches_by_hidden;
Caches fcc; Caches fcc;
std::tm tmp; std::tm tmp;
for (auto& i : cc) { for (auto& i : cc) {
dates[i.date]++; dates[i.date]++;
if (i.type != "Moving" && i.type != "Own") {
tmp = i.date_tm; tmp = i.date_tm;
sorted_caches.insert({ std::mktime(&tmp), &i }); sorted_caches.insert({ std::mktime(&tmp), &i });
if (i.type != "Moving" && i.type != "Own") {
sorted_fcaches.insert({ std::mktime(&tmp), &i });
fcc.insert(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"; 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"; 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; 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>"; //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); 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 << "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"; 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; }); 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 << "<h2>Geographically extreme caches</h2>\n";
std::cout << "<table class=\"minmax\">\n"; std::cout << "<table class=\"list\">\n";
std::cout << "<tr>\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 << "</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 << "</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 << "</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 << "</tr>\n";
std::cout << "</table>\n"; std::cout << "</table>\n";
@ -382,6 +387,49 @@ int main(int argc, char** argv) {
std::cout << "<div class=\"basic_stats\">\n"; 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 << "Total <span class=\"value\">" << n << "</span> days out of 366 (" << std::setprecision(3) << n / 3.66 << "%).\n";
std::cout << "</div>\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"; 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 Okapi::get_caches_json(std::string codes) {
std::string service = url + OKAPI_caches; 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); 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.owner_uuid = el.value()["owner"]["uuid"];
c.pos = get_lat_lon(el.value()["location"]); c.pos = get_lat_lon(el.value()["location"]);
c.origin = "OC.pl"; 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... //ugly way to handle date...
for (auto& el2 : codes) { for (auto& el2 : codes) {
if (el2.first == c.code) { if (el2.first == c.code) {
c.set_date(&el2.second); c.set_date(el2.second);
break; break;
} }
} }