{"id":712,"date":"2008-09-19T17:40:44","date_gmt":"2008-09-19T15:40:44","guid":{"rendered":"http:\/\/webbservern.se\/~jonas\/wordpress\/?p=712"},"modified":"2008-09-19T17:40:44","modified_gmt":"2008-09-19T15:40:44","slug":"mer-harj-om-pytrainer","status":"publish","type":"post","link":"https:\/\/webbservern.se\/~jonas\/wordpress\/?p=712","title":{"rendered":"Mer h\u00e4rj om pyTrainer"},"content":{"rendered":"<p>Det finns ett plugin till pyTrainer som g\u00f6r att man kan publicera resultatet av sina anstr\u00e4ningar (n\u00e5ja, en del iaf) i sin blogg. Dock var det lite si \u00e5 s\u00e5 med vissa detaljer s\u00e5 det funkade inte alls. Efter lite fulhackande i Python verkar det dock funka nu (se f\u00f6reg\u00e5ende inl\u00e4gg). Kanske detta \u00e4r den motivation som kr\u00e4vs f\u00f6r att jag ska b\u00f6rja anv\u00e4nda min Forerunner mer frekvent?<\/p>\n<p><strong>Till\u00e4gg l\u00f6rdagen den 20:e september<\/strong><br \/>\nF\u00f6r den som f\u00f6rs\u00f6ker f\u00e5 ordning p\u00e5 wordpress-till\u00e4gget till pyTrainer kanske det kan vara v\u00e4rdefullt med n\u00e5gra tips. F\u00f6r den som \u00e4r totalt ointresserad av just pyTrainer kanske f\u00f6rklaringen nedan kan tj\u00e4nstg\u00f6ra som beskrivning i hur det kan fungera n\u00e4r man handskas med strulande mjukvara.<\/p>\n<p>Jag k\u00f6r pyTrainer 1.5.0.0.1 och efter att jag aktiverat och konfigurerat &#8220;Pytrainer wordpress extension&#8221; blev mina f\u00f6rs\u00f6k fruktl\u00f6sa. Det f\u00f6rsta jag g\u00f6r i s\u00e5na l\u00e4gen \u00e4r f\u00f6rst\u00e5s att se vad som skrivs ut i terminalen. Kanske kan eventuella felmeddelanden ge en hint om vad som g\u00e5r snett?<\/p>\n<p>Detta \u00e4r vad som spottades ut:<br \/>\n<code><br \/>\n File \"gpx.py\", line 39, in __init__<br \/>\n  File \"gpx.py\", line 75, in _getValues<br \/>\n  File \"\/usr\/lib\/python2.5\/xml\/dom\/minidom.py\", line 1915, in parse<br \/>\n    return expatbuilder.parse(file)<br \/>\n  File \"\/usr\/lib\/python2.5\/xml\/dom\/expatbuilder.py\", line 924, in parse<br \/>\n    result = builder.parseFile(fp)<br \/>\n  File \"\/usr\/lib\/python2.5\/xml\/dom\/expatbuilder.py\", line 207, in parseFile<br \/>\n    parser.Parse(buffer, 0)<br \/>\nxml.parsers.expat.ExpatError: unbound prefix: line 14, column 12<br \/>\n<\/code><\/p>\n<p>Detta sa mig inte mer \u00e4n att vi verkar ha problem med en XML-struktur som ska parsas (tolkas). Som synes finns information om vilka klasser, metoder och radnummer som \u00e4r problematiska och efter lite rotande i gpx.py i (\/usr\/lib\/python2.5\/site-packages\/pytrainer\/lib\/) var det tydligt att xml-filen producerades av gpsbabel, sparades som \/tmp\/gpx.txt och f\u00f6rs\u00f6ktes tolkas av <a href=\"http:\/\/www.python.org\/doc\/current\/lib\/module-xml.dom.minidom.html\">minidom<\/a>.<\/p>\n<p>Efter att ha spanat i xml-filen (som inte togs bort utan l\u00e5g kvar i tmp-katalogen) gick det \u00e4ven att f\u00f6rst\u00e5 vad minidom hade problem med. P\u00e5 rad 14, som det stod i stacktracen ovan, refereras till ett prefix &#8220;gpxdata&#8221; som \u00e4r ok\u00e4nt f\u00f6r minidom.<\/p>\n<p>Det borde g\u00e5 att \u00e4ndra den mall som gpsbabel anv\u00e4nder som utformat men efter att ha rotat lite la jag ner den m\u00f6jligeten och best\u00e4mde mig f\u00f6r en pragmatisk l\u00f6sning, att helt enkelt justera filen, och l\u00e4gga till namnrymden gpxdata, innan vi matar minidom med den.<\/p>\n<p>Metoden _getValues, runt rad 74 i <a href=\"wp-content\/uploads\/2008\/09\/gpx.py\">gpx.py<\/a> b\u00f6rjar numera enligt nedan (observera radnumren l\u00e4ngst till v\u00e4nster och att de f\u00f6r Python s\u00e5 viktiga &#8220;indragen&#8221; har f\u00f6rvanskats ):<\/p>\n<p><code><br \/>\n    74\t\tdef _getValues(self):<br \/>\n    75\t\t\tif not os.path.isfile(self.filename):<br \/>\n    76\t\t\t\treturn None<br \/>\n    77<br \/>\n    78\t\t\t# Test if file already contains gpxdata attribute<br \/>\n    79\t\t\tfound = False<br \/>\n    80\t\t\tfor line in fileinput.FileInput(self.filename,inplace=1):<br \/>\n    81\t\t\t\tif \"xmlns:gpxdata\" in line:<br \/>\n    82\t\t\t\t\tfound = True<br \/>\n    83\t\t\t\tprint line.rstrip('n');<br \/>\n    84<br \/>\n    85\t\t\t# If file don't has gpxdata attribute: add namespace<br \/>\n    86\t\t\tif not found:<br \/>\n    87\t\t\t\tfor line in fileinput.FileInput(self.filename,inplace=1):<br \/>\n    88\t\t\t\t\tif \"xmlns:xsi\" in line:<br \/>\n    89\t\t\t\t\t\tline=line.replace('xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"','xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xmlns:gpxdata=\"http:\/\/www.cluetrust.com\/XML\/GPXDATA\/1\/0\"')<br \/>\n    90\t\t\t\t\tprint line.rstrip('n');<br \/>\n    91<br \/>\n    92\t       \t\tdom = xml.dom.minidom.parse(self.filename)<br \/>\n    93\t\t\tcontent = dom.toxml()<br \/>\n <\/code><\/p>\n<p>Den som \u00e4r van att l\u00e4sa kod (och Python-kod i synnerhet) ser att vi ers\u00e4tter inneh\u00e5llet p\u00e5 en viss rad i filen identifierad av &#8220;self.filename&#8221; (dvs medlemsvariabeln filename p\u00e5 aktuellt objekt).<\/p>\n<p>S\u00e5d\u00e4rja, d\u00e5 var minidom n\u00f6jd och kunde hacka i sig inneh\u00e5llet. N\u00e4sta steg var att wordpress inte accepterade att filer av filtypen gpx och kml laddades upp. Detta l\u00f6stes genom att installera ett <a href=\"http:\/\/blog.ftwr.co.uk\/archives\/2006\/09\/03\/pjw-mime-config-v090-released\/\">plugin<\/a> i wordpress som g\u00f6r att man kan l\u00e4gga till fler filtyper.<\/p>\n<p>Sista steget var att ers\u00e4tta de spanska termerna som anv\u00e4ndes i mallen som skapade blogginl\u00e4ggen samt \u00e4ndra s\u00e5 att inl\u00e4ggen publicerades direkt ist\u00e4llet f\u00f6r att l\u00e4ggas upp som utkast. Jag \u00e4ndrade \u00e4ven s\u00e5 att medelpuls visas ist\u00e4llet f\u00f6r kalorier. Detta kan h\u00e5rdkodas i <a href=\"wp-content\/uploads\/2008\/09\/main.py\">\/usr\/share\/pytrainer\/extensions\/wordpress\/main.py<\/a><\/p>\n<p>Tyv\u00e4rr \u00e4r webbplatsen f\u00f6r pyTrainer nere vilket g\u00f6r det lite problematiskt att se om f\u00f6ljande defekter \u00e4r v\u00e4lk\u00e4nda och eventuellt till och med redan fixade i en nyare version. Faran med den h\u00e4r typen av fulhack \u00e4r f\u00f6rst\u00e5s att \u00e4ndringarna l\u00f6per stor risk att bli \u00f6verskrivna n\u00e4r en ny version installeras (vilket iofs inte kommer att ske automatiskt eftersom pyTrainer inte finns i n\u00e5gra av de repositories jag anv\u00e4nder).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det finns ett plugin till pyTrainer som g\u00f6r att man kan publicera resultatet av sina anstr\u00e4ningar (n\u00e5ja, en del iaf) i sin blogg. Dock var det lite si \u00e5 s\u00e5 med vissa detaljer s\u00e5 det funkade inte alls. Efter lite &hellip; <a href=\"https:\/\/webbservern.se\/~jonas\/wordpress\/?p=712\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,8,21,35,36],"tags":[184,464],"class_list":["post-712","post","type-post","status-publish","format-standard","hentry","category-datorer","category-elektronik","category-motion","category-webben","category-webbservern","tag-forerunner","tag-pytrainer"],"_links":{"self":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=712"}],"version-history":[{"count":0,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/712\/revisions"}],"wp:attachment":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}