Full Width [alt+shift+f] Shortcuts [alt+shift+k]
Sign Up [alt+shift+s] Log In [alt+shift+l]
8
I’ve read many books over the years. Thousands. Here’s a few that I find myself referencing/recommending.Periodically, I refresh this list. It’s changed over the years years. the list you are about to read is heavily reworked, based off this older list: josh.works/recommended-reading-original-list These are the books I cannot un-read, which shape me today. I’ll read any book, for any reason, and if I “like” it is almost a complete afterthought. The real question is - can I glean something of value from it? Can I sift and find something, anything that is helpful to me? That increases my understanding or imagination, or is an engaging-enough story? If I can, I’m pleased with the experience. I read English texts quickly, and easily, by the way. 1 Anyway, plunge into a book only if reading seems pleasant-enough to make the effort worthwhile. No sweat either way, you’ll get a sense of some things just by surfing book titles, I’m ‘just’ surfacing a list, one or two of which might catch your...
8 months ago

More from Josh Thompson

On Scooters as a class of vehicle/tool

Introduction Often when I say “scooter”, especially in the united states, the person thinks of something different than what I mean. Here’s Denver’s Sportique Scooters, here’s one of their recent posts: So that is the kind of vehicle I’m talking about when I say “scooter”. I once had a vehicle just like that. I note that I wore a different helmet, vastly safer - I always ride with a full motorcycle helmet. Head injuries are no joke. It’s my primary vehicle, and my only vehicle. In America, nearly every situation is improved by having the option of riding one of those vehicles around. Collections of writings about scooters See, it’s not really about scooters, per se. It’s the verb of the thing. Scooters are different than cars, but the only reason it matters at all is because scooter-ing is vastly different than car-ing. And some of you might say “oh, I have a bicycle, and so…” Scootering is also different than bicycle-ing. 👉 https://josh.works/scootering

a month ago 50 votes
Practicing with Polylines Part 2 - Get Your Data (as a polyline) From Strava

Last time, I did a minimum first pass on rendering a polyline on a map. It wasn’t just any polyline, though, it was a path of a walk I went on. (Technically, just a fragment of a path). this is a heavy draft, I’ve had issues getting this all working well in the past, still have to suss it today. the dictionary definition of a polyline is ‘some string that decodes into lat/long pairs that can be traced on a map’. I’m interested in the lines I’ve always looked at, which were made by Strava, from a device on my person, while I was walking, or biking, or riding my scooter. So it’s data, but it’s also extremely-specific-to-me location data, and it obviously has the capacity to be fascinating. My data is likely to be boring to you, though. What might not be boring would be your data. You could go on a walk right now, with the Strava app running on your phone, save the activity, and a moment later be looking at a map with that new activity data rendered upon it. Lets do just that. Like any good thing on the internet, there’s others who have done this thing in a concise and better-than-i-could way. These were my first sources and inspiration for this project: https://www.markhneedham.com/blog/2017/04/29/leaflet-strava-polylines-osm/ https://gist.github.com/mneedham/34b923beb7fd72f8fe6ee433c2b27d73 Today, I’m going to try to ‘quickly’ get a working auth ‘thing’ set up, close-enough to a copy/paste ruby script, so you can run a script or run some ruby commands in an IRB terminal, and get your data back from Strava, including any activity data polyline strava has. The goal being a polyline you can copy and paste, yourself, into a html document and get a cool map, showing off a walk or journey you went on yourself. It’s strongly based on Mark Needham’s stuff. First, download the Strava app (android/iphone whatever: https://www.strava.com/) Create an account, and then go on a ten minute walk while tracking that as an activity in the strava app. Finish the walk, end the activity. It’ll upload to Strava, and now we can use the Strava API to get that activity data back out and look at. You can keep working through this guide without activity on your Strava account, so maybe plan on taking a ten minute walk in the next hour or so. Set up a ‘strava application’ Strava has apps, and you can give those apps permissions at a per-app basis. You’ll set up an app that you’ll then give permission to know certain things about your data. So, to make the app account, and get your account id/ key, head to the developer settings. go to https://www.strava.com/settings/api and follow the prompts to get an API application set up. When you have your client_id and client_secret available, you’re ready to continue. We might use https://github.com/dblock/strava-ruby-client at some point. Authorize the app to access your strava data You’re going to need to generate a token (a refresh token and ) We’re going to do some creative things. Paste this into a pry session. do gem install 'strava-ruby-client' first. Then, fire up a pry session or irb session in your terminal. I recommend a text file where you can keep text for copy/paste accessibility. Copy the below text into your own blank file, update the client_id and client_secret variables (don’t commit any of this to github, you can make it an environment variable later. Or now.) require 'strava-ruby-client' client = Strava::OAuth::Client.new( client_id: "id", client_secret: "secret" ) redirect_url = client.authorize_url( redirect_uri: 'https://localhost:4000/oauth', approval_prompt: 'force', response_type: 'code', scope: 'activity:read_all', state: 'magic' ) this did not work: https://www.strava.com/oauth/authorize?approval_prompt=force&client_id=63764&redirect_uri=developers.strava.com&response_type=code&scope=activity%3Aread_all&state=magic this worked: https://www.strava.com/oauth/authorize?client_id=my_client_id&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=activity:read_all Look in the URL for “code” variable, and carry it on to the next step, where we give Strava this code, it’s treated as a ‘refresh token’, and if we give strava a refresh token it’ll give us back a valid access token that can then be included in the request authorization of every subsequent API call, and we’ll get back data for the strava account identified by that access token. This is all ‘just’ ‘basic’ auth stuff, but it can get tricky sometimes. require "uri" require "net/http" url = URI("https://www.strava.com/oauth/token?client_id=YOURCLIENTID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN&grant_type=refresh_token") https = Net::HTTP.new(url.host, url.port) https.use_ssl = true request = Net::HTTP::Post.new(url) response = https.request(request) puts response.read_body # look at the response before continuing, save the `access_token` In following that link, and approving the app, you’ve given your own app access to your Strava account data. Finish the oauth “flow” to view your data. With that code, in Postman you can now make a request. To see if it works, you can also paste this into an IRB session: require "uri" require "net/http" url = URI("https://www.strava.com/api/v3/activities/") https = Net::HTTP.new(url.host, url.port) https.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "Bearer ACCESS_TOKEN_FROM_PRIOR_STEP" response = https.request(request) puts response.read_body boom. Look at your activities! The polyline(s) might be visible now. If so, phenominal! Save them to a text file, or a CSV, manually or automatically. To get the detailed polyline, and not just the summary polyline, you need one more request: require "uri" require "net/http" url = URI("https://www.strava.com/api/v3/activities/YOUR_ACTIVITY_ID?include_all_efforts=true") https = Net::HTTP.new(url.host, url.port) https.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "••••••" response = https.request(request) puts response.read_body Does that work? I hope it does for you. It worked for me.

4 months ago 13 votes
Practicing with Polylines

