[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation":3,"/blog/04-gpx-project-idea":50,"/blog/04-gpx-project-idea-surround":483},[4],{"title":5,"path":6,"stem":7,"children":8,"page":49},"Blog","/blog","blog",[9,13,17,21,25,29,33,37,41,45],{"title":10,"path":11,"stem":12},"Finally","/blog/01-welcome-first-post","blog/01-welcome-first-post",{"title":14,"path":15,"stem":16},"I Love Flutter and Dart!","/blog/02-flutter-and-dart","blog/02-flutter-and-dart",{"title":18,"path":19,"stem":20},"First Flutter App","/blog/03-first-flutter-app","blog/03-first-flutter-app",{"title":22,"path":23,"stem":24},"A Project Idea - Working with GPX Data","/blog/04-gpx-project-idea","blog/04-gpx-project-idea",{"title":26,"path":27,"stem":28},"Update on GPX Project","/blog/05-gpx-electron-app","blog/05-gpx-electron-app",{"title":30,"path":31,"stem":32},"Ember, Electron, Vue, and TypeScript!","/blog/06-ember-vue-typescript","blog/06-ember-vue-typescript",{"title":34,"path":35,"stem":36},"Building a Date Picker","/blog/07-building-datepicker","blog/07-building-datepicker",{"title":38,"path":39,"stem":40},"A quick update","/blog/08-quick-update","blog/08-quick-update",{"title":42,"path":43,"stem":44},"Claude Code and More","/blog/09-claude-code-and-more","blog/09-claude-code-and-more",{"title":46,"path":47,"stem":48},"Claude Code and Bringing My Science Background and Programming Skills Together","/blog/10-bringing-science-and-programming-together","blog/10-bringing-science-and-programming-together",false,{"id":51,"title":22,"body":52,"date":476,"description":477,"extension":478,"image":479,"meta":480,"minRead":115,"navigation":407,"path":23,"seo":481,"stem":24,"__hash__":482},"blog/blog/04-gpx-project-idea.md",{"type":53,"value":54,"toc":468},"minimark",[55,59,64,67,71,81,86,89,169,173,182,454,457,461,464],[56,57,58],"p",{},"An app I loved has gone, but I'm using it as inspiration for a personal project.",[60,61,63],"h2",{"id":62},"first-an-update-on-flutter","First, an update on Flutter",[56,65,66],{},"I've continued working with Flutter and Dart in my spare time. I've really\nenjoyed it, and I still hope to get the RoundsLogging app rebuilt in Flutter at\nsome point. State management is one aspect of Flutter that isn't quite as\nstraightforward as Vue. Unlike Vue, where Vuex is the standard for state\nmanagement, Flutter has several options, none of which seem quite as easy to\nwork with as Vuex. I've been working with Provider. I also plan on having a look\nat BLoC. Once I've worked that out, I can move forward with the app.",[60,68,70],{"id":69},"endomondo","Endomondo",[56,72,73,74,80],{},"I used ",[75,76,70],"a",{"href":77,"rel":78},"https://en.wikipedia.org/wiki/Endomondo",[79],"nofollow"," for about ten years.\nIt was my favorite running app, and, in my opinion, had far better features than\nany other app available. Even apps available now, in 2021, lack many of the\nfeatures available on Endomondo back in 2012. I'm a data junkie, and I loved the\nvariety of stats offered in Endomondo. Since I can't find these features in any\nexisting apps, I plan on writing the code to extract and calculate the stats\nmyself.",[82,83,85],"h3",{"id":84},"gpx-files","GPX Files",[56,87,88],{},"Most running apps store data in GPX files, which are essentially XML files that\nstore tracking data. In addition to basic info such as time and date, the bulk\nof the file consists of a series of trackpoints made up of coordinates,\nelevation, and a timestamp. The data is collected every 2-3 seconds for the\nduration of the run.",[90,91,96],"pre",{"className":92,"code":93,"language":94,"meta":95,"style":95},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctrkpt lat=\"36.844810485839844\" lon=\"-75.98933410644531\">\n  \u003Cele>5.199999809265137\u003C/ele>\n  \u003Ctime>2010-10-30T12:02:07.000Z\u003C/time>\n\u003C/trkpt>\n\u003Ctrkpt lat=\"36.84482955932617\" lon=\"-75.9892578125\">\n  \u003Cele>5.199999809265137\u003C/ele>\n  \u003Ctime>2010-10-30T12:02:10.000Z\u003C/time>\n\u003C/trkpt>\n\u003Ctrkpt lat=\"36.844844818115234\" lon=\"-75.98918151855469\">\n  \u003Cele>5.199999809265137\u003C/ele>\n  \u003Ctime>2010-10-30T12:02:13.000Z\u003C/time>\n\u003C/trkpt>\n","xml","",[97,98,99,107,113,119,125,131,136,142,147,153,158,164],"code",{"__ignoreMap":95},[100,101,104],"span",{"class":102,"line":103},"line",1,[100,105,106],{},"\u003Ctrkpt lat=\"36.844810485839844\" lon=\"-75.98933410644531\">\n",[100,108,110],{"class":102,"line":109},2,[100,111,112],{},"  \u003Cele>5.199999809265137\u003C/ele>\n",[100,114,116],{"class":102,"line":115},3,[100,117,118],{},"  \u003Ctime>2010-10-30T12:02:07.000Z\u003C/time>\n",[100,120,122],{"class":102,"line":121},4,[100,123,124],{},"\u003C/trkpt>\n",[100,126,128],{"class":102,"line":127},5,[100,129,130],{},"\u003Ctrkpt lat=\"36.84482955932617\" lon=\"-75.9892578125\">\n",[100,132,134],{"class":102,"line":133},6,[100,135,112],{},[100,137,139],{"class":102,"line":138},7,[100,140,141],{},"  \u003Ctime>2010-10-30T12:02:10.000Z\u003C/time>\n",[100,143,145],{"class":102,"line":144},8,[100,146,124],{},[100,148,150],{"class":102,"line":149},9,[100,151,152],{},"\u003Ctrkpt lat=\"36.844844818115234\" lon=\"-75.98918151855469\">\n",[100,154,156],{"class":102,"line":155},10,[100,157,112],{},[100,159,161],{"class":102,"line":160},11,[100,162,163],{},"  \u003Ctime>2010-10-30T12:02:13.000Z\u003C/time>\n",[100,165,167],{"class":102,"line":166},12,[100,168,124],{},[82,170,172],{"id":171},"calculating-distance","Calculating Distance",[56,174,175,176,181],{},"Thanks to\n",[75,177,180],{"href":178,"rel":179},"https://stackoverflow.com/a/21623206/8075360",[79],"this Stack Overflow post"," I was\nable to accurately calculate distance between points.",[90,183,187],{"className":184,"code":185,"language":186,"meta":95,"style":95},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const distance = (lat1, lon1, lat2, lon2) => {\n    var p = 0.017453292519943295; // Math.PI / 180\n    var c = Math.cos;\n    var a =\n        0.5 -\n        c((lat2 - lat1) * p) / 2 +\n        (c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p))) / 2;\n\n    return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km\n};\n","js",[97,188,189,235,257,278,288,296,334,403,409,449],{"__ignoreMap":95},[100,190,191,195,199,203,206,210,213,216,218,221,223,226,229,232],{"class":102,"line":103},[100,192,194],{"class":193},"spNyl","const",[100,196,198],{"class":197},"sTEyZ"," distance ",[100,200,202],{"class":201},"sMK4o","=",[100,204,205],{"class":201}," (",[100,207,209],{"class":208},"sHdIc","lat1",[100,211,212],{"class":201},",",[100,214,215],{"class":208}," lon1",[100,217,212],{"class":201},[100,219,220],{"class":208}," lat2",[100,222,212],{"class":201},[100,224,225],{"class":208}," lon2",[100,227,228],{"class":201},")",[100,230,231],{"class":193}," =>",[100,233,234],{"class":201}," {\n",[100,236,237,240,243,246,250,253],{"class":102,"line":109},[100,238,239],{"class":193},"    var",[100,241,242],{"class":197}," p",[100,244,245],{"class":201}," =",[100,247,249],{"class":248},"sbssI"," 0.017453292519943295",[100,251,252],{"class":201},";",[100,254,256],{"class":255},"sHwdD"," // Math.PI / 180\n",[100,258,259,261,264,266,269,272,275],{"class":102,"line":115},[100,260,239],{"class":193},[100,262,263],{"class":197}," c",[100,265,245],{"class":201},[100,267,268],{"class":197}," Math",[100,270,271],{"class":201},".",[100,273,274],{"class":197},"cos",[100,276,277],{"class":201},";\n",[100,279,280,282,285],{"class":102,"line":121},[100,281,239],{"class":193},[100,283,284],{"class":197}," a",[100,286,287],{"class":201}," =\n",[100,289,290,293],{"class":102,"line":127},[100,291,292],{"class":248},"        0.5",[100,294,295],{"class":201}," -\n",[100,297,298,302,306,309,312,315,318,321,323,325,328,331],{"class":102,"line":133},[100,299,301],{"class":300},"s2Zo4","        c",[100,303,305],{"class":304},"swJcz","((",[100,307,308],{"class":197},"lat2",[100,310,311],{"class":201}," -",[100,313,314],{"class":197}," lat1",[100,316,317],{"class":304},") ",[100,319,320],{"class":201},"*",[100,322,242],{"class":197},[100,324,317],{"class":304},[100,326,327],{"class":201},"/",[100,329,330],{"class":248}," 2",[100,332,333],{"class":201}," +\n",[100,335,336,339,342,345,347,350,352,354,356,358,360,362,364,366,368,370,372,375,377,379,381,384,386,388,390,392,394,397,399,401],{"class":102,"line":138},[100,337,338],{"class":304},"        (",[100,340,341],{"class":300},"c",[100,343,344],{"class":304},"(",[100,346,209],{"class":197},[100,348,349],{"class":201}," *",[100,351,242],{"class":197},[100,353,317],{"class":304},[100,355,320],{"class":201},[100,357,263],{"class":300},[100,359,344],{"class":304},[100,361,308],{"class":197},[100,363,349],{"class":201},[100,365,242],{"class":197},[100,367,317],{"class":304},[100,369,320],{"class":201},[100,371,205],{"class":304},[100,373,374],{"class":248},"1",[100,376,311],{"class":201},[100,378,263],{"class":300},[100,380,305],{"class":304},[100,382,383],{"class":197},"lon2",[100,385,311],{"class":201},[100,387,215],{"class":197},[100,389,317],{"class":304},[100,391,320],{"class":201},[100,393,242],{"class":197},[100,395,396],{"class":304},"))) ",[100,398,327],{"class":201},[100,400,330],{"class":248},[100,402,277],{"class":201},[100,404,405],{"class":102,"line":144},[100,406,408],{"emptyLinePlaceholder":407},true,"\n",[100,410,411,415,418,420,422,424,427,429,432,434,437,439,441,444,446],{"class":102,"line":149},[100,412,414],{"class":413},"s7zQu","    return",[100,416,417],{"class":248}," 12742",[100,419,349],{"class":201},[100,421,268],{"class":197},[100,423,271],{"class":201},[100,425,426],{"class":300},"asin",[100,428,344],{"class":304},[100,430,431],{"class":197},"Math",[100,433,271],{"class":201},[100,435,436],{"class":300},"sqrt",[100,438,344],{"class":304},[100,440,75],{"class":197},[100,442,443],{"class":304},"))",[100,445,252],{"class":201},[100,447,448],{"class":255}," // 2 * R; R = 6371 km\n",[100,450,451],{"class":102,"line":155},[100,452,453],{"class":201},"};\n",[56,455,456],{},"Now I'm able to submit a GPX file and calculate the total distance and time.\nIt's pretty simple so far, but it works.",[82,458,460],{"id":459},"up-next","Up Next",[56,462,463],{},"Next, I want to allow calculation of other stats that used to be covered by\nEndomondo, such as best 1 km, 1 mi, 5 km, etc. Eventually I'd like to include a\nway to show these segments on a map.",[465,466,467],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":95,"searchDepth":109,"depth":109,"links":469},[470,471],{"id":62,"depth":109,"text":63},{"id":69,"depth":109,"text":70,"children":472},[473,474,475],{"id":84,"depth":115,"text":85},{"id":171,"depth":115,"text":172},{"id":459,"depth":115,"text":460},"2021-07-11T00:00:00.000Z","Missing Endomondo and a Project Idea","md","https://images.unsplash.com/photo-1486218119243-13883505764c?q=80&w=1472&auto=format&fit=crop",{},{"title":22,"description":477},"z95pJw5uU44mBbz5rtKPyXssRSN7h9JLXlgWZe8qePY",[484,486],{"title":18,"path":19,"stem":20,"description":485,"children":-1},"It's a start!",{"title":26,"path":27,"stem":28,"description":487,"children":-1},"Building an Electron App",1772990059429]