<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
   1.  ATLAS: Automatically Tuned Linear Algebra Software
   2. BLAS: Basic Fortan 77 linear algebra routines
   3. Bzip2: High-quality data compressor
   4. Cddlib: Double Description Method of Motzkin
   5. Common Lisp: Multiparadigm and general-purpose programming language
   6. CVXOPT: Convex optimization, linear programming, least squares, etc.
   7. Cython: C-Extensions for Python
   8. F2c: Converts Fortran 77 to C code
   9. Flint: Fast Library for Number Theory
  10. FpLLL: Euclidian lattice reduction
  11. FreeType: A Free, High-Quality, and Portable Font Engine
  12. G95: Open source Fortran 95 compiler
  13. GAP: Groups, Algorithms, Programming
  14. GD: Dynamic graphics generation tool
  15. Genus2reduction: Curve data computation
  16. Gfan: Gröbner fans and tropical varieties
  17. Givaro: C++ library for arithmetic and algebra
  18. GMP: GNU Multiple Precision Arithmetic Library
  19. GMP-ECM: Elliptic Curve Method for Integer Factorization
  20. GNU TLS: Secure networking
  21. GSL: Gnu Scientific Library
  22. JsMath: JavaScript implementation of LaTeX
  23. IML: Integer Matrix Library
  24. IPython: Interactive Python shell
  25. LAPACK: Fortan 77 linear algebra library
  26. Lcalc: L-functions calculator
  27. Libgcrypt: General purpose cryptographic library
  28. Libgpg-error: Common error values for GnuPG components
  29. Linbox: C++ linear algebra library
  30. M4RI: Linear Algebra over GF(2)
  31. Matplotlib: Python plotting library
  32. Maxima: computer algebra system
  33. Mercurial: Revision control system
  34. MoinMoin Wiki
  35. MPFI: Multiple Precision Floating-point Interval library
  36. MPFR: C library for multiple-precision floating-point computations with correct rounding
  37. ECLib:Cremona's Programs for Elliptic curves
  38. NetworkX: Graph theory
  39. NTL: Number theory C++ library
  40. Numpy: Numerical linear algebra
  41. OpenCDK: Open Crypto Development Kit
  42. PALP: A Package for Analyzing Lattice Polytopes
  43. PARI/GP: Number theory calculator
  44. Pexpect: Pseudo-tty control for Python
  45. PNG: Bitmap image support
  46. PolyBoRi: Polynomials Over Boolean Rings
  47. PyCrypto: Python Cryptography Toolkit
  48. Python: Interpreted language
  49. Qd: Quad-double/Double-double Computation Package
  50. R: Statistical Computing
  51. Readline: Line-editing
  52. Rpy: Python interface to R
  53. Scipy: Python library for scientific computation
  54. Singular: fast commutative and noncommutative algebra
  55. Scons: Software construction tool
  56. SQLite: Relation database
  57. Sympow: L-function calculator
  58. Symmetrica: Representation theory
  59. Sympy: Python library for symbolic computation
  60. Tachyon: lightweight 3d ray tracer
  61. Termcap: Simplifies the process of writing portable text mode applications
  62. Twisted: Python networking library
  63. Weave: Tools for including C/C++ code within Python
  64. Zlib: Data compression library
  65. ZODB: Object-oriented database
!! Para Virtual Tangram 1.1

Puede que al final del proceso de inicio aparezca un letrero que diga:
{{{
Trying to get IP address from DHCP server (60sec timeout)
#
}}}
Si este es el caso escribimos "xorgwizard". Aparece una ventana. Allí seleccionamos "Xvesa" y después de eso seleccionamos "Ignore". Se abrirá un sistema Linux como una ventana dentro de Windows.

Para lanzar TeXmacs hacemos click en el ícono de la casa que dice debajo "file" y luego en el que dice "lanzarTeXmacs.sh"
Esta guía explica cómo publicar transformar contenido hecho en TeXmacs para publicarlo en Connexions, usando para esto un formato intermedio llamado LaTeX. Los pasos son los siguientes:

