<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,22 +1,6 @@
 # -*- coding: utf-8 -*-
-def getText(elem):
-    r = ''
 
-    if elem==None:
-        return r
-    
-    nodes = elem.childNodes
-    for node in nodes:
-        if node.nodeType == node.TEXT_NODE:
-            r = r + node.data
-    return r
-
-def getNodes(elem, name):
-    r = []
-    for node in elem.childNodes:
-        if node.nodeName == name:
-            r.append(node)
-    return r
+from .. xmlutil import getText, getNodes, getActivities
 
 def getTracks(obj):
     return obj.getElementsByTagName('Track')
@@ -74,7 +58,7 @@ def getTrackpointDetail(obj):
 
 def parseString(xml):
     import sys
-    from .. import calc
+    from ... import calc
     from datetime import datetime
     from xml.dom.minidom import parse
     </diff>
      <filename>Bicicalc/Garmin/Tcx/history.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,25 +1,6 @@
 # -*- coding: utf-8 -*-
-def getText(elem):
-    r = ''
 
-    if elem==None:
-        return r
-    
-    nodes = elem.childNodes
-    for node in nodes:
-        if node.nodeType == node.TEXT_NODE:
-            r = r + node.data
-    return r
-
-def getNodes(elem, name):
-    r = []
-    for node in elem.childNodes:
-        if node.nodeName == name:
-            r.append(node)
-    return r
-
-def getActivities(obj):
-    return obj.getElementsByTagName('Activities')
+from .. xmlutil import getText, getNodes, getActivities
 
 def getFtp(obj):
     return int(getText(obj.getElementsByTagName('FTP')[0]))
@@ -79,7 +60,7 @@ def parseString(xml):
             hr_high=getHighValue(hrz)
 
             hr_zones.append({
-                'zone':number,
+                'number':number,
                 'low':hr_low,
                 'high':hr_high,
                 })
@@ -104,6 +85,7 @@ def parseString(xml):
             'weight':weight,
             'ftp':ftp,
             'gender':gender,
+            'heartrate_max':hr_max,
             'gearweight':gearweight,
             'heartrate_zones':hr_zones,
             'power_zones':power_zones,</diff>
      <filename>Bicicalc/Garmin/Tcx/userprofile.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,13 @@
 # -*- coding: utf-8 -*-
 import power
+import time
+from Garmin.Tcx import history
 
 def summary(records, options=None):
     '''
     Summarize activity data
     '''
 
-    import time
-    from Garmin import export
-    
     duration=sum([t['time_diff'] for t in records])
     
     cad      = [c['cadence'] for c in records]
@@ -23,7 +22,6 @@ def summary(records, options=None):
     spd      = [(records[i]['distance'] - records[i-1]['distance']) * 3.6 / records[i]['time_diff'] for i in range(0, len(records)) if records[i]['time_diff'] &gt; 0]
 
     nrm_power=power.normalized_power(records)
-    intensity_factor=power.intensity_factor(records, options.ftp)
 
     values={'duration':time.strftime('%H:%M:%S', time.gmtime(duration)),
             'duration_total':duration,
@@ -42,14 +40,16 @@ def summary(records, options=None):
             'power_min':min(pwr),
             'power_max':max(pwr),
             'power_average':average(pwr),
-            'intensity_factor':intensity_factor,
-            'tss':power.tss(duration, nrm_power, intensity_factor, options.ftp),
             'vi':power.vi(records),
             'grade_min':min(grade),
             'grade_max':max(grade),
             'grade_average':average(grade),
             'joules':power.joules(records)
             }
+
+    if options.ftp is not None:
+        values['intensity_factor']=power.intensity_factor(records, options.ftp)
+        values['tss']=power.tss(duration, nrm_power, values['intensity_factor'], options.ftp)
     
     return values
 
@@ -62,8 +62,9 @@ def print_summary(records, options=None):
     print 'Total Ascent:\t\t%.2fm' % (values['ascent_total'])
     print 'Average Power:\t\t%.2fW' % (values['power_average'])
     print 'Normalized Power:\t%.2fW' % (values['power_normalized'])
