[{"data":1,"prerenderedAt":1676},["ShallowReactive",2],{"navigation":3,"/blog/05-gpx-electron-app":50,"/blog/05-gpx-electron-app-surround":1671},[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":26,"body":52,"date":1664,"description":1665,"extension":1666,"image":1667,"meta":1668,"minRead":299,"navigation":652,"path":27,"seo":1669,"stem":28,"__hash__":1670},"blog/blog/05-gpx-electron-app.md",{"type":53,"value":54,"toc":1656},"minimark",[55,59,64,75,80,89,98,102,109,138,141,459,462,987,994,1066,1069,1629,1632,1635,1639,1642,1646,1649,1652],[56,57,58],"p",{},"Brushing up on my Vanilla JS skills and building an Electron app",[60,61,63],"h2",{"id":62},"who-needs-vue","Who Needs Vue?",[56,65,66,67,74],{},"I decided that building this app would be an excellent chance to brush up on my\nVanilla JavaScript skills. I've also been wanting to give\n",[68,69,73],"a",{"href":70,"rel":71},"https://electronjs.org",[72],"nofollow","Electron"," a go. The Electron documentation is nice, and\nit has been a fun process.",[76,77,79],"h3",{"id":78},"ejs-and-bulma","EJS and Bulma",[56,81,82,83,88],{},"While I didn't want to use Vue, I did decide to use ",[68,84,87],{"href":85,"rel":86},"https://ejs.co/",[72],"EJS"," to\nmake it easier split up my pages into components and reuse my banner and\nnavigation. I'm still keeping all of my logic in my JS files, rather than taking\nfull advantage of EJS features. I realize this can technically be done in plain\nJS, but it gets to be a bit clunky. On a related note - I'm amazed that in 2021\nthere still isn't an easy way to do this in plain HTML, CSS, and JavaScript.\nEvery solution I've found involves adding a framework or writing a bunch of HTML\ninside a JavaScript function or file.",[56,90,91,92,97],{},"For my styling I decided to use ",[68,93,96],{"href":94,"rel":95},"https://bulma.io/",[72],"Bulma",". Bulma was a nice\nfit, because it simply provides CSS classes and nothing else. I wanted to write\nall of the JS myself, and didn't want something bulky like Bootstrap.",[60,99,101],{"id":100},"uploading-and-processing-gpx-files","Uploading and Processing GPX Files",[56,103,104,105,108],{},"The first step was to get data from a GPX file. In my\n",[68,106,107],{"href":23},"last post"," I described the basic total distance and\ntotal time calculations. In addition to these, I wanted to get the following\ninformation:",[110,111,112,116,135],"ul",{},[113,114,115],"li",{},"pace",[113,117,118,119],{},"segement calculations for 1 km, 1 mile, 5 km, 10 km, 10 miles, half marathon,\nand full marathon\n",[110,120,121,124,127,129,132],{},[113,122,123],{},"distance",[113,125,126],{},"time",[113,128,115],{},[113,130,131],{},"starting point",[113,133,134],{},"ending point",[113,136,137],{},"real language starting location (not just lat/lon)",[56,139,140],{},"First, I got the basic information and set up a set of arrays to track the time\nand distance.",[142,143,148],"pre",{"className":144,"code":145,"language":146,"meta":147,"style":147},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const eventTime = gpxFileData.gpx.metadata[0].time[0];\nconst trkpts = gpxFileData.gpx.trk[0].trkseg[0].trkpt;\nconst trkptLength = trkpts.length;\nconst startTime = new Date(trkpts[0].time[0]);\nconst finishTime = new Date(trkpts[trkptLength - 1].time[0]);\nconst totalTime = (finishTime - startTime) / 1000;\nconst timeArray = [];\nconst totalTimeArray = [];\nconst latLongArray = [];\nconst distanceArray = [];\nlet totalDistance = 0;\nconst totalDistanceArray = [];\nlet timeCounter = 0;\n","js","",[149,150,151,201,242,262,297,332,358,373,387,401,415,431,445],"code",{"__ignoreMap":147},[152,153,156,160,164,168,171,174,177,179,182,186,189,191,194,196,198],"span",{"class":154,"line":155},"line",1,[152,157,159],{"class":158},"spNyl","const",[152,161,163],{"class":162},"sTEyZ"," eventTime ",[152,165,167],{"class":166},"sMK4o","=",[152,169,170],{"class":162}," gpxFileData",[152,172,173],{"class":166},".",[152,175,176],{"class":162},"gpx",[152,178,173],{"class":166},[152,180,181],{"class":162},"metadata[",[152,183,185],{"class":184},"sbssI","0",[152,187,188],{"class":162},"]",[152,190,173],{"class":166},[152,192,193],{"class":162},"time[",[152,195,185],{"class":184},[152,197,188],{"class":162},[152,199,200],{"class":166},";\n",[152,202,204,206,209,211,213,215,217,219,222,224,226,228,231,233,235,237,240],{"class":154,"line":203},2,[152,205,159],{"class":158},[152,207,208],{"class":162}," trkpts ",[152,210,167],{"class":166},[152,212,170],{"class":162},[152,214,173],{"class":166},[152,216,176],{"class":162},[152,218,173],{"class":166},[152,220,221],{"class":162},"trk[",[152,223,185],{"class":184},[152,225,188],{"class":162},[152,227,173],{"class":166},[152,229,230],{"class":162},"trkseg[",[152,232,185],{"class":184},[152,234,188],{"class":162},[152,236,173],{"class":166},[152,238,239],{"class":162},"trkpt",[152,241,200],{"class":166},[152,243,245,247,250,252,255,257,260],{"class":154,"line":244},3,[152,246,159],{"class":158},[152,248,249],{"class":162}," trkptLength ",[152,251,167],{"class":166},[152,253,254],{"class":162}," trkpts",[152,256,173],{"class":166},[152,258,259],{"class":162},"length",[152,261,200],{"class":166},[152,263,265,267,270,272,275,279,282,284,286,288,290,292,295],{"class":154,"line":264},4,[152,266,159],{"class":158},[152,268,269],{"class":162}," startTime ",[152,271,167],{"class":166},[152,273,274],{"class":166}," new",[152,276,278],{"class":277},"s2Zo4"," Date",[152,280,281],{"class":162},"(trkpts[",[152,283,185],{"class":184},[152,285,188],{"class":162},[152,287,173],{"class":166},[152,289,193],{"class":162},[152,291,185],{"class":184},[152,293,294],{"class":162},"])",[152,296,200],{"class":166},[152,298,300,302,305,307,309,311,314,317,320,322,324,326,328,330],{"class":154,"line":299},5,[152,301,159],{"class":158},[152,303,304],{"class":162}," finishTime ",[152,306,167],{"class":166},[152,308,274],{"class":166},[152,310,278],{"class":277},[152,312,313],{"class":162},"(trkpts[trkptLength ",[152,315,316],{"class":166},"-",[152,318,319],{"class":184}," 1",[152,321,188],{"class":162},[152,323,173],{"class":166},[152,325,193],{"class":162},[152,327,185],{"class":184},[152,329,294],{"class":162},[152,331,200],{"class":166},[152,333,335,337,340,342,345,347,350,353,356],{"class":154,"line":334},6,[152,336,159],{"class":158},[152,338,339],{"class":162}," totalTime ",[152,341,167],{"class":166},[152,343,344],{"class":162}," (finishTime ",[152,346,316],{"class":166},[152,348,349],{"class":162}," startTime) ",[152,351,352],{"class":166},"/",[152,354,355],{"class":184}," 1000",[152,357,200],{"class":166},[152,359,361,363,366,368,371],{"class":154,"line":360},7,[152,362,159],{"class":158},[152,364,365],{"class":162}," timeArray ",[152,367,167],{"class":166},[152,369,370],{"class":162}," []",[152,372,200],{"class":166},[152,374,376,378,381,383,385],{"class":154,"line":375},8,[152,377,159],{"class":158},[152,379,380],{"class":162}," totalTimeArray ",[152,382,167],{"class":166},[152,384,370],{"class":162},[152,386,200],{"class":166},[152,388,390,392,395,397,399],{"class":154,"line":389},9,[152,391,159],{"class":158},[152,393,394],{"class":162}," latLongArray ",[152,396,167],{"class":166},[152,398,370],{"class":162},[152,400,200],{"class":166},[152,402,404,406,409,411,413],{"class":154,"line":403},10,[152,405,159],{"class":158},[152,407,408],{"class":162}," distanceArray ",[152,410,167],{"class":166},[152,412,370],{"class":162},[152,414,200],{"class":166},[152,416,418,421,424,426,429],{"class":154,"line":417},11,[152,419,420],{"class":158},"let",[152,422,423],{"class":162}," totalDistance ",[152,425,167],{"class":166},[152,427,428],{"class":184}," 0",[152,430,200],{"class":166},[152,432,434,436,439,441,443],{"class":154,"line":433},12,[152,435,159],{"class":158},[152,437,438],{"class":162}," totalDistanceArray ",[152,440,167],{"class":166},[152,442,370],{"class":162},[152,444,200],{"class":166},[152,446,448,450,453,455,457],{"class":154,"line":447},13,[152,449,420],{"class":158},[152,451,452],{"class":162}," timeCounter ",[152,454,167],{"class":166},[152,456,428],{"class":184},[152,458,200],{"class":166},[56,460,461],{},"Then I processed the GPX data and built the arrays",[142,463,465],{"className":144,"code":464,"language":146,"meta":147,"style":147},"// build time and total time arrays\nfor (let i = 1; i \u003C trkptLength; i++) {\n    let segmentTime =\n        new Date(trkpts[i].time[0]) - new Date(trkpts[i - 1].time[0]);\n    timeArray.push(segmentTime);\n    timeCounter += segmentTime;\n    totalTimeArray.push(timeCounter);\n}\n\n// loop through trackpoints\nfor (let i = 1; i \u003C trkptLength; i++) {\n    let lat1 = trkpts[i - 1].$.lat;\n    let lon1 = trkpts[i - 1].$.lon;\n    let lat2 = trkpts[i].$.lat;\n    let lon2 = trkpts[i].$.lon;\n    let segmentDistance = distance(lat1, lon1, lat2, lon2);\n\n    // distanceArray includes distance for each segment\n    distanceArray.push(segmentDistance);\n\n    // totalDistanceArray includes running total\n    totalDistance += segmentDistance;\n    totalDistanceArray.push(totalDistance);\n\n    // latLongArray includes pairs of coordinates\n    latLongArray.push([trkpts[0].$.lat, trkpts[0].$.lon]);\n}\n",[149,466,467,473,516,527,593,613,625,643,648,654,659,691,725,757,785,813,848,853,859,878,883,889,901,920,925,931,982],{"__ignoreMap":147},[152,468,469],{"class":154,"line":155},[152,470,472],{"class":471},"sHwdD","// build time and total time arrays\n",[152,474,475,479,482,484,487,489,491,494,496,499,502,504,507,510,513],{"class":154,"line":203},[152,476,478],{"class":477},"s7zQu","for",[152,480,481],{"class":162}," (",[152,483,420],{"class":158},[152,485,486],{"class":162}," i ",[152,488,167],{"class":166},[152,490,319],{"class":184},[152,492,493],{"class":166},";",[152,495,486],{"class":162},[152,497,498],{"class":166},"\u003C",[152,500,501],{"class":162}," trkptLength",[152,503,493],{"class":166},[152,505,506],{"class":162}," i",[152,508,509],{"class":166},"++",[152,511,512],{"class":162},") ",[152,514,515],{"class":166},"{\n",[152,517,518,521,524],{"class":154,"line":244},[152,519,520],{"class":158},"    let",[152,522,523],{"class":162}," segmentTime",[152,525,526],{"class":166}," =\n",[152,528,529,532,534,538,541,544,547,549,551,553,555,557,560,562,564,566,568,570,572,574,577,579,581,583,585,587,589,591],{"class":154,"line":264},[152,530,531],{"class":166},"        new",[152,533,278],{"class":277},[152,535,537],{"class":536},"swJcz","(",[152,539,540],{"class":162},"trkpts",[152,542,543],{"class":536},"[",[152,545,546],{"class":162},"i",[152,548,188],{"class":536},[152,550,173],{"class":166},[152,552,126],{"class":162},[152,554,543],{"class":536},[152,556,185],{"class":184},[152,558,559],{"class":536},"]) ",[152,561,316],{"class":166},[152,563,274],{"class":166},[152,565,278],{"class":277},[152,567,537],{"class":536},[152,569,540],{"class":162},[152,571,543],{"class":536},[152,573,546],{"class":162},[152,575,576],{"class":166}," -",[152,578,319],{"class":184},[152,580,188],{"class":536},[152,582,173],{"class":166},[152,584,126],{"class":162},[152,586,543],{"class":536},[152,588,185],{"class":184},[152,590,294],{"class":536},[152,592,200],{"class":166},[152,594,595,598,600,603,605,608,611],{"class":154,"line":299},[152,596,597],{"class":162},"    timeArray",[152,599,173],{"class":166},[152,601,602],{"class":277},"push",[152,604,537],{"class":536},[152,606,607],{"class":162},"segmentTime",[152,609,610],{"class":536},")",[152,612,200],{"class":166},[152,614,615,618,621,623],{"class":154,"line":334},[152,616,617],{"class":162},"    timeCounter",[152,619,620],{"class":166}," +=",[152,622,523],{"class":162},[152,624,200],{"class":166},[152,626,627,630,632,634,636,639,641],{"class":154,"line":360},[152,628,629],{"class":162},"    totalTimeArray",[152,631,173],{"class":166},[152,633,602],{"class":277},[152,635,537],{"class":536},[152,637,638],{"class":162},"timeCounter",[152,640,610],{"class":536},[152,642,200],{"class":166},[152,644,645],{"class":154,"line":375},[152,646,647],{"class":166},"}\n",[152,649,650],{"class":154,"line":389},[152,651,653],{"emptyLinePlaceholder":652},true,"\n",[152,655,656],{"class":154,"line":403},[152,657,658],{"class":471},"// loop through trackpoints\n",[152,660,661,663,665,667,669,671,673,675,677,679,681,683,685,687,689],{"class":154,"line":417},[152,662,478],{"class":477},[152,664,481],{"class":162},[152,666,420],{"class":158},[152,668,486],{"class":162},[152,670,167],{"class":166},[152,672,319],{"class":184},[152,674,493],{"class":166},[152,676,486],{"class":162},[152,678,498],{"class":166},[152,680,501],{"class":162},[152,682,493],{"class":166},[152,684,506],{"class":162},[152,686,509],{"class":166},[152,688,512],{"class":162},[152,690,515],{"class":166},[152,692,693,695,698,701,703,705,707,709,711,713,715,718,720,723],{"class":154,"line":433},[152,694,520],{"class":158},[152,696,697],{"class":162}," lat1",[152,699,700],{"class":166}," =",[152,702,254],{"class":162},[152,704,543],{"class":536},[152,706,546],{"class":162},[152,708,576],{"class":166},[152,710,319],{"class":184},[152,712,188],{"class":536},[152,714,173],{"class":166},[152,716,717],{"class":162},"$",[152,719,173],{"class":166},[152,721,722],{"class":162},"lat",[152,724,200],{"class":166},[152,726,727,729,732,734,736,738,740,742,744,746,748,750,752,755],{"class":154,"line":447},[152,728,520],{"class":158},[152,730,731],{"class":162}," lon1",[152,733,700],{"class":166},[152,735,254],{"class":162},[152,737,543],{"class":536},[152,739,546],{"class":162},[152,741,576],{"class":166},[152,743,319],{"class":184},[152,745,188],{"class":536},[152,747,173],{"class":166},[152,749,717],{"class":162},[152,751,173],{"class":166},[152,753,754],{"class":162},"lon",[152,756,200],{"class":166},[152,758,760,762,765,767,769,771,773,775,777,779,781,783],{"class":154,"line":759},14,[152,761,520],{"class":158},[152,763,764],{"class":162}," lat2",[152,766,700],{"class":166},[152,768,254],{"class":162},[152,770,543],{"class":536},[152,772,546],{"class":162},[152,774,188],{"class":536},[152,776,173],{"class":166},[152,778,717],{"class":162},[152,780,173],{"class":166},[152,782,722],{"class":162},[152,784,200],{"class":166},[152,786,788,790,793,795,797,799,801,803,805,807,809,811],{"class":154,"line":787},15,[152,789,520],{"class":158},[152,791,792],{"class":162}," lon2",[152,794,700],{"class":166},[152,796,254],{"class":162},[152,798,543],{"class":536},[152,800,546],{"class":162},[152,802,188],{"class":536},[152,804,173],{"class":166},[152,806,717],{"class":162},[152,808,173],{"class":166},[152,810,754],{"class":162},[152,812,200],{"class":166},[152,814,816,818,821,823,826,828,831,834,836,838,840,842,844,846],{"class":154,"line":815},16,[152,817,520],{"class":158},[152,819,820],{"class":162}," segmentDistance",[152,822,700],{"class":166},[152,824,825],{"class":277}," distance",[152,827,537],{"class":536},[152,829,830],{"class":162},"lat1",[152,832,833],{"class":166},",",[152,835,731],{"class":162},[152,837,833],{"class":166},[152,839,764],{"class":162},[152,841,833],{"class":166},[152,843,792],{"class":162},[152,845,610],{"class":536},[152,847,200],{"class":166},[152,849,851],{"class":154,"line":850},17,[152,852,653],{"emptyLinePlaceholder":652},[152,854,856],{"class":154,"line":855},18,[152,857,858],{"class":471},"    // distanceArray includes distance for each segment\n",[152,860,862,865,867,869,871,874,876],{"class":154,"line":861},19,[152,863,864],{"class":162},"    distanceArray",[152,866,173],{"class":166},[152,868,602],{"class":277},[152,870,537],{"class":536},[152,872,873],{"class":162},"segmentDistance",[152,875,610],{"class":536},[152,877,200],{"class":166},[152,879,881],{"class":154,"line":880},20,[152,882,653],{"emptyLinePlaceholder":652},[152,884,886],{"class":154,"line":885},21,[152,887,888],{"class":471},"    // totalDistanceArray includes running total\n",[152,890,892,895,897,899],{"class":154,"line":891},22,[152,893,894],{"class":162},"    totalDistance",[152,896,620],{"class":166},[152,898,820],{"class":162},[152,900,200],{"class":166},[152,902,904,907,909,911,913,916,918],{"class":154,"line":903},23,[152,905,906],{"class":162},"    totalDistanceArray",[152,908,173],{"class":166},[152,910,602],{"class":277},[152,912,537],{"class":536},[152,914,915],{"class":162},"totalDistance",[152,917,610],{"class":536},[152,919,200],{"class":166},[152,921,923],{"class":154,"line":922},24,[152,924,653],{"emptyLinePlaceholder":652},[152,926,928],{"class":154,"line":927},25,[152,929,930],{"class":471},"    // latLongArray includes pairs of coordinates\n",[152,932,934,937,939,941,944,946,948,950,952,954,956,958,960,962,964,966,968,970,972,974,976,978,980],{"class":154,"line":933},26,[152,935,936],{"class":162},"    latLongArray",[152,938,173],{"class":166},[152,940,602],{"class":277},[152,942,943],{"class":536},"([",[152,945,540],{"class":162},[152,947,543],{"class":536},[152,949,185],{"class":184},[152,951,188],{"class":536},[152,953,173],{"class":166},[152,955,717],{"class":162},[152,957,173],{"class":166},[152,959,722],{"class":162},[152,961,833],{"class":166},[152,963,254],{"class":162},[152,965,543],{"class":536},[152,967,185],{"class":184},[152,969,188],{"class":536},[152,971,173],{"class":166},[152,973,717],{"class":162},[152,975,173],{"class":166},[152,977,754],{"class":162},[152,979,294],{"class":536},[152,981,200],{"class":166},[152,983,985],{"class":154,"line":984},27,[152,986,647],{"class":166},[56,988,989,990,993],{},"Next I used the initial coordinates for my ",[149,991,992],{},"location"," information",[142,995,997],{"className":144,"code":996,"language":146,"meta":147,"style":147},"// add the initial coordinates\nlatLongArray.push([trkpts[0].$.lat, trkpts[0].$.lon]);\nlet startingLocation = latLongArray[0];\n",[149,998,999,1004,1048],{"__ignoreMap":147},[152,1000,1001],{"class":154,"line":155},[152,1002,1003],{"class":471},"// add the initial coordinates\n",[152,1005,1006,1009,1011,1013,1016,1018,1020,1022,1024,1026,1028,1030,1033,1035,1037,1039,1041,1043,1046],{"class":154,"line":203},[152,1007,1008],{"class":162},"latLongArray",[152,1010,173],{"class":166},[152,1012,602],{"class":277},[152,1014,1015],{"class":162},"([trkpts[",[152,1017,185],{"class":184},[152,1019,188],{"class":162},[152,1021,173],{"class":166},[152,1023,717],{"class":162},[152,1025,173],{"class":166},[152,1027,722],{"class":162},[152,1029,833],{"class":166},[152,1031,1032],{"class":162}," trkpts[",[152,1034,185],{"class":184},[152,1036,188],{"class":162},[152,1038,173],{"class":166},[152,1040,717],{"class":162},[152,1042,173],{"class":166},[152,1044,1045],{"class":162},"lon])",[152,1047,200],{"class":166},[152,1049,1050,1052,1055,1057,1060,1062,1064],{"class":154,"line":244},[152,1051,420],{"class":158},[152,1053,1054],{"class":162}," startingLocation ",[152,1056,167],{"class":166},[152,1058,1059],{"class":162}," latLongArray[",[152,1061,185],{"class":184},[152,1063,188],{"class":162},[152,1065,200],{"class":166},[56,1067,1068],{},"Finally, I built a function that would create a sliding window of a given length\n(1 km, 5 km, etc) and look for the fastest segment:",[142,1070,1072],{"className":144,"code":1071,"language":146,"meta":147,"style":147},"const getFastestSegmentData = (segmentName, distanceMin, distanceMax) => {\n    let fastestSegmentData = { rawTime: 9999999999 };\n    let trackPointValues = parseInt(distanceMin * 50); // skip points \u003C\u003C\u003C desired length\n    for (let i = 0; i \u003C trkptLength; i++) {\n        for (let j = i + trackPointValues; j \u003C trkptLength; j++) {\n            let distanceSeg = totalDistanceArray[j] - totalDistanceArray[i];\n            if (distanceSeg > distanceMin && distanceSeg \u003C distanceMax) {\n                let timeSeg = totalTimeArray[j] - totalTimeArray[i];\n                let newPace = timeSeg / distanceSeg;\n                if (newPace \u003C fastestSegmentData.rawTime) {\n                    fastestSegmentData = {\n                        segmentMin: segmentName,\n                        startTime: totalTimeArray[i] / 1000,\n                        endTime: totalTimeArray[j] / 1000,\n                        startPoint: totalDistanceArray[i],\n                        endPoint: totalDistanceArray[j],\n                        time: timeSeg / 1000,\n                        pace: newPace / 1000,\n                        distance: distanceSeg.toFixed(3),\n                        timeArray: totalTimeArray.slice(i, j + 1),\n                        distanceArray: totalDistanceArray.slice(i, j + 1),\n                        rawTime: newPace,\n                    };\n                }\n            }\n        }\n    }\n    return fastestSegmentData;\n};\n",[149,1073,1074,1107,1131,1161,1195,1234,1267,1295,1326,1344,1367,1376,1389,1410,1431,1448,1465,1480,1495,1518,1548,1577,1588,1593,1598,1603,1608,1613,1623],{"__ignoreMap":147},[152,1075,1076,1078,1081,1083,1085,1089,1091,1094,1096,1099,1101,1104],{"class":154,"line":155},[152,1077,159],{"class":158},[152,1079,1080],{"class":162}," getFastestSegmentData ",[152,1082,167],{"class":166},[152,1084,481],{"class":166},[152,1086,1088],{"class":1087},"sHdIc","segmentName",[152,1090,833],{"class":166},[152,1092,1093],{"class":1087}," distanceMin",[152,1095,833],{"class":166},[152,1097,1098],{"class":1087}," distanceMax",[152,1100,610],{"class":166},[152,1102,1103],{"class":158}," =>",[152,1105,1106],{"class":166}," {\n",[152,1108,1109,1111,1114,1116,1119,1122,1125,1128],{"class":154,"line":203},[152,1110,520],{"class":158},[152,1112,1113],{"class":162}," fastestSegmentData",[152,1115,700],{"class":166},[152,1117,1118],{"class":166}," {",[152,1120,1121],{"class":536}," rawTime",[152,1123,1124],{"class":166},":",[152,1126,1127],{"class":184}," 9999999999",[152,1129,1130],{"class":166}," };\n",[152,1132,1133,1135,1138,1140,1143,1145,1148,1151,1154,1156,1158],{"class":154,"line":244},[152,1134,520],{"class":158},[152,1136,1137],{"class":162}," trackPointValues",[152,1139,700],{"class":166},[152,1141,1142],{"class":277}," parseInt",[152,1144,537],{"class":536},[152,1146,1147],{"class":162},"distanceMin",[152,1149,1150],{"class":166}," *",[152,1152,1153],{"class":184}," 50",[152,1155,610],{"class":536},[152,1157,493],{"class":166},[152,1159,1160],{"class":471}," // skip points \u003C\u003C\u003C desired length\n",[152,1162,1163,1166,1168,1170,1172,1174,1176,1178,1180,1183,1185,1187,1189,1191,1193],{"class":154,"line":264},[152,1164,1165],{"class":477},"    for",[152,1167,481],{"class":536},[152,1169,420],{"class":158},[152,1171,506],{"class":162},[152,1173,700],{"class":166},[152,1175,428],{"class":184},[152,1177,493],{"class":166},[152,1179,506],{"class":162},[152,1181,1182],{"class":166}," \u003C",[152,1184,501],{"class":162},[152,1186,493],{"class":166},[152,1188,506],{"class":162},[152,1190,509],{"class":166},[152,1192,512],{"class":536},[152,1194,515],{"class":166},[152,1196,1197,1200,1202,1204,1207,1209,1211,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232],{"class":154,"line":299},[152,1198,1199],{"class":477},"        for",[152,1201,481],{"class":536},[152,1203,420],{"class":158},[152,1205,1206],{"class":162}," j",[152,1208,700],{"class":166},[152,1210,506],{"class":162},[152,1212,1213],{"class":166}," +",[152,1215,1137],{"class":162},[152,1217,493],{"class":166},[152,1219,1206],{"class":162},[152,1221,1182],{"class":166},[152,1223,501],{"class":162},[152,1225,493],{"class":166},[152,1227,1206],{"class":162},[152,1229,509],{"class":166},[152,1231,512],{"class":536},[152,1233,515],{"class":166},[152,1235,1236,1239,1242,1244,1247,1249,1252,1255,1257,1259,1261,1263,1265],{"class":154,"line":334},[152,1237,1238],{"class":158},"            let",[152,1240,1241],{"class":162}," distanceSeg",[152,1243,700],{"class":166},[152,1245,1246],{"class":162}," totalDistanceArray",[152,1248,543],{"class":536},[152,1250,1251],{"class":162},"j",[152,1253,1254],{"class":536},"] ",[152,1256,316],{"class":166},[152,1258,1246],{"class":162},[152,1260,543],{"class":536},[152,1262,546],{"class":162},[152,1264,188],{"class":536},[152,1266,200],{"class":166},[152,1268,1269,1272,1274,1277,1280,1282,1285,1287,1289,1291,1293],{"class":154,"line":360},[152,1270,1271],{"class":477},"            if",[152,1273,481],{"class":536},[152,1275,1276],{"class":162},"distanceSeg",[152,1278,1279],{"class":166}," >",[152,1281,1093],{"class":162},[152,1283,1284],{"class":166}," &&",[152,1286,1241],{"class":162},[152,1288,1182],{"class":166},[152,1290,1098],{"class":162},[152,1292,512],{"class":536},[152,1294,515],{"class":166},[152,1296,1297,1300,1303,1305,1308,1310,1312,1314,1316,1318,1320,1322,1324],{"class":154,"line":375},[152,1298,1299],{"class":158},"                let",[152,1301,1302],{"class":162}," timeSeg",[152,1304,700],{"class":166},[152,1306,1307],{"class":162}," totalTimeArray",[152,1309,543],{"class":536},[152,1311,1251],{"class":162},[152,1313,1254],{"class":536},[152,1315,316],{"class":166},[152,1317,1307],{"class":162},[152,1319,543],{"class":536},[152,1321,546],{"class":162},[152,1323,188],{"class":536},[152,1325,200],{"class":166},[152,1327,1328,1330,1333,1335,1337,1340,1342],{"class":154,"line":389},[152,1329,1299],{"class":158},[152,1331,1332],{"class":162}," newPace",[152,1334,700],{"class":166},[152,1336,1302],{"class":162},[152,1338,1339],{"class":166}," /",[152,1341,1241],{"class":162},[152,1343,200],{"class":166},[152,1345,1346,1349,1351,1354,1356,1358,1360,1363,1365],{"class":154,"line":403},[152,1347,1348],{"class":477},"                if",[152,1350,481],{"class":536},[152,1352,1353],{"class":162},"newPace",[152,1355,1182],{"class":166},[152,1357,1113],{"class":162},[152,1359,173],{"class":166},[152,1361,1362],{"class":162},"rawTime",[152,1364,512],{"class":536},[152,1366,515],{"class":166},[152,1368,1369,1372,1374],{"class":154,"line":417},[152,1370,1371],{"class":162},"                    fastestSegmentData",[152,1373,700],{"class":166},[152,1375,1106],{"class":166},[152,1377,1378,1381,1383,1386],{"class":154,"line":433},[152,1379,1380],{"class":536},"                        segmentMin",[152,1382,1124],{"class":166},[152,1384,1385],{"class":162}," segmentName",[152,1387,1388],{"class":166},",\n",[152,1390,1391,1394,1396,1398,1400,1402,1404,1406,1408],{"class":154,"line":447},[152,1392,1393],{"class":536},"                        startTime",[152,1395,1124],{"class":166},[152,1397,1307],{"class":162},[152,1399,543],{"class":536},[152,1401,546],{"class":162},[152,1403,1254],{"class":536},[152,1405,352],{"class":166},[152,1407,355],{"class":184},[152,1409,1388],{"class":166},[152,1411,1412,1415,1417,1419,1421,1423,1425,1427,1429],{"class":154,"line":759},[152,1413,1414],{"class":536},"                        endTime",[152,1416,1124],{"class":166},[152,1418,1307],{"class":162},[152,1420,543],{"class":536},[152,1422,1251],{"class":162},[152,1424,1254],{"class":536},[152,1426,352],{"class":166},[152,1428,355],{"class":184},[152,1430,1388],{"class":166},[152,1432,1433,1436,1438,1440,1442,1444,1446],{"class":154,"line":787},[152,1434,1435],{"class":536},"                        startPoint",[152,1437,1124],{"class":166},[152,1439,1246],{"class":162},[152,1441,543],{"class":536},[152,1443,546],{"class":162},[152,1445,188],{"class":536},[152,1447,1388],{"class":166},[152,1449,1450,1453,1455,1457,1459,1461,1463],{"class":154,"line":815},[152,1451,1452],{"class":536},"                        endPoint",[152,1454,1124],{"class":166},[152,1456,1246],{"class":162},[152,1458,543],{"class":536},[152,1460,1251],{"class":162},[152,1462,188],{"class":536},[152,1464,1388],{"class":166},[152,1466,1467,1470,1472,1474,1476,1478],{"class":154,"line":850},[152,1468,1469],{"class":536},"                        time",[152,1471,1124],{"class":166},[152,1473,1302],{"class":162},[152,1475,1339],{"class":166},[152,1477,355],{"class":184},[152,1479,1388],{"class":166},[152,1481,1482,1485,1487,1489,1491,1493],{"class":154,"line":855},[152,1483,1484],{"class":536},"                        pace",[152,1486,1124],{"class":166},[152,1488,1332],{"class":162},[152,1490,1339],{"class":166},[152,1492,355],{"class":184},[152,1494,1388],{"class":166},[152,1496,1497,1500,1502,1504,1506,1509,1511,1514,1516],{"class":154,"line":861},[152,1498,1499],{"class":536},"                        distance",[152,1501,1124],{"class":166},[152,1503,1241],{"class":162},[152,1505,173],{"class":166},[152,1507,1508],{"class":277},"toFixed",[152,1510,537],{"class":536},[152,1512,1513],{"class":184},"3",[152,1515,610],{"class":536},[152,1517,1388],{"class":166},[152,1519,1520,1523,1525,1527,1529,1532,1534,1536,1538,1540,1542,1544,1546],{"class":154,"line":880},[152,1521,1522],{"class":536},"                        timeArray",[152,1524,1124],{"class":166},[152,1526,1307],{"class":162},[152,1528,173],{"class":166},[152,1530,1531],{"class":277},"slice",[152,1533,537],{"class":536},[152,1535,546],{"class":162},[152,1537,833],{"class":166},[152,1539,1206],{"class":162},[152,1541,1213],{"class":166},[152,1543,319],{"class":184},[152,1545,610],{"class":536},[152,1547,1388],{"class":166},[152,1549,1550,1553,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575],{"class":154,"line":885},[152,1551,1552],{"class":536},"                        distanceArray",[152,1554,1124],{"class":166},[152,1556,1246],{"class":162},[152,1558,173],{"class":166},[152,1560,1531],{"class":277},[152,1562,537],{"class":536},[152,1564,546],{"class":162},[152,1566,833],{"class":166},[152,1568,1206],{"class":162},[152,1570,1213],{"class":166},[152,1572,319],{"class":184},[152,1574,610],{"class":536},[152,1576,1388],{"class":166},[152,1578,1579,1582,1584,1586],{"class":154,"line":891},[152,1580,1581],{"class":536},"                        rawTime",[152,1583,1124],{"class":166},[152,1585,1332],{"class":162},[152,1587,1388],{"class":166},[152,1589,1590],{"class":154,"line":903},[152,1591,1592],{"class":166},"                    };\n",[152,1594,1595],{"class":154,"line":922},[152,1596,1597],{"class":166},"                }\n",[152,1599,1600],{"class":154,"line":927},[152,1601,1602],{"class":166},"            }\n",[152,1604,1605],{"class":154,"line":933},[152,1606,1607],{"class":166},"        }\n",[152,1609,1610],{"class":154,"line":984},[152,1611,1612],{"class":166},"    }\n",[152,1614,1616,1619,1621],{"class":154,"line":1615},28,[152,1617,1618],{"class":477},"    return",[152,1620,1113],{"class":162},[152,1622,200],{"class":166},[152,1624,1626],{"class":154,"line":1625},29,[152,1627,1628],{"class":166},"};\n",[56,1630,1631],{},"I added a call to the PositionStack API to get a string of the starting\nlocation, then added this to each event.",[56,1633,1634],{},"I then added the ability to add data to a SQLite database. I intially went with\nFirebase when I was considering a web version of the app. After I settled on\nElectron, I thought a local SQLite database would be better.",[60,1636,1638],{"id":1637},"accessing-data","Accessing Data",[56,1640,1641],{},"So far I've added functionality for searching the database based on event type\n(run, walk, or mix), starting and ending dates, and a total distance range.",[60,1643,1645],{"id":1644},"whats-next","What's Next?",[56,1647,1648],{},"It's been fun working with Electron! I know I didn't cover much of the actual\nElectron work here, but honestly that is because it is so easy. I'm sure I'll\nget deeper into Electron settings as I go, but so far it has been quite easy and\nstraightforward.",[56,1650,1651],{},"In the meantime, I'm still working on Flutter and Dart, and I still plan on\ndoing more with that in the future. I'm a huge fan of Flutter, but I think\ncontinuing my JavaScript related work and improving my C# skills are best for\nnow.",[1653,1654,1655],"style",{},"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":147,"searchDepth":203,"depth":203,"links":1657},[1658,1661,1662,1663],{"id":62,"depth":203,"text":63,"children":1659},[1660],{"id":78,"depth":244,"text":79},{"id":100,"depth":203,"text":101},{"id":1637,"depth":203,"text":1638},{"id":1644,"depth":203,"text":1645},"2021-08-07T00:00:00.000Z","Building an Electron App","md","https://images.unsplash.com/photo-1555066931-4365d14bab8c?q=80&w=1470&auto=format&fit=crop",{},{"title":26,"description":1665},"1hrTWmUElB2VN-ELjYbtxvSxRRbQNS7ApFC6JTNbrFM",[1672,1674],{"title":22,"path":23,"stem":24,"description":1673,"children":-1},"Missing Endomondo and a Project Idea",{"title":30,"path":31,"stem":32,"description":1675,"children":-1},"Learning Ember for work, rebuilding GPX app with Vue and TypeScript",1772990059429]