This is a first pass at trying to do something interesting (repeatedly) with the same base primative, in this case, a “polyline”. Read the rest of this post, understand what we’re going for, then go to part 2: get your own polyline from strava. It’s not trivial to get, but its interesting data, and you’ll have an abundance of polylines, if you want them. The polyline in question I got from Strava, after recording a scooter ride: This post should be interesting to programmers and non-programmers alike. A polyline is a way of encoding a bunch of latitude/longitude pairs, so it can be drawn in detail on a map. Here’s what the polyline looks like, raw: oops, in a browser this string simply disappears off the side of the page. Here’s what it looks like in an editor: That string is suuuuper long. The only way to get it on your clipboard is to triple click it, highlight the whole thing, ctrl-c. You could then paste it into a polyline decoder. I googled my way to this one: https://www.daftlogic.com/projects-convert-encoded-polyline-to-latitude-longitude-list.htm, and see all 3321 lat long points. Here’s a snippet of what some of it might look like: update, using a different polyline than what I started this whole thing off with - it was maybe giving me issues. 39.72873,-105.00070 39.72877,-105.00071 39.72882,-105.00062 39.72894,-105.00062 39.72898,-105.00060 39.72904,-105.00051 39.72904,-105.00040 39.72908,-105.00035 39.72925,-105.00034 39.72929,-105.00030 39.72930,-105.00024 39.72932,-105.00038 39.72933,-105.00039 39.72951,-105.00032 39.72967,-105.00032 39.72971,-105.00027 39.72979,-105.00020 39.72992,-105.00015 39.72999,-105.00005 39.73016,-105.00005 39.73020,-105.00004 39.73031,-105.00007 39.73039,-105.00006 39.73043,-105.00002 39.73043,-104.99993 39.73040,-104.99989 39.73032,-104.99991 39.73033,-104.99996 39.73024,-105.00000 39.73018,-105.00000 39.73016,-104.99998 39.73023,-104.99993 39.73037,-104.99995 39.73037,-104.99992 39.73036,-104.99997 39.73033,-104.99999 39.73032,-105.00005 39.73030,-104.99999 39.73027,-105.00000 39.73029,-105.00001 39.73028,-105.00000 39.73029,-104.99998 39.73032,-104.99993 Those lat/long pairs are not super useful to look at, so to make a polyline ‘useful’/viewable, you need a map. (and html and javascript, including one very specific JS package, I suppose, and global supply chains of computing technology and the internet!) One can pop the polyline into Google’s polyline decoding utility to see it rendered. Here’s what the original polyline I was working with looks like: If you plot the polyline above (triple-click, ctrl-c, paste) you might see activity data from Denver, I went on a multi-hour walk with my kid through the local park and botanic gardens. More about those later. If you don’t see that data, maybe there’s some issues with the copying and pasting. Now, lets do something interactive, close to what google is doing there under the hood. I’ve used Leaflet before, and mapbox, a little, so I’m going to start with those. Lets render a bare map, but open it up to about where the polyline will go. I’m sorta writing this blog post top down. Lets add a map, and initialize it. Following the Leaflet quick start docs, and soon making use of a js/leaflet plugin that lets us decode polylines directly via L.Polyline.fromEncoded(polyline). I was stressing about how to add JS without something like NPM, but then realized I can source the file directly in the head of the document Open up a new file on some directory - maybe leaflet_practice.html We sourced there css, then JS, then added a div for a map, did a tiny bit of styling, and minimum JS. Telling the map to open on Denver’s approx lat/long. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/> <!-- Make sure you put this AFTER Leaflet's CSS --> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script> <div id="map"></div> <style> #map { height: 180px; } </style> <script> var map = L.map('map').setView([39.742043, -104.991531], 13); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' }).addTo(map);) And here’s what that renders: <script type="text/javascript" src="https://rawgit.com/jieter/Leaflet.encoded/master/Polyline.encoded.js"></script> ^------- this line is a critical addition There we go! It worked! A basic map. Pinch and zoom and pan. Cool, huh? Lets add the polyline next. We’ll assign to to a variable, and ask Leaflet to decode it and add it to the map. edit, that was really hard, what you’re about to see is a much smaller version of what I’d planned to do. It’s just a tiny fraction of the whole polyline, arbitrarily cut off at one end. I’ll explain what I did below. bleh, I didn’t even get the polyline directly encoded/decoded, I had to do an interstitial bit where I was working directly with lat/long pairs, as retreived from the decoder. Dang. var map1 = L.map('map1').setView([39.742043, -104.991531], 13); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(map1); var map2 = L.map('map2').setView([39.736532, -104.977459], 18); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 23, attribution: '© OpenStreetMap' }).addTo(map2); var encodedPolyline = "u}pqFttt_S@NFNB?JA@@DIH@@CEEBAPAFBHK@@FEf@??FLEPA\\?LD@CECDI?BBEH?DHLCT@BLBtB?@FADDDMADC@BJEIBAEMA@AC?HKACDDAHQEMA{@?e@BCR@FBJ?DBJAHB`@AF@LAHE~@?FEJLVC\\?DNBA@BFBBAPMJAP@NCBE?CIO@Cn@Fl@Cj@BDEDBFALDN?^?HILCRHNAVD~@?XKz@k@HSBWHKVOD?b@VJBHA?KCQBi@n@Sp@e@`AMHIJDZB^?\\KPKVYLq@f@i@Nm@L}@Cg@Q_AMWDH?CUa@g@YCEBGJQ`@]Eu@AA?HAG?f@CFSZITDHXXJPN`@BBAU}@s@_A][EEBAA?OEA}@JQL@F?EMAKLKBEFPd@Ma@QBA?D@EHKBKJKDILEGHe@@WAAEA@BBCADD@ABCK@UCW@IRO\\GDGLABBF?TGD@TI^GX?@EDBJCNBFCLDHJLMBBBCL@NFDC@MH?JN@X@BD?NIJBh@SZ@HK@BVA@CDALDHHRAHBZBFEBYFO?MBSAECHDPANOIOC?CJIFDFB@DDEEA?DC?B@ALLKADACADC@AC@@GBAA?ECBARDPBKEHDA?IEA@@?C@F@AB?@FCKAF@D?C@@EC@A?BCC?E@P?CCB?GFAGB@CAA?BC?D??D@K?AAB@@AAC@@EDACD?CBBABCA@CADACB@CAC_@@UCKAABGAUAEICAEBa@FU@_@@ED?^BDA@IEQ?k@FCF?DBBGEOCWCAMAG]EAKBADGECECa@Bk@Dc@EaBDQE?CGD_@PIH@LHD?@BIFEEOAf@CDAAI@DBEF@IC?B?CFFDBBFF@LC@ICEQE?B?M@LCAD?EDAC@A@DA@FKACGCFBABCAEIHDB??DCABB@AEGDFEABFAC?CABECJHGBDXXPD`@L@HBDZ@NAJC@O?DOD@CM@BBABNAHEBI?GEKAM?QDDCL?RBJ?HIBKISR@CHBACBECDDG@BB?C@FCGKrC@\\?BCABB@\\?d@@@?C@H@AC?CF?\\GFK?G@EA?CG?gABQFCFCn@Ft@JDT?BFBKNBEGGE?EGAMD@EJQBBFIJGB?@FAFC@B@ABHQ@BMN?H?KCA@@@A@@ABAAHEA?@B@GDCI@?BAEABCA?CB?CBBHGCB?CCBFC?@E?@BC?BCD@CC?BAA@?E@?@AC@AF@??C@G@LEEWFD??FHALD@DGF]CMR@SCAABDADDC@AEED@ADABDCBEA?@?CDAEB?NCCBEABBBDPXJFFDGJ?RGBEB@\\R^LHJJ@d@Kb@E^MD?@@C@@IABDEDBj@?~@GNBJANDr@?TDXNNPPd@Fz@Gz@?f@BZAVBb@Cf@@HELG@?EDB@ADHBrBDz@KpA?~@Kv@a@|@_@Va@`@G?KES[KGKWGEa@CQEBDk@CYBKDc@XSAODUA]DSC[Bk@Ck@BUAUDIAAAUFQIYCIMK]MAODEDAGDBC?CIBUECE@DEACCFD@ACADE@AEFFGMFA?@IAI@AGBMCE@HBBKBG?DCDKLCG@@IBA@MZWA@?CGGCAAGKUAK@MCKIGM_@IA@KDEC?CHAAAD@BB?CA?B@CHJADBBCCC@CNGFBHJJMCC@DT?F?AF@FH?HGXBTFNKPFAAAG@CD?E@DH@@EAIDD?ACCFDDLGB?FELAAC?CMA?BJBMEKA?@A?DJHE?CCCFCAJED@ACA@@EHXFC?EEACKFQ?EEAM@AFC@L?LUHXD?ABCCCFAC@B@GKG?KOUAKKIq@RCD@DHB?@CBVUPo@D?A?BDNQCS@GDQHMCHDIJq@HMBMDI@KC??DBCH?EO?CBACKL_@HI?KCXICJMFS?GGCID@PPQA@GEE?HDHKHC^DBABGLENA@CFe@CMCk@CACD@BCAEIBMB@BGHCB@EM?KBI\\CNBPYEGGB?MCCCLG?@CCHG@EE@CFA?DSFAJBEEDBXCF?V??@E@MFCOi@?KDCB@?FIB?BB`@CN?ADDHY@a@AAADEBAD@HFEC?@CEA@EB@AG@BPEJ@CGOGQ\\AIDCA@EYBMFKH?E^BXAHAAGQFB@ACC?HHIDKC?@BDGB?@FGDE?CKCDAG?FHUYEIDBRHBDF?C?DAGBO?KD[KUEBIABDE@WAIBF?M?ADDv@D@FE?FHGJBBH?RDD@MGOGG?IB@C@@ABF@LHLJBFABKCIBJE@@BG@IJO@?BB?CDB\\DVCDCME?@L@FAB?IFL@J?NEL@X?CCPCAADKAEBWOIBO?a@OG?OQQGG@ML@LEJCZ@@AD@AGJI`@EFCABA@BCH?CMJOBENIp@CDAHEDAAIDMH@@I@?B@AJF@PEFQDC?@@D?WHYRo@R?DQDKRQJG?UFIAm@HOEACDBABE??FIE@AJABKOJGNKACFFdBADG@@BEAZAp@KdCCRG@?AB@CDHLA^Dv@Gd@BNEDUJUBQDID?Ae@C?IBECCC@FGPDTKBIKVy@?UFQF]GMKK[QMAOFYVE?OHO@ULSRGBSb@^r@RXJDXD^ALBhAEDWCI?SC?EBCJ?JDEE@B@BCACC??BDEB@C@FC@CM@GFAABBNKFK@@G?KBIL@@XMDIGH@@BA?OMGMFGFYh@CNAAAEADIDIGSA[HUCGEQ_@_@Y_@q@c@NEDUD]LI?MC}@@e@GUAGDEXUXg@Xa@NGFc@AOBY?k@Ig@Fq@A]DCDc@AY@GGQD_@@GLC@eA@OCqCG}@HO?ICc@DYGMBEEM?MLSE_@?SDm@EO?IDGEG?KFFl@?n@K@QC]@OAKFAFFh@I\\?HDBTCBCEAE@@F@B?Da@PJEKAACDAVWd@[??ALBFNIWHDA@FFA?GGABICC?@s@FSAj@@J@BFCEQCs@DLGH?GBF?C@F?EAB?C?BACAC@?CCBBDHBFAOABA?ACASDH?BBFA@CBBH?KGM@HAMABDF@ICB?EEDDC@?AFAGAB?AAC?D?AB@AO@JDcCP|BWF?DFCGAB@EDLEKFD?@IGF?ED?CAAFHAEA@ACCFECC@?CIDBEGGABBBJAH@@CSDREBMGJB@CAB@AAABBBCGABB??BCBUJFKB@C?CCTIYDEFFEZAICWJAKD@HEF@AB?EDDAHHKCGOJ?BHCENNM@EA?AAD?C@?C?D?E?B@AA??A?DH??BKC@C@DCE@D?EBBCCM@F?AAFBAA@?C@@BA?BCA?@??CA@@AA?@@?A?@@AA?@?CA@BGEI@ABR?KHB?ACF?CIFWIFADB?JEKHDDECDE@HIDFA?MABD?GNEDNQCC@@GDE?BAFA?BD?MBCBBAAAFKA@@FAA@C@BCBI@DEBAABB?@AAE?BC?@EB@GADD?@AA@BGSFRAA@A?H@AAECJEFFE@M?H@AAI@BDAG?@@AC?@CABB?A@?A@@EC??CC?F?CJB?CACB@?E?AGFECBEEHB@FABACJ@BCC@KKC@BGF@A@ACDFAF@DAI?@E@DGDA?@CBCAADBG?BAAAFEAF@AAEBB@?EC@P@BBI@EKBKC?AHBFCK?DBBHAGAADO@H??BD?C?@ADBCGD@YJXAIKBA?EGFBG?B@CA@AC?BC@CCDC?ADAEJB@ACC@B@CBN?EC?BGD?FBEI@B?@IM@G?NIH?DDIIHD?EAD?ICBIAHACDBBA?H@EBLAO?BAG?BCC@B@GED?ABFB?D@CEADEM?AABCDDKAL?CBBA@FEC?CI?B?A??EB@EALBABBC?BE@DAA?@@A@BAD?E@D?WDF?FE?BEAFBCABAA@ECDBCEEDB?ACD?ABDAIBD@AABAC?BAI@F?AGC??@DAC@DDA@BCCBE?AIH@@J@AADB@?KE?DFC?EEKCD?ADD@AA@AD?E@BAGCL?G?A@@ABBE?@EIAL@AB@BAG@@CAF@O?@@C?@@DA?CC@B?C?@A@?CB?EB?CAD?SAh@FK?MCMBF@?@B??EBCD?OABCNBKB?BH??CL@Q?@E@FC@HBI?AAE?HAAAGBFB?DB@GCBCEAH@G?B@CBDCA?BAAA??G@FA?CC@BAGAIBT@QBl@GKAO@B?A?F@UBD@BAI?FMCNBOEHDEKDJIMDFBWDTBDC@GAAB?ECF@EF@GCJBMCF@EAHACF@HCG?F@K?@DE?BMFDCAACUBRACBN@QDDACGBAI?H?C@B@?I[JH?A@NCKCS?P@VE@@@J[MJ?HFEDYAN?@E@@FCL?FCK?QBJ@O@b@@MIM@LDICJE@KA@@@AFG@DFE@@@E?AE@?CCBAI?FJF?E??ICEF?C??HCABC@F@CC??CE@FAAE?D@AC?@@F?G@@DC?AE@@?@@AGAH@A??C@?A?CBFEIB@?CED@AECHB?C?FCCAB?AB?CA?@@ADCARAG?BBIAD@A?DEIFFCG@BEB?E@?AEHDE?ECB?DBAG?DAA@B@@AEA?C@BEDD?@E?BBAAC?BC?AED@GDDE?BBC?BGCLGM@A?FACHEEBAE?D@A@D?A@?CD?M@F?A@HBCA@GCB?CC@D@C?@@A?@B?ADCICCDD@@CBHOAJAAAB?@EG@FNAA?EEAA@BCC?FACEB@E@BAAE?FCBJEC@B@SBLD?CEADDDCI?BA?CCA@??B@CB??BCB@AAAB@CAB?C@@CB@C@B?I?@?@BGAJIE?DEEAHFE@A?BCE@J?CAD?A?@AG?@@ECHDOB?BHDCA?G@?A@FAG@?@D@KJDEACBABC@@C?@BEAD@?@CABB@CK?HCKDB?A@BEB??@CABAAAEDHAGADA?CC@@@C?EB@?AABB@C@@C?BAAAJ@C?EADAEAA?F@EAD?IDDAEAD@A?@?@AE@BA?@C@B@ABEABCCADACBG?J?B?CA@?C?ACD@BAC@@ACA@BC?ECB@C@D@C@DAEAF?@@A@EA@CB@E?FAIDECE?ABCA@ANDBAEAD@CC@CC?D?E?EDNBC@@B?EEA?@B?G?DAADAA@CHA@@E?ABCABAA?DB?@CC@CBBE@D@CADAEA@EA?@@A@@HI@DIA??ED??BC@@CCABEACGDC?@A@BH@?DC@JBECDCGCBCG@IA@?C@@@BAACD?BCEABABBAHLB?GC@?FQCFA?ARFEBD?OAFACDCA@CG@F@C?CE@A?BD?C@AAH?@CK@D@FAACBA?CEBB@@AQADACDG?L?ACA?DBCFDBABJ?KEEEI@HADB@AACG@B?@@A?BAAANCB@E?AFE@B@E?JCCB@@CA@C@?A?BAAC@?I@?DI@BB@CCA@EEE@@?F@A?B@A?BDA?CA?@AK@B?DIE@BFB?EBBAC?D?BA?ACAB?C@D?@D?ICACBHDGDEAEGG?T@GI@?C@CAABF@DCE?D?A?@@C?D@BA@?A@C?@BE?BBA??@B@ACB@EA@AD@KAPBKE@??@C?DACCB@C??@DBEADDEA@BA@B?G?CCD?C@@CBAGCBAI@?BF@AC@@A@@AEAAEC?DBA??AA@D?BKOAPBM@LBC?D?K@L@C?@B@?CCJ?ICE@FAGAJ@O?@AC?BA@BF@M?AGCCD?OCA@DBNDEAAJ@A@BAEDBIGDA@@E?BDCEAD?AD?CA@ADFAGA?B@QMLFBBA@?AEBACHAG@@??B@C@@C@BB@CEB@EC?DABFEC?@@ACE?BACIAB??BAADCAC?BC@B@?@E@F?@@CEDAA@?CIAJ@A@E@J?K?D?C?PFMAFDJ@ECFA?AQMOH@?AE@BDAA?B@FCADB@C@A@?CBC@@GA@AABBCDDC@B?ACQ?H@?BC@E?PEAABAC?ABCCBECDHFMBBEK@C@@BPGD@Q@AF@@BCLSDAA?@@KBB?CD@AGBJAQ@DCRAI@CE@@GBD??EDAJDCFYCGCCBLCCC@BHAC@B?A@DECBB@CA@AAB@CA@B?AAABBA?@AA?@W@NCC?@?EFa@DFIAA`@??GPCEBBDCACBBAA?@?ACABB@?GCDB@C?@AF?M@BA@D?CC@HCCB@?AC@C?@BAI@DCMCE@BLB??FC@BCCQPGJ?EFMD@HFGCAF@MD?ABCH?S?@DDDBAG@@G@??EC@CAB??BFI@?EDE@@FFS@BCDG?CDCCJD?DCA@CCGBCDBCA?B@ELDCEHBGA?@D?EAEDBCAAC@?BEBMEREB@KDBCF?C@DCC?AE@DDGG?KFGALCB@AB?AB?G?F@ZGKAYHVGB?ODEAAJD@?FB@BCACEC@CABE?@CC?IMFVL??IE??@AA?@?EC?B??D?E?@@A?BCC@FBDAE?DB?GK@??@?AAA?B?C@?@NDCCFBEFEEGM??BD@A@E?FCMCE?J?@BBCI@HCD@I?ABD@?C?BCAF@M?ABBBFAAA@BBAC@?EBBCAIBBKDACA?@E?BBAEEDICNBO??CD?BBGBB@F@CCBCG?B?ADFFBCC@BI@@CCDDI@@ACAAGQFJADBDGB@ECC@PFGDIATCE@ICBCD@AAE?C@@@C?AAHAIILAJDQ@A?FBABQ@?DC?LA@KC@B?@?ACBAE?ABB@KBB?CAPAE?@AGAH@C@?DB?ACFAAEK?J@M?GBD?ADBAABHACEBAFDK@D@O@EC@AECHCJ@C?D?ACDAGFDB?ACCGB@@M?b@?I@DFD@?ED@CCH@Q@EA?A@@C@QESH?IJ?VEDIDCYBTGUJLADDCGBFA??DAEBECGCBHDJ@I?Gn@?YH?CEEBEA?ADAEFE@AAFEB?BFCFGHECEO@GNGCEGBC?FKJD@HDBV@HIKAOFIC?BHBBAI?DCACKGE@?@FBEFAKKMHAK?R?SCNB?BHNADB?BFFBD?c@GHEBEA@QAMBF?\\JAEG@@CH?BEMAHIEBCK?BD@GTBDGGJGGBBC@??EFHYAHAA@BBPD?EKE?@ACB@CBBCA?@??CAB@@@AEA@?AB?CBBAC@DEABBC@BAA??GDDAB@GC??@?CCDBEBB?DCI@B?CABAC@@A?@??AAB@C?D?E?B@CA@B@C??A?@BAA??DC@@CC?BE"; console.log("🙄") var decodedPolyline = L.Polyline.fromEncoded(encodedPolyline) line = L.polyline(decodedPolyline._latlngs , {color: 'red', weight: 2, opacity: .7, linejoin: 'round'}) line.addTo(map2) console.log('omg') map2.setView(decodedPolyline._latlngs[0]); Here’s what I did: var map2 = L.map('map2').setView([39.736532, -104.977459], 17); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 23, attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' }).addTo(map2); var encodedPolyline = JSON.stringify("u}pqFttt_S@NFNB?JA@@DIH@@CEEBAPAFBHK@@FEf@??FLEPA\?LD@CECDI?BBEH?DHLCT@BLBtB?@FADDDMADC@BJEIBAEMA@AC?HKACDDAHQEMA{@?e@BCR@FBJ?DBJAHB`@AF@LAHE~@?FEJLVC\?DNBA@BFBBAPMJAP@NCBE?CIO@Cn@Fl@Cj@BDEDBFALDN?^?HILCRHNAVD~@?XKz@k@HSBWHKVOD?b@VJBHA?KCQBi@n@Sp@e@`AMHIJDZB^?\KPKVYLq@f@i@Nm@L}@Cg@Q_AMWDH?CUa@g@YCEBGJQ`@]Eu@AA?HAG?f@CFSZITDHXXJPN`@BBAU}@s@_A][EEBAA?OEA}@JQL@F?EMAKLKBEFPd@Ma@QBA?D@EHKBKJKDILEGHe@@WAAEA@BBCADD@ABCK@UCW@IRO\GDGLABBF?TGD@TI^GX?@EDBJCNBFCLDHJLMBBBCL@NFDC@MH?JN@X@BD?NIJBh@SZ@HK@BVA@CDALDHHRAHBZBFEBYFO?MBSAECHDPANOIOC?CJIFDFB@DDEEA?DC?B@ALLKADACADC@AC@@GBAA?ECBARDPBKEHDA?IEA@@?C@F@AB?@FCKAF@D?C@@EC@A?BCC?E@P?CCB?GFAGB@CAA?BC?D??D@K?AAB@@AAC@@EDACD?CBBABCA@CADACB@CAC_@@UCKAABGAUAEICAEBa@FU@_@@ED?^BDA@IEQ?k@FCF?DBBGEOCWCAMAG]EAKBADGECECa@Bk@Dc@EaBDQE?CGD_@PIH@LHD?@BIFEEOAf@CDAAI@DBEF@IC?B?CFFDBBFF@LC@ICEQE?B?M@LCAD?EDAC@A@DA@FKACGCFBABCAEIHDB??DCABB@AEGDFEABFAC?CABECJHGBDXXPD`@L@HBDZ@NAJC@O?DOD@CM@BBABNAHEBI?GEKAM?QDDCL?RBJ?HIBKISR@CHBACBECDDG@BB?C@FCGKrC@\?BCABB@\?d@@@?C@H@AC?CF?\GFK?G@EA?CG?gABQFCFCn@Ft@JDT?BFBKNBEGGE?EGAMD@EJQBBFIJGB?@FAFC@B@ABHQ@BMN?H?KCA@@@A@@ABAAHEA?@B@GDCI@?BAEABCA?CB?CBBHGCB?CCBFC?@E?@BC?BCD@CC?BAA@?E@?@AC@AF@??C@G@LEEWFD??FHALD@DGF]CMR@SCAABDADDC@AEED@ADABDCBEA?@?CDAEB?NCCBEABBBDPXJFFDGJ?RGBEB@\R^LHJJ@d@Kb@E^MD?@@C@@IABDEDBj@?~@GNBJANDr@?TDXNNPPd@Fz@Gz@?f@BZAVBb@Cf@@HELG@?EDB@ADHBrBDz@KpA?~@Kv@a@|@_@Va@`@G?KES[KGKWGEa@CQEBDk@CYBKDc@XSAODUA]DSC[Bk@Ck@BUAUDIAAAUFQIYCIMK]MAODEDAGDBC?CIBUECE@DEACCFD@ACADE@AEFFGMFA?@IAI@AGBMCE@HBBKBG?DCDKLCG@@IBA@MZWA@?CGGCAAGKUAK@MCKIGM_@IA@KDEC?CHAAAD@BB?CA?B@CHJADBBCCC@CNGFBHJJMCC@DT?F?AF@FH?HGXBTFNKPFAAAG@CD?E@DH@@EAIDD?ACCFDDLGB?FELAAC?CMA?BJBMEKA?@A?DJHE?CCCFCAJED@ACA@@EHXFC?EEACKFQ?EEAM@AFC@L?LUHXD?ABCCCFAC@B@GKG?KOUAKKIq@RCD@DHB?@CBVUPo@D?A?BDNQCS@GDQHMCHDIJq@HMBMDI@KC??DBCH?EO?CBACKL_@HI?KCXICJMFS?GGCID@PPQA@GEE?HDHKHC^DBABGLENA@CFe@CMCk@CACD@BCAEIBMB@BGHCB@EM?KBI\CNBPYEGGB?MCCCLG?@CCHG@EE@CFA?DSFAJBEEDBXCF?V??@E@MFCOi@?KDCB@?FIB?BB`@CN?ADDHY@a@AAADEBAD@HFEC?@CEA@EB@AG@BPEJ@CGOGQ\AIDCA@EYBMFKH?E^BXAHAAGQFB@ACC?HHIDKC?@BDGB?@FGDE?CKCDAG?FHUYEIDBRHBDF?C?DAGBO?KD[KUEBIABDE@WAIBF?M?ADDv@D@FE?FHGJBBH?RDD@MGOGG?IB@C@@ABF@LHLJBFABKCIBJE@@BG@IJO@?BB?CDB\DVCDCME?@L@FAB?IFL@J?NEL@X?CCPCAADKAEBWOIBO?a@OG?OQQGG@ML@LEJCZ@@AD@AGJI`@EFCABA@BCH?CMJOBENIp@CDAHEDAAIDMH@@I@?B@AJF@PEFQDC?@@D?WHYRo@R?DQDKRQJG?UFIAm@HOEACDBABE??FIE@AJABKOJGNKACFFdBADG@@BEAZAp@KdCCRG@?AB@CDHLA^Dv@Gd@BNEDUJUBQDID?Ae@C?IBECCC@FGPDTKBIKVy@?UFQF]GMKK[QMAOFYVE?OHO@ULSRGBSb@^r@RXJDXD^ALBhAEDWCI?SC?EBCJ?JDEE@B@BCACC??BDEB@C@FC@CM@GFAABBNKFK@@G?KBIL@@XMDIGH@@BA?OMGMFGFYh@CNAAAEADIDIGSA[HUCGEQ_@_@Y_@q@c@NEDUD]LI?MC}@@e@GUAGDEXUXg@Xa@NGFc@AOBY?k@Ig@Fq@A]DCDc@AY@GGQD_@@GLC@eA@OCqCG}@HO?ICc@DYGMBEEM?MLSE_@?SDm@EO?IDGEG?KFFl@?n@K@QC]@OAKFAFFh@I\?HDBTCBCEAE@@F@B?Da@PJEKAACDAVWd@[??ALBFNIWHDA@FFA?GGABICC?@s@FSAj@@J@BFCEQCs@DLGH?GBF?C@F?EAB?C?BACAC@?CCBBDHBFAOABA?ACASDH?BBFA@CBBH?KGM@HAMABDF@ICB?EEDDC@?AFAGAB?AAC?D?AB@AO@JDcCP|BWF?DFCGAB@EDLEKFD?@IGF?ED?CAAFHAEA@ACCFECC@?CIDBEGGABBBJAH@@CSDREBMGJB@CAB@AAABBBCGABB??BCBUJFKB@C?CCTIYDEFFEZAICWJAKD@HEF@AB?EDDAHHKCGOJ?BHCENNM@EA?AAD?C@?C?D?E?B@AA??A?DH??BKC@C@DCE@D?EBBCCM@F?AAFBAA@?C@@BA?BCA?@??CA@@AA?@@?A?@@AA?@?CA@BGEI@ABR?KHB?ACF?CIFWIFADB?JEKHDDECDE@HIDFA?MABD?GNEDNQCC@@GDE?BAFA?BD?MBCBBAAAFKA@@FAA@C@BCBI@DEBAABB?@AAE?BC?@EB@GADD?@AA@BGSFRAA@A?H@AAECJEFFE@M?H@AAI@BDAG?@@AC?@CABB?A@?A@@EC??CC?F?CJB?CACB@?E?AGFECBEEHB@FABACJ@BCC@KKC@BGF@A@ACDFAF@DAI?@E@DGDA?@CBCAADBG?BAAAFEAF@AAEBB@?EC@P@BBI@EKBKC?AHBFCK?DBBHAGAADO@H??BD?C?@ADBCGD@YJXAIKBA?EGFBG?B@CA@AC?BC@CCDC?ADAEJB@ACC@B@CBN?EC?BGD?FBEI@B?@IM@G?NIH?DDIIHD?EAD?ICBIAHACDBBA?H@EBLAO?BAG?BCC@B@GED?ABFB?D@CEADEM?AABCDDKAL?CBBA@FEC?CI?B?A??EB@EALBABBC?BE@DAA?@@A@BAD?E@D?WDF?FE?BEAFBCABAA@ECDBCEEDB?ACD?ABDAIBD@AABAC?BAI@F?AGC??@DAC@DDA@BCCBE?AIH@@J@AADB@?KE?DFC?EEKCD?ADD@AA@AD?E@BAGCL?G?A@@ABBE?@EIAL@AB@BAG@@CAF@O?@@C?@@DA?CC@B?C?@A@?CB?EB?CAD?SAh@FK?MCMBF@?@B??EBCD?OABCNBKB?BH??CL@Q?@E@FC@HBI?AAE?HAAAGBFB?DB@GCBCEAH@G?B@CBDCA?BAAA??G@FA?CC@BAGAIBT@QBl@GKAO@B?A?F@UBD@BAI?FMCNBOEHDEKDJIMDFBWDTBDC@GAAB?ECF@EF@GCJBMCF@EAHACF@HCG?F@K?@DE?BMFDCAACUBRACBN@QDDACGBAI?H?C@B@?I[JH?A@NCKCS?P@VE@@@J[MJ?HFEDYAN?@E@@FCL?FCK?QBJ@O@b@@MIM@LDICJE@KA@@@AFG@DFE@@@E?AE@?CCBAI?FJF?E??ICEF?C??HCABC@F@CC??CE@FAAE?D@AC?@@F?G@@DC?AE@@?@@AGAH@A??C@?A?CBFEIB@?CED@AECHB?C?FCCAB?AB?CA?@@ADCARAG?BBIAD@A?DEIFFCG@BEB?E@?AEHDE?ECB?DBAG?DAA@B@@AEA?C@BEDD?@E?BBAAC?BC?AED@GDDE?BBC?BGCLGM@A?FACHEEBAE?D@A@D?A@?CD?M@F?A@HBCA@GCB?CC@D@C?@@A?@B?ADCICCDD@@CBHOAJAAAB?@EG@FNAA?EEAA@BCC?FACEB@E@BAAE?FCBJEC@B@SBLD?CEADDDCI?BA?CCA@??B@CB??BCB@AAAB@CAB?C@@CB@C@B?I?@?@BGAJIE?DEEAHFE@A?BCE@J?CAD?A?@AG?@@ECHDOB?BHDCA?G@?A@FAG@?@D@KJDEACBABC@@C?@BEAD@?@CABB@CK?HCKDB?A@BEB??@CABAAAEDHAGADA?CC@@@C?EB@?AABB@C@@C?BAAAJ@C?EADAEAA?F@EAD?IDDAEAD@A?@?@AE@BA?@C@B@ABEABCCADACBG?J?B?CA@?C?ACD@BAC@@ACA@BC?ECB@C@D@C@DAEAF?@@A@EA@CB@E?FAIDECE?ABCA@ANDBAEAD@CC@CC?D?E?EDNBC@@B?EEA?@B?G?DAADAA@CHA@@E?ABCABAA?DB?@CC@CBBE@D@CADAEA@EA?@@A@@HI@DIA??ED??BC@@CCABEACGDC?@A@BH@?DC@JBECDCGCBCG@IA@?C@@@BAACD?BCEABABBAHLB?GC@?FQCFA?ARFEBD?OAFACDCA@CG@F@C?CE@A?BD?C@AAH?@CK@D@FAACBA?CEBB@@AQADACDG?L?ACA?DBCFDBABJ?KEEEI@HADB@AACG@B?@@A?BAAANCB@E?AFE@B@E?JCCB@@CA@C@?A?BAAC@?I@?DI@BB@CCA@EEE@@?F@A?B@A?BDA?CA?@AK@B?DIE@BFB?EBBAC?D?BA?ACAB?C@D?@D?ICACBHDGDEAEGG?T@GI@?C@CAABF@DCE?D?A?@@C?D@BA@?A@C?@BE?BBA??@B@ACB@EA@AD@KAPBKE@??@C?DACCB@C??@DBEADDEA@BA@B?G?CCD?C@@CBAGCBAI@?BF@AC@@A@@AEAAEC?DBA??AA@D?BKOAPBM@LBC?D?K@L@C?@B@?CCJ?ICE@FAGAJ@O?@AC?BA@BF@M?AGCCD?OCA@DBNDEAAJ@A@BAEDBIGDA@@E?BDCEAD?AD?CA@ADFAGA?B@QMLFBBA@?AEBACHAG@@??B@C@@C@BB@CEB@EC?DABFEC?@@ACE?BACIAB??BAADCAC?BC@B@?@E@F?@@CEDAA@?CIAJ@A@E@J?K?D?C?PFMAFDJ@ECFA?AQMOH@?AE@BDAA?B@FCADB@C@A@?CBC@@GA@AABBCDDC@B?ACQ?H@?BC@E?PEAABAC?ABCCBECDHFMBBEK@C@@BPGD@Q@AF@@BCLSDAA?@@KBB?CD@AGBJAQ@DCRAI@CE@@GBD??EDAJDCFYCGCCBLCCC@BHAC@B?A@DECBB@CA@AAB@CA@B?AAABBA?@AA?@W@NCC?@?EFa@DFIAA`@??GPCEBBDCACBBAA?@?ACABB@?GCDB@C?@AF?M@BA@D?CC@HCCB@?AC@C?@BAI@DCMCE@BLB??FC@BCCQPGJ?EFMD@HFGCAF@MD?ABCH?S?@DDDBAG@@G@??EC@CAB??BFI@?EDE@@FFS@BCDG?CDCCJD?DCA@CCGBCDBCA?B@ELDCEHBGA?@D?EAEDBCAAC@?BEBMEREB@KDBCF?C@DCC?AE@DDGG?KFGALCB@AB?AB?G?F@ZGKAYHVGB?ODEAAJD@?FB@BCACEC@CABE?@CC?IMFVL??IE??@AA?@?EC?B??D?E?@@A?BCC@FBDAE?DB?GK@??@?AAA?B?C@?@NDCCFBEFEEGM??BD@A@E?FCMCE?J?@BBCI@HCD@I?ABD@?C?BCAF@M?ABBBFAAA@BBAC@?EBBCAIBBKDACA?@E?BBAEEDICNBO??CD?BBGBB@F@CCBCG?B?ADFFBCC@BI@@CCDDI@@ACAAGQFJADBDGB@ECC@PFGDIATCE@ICBCD@AAE?C@@@C?AAHAIILAJDQ@A?FBABQ@?DC?LA@KC@B?@?ACBAE?ABB@KBB?CAPAE?@AGAH@C@?DB?ACFAAEK?J@M?GBD?ADBAABHACEBAFDK@D@O@EC@AECHCJ@C?D?ACDAGFDB?ACCGB@@M?b@?I@DFD@?ED@CCH@Q@EA?A@@C@QESH?IJ?VEDIDCYBTGUJLADDCGBFA??DAEBECGCBHDJ@I?Gn@?YH?CEEBEA?ADAEFE@AAFEB?BFCFGHECEO@GNGCEGBC?FKJD@HDBV@HIKAOFIC?BHBBAI?DCACKGE@?@FBEFAKKMHAK?R?SCNB?BHNADB?BFFBD?c@GHEBEA@QAMBF?\JAEG@@CH?BEMAHIEBCK?BD@GTBDGGJGGBBC@??EFHYAHAA@BBPD?EKE?@ACB@CBBCA?@??CAB@@@AEA@?AB?CBBAC@DEABBC@BAA??GDDAB@GC??@?CCDBEBB?DCI@B?CABAC@@A?@??AAB@C?D?E?B@CA@B@C??A?@BAA??DC@@CC?BE"); console.log("🙄") var decodedPolyline = L.Polyline.fromEncoded(encodedPolyline) line = L.polyline(decodedPolyline._latlngs , {color: 'red', weight: 2, opacity: .7, linejoin: 'round'}) line.addTo(map2) console.log('omg') map2.setView(decodedPolyline._latlngs[0]); ~I’m still doing something funky to escape the escape characters in the polyline.~ Able to get around that with JSON.stringify() If you’d like to see the raw html that is being used to generate this exact page, it’s available in an extremely hacky way here Next time, might animate a marker moving along the line, something like https://github.com/openplans/Leaflet.AnimatedMarker?tab=readme-ov-file, or maybe make the line blink, or see if we can give a sense of which direction the movement was happening in. Useful additional resources Get the ‘decode raw polyline’ function in your page with this package Leaflet: Mapping Strava runs/polylines on Open Street Map ()