-    print &quot;Intensity Factor:\t%.3f&quot; % (values['intensity_factor'])
-    print &quot;Training Stress Score:\t%.3f&quot; % (values['tss'])
+    if values.has_key('intensity_factor') and values.has_key('tss'):
+        print &quot;Intensity Factor:\t%.3f&quot; % (values['intensity_factor'])
+        print &quot;Training Stress Score:\t%.3f&quot; % (values['tss'])
     print &quot;Variability Index:\t%.3f&quot; % (values['vi'])
     print &quot;Work:\t\t\t%.3fkJ&quot; % (values['joules'])
     </diff>
      <filename>Bicicalc/calc.py</filename>
    </modified>
    <modified>
      <diff>@@ -7,11 +7,13 @@ def joules(data):
     joules=[line['power'] * line['time_diff'] for line in data]
     return float(sum(joules)) / 1000
 
-def tss(duration, np, intensity_factor, ftp):
+def tss(duration, np, intensity_factor, ftp=None):
     '''
     Caliculate Training Stress Score (TSS)
     '''
     
+    if ftp is None: raise Exception('FTP is not set')
+
     return float((duration * np * intensity_factor) / (ftp * 3600) * 100)
 
 def average_power(data):
@@ -30,11 +32,13 @@ def normalized_power(data):
     power=[line['power'] for line in data if line['power'] &gt; 0]
     return float(sum(power) / len(power))
 
-def intensity_factor(data, ftp):
+def intensity_factor(data, ftp=None):
     '''
     Caliculate Intensity Factor (IF)
     '''
 
+    if ftp is None: raise Exception('FTP is not set')
+
     return float(normalized_power(data) / ftp)
 
 def vi(data):</diff>
      <filename>Bicicalc/power.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,12 @@
 github&#12398;issue list&#12395;&#26360;&#12356;&#12383;&#12369;&#12393;&#12289;&#12525;&#12540;&#12459;&#12523;&#12391;&#21442;&#29031;&#12391;&#12365;&#12394;&#12356;&#12398;&#12391;&#12420;&#12387;&#12401;&#12426;&#12371;&#12387;&#12385;&#12395;&#12418;&#26360;&#12367;&#12290;
 
+ * bike profile&#12434;&#35501;&#12417;&#12427;&#12424;&#12358;&#12395;&#12377;&#12427;
+
  * &#12478;&#12540;&#12531;&#28382;&#30041;&#26178;&#38291;&#12398;&#33258;&#21205;&#35336;&#31639;
  * &#12496;&#12540;&#12481;&#12515;&#12523;&#12497;&#12540;&#12488;&#12490;&#12540;&#33258;&#21205;&#29983;&#25104;&#27231;&#33021;
  * GPX&#21462;&#12426;&#36796;&#12415;&#65295;&#20986;&#21147;
  * &#12527;&#12540;&#12463;&#12450;&#12454;&#12488;&#12456;&#12487;&#12451;&#12479;
 
