Annotation of doc/homework/homework5.html, revision 1.21
1.1 albertel 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2: <html>
3: <head>
4: <title>LON-CAPA Homework System</title>
5: </head>
6:
1.5 ng 7: <body bgcolor="white">
1.1 albertel 8: <h1>LON-CAPA Homework System</h1>
9:
10: <h2>Tags</h2>
11: <ul>
12: <li>
13: Response tags
14: <p>
15: Arguments for all response tags
16: </p>
17: <ul>
18: <li>
19: <i>ID</i>, if this isn't set it will be set during
20: the publication step. It is used to assign parameters names
21: in a way that can be tracked if an instructor modifies
22: things by hand.
23: </li>
24: <li>
25: <i>name</i> optional, if set, it will be used by the
26: resource assembly tool when one is modifying parameters.
27: </li>
28: </ul>
29: <p>
30: Implemented response tags
31: </p>
32: <ul>
33: <li>
1.2 albertel 34: <b><responseparam></b> if it appears it should be
35: inside of a <*response> tag, defines an externally
36: adjustable parameter for this question. Arguments:
37: <ul>
38: <li>
39: <i>default</i> required, specifies a default value for
40: the parameter
41: </li>
42: <li>
43: <i>name</i> required, specifies an internal name for
44: the parameter
45: </li>
46: <li>
47: <i>type</i> required specifies the type of parameter,
48: one of "tolerance", "int", "float", "string", "date"
49: (configuration of paramters is handled by
50: lonparmset.pm and parameter.html)
51: </li>
52: <li>
53: <i>description</i> a string describing the parameter,
54: this is what is used to talk about a parameter outside
55: of a problem
56: </li>
57: </ul>
58: </li>
59: <li>
1.16 albertel 60: <b><parameter></b> exactly the same as
61: <responseparam> currently, but should not appear
62: inside of a <*response>
63: </li>
64: <li>
1.1 albertel 65: <b><numericalresponse></b> implements a numerical
66: answer, it needs an internal <b><textline></b> for
67: the response to go in. It checks all styles of numerical
68: supported in CAPA. Possible args are:
69: <ul>
1.8 albertel 70: <li><i>answer</i> required, specifies the correct answer, may be either a perl list or scalar</li>
1.1 albertel 71: <li><i>units</i> optional, specifies unit of correct answer, CAPA style</li>
72: </ul>
73: </li>
74: <li>
1.8 albertel 75: <b><stringresponse></b> implements a string answer,
76: it needs an internal <b><textline></b> for the
77: response to go in. It can check the string for either case
78: or order.
79: <ul>
80: <li><i>answer</i> required, specifies the correct answer, may be either a perl list or scalar</li>
81: <li><i>type</i> optional, CAPA style str args, cs/ci/mc
82: <ul>
83: <li>cs - case senesitive, order important</li>
84: <li>ci - case insenesitive, order important</li>
85: <li>mc - case insenesitive, order unimportant</li>
86: </ul>
87: </li>
88: </ul>
89: <li>
1.1 albertel 90: <b><essayresponse></b> implements a ungraded large
1.17 albertel 91: text response, it need an internal <b><textfield></b>
1.1 albertel 92: for the response to go in.
93: </li>
94: <li>
95: <b><imageresponse></b> implements a image click
96: style image submission, uses the foil structure tags <a
97: href="#foil">below</a>. Additional tags that should appear
98: in a <foil> are:
99: <ul>
100: <li><b><image></b> required, the contained text
101: specifies a published graphical resource that is the
102: image used, should only appear once per foil</li>
103: <li><b><rectangle></b> required, the contained text
104: specifies a rectangular area that is correct, should
105: look like (1,2)-(3,4), at least 1 required</li>
106: <li><b><text></b> required, the contained text is
107: printed on top of the image.</li>
108: </ul>
109: </li>
110: <li>
111: <b><optionresponse></b> implements a "select from
112: these choices" style question, the choices are specified
113: by the instructor, it uses the foil structure tags <a
114: href="#foil">below</a> with this additional args:
115: <ul>
116: <li>
117: <b><foilgroup></b> is required to have
118: <i>options</i> which should be a perl list of possible
119: options for the student.
120: </li>
121: </ul>
122: </li>
123: <li>
124: <b><radiobuttonresponse></b> implements a true / false
125: style question with 1 correct answer.it uses the foil
126: structure tags <a href="#foil">below</a> but the
127: <i>value</i> of a <foil>can only be "true" or
128: "false" or "unused"
129: </li>
1.10 albertel 130: <li>
131: <b><dataresponse></b> implements a straight data
132: storage entry idea, needs and interveing input tag like
133: <textline> to work correctly.<br>
134: Arguments:
135: <ul>
136: <li>
137: <i>name</i> internal name for the value, it will have
138: the part id and respose id added on to it
139: </li>
140: <li>
141: <i>type</i> type of data stored in this response
142: field, should be one of the types supported by
143: parameter.html
144: </li>
145: <li>
146: <i>display</i> a string that will be used to describe
147: the field when interfacing with humans
148: </li>
149: </ul>
1.15 albertel 150: </li>
1.10 albertel 151: <li>
1.15 albertel 152: <p>
153: <b><externalresponse></b> implements the ability to have
154: an external program grade a response, expects either a
155: <textline> or <textfield> inside the tag. <br />
156: </p>
157: Arguments:
158: <ul>
159: <li>
160: <i>url</i> the url to submit the answer and form to,
161: does not need to be a LON-CAPA machine.
162: </li>
163: <li>
164: <i>answer</i> a string or scalar variable that can
165: encode something that should encode the correct
166: answer, in some cases this may be nothing.
167: </li>
168: <li>
169: <i>form</i> a hash variable name that will be
170: submitted to the remote site as a HTTP form.
171: </li>
172: </ul>
173: <p>
174: The response of the remote server needs to be in XML as follows.
175: </p>
176: <pre>
177: <loncapagrade>
178: <awardetail>
179: CORRECT
180: </awardetail>
181: <message>
182: A message to be shown to the students
183: </message>
184: </loncapagrade>
185: </pre>
186: <ul>
187: <li>
188: <b><loncapagrade></b> no arguments but must
189: surround the response.
190: </li>
191: <li>
192: <b><awardetail></b> required inner tag, the
193: response inside must be one of the detailed responses
194: that appears in the data storage documentation
195: (CVS:loncapa/doce/homework/datastorage)
196: </li>
197: <li>
198: <b><message></b> optional message to have shown
199: to the student
200: </li>
201: </ul>
202: </li>
1.1 albertel 203: </ul>
204: <li>
205: <a name="foil">Foil Structure Tags</a>
206: <p>
207: All tags that implement a foil structure have an optional
208: arg of <i>max</i> that controls the maximum number of total
209: foils to show.
210: </p>
211: <ul>
212: <li>
213: <b><foilgroup></b> required, must be the tag that
214: surrounds all foil definitions
215: </li>
216: <li>
217: <b><foil></b> required, all data inside is a possible foil
218: </li>
219: <li>
220: <b><conceptgroup></b> optional, surrounds a
221: collection of <foil>, when a problem is displayed
222: only one of the contained <foil>is selected for
223: display. It receives one required argument
224: <i>concept</i>.
225: </li>
226: </ul>
227: </li>
228: <li>
229: Hint structure
230: <p>
231: All of these tags must appear inside a <b><*response></b> tag.
232: </p>
233: <ul>
234: <li>
235: <b><hintgroup></b> Tag that surrounds all of a hint.
236: </li>
237: <li>
238: <b><hintpart></b> required, Tag to implement
239: conditional hints. It has a required argument
240: <i>on</i>. When a <*hint> tag named the same as the
241: value the </i>on</i> attribute evaluates to be correct the
242: <hintpart> will show. If no other <hintpart>
243: are to show then all hintparts with a <i>on</i> of
244: "default" will show
245: </li>
246: <li>
247: <b><numericalhint></b> has all the arguments that
248: <numericalresponse>, does and the required attribute
249: <i>name</i> which should be set to the value of which
250: <hintpart> will be shown.
251: </li>
1.21 ! albertel 252: <li>
! 253: <b><stringhint></b> has all the arguments that
! 254: <stringresponse>, does and the required attribute
! 255: <i>name</i> which should be set to the value of which
! 256: <hintpart> will be shown.
! 257: </li>
! 258: <li>
! 259: <b><formulahint></b> has all the arguments that
! 260: <formularesponse>, does and the required attribute
! 261: <i>name</i> which should be set to the value of which
! 262: <hintpart> will be shown.
! 263: </li>
! 264: <li>
! 265: <b><optionhint></b> required attribute <i>name</i>
! 266: which should be set to the value of which <hintpart>
! 267: will be shown.
! 268: </li>
! 269: <li>
! 270: <b><radiobuttonhint></b> has the required attribute
! 271: <i>name</i> which should be set to the value of which
! 272: <hintpart> will be shown, and <i>answer</i> which
! 273: should be a two element list, frist the type (foil or
! 274: concept) and then either the foil's name or the concept's
! 275: string
! 276: </li>
1.1 albertel 277: </ul>
278: </li>
279: <li>
280: Input Tags
281: <p>
282: This group of tags implement a mechanism for getting data
283: for students, they will usually be used by a
284: <*response>.
285: </p>
286: <ul>
287: <li>
1.17 albertel 288: <b><textfield></b> creates a Large text input box, If
1.1 albertel 289: data appears between the start and end tags, the data will
1.17 albertel 290: appear in the textfield if the student has not yet made a
1.1 albertel 291: submission. Additionally it takes two arguments <i>rows</i>
292: and <i>cols</i> which control the height and width of the
293: area respectively. It defaults to 10 and 80.
294: </li>
295: <li>
296: <b><textline></b> creates a single line of input
297: element, it accepts 1 argument <i>size</i> which controls
298: the width on the textline, it defaults to 20.
299: </li>
300: </ul>
301: </li>
302: <li>
303: Output Tags
304: <p>
305: This group of tags generate useful pieces of output.
306: </p>
307: <ul>
308: <li>
1.15 albertel 309: <b><standalone></b> everything in between the start
310: and end tag is shown only on the web, and only if the
311: resource is not part of a course.
312: </li>
313: <li>
1.1 albertel 314: <b><displayduedate></b> this will insert the current
315: duedate if one is set into the document. It is generated
316: to be inside a table of 1x1 elements
317: </li>
318: <li>
319: <b><displaytitle></b> this will insert the title of
320: the problem from the metadata of the problem
321: </li>
322: <li>
323: <b><window></b> the text in between is put in a
324: popup javascript window
325: </li>
1.12 albertel 326: <li>
327: <b><m></b> the inside text is LaTeX, and is
328: converted to HTML (or MathML) on the fly, if the argument
329: <i>eval</i> is set to "on" the intervening text will have
330: a perl var expansion done to it before being converted.
331: </li>
1.15 albertel 332: <li>
333: <b><randomlabel></b> shows a specified image with
334: images or text labels randomly assigned to a set of
335: specific locations, those locations may also have values
336: assigned to them. There is a hash generated conating the
337: mapping of labels to locations, labels to values, and
338: locations to values. Example:
339: <pre>
340: <randomlabel bgimg="URL" width="12" height="45" texwidth="50">
341: <labelgroup name="GroupOne" type="image">
342: <location x="123" y="456" value="10" />
343: <location x="321" y="654" value="20" />
344: <location x="213" y="546" value="13" />
345: <label description="TEXT-1">IMG-URL</label>
346: <label description="TEXT-2">IMG-URL</label>
347: <label description="TEXT-3">IMG-URL</label>
348: </labelgroup>
349: <labelgroup name="GroupTwo" type="text">
350: <location x="12" y="45" />
351: <location x="32" y="65" />
352: <location x="21" y="54" />
353: <label>TEXT-1</label>
354: <label>TEXT-2</label>
355: <label>TEXT-3</label>
356: </labelgroup>
357: </randomlabel>
358: </pre>
359: Arguments:
360: <ul>
361: <li>
362: <i>bgimg</i> either a fully qualified URL for an
363: external image, or a loncapa resource, it supports
364: relative references (../images/apicture.gif), the
365: image must either be a GIF or JPEG
366: </li>
367: <li>
368: <i>width</i> the width of the image in pixels
369: </li>
370: <li>
371: <i>height</i> the height of the image in pixels
372: </li>
373: <li>
374: <i>texwidth</i> the width of the image in millimeters
375: </li>
376: </ul>
377: Internal tags:
378: <ul>
379: <li>
380: <b><labelgroup></b> 1 required, multiple
381: allowed. Declares a group of locations and labels
382: associated with them. <br />Arguments:
383: <ul>
384: <li>
385: <i>name</i> this is the name of the group, a hash
386: with this name will be generated holding the
387: mappings for later use in the problem. For each
388: location a value will be set for which label is
389: there, (EX. $hash{'1'}="TEXT-2"). For locations
390: with values the hash will contain 2 items, a
391: location to value mapping ($hash{'value_1'}=10),
392: and a label to value mapping
393: ($hash{'labelvalue_2'}=10). For all image style of
394: labels there will also be a label description to
395: label URL mapping ($hash{'image_2'}=IMG-URL). Also
396: the entry 'numlocations will be set to the total
397: number of locations that exist.
398: (Note that locations and labels start counting from 1.)
399: </li>
400: <li>
401: <i>type</i> the type of labels in this group,
402: either 'image' or 'text'
403: </li>
404: </ul>
405: </li>
406: <li>
407: <b><location></b> declares a location on the
408: image that a label should appear at <br />Arguments:
409: <ul>
410: <li>
411: <i>x</i> the x value of the location in pixels
412: </li>
413: <li>
414: <i>y</i> the y value of the location in pixels
415: </li>
416: <li>
417: <i>value</i> a scalar value to associate at this
418: location (optional)
419: </li>
420: </ul>
421: </li>
422: <li>
423: <b><label></b> declaration of a label, if this
424: is a text type labelgroup the internal text should be
425: the text of the label (HTML is not currently
426: supported), if this is an image type of label the
427: internal text must be a LON-CAPA resource
428: specification, and the description filed must be set.
429: <br />Arguments:
430: <ul>
431: <li>
432: <i>description</i> a required field for image
433: labels, it will be used when setting values in the
434: hash.
435: </li>
436: </ul>
437: </li>
438: </ul>
439: </li>
1.1 albertel 440: </ul>
441: </li>
442: <li>
443: Scripting
1.15 albertel 444: <p>
445: These tags allow the document to behave programatically
446: </p>
447: <ul>
448: <li>
1.1 albertel 449: <b><display></b> the intervening perl script is
450: evaluated in the safe space and the return value of the
451: script replaces the entire tag
452: </li>
453: <li>
454: <b><import></b> causes the parse to read in the file
455: named in the body of the tag and parse it as if the entire
456: text of the file had existed at location of the tag
457: </li>
458: <li>
459: <b><parserlib></b> the enclosed filename contains
460: definitions for new tags
461: </li>
462: <li>
463: <b><script></b> if the argument <i>type</i> is set
464: to "loncapa/perl" the enclosed data is a perl script which
465: is evaluated inside the perl Safe space. The return value
466: of the script is ignored.
467: </li>
468: <li>
469: <b><scriptlib></b> the enclosed filename contains
470: perl code to run in the safe space
471: </li>
472: <li>
473: <b><block></b> has a required argument
474: <i>condition</i> that is evaluated, it the condition is
475: true everything inside the tag is evaluated, if it is false
476: everything inside the block tag is skipped
477: </li>
478: <li>
479: <b><notsolved></b> everything inside the tag is
480: skipped if the problem is "solved"
481: </li>
482: <li>
483: <b><postanswerdate></b> everything inside the tag is
484: skipped if the problem is before the answer date
485: </li>
486: <li>
487: <b><preduedate></b> everything inside the tag is
488: skipped if the problem is after the due date
489: </li>
490: <li>
491: <b><randomlist></b> the enclosed tags are parsed in
1.13 albertel 492: a stable random order, optional argument <i>show</i>
493: restricts the number of tags indie that are actually
494: parsed the no more than <i>show</i>.
1.1 albertel 495: </li>
496: <li>
497: <b><solved></b> everything inside the tag is
498: skipped if the problem is "not solved"
499: </li>
500: <li>
501: <b><while></b> implements a while loop, required
502: argument <i>condition</i> is a perl scriptlet that when
503: evaluated results in a true or false value, on true the
504: entirety of the text between the whiles is parsed. The
505: condition is tested again, etc. If false it goes to the
506: next node in the parse.
507: </li>
508: </ul>
509: </li>
510: <li>
511: Structure Tags
512: <p>
513: These tags give the problem a structure and take care of the
514: recording of data and giving the student messages.
515: </p>
516: <ul>
517: <li>
518: <b><problem></b> must be the first tag in the file,
519: this tag sets up the header of the webpage and generates
520: the submit buttons, it also handles due dates properly
521: </li>
522: <li>
523: <b><part></b> must be below <problem> if it is
524: going to be used. It does many of the same tasks as
525: <problem> but allows multiple separate problems to
526: exist in a single file.
527: </li>
528: <li>
529: <b><startouttext></b><b><endouttext></b> these
530: tags are somewhat special, they must have no internal text
531: and occur in pairs. Their use is to mark up the problem so
532: the web editor knows what sections should be edited in a
533: plain text block on the web.
534: </li>
1.18 albertel 535: <li>
536: <b><comment></b> Allows one to comment out sections
537: of code in a balanced manner, or to provide a comment
538: description of how a problem works. Only shows up for the
539: edit target, stripped out for all other targets.
540: </li>
1.1 albertel 541: </ul>
542: </li>
543: </ul>
544: <h2><script> Functions</h2>
545: <p>
546: A list of functions that have been written that are available in
1.5 ng 547: the Safe space scripting environment inside a problem.
1.1 albertel 548: </p>
549: <ul>
1.3 ng 550: <li>sin(x), cos(x), tan(x)</li>
551: <li>asin(x), acos(x), atan(x), atan2(y,x)</li>
552: <li>log(x), log10(x)</li>
553: <li>exp(), pow(x,y), sqrt(x)</li>
554: <li>abs(x), sgn(x)</li>
555: <li>erf(x), erfc(x)</li>
556: <li>ceil(x), floor(x)</li>
557: <li>min(...), max(...)</li>
558: <li>factorial(n)</li>
559: <li>N%M</li>
560: <li>sinh(x), cosh(x), tanh(x)</li>
561: <li>asinh(x), acosh(x), atanh(x)</li>
562: <li>roundto(x,n)</li>
563: <li>web("a","b","c") or web(a,b,c)</li>
564: <li>html("a") or html(a)</li>
565: <li>j0(x), j1(x), jn(n,x), jv(y,x)</li>
566: <li>y0(x), y1(x), yn(n,x), yv(y,x)</li>
1.1 albertel 567: <li>random</li>
568: <li>choose</li>
1.3 ng 569: <li>tex("a","b") or tex(a,b)</li>
570: <li>var_in_tex(a)</li>
571: <li>to_string(x), to_string(x,y)</li>
572: <li>class(), section()</li>
573: <li>name(), student_number()</li>
574: <li>open_date(), due_date(), answer_date()</li>
575: <li>sub_string()</li>
576: <li>array_moments(array)</li>
1.15 albertel 577: <li>format(x,y),prettyprint(x,y)</li>
1.3 ng 578: <li>map(...)</li>
1.1 albertel 579: <li>caparesponse_check</li>
580: <li>caparesponse_check_list</li>
581: </ul>
1.5 ng 582: <!-- Table inserted by H. K. Ng
583: 06/01/2001
584: 06/12/2001
585: -->
586: <p>
587: Detailed descriptions of each function and comparison with CAPA.
588: </p>
1.4 ng 589:
590: <table border=1>
591: <tr>
592: <td valign="top"><b>CAPA Functions</b</td>
593: <td valign="top"><b>LON-CAPA</b</td>
594: <td valign="top"><b>Descriptions</b</td>
595: <td valign="top"><b>Differences (if any)</b</td>
596: </tr>
597:
598: <tr>
599: <td valign="top">sin(x), cos(x), tan(x)</td>
600: <td valign="top">&sin($x), &cos($x), &tan($x)</td>
601: <td valign="top">Trigonometric functions where x is in radians. $x
602: can be a pure number, i.e., you can call &sin(3.1415)</td>
603: <td valign="top"> </td>
604: </tr>
605:
606: <tr>
607: <td valign="top">asin(x), acos(x), atan(x), atan2(y,x)</td>
608: <td valign="top">&asin($x), &acos($x), &atan($x), &atan2($y,$x)</td>
609: <td valign="top">Inverse trigonometric functions. Return value is
610: in radians. For asin and acos the value of x must be between -1 and 1.
611: The atan2 returns a value between -pi and pi the sign of which is determined
612: by y. $x and $y can be pure numbers</td>
613: <td valign="top"> </td>
614: </tr>
615:
616: <tr>
617: <td valign="top">log(x), log10(x)</td>
618: <td valign="top">&log($x), &log10($x)</td>
619: <td valign="top">Natural and base-10 logarithm. $x can be a pure number</td>
620: <td valign="top"> </td>
621: </tr>
622:
623: <tr>
624: <td valign="top">exp(x), pow(x,y), sqrt(x)</td>
625: <td valign="top">&exp($x), &pow($x,$y), &sqrt($x)</td>
626: <td valign="top">Exponential, power and square root, i.e.,e<sup>x</sup>, x<sup>y</sup> and /x. $x and $y can be pure numbers</td>
627:
628: <td valign="top"> </td>
629: </tr>
630:
631: <tr>
632: <td valign="top">abs(x), sgn(x)</td>
633: <td valign="top">&abs($x), &sgn($x)</td>
634: <td valign="top">Abs takes the absolute value of x while sgn(x) returns
635: 1, 0 or -1 depending on the value of x. For x>0, sgn(x) = 1, for x=0, sgn(x)
636: = 0 and for x<0, sgn(x) = -1. $x can be a pure number</td>
637: <td valign="top"> </td>
638: </tr>
639:
640: <tr>
641: <td valign="top">erf(x), erfc(x)</td>
642: <td valign="top">&erf($x), &erfc($x)</td>
643: <td valign="top">Error function. erf = 2/sqrt(pi) integral (0,x) e<sup>t-sq</sup> and <i> erfx(x)</i> = 1.0 - <i>erf(x)</i>. $x can be a pure number</td>
644: <td valign="top"> </td>
645: </tr>
646:
647: <tr>
648: <td valign="top">ceil(x), floor(x)</td>
649: <td valign="top">&ceil($x), &floor($x)</td>
650: <td valign="top">Ceil function returns an integer rounded up whereas
651: floor function returns and integer rounded down. If x is an integer than
652: it returns the value of the integer. $x can be a pure number</td>
653: <td valign="top"> </td>
654: </tr>
655:
656: <tr>
657: <td valign="top">min(...), max(...)</td>
658: <td valign="top">&min(...), &max(...)</td>
659: <td valign="top">Returns the minimum/ maximum value of a list of
660: arguments if the arguments are numbers. If the arguments are strings then
661: it returns a string sorted according to the ASCII codes</td>
662: <td valign="top"> </td>
663: </tr>
664:
665: <tr>
666: <td valign="top">factorial(n)</td>
667: <td valign="top">&factorial($n)</td>
668: <td valign="top">Argument (n) must be an integer else it will round
669: down. The largest value for n is 170. $n can be a pure number</td>
670: <td valign="top"> </td>
671: </tr>
672:
673: <tr>
674: <td valign="top">N%M</td>
675: <td valign="top">$N%$M</td>
676:
677: <td valign="top">N and M are integers and returns the remainder (in
678: integer) of N/M. $N and $M can be pure numbers</td>
679: <td valign="top"> </td>
680: </tr>
681:
682: <tr>
683: <td valign="top">sinh(x), cosh(x), tanh(x)</td>
684: <td valign="top">&sinh($x), &cosh($x), &tanh($x)</td>
685: <td valign="top">Hyperbolic functions. $x can be a pure number</td>
686: <td valign="top"> </td>
687: </tr>
688:
689: <tr>
690: <td valign="top">asinh(x), acosh(x), atanh(x)</td>
691: <td valign="top">&asinh($x), &acosh($x), &atanh($x)</td>
692: <td valign="top">Inverse hyperbolic functions. $x can be a pure number</td>
693: <td valign="top"> </td>
694: </tr>
695:
696: <tr>
1.9 ng 697: <td valign="top">/DIS($x,"nn")</td>
698: <td valign="top">&format($x,"nn")</td>
1.19 albertel 699: <td valign="top">Display or format $x as nn where nn is nF or nE and n is an integer. Also supports the first character being a $, it thjen will format the result with a call to &dollarformat() described below.</td>
1.9 ng 700: <td valign="top"> The difference is obvious.</td>
701: </tr>
702:
703: <tr>
1.15 albertel 704: <td valign="top">Not in CAPA</td>
705: <td valign="top">&prettyprint($x,"nn")</td>
1.19 albertel 706: <td valign="top">Display or format $x as nn where nn is nF or nE and n is an integer. Also supports the first character being a $, it then will format the result with a a call to &dollarformat() described below. In E mode it will attempt to generate a pretty x10^3 rather than a E3 following the number</td>
1.15 albertel 707: <td valign="top"> </td>
708: </tr>
709:
710: <tr>
1.19 albertel 711: <td valign="top">Not in CAPA</td>
712: <td valign="top">&dollarformat($x</td>
713: <td valign="top">Reformats $x to have a $ (or \$ if in tex mode) and to have , grouping thousands.</td>
714: <td valign="top"> </td>
715: </tr>
716: <tr>
1.4 ng 717: <td valign="top">roundto(x,n)</td>
718: <td valign="top">&roundto($x,$n)</td>
719: <td valign="top">Rounds a real number to n decimal points. $x and
720: $n can be pure numbers</td>
721: <td valign="top"> </td>
722: </tr>
723:
724: <tr>
725: <td valign="top">web("a","b","c") or web(a,b,c)</td>
726: <td valign="top">&web("a","b","c") or &web($a,$b,$c)</td>
727: <td valign="top">Returns either a, b or c depending on the output
728: medium. a is for plain ASCII, b for tex output and c for html output</td>
729: <td valign="top"> </td>
730: </tr>
731:
732: <tr>
733: <td valign="top">html("a") or html(a)</td>
734: <td valign="top">&html("a") or &html($a)</td>
735: <td valign="top">Output only if the output mode chosen is in html
736: format</td>
737: <td valign="top"> </td>
738: </tr>
739:
740: <tr>
741: <td valign="top">jn(m,x)</td>
742: <td valign="top">&j0($x), &j1($x), &jn($m,$x), &jv($y,$x)</td>
743: <td valign="top">Bessel functions of the first kind with orders 0,
744: 1 and m respectively. For jn(m,x), m must be an integer whereas for jv(y,x),
745: y is real. $x can be a pure number. $m must be an integer and can be a
746: pure integer number. $y can be a pure real number</td>
747: <td valign="top">In CAPA, j0, j1 and jn are contained in one function,
1.5 ng 748: jn(m,x) where m takes the value of 0, 1 or 2. jv(y,x) is new to LON-CAPA.</td>
1.4 ng 749: </tr>
750:
751: <tr>
752: <td valign="top">yn(m,x)</td>
753: <td valign="top">&y0($x), &y1($x), &yn($m,$x), &yv($y,$x)</td>
754: <td valign="top">Bessel functions of the second kind with orders
755: 0, 1 and m respectively. For yn(m,x), m must be an integer whereas for
756: yv(y,x), y is real. $x can be a pure number. $m must be an integer and
757: can be a pure integer number. $y can be a pure real number</td>
758: <td valign="top">In CAPA, y0, y1 and yn are contained in one function,
1.5 ng 759: yn(m,x) where m takes the value of 0, 1 or 2. yv(y,x) is new to LON-CAPA.</td>
1.4 ng 760: </tr>
761:
762: <tr>
763: <td valign="top">random(l,u,d)</td>
764: <td valign="top">&random($l,$u,$d)</td>
765: <td valign="top">Returns a uniformly distributed random number between
766: the lower bound, l and upper bound, u in steps of d. $l, $u and $d can
767: be pure numbers</td>
768: <td valign="top">In CAPA, all the 3 arguments must be of the same
769: type. However, now you can mix the type</td>
770: </tr>
771:
772: <tr>
773: <td valign="top">choose(i,...)</td>
774: <td valign="top">&choose($i,...)</td>
775: <td valign="top">Choose the ith item from the argument list. i must
776: be an integer greater than 0 and the value of i should not exceed the number
777: of items. $i can be a pure integer</td>
778: <td valign="top"> </td>
779: </tr>
780:
781: <tr>
1.11 albertel 782: <td valign="top">/MAP(seed;w,x,y,z;a,b,c,d)</td>
1.7 ng 783: <td valign="top">Option 1 - &map($seed,[\$w,\$x,\$y,\$z],[$a,$b,$c,$d]) or <br>
784: Option 2 - &map($seed,\@mappedArray,[$a,$b,$c,$d]) <br>
785: Option 3 - @mappedArray = &map($seed,[$a,$b,$c,$d]) <br>
786: Option 4 - ($w,$x,$y,$z) = &map($seed,\@a) <br>
787: where $a='A'<br>
788: $b='B'<br>
789: $c='B'<br>
790: $d='B'<br>
791: $w, $x, $y, and $z are variables</td>
1.6 ng 792: <td valign="top">Assigns to the variables $w, $x, $y and $z the values of the
1.7 ng 793: $a, $b, $c and $c (A, B, C and D). The precise value for $w .. depends
794: on the seed. (Option 1 of calling map).
795: In option 2, the values of $a, $b .. are mapped into the array, @mappedArray. The two
796: options illustrate the different grouping. Options 3 and 4 give a consistent
797: way (with other functions) of mapping the items. For each option, the group can
798: be passed as an array, for example, [$a,$b,$c,$d] => \@a.</td>
1.6 ng 799: <td valign="top">In CAPA, the arguments are divided into three groups separated
800: by a semicolon ;. In LON-CAPA, the separation is done by using [] brackets or
801: using an array @a. Note the backslash (\) before the arguments in the
802: second and third groups.</td>
803: </tr>
804:
805:
806: <tr>
807: <td valign="top">rmap(seed;a,b,c,d;w,x,y,z)</td>
1.7 ng 808: <td valign="top">Option 1 - &rmap($seed,[\$w,\$x,\$y,\$z],[$a,$b,$c,$d]) or <br>
809: Option 2 - &rmap($seed,\@rmappedArray,[$a,$b,$c,$d]) <br>
810: Option 3 - @rmapped_array = &rmap($seed,[$a,$b,$c,$d]) <br>
811: Option 4 - ($w,$x,$y,$z) = &rmap($seed,\@a) <br>
812: where $a='A'<br>
813: $b='B'<br>
814: $c='B'<br>
815: $d='B'<br>
816: $w, $x, $y, and $z are variables</td>
1.6 ng 817: <td valign="top">The rmap functions does the reverse action of map if the same seed
818: is used in calling map and rmap. </td>
1.11 albertel 819: <td valign="top">In CAPA, the arguments are divided into
820: three groups separated by a semicolon ;. In LON-CAPA, the
821: separation is done by using [] brackets (with create an
822: unamed vector reference) or using an array @a. Note the
823: backslash (\) before the arguments in the second and
824: third groups (Which cause Perl to send to variable
825: locations rather than the variable values, similar to a C
826: pointer).</td>
1.6 ng 827: </tr>
1.8 albertel 828:
829: <tr>
830: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
831: <td valign="top">$a=&xmlparse($string) </td>
832: <td valign="top">Runs the internal parser over the
833: argument parsing for display. <b>Warning</b> This will
834: result in different strings in different targets. Don't use
835: the results of this function as an answer.</td>
836: <td valign="top">New to LON-CAPA</td>
837: </tr>
1.6 ng 838:
839: <tr>
1.4 ng 840: <td valign="top">tex(a,b), tex("a","b")</td>
841: <td valign="top">&tex($a,$b), &tex("a","b")</td>
842: <td valign="top">Returns a if the output mode is in tex otherwise
843: returns b</td>
844: <td valign="top"> </td>
845: </tr>
846:
847: <tr>
848: <td valign="top">var_in_tex(a)</td>
849: <td valign="top">&var_in_tex($a)</td>
850: <td valign="top">Equivalent to tex("a","")</td>
851: <td valign="top"> </td>
852: </tr>
853:
854: <tr>
855: <td valign="top">to_string(x), to_string(x,y)</td>
856: <td valign="top">&to_string($x), &to_string($x,$y)</td>
857: <td valign="top">If x is an integer, returns a string. If x is real
858: than the output is a string with format given by y. For example, if x =
859: 12.3456, &to_string(x,".3F") = 12.345 and &to_string(x,".3E") =
860: 1.234E+01.</td>
861: <td valign="top"> </td>
862: </tr>
863:
864: <tr>
865: <td valign="top">capa_id(), class(), section(), set(), problem()</td>
866: <td valign="top">&class(), &section()</td>
867: <td valign="top">Returns null string, class descriptive name, section
868: number, set number and null string.</td>
869: <td valign="top">capa_id(), set() and problem() are no longer used.
870: Currently, they return a null value.</td>
871: </tr>
872:
873: <tr>
874: <td valign="top">name(), student_number()</td>
875: <td valign="top">&name(), &student_number()</td>
876: <td valign="top">Return the full name in the following format: lastname,
877: firstname initial. Student_number returns the student 9-alphanumeric string.
878: If undefined, the functions return null.</td>
879: <td valign="top"> </td>
880: </tr>
881:
882: <tr>
883: <td valign="top">open_date(), due_date(), answer_date()</td>
884: <td valign="top">&open_date(), &due_date(), &answer_date()</td>
885: <td valign="top">Problem open date, due date and answer date. The
886: time is also included in 24-hr format.</td>
887: <td valign="top">Output format for time is changed slightly. If pass
888: noon, it displays ..pm else it displays ..am. So 23:59 is displayed as
889: 11:59 pm.</td>
890: </tr>
891:
892: <tr>
893: <td valign="top">get_seed(), set_seed()</td>
894: <td valign="top">Not implemented</td>
895: <td valign="top">Get and set the random seed.</td>
896: <td valign="top"> </td>
897: </tr>
898:
899: <tr>
900: <td valign="top">sub_string(a,b,c)</td>
901: <td valign="top">&sub_string($a,$b,$c) <br>perl substr function.
902: However, note the differences</td>
903: <td valign="top">Retrieve a portion of string a starting from b and
904: length c. For example, $a = "Welcome to LON-CAPA";
905: $result=&sub_string($a,4,4); then $result is "come"</td>
906: <td valign="top">Perl intrinsic function, substr(string,b,c) starts
907: counting from 0 (as opposed to 1). In the example to the left, substr($a,4,4)
908: returns "ome ".</td>
909: </tr>
910:
911: <tr>
912: <td valign="top">array[xx]</td>
913: <td valign="top">@arrayname <br>Array is intrinsic in perl.
914: To access a specific element use $arrayname[$n] where $n
915: is the $n+1 element since the array count starts from 0</td>
916: <td valign="top">"xx" can be a variable or a calculation.</td>
917: <td valign="top">In LON-CAPA, an array is defined by @arrayname.
918: It is not necessary to specify the dimension of the array. </td>
919: </tr>
920:
921: <tr>
922: <td valign="top">array_moments(B,A)</td>
923: <td valign="top">@B=&array_moments(@A)</td>
924: <td valign="top">Evaluates the moments of an array A and place the
925: result in array B[i] where i = 0 to 4. The contents of B are as follows:
926: B[0] = number of elements, B[1] = mean, B[2] = variance, B[3] = skewness
927: and B[4] = kurtosis.</td>
1.5 ng 928: <td valign="top">In CAPA, the moments are passed as an array in the first argument whereas
929: in LON-CAPA, the array containing the moments are set equal to the function.</td>
1.4 ng 930: </tr>
931:
932: <tr>
933: <td valign="top">array_max(Name), array_min(Name)</td>
934: <td valign="top">&min(@Name), &max(@Name)</td>
935: <td valign="top">In LON-CAPA to find the maximum value of an array, use
936: &max(@arrayname) and to find the minimum value of an array, use
937: &min(@arrayname)</td>
938: <td valign="top">Combined with the min and max functions defined
939: earlier.</td>
940: </tr>
941:
942: <tr>
943: <td valign="top">init_array(Name)</td>
944: <td valign="top">undef @name</td>
945: <td valign="top">To destroy the contents of an array, use</td>
946: <td valign="top">Use perl intrinsic undef function.</td>
947: </tr>
1.5 ng 948: <tr>
949: <td valign="top">random_normal (return_array,item_cnt,seed,av,std_dev)</td>
950: <td valign="top">@return_array=&random_normal ($item_cnt,$seed,$av,$std_dev)</td>
951: <td valign="top">Generate $item_cnt deviates of normal distribution of average $av and
952: standard deviation $std_dev. The distribution is generated from seed $seed</td>
953: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
954: the results are set equal to the function.</td>
955: </tr>
956: <tr>
957: <td valign="top">random_beta (return_array,item_cnt,seed,aa,bb)</td>
958: <td valign="top">@return_array=&random_beta ($item_cnt,$seed,$aa,$bb) <br>
959: NOTE: Both $aa and $bb MUST be greater than 1.0E-37.</td>
960: <td valign="top">Generate $item_cnt deviates of beta distribution.
961: The density of beta is:
962: X^($aa-1) *(1-X)^($bb-1) /B($aa,$bb) for 0<X<1.</td>
963: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
964: the results are set equal to the function.</td>
965: </tr>
966: <tr>
967: <td valign="top">random_gamma (return_array,item_cnt,seed,a,r)</td>
968: <td valign="top">@return_array=&random_gamma ($item_cnt,$seed,$a,$r) <br>
969: NOTE: Both $a and $r MUST be positive.</td>
970: <td valign="top">Generate $item_cnt deviates of gamma distribution.
971: The density of gamma is:
972: ($a**$r)/gamma($r) * X**($r-1) * exp(-$a*X).</td>
973: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
974: the results are set equal to the function.</td>
975: </tr>
976: <tr>
977: <td valign="top">random_exponential (return_array,item_cnt,seed,av)</td>
978: <td valign="top">@return_array=&random_exponential ($item_cnt,$seed,$av) <br>
979: NOTE: $av MUST be non-negative.</td>
980: <td valign="top">Generate $item_cnt deviates of exponential distribution. </td>
981: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
982: the results are set equal to the function.</td>
983: </tr>
984: <tr>
985: <td valign="top">random_poisson (return_array,item_cnt,seed,mu)</td>
986: <td valign="top">@return_array=&random_poisson ($item_cnt,$seed,$mu) <br>
987: NOTE: $mu MUST be non-negative.</td>
988: <td valign="top">Generate $item_cnt deviates of poisson distribution. </td>
989: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
990: the results are set equal to the function.</td>
991: </tr>
992: <tr>
993: <td valign="top">random_chi (return_array,item_cnt,seed,df)</td>
994: <td valign="top">@return_array=&random_chi ($item_cnt,$seed,$df) <br>
995: NOTE: $df MUST be positive.</td>
996: <td valign="top">Generate $item_cnt deviates of chi_square distribution with $df
997: degrees of freedom. </td>
998: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
999: the results are set equal to the function.</td>
1000: </tr>
1001: <tr>
1002: <td valign="top">random_noncentral_chi (return_array,item_cnt,seed,df,nonc)</td>
1003: <td valign="top">@return_array=&random_noncentral_chi ($item_cnt,$seed,$df,$nonc) <br>
1004: NOTE: $df MUST be at least 1 and $nonc MUST be non-negative.</td>
1005: <td valign="top">Generate $item_cnt deviates of noncentral_chi_square
1006: distribution with $df
1007: degrees of freedom and noncentrality parameter $nonc. </td>
1008: <td valign="top">In CAPA the results are passed as the first argument whereas in LON-CAPA
1009: the results are set equal to the function.</td>
1010: </tr>
1011: <tr>
1012: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1013: <td valign="top">@return_array=&random_f ($item_cnt,$seed,$dfn,$dfd) <br>
1014: NOTE: Both $dfn and $dfd MUST be positive.</td>
1015: <td valign="top">Generate $item_cnt deviates of F (variance ratio) distribution with
1016: degrees of freedom $dfn (numerator) and $dfd (denominator). </td>
1017: <td valign="top">New to LON-CAPA</td>
1018: </tr>
1019: <tr>
1020: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1021: <td valign="top">@return_array=&random_noncentral_f ($item_cnt,$seed,$dfn,$dfd,$nonc) <br>
1022: NOTE: $dfn must be at least 1, $dfd MUST be positive, and $nonc must
1023: be non-negative.</td>
1024: <td valign="top">Generate $item_cnt deviates of noncentral F (variance ratio)
1025: distribution with degrees of freedom $dfn (numerator) and $dfd (denominator).
1026: $nonc is the noncentrality parameter. </td>
1027: <td valign="top">New to LON-CAPA</td>
1028: </tr>
1029: <tr>
1.9 ng 1030: <td valign="top">NOT DOCUMENTED IN CAPA</td>
1031: <td valign="top">@return_array=&random_multivariate_normal ($item_cnt,$seed,\@mean,\@covar) <br>
1032: NOTE: @mean should be of length p array of real numbers. @covar should be a length
1033: p array of references to length p arrays of real numbers (i.e. a p by p matrix.</td>
1.5 ng 1034: <td valign="top">Generate $item_cnt deviates of multivariate_normal distribution with
1035: mean vector @mean and variance-covariance matrix. </td>
1.9 ng 1036: <td valign="top">Note the backslash before the @mean and @covar arrays.</td>
1.5 ng 1037: </tr>
1038: <tr>
1039: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1040: <td valign="top">@return_array=&random_multinomial ($item_cnt,$seed,@p) <br>
1041: NOTE: $item_cnt is rounded with int() and the result must be non-negative.
1042: The number of elements in @p must be at least 2.</td>
1043: <td valign="top">Returns single observation from multinomial distribution with
1044: $item_cnt events classified into as many categories as the length of @p.
1045: The probability of an event being classified into category i is given by
1046: ith element of @p. The observation is an array with length equal to @p, so
1047: when called in a scalar context it returns the length of @p. The sum of the
1048: elements of the obervation is equal to $item_cnt.</td>
1049: <td valign="top">New to LON-CAPA</td>
1050: </tr>
1051: <tr>
1052: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1.20 albertel 1053: <td valign="top">@return_array=&random_permutation ($seed,@array) </td>
1.5 ng 1054: <td valign="top">Returns @array randomly permuted.</td>
1055: <td valign="top">New to LON-CAPA</td>
1056: </tr>
1057: <tr>
1058: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1059: <td valign="top">@return_array=&random_uniform ($item_cnt,$seed,$low,$high) <br>
1060: NOTE: $low must be less than or equal to $high.</td>
1061: <td valign="top">Generate $item_cnt deviates from a uniform distribution. </td>
1062: <td valign="top">New to LON-CAPA</td>
1063: </tr>
1064: <tr>
1065: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1066: <td valign="top">@return_array=&random_uniform_integer ($item_cnt,$seed,$low,$high) <br>
1067: NOTE: $low and $high are both passed through int().
1068: $low must be less than or equal to $high.</td>
1069: <td valign="top">Generate $item_cnt deviates from a uniform distribution in integers. </td>
1070: <td valign="top">New to LON-CAPA</td>
1071: </tr>
1072: <tr>
1073: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1074: <td valign="top">@return_array=&random_binomial ($item_cnt,$seed,$nt,$p) <br>
1075: NOTE: $nt is rounded using int() and the result must be non-negative.
1076: $p must be between 0 and 1 inclusive.</td>
1077: <td valign="top">Generate $item_cnt deviates from the binomial distribution with
1078: $nt trials and the probabilty of an event in each trial is $p. </td>
1079: <td valign="top">New to LON-CAPA</td>
1080: </tr>
1081: <tr>
1082: <td valign="top">NOT IMPLEMENTED IN CAPA</td>
1083: <td valign="top">@return_array=&random_negative_binomial ($item_cnt,$seed,$ne,$p) <br>
1084: NOTE: $ne is rounded using int() and the result must be positive.
1085: $p must be between 0 and 1 exclusive.</td>
1086: <td valign="top">Generate an array of $item_cnt outcomes generated from
1087: negative binomial distribution with
1088: $ne events and the probabilty of an event in each trial is $p. </td>
1089: <td valign="top">New to LON-CAPA</td>
1.4 ng 1090: </tr>
1.5 ng 1091: </table>
1092: <!-- insertion ends -->
1.4 ng 1093:
1.1 albertel 1094: <h2><script> Variables</h2>
1095: <ul>
1096: <li>
1097: $external::target - set to the current target the xml parser
1098: is parsing for
1099: </li>
1100: <li>
1101: $external::part - set to the <i>id</i> of the current problem
1.14 albertel 1102: <part>; zero if there are no <part>
1.1 albertel 1103: </li>
1104: <li>
1105: $external::gradestatus - set to the value of the current
1106: resource.partid.solved value
1107: </li>
1108: <li>
1109: $external::datestatus - set to the current status of the clock
1.14 albertel 1110: either CLOSED, CAN_ANSWER, CANNOT_ANSWER, SHOW_ANSWER, or UNCHECKEDOUT
1.1 albertel 1111: </li>
1112: <li>
1113: $external::randomseed - set to the number that was used to
1114: seed the random number generator
1115: </li>
1116: <li>$pi - set to PI </li>
1.3 ng 1117: <li>$rad2deg - converts radians to degrees </li>
1118: <li>$deg2rad - converts degrees to radians </li>
1.1 albertel 1119: </ul>
1.14 albertel 1120:
1121: <h2> Form internals </h2>
1122: <p> Form elements used for homework editing/response </p>
1123: <p> the form is named lonhomework </p>
1124: <h3> Viewing a problem (either CSTR or RES space)</h3>
1125: <ul>
1126: <li>
1127: grade_target, grade_username, grade_domain, grade_symb - the
1128: vaules take precedence over the the normal ENV settings of
1129: these, use &Apache::lonxml::whichuser() to get back the
1130: correct vaues of the items
1131: </li>
1132: <li>
1133: HWVAL_response:number - the name of the input elements for each response. The response is the response's ID, and the :number part exists only for response with multiple foils, and is a unique number in order of the submission
1134: </li>
1135: <li>
1136: changerandseed - the 'Change' button, only exists right after
1137: the Change button is clicked
1138: </li>
1139: <li>
1140: problemmode - in CSTR, it is either 'View','Edit','EditXML' or
1141: 'Analyze' depending on the desired view
1142: </li>
1143: <li>
1144: rndseed - the currently requested random seed
1145: </li>
1146: <li>
1147: showallfoils - if it exists, and we are in CSTR space, the
1148: problem should ignore <conceptgroup> and the response's
1149: max setting and show all possible foils
1150: </li>
1151: <li>
1152: submit - the name of the Submit button
1153: </li>
1154: <li>
1155: submitted - a hidden form parameter that can be used to tell
1156: if the student has submitted answers or not, if it is set,
1157: there should be answers to grade.
1158: </li>
1159: </ul>
1160: <h3> Editing a problem (Edit mode)</h3>
1161: <p> tagdepth referes to the current value of the xmlparsers tagdepth couter ($Apache::lonxml::currentdepth)</p>
1162: <p> Note: the file edit.pm has many helper functions for creating the standard elements for editing a tag and it's attributes, all of those functions follow these conventions </p>
1163: <ul>
1164: <li>
1165: tagdepth_argname - I.E. 1_3.max, a parameter editing value,
1166: max is the name of the parameter and it is for the third tag
1167: inside the first tag
1168: </li>
1169: <li>
1170: delete_tagdepth - if set to yes, delete tag tagdepth and all
1171: tags inside of it
1172: </li>
1173: <li>
1174: homework_edit_tagdepth - used by both &Apache::edit::editline
1175: and &Apache::edit::editfield for the <textarea> and
1176: <input> form elements they create
1177: </li>
1178: <li>
1179: insert_tagdepth - used to request an tag insert, it is set to
1180: the id number of the requested tag in the
1181: %Apache::lonxml::insertlist
1182: </ul>
1.1 albertel 1183: <hr>
1184: <address><a href="mailto:albertel@marvin.lite.msu.edu">Guy Albertelli</a></address>
1185: <!-- Created: Thu May 17 15:05:35 EDT 2001 -->
1186: <!-- hhmts start -->
1.21 ! albertel 1187: Last modified: Fri Oct 25 16:29:31 EDT 2002
1.1 albertel 1188: <!-- hhmts end -->
1189: </body>
1190: </html>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>