text:
Directory Listing
|Sticky Revision:
Prevent the empty list from having open and close be set to 'start' (a value used internally).
Don't allow wrapping in label for ans_array errors.
The Parser answer checkers used to give the student answer as the parsed but unevaluated answer. This has been changed so that the student answer is now the computed result, no the parsed answer. The answer preview still shows the parsed equation. This is more consistent with the traditional answer checkers, and probably is more valuable to the students.
Better error messages for unreduced unions.
Improved error message layout and labeling for when ans_array is used.
Improved error messages for formulas returning infinity
Fixed an error where scalar() was used on a hash ref. Fixed a misfeature where operations on formulas could return Value objects of other classes; they should always return formulas, even when the formula is constant.
Avoid undefined value of $name.
Added support for cplx_cmp() using the Parser. Move lib/Parser/Legacy/PGcomplexmacros.pl to the pg/macros directory to use it. As with the other legacy macros, $useOldAnswerMacros can be controlled to determine whether the new or the old macros are used. There is a new mode 'strict_cartesian' that is parallel to 'strict_polar'. You must enter a+bi form, but the a and b can have operations within them.
Fixed error in atan2 where second argument was not promoted to a Real.
The perl method for UOP and BOP now put spaces around the operator, to prevent Perl from thinking that things like -e is a file test and *Parser::Function->call is a name reference. (Some of these had been done by hand earlier, but now the base BOP and UOP classes handle it, so we should not have problems in the future). I removed the ad hoc fixes from several other locations (Parser/Function.pm, Parser/Context/Default.pm). Also extended the operator definitions to allow operators to create function-call syntax in perl mode (for when the operator doesn't correspond to a perl operator).
Added the ability to put class-specific answer-checker defaults into the Context object. For example, Context("Vector")->{cmpDefaults}{Vector}{promotePoints} = 1; would make all Vector answer checkers include promotePoints=>1 automatically. (Note however that if a subclass of Vector is used, it will not get this defaults, since its class name would be different. Perhaps something more sophisticated will be needed in the future.)
Added a Point context that is a copy of the Vector context. This will allow users to override some settings in Vector context (namely, how they are entered and displayed) without preventing users from being able to enter points (in Point context).
Fix bug where perl functions which may need parentheses by forcing them when the function starts Parser::Function->. This seems to work, but there might be a better way to do it, or need other cleaning up.
Add some electrical units. Take two, hopefully in the correct branch this time.
Updated instructions to match changes to global.conf.dist and the move or PGanswermacros.pl.
A separate copy of this file is no longer needed.
Fixed problem with Context's not properly initializing themselves with the WW environment parameters (like zeroLevelTol and useBaseTenLog). The copy method and the method that did an initialized copy used to be separate routines, but that turned out to be unnecessary, so they have now been merged (copy always tries to initialize the WW values when it can, and when the copied context doesn't already have them). The reason this is complicated is that a number contexts are set up before the global.conf data is available, so these can't be initialized with the WW values. Also, these default contexts are stored in the persistant processes, and we don't want to leave possibly course-specific values lying around in them, so whenever a context is selected, it is copied from the standard version and the WW parameters are inserted into it. The problem author can only modify the copy, not the original, so this is OK with mod_perl. The context's copy method now always tries to initialize (we used to have to call initCoopy to get a copy that has the WW parameters inserted). That turned out to cause trouble with code that handled contexts without the usual Context() command.
Fixed log and log10 perl methods so that log obeys the useBaseTenLog flag, and log10 doesn't try to call main::log10, which is not available from within this preloaded package. The in- and outside the safe compartment stuff is very confusing, and functions that are not overloaded native perl functions seem to be not callable from the Value::Formula package, so the perl method now calls Parser::Function->call() directly (doesn't look pretty, but I've given up on that).
Changed stringify to check for an answer that is zero by using the zeroLevelTol value directly (rather than use the fuzzy equality check for zero, which depends on the tolType in a bad way).
Made relative tolerances the default for when the tolType is not one of 'relative' or 'absolute'.
Added code to handle the case where the professor's answer is in expondential notation using a little e instead of a big one. (Perl will convert .0000001 to 1E-07, for example, before it is passed to num_cmp.)
Fixed more undefined values
Changed Context() call to direct reference to context, so as not to leave the wrong content selected as the current one.
Added methods for testing containment of one set in another, and so on. These include: $A->contains($B) Test if $B is a subset of $A (or an element of $A if $B$ is a real number). $A->isSubsetOf($B) Test if $A is a subset of $B. $A->isEmpty True if $A is the empty set. $A->intersects($B) True if $A and $B have numbers in common. $A->intersect($B) The set of numbers common to both $A and $B. Be careful of the difference between "intersect" and "intersects". One is a set the other a true/false value.
Added a copy method that produces a deep copy of the given object. This probably should be used through the new() methods to ducplicate the data used when creating an object, otherwise changes to the sub-objects will cause changes to the outer one. For example, if an interval is used to create a union and then the internal data for the interval is changed by hand, the changes will also occur in the union. That is, Value objects contain their data by REFERENCE. This should probably be changed, but fortunately, no one should be adjusting the internal structure of the objects by hand.
Added canBeInUnion and isSetOfReals methods to the Parser package (similar to the ones in the Value package), replacing the canBeInterval flag and other ad hoc checks. Removed ability to form interval like [a] now that we have sets.
Maintain parentheses correctly when converting to perl.
Allow a list of numbers to be converted to a set.
Pass the canBeInUnion call on to the Formula's root node
Added isSetOfReals and canBeInUnion methods to the Value objects, and replaced the ad hoc tests for these conditions to call these routines. Cleaned up the make() methods for Intervals, Sets and Unions, and improved the new() methods to handle more cases better. Fixed Value::makeValue() to handle an array reference correctly. I don't THINK any of this will break anything. :-)
Make formulas that produce lists get default open and close parens, and have them retained in Formula() results.
Make sure the singletons are sorted before comparing them to the intervals (and each other).
Can't use the length check when reducing unions, since it could contain a single set that is not reduced, and we need to check that, too.
Fixed reduction warnings for individual sets, intervals and unions (in making it work for lists, I broke it for the single items).
Fixed a problem with redefine when used with classes that store their data in a on-standard form (i.e., by overridding the create() method). Now they can define uncreate() to get the original data back for use with redefine().
Fixed mad error message (change needed due to new message translation facility).
Added isReduced method to tell if a Union, Set or Interval is already reduced. Fixed up sort to use CORE::sort, and added sort and reduce to Intervals, which do nothing, but are there for consistency.
Fixed error in testing is a union is reduced (didn't test if sets within a union were reduced properly).
Added sort methods to Union and Set that return objects with their data sorted.
Moved the union and set reduction checks from cmp_equal to cmp_compare so that the messages can be produced even in lists of unions. Improved the message facilities for the list comparison so that cmp_compare can make errors that refer to the number of the entry in the student's answer (otherwise an extra "There was a problem with your nth value" message needs to be prepended, which looks bad if it can be avoided). Use the "extra" answer checker to report syntax error messages in unordered lists.
Fixed typo in previous update.
Added sets to the differentiation information (no derivatives allowed)
Fixed a typo in an error message.
Added ability for Unions and Sets to simplify themselves (automatically or on demand), and added flags to the Context and answer checkers to control these features. The new Context flags are reduceUnions tells whether unions are automatically reduced when they are created. reduceUnionsForComparison tells whether unions are reduced before comparing them for equality or inequality (etc) if they aren't reduced already. reduceSets tells whether redundent elements are removed from sets as they are created. reduceSetsForComparison tells whether sets are reduced before comparing them. All of these default to true. The Interval, Set, Union, and List answer checkers not have two new flags for controlling these values: studentsMustReduceUnions tells whether unions and sets will be counted as incorrect when they are not reduced to non-overlapping intervals and at most one set with no repeated entries. showUnionReduceWarnings tells whether an error message will be produced for non-reduced unions and sets, or if they will be marked wrong silently. (Not available in Lists.) Both of these are true by default, since most professors probably want their students to write intervals in reduced form. (Is this true?) This corresponds the the current behavior of the interval checkers, which require the student's answer to be the same set of intervals as in the professor's, but with the addition of an error message when the student answer is not reduced.
Fixed use of undefined value for $position in TeX and String methods.
Made the 'R' constant in Interval context show up as a bold R in TeX mode.
Detect preview mode correctly for either WW1 or WW2.
Adjust spacing.
Mark function as constant if it is.
Avoid problem with undefined value being passed to protectHTML.
Changed how Intervals implement the requireParenMatch flag for the interval and union answer checker. (Use a Context flag rather than a flag on the interval itself.) Moved the getFlag method from Formula.pm to Value.pm so it can be used by any object class. New feature where classes can add more context flags to set (and reset after the answer checker runs).
Removed erroneous dollar sign.
Added redefine() function to complement undefine() for various Context() values. For example Context()->operators->undefine('+'); makes '+' undefined, but Context()->operators->redefine('+'); will put it back. You can specify a context from which to take the redefinition, and a name in that context, as in Context()->operators->redefine('U',from=>"Interval"); Context()->operators->redefine('u',from=>"Interval",using=>"U"); Context()->operators->redefine('U',from=>$content); where $content is a reference to a Context object. The undefine() function lets you undefine several items at once, as in Context()->operators->undefine('+','-'); For redefine, you must put multiple names in square brackets because of the optional parmeters: Context()->operators->redefine(['+','-']);
Fixed bug with missing fields in initialization.
Added ability to subtract intervals, sets and unions. Adjusted the precedence of the union 'U' to be above _ and + so that things like (1,5) U (7,10) - {8} U (2,3) will do ((1,5) U (7,10)) - ({8} U (2,3)) rather than the previous (1,5) U ((7,10) - {8}) U (2,3). Finally, added a constant 'R' to the Interval context that is equivalent to (-inf,inf), so you can do things like R-{0} now. Still need to work out reducing unions so that things like (1,3)U(2,4) can become (1,4).
Changes needed for new Set object, plus for moving string, TeX and perl into Value.pm. Also removed unneeded spaces in perl versions of the constants (these were to fix problems with the minus sign, but that is now being handled by the minus operators themselves).
Changes needt for Set object, and fixed a bug with unions containing constant intervals with non-constant ones.
Changes needed to Set object. Also, use Parser to handle unions defined as strings rather than doing it by hand (that's the whole point, isn't it?). Added object promotion from lower-precedence classes (for better error messages), and fixed up the comparison routine.
Changes needed for Set object, better handling of an interval given as a string, and a few misc. fixes.
Changes needed for new Set object, and moving of string, TeX and perl methods to Value.pm
Added changes needed for the new Set object.
Added in the Set object class. Also made more comprehensive defaults for string, TeX and perl output, so these don't have to be subclassed so often. These handle looking up the open and close parens and recursively handling the entries in a list-type object.
Properly maintain open and close parens in emtpy lists.
Added new Set object class to the Parser. It implements a finite set of real numbers, for use with unions and intervals. E.g., (1,2) U {3} or (1,2) U {3,4,5}. You can created Set objects in your perl code via the Set() command, e.g, Set(3,4,5) or Set("{1,2,3}"). You should set the Context to Context("Interval") if you plan to use Set objects, as this defined the braces to form sets (rather than using them as parentheses, which is the default WW behavior). Note that in Interval context, you can NOT use braces as parentheses. Current, Set objects are only allowed to be sets of numbers. It would be possible to extend that in the future.
Make upper-case alias a hidden one (since it is not needed for the pattern).
Dereference aliases to aliases properly.
Interval (and Union) checker now accepts requireParenMatch flag for deciding whether the interval type must match. Setting requireParenMatch to 0 will let (1,2) match (1,2] or [1,2], etc.
Cosmetic change.
The Parser versions of num_cmp and fun_cmp incorrectly left the current Context set to the base context used by the answer checker. The Context is now correctly reset to the one in effect before the call to num_cmp or fun_cmp. Also removed some redundant values in if-then checks.
Fixed a bug that would cause step() to produce an error when called on a constant value. Also, added fact() function that was defined in Algparser but not in Parser (which uses x! notation).
Added missing "step" function that was defined in the AlgParser but not in the Parser. Be sure to copy the updated PGanswermacros.pl to the pg/macros directory.
Make List("1,2,3") work like List("1","2","3") rather than produce a list with one element that is a list.
Added postfilter to Parser-based implementation of NUM_CMP so that the student's answer is updated to be the result of evaluating the answer (when there is no error in evaluating the answer). This correctly reflects the behaviour of the original NUM_CMP.
Fixed typo that caused hilighting of the position of errors to be lost.
Updates to make mode=>'frac' properly emulate the original num_cmp behavior (it now allows decimals and fractions instead of requiring a fraction). There is also a new LimitedNumeric-StrictFraction context (not currently used) that disallows decimals and requires fractions.
Folded in Mike's changes for status messages.
Fix use of $SIG{__WARN__} and $SIG{__DIE__}. * Each change to $SIG{__WARN__} and $SIG{__DIE__} is now dynamically scoped with "local", rather than changing globally and then restoring at the end of the block. * The special value "DEFAULT" is used instead of sub {CORE::die(@_)} or sub {CORE::warn(@_)} when preparing to eval STRING code. * Where $SIG{__WARN__} and $SIG{__DIE__} are overridden to do preprocessing with PG_errorMessage, the previously installed handlers will be called instead of the built-in warn or die functions after preprocessing occurs. (For example, the warn and die handlers defined in Apache::WeBWorK or the warn handler defined in WeBWorK::PG will be called.) * The behavior in process_answers is modified so that the custom handlers are installed once before the answer evaluation loop. This causes them to be in effect during the setup/teardown code, but I don't think this will be a problem.
Fixed typo related to useBaseTenLog.
Wrong correction in the previous commit. Use CODE::push
Made modifications that allow use of complex numbers in matrices. You can also LR decompose a non-square matrix. Documentation is still needed and further testing.
Made modifications that allow the use of complex numbers in matrices
A first pass at making parser error messages localizable. The Context()->{error}{msg} hash can be used to specify translations of the standard messages. For example, Context()->{error}{msg}{'Division by zero'} = "Don't divide by zero, dude!"; Context()->{error}{msg}{'Function '%s' has too many inputs'} = "You passed too many arguments to '%s'"; (I didn't translate into another language, here, but you could do that, too.) The msg hash could also be used within answer checkers to make certain answer messages more appropriate for the given type of expected answer.
Fixed various perl compiler warnings (due to extra "my", and so on).
Fixed problem with minus signs in formulas that are turned into perl mode. Perl needs extra spaces to avoid problems with -e type operators.
Fixed typo in installation instructions.
Added some pod documentation to this file. It needs more -- several methods of MatrixReal1 have been overridden
Added some pod documentation
Don't load Parser.pl (it causes trouble with the Matrix.pm module). We only needed it because of the calls to Real() that were being used by Formula objects, so have them call Value::Real directly. be sure to get the latest versions of Parser and Value (including the top-level Parser.pm and Value.pm) in order to use this update.
Modified the perl() method to make calles to Value:: directly rather than to the main:: stubs for creating Value objects. This will make it work better from within packages or when Parser.pl hasn't been loaded. A few things still won't work in this case; e.g., calls to Closed() for intervals (these could be handled better using ->with()) and to functions like Factorial and log10 that are defined in Parser.pl. Finally, there should be better object-based control over what routines are called to create these objects, so that subclasses of the Value objects will be able to be generated correctly.
Modified formatting
Main file that calls in the legacy modules.
Add comment
Folded in Mike's changes to checkbox_cmp.
This is an attempt at making the traditional answer checkers call the new Parser in place of their original ones. That is, if you follow the instructions in the README file, then problems that use std_num_cmp(), fun_cmp(), etc. will really be using the new Parser instead of the original PGanswermacros.pl versions. The old answer checkers are still available, and can be switched back on a site-wide, course-wide, or problem-by-problem basis. See the README for details.
Reworked some of the code for AnswerEvaluator The messages printed out when using the debug flag should now be somewhat better. -- Mike
Fixed problem with sorting (problem with $a, $b, I think).
Handle TeX versions of variables whose names include underscores better.
Better messages when adaptive parameters are too big.
Implement "remove trailing zeros" format, like in prfmt(). I still think '%g' works better in most cases ('%f#' will print larger values without using scientific notation, which is nice, but will print small numbers like .000000005 as 0, even though the fuzzy comparison of this to zero will not be true.)
Don't use the overloaded Real class for doing adaptive parameter checks (use non-fuzzy checks, since we are checking the fuzziness by hand).
Change so as not to use raw HTML in the error messages.
Allow Parser::Number::NoDecimals() to accept a context to be modified (rather than always changing the curent context).
Updates to allow string matches to be case-insensitive. This is now the default, and can be overridden in the Context by setting the string's "caseSensitive" attribute. e.g.: Context()->strings->add("FooBar"=>{caseSensitive=>1}); would rewuire "FooBar" to be entered exactly as typed.
Adjusted some spacing
Fixed a bug in the enable/disable routines that would cause them to always work on the current context rather than the one whose enable/disable method was being called.
Added commment
Corrected how preview_latex_strings are handled when two AnswerHashes are ANDed or ORed.
New flag showAllErrors for when a custom checker is supplied. This will cause all errors generated in the user's code to be reported (normally, messages from the Value and Parser packages are ignored).
Fixed a problem with auto-generated functions getting an incomplete variable list.
Fixed documentation for $graph->size()
Changed whitespace removal of TeX strings to safer version.
Fixed Disable() and Enable() so that they can be called as Context()->functions->disable() and Context()->functions->enable() as well as Parser::Context::Functions::Disable() and Parser::Context::Functions::Enable() The former is the preferred syntax.
Forgot to check hardcopy mode. Fixed some problems with that. The answer array items have to turn off verbatim mode that is used when answer are included in the hardcopy. This causes paragraph breaks between entries in a singleResult MultiPart that includes ans_arrays, which make the output less pretty, but at least they show up.
Added ability to have Matrix, Vector and Point objects produce input arrays similar to the ones available in PGmatrixmacros.pg. This provides some substantial new functionality, and it may still have some shaking down to do, but it should not affect the existing functionality of the answer checkers. To create an answer array for a matrix, vector or point, use the new ans_array() or named_ans_array() methods of these objects. For example: Context("Matrix"); $M = Matrix([1,2],[3,4]); BEGIN_TEXT \{$M->TeX\} = \{$M->ans_array\} END_TEXT ANS($M->cmp); This creates a matrix, then prints it ans creates an answer array of the appropriate size for the matrix. The answer checker will automatically know to handle the multiple entry blanks. To used a named answer rule, use: Context("Matrix"); $M = Matrix([1,2],[3,4]); BEGIN_TEXT \{$M->TeX\} = \{$M->named_ans_array('fred')\} END_TEXT NAMED_ANS(fred => $M->cmp); Both methods also take an optional argument that specifies the width of the answer rules. The default is 5. You can get a multi-input point or vector array as well, and you can make column vectors as follows: Context("Vector"); $V = ColumnVector("1+x","3x","1-x"); BEGIN_TEXT \{$V->TeX\} = \{$V->ans_array\} END_TEXT ANS($V->cmp); Note that you can make answer arrays for matrices and vectors of formulas as well as constants, provided the formula is an explicit matrix or vector of formulas, and is not obtained by matrix arithmatic. For concistencey, all objets now have ans_rule and named_ans_rule methods as well. The default width is 20 for these.
Allow for vectors to be marked as Column Vectors.
Better handling of delimiters that are explicitly set byt he user. Fixed an incorrect call during object class promotion. Added ability to sepcify that a vector is a Column Vector.
Better handling of open and close delimiters that are explicitly set.
Fix some incorrect calls when the promoting types to higher precedence object types.
Fixed a bug with Matrix->perl() method that would cause an extra level of nesting in constant matrices.
Avoid possible infinite loop with length and typeref calls.
Remove unneeded comment.
Added a ->with() method that lets you set fields of a Parser object as you create it. For example: $f = Formula("sqrt(x)")->with(limits=>[0,3]); or ANS(Formula("(x+1)/x")->with(checkUndefinedPoints=>1,test_at=>[[0]])->cmp); or ANS($f->with(test_points=>[[0],[1],[2]])->cmp);
Better control over number of points that can be undefined, and new ability to specify required test points plus additional random ones. (Previously, if you set the test points, no random points were generated.) For example: $f = Formula("(x^2-1)/(x-1)"); $f->{test_at} = [[1]]; # test at x=1 plus random points as opposed to $f->{test_points} = [[-1],[0],[1]]; which tests only the points x = -1, x = 0 and x = 1.
Modified the Formula answer checker to allow checking of points where the functions are undefined (i.e., attempt to check that the domains agree). This can be enabled by setting the checkundefinedPoints flag in the Context(), or in the formula itself. Test points where the function is undefined will be retained and the student's answer will have to be undefined at the same points. If the points are selected at random, the points where the function is undefined are kept in addition to the ones where it is defined, so the required number of test points where the function IS defined will still need to be found. The number of undefined points can be up to the number of defined points. This number can be reduced by setting the max_undefined flag. If you want to guarantee that a specific undefined point be tested, you can provide that point using the test_points field of the formula. For example: Context()->flags->set(checkUndefinedPoints=>1); $f = Formula("(x^2-1)/(x-1)"); $f->{test_points} = [[-1],[0],[1],[2]]; ANS($f->cmp); will guarantee that the singularity at x=1 is tested, so the answer x+1 will not be marked as correct. If an answer matches at all the test points where the functions are both defined, but some of the undefind points differ between the two functions, the answer checker will generate an error message indicating that the domains of the functions don't agree. (This is ONLY generated with the functions match except for that.) This can be controlled by setting the showDomainErrors flag in the formula's cmp() call: ANS($f->cmp(showDomainErrors=>0)); The default is to show these errors.
Fixed an accidental hard-coded operation from always being "add" to being the correct operation when promoting the operations to an object of higher precedence. (But since formulas are normally the highest precedence, this will never have occurred.)
During a call(), if the evaluation produced an error message generated by Value::Error, report it, otherwise report a generic message.
Added derivative of |x| as x/|x|.
Fixed a bug with adaptive parameters where the relative tolerance was not being properly computed. This allowed large constants to be treated as correct when they shouldn't be.
Copy parameters like limits, etc, to the newly created formula when 'C0' is added by the "upToConstant=>1" option in formula cmp().
Use correct form of "x" with lists (rather than hack using split()).
Provide a default warning subroutine if none has been defined.
Added a check that the coordinates are numeric. This avoids an error were <i+j+k> was accepted as OK.
Handle error messages in the list checker better. In particular, make the error messages generated by custom checkers called on elements in the list look better. Also, in an ordered list, if the student enters extra values, call an answer checker to do a syntax check. (By default, use the first element again, but the user can supply a separate object to use for the checker using the extra=>object option.)
Compartmentalize the equality check one step further. The cmp_equal method now calls a new cmp_compare method to perform the actual comparison (rather than use == directly). The cmp_compare method either calls a user-supplied checker routine, or defaults to using the == operator. The list checker also uses cmp_compare to check the individual items in the list. The list checker also calls a new cmp_list_checker method to perform the list check. This can be overridden by a user-supplied list-checking routine. To supply an alternate checking routine, use the "checker" option to the cmp() method of the correct answer object. For example: sub check { my ($correct,$student,$ans) = @_; return 0 unless $correct->length == $student->length; my ($x,$y) = $student->value; # break up a point; return $x**2 - $y**2 = 1; # check if it is on a hyperbola } Point(1,0)->cmp(checker=>~~&check); This will check if the student's point lies on the given hyperbola. All the usual error messages will be issued if the student's answer is not a point, or is of the wrong dimension, etc. You can use sub list_check { my ($correct,$student,$ans) = @_; my @correct = @{$correct}; my @student = @{$student}; ... return ($score,@errors); } List(...)->cmp(list_checker=>~~&list_check); to replace the list-checking routine with your own custom one. The $correct and $student values are array references to the elements in the lists provided by the professor and student. (Note that you do NOT get a List() object; this allows you to handle lists of formulas, since a List of formulas becomes a formula returning a list). The checker routine should return the number of correct elements in the student's list ($score), and a list of error messages produced while checking the two lists (@errors). (This is a list of messages, since you might want to include an error for each entry in the list, for example). If your checker or list_checker routine wants to die with an error message, use Value::Error(message). This will put the message in the WeBWorK display area at the top of the page. If you use die(message), or if the code fails due to a runtime error, then "pink screen of death" will be produced indicating the error and asking the student to report the error to the professor.
Properly handle string values in postprocessing of vectors and other related lists. (It used to report a dimension error for things like 'NONE').
Peroperly negate infinities even when reduceConstants is not in effect.
Handle extra parentheses better.
Handle log as ln or log properly.
removed a commented-out line that was no longer needed.
Fixed a typo.
Update the overloaded operators so that they can be overridden by subclasses of the predefined object classes. This involves calling the objects method rather than using a hard reference to the routine in the parent class. Also, change the name of the string comparison routine to compare_string to avoid conflicts with cmp that is used to produce the answer checker for the class. Finally, in Value.pm, promotePrecedence no longer has to do fancy footwork to get "special" precedence to work (this was a hack to get around the misfeature of the overloaded operators -- now that that is being handled correctly, there is no need for it).
Allow subclasses of AnswerEvalutor to be used. Check for a match with a substring AnswerEvaluator instead of equality.
Missed one situation when making the previous update. Fixed it.
Fixed it so that direct calls to the add, sub, mult, etc functions would work as expected (even though there is no need to call them directly).
Updated the answer checkers so that you can more easily specify how the correct answer shoudl be displayed. In the past, you could use something like Real(sqrt(2))->cmp(correct_ans=>"sqrt(2)") to do this, but that is awkward. Now the Compute() function (which parses and then evaluates a string) sets things up so that the original string will be what is used as the correct answer. That means Compute("sqrt(2)")->cmp will have the same result as the example above. You can also set the {correct_ans} properly of any Parser object to have that value used as the correct answer. For example $x = Real(sqrt(2)); $x->{correct_ans} = "sqrt(2)"; ANS($x->cmp) would also produce the same answer checker as the two previous examples. All three methods should work. Use the one that is most convenient for you.
Improved the Real(), Complex(), Point(), Vector(), Matrix() and String() constructors so that they will process formulas passed to them as strings rather than requiring perl objects for these. For example, you can use Real("2/3") rather than Real(2/3) if you want. Also, Real("1+x") will return a formula returning a real (essentially the same as Formula("1+x") in this case).
Fixed an error with Matrix() that could cause it to loop infinitely when bad data is passed to it. Also, allow Matrix(), Point(), Vector(), and Real() to accept string values that are evaluated to produce the value returned. (Sorry, accidentally committed with a blank message.)
*** empty log message ***
Undoing some of the temporary changes I made to the warn message. This may break what happens with xmlrpc however. (sigh)
Fixed index problem with matrix multiplciation. (It was returning the transpose!)
Temporary modifications which allow the Warning mechanisms to work when using the XML access methods. This needs to be looked at again. There is also a problem with defining permissions for creating directories. There is a temporary #FIXME that seems to work.
Defined some variables that were causing warning messages. Someone more familiar with this script should look at this to make sure that this subsection of the parser is working correctly. -- Mike
Fixed a bug in processing absolute values with implicit multiplication.
Fixed typo in a comment.
Added reduction rules to remove redundent negatives. Override string and TeX methods that avoid redundent parentheses.
Added "areParallel" method as a synonym for "isParallel".
Don't promote an object unless it is a Value object.
Clear error messages before doing the answer check (this clears old messages left over inclass this checker is called by another one, e.g. when using UNORDERD_ANS()).
Trap errors in functions that are not native perl functions (like acos() and csc(), etc.). In the past, if an error occurred within the definition of a function, the error message that was reported was the internal error within the definition of the function. For example csc(0) would report "illegal division by zero", while acos(-2) would report "can't take sqrt of -3". Now the errors will be "can't take csc of 0" and "can't take acos of -2".
Added support for useBaseTenLogs to make log() work like ln() or log10() depending on the value in the course.conf file. Also fixed a bug that caused the WeBWorK parameters not to be copied into contexts by initCopy().
In Complex context, make sqrt() and log() of negative numbers return their complex values. Also make ^ and ** do the same with negative bases. These can be controlled by setting/clearing the "negativeIsComplex" entry for these functions and operators.
Report errors for powers of negative numbers rather than return 'nan'. Don't allow 'nan' to be made into a Real object.
In StandardPrecedence mode, make the precedence of function apply match that in use by that AlgParser.
Don't give coordinate hints during parallel vector checks. Also fixed a typo.
Allow string constants to include spaces.
Fix problem with TeX output of implicit multiplication between items that would put two digits next to each other (like 2 3^2).
Fixed Parser so that you can replace the Formula class as well as the other object types.
The $Parser::class variable was being handled after the "use" statements at the end, so had to put a BEGIN around it.
Eliminated unneeded parentheses in TeX output when unary minus and plus are used with fractions.
More changes for the isZero and isOne checks. (Missed this file when I committed the others.)
Added isZero and isOne checks for Parser::Value objects (i.e., for constants within formulas). These now correctly handle vector and matrices, in particular. The isOne and isZero checks are used in the reduce() method to simplify formulas.
Added a new flag to the Formula()->cmp answer checker that allows a constant-valued formula to be evaluated and then use the checker for the resulting type. This is useful when you want the correct answer for a numeric check to be shown in a symbolic form (like "pi/4") rather than as a decimal number. To do this, use Formula("pi/4")->cmp(eval=>1); rather than Real(pi/4)->cmp, which would show the correct answer as 0.785398. Note that Formula("pi/4")->cmp would also match against pi/4, but it does it as a function rather than a number, so error messages might be issued indicating that the checker is expecting a formula that returns a number, rather than just a number; this might be confusing to a student. It would also accept answers like "pi/4-x+x" as correct, whereas with eval=>1 this would produce an error message saying that the answer was supposed to be a number not a formula returning a number. Similarly, if you want to show sqrt(2)/2 as the correct answer, use Context()->flags->set(reduceConstants=>0, reduceConstantFunctions=>0); Formula("sqrt(2)/2")->cmp(eval=>1); The first line tells the parser not to automatically reduce expressions that only involve constants, so that the value of the formula in the second line will not be reduced to a decimal before the cmp method is called.
Make Formula()->eval return a Real (ie, aValue::Real object) rather than a perl number. That way, you can use $f->eval->cmp rather than needing Real($f->eval)->cmp, and so on. Also make Formula()->perl do the same, for consistency. (This could have been accomplished by having the Parser::Number class evaluate to a Real, but for efficiency during computation, we put off making the Real object until the end. It probably doesn't make that big a difference, but every little bit helps.)
File needed to reduction flags that was accidentally left out of the previous commit. Sorry!
Added flags that control the reductions performed by Formula()->reduce. Each reduction operation can be individually enabled or disabled in the context, and in the reduce() call itself. More complex reductions need to be developed.
Fixed typo in addParens method name.
Don't reduce constants in the display of student answers (so they can tell how the parser interprets their answer). The drawback is that the final number is not displayed. (We may need to add more columns to the results display.)
Use extra parens in the string version of the student's answer, but not in the professor's (unless the problem sets the showExtraParens flag).
Added context flags to control automatic reduction of operations that involve only constant values. The default is to combine constants, but this can now be disabled. Also added a new flag to control the addition of extra parentheses that make string values painfully unambiguous (these are for situations that students tend to get wrong). By default this is turned off (so that professor answers won't contain excessive parentheses), but the answer checker will be made to turn this on for student answers. Finally, when extra parens are added to formulas, they alternate between ( ) and [ ] to make it easier to read.
Produce an error when attempting to auto-create a formula using a function that has been removed from the current context.
Make partial credit in list answer checkers be the default (now that WeBWorK can handle this).
Fixed a bug with constants where the values were being cached so that changes in the context were not being reflected in the formulas that use them.
When creating formulas from functions, don't evaluate even if the formula is constant. (This makes it possible to create automatically create formulas even if they only contain constants.)
No longer produces the message that there are too many answers if hints are being shown about individual entries in a list. (This gave away the answer about which ones to remove.)
Changed the error message produced for functions that have been removed from the parser. I hope this will be more appropriate for students.
Fixed error where AlgParser produces \sech and \csch, which are not defined in TeX. This fixes bug #665.
Only convert (f(x))^2 to f^2(x) for specified functions f (as marked in the Context).
Add better error reporting in PG translator. In particular, these changes add two new features: 1) produce a full stack trace when a .pg file dies, and 2) convert (eval nnn) references to filenames, when possible, in warn and die messages while processing a .pg file. There is also a change in the webwork tree that is needed to make this all work, so be sure to apply updates in both trees.
Two more minor TeX improvements.
Improved TeX and string output in a number of situations. Improved use of parentheses to avoid things like x+-3. Fixed wrong parentheses in powers. Display (sin(x))^2 as sin^2(x) in TeX output.
Use the current context if the answer doesn't have one itself (like with Value objects).
Added in functMaxConstantOfIntegration support in the adaptive parameter answer checking. Also added a flag to the formula answer checker that allows checking a formula up to a constant (for integration problems). This really just adds a new parameter to the context and adds that to the formula, so there is nothing deep about this. ANS(Formula("2x")->cmp(upToConstant=>1)); Finally, don't look for adaptive parameters if they aren't actually used in the professor's formula (even if they are defined).
Added ability to have linear adaptive parameters in the function answer checker. It only works for real-valued functions, though. To use a parameter, use Context()->variables->add(a=>'Parameter'); and then use 'a' as a variable within your answer. The student will not be allowed to enter the parameter, but the professor will. Note that the correct answer will show the full professor's answer, including the parameters, even though the student can't type it. Is this the right behaviour?
Added the makeUnion call that was removed earlier. The AnswerChecker for formulas sometimes called it (when the student's answer is constant).
Fixed a bug with sin^2 x that introduced when I adjusted the error report for implied multiplication.
TeX mode now adds parentheses around fractions, when needed.
Made string function look for a string field in teh definition of the function as an override for its name. (This way, you can make asin appear as arcsin or even sin^(-1) if you want).
Fixed wrong error messages when operators are undefined in a context.
Modified the parser so that the classes for the various object constructors are stored in the context table rather than hard-coded into the parser. That way, you can override the default classes with your own. This gives you even more complete control to modify the parser. (You had been able to replace the definitions of operators, functions and list-like objects, but could not override the behaviour of numbers, strings, variables, and so on. Now you can.) This effects most of the files, but only by changing the name of the calls that create the various objects. There are also a couple of other minor fixes.
Better highlighting for syntax error involving implied multiplication. (No highlighted had been done in the past.)
Get the type right when evaluating an AbsoluteValue and obtaining a Value object.
Remove more lines in error messages produced while evaluation student answers.
Moved WW-specific routines from Parser.pm to WeBWorK.pm. Changed error reporting when the error message was not generated by the parser directly. (The stack trace and line number references are removed before the error is reported.)
Added easy calls to disable/enable collections of functions or individual functions in the current context. So you can say Parser::Context::Functions::Disable('Trig'); to disallow the use of trig functions, or Parser::Context::Functions::Disable('Trig','Numeric'); Parser::Context::Functions::Enable('sqrt'); to disable trig and numeric functions (like log, exp, abs, etc) but allow sqrt. Note that disabling sqrt() does not disable x^(1/2) (this must be done through disabling the ^ and ** operators), and disabling abs() does not disable |x| (which must be done by removing the '|' definition from the Context's parens list).
Fixed some inconsistencies between handing of matrices within the parser and Value packages. Added a predefined Matrix context.
Had the default granularity the wrong direction.
Made the granularity of the test-point intervals be a parameter that can be set on a global or variable-by-variable basis, so this is now controlable from the .pg file. For example: Context("Numeric")->variables->are( k=>{limits=>[1,10], resolution=>1}, x=>{limits=>[-2,2], granularity=>1000}, ); will make k be a variable that will only take on integer values between 1 and 10, and x a variable that will take on one of 1000 different values evenly spaced between -2 and 2 (so resolution is 4/1000 in this case). These parameters can also be set for an individual formula: $f = Formula("k^2-1"); $f->{resolution} = 1; $f->{limits} = [0,10];
Fixed TeX output of Matrices to use \array rather than \matrix for matrices with formulas as entries (this had already been fixed for constant matrices). Made intervals produce formulas when of of the endpoints is a formula. Removed unneeded comment.
Added support for dimension warnings in the answer checker for formulas that return points, vectors or matrices.
Formulas can now be compared even if their variables are complex numbers, or even points or vectors! This makes it possible to ask students for complex functions like z^2+i and so on. You can specify limits for variables either via Context()->variables->set(x=>{limits=>[0,1]}) (for reals) or Context()->variables->set(z=>{limits=>[[-2,2],[0,1]]}) (for complexes). Similarly for points and vectors (where the number of sub arrays depends on the dimension). You can also give the limits for a specific formula by assigning to its ->{limits} field: $f = Formula("sqrt(x-10)"); $f->{limits} = [10,12]; There are now named variable types for 'Point2D', 'Point3D', 'Vector2D' and 'Vector3D', in addition to 'Real' and 'Complex'. You can also specify a variable type by giving an explicit instance of a value of the given type. E.g. Context()->variables->add(x=>'Real',y=>0); # two real variables Context()->variables->add(z=>'Complex',w=>i); # two complexes Context()->variables->add(r=>Vector(0,0,0)); # a vector in R^3 Context()->variables->add(X=>'Vector3D'); # a vector in R^3 There still needs to be more error checking in processing user-supplied limits, but I'm not sure how much overhead is worth it.
Made the default context be Numeric context rather than Full context. Since there is only one variable in this context, it will speed up function answer checking. It will also encourage you to choose the correct context explicitly. Also changed Complex context to have z as the only variable. If you want x and y as reals, you need to add them in by hand. Again, this is for efficiency in answer checking.
Added a file to perform WeBWorK-specific modifications to the Parser/Value packages. (I've tried to make these independent of WeBWorK, so you can use them in other perl code if you want to.) The parameters for fuzzy reals and some of the other parameters now are taken from the pg->{ansEvalDefaults} values (as defined in global.conf or course.conf). More still needs to be done with this, however.
A number of fixes to make handing lists work better. In particular, you can now specify checks for whether the right kinds of parentheses (or none at all) are used on the student's answer. Some of the flags for the list checker have been changed to accommodate this.
A number of adjustments to get negative infinities to work better. They used to be stored as separate Parser strings, but now they are flagged versions of a single string. All of the problems are really due to the fact that there is no Infinity class in the Parser (only a Value version). That should be changed, but will require some work, and can be put off for now. It would be best if the classes within the two packages would match up nearly 1-to-1, but for historical reasons, they don't. Since the introduction of Real, String and Infinity classes to the Value package, The Infinity class is the one main difference between the two, and once that is fixed, everything needs to be looked over to check for unnecessary complications due to the historical lack of classes in one or the other package.
Make blank patterns be ^$ (which should never match) rather than empty (which always matches). this fixes a problem where if a context has no functions, for example, the parser would attempt to create function calls to a function named ''.
Handle trapped error messages that are not produced by the parser error reporter (i.e., by bugs within the parser itself). Also added an error if implied multiplication is attempted when the operator for it is not defined in the current context.
We need to protect the HTML in the professor's answer so that if it contains <, for example, it won't disappear.
Fixed typo.
Avoid possible infinite recursion in promotePrecedence() when special precedence is used.
Fixed error with handling of +infinity and -infinity. (They had been defined as strings, but now we can let the + and - operators handle them).
Added Parser::Number::NoDecimals() function that causes the parser to give an error message when the student types a decimal number. This means the student must enter fractions as fractions, or values like sqrt(2) or pi/4 symbolically not numerically.
Fixed an error in the generation of regexp patterns for the various data types.
The answer checkers now work with subclasses of Formulas that are not part of the Value:: package tree itself (we call Value::isFormula() rather than checking the class directly). I also removed the various cmp_* flags that stored method names as they ended up not needing to be used (they were intended as a means of overriding the default method names, but subclassing turned out to be a better approach). I moved some initialization of the answer checker out of the anonymous subroutine that is installed in the checker and just have that subroutine call the correct answer's main checker (which I renamed). Finally, I changed the student_ans value to be an HTMLized version of the student answer, since the student could include things like < in his answer (e.g., for vectors), in which case his whole answer might disappear. I wonder if this couldn't be handled better at a higher level, as it seems wrong to make the student_ans be HTML rather than the parsed string. I originally thought Problem.pm could do the protecting of HTML special characters, but this won't work without additional changes, since some answer checkers put HTML into student_ans to mark sytanx errors in the student answer, and you DON'T want to protect those HTML characters. The student_ans field is probably being misused in this, and there might want to be another field that gets used by Problem.pm in place of student_ans (which can be HTML protected) when it is non-empty; say student_HTML or something like that. The answer checkers could use that field if it wants to add HTML to the student answer, and student_ans otherwise, with the assurance that it's HTML characters will be protected. That way, if a second answer checker calls the first (like some list checkers do), then the second checker doesn't have to worry about removing HTML from the student ans, and doesn't ahve to wonder whether the student_ans actually contains an error message or syntax markings rather than the actual student answer.
Context() now accepts a reference to an actual Context object rather than a name of a predefined context, and will switch to that.
Make it possible to create subclasses of objects in the value package that are not actually in the Value:: package tree. This makes it possible to have .pl files (that are run via loadMacros) that create new Value object classes that are local to the problem rather than global to the system. (With mod_perl, if a .pl file added to the Value:: tree itself, the results would be persistent, and this could adversely affect future problems processed by the same httpd child process. It could lead to "redefined subroutine" errors, or worse.) This provides a safe way to extend the parser on a problem-specific basis. This technique is used in the line and plane answer checkers (coming soon), for example. If such a checker becomes widely used, it can always be added into the Value:: tree at a later time.
Make sure equality always returns a defined value, and put spaces around the equal sign in string output.
Use the standard precedences rather than the experimental ones by default. The professor will need to specificaly request the non-standard ones, for now.
Changed the string used for the student answer to be taken from the unevaluated formula rather than the fully-evaluated one. This leaves constants unreplaced, for one thing. Currently the parser combines constants automatically during the parse [which should be controllable by a flag], so student answers that produce numbers are fully evaluated at this point already, except for constant substitution. This could be changed so that even for numberic results, the student sees the parsed expression (rather than the numeric result), which might help them identify where they and the parser differ in their interpretation. It is still nice to see the final computed result, however, but there is no place to show the parsed input as well as the final result. One solution would be to add another column (wasting space). Another would be to make the value shown be "parsed-value = computed-value" when they are not the same thing. A bit ugly, but works within the current framework.
Fixed typo in name of random generator.
Fixed a number of minor problems with creating perl functions from formulas (this is done automatically as part of the function answer checker, so is showing up now that I have that checker in place). Also improved error messages in the function answer checker, and fixed a bug when students enter a constant list or union when the answer checker expects formulas.
Allow parser "constants" to be (in reality) formulas. That way, for example, you can defined T, N and B to be the formulas for the unit tangent, normal and binormal of a space curve (as functions of "t") and the student can write anwers in terms of T, N and B (without having to compute them). You could have created FUNCTIONS T(t), N(t) and B(t), and added them to the parser to get almost the same effect, but the students would have had to include the "(t)". (If you want that, go ahead and do it that way.)
Removed unwanted side-effects of some type-match checks, and moved the ignoreStrings flag so that it is available for the checkers of ANY type.
One more fix for handling intervals properly (I think it's really right this time). Also, named constants that end in numbers will produce TeX output with the number as a subscript (this was already true for variable names).
Added string comparison to all Value object classes (to compare the string value of an object to another string). Overloaded perl '.' operator to do dot product when the operands are formulas returning vectors. (Part of the auto-generation of formulas). A few improvements to real and complex class output results. Made Union class slightly more robust and removed need for makeUnion method other than in the Union itself.
Added support for unorderd list or formulas with partial credit. Fixed type mismatch reporting in formula answer checker. Fixed an error with Unions producing incorrect perl versions under some circumstances.
Created the first draft of the Parser's function answer checker. Some work still needs to be done, in particular, type mismatches are not being reported, and lists are being processed only as ordered lists with no partial credit. This doesn't implement everything from fun_cmp. In particular, there is no support for parameter matching at the moment. This will have to be added, but I'm not quite sure how to do it when the function's return value is not a real number (e.g., an interval). On the other hand, this checker is more forgiving about domain errors: if tries a point where the professor's function is not defined, it ignores that one and looks for another (until it decides it can't find one). Once it has these points, it tries them on the student's answer, and if the student's function is undefined, then the student answer is wrong (since it is not defined somewhere that the professor's funciton is). This avoids the "Error evaluating student function at ..." messages, which just confused most students anyway.
Improved error messages, particularly when the student enters a formula in an answer that should be constant, and also for incorrect answers in lists of answers. There are a few other miscellaneous output improvements as well.
Had to put back the global context variable after all. :-( It gets reset in Parser.pl, so it should be OK even with mod_perl.
Modified Context() function so that it no longer uses a global package variable for storing the user's context table.
The Union answer checker now uses the generic List checker, so that it will be able to produce partial credit and hints about which Intervals are correct.
Added an equality operator (not active initially) that can be used for things like equations of planes and so on. I'm working on the answer checker for that.
*** empty log message ***
Fixed some bugs in the handle of the context in ->string and ->TeX methods of Value objects.
Fixed a typo in one of the parser answer checkers. Added a line that was incorrecctly removed in the parser.
The class file for the Value::String object. (Forgot to add it before the last commit. Sorry!)
Added a String type to the Value package. Mostly this is to make it possible to generate an answer checker for it that uses the parser. It also makes it more consistent for handling things like stringify, especially when they are recursively called internally. Added new default strings "NONE" and "DNE", since these get used a lot. Modified how the default parameters are set up for the answer checkers, and how the answer checker reports the expected answer type in type mismatch error messages.
Allow unary + and - to work on infinities.
Can now specify that the objects stringify themselfs in their TeX forms rather than their answer-string forms. This makes it easier to use the objects in the text of a problem (without having to call ->TeX explicitly each reference). Use Context()->texStrings to start outputting TeX strings, and Context()->normalStrings to switch back.
Incorporated infinities into Parser package better. They have been stored as String objects (with extra data) in the parser, and I've left it that way, but now they convert to/from Vallue::Infinity objects correctly, and these are used for generating the output. Also added the Infinity answer checker, and adjusted the error messages produces by type mismatches in the answer checkers and elsewhere.
Fixed some output issues with intervals and unions.
Added an Infinite object class for the Value package. Still need to add it to the Parser package.
Added ability to report incorrect coordinates in point and vector answers, and incorrect endpoints and endpoint types in intervals. Separated these kinds of checks from the typeMatch check, where they didn't really belong. Added ability to specify intervals and unions as strings in Interval() and Union(), which makes it easier to make constants of these types. There are still problems comparing intervals that contain infinities; I really need to make the infinity object to solve this, so have put off trying to fix that for now.
Handle list entries that are not Value objects better.
The List object's answer checker is now considerably improved. It will allow you to specify an unorderd or ordered check, and whether to print various kinds of hints for wrong answers. The checker can return partial credit, but WW doesn't deal well with this at the moment (some small changes to Problem.pm can take care of that). Partial credit should be based on $showPartialCorrectAnswers, but it is disabled for now. The list answer checker probably still needs some work, especially with non-numeric lists.
Added answer checker for parallel vectors. Added option to number checker to have it not report type mismatches for the known strings (like 'infinity'). (Really need a class for infinities, and a Value.pm class for strings.)
Have parser handle infinities better.
Fixes for handling intervals better. In particular, deal better with ambiguous situations, like (1,2) that could be a point. You can use [a,a] to specify the single point a. I'd like to make {a} represent this (and maybe even {a,b,c} to form finite sets), but this would interfere with the use of { and } as alternative parentheses. (Does anyone really use these?) Do we need a cross product for intervals (and sets) as a means of representing regions in R^2 (or higher)?
This is a preliminary attempt at adding answer checkers that use the parser. If you have a parser object (like a formula or a vector), you can use the ->cmp method to get an answer checker appropriate for the object. For example: Context('Vector'); $v = Vector(1,2,3); # print text of problem ANS($v->cmp); would produce an answer checker that matched against the vector <1,2,3>. Most of the parameters are set in the Context, but additional ones can be passed to the checker (this still needs work). See the sample problems for more examples. The checkers for Reals, Complexes, Points, Vectors, Matrices and Intervals work pretty well. The ones for List and Union objects need more work, as they only do an ORDERED check at the moment (the student answers must be in the same order). This needs to be fixed. The checker for Formula objects (which corresponds to fun_cmp) still needs to be written.
A number of small fixes. Most were to fix minor bugs in string and TeX output, particulary for the various list-based objects (like vectors, intervals, etc.). There were also some bug fixes in the comparison routines. Some additional checks were added for valid intervals when the coordinates are formulas.
Fixed generation of LaTeX version of sqrt(...).
Forgot to add this file. It implements the "fuzzy real" class.
Significant update to new parser. New features include: Better control over format of vector output (you can now specify ijk-format rather than <...> format) "Fuzzy" reals, where the relations like == return true when the two values are "close enough". (This is controlable using parameters similar to those used in NUM_CMP). The fuzzy reals are now used in vectors/points/matrices/complexes/intervals and so on so that their relations will also be fuzzy. E.g., (1E-13,2) == (0,3) will be true, and norm(Vector(0,1E-13)) will equal 0. The two main portions of the parser (the Parser and Value packages) now share a common context object for configuration purposes.
Make Parser work with PGauxiliaryFunctions.pl, and add the macro files needed to initialize the parser.
merged changes from rel-2-1-a1 -- stop using that branch.
Create equations directory if it doesn't exist. All directories under tmp should be recreated if they don't exist. Arnie
Change permission of tmp files so that they can be removed. Arnie
Most of the work for adjusting vertical alignment of images is here.
Allow option of not using the cache. If its path is the empty string, then we just return the md5 hash of the latex string followed by a 1.
Removed extra spaces from around dvipng images. (These can cause bad line breaks, e.g. between mathematics and the punctuation that follows.)
ImageGenerator is now using WeBWorK::Constants
When using the imageCache (which is always), put images into subdirectories based on the first two characters of their md5 hash.
Changed pacckage name from strict to ww_strict per Sam's suggestion to prevent redefining warnings. Arnie
got rid of remaining calls to "wwerror". Fixes bug #530.
Moved be_strict after package main;
Moving ww_strict.pm forward to 5.8.3 compatible version with require Carp; commented out
Moved ww_strict.pm back to be identical with strict.pm from perl 5.6
We are now using ww_strict.pm instead of strict.pm in be_strict;
We are using our own version of strict.pm that has a require Carp; commented out. This is included in be_strict which is used to implement strict within PG macro files which need to be evaluted inside the Safe compartment
Replaced PGsort with a version that uses quick sort. This fixes the problem the old PGsort had with Perl compiled with ithreads. Arnie
Modified DVIPNG_ARGS to work with dvipng >= 1.0.
Cosmetic fixes to code layout.
Preliminary changes that may eventually allow us to solve the be_strict problem for 5.8.0
Allow a 256 error from dvipng. This seems to be necessary on webwork.math.rochester.edu, so I'm commiting it to the CVS as well to keep the two systems in sync. --Mike
Minor change to the definition of the timer
Added error messages that should make it easier to tell if certain directories have not been created. Also checks that files are actually created and written at each step of the process. --Mike
changed the way the IO modules work: shared subroutines are in IO now, and IO has a hash %WeBWorK::PG::IO::SHARE which can be added to Translator's %shared_subroutine_hash directly.
changed documentation to reflect the fact that reh refresh and mtime flags are no longer used
added files from WW2
When displaying a raw student answer, nulls are converted to \0 so that they can be seen. This is probably redundant since strings with multiple values separated by nulls are supposed to be converted to references to arrays before they reach this point. --Mike
Added line which prints out the raw student answer when the debug flag is on. --Mike
added image generation modules from WW2
Redoing fix to random so that random(2,7,3) won't produce 8. The original fix was lost in the merger with mod-perl version.
Fixed new bug introduced by, er, my previous bug fix.
Changed the defintion of *i to be inside the Complex package. this and the change to dangerousMacros seems to have cured bug #116 --Mike
added missing hyperbolic, inverse trig, and inverse hyperbolic functions cintributed by Davide Cervone Arnie
Merge the time optimized branch and the main branch. I forgot one subroutine --Mike
Adding preliminary ability to decompose non-square matrices. Won't work if a permutation is required (i.e. a pivot) --Mike
Merged the changes needed to work with the new WW2 translator optimizations into the main pg branch.
Added a feature to correspond to a change made in process_answers in Translator.pm. Each answer evaluator is given the answer AND the answer label (e.g. AnSWer1) of the answer. The label is placed in the answer hash at $hash{ans_label} for use by filters that need to know the label of the answer they are evaluating. --Mike
Fixed bug when the function is sampled at a point where it is not defined.
removed unneccesary shebang lines
This module contains IO used in saving an answer to a file. --Mike
Bringing this version of Matrix.pm up to date with the latest in courseScripts. --Mike
moved PG modules and macro files from webwork-modperl to pg -sam
|aubreyja at gmail dot com
|ViewVC Help
|Powered by ViewVC 1.0.9


text:
There might be no hotter club in US Soccer's Development Academy League than the Dynamo U-16s, presented by Statoil, as the squad won its eighth straight match with a 2-0 victory over Texas Rush on Saturday at Lents Family Park. Matthew Dorsey (pictured, above) and Josue Palomino provided the goals for Houston, who remain in first place with a 15-3-1 record.
Over the past eight games, the Dynamo U-16s have scored 27 goals with a +20 goal differential. Palomino's goal was his sixth of the year, while Dorsey's game-winner was the center back's second of the season.
READ: James Clarkson discusses recent trip to France with MLS Academy coaches
The Dynamo U-18s, presented by Statoil, needed an 83rd-minute goal from homegrown striker Bryan Salazar to earn a critical road point against Texas Rush on Saturday. After Ryan Stinebaugh put the Rush ahead in the third minute, the Dynamo went on the attack, looking for the equalizer. Despite a flurry of good chances, Houston was unable to get past the Rush goalkeeper until Salazar's late strike.
With the draw, the Dynamo U-18s sit at 11-4-4 on the season and are in third place in the league on both points and points per game. Both the U-16s and U-18s will take another break from league play, before resuming in early April with a trip to Colorado to face Real Colorado and Colorado Rush.
U-18: Houston Dynamo (11-4-4) vs. Texas Rush (4-10-6)
March 16, 2013 -- Lents Family Park
USSF Development Academy League
Scoring Summary:
RUSH -- Ryan Stinebaugh 3
HOU -- Bryan Salazar 83
U-16: Houston Dynamo (15-3-1) vs. Texas Rush (10-8-2)
March 16, 2013 -- Lents Family Park
USSF Development Academy League
Scoring Summary:
HOU -- Matthew Dorsey 40
HOU -- Josue Palomino 53
All statistics contained in this boxscore are unofficial.
Dynamo Academy players shine in Reserve League action
Five players from the Dynamo Academy, presented by Statoil, traveled to Frisco this weekend for the first Dynamo Reserves match of 2013. The five players were goalkeeper Leopoldo Castillo, defender Christian Gonzalez, midfielder Christian Diaz, forward Carlos Ibarra and striker Bryan Salazar, who recently signed a homegrown contract with the Houston Dynamo.
Of the five players on the trip, Salazar and Gonzalez were the only ones who featured in the match. Salazar came on as a halftime sub and drew a penalty kick in the second half. After beating a defender on the sideline, the Fort Bend Bush senior got past FC Dallas homegrown defender London Woodberry before he was taken down in the penalty box.
Despite Salazar's nifty footwork, it was Gonzalez who provided the game's fireworks. Holding on to a 2-1 lead late in the match, the 18-year-old right back beat Chris Seitz with a curling left-footed strike from 30 yards to give the Dynamo a 3-1 victory.
Dynamo U-13s travel to Mexico for friendlies
With a break in their league schedule, the Dynamo U-13s went to Guadalajara two weekends ago to play three friendlies against Mexican U-13 squads. The team finished with a 1-1-1 record, including a 3-1 win over the Chivas San Rafael U-13s, a feeder program for famed club Chivas de Guadalajara. Daniel Wiseman, JP Nava and Johnathon Diaz provided the goals for the Dynamo.
In addition to the win over Chivas San Rafael, the Dynamo drew Tecos U-13s 1-1 and lost to Chivas de Guadalajara U-13s 6-0.
Dynamo U-13s and Tecos U-13s take a picture following their 1-1 draw

subset: commoncrawl


text:
If you have never used our systems before please read our Getting Started section. This section is designed to provide new users with enough information to get started using our services.
Alternatively, the search box (above) can be used to check our available document for areas of interest.
Cluster queue status graphs are now available.


text:
Marlins, Saltalamacchia complete three-year deal
Miami fills need for good-hitting catcher by landing free agent with $21 million deal
LAKE BUENA VISTA, Fla. -- Check catcher off the Marlins' shopping list.
After successfully completing his physical, Jarrod Saltalamacchia joined Miami on Friday, when the team formally announced the three-year deal, three days after reaching agreement on a contract. He was introduced in a news conference Monday on the first day of the Winter Meetings in Lake Buena Vista, Fla.
Financial terms were not revealed, but sources confirmed the 28-year-old will make $21 million: $6 million in 2014, $7 million in '15 and $8 million in '16.
Per team policy, the contract does not include a no-trade clause.
The Saltalamacchia signing came at a time when the Marlins are finalizing a one-year deal with free agent Rafael Furcal, who will switch from shortstop to play second base. Furcal, 36, missed all of last season with the Cardinals due to Tommy John surgery on his right elbow.
Saltalamacchia reached agreement early Tuesday night, and passing the physical was the final step. That came on Thursday.
In many ways, the matchup is a natural fit.
The 6-foot-4, 235-pound catcher is a South Florida native, so playing in Miami will be a homecoming. Saltalamacchia attended Royal Palm Beach High School, whis is in the same county as Miami's Spring Training home in Jupiter, Fla.
For the Marlins, Saltalamacchia fills a need for a more offensive-minded catcher. He is a switch-hitter coming off a strong season for the World Series-champion Red Sox, for whom he batted .273 with 14 homers and 65 RBIs.
Saltalamacchia is a career .246 hitter with 78 homers and 275 RBIs in parts of seven big league seasons. But his production especially picked up after he joined Boston in 2010. He belted a career-high 25 homers in 2012.
In each of the past two seasons, Saltalamacchia has appeared in 121 games. His arrival means that Jeff Mathis will become the backup behind the plate. Rob Brantly, Miami's Opening Day catcher last season, likely will open at Triple-A New Orleans.
The fact that the Marlins dipped into the free agent market for a catcher is mildly surprising, because payroll is a concern. They are operating within modest parameters -- payroll projections are estimated to be about $45 million. Plus, in recent years, the organization hasn't had much success signing players to multiyear, free-agent contracts.
In 2012, for instance, the front office went on an unprecedented spending spree, bumping payroll to $100 million in the inaugural season at Marlins Park. High-priced free agents Jose Reyes, Mark Buehrle and Heath Bell each signed multiyear contracts. All three were traded after one disappointing season.
Many in the industry wondered if the Marlins could convince an established free agent to sign a multiyear deal. Saltalamacchia showed they can, if the price and opportunity are right.
Coming off a World Series championship season, Saltalamacchia also becomes an immediate leader and veteran presence on a youthful Miami squad. The Marlins were 62-100 with a core of youthful players in 2013. Signing Saltalamacchia is a signal that the Marlins are looking to keep building, instead of subtracting their core players.
Although the organization has struggled on the field in recent years, their roster is filled with promising talent. But much of it is unproven.
Strong pitching is one reason the Marlins are optimistic they can turn their fortunes around in the next couple of seasons. Despite finishing with 100 losses, the Marlins sported a franchise-best 3.71 ERA in 2013.
The rotation is headed by Jose Fernandez, the 21-year-old sensation who was the National League Rookie of the Year. Nathan Eovaldi is a hard-throwing right-hander, and his fastball reached 100 mph in '13. Henderson Alvarez, projected to be the No. 3 starter, no-hit the Tigers in the regular-season finale.
The bullpen features closer Steve Cishek and some other quality arms like those of Mike Dunn and A.J. Ramos.
Run production is Miami's biggest need. With Saltalamacchia in the fold, the Marlins are looking to add more parts around slugger Giancarlo Stanton, who is not available on the trade front.
Saltalamacchia should be another middle-of-the-lineup presence, but he isn't the only piece the club is looking to add this offseason. Furcal's deal is expected to be finalized after he completes his physical.
The Marlins headed into the Winter Meetings on Monday seeking a third baseman. But if something makes sense, they could explore options for either more power or speed.
A compensatory first-round Draft pick of the Braves in 2003, Saltalamacchia made his Major League debut with Atlanta in 2007. He played three seasons for the Rangers before being dealt to the Red Sox in 2010.


text:
Michigan Bankruptcy Attorney Walter Metzen & Associates located in Detroit
Board Certified Michigan Consumer Bankruptcy Specialist
My name is Walter Metzen. I am a Board Certified Michigan Consumer Bankruptcy attorney who exclusively practices consumer bankruptcy law in the metro Detroit area. Over the past 20+ years that I have practiced Bankruptcy law, I have helped well over 10,000 people in Wayne, Oakland and Macomb Counties get through difficult financial problems with the help of a bankruptcy filing in United States Bankruptcy Court.
The Bankruptcy Laws are United States laws provided for in the US Constitution. For all of metro Detroit, there is one bankruptcy Court located in downtown Detroit at 211 West Fort Street, Detroit. Anyone who files a bankruptcy petition in the tri-county area or Jackson, Lenawee, Monroe, Sanilac, St. Clair or Washtenaw Counties must file their case in the Detroit Court.
If you are a person or married couple considering filing in a bankruptcy case and live in one of these counties, it makes sense that you should hire a law firm that has practiced exclusively in this Detroit Bankruptcy Court for 20+ years. We are very familiar with the specific requirements of this courts clerks, Judges and Trustees. Me and my staff have a very good working relationship with all of the people in this court system and have a very good reputation for excellent client service and have virtually a 100% success rate for a typical Chapter 7 filing.
Bankruptcy will eliminate:
Credit Card Debt
Medical bills
Past due utility bills
Utility Shut offs
Car repossessions
Lines of Credit
Payday Advance loans
In times when consumer debt is at an all time high, even the affluent can be confronted by overwhelming debt as a result of a loss of a job, death of a family member, or severe illness. Filing bankruptcy will immediately get the creditors off your back. With Chapter 7, most debts are able to be discharged or wiped out completely. In Chapter 13, a payment plan will be offered to your creditors paying a percentage of the debt back based on what you can afford. Either way, your financial situation will be greatly improved.
Let us help you decide if bankruptcy is right for you. Contact Us.
Call Bankruptcy Attorney Walter Metzen 313-962-4656 or
Toll Free: 888-777-FILE & 888-DEBTGONE
Walter A. Metzen
Phone: 313-962-4656
Fax: 313-962-4241
Back to top


text:
Italian Switchblade Leverlock Abalone 6 Inch AKC Knife
Italian Switchblade Leverlock knife by AKC with an abalone handle overall open length 6 inches.
Thank you for visiting Horizon Bladeworks. We specialize in automatic knives, Italian Switchblade Stiletto Knives, OTF, Out the Front Opening knives, Assisted opening knives, Tactical fixed blade knives, hunting knives, specialty pocket tools, rescue knives and tools custom hand made knives by famous knife makers.


text:
Today, Biloela is a busy commercial and tourist hub, though it still retains that relaxed, country feeling.
Along with Queensland Heritage Park, a Regional Art Gallery, the Spirit of the Land Mural and the Heritage Listed Greycliffe Homestead, the town stages an impressive annual program of festivals and events.
Like a compass, all roads lead from Biloela, reaching into the country side and out across the region, taking you to all the places you want to see. However, close to home, you'll find fabulous things to see and do.
Note: Information on listed products and services are provided by the operator and were correct at the time of publishing. Rates are indicative based on the minimum and maximum available prices of products and services. Please visit the operator's website for further information. All prices quoted are in Australian dollars (AUD).


text:
A global, interdisciplinary conference presented by the UCLA Institute for Research on Labor and Employment (IRLE) and ADAPT-the Association for International and Comparative Studies in the field of Labour Law and Industrial Relations. First, labor market integration is arguably the most important condition for ensuring full and autonomous participation by immigrants in the society. However, the scale of migration and racial, ethnic, and religious differences of migrants raise new challenges. Second, in the context of demographic aging, many countries are experiencing labor and skill shortages. To tackle this, it has become important to better value the existing skills of some immigrants, and to find ways to upgrade the skills of others. The transferability and recognition of qualifications and work experience that were acquired in different contexts in the countries of origin thus become a relevant issue. Third, there is a persistent perception that migrants compete with native work- ers, especially those from less advantaged groups. Finally, immigrants have been among the groups hardest hit by the difficult labor market situation following the economic downturn of 2008-09. This is particularly true in western economies that are major destinations for international migrants. Governments, institutions, social partners and enterprises must play key roles in strengthening labor standards for migrants, as well as natives, at the macro and micro levels. The conference aims at contributing to the current debate and attaining a better understanding of the causes, consequences and possible responses to these issues on a global scale, through an interdisciplinary and comparative approach. This conference will bring together scholars studying immigration, workforce diversity, and the intersection of the two from the United States, Europe, and around the world. The goal is not just to exchange information, but to advance discussions about strategies and solutions. RSVP at http://www.irle.ucla.edu/events/2013/GlobalMigrationConference.php
How Global Migration Changes the Workforce Diversity Equation
- This event has passed.


text:
Information has always been a key corporate asset that underpins the success or failure of a business. In today's frantic business environment however, the method of obtaining this information dictates how well its value is realised.
It is amazing how many business still try to conduct their operations using paper when in fact, a large majority of their operations are actually digital. For example, many business clients request information, make reservations, purchase products and order services using online digitised forms.
Paper documents are no longer part of many business processes and a move towards automated document capture and document digitisation is currently, the most effective and efficient method to realise the value of corporate information.
The advantages of moving to an environment focused on automated document capture, automated document scanning and document digitisation are many, but include the following:
Utilising new and innovative technologies to manage your operational processes will streamline your business and save you both time and money. Document digitisation makes good business sense.
There are certain key operational areas that benefit from automated document capture, automated document scanning and document digitisation.
Business Process Optimisation
With document digitisation, your employees will be more productive, leading to an increased operational capacity. Leads will always be followed up, accounts and invoices will be paid on time and service requests will be fulfilled as needed.
Documents and files will be automatically sent between staff members or departments with ease, workflow will be optimised and business systems optimised and integrated. All of this is achieved by the digitisation of accounts payable, contract management, HR automation and mail room automation:
RBC Business Solutions provides organisations with the hardware and software that allows for automated document scanning, as well as automated document capture and the storage of operational material. We also assist with information storage on the cloud, on your premises or on a hybrid server.
For more information on the benefits of document digitisation to your organisation, call us on 1300 857 164, email us at firstname.lastname@example.com or complete our online enquiry form.


text:
- This event has passed.
hot springs yoga
October 12, 2019 @ 12:00 pm - 12:45 pm
An event every week that begins at 12:00 pm on Sunday and Saturday, repeating until December 20, 2019
Held in our new Amphitheatre and led by a Peninsula Hot Springs yoga instructor, join friends and fellow bathers in our custom-designed pools for a yoga class like no other. The class combines the benefits of geothermal bathing with stretching, strengthening and balancing yoga poses. This 45 minute experience is open to all levels and is complimentary with Bath House bathing.
Available 12pm Saturdays and Sundays to guests who have pre-booked Bath House bathing.
This experience is recommended for guests 16 years and over.


text:
Tyson Foods suspends plant operations
Tyson's Ford Avenue processing plant has stopped operating
Tyson Foods is suspending operations at its Ford Avenue processing plant in Springdale. A spokesperson for Tyson tells 40/29 News that approximately 60 employees worked there, but the changing demand for certain specialty products has forced the company to consolidate.
"I think businesses are always looking at ways to help their bottom line, any business in any field, and I think that's a smart thing to do," Springdale Mayor Doug Sprouse said. "This decision that Tyson is making shouldn't adversely affect our job numbers at all."
Sprouse says he found out about the consolidation on Friday morning, but he's happy to report no jobs will be lost.
"They're making some decisions internally to be more effective and more efficient, but it's not costing any jobs from everything I understand," Sprouse said.
On Friday afternoon, a Tyson spokesperson confirmed with 4029 that all of the hourly employees at the Ford Avenue plant are being offered permanent positions at other Tyson Foods locations in Northwest Arkansas.
"The important thing for me is they're doing everything they can to consolidate some things but also to put those people to work in other positions in other areas," Sprouse said.
The plant was once used by Tyson for research and development, but in recent years it's been used to make specialty products.
Tyson said they are not closing the plant, but the future of the facility is still unknown.


text:
Sarah - posted on 06/19/2012 ( 418 moms have responded )
I will try to make this short and to the point. If I don't get help my kids are going to suffer even more because they will not have the mom they deserve. I really need some help. I am so sick and tired of being depressed and not finding a med that helps me that I feel like I cannot go another day feeling like this. I can't even play with my kids anymore. I don't even have the strength to open up a sippy cup. Sometimes I don't even want to go into public. I seriously feel like something inside of my body is dying. I am crying all the time and it's hard when I have 5 kids to tend to and a husband. I have been to therapist and doctors (because I have osteoarthritis) and nothing they have given me has helped. I just don't know what to do anymore. I wish I could have my life back. Just in the past year I've gained 30 lbs. I hate myself right now. Any advice?? Also my children have not been to a sitter in over 2 and half years.
- Helpful (39)
- Nice (6)
- Funny (18)
- Encouraging (13)
- Hugs (2)


text: HGL Suite 0.5.40 HGL is a compiler/interpreter suite for developing images. It features its own simple but powerful language, Lua integration, output in various formats as well as runtime input handled by plugins, and easy integration into various environments like Web servers or graphical applications. The input is taken from a source file, which has to be compiled for quick and frequent access by the interpreter. An interpreter then runs the compiled files, takes input from custom plugins (if neccessary), and


text:
I have finished this new batch. They are now in stock.
NOTE: I bought all the OEM GM electric motor pairs this company had. 23 pair. So I'm making 23 kits.
After that I will not make anymore by using junk China motors. They are low quality. So if you are thinking of buying this kit do it soon before all 23 kits are gone.
2-25-2020: 12 kits are sold. Have 11 kits on hand.
Upgrade to really fast electric window motors!
NOTE: Many things contribute to slow electric windows. All the electrical connections (starting at the battery) degrade over time, corrode etc. If the dew wipes are hard that can make them go slower. WIring connections degrade over time. Switches get dirty. The tracks get full of dirt and the grease turns into putty. Another problem is aftermarket window electric motors are low quality. One can take everything apart and clean and relube everything.
You can also upgrade to HD electric window motors:
This was originally an idea of Fierobsessed on the Fiero Forum. Fierobsessed found these electric window motors and mounted these new motors on a steel plate and then mounted them on the Fiero window scissors lift assembly. The problem Fierobsessed had was clearance between these larger electric window motors and the channels the glass rides on. I looked at this for a length of time and devised a way to mount them lower providing more clearance by mounting the plates on top of the motors. Paul Smith worked with me to work out the kinks and he has installed them in one of his Fiero's and it worked out well. Although the clearance is minimal it was around 1/4".
This is the kit, it is very complete
The trick to making this modification work is I mount the electric motor to a laser cut steel plate that is mounted on top of the motor. This motor/plate assembly then gets mounted to the steel window scissors lift assembly. I also do some modifications to the electric motors so they sit lower.This is as low as you can go.
When you bolt the motors on to the scissors assembly for the final time rotate the large gear so it is at about at the 3/4 window up position. At the 3/4 window up position allows you to install the assembly back in the door with no clearance problems.
NOTE: Before the final installation: The gear and scissors gear need to be greased. If left dry it wears faster.
The wiring harnesses need to be extended to reach the new motors. Included in the kit are 2 new pigtails with 6" leads on them. You cut off the ends from your existing door wiring harness then use the supplied butt splices plus adhesive lined shrink tube to make the wires to the motors longer and also waterproof. The wires are opposite. The blue connects to the brown and the brown connects to the blue.
How do I attach the window motor scissors assembly back into the door? The preferred method is to weld in four 1/4 x 20 square nuts as shown in the picture above. I include eight unplated 1/4 x 20 square nuts if you choose to do it this way. Also included are four 1/4 x 20 flat head screws. You use the flat head screws to hold the nuts in place before welding. This trick insures the square nut is perfectly centered over the hole on the steel scissors plate. Note: If you happen to have a HD rivet gun you can use large aluminum rivets again.
Included are eight new 1/4 x 20 serrated flange bolts to mount the scissors assembly back into the doors.
Optional mounting kit:
To make this as easier kit to install and not require welding I also offer an upgrade kit that includes eight 1/4 x 20 U nuts and a step drill. But remember: You are trying to keep the motor at a minimum height, using these clip nuts raises the scissors assembly around 1 mm. That should generally not be a problem.
Special installation note when using the U nuts: Because the clearance between the large gear and the steel scissors plate is minimal I include four 1/4 x 1/2" long Allen head bolts to help the installation when using the U nuts. When installing the scissors assembly back in to the door use the four longer Allen head screws to get it mounted and in place. Once all four Allen head bolts are tightened remove one Allen head bolt at a time and install the shorter serrated flange bolts. Do not leave the four longer Allen head bolts in. They may hit the large gear.
Additional installation tips:
Not much more work than installing new aftermarket stock replacement electric motors in your Fiero. The scissors assembly has to be removed and these new motors installed on the scissors assembly.
I am not offering this as a DIY kit. I do several machining/milling modifications to these electric window motors to make them work in my kits. I also will not offer these with the low cost/low quality China made electric window motors available everywhere. No one should go thru all this work to install these to only have the low cost China made motors fail after a short time. Do it once and do it right.
Install this yourself or if you do not have the skills needed have a professional install this kit.
I do not offer free shipping.
Because I use postal flat rate boxes for heavy orders there is no program that can add the proper amount of shipping to every order. So all shipping is added manually by myself after you place your order. That is explained here: Shipping added later explanation
When you place an order the shipping amount will show $0.00. Soon after you place an order you will receive an email confirmation that shows the amount of shipping that was added to your order.
Shipping is $14.00 (Midwest USA)
Final shipping cost is determined by weight of the item(s) and distance from Milwaukee, WI. Shipping prices quoted are for items shipped to the Midwest area in the USA. If you are ordering a single item or multiple items the total shipping price is determined after you place the order. I try to keep my shipping prices to a minimum and use Postal Flat Rate boxes whenever I can utilize them for an order.


text:
Third Time Will be the Charm
Now that the surreal moments of Wednesday night have had enough time to fester within my mind, it still somehow resonates emotionally through me at the most inappropriate moment like Christmas,New Years and my birthday all rolled into a finely wrapped hotdog wrapper. I honestly do not want to let it slide into my subconscious, but want it to surround and comfort me as we begin our quest at 5:07 today for another chance at the golden chalace.
I want to still savory and hold tight this third bite into the MLB post season with the same intenity and fevor as I cherished in 2008 when we set sail on our maiden voyage into the turbulant land of post season baseball. But this time the waters are charted with landmarks, perils have been exposed and the journey is up to more than just fate and a sprinkle of luck. This time we came to play hard ball.
Even though the sweet sticky remains of the champagne celebration have been washed from my clothes and body, it's scent still lingers in a place where all memorable sensory experiences go to rejoice and to be remembered. The first time I tasted that celebratory nectar it was anticipated, the second was a prize gifted out of this team's knack for resilience, but the third, well the third time definitely is the glittering jewel.
For this thrid venture into the Major League Baeball post season solidifies the fact the Rays are not a fluke, that this team was not granted anything. This third stroll into the playoff garden was not manufactured by the "Baseball Gods", but by young martals who have strived all season long to live their long-haired sensei's mantra of "Finding Another Way".
This Rays squad advanced into the post season not on their laurels or their past efforts, but on their own sweat, blood and tears. Whispers immediately emerged just past midnight Thursday that "the Yankees gave up" after the David (Baltimore) laid upon the corpse of Goliath (Boston). I am not sure of New York RP Scott Proctor's mindset at the moment, but failure was probably not an option.
I actually find it kind of poetic justice that former Rays, now Red Sox LF Carl Crawford who in my ESPN dairy basically set up the Rays internal fires to conquer the Boton behemoths played such a critical role in their advancement. Crawford did not know his miss of a liner by Oriole Robert Andino would set such a firestorm in motion.
Proctor, who was on the mound when the news spread around the Trop like wild fire did not know of Crawford's missed opportunity. When he threw that ill faded pitch inside to Evan Longoria he had no idea that Longo would pull in his wrists, re-elevate the bat and get just enough to curl the pitch within a space just under Section 137 of Tropicana Field.
Ironically, the same spot Longoria's Home Run curved over was the same section of fencing taken down by the Rays stadium staff to help Crawford possibly steal a few Home Runs back in 2007. For once, it seemed the Rays universe had used its karma of " what goes around, comes around". With the ball clearing jut to the right of the 317 signage, I swear the Trop's roof rose 5 inches.
To say pandemonium broke out would be an understatement. What actually happened was an entire region exhaling at the same time, from a moment of sheer deafening silence to even Yankees and Rays fans embracing the moment. World came together, frustrations melted, hope,destiny,fate and their new friend karma all embraced during the scene.
Finally those around baseball knew emphatically that this Rays squad was built to last, not to fade away like some others. The very fabric this team was built on was woven by the mantras and the teachings of Rays Manager Joe Maddon and his trusty quips and quos.
From 9=8 to 9>8 to "The Rays Ways" to the 2011 mantra "Find Another Way" this team has matured, grown wiser beyond their years and embraced youth along with veterans. What we truly witnessed Wedneday night was shocking to some within the baseball world, but in reality, they knew the potential was there.
A new chapter starts today at 5:07 EST. Even though it is a return engagement against a known ALDS foe, this time the Rays are coming. In their corner is the aspect of playing the last 2 weeks as if they were already in a "must win" scenario. Scratching, clawing, finding that "other way" to win. This series will be defined on who blinks first. Who wants it more. Who still has that drive within them when the dark cloud emerge.
We already know the Rays have that fire, that intensity, that drive within them to be the last men standing. I know so many have already thrown the spotlight towards the Texas Rangers, and that is perfectly fine with me. Since their 1-8 start the Rays have made people take second glances, made even the best teams squander wins and leave the field wondering what happened.
My prediciton, Rays in 5 games. Time to wrangle some Rangers.