- * &#12501;&#12449;&#12452;&#12523;&#12434;&#20998;&#21106;
+ * &#12501;&#12449;&#12452;&#12523;&#12434;&#20998;&#21106;(&#26696;)
   * bicifilter.py (importor/exportor)
   * bicicalc.py (&#35336;&#31639;&#27231;)
-
-  * g_userprofile.py</diff>
      <filename>TODO</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,12 @@
 # -*- coding: utf-8 -*-
 
 from optparse import OptionParser
-from Bicicalc.Garmin import tcx
+from Bicicalc.Garmin.Tcx import history
 from Bicicalc import calc, export
 
 import sys
 
-if __name__ == '__main__':
-
+def main():
     parser = OptionParser()
     parser.need_dump = False
 
@@ -42,9 +41,8 @@ if __name__ == '__main__':
         sys.stderr.write('Usage: bicicalc.py [options] file\n')
         sys.exit(1)
 
-        
-    data=tcx.parseString(args[0])
-    
+    data=history.parseString(args[0])
+
     if options.dump_csv==True:
         export.csv(data)
     elif options.dump_kml==True:
@@ -61,3 +59,6 @@ if __name__ == '__main__':
         calc.peak_n_power(data, options.mp)
     else:
         calc.print_summary(data, options)
+
+if __name__ == '__main__':
+    main()</diff>
      <filename>bicicalc.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,40 @@
+#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 from optparse import OptionParser
-from Bicicalc.Garmin import tcx
-from Bicicalc import calc, export
-
 from Bicicalc.Garmin.Tcx import userprofile
 
 def main():
     parser = OptionParser()
     parser.need_dump = False
     (options, args) = parser.parse_args()
+
+    if len(args) &lt; 1:
+        raise Exception('Please set UserProfile.tcx file')
     data=userprofile.parseString(args[0])
 
+    print_summary(data)
+
+
+def print_summary(data):
+    print 'UserProfile'
+
+    print 'BirthDate:\t' + data['birthdate']
+    print 'Gender:\t\t' + data['gender']
+    print 'Weight:\t\t%.1fkg' % (data['weight'])
+    print 'MaximumHR:\t' + str(data['heartrate_max'])
+    print 'GearWeight:\t%.2fkg' % (data['gearweight'])
+    print 'FTP:\t\t%dWatts' % (data['ftp'])
+
+    print ''
+    print '\t\t\tLow\tHigh'
+
+    for hrz in data['heartrate_zones']:
+        print 'HeartRate Zone %d:\t%d\t%d' % (hrz['number'], hrz['low'], hrz['high'])
+
+    print ''
+    print '\t\t\tLow\tHigh'
+    for pwrz in data['power_zones']:
+        print 'Power Zone %d:\t\t%d\t%d' % (pwrz['number'], pwrz['low'], pwrz['high'])
+
 if __name__ == '__main__':
     main()</diff>
      <filename>g_userprofile.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>43cf3277420022303d56c2b265994f42e69089e3</id>
    </parent>
  </parents>
  <author>
    <name>&#40644;&#24029;&#30000; &#20809;&#22269;</name>
    <email>kikawada@kikawada-mitsukuni-no-macbook-pro.local</email>
  </author>
  <url>http://github.com/key/bicicalc/commit/ae9fb5562b97e56cf75abadeee47f903e7da6646</url>
  <id>ae9fb5562b97e56cf75abadeee47f903e7da6646</id>
  <committed-date>2009-06-14T01:57:40-07:00</committed-date>
  <authored-date>2009-06-14T01:57:40-07:00</authored-date>
  <message> * XML&#25805;&#20316;&#37096;&#20998;&#12434;Garmin&#12514;&#12472;&#12517;&#12540;&#12523;&#12395;&#31227;&#12375;&#12383;
 * TSS/IF&#12398;&#21462;&#24471;&#12434;FTP&#12398;&#26377;&#28961;&#12391;&#20999;&#12426;&#26367;&#12360;&#12427;&#12424;&#12358;&#12395;&#12375;&#12383;
 * Garmin.tcx&#12514;&#12472;&#12517;&#12540;&#12523;&#12434;Garmin.Tcx.history&#12395;&#31227;&#12375;&#12383;(Profile&#12418;TCX&#12398;&#12383;&#12417;&#12289;History&#12392;&#28151;&#21516;&#12377;&#12427;&#12362;&#12381;&#12428;&#12354;&#12426;)
 * g_userprofile.py&#12434;&#36861;&#21152;&#12375;&#12390;&#12469;&#12510;&#12522;&#12434;&#34920;&#31034;&#12391;&#12365;&#12427;&#12424;&#12358;&#12395;&#12375;&#12383;</message>
  <tree>8c3bdf31124cc7841ddebfdc06e517e09b3e6123</tree>
  <committer>
    <name>&#40644;&#24029;&#30000; &#20809;&#22269;</name>
    <email>kikawada@kikawada-mitsukuni-no-macbook-pro.local</email>
  </committer>
</commit>