4 months ago 9 votes
Paths In Which I Am Interested

this is still in draft status this page serves as a placeholder for various paths I’m interested in. I hope to bring attention to “linear parks”, or a park that functions more in size and shape to a street, crossing blocks of distance, but maintaining park vibes throughout. Path Segment One: Voodoo <> Cheesman, down Franklin Pardon my language. “segments”? “paths”? I’m referring explicitly to places that connect places, so it’s sorta hard to think about the ‘place’ directly, especially as a path. 1 This is a simple extension of the existing closed street exiting Cheesman. Here’s what it looks like, looking into Cheesman, at the current barricades. I basically want to move the barriers “towards” the camera, there’s a few (not trivial, but very solvable) obvious issues that might need addressing, but I think this as a first move makes sense. If it could be moved a few meters, and backfilled with something everyone agrees is nice, I say keep moving it, 10 or 20 meters at a time, down franklin: Components Moving barricades down an existing closed road making a little traffic path displaceable and non-displacable barriers, like art, play structures, benches much more To make the spreadsheet people happy Heavy foot traffic corresponds with great business, all the time. More and more of Voodoo’s business would come from people who walk to it, from the park, or walk to it, on their way to the park. I can do some magic number work + video footage of foot traffic, to show the value of someone walking/biking vs how much space someone takes when they drive, and fill a whole parking space for 30 minutes or an hour. Segment 2: Ideal Market <> Cheesman Park, down 11th footage inbound, I’ve flown my drone around the area a bunch and am going to put a little video together, do a voice overlay, and add it to this page. Thoughts about these two segments These paths, Voodoo to Cheesman, and Cheesman to Ideal, are paths that I use, personally, all the time, some days more than once a day. Take a look at my activity/mobility data, noting where these two paths overlay that data: My actual map with the data overlay is devoid of labels, but if you can find Cheesman Park, you can find the segments I’m talking about. You can see in the data where I’ve walked all around the Ideal Market building, and the Voodoo Donuts building. https://joshs-mobility-data-54dab943ebba.herokuapp.com/?zoom=16&latlng=39.735985, -104.971018 This is, admittedly, an unusual project, and some might call it audacious, but I say it’s audacious only in a very narrow sense. Also, a huge thing I want to practice is getting buy-in and tacit or formal support from the exact right people, in the exact right way, to nudge through real improvements. If you’re even reading these words, that means so much has already gone right. :) If we somehow get these two segments ‘fixed’, we’ve done distinctive, uncommon things, I say it’s comparable to even those who build buildings, and we’ll have done it accidentally, as a by-product of doing other, more interesting things. Interested entities my guesstimates of people associated with entities that could ostensibly have aligned interests on this. This is who I am thinking about, none of this reflects anything others have said. I come most recently from the software/computing/networking industry, some of my default ways of sharing information and building consensus might strike others as distinctive. :) Pando x2 Voodoo x1 Avanti x4 Ideal/Wholefoods x2 Cornerstone x >15 Bleh, more to talk about. I might direct potential traffic to this page if I expand here on certain best practices, and why there’s certain barriers to certain kinds of fixes. I’ve spoken elsewhere about some of the root causes of all this, don’t really want to pollute this page with more of that energy. paths are places, and places are often used as a path. For example, Cheesman Park is not just a place to go, but for many, many people, passing through/along Cheesman Park is a beautiful portion of their trip, as they take a path from one place to another. I want to draw attention to the way that I think about these two ‘segments’. I think about the roads as connections, and how well they serve that function, and could they be more beautiful and peaceful for all people, kids, adults, old people. And if a one block could be done, why not two? etc. ↩

