{
"type": "entry",
"published": "2018-10-02T16:27:40-04:00",
"rsvp": "yes",
"url": "https://martymcgui.re/2018/10/02/162740/",
"syndication": [
"https://twitter.com/schmarty/status/1047222938947260416",
"https://www.facebook.com/marty.mcguire.54/posts/10212976492508999"
],
"in-reply-to": [
"https://martymcgui.re/2018/09/20/124541/"
],
"content": {
"text": "I'm going!Looking forward to another Homebrew Website Club Baltimore, tomorrow!\nIt\u2019s an IndieWeb! Come learn some ways to free your content and your social sharing from the social networking silos!",
"html": "I'm going!<p>Looking forward to another Homebrew Website Club Baltimore, tomorrow!</p>\n<p>It\u2019s an <a href=\"https://indieweb.org/\">IndieWeb</a>! Come learn some ways to free your content and your social sharing from the social networking silos!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "rsvp",
"refs": {
"https://martymcgui.re/2018/09/20/124541/": {
"type": "entry",
"published": "2018-09-20T12:45:41-04:00",
"summary": "Please note: We are meeting on Wednesday this week at 7:30pm. Be sure to double-check your calendars! Join us for an evening of quiet writing, IndieWeb demos, and discussions! Create or update your personal web site! Finish that blog post you\u2019ve been writing, edit the wiki! Demos of recent IndieWeb breakthroughs, share what you\u2019ve gotten working! Join a community with...",
"url": "https://martymcgui.re/2018/09/20/124541/",
"name": "Homebrew Website Club Baltimore",
"author": {
"type": "card",
"name": "martymcgui.re",
"url": "http://martymcgui.re",
"photo": null
},
"post-type": "article"
}
},
"_id": "1121266",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-10-02T15:51:50-04:00",
"url": "https://martymcgui.re/2018/10/02/155150/",
"category": [
"IndieWeb",
"IWC",
"IWCNYC",
"site-update",
"projects"
],
"syndication": [
"https://twitter.com/schmarty/status/1047214824470528000",
"https://www.facebook.com/marty.mcguire.54/posts/10212976373146015"
],
"name": "Quick thoughts on project ideas from IndieWebCamp NYC 2018",
"content": {
"text": "I attended IndieWebCamp NYC 2018 and it was a blast! Check the schedule for links to notes and videos from the awesome keynotes, discussion sessions, and build-day demos. I am so grateful to all the other organizers, to all the new and familiar faces that came out, to those that joined us remotely, to Pace University's Seidenberg School for hosting us, and of course to the sponsors that made it all possible.\n \n\nI have a lot of thoughts about all the discussions and projects that were talked about, I'm sure. But for now, I'd like to capture some of the TODOs and project ideas that I came away with after the event, and the post-event discussions over food and drink.\n\n A Micropub Media Endpoint built on Neocities for storage and Glitch for handling uploads and metadata. It would allow folks to store 1GB of media files like photos, audio, and video for their websites, for free. It would be usable with all kinds of posting tools, no matter what backend you use for your site.\n (Hilarious?) bonus: that content would be available peer-to-peer over IPFS.\n \n Improve the IndieWeb Web Ring (\ud83d\udd78\ud83d\udc8d.ws) to automatically check whether members' sites link back using Webmention. (I managed to make a small but often-asked-for update to the site during IWC)\n \n Improve how my website handles all these check-in posts which are made when someone else checks me in on Swarm. I would like to show who checked me in, at least, if not some of their photos, or maybe even an embedded version of the post from their site.\n \n\n Keep doing the This Week in the IndieWeb podcast! I had been feeling some burnout about this and falling behind. It was so great to talk with folks who listen to it and rely on it to keep up to date with the goings-on in the community!\n Offer a hand with aaronpk's new social monster catching game, built on IndieWeb building blocks.\n Offer a hand with jgmac1106's idea to issue educational course achievements (badges) via IndieWeb building blocks.\n Work on closing down Camura, a photo-sharing social network I helped build during the awkward age after the first \"camera phones\" and before Facebook introduced \"Mobile Uploads\". It has over 100k photos and 50k comments from around 400 folks. I'd like to let it down gently, make sure people have access to those photos, and maybe even preserve some of the best moments of human connection in a public place.\n\n More generally: I think there's a really cool future where IndieWeb building blocks are available on free services like Glitch and Neocities. New folks should be able to register a domain and plug them together in an afternoon, with no coding, and get a website that supports posting all kinds of content and social interactions. All for the cost of a domain! And all with the ability to download their content and take it with them if these services change or they outgrow them. I already built some of this as a goof. The big challenges are simplifying the UX and documenting all of the steps to show folks what they will get and how to get it.\n \n\nOther fun / ridiculous ideas discussed over the weekend:\n\n Support Facebook-style colored-background posts like aaronpk did at IWC. I love the simplicity of adding an RGB color as a hashtag.\n \n\n \n \"This American Bachelor\" (working title only) - a dating site as a podcast. Each episode (or season??) is an NPR-style deep dive into the life and longings of a single person looking for love. Alternate title: \"Single\". The cocktail-driven discussion that produced this idea was a joy.\n \n\n\n I am sure there are fun ideas that were discussed that I am leaving out. If you can think of any, let me know!",
"html": "<p>\n I attended <a href=\"https://indieweb.org/2018/NYC\">IndieWebCamp NYC 2018</a> and it was a blast! Check the <a href=\"https://indieweb.org/2018/NYC#Schedule\">schedule</a> for links to notes and videos from the awesome keynotes, discussion sessions, and build-day demos. I am so grateful to all the other <a href=\"https://indieweb.org/2018/NYC#Organizers\">organizers</a>, to all the new and familiar faces that came out, to those that joined us remotely, to <a href=\"https://www.pace.edu/seidenberg/\">Pace University's Seidenberg School</a> for hosting us, and of course to the <a href=\"https://indieweb.org/2018/NYC#Sponsors\">sponsors</a> that made it all possible.\n <br /></p>\n<p>I have a lot of thoughts about all the discussions and projects that were talked about, I'm sure. But for now, I'd like to capture some of the TODOs and project ideas that I came away with after the event, and the post-event discussions over food and drink.</p>\n<ul><li>\n A <a href=\"https://indieweb.org/media_endpoint\">Micropub Media Endpoint</a> built on <a href=\"https://neocities.org/\">Neocities</a> for storage and <a href=\"https://glitch.com/\">Glitch</a> for handling uploads and metadata. It would allow folks to store 1GB of media files like photos, audio, and video for their websites, for free. It would be usable with all kinds of <a href=\"https://indieweb.org/Micropub/Clients\">posting tools</a>, no matter what <a href=\"https://indieweb.org/Micropub/Servers\">backend</a> you use for your site.\n <ul><li>(Hilarious?) bonus: that content would be available <a href=\"https://blog.neocities.org/blog/2015/09/08/its-time-for-the-distributed-web.html\">peer-to-peer over IPFS</a>.</li>\n </ul></li>\n <li>Improve the <a href=\"https://indieweb.org/indiewebring\">IndieWeb Web Ring</a> (<a href=\"https://xn--sr8hvo.ws/\">\ud83d\udd78\ud83d\udc8d.ws</a>) to automatically check whether members' sites link back using <a href=\"https://indieweb.org/Webmention\">Webmention</a>. (I managed to make a <a href=\"https://martymcgui.re/2018/09/29/114553/\">small but often-asked-for update</a> to the site during IWC)</li>\n <li>\n Improve how my website handles all <a href=\"https://martymcgui.re/2018/09/29/160439/\">these</a> <a href=\"https://martymcgui.re/2018/09/29/161113/\">check-in</a> <a href=\"https://martymcgui.re/2018/09/29/182249/\">posts</a> which are made when someone else checks me in on <a href=\"https://www.swarmapp.com/\">Swarm</a>. I would like to show who checked me in, at least, if not some of their photos, or maybe even an embedded version of the post from their site.\n <br /></li>\n <li>Keep doing the <a href=\"https://martymcgui.re/podcasts/indieweb/\">This Week in the IndieWeb podcast</a>! I had been feeling some burnout about this and falling behind. It was so great to talk with folks who listen to it and rely on it to keep up to date with the goings-on in the community!</li>\n <li>Offer a hand with <a href=\"https://aaronparecki.com/\">aaronpk's</a> new <a href=\"https://monstr.space/\">social monster catching game</a>, built on IndieWeb building blocks.</li>\n <li>Offer a hand with <a href=\"http://jgregorymcverry.com/\">jgmac1106's</a> <a href=\"http://jgregorymcverry.com/my-goals-for-indiewebcamp-nyc-openbadges-endorsement-at-the-dns-level/\">idea</a> to issue educational course achievements (<a href=\"http://jgregorymcverry.com/webmention-badges-discussion-across-networks-after-indiewebcamp-nyc-session/\">badges</a>) via IndieWeb building blocks.</li>\n <li>Work on closing down <a href=\"https://camura.com/\">Camura</a>, a photo-sharing social network I helped build during the awkward age after the first \"camera phones\" and before Facebook introduced \"Mobile Uploads\". It has over 100k photos and 50k comments from around 400 folks. I'd like to let it down gently, make sure people have access to those photos, and maybe even preserve some of the best moments of human connection in a public place.</li>\n</ul><p>\n More generally: I think there's a <i>really cool</i> future where <a href=\"https://indieweb.org/Category:building-blocks\">IndieWeb building blocks</a> are available on free services like Glitch and Neocities. New folks should be able to register a domain and plug them together in an afternoon, with no coding, and get a website that supports posting all kinds of content and social interactions. All for the cost of a domain! And all with the ability to download their content and take it with them if these services change or they outgrow them. I <a href=\"https://martymcgui.re/2018/03/12/130455/\">already built some of this</a> as a goof. The big challenges are simplifying the UX and documenting all of the steps to show folks what they will get and how to get it.\n <br /></p>\n<p>Other fun / ridiculous ideas discussed over the weekend:</p>\n<ul><li>\n Support Facebook-style colored-background posts <a href=\"https://martymcgui.re/2018/09/30/113226/\">like aaronpk did at IWC</a>. I love the simplicity of adding an RGB color as a hashtag.\n <br /></li>\n <li>\n \"This American Bachelor\" (working title only) - a dating site as a podcast. Each episode (or season??) is an NPR-style deep dive into the life and longings of a single person looking for love. Alternate title: \"Single\". The cocktail-driven discussion that produced this idea was a joy.\n <br /></li>\n</ul><p>\n I am sure there are fun ideas that were discussed that I am leaving out. If you can think of any, let me know!\n <br /></p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "article",
"_id": "1121001",
"_source": "175",
"_is_read": true
}
Definitely! It’s a great idea. In fact, a couple of us in the IndieWeb chat have actually done some brainstorming and two people have worked on some code for that stuff.
{
"type": "entry",
"published": "2018-10-01T22:57:55-04:00",
"summary": "Definitely! It\u2019s a great idea. In fact, a couple of us in the IndieWeb chat have actually done some brainstorming and two people have worked on some code for that stuff.",
"url": "https://eddiehinkle.com/2018/10/01/26/reply/",
"in-reply-to": [
"https://jj.isgeek.net/2018/10/02-123939-am/"
],
"content": {
"text": "Definitely! It\u2019s a great idea. In fact, a couple of us in the IndieWeb chat have actually done some brainstorming and two people have worked on some code for that stuff.",
"html": "<p>Definitely! It\u2019s a great idea. In fact, a couple of us in the IndieWeb chat have actually done some brainstorming and two people have worked on some code for that stuff.</p>"
},
"author": {
"type": "card",
"name": "Eddie Hinkle",
"url": "https://eddiehinkle.com/",
"photo": "https://aperture-proxy.p3k.io/cc9591b69c2c835fa2c6e23745b224db4b4b431f/68747470733a2f2f656464696568696e6b6c652e636f6d2f696d616765732f70726f66696c652e6a7067"
},
"post-type": "reply",
"refs": {
"https://jj.isgeek.net/2018/10/02-123939-am/": {
"type": "entry",
"url": "https://jj.isgeek.net/2018/10/02-123939-am/",
"name": "https://jj.isgeek.net/2018/10/02-123939-am/",
"post-type": "article"
}
},
"_id": "1118300",
"_source": "226",
"_is_read": true
}
Sketches and more to follow. Open sourcing my undo design work because I want to help enable it everywhere. I have a theory that "Undo" in posting UIs may help improve online conversation dynamics.
{
"type": "entry",
"published": "2018-10-01 18:12-0700",
"url": "http://tantek.com/2018/274/t3/undo-indiewebcamp-open-design",
"category": [
"Undo"
],
"content": {
"text": "This past Friday I led a session on #Undo @IndieWebCamp NYC.\n\nI\u2019ve wanted Undo in my posting UI (like Gmail undo send) since I started @Falcon in 2009. Decided it\u2019s time to open up all my design thinking.\nSession: https://indieweb.org/2018/NYC/undo\nDesign: https://indieweb.org/undo\n\nSketches and more to follow. Open sourcing my undo design work because I want to help enable it everywhere. I have a theory that \"Undo\" in posting UIs may help improve online conversation dynamics.",
"html": "This past Friday I led a session on #<span class=\"p-category\">Undo</span> <a class=\"h-cassis-username\" href=\"https://twitter.com/IndieWebCamp\">@IndieWebCamp</a> NYC.<br /><br />I\u2019ve wanted Undo in my posting UI (like Gmail undo send) since I started <a class=\"h-cassis-username\" href=\"https://twitter.com/Falcon\">@Falcon</a> in 2009. Decided it\u2019s time to open up all my design thinking.<br />Session: <a href=\"https://indieweb.org/2018/NYC/undo\">https://indieweb.org/2018/NYC/undo</a><br />Design: <a href=\"https://indieweb.org/undo\">https://indieweb.org/undo</a><br /><br />Sketches and more to follow. Open sourcing my undo design work because I want to help enable it everywhere. I have a theory that \"Undo\" in posting UIs may help improve online conversation dynamics."
},
"author": {
"type": "card",
"name": "Tantek \u00c7elik",
"url": "http://tantek.com/",
"photo": "https://aperture-media.p3k.io/tantek.com/acfddd7d8b2c8cf8aa163651432cc1ec7eb8ec2f881942dca963d305eeaaa6b8.jpg"
},
"post-type": "note",
"_id": "1116282",
"_source": "1",
"_is_read": true
}
Homebrew Website Club is this Wednesday, 6:30pm at Mozart’s Coffee. If the weather’s nice we’ll meet outside. I’m catching up on videos from IndieWebCamp NYC so I can summarize that event for the Austin group.
{
"type": "entry",
"author": {
"name": null,
"url": "https://www.manton.org/",
"photo": null
},
"url": "https://www.manton.org/2018/10/01/185056.html",
"content": {
"html": "<p>Homebrew Website Club is this Wednesday, 6:30pm at Mozart\u2019s Coffee. If the weather\u2019s nice we\u2019ll meet outside. I\u2019m catching up on videos from IndieWebCamp NYC so I can summarize that event for the Austin group.</p>",
"text": "Homebrew Website Club is this Wednesday, 6:30pm at Mozart\u2019s Coffee. If the weather\u2019s nice we\u2019ll meet outside. I\u2019m catching up on videos from IndieWebCamp NYC so I can summarize that event for the Austin group."
},
"published": "2018-10-01T13:50:56-05:00",
"post-type": "note",
"_id": "1115796",
"_source": "12",
"_is_read": true
}
{
"type": "entry",
"published": "2018-10-01T19:44:52-04:00",
"url": "https://martymcgui.re/2018/10/01/194452/",
"category": [
"podcast",
"IndieWeb"
],
"audio": [
"https://aperture-proxy.p3k.io/0bf739ddb7a5eb104a3facffd82adac0a1b9ce5c/68747470733a2f2f6d656469612e6d617274796d636775692e72652f66342f61362f66332f36352f38383637653637386537313566343736306433323734323239303336303630393333373664636533303461333963303834633730363664612e6d7033"
],
"syndication": [
"https://huffduffer.com/schmarty/504740",
"https://twitter.com/schmarty/status/1046909525926842368",
"https://www.facebook.com/marty.mcguire.54/posts/10212971376261096"
],
"name": "This Week in the IndieWeb Audio Edition \u2022 September 15th - 21st, 2018",
"content": {
"text": "Show/Hide Transcript \n \n Another late one but a great one. Mastodon adds rel-me, geocaching with WordPress, and Path ends their incredible journey. It\u2019s the audio edition for This Week in the IndieWeb for September 15th - 21st, 2018.\n\nYou can find all of my audio editions and subscribe with your favorite podcast app here: martymcgui.re/podcasts/indieweb/.\n\nMusic from Aaron Parecki\u2019s 100DaysOfMusic project: Day 85 - Suit, Day 48 - Glitch, Day 49 - Floating, Day 9, and Day 11\n\nThanks to everyone in the IndieWeb chat for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!",
"html": "Show/Hide Transcript \n \n <p>Another late one but a great one. Mastodon adds rel-me, geocaching with WordPress, and Path ends their incredible journey. It\u2019s the audio edition for <a href=\"https://indieweb.org/this-week/2018-09-21.html\">This Week in the IndieWeb for September 15th - 21st, 2018</a>.</p>\n\n<p>You can find all of my audio editions and subscribe with your favorite podcast app here: <a href=\"https://martymcgui.re/podcasts/indieweb/\">martymcgui.re/podcasts/indieweb/</a>.</p>\n\n<p>Music from <a href=\"https://aaronparecki.com/\">Aaron Parecki</a>\u2019s <a href=\"https://100.aaronparecki.com/\">100DaysOfMusic project</a>: <a href=\"https://aaronparecki.com/2017/03/15/14/day85\">Day 85 - Suit</a>, <a href=\"https://aaronparecki.com/2017/02/06/7/day48\">Day 48 - Glitch</a>, <a href=\"https://aaronparecki.com/2017/02/07/4/day49\">Day 49 - Floating</a>, <a href=\"https://aaronparecki.com/2016/12/29/21/day-9\">Day 9</a>, and <a href=\"https://aaronparecki.com/2016/12/31/15/\">Day 11</a></p>\n\n<p>Thanks to everyone in the <a href=\"https://chat.indieweb.org/\">IndieWeb chat</a> for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "audio",
"_id": "1115634",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-10-01T17:28:24-04:00",
"url": "https://martymcgui.re/2018/10/01/172824/",
"category": [
"podcast",
"IndieWeb",
"this-week-indieweb-podcast"
],
"audio": [
"https://aperture-proxy.p3k.io/ce01ca4ce7c36e202a19e36cb6198df661841769/68747470733a2f2f6d656469612e6d617274796d636775692e72652f39642f33362f33622f36382f65393332356361623430383137333737663438663163353932393733353565636435643732616661613133393431333038393233386166342e6d7033"
],
"syndication": [
"https://huffduffer.com/schmarty/504728",
"https://twitter.com/schmarty/status/1046875366869147648",
"https://www.facebook.com/marty.mcguire.54/posts/10212970840327698"
],
"name": "This Week in the IndieWeb Audio Edition \u2022 September 8th - 14th, 2018",
"content": {
"text": "Show/Hide Transcript \n \n Two weeks late but better than never! Pronoun buttons, a class on IndieWeb, and a Google takeover of the web. It\u2019s the audio edition for This Week in the IndieWeb for September 8th - 14th, 2018.\n\nYou can find all of my audio editions and subscribe with your favorite podcast app here: martymcgui.re/podcasts/indieweb/.\n\nMusic from Aaron Parecki\u2019s 100DaysOfMusic project: Day 85 - Suit, Day 48 - Glitch, Day 49 - Floating, Day 9, and Day 11\n\nThanks to everyone in the IndieWeb chat for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!",
"html": "Show/Hide Transcript \n \n <p>Two weeks late but better than never! Pronoun buttons, a class on IndieWeb, and a Google takeover of the web. It\u2019s the audio edition for <a href=\"https://indieweb.org/this-week/2018-09-14.html\">This Week in the IndieWeb for September 8th - 14th, 2018</a>.</p>\n\n<p>You can find all of my audio editions and subscribe with your favorite podcast app here: <a href=\"https://martymcgui.re/podcasts/indieweb/\">martymcgui.re/podcasts/indieweb/</a>.</p>\n\n<p>Music from <a href=\"https://aaronparecki.com/\">Aaron Parecki</a>\u2019s <a href=\"https://100.aaronparecki.com/\">100DaysOfMusic project</a>: <a href=\"https://aaronparecki.com/2017/03/15/14/day85\">Day 85 - Suit</a>, <a href=\"https://aaronparecki.com/2017/02/06/7/day48\">Day 48 - Glitch</a>, <a href=\"https://aaronparecki.com/2017/02/07/4/day49\">Day 49 - Floating</a>, <a href=\"https://aaronparecki.com/2016/12/29/21/day-9\">Day 9</a>, and <a href=\"https://aaronparecki.com/2016/12/31/15/\">Day 11</a></p>\n\n<p>Thanks to everyone in the <a href=\"https://chat.indieweb.org/\">IndieWeb chat</a> for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "audio",
"_id": "1114950",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-30T17:15:24-04:00",
"rsvp": "yes",
"url": "https://martymcgui.re/2018/09/30/171524/",
"category": [
"IndieWeb",
"IWC",
"Berlin",
"IWCBerlin"
],
"in-reply-to": [
"https://indieweb.org/2018/Berlin"
],
"content": {
"text": "I'm going!My first IndieWebCamp outside the U.S.! Very excited to meet some new faces.\n\u2026 and to be making my first trip to Germany!",
"html": "I'm going!<p>My first IndieWebCamp outside the U.S.! Very excited to meet some new faces.</p>\n<p>\u2026 and to be making my first trip to Germany!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "rsvp",
"refs": {
"https://indieweb.org/2018/Berlin": {
"type": "entry",
"summary": "",
"url": "https://indieweb.org/2018/Berlin",
"name": "IndieWebCamp Berlin 2018",
"author": {
"type": "card",
"name": "indieweb.org",
"url": "http://indieweb.org",
"photo": null
},
"post-type": "article"
}
},
"_id": "1108626",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-30T15:46:56+10:00",
"url": "https://unicyclic.com/mal/2018-09-30-A_Programmable_IndieWeb",
"category": [
"IndieWeb"
],
"name": "A Programmable IndieWeb",
"content": {
"text": "It's been a long time since we've had any new writing from Aaron Swartz, but a draft of a book has been released that he had worked on, called A Programmable Web.\n\n\nThere's a fair bit of sadness and nostalgia in reading this work, as Aaron had a characteristic writing style that many of us still miss. However it's also a fascinating read, as he introduces concepts of working with the web, building one idea on top of the next.\n\n\nIt also feels a bit like a snapshot of the time when he was writing. I wonder if he would still favor the particular technologies and development styles he writes about? Regardless of his personal development choices, I still think he would have seen the IndieWeb as having the hacker spirit he identified with. In fact, I think this book paints an alternate vision for what we would like to see the IndieWeb achieve.\n\n\nThe final page of the draft reads, \"the Semantic Web is based on a bet, a bet that giving the world tools to easily collaborate and communicate will lead to possibilities so wonderful we can scarcely even imagine them right now. Sure, it sounds a little bit crazy. But it paid off the last time they made that gamble: we ended up with a little thing called the World Wide Web. Let's see if they can do that again.\"\n\n\nIt's a beautiful picture, but I wish Aaron had written we, instead of they, here. He wasn't the sort of guy who waited for others to get things done when it was within his own abilities. The Programmable Web will be built, and the tools for collaboration are being built using the process of collaboration itself.",
"html": "It's been a long time since we've had any new writing from <a href=\"http://www.aaronsw.com/\">Aaron Swartz</a>, but a draft of a book has been released that he had worked on, called <a href=\"https://archive.org/details/AaronSwartzAProgrammableWeb/page/n0\">A Programmable Web</a>.<br /><br />\nThere's a fair bit of sadness and nostalgia in reading this work, as Aaron had a characteristic writing style that many of us still miss. However it's also a fascinating read, as he introduces concepts of working with the web, building one idea on top of the next.<br /><br />\nIt also feels a bit like a snapshot of the time when he was writing. I wonder if he would still favor the particular technologies and development styles he writes about? Regardless of his personal development choices, I still think he would have seen the <a href=\"https://indieweb.org/\">IndieWeb</a> as having the hacker spirit he identified with. In fact, I think this book paints an alternate vision for what we would like to see the IndieWeb achieve.<br /><br />\nThe final page of the draft reads, <em>\"the Semantic Web is based on a bet, a bet that giving the world tools to easily collaborate and communicate will lead to possibilities so wonderful we can scarcely even imagine them right now. Sure, it sounds a little bit crazy. But it paid off the last time they made that gamble: we ended up with a little thing called the World Wide Web. Let's see if they can do that again.\"</em><br /><br />\nIt's a beautiful picture, but I wish Aaron had written <strong>we</strong>, instead of <strong>they</strong>, here. He wasn't the sort of guy who waited for others to get things done when it was within his own abilities. The Programmable Web will be built, and the tools for collaboration are being built using the process of collaboration itself."
},
"author": {
"type": "card",
"name": "Malcolm Blaney",
"url": "https://unicyclic.com/mal",
"photo": "https://aperture-proxy.p3k.io/4f46272c0027449ced0d7cf8de31ea1bec37210e/68747470733a2f2f756e696379636c69632e636f6d2f6d616c2f7075626c69632f70726f66696c655f736d616c6c5f7468756d622e706e67"
},
"post-type": "article",
"_id": "1106025",
"_source": "243",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-29T15:01:40-04:00",
"url": "https://aaronparecki.com/2018/09/29/13/",
"category": [
"ff4411"
],
"content": {
"text": "This is a demo for IndieWebCamp NYC! If you look at this post on my website, it will have a colored background!"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/2b8e1668dcd9cfa6a170b3724df740695f73a15c2a825962fd0a0967ec11ecdc.jpg"
},
"post-type": "note",
"_id": "1103099",
"_source": "16",
"_is_read": true
}
Marty McGuire
Are you a member of the 🕸💍 IndieWeb Webring? Today I made an update!
All members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!
From now on, new emoji IDs will not include country flags.
If you’re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the #indieweb chat (I’m schmarty there). I’ll reset your account and you’ll get a new emoji ID. You’ll also have to update the webring links code on your page to make sure they point to your new ID!
{
"type": "entry",
"published": "2018-09-29T11:45:53-04:00",
"url": "https://martymcgui.re/2018/09/29/114553/",
"category": [
"\ud83d\udd78\ud83d\udc8d",
"webring",
"indieweb",
"update"
],
"content": {
"text": "Are you a member of the \ud83d\udd78\ud83d\udc8d IndieWeb Webring? Today I made an update!\nAll members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!\nFrom now on, new emoji IDs will not include country flags.\nIf you\u2019re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the #indieweb chat (I\u2019m schmarty there). I\u2019ll reset your account and you\u2019ll get a new emoji ID. You\u2019ll also have to update the webring links code on your page to make sure they point to your new ID!",
"html": "<p>Are you a member of the <a href=\"https://xn--sr8hvo.ws\">\ud83d\udd78\ud83d\udc8d</a> IndieWeb Webring? Today I made an update!</p>\n<p>All members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!</p>\n<p>From now on, new emoji IDs will not include country flags.</p>\n<p>If you\u2019re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the <a href=\"https://chat.indieweb.org/\">#indieweb chat</a> (I\u2019m <code>schmarty</code> there). I\u2019ll reset your account and you\u2019ll get a new emoji ID. You\u2019ll also have to update the webring links code on your page to make sure they point to your new ID!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "note",
"_id": "1102129",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-28T14:53:52-04:00",
"url": "https://david.shanske.com/2018/09/28/thoughts-about-assertion-workflows/",
"name": "Thoughts About Assertion Workflows",
"content": {
"text": "This is a preliminary technical workflow proposal for assertions, which would be needed for badges, endorsements, and other ideas. It is based on thoughts that I had listening to the badges session at Indiewebcamp NYC 2018.\nScenario 1: Individual creates criteria and wants to assert that other individual has achieved said criteria. Example: Professor wants to certify students completed coursework.\nProfessor Posts Criteria for Each Achievement as a unique page (A).\nStudent completes assignment as a post (B).\nProfessor Posts Badge/Assertion/Endorsement post on their website as an h-review, with a p-item property to student\u2019s URL (B). Would need a new or existing property to represent the relationship to the original assertion (A). Suggest u-assert and u-assert-of?\nScenario 2: Individual creates assertion post and solicits others to endorse that statement as factual.\nIndividual makes a post to their site(h-resume for references on a resume, not sure what to request endorsement of a statement? p-assert with a nested h-item?) and invites other individuals(using existing invitee property used for RSVPs?) to endorse or assert it. Criteria might be included for achievement.\nOthers create \u2018assertion\u2019 posts on their site(assert-of) and send webmentions, which would cause the post to be updated to note that it had been achieved.\nExisting microformats for h-resume and h-review seem to allow additional context.\nEducation\nExperience\nSkill\nRating\nBest\nWorst\n\u00a0",
"html": "This is a preliminary technical workflow proposal for assertions, which would be needed for badges, endorsements, and other ideas. It is based on thoughts that I had listening to the badges session at Indiewebcamp NYC 2018.\n<p>Scenario 1: Individual creates criteria and wants to assert that other individual has achieved said criteria. Example: Professor wants to certify students completed coursework.</p>\n<ul><li>Professor Posts Criteria for Each Achievement as a unique page (A).</li>\n<li>Student completes assignment as a post (B).</li>\n<li>Professor Posts Badge/Assertion/Endorsement post on their website as an h-review, with a p-item property to student\u2019s URL (B). Would need a new or existing property to represent the relationship to the original assertion (A). Suggest u-assert and u-assert-of?</li>\n</ul><p>Scenario 2: Individual creates assertion post and solicits others to endorse that statement as factual.</p>\n<ul><li>Individual makes a post to their site(h-resume for references on a resume, not sure what to request endorsement of a statement? p-assert with a nested h-item?) and invites other individuals(using existing invitee property used for RSVPs?) to endorse or assert it. Criteria might be included for achievement.</li>\n<li>Others create \u2018assertion\u2019 posts on their site(assert-of) and send webmentions, which would cause the post to be updated to note that it had been achieved.</li>\n</ul><p>Existing microformats for h-resume and h-review seem to allow additional context.</p>\n<ul><li>Education</li>\n<li>Experience</li>\n<li>Skill</li>\n<li>Rating</li>\n<li>Best</li>\n<li>Worst</li>\n</ul><p>\u00a0</p>"
},
"author": {
"type": "card",
"name": "David Shanske",
"url": "https://david.shanske.com/",
"photo": "https://david.shanske.com/wp-content/uploads/avatar-privacy/cache/gravatar/2/c/2cb1f8afd9c8d3b646b4071c5ed887c970d81d625eeed87e447706940e2c403d-125.png"
},
"post-type": "article",
"_id": "1097936",
"_source": "5",
"_is_read": true
}
{
"type": "entry",
"author": {
"name": "Peter Molnar",
"url": "https://petermolnar.net",
"photo": null
},
"url": "https://petermolnar.net/location-tracking-without-server/",
"published": "2018-09-27T11:05:00+01:00",
"content": {
"html": "<p>Nearly all self-hosted location tracking Android applications are based on server-client architecture: the one on the phone collects only a small points, if not only one, and sends it to a configured server. Traccar<a href=\"https://petermolnar.net/#fn1\">1</a>, Owntracks<a href=\"https://petermolnar.net/#fn2\">2</a>, etc.</p>\n<p>While this setup is useful, it doesn\u2019t fit in my static, unless it hurts<a href=\"https://petermolnar.net/#fn3\">3</a> approach, and it needs data connectivity, which can be tricky during abroad trips. The rare occasions in rural Scotland and Wales tought me data connectivity is not omnipresent at all.</p>\n<p>There used to be a magnificent little location tracker, which, besides the server-client approach, could store the location data in CSV and KML files locally: Backitude<a href=\"https://petermolnar.net/#fn4\">4</a>. The program is gone from Play store, I have no idea, why, but I have a copy of the last APK of it<a href=\"https://petermolnar.net/#fn5\">5</a>.</p>\n<p>My flow is the following:</p>\n<ul><li>Backitude saves the CSV files</li>\n<li>Syncthing<a href=\"https://petermolnar.net/#fn6\">6</a> syncs the phone and the laptop</li>\n<li>the laptop has a Python script that imports the CSV into SQLite to eliminate duplicates</li>\n<li>the same script queries against Bing to get altitude information for missing altitudes</li>\n<li>as a final step, the script exports daily GPX files</li>\n<li>on the laptop, GpsPrune helps me visualize and measure trips</li>\n</ul><h2>Backitude configuration</h2>\n<p>These are the modified setting properties:</p>\n<ul><li>Enable backitude: yes</li>\n<li>Settings\n<ul><li>Standard Mode Settings\n<ul><li>Time Interval Selection: 1 minute</li>\n<li>Location Polling Timeout: 5 minutes</li>\n<li>Display update message: no</li>\n</ul></li>\n<li>Wifi Mode Settings\n<ul><li>Wi-Fi Mode Enabled: yes</li>\n<li>Time Interval Options: 1 hour</li>\n<li>Location Polling Timeout: 5 minutes</li>\n</ul></li>\n<li>Update Settings\n<ul><li>Minimum Change in Distance: 10 meters</li>\n</ul></li>\n<li>Accuracy Settings\n<ul><li>Minimum GPS accuracy: 12 meters</li>\n<li>Minimum Wi-Fi accuracy: 20 meters</li>\n</ul></li>\n<li>Internal Memory Storage Options\n<ul><li>KML and CSV</li>\n</ul></li>\n<li>Display Failure Notifications: no</li>\n</ul></li>\n</ul><p>I have an exported preferences file available<a href=\"https://petermolnar.net/#fn7\">7</a>.</p>\n<h2>Syncthing</h2>\n<p>The syncthing configuration is optional; it could be simple done by manual transfers from the phone. It\u2019s also not the most simple thing to do, so I\u2019ll let the Syncting Documentation<a href=\"https://petermolnar.net/#fn8\">8</a> take care of describing the how-tos.</p>\n<h2>Python script</h2>\n<p>Before jumping to the script, there are 3 Python modules it needs:</p>\n<pre><code>pip3 install --user arrow gpxpy requests</code></pre>\n<p>And the script itself - please replace the <code>INBASE</code>, <code>OUTBASE</code>, and <code>BINGKEY</code> properties. To get a Bing key, visit Bing<a href=\"https://petermolnar.net/#fn9\">9</a>.</p>\n<pre><code>import os\nimport sqlite3\nimport csv\nimport glob\nimport arrow\nimport re\nimport gpxpy.gpx\nimport requests\n\nINBASE=\"/path/to/your/syncthing/gps/files\"\nOUTBASE=\"/path/for/sqlite/and/gpx/output\"\nBINGKEY=\"get a bing maps key and insert it here\"\n\ndef parse(row):\n DATE = re.compile(\n r'^(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T'\n r'(?P<time>[0-9]{2}:[0-9]{2}:[0-9]{2})\\.(?P<subsec>[0-9]{3})Z$'\n )\n\n lat = row[0]\n lon = row[1]\n acc = row[2]\n alt = row[3]\n match = DATE.match(row[4])\n # in theory, arrow should have been able to parse the date, but I couldn't get\n # it working\n epoch = arrow.get(\"%s-%s-%s %s %s\" % (\n match.group('year'),\n match.group('month'),\n match.group('day'),\n match.group('time'),\n match.group('subsec')\n ), 'YYYY-MM-DD hh:mm:ss SSS').timestamp\n return(epoch,lat,lon,alt,acc)\n\ndef exists(db, epoch, lat, lon):\n return db.execute('''\n SELECT\n *\n FROM\n data\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n ''', (epoch, lat, lon)).fetchone()\n\ndef ins(db, epoch,lat,lon,alt,acc):\n if exists(db, epoch, lat, lon):\n return\n print('inserting data point with epoch %d' % (epoch))\n db.execute('''INSERT INTO data (epoch, latitude, longitude, altitude, accuracy) VALUES (?,?,?,?,?);''', (\n epoch,\n lat,\n lon,\n alt,\n acc\n ))\n\n\nif __name__ == '__main__':\n db = sqlite3.connect(os.path.join(OUTBASE, 'location-log.sqlite'))\n db.execute('PRAGMA auto_vacuum = INCREMENTAL;')\n db.execute('PRAGMA journal_mode = MEMORY;')\n db.execute('PRAGMA temp_store = MEMORY;')\n db.execute('PRAGMA locking_mode = NORMAL;')\n db.execute('PRAGMA synchronous = FULL;')\n db.execute('PRAGMA encoding = \"UTF-8\";')\n\n files = glob.glob(os.path.join(INBASE, '*.csv'))\n for logfile in files:\n with open(logfile) as csvfile:\n try:\n reader = csv.reader(csvfile)\n except Exception as e:\n print('failed to open CSV reader for file: %s; %s' % (logfile, e))\n continue\n # skip the first row, that's headers\n headers = next(reader, None)\n for row in reader:\n epoch,lat,lon,alt,acc = parse(row)\n ins(db,epoch,lat,lon,alt,acc)\n # there's no need to commit per line, per file should be safe enough\n db.commit()\n\n db.execute('PRAGMA auto_vacuum;')\n\n results = db.execute('''\n SELECT\n *\n FROM\n data\n ORDER BY epoch ASC''').fetchall()\n prevdate = None\n gpx = gpxpy.gpx.GPX()\n\n for epoch, lat, lon, alt, acc in results:\n # in case you know your altitude might actually be valid with negative\n # values you may want to remove the -10\n if alt == 'NULL' or alt < -10:\n url = \"http://dev.virtualearth.net/REST/v1/Elevation/List?points=%s,%s&key=%s\" % (\n lat,\n lon,\n BINGKEY\n )\n bing = requests.get(url).json()\n # gotta love enterprise API endpoints\n if not bing or \\\n 'resourceSets' not in bing or \\\n not len(bing['resourceSets']) or \\\n 'resources' not in bing['resourceSets'][0] or \\\n not len(bing['resourceSets'][0]) or \\\n 'elevations' not in bing['resourceSets'][0]['resources'][0] or \\\n not bing['resourceSets'][0]['resources'][0]['elevations']:\n alt = 0\n else:\n alt = float(bing['resourceSets'][0]['resources'][0]['elevations'][0])\n print('got altitude from bing: %s for %s,%s' % (alt,lat,lon))\n db.execute('''\n UPDATE\n data\n SET\n altitude = ?\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n LIMIT 1\n ''',(alt, epoch, lat, lon))\n db.commit()\n del(bing)\n del(url)\n date = arrow.get(epoch).format('YYYY-MM-DD')\n if not prevdate or prevdate != date:\n # write previous out\n gpxfile = os.path.join(OUTBASE, \"%s.gpx\" % (date))\n with open(gpxfile, 'wt') as f:\n f.write(gpx.to_xml())\n print('created file: %s' % gpxfile)\n\n # create new\n gpx = gpxpy.gpx.GPX()\n prevdate = date\n\n # Create first track in our GPX:\n gpx_track = gpxpy.gpx.GPXTrack()\n gpx.tracks.append(gpx_track)\n\n # Create first segment in our GPX track:\n gpx_segment = gpxpy.gpx.GPXTrackSegment()\n gpx_track.segments.append(gpx_segment)\n\n # Create points:\n gpx_segment.points.append(\n gpxpy.gpx.GPXTrackPoint(\n lat,\n lon,\n elevation=alt,\n time=arrow.get(epoch).datetime\n )\n )\n\n db.close()\n</code></pre>\n<p>Once this is done, the <code>OUTBASE</code> directory will be populated by <code>.gpx</code> files, one per day.</p>\n<h2>GpsPrune</h2>\n<p>GpsPrune is a desktop, QT based GPX track visualizer. It needs data connectivity to have nice maps in the background, but it can do a lot of funky things, including editing GPX tracks.</p>\n<pre><code>sudo apt install gpsprune</code></pre>\n<p><strong>Keep it in mind that the export script overwrites the GPX files, so the data needs to be fixed in the SQLite database.</strong></p>\n<p>This is an example screenshot of GpsPrune, about our 2 day walk down from Mount Emei and it\u2019s endless stairs:</p>\n<a href=\"https://petermolnar.net/location-tracking-without-server/emei_b.png\"> <img src=\"https://aperture-proxy.p3k.io/e4a0b1456e343382f106c8f4e35f5895c110957e/68747470733a2f2f70657465726d6f6c6e61722e6e65742f6c6f636174696f6e2d747261636b696e672d776974686f75742d7365727665722f656d65692e706e67\" title=\"emei\" alt=\"\" /></a>\n\nemei\n<p>Happy tracking!</p>\n\n\n<ol><li><p><a href=\"https://www.traccar.org/\">https://www.traccar.org/</a><a href=\"https://petermolnar.net/#fnref1\">\u21a9</a></p></li>\n<li><p><a href=\"https://owntracks.org/\">https://owntracks.org/</a><a href=\"https://petermolnar.net/#fnref2\">\u21a9</a></p></li>\n<li><p><a href=\"https://indieweb.org/manual_until_it_hurts\">https://indieweb.org/manual_until_it_hurts</a><a href=\"https://petermolnar.net/#fnref3\">\u21a9</a></p></li>\n<li><p><a href=\"http://www.gpsies.com/backitude.do\">http://www.gpsies.com/backitude.do</a><a href=\"https://petermolnar.net/#fnref4\">\u21a9</a></p></li>\n<li><p><a href=\"https://petermolnar.net/gaugler.backitude.apk\">gaugler.backitude.apk</a><a href=\"https://petermolnar.net/#fnref5\">\u21a9</a></p></li>\n<li><p><a href=\"https://syncthing.net/\">https://syncthing.net/</a><a href=\"https://petermolnar.net/#fnref6\">\u21a9</a></p></li>\n<li><p><a href=\"https://petermolnar.net/backitude.prefs\">backitude.prefs</a><a href=\"https://petermolnar.net/#fnref7\">\u21a9</a></p></li>\n<li><p><a href=\"https://docs.syncthing.net/intro/getting-started.html\">https://docs.syncthing.net/intro/getting-started.html</a><a href=\"https://petermolnar.net/#fnref8\">\u21a9</a></p></li>\n<li><p><a href=\"https://msdn.microsoft.com/en-us/library/ff428642\">https://msdn.microsoft.com/en-us/library/ff428642</a><a href=\"https://petermolnar.net/#fnref9\">\u21a9</a></p></li>\n</ol>",
"text": "Nearly all self-hosted location tracking Android applications are based on server-client architecture: the one on the phone collects only a small points, if not only one, and sends it to a configured server. Traccar1, Owntracks2, etc.\nWhile this setup is useful, it doesn\u2019t fit in my static, unless it hurts3 approach, and it needs data connectivity, which can be tricky during abroad trips. The rare occasions in rural Scotland and Wales tought me data connectivity is not omnipresent at all.\nThere used to be a magnificent little location tracker, which, besides the server-client approach, could store the location data in CSV and KML files locally: Backitude4. The program is gone from Play store, I have no idea, why, but I have a copy of the last APK of it5.\nMy flow is the following:\nBackitude saves the CSV files\nSyncthing6 syncs the phone and the laptop\nthe laptop has a Python script that imports the CSV into SQLite to eliminate duplicates\nthe same script queries against Bing to get altitude information for missing altitudes\nas a final step, the script exports daily GPX files\non the laptop, GpsPrune helps me visualize and measure trips\nBackitude configuration\nThese are the modified setting properties:\nEnable backitude: yes\nSettings\nStandard Mode Settings\nTime Interval Selection: 1 minute\nLocation Polling Timeout: 5 minutes\nDisplay update message: no\n\nWifi Mode Settings\nWi-Fi Mode Enabled: yes\nTime Interval Options: 1 hour\nLocation Polling Timeout: 5 minutes\n\nUpdate Settings\nMinimum Change in Distance: 10 meters\n\nAccuracy Settings\nMinimum GPS accuracy: 12 meters\nMinimum Wi-Fi accuracy: 20 meters\n\nInternal Memory Storage Options\nKML and CSV\n\nDisplay Failure Notifications: no\n\nI have an exported preferences file available7.\nSyncthing\nThe syncthing configuration is optional; it could be simple done by manual transfers from the phone. It\u2019s also not the most simple thing to do, so I\u2019ll let the Syncting Documentation8 take care of describing the how-tos.\nPython script\nBefore jumping to the script, there are 3 Python modules it needs:\npip3 install --user arrow gpxpy requests\nAnd the script itself - please replace the INBASE, OUTBASE, and BINGKEY properties. To get a Bing key, visit Bing9.\nimport os\nimport sqlite3\nimport csv\nimport glob\nimport arrow\nimport re\nimport gpxpy.gpx\nimport requests\n\nINBASE=\"/path/to/your/syncthing/gps/files\"\nOUTBASE=\"/path/for/sqlite/and/gpx/output\"\nBINGKEY=\"get a bing maps key and insert it here\"\n\ndef parse(row):\n DATE = re.compile(\n r'^(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T'\n r'(?P<time>[0-9]{2}:[0-9]{2}:[0-9]{2})\\.(?P<subsec>[0-9]{3})Z$'\n )\n\n lat = row[0]\n lon = row[1]\n acc = row[2]\n alt = row[3]\n match = DATE.match(row[4])\n # in theory, arrow should have been able to parse the date, but I couldn't get\n # it working\n epoch = arrow.get(\"%s-%s-%s %s %s\" % (\n match.group('year'),\n match.group('month'),\n match.group('day'),\n match.group('time'),\n match.group('subsec')\n ), 'YYYY-MM-DD hh:mm:ss SSS').timestamp\n return(epoch,lat,lon,alt,acc)\n\ndef exists(db, epoch, lat, lon):\n return db.execute('''\n SELECT\n *\n FROM\n data\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n ''', (epoch, lat, lon)).fetchone()\n\ndef ins(db, epoch,lat,lon,alt,acc):\n if exists(db, epoch, lat, lon):\n return\n print('inserting data point with epoch %d' % (epoch))\n db.execute('''INSERT INTO data (epoch, latitude, longitude, altitude, accuracy) VALUES (?,?,?,?,?);''', (\n epoch,\n lat,\n lon,\n alt,\n acc\n ))\n\n\nif __name__ == '__main__':\n db = sqlite3.connect(os.path.join(OUTBASE, 'location-log.sqlite'))\n db.execute('PRAGMA auto_vacuum = INCREMENTAL;')\n db.execute('PRAGMA journal_mode = MEMORY;')\n db.execute('PRAGMA temp_store = MEMORY;')\n db.execute('PRAGMA locking_mode = NORMAL;')\n db.execute('PRAGMA synchronous = FULL;')\n db.execute('PRAGMA encoding = \"UTF-8\";')\n\n files = glob.glob(os.path.join(INBASE, '*.csv'))\n for logfile in files:\n with open(logfile) as csvfile:\n try:\n reader = csv.reader(csvfile)\n except Exception as e:\n print('failed to open CSV reader for file: %s; %s' % (logfile, e))\n continue\n # skip the first row, that's headers\n headers = next(reader, None)\n for row in reader:\n epoch,lat,lon,alt,acc = parse(row)\n ins(db,epoch,lat,lon,alt,acc)\n # there's no need to commit per line, per file should be safe enough\n db.commit()\n\n db.execute('PRAGMA auto_vacuum;')\n\n results = db.execute('''\n SELECT\n *\n FROM\n data\n ORDER BY epoch ASC''').fetchall()\n prevdate = None\n gpx = gpxpy.gpx.GPX()\n\n for epoch, lat, lon, alt, acc in results:\n # in case you know your altitude might actually be valid with negative\n # values you may want to remove the -10\n if alt == 'NULL' or alt < -10:\n url = \"http://dev.virtualearth.net/REST/v1/Elevation/List?points=%s,%s&key=%s\" % (\n lat,\n lon,\n BINGKEY\n )\n bing = requests.get(url).json()\n # gotta love enterprise API endpoints\n if not bing or \\\n 'resourceSets' not in bing or \\\n not len(bing['resourceSets']) or \\\n 'resources' not in bing['resourceSets'][0] or \\\n not len(bing['resourceSets'][0]) or \\\n 'elevations' not in bing['resourceSets'][0]['resources'][0] or \\\n not bing['resourceSets'][0]['resources'][0]['elevations']:\n alt = 0\n else:\n alt = float(bing['resourceSets'][0]['resources'][0]['elevations'][0])\n print('got altitude from bing: %s for %s,%s' % (alt,lat,lon))\n db.execute('''\n UPDATE\n data\n SET\n altitude = ?\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n LIMIT 1\n ''',(alt, epoch, lat, lon))\n db.commit()\n del(bing)\n del(url)\n date = arrow.get(epoch).format('YYYY-MM-DD')\n if not prevdate or prevdate != date:\n # write previous out\n gpxfile = os.path.join(OUTBASE, \"%s.gpx\" % (date))\n with open(gpxfile, 'wt') as f:\n f.write(gpx.to_xml())\n print('created file: %s' % gpxfile)\n\n # create new\n gpx = gpxpy.gpx.GPX()\n prevdate = date\n\n # Create first track in our GPX:\n gpx_track = gpxpy.gpx.GPXTrack()\n gpx.tracks.append(gpx_track)\n\n # Create first segment in our GPX track:\n gpx_segment = gpxpy.gpx.GPXTrackSegment()\n gpx_track.segments.append(gpx_segment)\n\n # Create points:\n gpx_segment.points.append(\n gpxpy.gpx.GPXTrackPoint(\n lat,\n lon,\n elevation=alt,\n time=arrow.get(epoch).datetime\n )\n )\n\n db.close()\n\nOnce this is done, the OUTBASE directory will be populated by .gpx files, one per day.\nGpsPrune\nGpsPrune is a desktop, QT based GPX track visualizer. It needs data connectivity to have nice maps in the background, but it can do a lot of funky things, including editing GPX tracks.\nsudo apt install gpsprune\nKeep it in mind that the export script overwrites the GPX files, so the data needs to be fixed in the SQLite database.\nThis is an example screenshot of GpsPrune, about our 2 day walk down from Mount Emei and it\u2019s endless stairs:\n \n\nemei\nHappy tracking!\n\n\nhttps://www.traccar.org/\u21a9\nhttps://owntracks.org/\u21a9\nhttps://indieweb.org/manual_until_it_hurts\u21a9\nhttp://www.gpsies.com/backitude.do\u21a9\ngaugler.backitude.apk\u21a9\nhttps://syncthing.net/\u21a9\nbackitude.prefs\u21a9\nhttps://docs.syncthing.net/intro/getting-started.html\u21a9\nhttps://msdn.microsoft.com/en-us/library/ff428642\u21a9"
},
"name": "GPS tracking without a server",
"post-type": "article",
"_id": "1087487",
"_source": "268",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-26 17:16:48.780835",
"url": "https://kongaloosh.com/e/2018/9/26/ill-see-what-i-can-do",
"syndication": [
"https://kongaloosh.com/"
],
"in-reply-to": [
"http://jgregorymcverry.com/7416-2/"
],
"content": {
"text": "I\u2019ll see what I can do \ud83d\ude00. What time are you hosting it? I\u2019m at GHC until the 28th. \n \n \n \n \n \n \n indieweb\n \n ghc\n \n nyc",
"html": "<p class=\"e-content\"></p><p>I\u2019ll see what I can do \ud83d\ude00. What time are you hosting it? I\u2019m at GHC until the 28th. </p>\n \n \n \n \n <i></i>\n \n <a href=\"https://kongaloosh.com/t/indieweb\">indieweb</a>\n \n <a href=\"https://kongaloosh.com/t/ghc\">ghc</a>\n \n <a href=\"https://kongaloosh.com/t/nyc\">nyc</a>"
},
"author": {
"type": "card",
"name": "Alex Kearney",
"url": "http://kongaloosh.com",
"photo": null
},
"post-type": "reply",
"_id": "1085849",
"_source": "228",
"_is_read": true
}