# Abrimos el documento que hemos creado en TeXmacs y lo exportamos en formato LaTeX mediante la siguiente secuencia del menú: {{{File -> Export -> LaTeX}}}. Esto nos creará un archivo con el mismo nombre y en la misma ubicación que nuestro archivo en TeXmacs, pero en lugar de terminar en {{{.tm}}}, terminará en {{{.tex}}}. por ejemplo si el archivo que creamos originalmente en TeXmacs fue {{{prueba.tm}}}, el proceso de exportación creará un archivo {{{prueba.tex}}} (obviamente si los archivos siguen las convenciones de nombres que hemos adoptado no se llamarán {{{prueba.tm}}} y {{{prueba.tex}}}, sino serán algo como {{{kol2008pgn119ejc20.tm}}} y {{{kol2008pgn119ejc20.tex}}}, pero hemos adoptado estos nombres por simpleza).
# Descargamos el archivo http://cnx.org/help/LaTeX_template.tex
# Abrimos el editor de texto de Virtual Tangram mediante la secuencia del menu {{{Start -> Documents -> Geany}}}
# Arrastramos los archivos plantilla {{{LaTeX_template.tex}}} y el que queremos publicar en connexions, en nuestro ejemplo, se llama {{{prueba.tex}}} de donde estén al editor geany, esto los abrirá, cada uno en una solapa.
# Seguimos las instrucciones del archivo {{{LaTeX_template.tex}}} y copiamos los contenidos del otro en las respectivas partes de la plantilla y nombramos este archivo con el nombre del archivo que queremos publicar, por ejemplo {{{prueba.tex}}}.
# Abrimos el compresor zip de Virtual Tangram, para esto hacemos click en el ícono de escritorio que dice "zip" y le hacemos click en "New" y creamos un archivo ''que se llame igual que el archivo que meteremos dentro de él'', en nuestro caso, {{{prueba.zip}}}. Agregamos el archivo {{{prueba.tex}}} a {{{prueba.zip}}}.
# Luego en la página Web de Connexions, hacemos click en ~MyCnx y allí nos ubicamos en el //Workgroup// de lo que queramos publicar (por ejemplo Algebra Lineal). Veremos un listado de cosas ya publicadas. Connexions organiza la información con la siguiente jerarquía:
** Coleciones
*** Unidades
**** Módulos
## Las que tienen un ícono azul corresponden a módulos. La idea es crear un módulo dentro de la unidad correspondiente, que a su vez está dentro de la colección respectiva, correspondinete con lo  que hallamos visto en el curso, o, en caso de que ya esté creado, ubicar el módulo que corresponde al subtema al cual queremos agregar contenido. 
** Por ejemplo, supongamos que queremos agregar nuestro ejercicio al módulo llamado "Vectores y Valores Propios". Hacemos click en ese módulo.
## Veremos unas solapas que dicen:  {{{ Edit | Files | Metadata | Roles | Links | Preview | Publish}}}. Tan pronto hagamos click estaremos parados en la que dice {{{Edit}}}, pues aparece resaltada en verde. Allí hay dos menus desplegables: uno que dice {{{import}}} y otro que dice {{{export}}}. Al lado de cada uno hay un menú desplegable.
## Escojemos la opción que dice {{{LaTeX}}} y entonces nos preguntará por la ruta del archivo que queremos importar y entonces le damos la ruta dentro de Virtual Tangram donde está el archivo que creamos en los pasos anteriores.
# Si todo va bien, nuestro módulo estará listo para publicar. Para esto hacemos clic en la pestaña {{{Publish}}} de la parte superior de la página, y listo!!! ya han publicado el archivo hecho en TeXmacs.
# En caso de cualquier dificultad, por favor consultarla a la lista de correo siendo lo más específicos posibles y comentando los mensajes en los cuales se avisó el error.
[[Intro]] [[Descargas]] [[ListaDeCorreo]]
Antes de descargar el software tenga presente que Virtual Tangram requiere:
* Al menos 1 Gb de RAM
* 5.2 Gb de disco duro.
Virtual Tangram consta de dos partes:
* Virtualbox: un sistema de virtualización que permite ejecutar un sistema operativo dentro de otro (en este caso vamos a ejecutar Linux dentro de Windows). Virtualbox tiene versiones para procesadores de 32 y 64 bits para Windows Vista y XP. Puede descargar las versiones de lo siguiente enlace, 
** [[Página de descargas de Virtualbox| http://www.virtualbox.org/wiki/Downloads]]
: en la parte donde dice "~VirtualBox x.x.x for Windows hosts x86/amd64" (si no sabe qué tipo de procesador tiene, descárguelas ambas -el tamaño es poco- y al intentar instalarlas una funcionará y la otra no):
* La distribución virtualizada propiamente dicha: es el Linux que hemos creado. Esta en un archivo VDI, que es el formato que usa Virtualbox para las imágenes de disco virtuales y está en formato comprimido. Esta en formato comprimido de 7zip para facilitar su copiado. Se puede descargar de los siguientes enlaces:
** [[virtualTangram-1.7.vdi.7z| http://ia331434.us.archive.org/0/items/VirtualTangram/virtualTangram-1.7.vdi.7z]] (tamaño aprox 1.7 GB) desde Internet Archive. //Es la versión recomendada y la última en desarrollo.//
** [[virtualTangram-1.1.vdi.7z| http://ia331435.us.archive.org/0/items/VirtualTangram/virtualTangram-1.1.vdi.7z]] (tamaño aprox 650 Mb) desde Internet Archive.
* Para descomprimir el archivo se recomienda instalar y usar 7-zip
: [[7zip portable| http://portableapps.com/apps/utilities/7-zip_portable]] de la página de Portable Apps.
Después de haber descargado el software recomendamos leer las [[instrucciones de instalación|Instalacion]]
!! Para Virtual Tangram 1.7
Hay tres errores reportados en Virtual Tangram. Acá está lo que se

* Inesperadamente el teclado cambia de configuración y no se puede cambiar el lenguaje:
<<<
Esto se debe a que cuando se creó está edición de Virtual Tangram no se tuvo en cuenta que la configuración del teclado puede ocurrir por aplicación o en todo el sistema (y se eligió la primera, luego cada vez que se cambia de aplicación ocurre este cambio de configuración del teclado). Para arreglar este inconveniente hay dos formas:
* Se elije el ícono de la bandera en la parte inferior derecha y se escoje el teclado apropiado entre inglés de Estados Unidos, Español de España y Español de Latinoamérica
* Se abre la consola de comandos, haciendo click en el icono de la pantalla negra que está en la barra de tareas en la parte inferior izquierda. Se abrirá una nueva ventana negra que soporta la escritura de comandos como en DOS. Allí escribimos:
{{{
setxbmap latam
}}}
para el teclado latinoamericano ({{{setxbmap us}}}, {{{setxbmap es}}} para estadounidense y español, respectivamente)
<<<

* Cuando intento lanzar Sage desde ~TeXmacs, este último se cierra inesperadamente.
<<<
La solución consiste en lanzar texmacs desde la consola de comandos. Para esto hacemos lo siguiente:
* Abrimos la consola como se explicó en el punto anterior.
* Escribimos:
{{{
su
}}}
Nos aparecerá una pregunta que solicita una entrada de datos, similar a esta:
{{{
$password:
}}}
allí escribimos {{{root}}}. Si la contraseña fue escrita de modo adecuado, veremos que en la consola de comandos el signo {{{$}}} cambia por un {{{#}}}. y Allí escribiemos:
{{{
texmacs
}}}
<<<
* Se desaparecen los íconos de la barra de tareas en la parte inferior. Hacemos click con el botón secundario del ratón (usualmente el derecho) y seleccionamos la opción "Add". En la ventana que aparece a continuación seleccionamos "Launcher" y donde dice "command" escribimos el comando en cuestión de nuestra aplicación, que pare el caso de la consola de comandos es {{{lxterminal}}}. Esto nos da la consola de comandos y ya sabemos cómo lanzar ~TeXmacs desde allí.
Un grupo de trabajo (o //workgroup//) en connexions es un conjunto de personas que están publicando material de forma conjunta en el sitio web de este proyecto. Una vez alguien es miembro del grupo de trabajo, el o ella puede agregar a cualquier otra persona al grupo.

Para esto, las personas que quieran agregarse al grupo deben:
# ''Sacar una cuenta en Connexions'': para esto vamos a la página http://cnx.org/ y hacer clic en la parte derecha de la pantalla donde dice //Get an account//, allí tendremos que hacer un registro de una cuenta para connexions.
# Una vez tengamos la cuenta en connexions debemos contactarnos (puede ser a través de la [[lista de correo|ListaDeCorreo]] con las que ya están en el grupo al que queremos pertenecer, por ejemplo Cálculo Diferencial o Álgebra Lineal Jave, indicando su usuario dentro de connexions.
La persona que quiera invitar a otra al grupo debe:
# Entrar a Connexions y hacer click en "My Cnx".
# En la barra lateral izquierda, hacer click donde dice "My Workgroups". Aparecerá un listado de todos los grupos a los que están inscritos actualmente.
# Luego hacemos click en "Members" en el menú horizontal. Aparecerá una caja de búsqueda, donde pueden colocar el nombre de usuario de la persona que nos pidió ser agregada al grupo. Una vez lo hayamos escrito, hacemos click en "Search". Deberá aparecer el nombre de dicho usuario dentro del sistema, su nombre completo y su dirección de correo. Marcamos al usuario y hacemos click en la parte inferior donde dice "Add selected users"
Estas son las instrucciones de instalación. Suponemos que ya se ha descargado todo el software indicado en la sección [[Descargas]]:
!! Alistar la imagen del Virtual Tangram.
* Buscamos el archivo que termina en .vdi y lo copiamos a cualquier lugar de nuestro disco duro.
!! Instalar Virtual Box.
* Ahora ejecutamos los instaladores de VirtualBox (el software sobre el que corre Virtual Tangram), que son archivos que terminan en .msi (por Microsoft Installer). Hay instaladores para versiones de Windows que funcionan sobre diferentes tipos de procesadores, de 32 bits y 64 bits. Descargamos el adecuado para nuestra plataforma (casi siempre 32 bits pues Windows no tiene un buen soporte para 64 bits) pero en caso  o de que no sepamos que tipo de procesador tenemos, descargamos ambos y hacemos click en cualquiera de ellos, uno se abrirá y el otro no.
* Aceptamos la licencia que aparece en la primera pantalla del instalador de VirtualBox y hacemos click en siguiente hasta que terminamos el proceso de instalación.
!! Activar Tangram dentro de Virtual Box:
Los siguientes pasos están explicados en [[video de activación de tangram en Virtual box| http://fevarco.com/tangram/VT1-7_Instalacion/VT1-7_Instalacion.html]] por (Diego Fernández)

Acá está la explicación textual de lo que se hizo en el video anterior
* Hacemos click en Inicio -> Programas y buscamos uno que diga "Sun Virtual..." y lo ejecutamos. Se abrirá el programa Virtual Box, mostrando una ventana que solicita el registro del software. Es optativo, podemos llenar el registro o simplemente colocar "Cancelar".
* Veremos un Icono a la izquierda arriba que dice Nueva (o new, dependiendo de las configuraciones de idioma que tengamos para Virtual Box). Hacemos click allí:
**  Hay una ventana explicativa que nos dice, en resumen, que ese es el asistente para configurar nuevas máquinas virtuales. Haces click en Siguiente
** Aparece otra ventana que tiene un lugar para colocar el nombre de la máquina virtual, puede ser lo que queramos,
** Inmediantamente abajo dice algo sobre el tipo de sistema operativo. La opción por omisión es "Other/Unknow". Buscamos en esta lista desplegable hasta que aparezca Linux 2.6 y hacemos click en siguiente.
*** Si queremos usar Virtual Tangram 1.7 seleccionamos "Arch Linux" (esta es la versión recomendada)
*** Si queremos usar Virtual Tangram 1.2 seleccionamos "Linux 2.6" (esta versión ya no se está soportando)
** Luego aparece la memoria base que le vamos a dejar al sistema operativo. Dependiendo de cuanta memoria tengamos en el computador, podemos colocar más o menos memoria en este valor. Si por ejemplo tenemos un gigabit de RAM podemos elegir 400 Mb que es la opción por omisión y estará bien para la mayoría de sistemas modernos. (Si no sabemos cuánta RAM tiene tu equipo esta también será una buena elección. Si el equipo tiene poca memoria esto se notará cuando Virtual Tangram esté funcionando, así que se recomienda instalarlo en máquianas con menos de 1 GB de RAM).
** Nos aparece una ventana sobre los datos de disco duro con un botón que dice "Nuevo" y al lado otro que dice "Existente". Hacemos click en "Existente".
***  Hacemos click en agregar y buscas el archivo .vdi que copiamos al disco duro en el primer paso y ubicados sobre él, le damos "abrir".
***  Hacemos click en "Seleccionar". Aparecerá entonces en la ventana de discos duros el archivo vdi que acabamos de agregar.
** Hacemos click en "Siguiente". Aparecerá una ventana que contiene el resumen de todos los aspectos que hemos configurado para Virtual Tangram. En esta ventana hacemos click en "Terminar"
 
Una vez lo tengamos funcionando. Le das click a la máquina Virtual y luego en "Iniciar". Veremos una ventana donde empiezan a aparecer unas letras en un fondo negro con "done" en verde. 
Virtual Tangram es un entorno informático personal para hacer matemáticas con las siguientes caracterísitcas:
* Virtualizado: se puede ejecutar desde Windows o Mac
* Poderoso y completo: gracias al sistema de álgebra computacional [[Sage| http://el-directorio.org/Sage]],
* Amigable: mediante una interface visual para la escritura de texto científico estructurado interactivo [[TeXmacs| http://el-directorio.org/TeXmacs]]
* Educativo: a través y un conjunto de contenidos que sirven como mediación hacia el saber matemático de una disciplina (por ejemplo [[A First Course in Linear Algebra| http://linear.ups.edu/]]).

Todos libres (se pueden copiar, distribuir, modificar, de acuerdo a unas condiciones que alientan la construcción colectiva del conocimiento) y disponibles para usuarios de plataformas privativas, mediante un proceso de virtualización. La experiencia puede ser extendida a otros campos del saber y otro conjunto de artefactos tecnológicos informáticos.

Esta iniciativa se desarrolla desde el seminario de Algebra Computacional del Departamento de Matemáticas de la PUJ, todos aquellos que se quieran sumar a este esfuerzo estan cordialmente invitados a participar.
La lista de correo es un espacio de charla virtual al cual se accede por correo electrónico (un tipo particular de foro de Internet, por así decirlo). Para participar de la lista se requieren dos cosas:

* Primero: Suscribirse a la lista para esto se debe enviar un correo que en el tema diga "subscribe" (sin las comillas) a la dirección de correo  {{{edumatcomp-request@freelists.org}}}.
* Segundo: Preguntar en la lista de correo para esto primero se recomienda seguir la guía [[Hacer buenas preguntas | http://www.slec.net/HacerBuenasPreguntas]] y //luego de leerla// enviar las preguntas a {{{edumatcomp@freelists.org}}}
* Para desuscribirse a la lista de correo se debe enviar un correo que en el tema diga "unsubscribe" (sin las comillas) a la dirección de correo  {{{edumatcomp-request@freelists.org}}}.
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
[img[http://www.archive.org/download/LogoVirtualTangram/VT_logo_100.png]] 
[[Descargas]]
[[Instalación|Instalacion]]
[[Configuración|Configuracion]]
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
!! Qué es Connexions
Connexions es un lugar para ver y compartir material educativo hecho de pequeños trozos de conocimiento llamados módulos que pueden ser organizados como cursos, libros, reportes, etc. Cualquiera puede verlos o contribuir.
 * Los ''autores''  pueden crear y colaborar
 * Los ''intructores'' pueden rápidamente crear y compartir sus colecciones compartidas.
 * Los ''aprendices'' pueden encontrar y explorar contenidos
!! Como publicar en Connexions
Para publicar ejercicios hechos en clase en Connexions se hace lo siguiente:
# [[Agregarse a un grupo de trabajo en Connexions|GruposDeTrabajoEnConnexions]]
# Subirlo en formato de ~TeXmacs al Workgroup respectivo de la materia.
# Transformarlo de ~TeXmacs a ~LaTeX y publicarlo en Connexions siguiendo las instrucciones en: [[Tutorial para subir archivos de TeXmacs a Connexions |DeTeXmacsALaTeXEnConnexions]].
* Una vez publicado el ejercicio deben crear una colección con todos los ejercicios que cada estudiante haya hecho y publicado.
Algebra Computacional y Redes de Aprendices
Virtual Tangram
!!Introducción
El álgebra computacional es la forma en que los computadores representan, manipulan y calculan expresiones matemáticas, ya sean estas numéricas o simbólicas. Virtual Tangram se está usando para hacer talleres de álgebra computacional. La idea es realizar ejercicios sobre diferentes temas (cálculo diferencial, álgebra lineal, etc) hechos en ~TeXmacs + Sage y publicarlos en el sitio Web de [[Connexions | http://cnx.org]]. Estas preguntas orientan el proceso:
!! Qué publicaremos?
Ejercicios resueltos que aparecen en las guías de preparación de las clases (sean estas de Algebra Lineal, Cálculo Diferencial, entre otras) o ejercicios sobre los mismos temas, tomados de otros libros.
!! Qué software usaremos para publicar?
* Conseguir el DVD de Virtual Tangram (véase: [[Descargas de Virtual Tangram|Descargas]])
* Instalarlo (véase: [[Instalación de Virtual Tangram|Instalacion]])
* Crear el contenido en ~TeXmacs + Sage (existen varios tutoriales en la Web sobre cómo usar estos programas). Se recomienda leer en particular:
** [[Differential Calculus with SAGE | http://www.opensourcemath.org/books/calc1-sage/]] Para personas que quieran aprender cómo usar Sage en cálculo diferencial.
!! Cómo publicar ?
* Cuando salven la información de los ejercicios por favor sigan las siguientes convenciones respecto al nombre de los archivos, lo cual permitirá guiarnos rápidamente y saber lo que otras personas han hecho. El nombre del archivo debe tener tres partes: 
** referencia bibliográfica usando tres primeras letras autor+año.
** pagina de dónde se tomo el ejercicio
** número del ejercicio.
por ejemplo si se tomó un ejercicio del libro de Álgebra Lineal de Kolman del 2008 de  la página 35 y era el ejercicio 22, el nombre del archivo deberá ser: {{{kol2008pgn35ejc22.tm}}} y si se tomó del el libro Calculus de Edwards del mismo año pero de la página 46 el ejercicio 12 entonces será: {{{edw2008pgn46ejc12.tm}}}. ''Se debe crear un archivo por cada ejercicio y deben verificar que el ejercicio no haya sido elegido por nadie más''. Esto último implica trabajar con otros a través de Internet para lo cual usaremos el proyecto Connexions de acuerdo a como dice en el enlace: [[Publicación en Connexions| http://virtualtangram.tiddlyspot.com/#PublicacionConnexions]]

Si tienen preguntas pueden dirigirlas a la [[lista de correo |http://virtualtangram.tiddlyspot.com/#ListaDeCorreo]] y con tales preguntas iremos complementando la información acá presente.
Probando
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'virtualtangram';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 07/05/2009 20:11:48 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . |
| 11/05/2009 09:12:04 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . | ok |
| 11/05/2009 09:12:50 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . |
| 25/05/2009 11:58:06 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . | failed |
| 25/05/2009 11:58:33 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . | failed |
| 25/05/2009 11:58:48 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . | failed |
| 25/05/2009 11:59:02 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . |
| 07/06/2009 01:12:49 | Offray | [[/|http://virtualtangram.tiddlyspot.com/#Descargas]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . |
| 27/06/2009 11:48:36 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . | ok |
| 27/06/2009 11:57:43 | Offray | [[/|http://virtualtangram.tiddlyspot.com/]] | [[store.cgi|http://virtualtangram.tiddlyspot.com/store.cgi]] | . | [[index.html | http://virtualtangram.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}

!! Enlaces
* [[Virtualbox en El Directorio| http://www.el-directorio.org/VirtualBox]]
* [[Installing VirtualBox Additions on CentOS 5.2| http://www.aparker.co.uk/]]: con //tips// interesantes sobre cómo editar algunos archivos de compilación de Virtualbox.
* [[From Qemu to VirtualBox?| http://www.raditha.com/blog/archives/002112.html]]
!! Instalación
Existen varias maneras de instalar el software de acuerdo a sistema operativo y la variante (en el caso de Linux, su diversidad hace que hayan muchas variantes). Acá está cómo hacerlo para distribuciones basadas en Debian:
* Averiguamos la versión del kernel que tenemos instalada:
<<<
''consola superusuario:''
{{{
uname -a
}}}
<<<
<<<
''salida de consola:''
{{{
Linux keyros 2.6.25.16-elive-686 #1 SMP Fri Aug 22 22:27:01 CEST 2008 i686 GNU/Linux
}}}
<<<
: el número de versión que acompaña al kernel, en este caso 2.6.25.16-elive-686, es la que debemos usar para instalar las demás cosas referidas al kernel (cabeceras, enlaces simbólicos, módulos precompilados de virtualbox). En caso de que la salida sea distinta, debe cambiarlo por su número de versión en los ejemplos siguientes.
* Instalamos las fuentes del kernel para la versión que estamos usando:
<<<
''consola superusuario:''
{{{
wajig install kernel-headers-2.6.25.16-elive-686
}}}
<<<
* Enlazamos las fuentes para que puedan ser encontradas en las ubicación donde usualmente buscan los programas:
<<<
''consola superusuario:''
{{{
cd /usr/src/
ln -s linux-headers-2.6.25.16-elive-686/ linux
}}}
<<<
* Enlazamos el archivo Make, al nombre que requiere para que el instalador pueda construir el respectivo módulo del kernel;
<<<
{{{
cd /usr/src/linux/arch/x86/
ln -s Makefile Makefile_32.cpu 
}}}
<<<
!! Configuración
* Para cargar el módulo del kernel de Virtual Box:
<<<
''consola superusuario:''
{{{
modprobe vboxdrv 
}}}
<<<
* Para agregar al usuario que lo va a ejecutar al listado de usuarios que pueden hacerlo:
<<<
''consola superusuario:''
{{{
adduser offray vboxusers
}}}
<<<
Para instalar Virtualbox en Arch Linux hacemos:
<<<
''Consola superusuario:''
{{{
yaourt virtualbox_bin
}}}
<<<
Al final de proceso de instalación obtendremos un mensaje como este:
{{{
 IMPORTANT NOTES:

- Run "vbox_build_module" as root every time your kernel is upgraded, to
  compile the module for the new kernel version.
- Add your user to the vboxusers group:
     gpasswd -a USERNAME vboxusers
- Add "vboxdrv" to the MODULES array in your "/etc/rc.conf"
- Add "vboxnetflt" to MODULES if you want Host Interface networking.
- Add the following line to "/etc/fstab" if you want the vboxusers to have
  permission to emulate USB devices:
     none /proc/bus/usb usbfs auto,busgid=108,busmode=0775,devgid=108,devmode=0664 0 0
}}}
* Para contar con la interface gráfica debemos instalar qt. Para esto hacemos:
<<<
''Consola superusuario:''
{{{
yaourt qt
}}}
<<<
* Para Virtualbox Open Source Edition, obtenida a partir de los repositorios de la distribución instalamos el software y los módulos del kernel, de acuerdo a la versión que tengamos por ejemplo:
<<<
''consola de superusuario:''
{{{
wajig install virtualbox-ose virtualbox-ose-modules-2.6.25.16-elive-686
}}}
<<<

* Descargamos el paquete debianizado de acuerdo a nuestra versión de Linux, de la [[página de descargas para Linux de virtualbox|  http://www.virtualbox.org/wiki/Linux_Downloads]] y lo instalamos:
<<<
''consola superusuario:''
{{{
wajig install virtualbox-2.1_2.1.0-41146_Debian_lenny_i386.deb 
}}}
<<<
* Si encuentra una vieja instalación pedirá que la removamos antes de continuar:
<<<
{{{
 ┌────────────────────────────────────────────────────────────┤ Configuring virtualbox-2.1 ├────────────────────────────────────────────────────────────┐
 │                                                                                                                                                      │ 
 │ Old installation found                                                                                                                               │ 
 │                                                                                                                                                      │ 
 │ An old installation of VirtualBox was found. To install this package the old package has to be removed first. Have a look at /etc/vbox/vbox.cfg to   │ 
 │ determine the installation directory of the previous installation. After uninstalling the old package remove the file /etc/vbox/vbox.cfg.            │ 
 │                                                                                                                                                      │ 
 │                                                                        <Ok>                                                                          │ 
 │                                                                                                                                                      │ 
 └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 
}}}
<<<
* En caso de que el grupo {{{vboxusers}}}, que es el que puede ejecutar Virtualbox, no exista, lo crea:
<<<
{{{
     ┌──────────────────┤ Configuring virtualbox-2.1 ├───────────────────┐
     │                                                                   │ 
     │ Creating group 'vboxusers'                                        │ 
     │                                                                   │ 
     │ Users of VirtualBox must be members of that group. Host network   │ 
     │ interfaces will be assigned to that group.                        │ 
     │                                                                   │ 
     │                              <Ok>                                 │ 
     │                                                                   │ 
     └───────────────────────────────────────────────────────────────────┘ 
}}}
<<<

* Posteriormente intentará compilar un módulo del kernel para Virtualbox, llamado vboxdrv. Este módulo es el que permite a Virtualbox hablar con nuestro módulo del kernel para poder correr los otros sistemas operativos encima de Linux. 
** En caso de que la compilación falle, estos son algunos de los mensajes de error:
<<<
{{{
 ┌────────────────────────────────────────────────────────────┤ Configuring virtualbox-2.1 ├────────────────────────────────────────────────────────────┐
 │                                                                                                                                                      │ 
 │ Compilation of the kernel module FAILED!                                                                                                             │ 
 │                                                                                                                                                      │ 
 │ VirtualBox will not start until this problem is fixed. Please consult /var/log/vbox-install.log to find out why the kernel module does not compile.  │ 
 │ Most probably the kernel sources were not found. Install them (the package name is probably linux-headers-<version> whereby <version> can be         │ 
 │ determined by 'uname -r') and execute                                                                                                                │ 
 │                                                                                                                                                      │ 
 │   /etc/init.d/vboxdrv setup                                                                                                                          │ 
 │                                                                                                                                                      │ 
 │ as root.                                                                                                                                             │ 
 │                                                                                                                                                      │ 
 │                                                                        <Ok>                                                                          │ 
 │                                                                                                                                                      │ 
 └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 
}}}
<<<
<<<
{{{
 ┌──────────────────────┤ Configuring virtualbox-2.1 ├───────────────────────┐
 │                                                                           │ 
 │ Unable to find a precompiled module for the current kernel!               │ 
 │                                                                           │ 
 │ Without a suitable kernel module you will not be able to start any VMs.   │ 
 │ It is strongly recommended to compile a kernel module now. The kernel     │ 
 │ headers and the tools to build kernel modules (gcc, make, binutils, ...)  │ 
 │ are required. However if you know that a suitable kernel module already   │ 
 │ exists at another location, you might want to override the default by     │ 
 │ setting KDIR=<full_path_to_vboxdrv_module> in /etc/default/virtualbox.    │ 
 │ The compilation can also be done later by executing                       │ 
 │                                                                           │ 
 │   /etc/init.d/vboxdrv setup                                               │ 
 │                                                                           │ 
 │ as root.                                                                  │ 
 │                                                                           │ 
 │                                  <Ok>                                     │ 
 │                                                                           │ 
 └───────────────────────────────────────────────────────────────────────────┘  
}}}
<<<
<<<
{{{
 ┌──────────────────────┤ Configuring virtualbox-2.1 ├───────────────────────┐
 │                                                                           │ 
 │ Compilation of the kernel module FAILED!                                  │ 
 │                                                                           │ 
 │ VirtualBox will not start until this problem is fixed. Please consult     │ 
 │ /var/log/vbox-install.log to find out why the kernel module does not      │ 
 │ compile. Most probably the kernel sources were not found. Install them    │ 
 │ (the package name is probably linux-headers-<version> whereby <version>   │ 
 │ can be determined by 'uname -r') and execute                              │ 
 │                                                                           │ 
 │   /etc/init.d/vboxdrv setup                                               │ 
 │                                                                           │ 
 │ as root.                                                                  │ 
 │                                                                           │ 
 │                                  <Ok>                                     │ 
 │                                                                           │ 
 └───────────────────────────────────────────────────────────────────────────┘ 
}}}
<<<