7 months ago 8 votes

More in literature

Two poisonous Tanizaki novels, Naomi and Quicksand - the same as a fruit that I’d cultivated myself

Two Junichiro Tanizaki novels from the 1920s for Japanese Literature Month over at Dolce Bellezza.  Always interesting to see what people are reading.  Thanks as usual.  18th edition! The two novels I read, Naomi (1924) and Quicksand (1928-30), are closely related.  Both are about dominant and submissive sexual relations, an obsession of Tanizaki.  Both were serialized in newspapers.  How I wish the books had explanations of how the serialization worked.  Both novels are written in, or at least translated as, plain, sometimes even dull prose, perhaps a consequence of tight serial deadlines. Both have narrators who may well be playing tricks on me, although if so I did not see the signals, and believe me I am alert to the signals, well-trained by Pale Fire and The Tin Drum and Villette and so on.  Maybe Tanizaki’s tricks are different. Naomi is narrated by a creep of an engineer who picks up – grooms – a 15 year-old waitress who he finds especially “Western.”  … most of her value to me lay in the fact that I’d brought her up myself, that I myself had made her into the woman she was, and that only I knew every part of her body.  For me Naomi was the same as a fruit that I’d cultivated myself.  I’d labored hard and spared no pains to bring that piece of fruit to its present, magnificent ripeness, and it was only proper that I, the cultivator, should be the one to taste it.  No one else had that right.  (Ch. 18, 161) Pure poison.  By this point in the novel Naomi has taken power, well on her way to complete control, crushing her groomer, who is likely, it turns out, happier crushed. Much of the novel is set in the modern, Westernized Asakusa neighborhood of Tokyo, before the terrible earthquake that obliterated the dancehalls and movie theaters.  I found all of that detail quite interesting, as it was in Yasunari Kawabata’s The Scarlet Gang of Asakusa (1929-30).  One more piece of bad luck and Naomi might have become one of the homeless teen prostitutes in The Scarlet Gang.  Too bad Naomi does not have the innovative linguistic interest of Kawabata’s crackling novel. The Japanese title of Quicksand is a single character, the Buddhist swastika, a perfect representation of the content of the novel, which is a four-way struggle for dominance among the narrator, her girlfriend, her husband, and the girlfriend’s boyfriend.  Some of the weapons in the struggle are pretty crazy, like a scene where the narrator and the girlfriend’s lunatic boyfriend swear a blood oath.  Eh, they’re all crazy.  The narrator is the eventual winner, obviously, I guess.  Maybe she is making it all up.  Quicksand has a lot in common with Ford Madox Ford’s devious The Good Soldier, another four-way struggle, but as I said if Tanizaki’s narrator is a tenth as tricky as Ford’s I sure couldn’t see it.  She seems more unreliable in theory than practice. One technique that is interesting and may hold clues: Tanizaki and the narrator return to key scenes, describing what happened from different perspectives, yes, like in Akutagawa’s “In a Bamboo Grove” (1922), except everything is filtered through the narrator, which does have the appearance of what I am calling a trick, a technique of emphasizing and controlling unreliability.  How newspaper readers followed this over two full years baffles me, but my understanding is that the lesbian aspect got the attention. I have trouble imaging the literary world where these were newspaper novels.  Naomi was in fact too shocking and was booted from the newspaper, with Tanizaki completing it in a magazine. Should I give an example of what I mean by dull prose?  Is it worth the tedium of the typing?  I mean that there is a lot of this: “Were you still asleep, Mitsu?” “Your phone call wakened me!” “I can leave anytime now.  Won’t you come right away too?” “Then I’ll hurry up and get ready.  Can you be at the Umeda station by half-past nine?” “You’re sure you can?” “Of course I am!”  (Quicksand, Ch. 15, 98) And this is nominally supposed to be the narrator telling her story to Tanizaki.  Serialization filler?  Maybe you can see why I am not in a hurry to solve the puzzle of Quicksand.  The appeal of both novels, for me, was exploring the psychology of the believably awful characters and seeing how their less believable awful schemes work out. Anthony Chambers translated Naomi; Howard Hibbett did Quicksand.

