One more question (which, btw, means you can ignore my statement earlier that there seems to be just under 250 builds...)
The first complete build in the log file starts with these rows:
Wed Jan 7 03:35:58 EST 2015
Starting Full Assembly:
Email: rogelio.ortiz@gmail.com...
Ticket: 425809787-3104772398-785212574-f9350cf
URL: type=make&prostheticHand=0&Right8=55&palmSelect=5&fingerSelect=4&gauntletSelect=3&Padding=5&part=0&email=rogelio.ortiz%40gmail.com
Params: 0 -D Left1=0 -D Left2=0 -D Left3=0 -D Left4=0 -D Left5=0 -D Left6=0 -D Left7=0 -D Left8=0 -D Left9=0 -D Left10=0 -D Right1=0 -D Right2=0 -D Right3=0 -D Right4=0 -D Right5=0 -D Right6=0 -D Right7=0 -D Right8=55 -D Right9=0 -D Right10=0 -D prostheticHand=0 -D gauntletSelect=3 -D fingerSelect=4 -D palmSelect=5 -D Padding=5 -D WristBolt=0 -D KnuckleBolt=0 -D JointBolt=0 -D ThumbBolt=0
Wed Jan 7 03:35:58 EST 2015
Completed 425809787-3104772398-785212574-f9350cf (rogelio.ortiz@gmail.com...): Wed Jan 7 03:39:33 EST 2015
adding: Left.FingerDistalMedium.stl (deflated 87%)
adding: build.log (deflated 89%)
Then it gets into all the openscad lines, etc. I was thinking that this section is "triggered" by the "Starting Full Assembly:" line, so I started by flagging those lines to identify sections for inspection.
However, the next "Starting Full Assembly:" row is followed by these lines:
Starting Full Assembly:
Email: laird@popk.in
Ticket: 425809787-4112834607-675825955-f9350cf
URL: type=make&prostheticHand=0&Right8=80&palmSelect=5&fingerSelect=4&gauntletSelect=3&Padding=5&part=0&email=laird%40popk.in
Params: 0 -D Left1=0 -D Left2=0 -D Left3=0 -D Left4=0 -D Left5=0 -D Left6=0 -D Left7=0 -D Left8=0 -D Left9=0 -D Left10=0 -D Right1=0 -D Right2=0 -D Right3=0 -D Right4=0 -D Right5=0 -D Right6=0 -D Right7=0 -D Right8=80 -D Right9=0 -D Right10=0 -D prostheticHand=0 -D gauntletSelect=3 -D fingerSelect=4 -D palmSelect=5 -D Padding=5 -D WristBolt=0 -D KnuckleBolt=0 -D JointBolt=0 -D ThumbBolt=0
Wed Jan 7 08:16:57 EST 2015
Marked as already in Progress:
Email: laird@popk.in
Ticket: 425809787-4112834607-675825955-f9350cf
Not a build. So, I'm trying to figure out the best scheme for identifying that true, full build section. Any advice on which of these methods would be best, or a Door #4?
1. Look for an openscad call with an .STL output; assume that that's going to be a full build.
2. Look for that line in the first section that says "Completed <ticketnumber>" and that indicates the build is happening.
3. Scroll through to see if there's a "[----------DONE-----------]" line before the next "Starting Full Assembly" line; if so, the section between is a full build.
Thanks,
Jeff
And my response:
I'd use the Starting Assembly web service URL. It's consistent over time, and all of the selections and field entries by users are passed from the UI to the services via the URL parameters, so that will tell you all of the selected options, which is what you want. And it'll be consistent, at least since we put the web service layer in.
From your example, the parts that I think are valuable are:
Starting Full Assembly:
Email: laird@popk.in
Ticket: 425809787-4112834607-675825955-f9350cf
URL:
type=make&prostheticHand=0&Right8=80&palmSelect=5&fingerSelect=4&gauntletSelect=3&Padding=5&part=0&email=laird%40popk.in
The same info is also in the Params logged, so parse either one:
Params: 0 -D Left1=0 -D Left2=0 -D Left3=0 -D Left4=0 -D Left5=0 -D Left6=0 -D Left7=0 -D Left8=0 -D Left9=0 -D Left10=0 -D Right1=0 -D Right2=0 -D Right3=0 -D Right4=0 -D Right5=0 -D Right6=0 -D Right7=0 -D Right8=80 -D Right9=0 -D Right10=0 -D prostheticHand=0 -D gauntletSelect=3 -D fingerSelect=4 -D palmSelect=5 -D Padding=5 -D WristBolt=0 -D KnuckleBolt=0 -D JointBolt=0 -D ThumbBolt=0
And we need the time/date:
Wed Jan 7 08:16:57 EST2015
For privacy, I'd suggest perhaps taking a hash of the email address, so that you can tell how many distinct users used HOM, so we can look at reuse, and filter out our testing.
Ignore part.
We can use the ticket ID to de-duplicate the data, either as a part of your log processing or as a post-processing step (SQL 'distinct' query).
If you can chew up the logs and put the result into a CSV file to load into a database, that'd be awesomely useful. For example, it'd be easy to throw it into Google Big Query for people to query, chart, etc.
The "lookup table" for option names is these two JSON structures:Code: Select all
{
"prostheticHand": [
{ "id": 0, "name": "Left Hand" },
{ "id": 1, "name": "Right Hand" }
],
"part": [
{ "id": 0, "name": "Assembled Model" },
{ "id": -1, "name": "Exploded View" },
{ "id": 1, "name": "Gauntlet", "filename":"CyborgBeast-Gauntlet-1" },
{ "id": 2, "name": "Palm", "filename":"CyborgBeast-Palm-1" },
{ "id": 3, "name": "Finger Proximal (Near knuckle)", "filename":"CyborgBeast-FingerProximal-4" },
{ "id": 4, "name": "Finger Distal (Fingertip)", "filename":"CyborgBeast-Fingertip-4" },
{ "id": 5, "name": "Thumb Proximal (Near knuckle)", "filename":"CyborgBeast-ThumbProximal-1" },
{ "id": 6, "name": "Thumb Distal (Thumbtip)", "filename":"CyborgBeast-Thumbtip-1" }
],
"gauntlet": [
{ "id": 7, "name": "Cyborg Beast Gauntlet" }
],
"finger": [
{ "id": 1, "name": "Cyborg Beast, Bumps" },
{ "id": 6, "name": "Cyborg Beast, No Bumps" }
],
"palm": [
{ "id": 1, "name": "Cyborg Beast" },
{ "id": 4, "name": "Cyborg Beast: No thumb" }
]
}
{
"prostheticHand": [
{ "id": 0, "name": "Left Hand" },
{ "id": 1, "name": "Right Hand" }
],
"part": [
{ "id": 0, "name": "Assembled Model" },
{ "id": -1, "name": "Exploded View" },
{ "id": 2, "name": "Palm", "filename":"Raptor-Palm-1" },
{ "id": 1, "name": "Gauntlet", "filename":"Raptor-Gauntlet-1" },
{ "id": 3, "name": "Finger Proximal (Near knuckle)" , "filename":"Raptor-FingerProximal-5"},
{ "id": 8, "name": "Finger Distal (Fingertip) Short", "filename":"Raptor-FingerDistalShort-1" },
{ "id": 4, "name": "Finger Distal (Fingertip) Medium", "filename":"Raptor-FingerDistalMedium-3" },
{ "id": 9, "name": "Finger Distal (Fingertip) Long", "filename":"Raptor-FingerDistalLong-1" },
{ "id": 7, "name": "Other Parts (pins, tensioner, etc.)", "filename":"Raptor-OtherParts-1" },
{ "id": 10, "name": "Hinge Caps", "filename":"Raptor-HingeCaps-1" }
],
"gauntlet": [
{ "id": 3, "name": "Raptor Hand, Supports" },
{ "id": 4, "name": "Raptor Hand, No Supports" },
{ "id": 5, "name": "Raptor Hand, Flared, Supports" },
{ "id": 6, "name": "Raptor Hand, Flared, No Supports" }
],
"finger": [
{ "id": 4, "name": "Raptor Hand" },
{ "id": 5, "name": "Raptor Hand, No Supports" }
],
"palm": [
{ "id": 5, "name": "Raptor Hand: Supports" },
{ "id": 6, "name": "Raptor Hand: No Supports"},
{ "id": 7, "name": "Raptor Hand: Supports, No Thumb"},
{ "id": 8, "name": "Raptor Hand: No Supports, No Thumb"},
{ "id": 9, "name": "Raptor Hand: for PVC Mount (experimental)"},
{ "id": 10, "name": "Raptor Hand: Demo Hand (with cross-bar)"}
]
}
palmSelect = palm, fingerSelect = finger, gauntletSelect = gauntlet, prostheticHand = prostheticHand, part=part.
The only thing this won't get is the scaling percentage, but getting that out of the openscad events will be more complex. The measurements might be more useful, actually. And we can calculate percentages from the measurements, since we know the formula we use.
Then we can load the data into a database (or Google Big Query)