19 hours ago 3 votes
'We Must Be Continually Striving to Live'

A reader asks what I hope to accomplish in retirement. I’m not one for making grand plans or resolutions. No golf and little travel. It’s more likely I’ll continue what I’m already doing – writing, reading, family matters – just more of it. More Montaigne, J.V. Cunningham, Shakespeare, Rebecca West. Luke O’Sullivan writes in his introduction to Michael Oakeshott’s Notebooks, 1922-86 (2014):  “What [Montaigne] had to offer, he believed, was not a consistent set of arguments with which to answer problems of the human condition, but (like Aristotle) a feeling for balance and an ability to live without the need for certainty. Moreover, he had a sense of his own integrity; late in life, Oakeshott made a note of Montaigne’s remark that ‘The greatest thing in the world is to know how to belong to oneself.’”   The Montaigne quote is from the essay “Of Solitude,” written around 1572, and it seems applicable to late-life retirement. The previous year Montaigne had retired from public life to the Château de Montaigne. In its tower he kept his books and found the privacy he needed to write his essays. Like Montaigne, I’m no hermit but I need quiet and a moderate amount of solitude to get done what I want to do. I understand some retirees get bored and start drinking and preparing themselves for a premature death. They have never learned “how to belong to oneself.” In his Notebooks, Oakeshott writes:   “We spend our lives trying to discover how to live, a perfect way of life, sens de la vie. But we shall never find it. Life is the search for it; the successful life is that which is given up to this search; & when we think we have found it, we are farthest from it. Delude ourselves that we have found it, persuade ourselves that here at least there is a point at which we can rest – and life has become at once moribund. Just as to remain in love we must be continually falling in love, so to remain living we must be continually striving to live.”   Montaigne echoes Oakeshott in his essay “Of Physiognomy” (c. 1585-88):   “[D]eath is indeed the end, but not therefore the goal, of life; it is its finish, its extremity, but not therefore its object. Life should be an end unto itself, a purpose unto itself; its rightful study is to regulate, conduct, and suffer itself. Among the many other duties comprised in this general and principal chapter on knowing how to live is this article on knowing how to die; and it is one of the lightest, if our fear did not give it weight.”

16 hours ago 1 votes
Why Recurring Dream Themes?

...

7 hours ago 1 votes
The Lily vs. the Eagle: D.H. Lawrence on the Key to Balancing Mutuality and Self-Possession in Love

If you live long enough and wide enough, you come to see that love is simply the breadth of the aperture through which you let in the reality of another and the quality of attention you pay what you see. It is, in this sense, not a phenomenon that happens unto you but a creative act. The poet Robert Graves knew this: “Love is not kindly nor yet grim, but does to you as you to him,” he wrote as a young man a lifetime before the old man came to define love as “a recognition of truth, a recognition… read article

yesterday 1 votes
Advice for a friend who wants to start a blog

What’s odd about you is what’s interesting.

yesterday 4 votes