Uno de los controles mas flexibles y potentes en Tcl (mas bien en Tk), es el canvas. La traducción de canvas en "lienzo" y si, el nombre ilustra fielmente lo que se puede hacer sobre el...casi cualquier cosa que te permita tu imaginación.
Que mejor que explicarlo a través de ejemplos, usando una sesión interactiva...
Primero, vamos a crear un canvas llamado .c, de esta manera:
% canvas .c -width 600 -height 600
.c
Para visualizarlo, hay que empacarlo:
% pack .c
Pongamos un par de lineas en el canvas:
% .c create line 100 0 100 500
1
% .c create line 200 0 200 500
2
A crear otras tres haciendo uso de un "for":
% for {set i 300} {$i < 600} {incr i 100} {
> .c create line $i 0 $i 500}
Ahora, completemos una cuadricula creando 5 lineas horizontales:
% for {set i 100} {$i < 600} {incr i 100} {
.c create line 0 $i 500 $i}
y que tal un circulo (a través del subcomando "oval"), en una de las celdas:
% .c create oval 100 100 200 200
15
Tambien un arco..
% .c create arc 200 200 300 300
16
un rectángulo muy cuadrado:
% .c create rectangle 310 310 390 390
17
y para terminar, agreguemos un texto:
% .c create text 410 410 -text "TclBits"
18
pero...que pasó?
esperaba verlo dentro de la cuadricula...
Ah! ya veo que el default de posición es centrado, de modo que esas coordenadas dejan una parte del texto invadiendo la celda vecina...
Veamos que pasa si cambio la posición "anclada" al este:
% .c create text 410 430 -text "TclBits" -anchor e
20
Ah! ya entendí, en realidad lo que necesitaba era "anclarla" al oeste (west):
% .c create text 410 450 -text "TclBits" -anchor w
21
Lo presentado es apenas la punta del iceberg de lo que se puede hacer con el canvas de Tk, hay algunos ejemplos en el wiki que abren una ventana a todo el potencial de este control.
por ejemplo: http://wiki.tcl.tk/4206
Mas del canvas...muy pronto.
Sunday, May 4, 2014
Saturday, May 3, 2014
tablelist
tablelist es una libreria para presentar (y editar) datos en una tabla.
http://www.nemethi.de/
Es muy facil de usar.
Primero, hay que agregar la libreria a nuestro codigo, de esta manera:
Preparemos la variable para el control (widget) de esta tabla:
Ya podemos crear la tabla, en este caso:
Para insertar datos en la tabla, se usa el comando...insert con los datos a insertar en una lista.
Insertamos mas datos, y configuramos la celda del ultimo renglon, segunda columna con letras blancas en fondo azul:
http://www.nemethi.de/
Es muy facil de usar.
Primero, hay que agregar la libreria a nuestro codigo, de esta manera:
package require tablelistPreparemos la variable para el control (widget) de esta tabla:
set tbl .tblYa podemos crear la tabla, en este caso:
- 5 columnas (titulos de columna: A,B,C,D y E)
- ancho de columna (0 = auto ajustable)
- height = altura de la tabla en lineas
- width = ancho de la tabla en caracteres
tablelist::tablelist $tbl \
-columns {0 "A" 0 "B" 0 "C" 0 "D" 0 "E"}\
-height 15\
-width 100
Finalmente, a "empacar" el control en la ventana principalpack $tbl
Para insertar datos en la tabla, se usa el comando...insert con los datos a insertar en una lista.
$tbl insert end [list a b c d e]Vea como configuramos la celda del ultimo renglon, primer columna con letras blancas en fondo rojo:Notese que en ese momento, el ultimo renglon es el que acabamos de insertar y que la numeracion de celdas inicia con cero.
$tbl cellconfigure end,0 -foreground white -background redInsertamos mas datos, y configuramos la celda del ultimo renglon, segunda columna con letras blancas en fondo azul:
$tbl insert end [list a b c d e] $tbl cellconfigure end,1 -foreground white -background blueY para terminar, letras negras en fondo verde, para la celda en ultimo renglon, tercer columna:
$tbl insert end [list a b c d e] $tbl cellconfigure end,2 -foreground black -background greenEste es el resultado:
Friday, May 2, 2014
Un ejemplo de "parseo" con htmlparse
Para ejemplificar como "Lemon Tree Branch" puede ser usado como una herramienta para el parseo de paginas web, que mejor que tomar una página donde podrás encontrar excelentes scripts de los cuales puedes aprender lo mejor de las técnicas de programación usando Tcl/Tk. La página en cuestión es la correspondiente a Richard Suchenwirth en el wiki.
Primero, copié la dirección URL en la caja de texto destinada para ello.
Tuve que también "descomentar' las lineas siguientes en Lemon Tree Branch:
1-15-0, desde la raíz, hasta el primer tag
Ahora si, este es el programa ejemplo donde se pueden apreciar los beneficios de poder usar la funcionalidad de la estructura "tree", tal como por ejemplo:
con lo cual se puede hacer iteraciones en elementos del mismo "nivel"
Nótese que:

Obtener todos los links que haya por "bullet" puede ser un buen ejercicio para el lector.
Primero, copié la dirección URL en la caja de texto destinada para ello.
Tuve que también "descomentar' las lineas siguientes en Lemon Tree Branch:
htmlparse::removeVisualFluff t htmlparse::removeFormDefs tComo se puede observar, la "ruta" a la lista de ejemplos de Richard es:
1-15-0, desde la raíz, hasta el primer tag
Ahora si, este es el programa ejemplo donde se pueden apreciar los beneficios de poder usar la funcionalidad de la estructura "tree", tal como por ejemplo:
t next $bulletIxcon lo cual se puede hacer iteraciones en elementos del mismo "nivel"
Nótese que:
- Solo estoy "tomando" un solo link por "bullet", de modo que, por ejemplo, no estoy capturando el link para "A pocket Wiki", el cual es el segundo link en uno de los "bullets"
- Hay un mensaje de error: (node "" does not exist in tree "t") cuando no hay link en el "bullet", como en "simplicite"
Obtener todos los links que haya por "bullet" puede ser un buen ejercicio para el lector.
console show
package require struct
package require htmlparse
package require http
proc parse {} {
::struct::tree t
set url "http://wiki.tcl.tk/1683"
set http [::http::geturl $url]
set html [::http::data $http]
htmlparse::2tree $html t
htmlparse::removeVisualFluff t
htmlparse::removeFormDefs t
set base [walk {1 15 0}]
puts "data: [t get $base data]"
puts "type(tag): [t get $base type]\n"
set bulletIx [walkf $base {0}]
while {$bulletIx != {}} {
set link [t get [walkf $bulletIx {0}] data]
#set title [t get [walkf $bulletIx {0 0}] data]
catch {t get [walkf $bulletIx {0 0}] data} title
puts "$link: $title"
update
set bulletIx [t next $bulletIx]
}
t destroy
return
}
proc walkf {n p} {
foreach idx $p {
if {$n == ""} {break}
set n [lindex [t children $n] $idx]
}
return $n
}
proc walk {p} {
return [walkf root $p]
}
parse
Thursday, May 1, 2014
HTML en un arbol
El parseo de paginas web con las librerias htmlparse y html2tree, usa las "rutas" a los puntos de interés dentro de la estructura jerárquica del archivo html.
En el wiki de Tcl, descubrí un código ejemplo llamado "LemonTree" el cual generaliza el llenado de un control BWidget tipo arbol con elementos de una jerarquía.
Ejemplos de estructuras de datos jerárquicos son: el sistema de archivos, los controles en una interface gráfica hecha con Tk, los comandos y las variables en los "namespaces",etc.
Por otro lado, LemonTree explica claramente como agregar otras estructuras jerárquicas a este control, lo cual viene perfecto para el caso de los tags dentro de un archivo html.
Una vez que se puede explorar el contenido del archivo html en un control de este tipo, se está en la posibilidad de utilizar este script a manera de herramienta para facilitar la determinacion de la ruta a los elementos de interés.
En esta ocasión, les presento el código al cual le llame' "LemonTree Branch" en la publicación original, para hacer referencia al script en el que esta basado.
Mañana, veremos un ejemplo de parseo de una pagina web, para lo cual, utilicé este script para encontrar la mencionada "ruta" el punto de inicio de los elementos que me interesa extraer.
Como se usa:
1) Si se tiene el archivo html almacenado de manera local.
a) Navegar a la ubicación del archivo haciendo click en el botón "Browse..."
b) Hacer click en el botón "html > tree"
c) Empezar la exploración del árbol haciendo click en los nodos
2) Si el archivo es una pagina web estándar.
a) Copié la dirección (URL) desde el navegador web a la caja de texto
b) Hacer click en el botón "html > tree"
c) Empezar la exploración del árbol haciendo click en los nodos
En la consola, se puede observar la secuencia de ruta, desde el punto seleccionado hasta la raíz. Vale la pena aclarar, que dicha secuencia, normalmente se requiere en el sentido contrario, o sea, desde la raíz, hasta el punto deseado.
En el wiki de Tcl, descubrí un código ejemplo llamado "LemonTree" el cual generaliza el llenado de un control BWidget tipo arbol con elementos de una jerarquía.
Ejemplos de estructuras de datos jerárquicos son: el sistema de archivos, los controles en una interface gráfica hecha con Tk, los comandos y las variables en los "namespaces",etc.
Por otro lado, LemonTree explica claramente como agregar otras estructuras jerárquicas a este control, lo cual viene perfecto para el caso de los tags dentro de un archivo html.
Una vez que se puede explorar el contenido del archivo html en un control de este tipo, se está en la posibilidad de utilizar este script a manera de herramienta para facilitar la determinacion de la ruta a los elementos de interés.
En esta ocasión, les presento el código al cual le llame' "LemonTree Branch" en la publicación original, para hacer referencia al script en el que esta basado.
Mañana, veremos un ejemplo de parseo de una pagina web, para lo cual, utilicé este script para encontrar la mencionada "ruta" el punto de inicio de los elementos que me interesa extraer.
Como se usa:
1) Si se tiene el archivo html almacenado de manera local.
a) Navegar a la ubicación del archivo haciendo click en el botón "Browse..."
b) Hacer click en el botón "html > tree"
c) Empezar la exploración del árbol haciendo click en los nodos
2) Si el archivo es una pagina web estándar.
a) Copié la dirección (URL) desde el navegador web a la caja de texto
b) Hacer click en el botón "html > tree"
c) Empezar la exploración del árbol haciendo click en los nodos
En la consola, se puede observar la secuencia de ruta, desde el punto seleccionado hasta la raíz. Vale la pena aclarar, que dicha secuencia, normalmente se requiere en el sentido contrario, o sea, desde la raíz, hasta el punto deseado.
package require struct
package require csv
package require report
package require htmlparse
package require textutil
package require http
package require BWidget
namespace eval LemonTree {variable uniqueID 0}
#http://www.cs.grinnell.edu/~walker/fluency-book/labs/sample-table.html
if 0 {The Tree widget allows a -data item for each node, which I use for a dict-like
list that contains the node's type and "real name" (as opposed to the "display name"
- for instance, a dir node would display only its [file tail], but the real name is
the full path). This routine adds a node to the LemonTree: }
proc LemonTree::add {w parent type name {text ""}} {
variable uniqueID; variable icon
if {$parent != "root"} {
set val1 [::t get $name data]
set val2 [::t get $name type]
set val3 [::t index $name]
if {$text eq ""} {set text "$val3: <$val2> [string range $val1 0 30]"}
#if {$text eq ""} {set text "$val3,$val2,$val1"}
}
set id n[incr uniqueID]
set data [list type $type name $name]
#tk_messageBox -message "$type,$name"
set fill [expr {[string match (* $text]? "blue": "black"}]
set drawcross [expr {[info proc ::LemonTree::kids($type)] eq ""?
"never": "allways"}]
$w insert end $parent $id -text $text -data $data -drawcross $drawcross -fill $fill
if [info exists icon($type)] {
$w itemconfigure $id -image $icon($type)
}
}
if 0 {For speed, a Tree isn't drawn fully expanded at the beginning.
Instead, nodes are opened on demand, when the user clicks on the [+] icon.
I use the -drawcross "allways" mode (shudder - should be fixed to "always",
but then older code might break) to indicate that the node hasn't been opened before
- after the first opening, the mode is set to "auto", meaning to draw a cross only if the node has children. }
proc LemonTree::open {w node} {
if {[$w itemcget $node -drawcross] eq "allways"} {
set data [$w itemcget $node -data]
set type [dict'get $data type]
foreach {ktype kids} [kids($type) $w $node] {
foreach kid $kids {add $w $node $ktype $kid}
}
$w itemconfigure $node -drawcross auto
}
}
if 0 {So far for the generic LemonTree - the rest is already customization for specific item types.
The kids($type) call above looks like an array element
- in fact it's a way of dispatching the generic operation of providing the list of children
of an entity of given type, which of course depends on the type. For instance, the children
of a directory are its subdirectories, and then its files (with special-casing for Windows,
so that drive letters are the children of "/"): }
proc LemonTree::kids(html) {w node} {
set name [dict'get [$w itemcget $node -data] name]
list html [::t children $name]
}
if 0 {A Tree looks prettier if nodes have icons, so I'm using some of those that BWidget comes with:}
set path $BWIDGET::LIBRARY/images
foreach {type name} {dir folder file file array copy html folder} {
set LemonTree::icon($type) [image create photo -file $path/$name.gif]
}
if 0 {This thing is more useful if you can get more information about an item by clicking on it
- for a file, its size and date; for a variable, its value; for a proc, its full specification, etc.
As a small first shot, I selected a "balloon" for that purpose. }
proc LemonTree::Info {w node} {
set type [dict'get [$w itemcget $node -data] type]
if {[info proc ::LemonTree::info($type)] ne ""} {
balloon $w [info($type) $w $node]
}
}
#-- type-specific info providers:
proc LemonTree::info(html) {w node} {
#puts $node
set name [dict'get [$w itemcget $node -data] name]
if {$name != "root"} {
set val1 [::t get $name data]
set val2 [::t get $name type]
set val3 [::t index $name]
puts $node
puts "\t[t index $name]"
foreach nodo [t ancestors $name] {
if {$nodo != "root"} {
puts "\t[t index $nodo]"
}
}
} else {
set val1 "root"
}
return "$val1"
}
#-- A simple ballon, modified from Bag of Tk algorithms:
proc balloon {w text} {
set top .balloon
catch {destroy $top}
toplevel $top -bd 1
pack [message $top.txt -aspect 10000 -bg lightyellow \
-borderwidth 0 -text $text -font {Helvetica 9}]
wm overrideredirect $top 1
wm geometry $top +[winfo pointerx $w]+[winfo pointery $w]
bind $top <1> [list destroy $top]
raise $top
}
if 0 {From Tcl 8.5, one would use a real dict, but it's easy to make a replacement
that works roughly the same in 8.4 (it returns "" for non- existing keys instead of throwing an error),
and might be slower, but I won't notice on dicts with two elements ;-}
proc dict'get {dict key} {
foreach {k value} $dict {if {$k eq $key} {return $value}}
}
#-- reconstruct a proc's definition as a string:
proc procinfo name {
set args ""
foreach arg [info args $name] {
if [info default $name $arg def] {lappend arg $def}
lappend args $arg
}
return "proc $name {$args} {[info body $name]}"
}
#
#
#
proc main {} {
set url [.txt get]
catch {t destroy}
.t delete [.t nodes root]
if {$url == ""} {
tk_messageBox -message "specify html location"
return
}
::struct::tree t
if {[string range $url 0 3] == "http"} {
set http [::http::geturl $url]
set html [::http::data $http]
} else {
set html [read [set fh [open $url]]]
close $fh
}
#puts $url
htmlparse::2tree $html t
#htmlparse::removeVisualFluff t
#htmlparse::removeFormDefs t
LemonTree::add .t root html root "(html)"
return
}
# -------------------------------------------
label .lbl -text "URL or path:"
entry .txt -width 60
button .btnBrowser -text Browse... -command {.txt insert end [tk_getOpenFile]}
button .btnGet -text "html > tree" -command main
button .btnSalir -text Exit -command {
catch {t destroy}
exit
}
grid .lbl .txt .btnBrowser
grid .btnGet -row 1 -column 1
grid .btnSalir -row 1 -column 2
#-- Now to demonstrate and test the whole thing:
Tree .t -background white -opencmd {LemonTree::open .t} \
-width 60 -height 30 -yscrollcommand {.y set}
.t bindText <1> {LemonTree::Info .t}
.t bindImage <1> {LemonTree::Info .t}
scrollbar .y -command {.t yview}
grid .t -row 2 -column 0 -columnspan 3
grid .y -row 2 -column 3 -sticky ns
.txt insert end "http://www.cs.grinnell.edu/~walker/fluency-book/labs/sample-table.html"
#-- Little development helpers:
bind . <Escape> {exec wish $argv0 &; exit}
bind . <F1> {console show}
Wednesday, April 30, 2014
"Parseo" de paginas html y el demo "oreilly-oscon2001"
El parseo de paginas web (de html puro) puede resultar muy util en muchos casos, el cambio de formato, el computo de datos, la creacion de graficas, etc, puede significar un ahorro de tiempo significativo.
En esta ocasion, quiero presentarles un demo que me parece de lo mas interesante, este viene instalado por defecto en la version de ActiveState llamada "baterias incluidas"
Para definir el punto de partida, veamos que version de Tcl tengo instalada en esta PC (con windows):
% info tclversion
8.4
% info patchlevel
8.4.20
Desde luego, eso tambien se puede saber desde que ves el prompt completo de la consola (lo cual quite' de la interaccion anterior por motivos de claridad):
(ActiveState ActiveTcl 8.4.20.0) 1 %
El demo "oreilly-oscon", se encuentra localizado en:
C:\Tcl\demos\Tcllib\oreilly-oscon2001
si es que instalaste Tcl/Tk en las opciones por defecto que te da el instalador.
En esa carpeta, se tienen los siguientes archivos:
oscon
osconwrap
README
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html
Primeramente, agregue' extensiones a los primeros 3 archivos para facilitar la asociacion con mi editor preferido (PSPad). quedaron asi:
oscon.tcl
osconwrap.txt
README.txt
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html
El README.txt especifica:
* que depende de 6 librerias
* tcllib htmlparse
* tcllib struct matrix
* tcllib struct tree
* tcllib csv
* tcllib report
* tcllib log
* que genera 6 archivos (2 txt, 2 csv y 2 html) + 2 ps si se cuenta con "a2ps"
* que los archivos html fuente estan incluidos en este mismo directorio para evitar que el script deje de funcionar debido a que la pagina ya no este disponible, o esta haya cambiado de formato.
Debido a algunos cambios a partir de la version 2.0 de la libreria struct::tree,
http://tcllib.sourceforge.net/doc/struct_tree.html#SECTid82038b8
es necesario hacer algunas correcciones al script oscon. (el cual ahora lo tengo con extension tcl)
En resumen, los cambios son:
1) el comando de creacion de la estructura de arbol, tenia (por alguna razon que desconozco), lo siguiente:
::struct::tree::tree t
Es necesario dejarlo asi:
::struct::tree t
2) Hay que eliminar la opcion -key de los comandos "t get..."
Esta es la lista de cambios (ya como deben quedar esas lineas):
#cambio #1
::struct::tree t
--
#cambio #2
set day [escape [t get $day data]]
--
#cambio #3
set start [cvtdate [escape [t get [walkf $sess {0 0}] data]]]
#cambio #4
set track [string trim [escape [t get [walkf $sess {1 0}] data]]]
#cambio #5
set loc [escape [t get [walkf $sess {1 1 0}] data]]
--
#cambio #6
set time [escape [t get $talk data]]
--
#cambio #7
set title [escape [t get [walkf $talk {0 0 0}] data]]
#cambio #8
set speaker [escape [t get [walkf $talk {0 2}] data]]
--
#cambio #9
set tp [$t get $n type]
--
#cambio #10
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([$t get $n data]...)"
--
#change #11
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([string range [$t get $n data] 0 20]...)"
Ahora si, ya podemos lanzar el programa tal como se especifica en el archivo README.txt:
tclsh oscon.tcl wed sessions_wednesday.html
Al finalizar la ejecucion del script, los siguientes archivos seran creados:
wed.main.csv
wed.main.html
wed.main.ps
wed.main.txt
wed.sched.csv
wed.sched.html
wed.sched.ps
wed.sched.txt
Checalos, y comparalos contra la fuente (sessions_wednesday.html), para que veas lo que se puede hacer en termino de "parseo" y reformateo de la informacion.
Interesante, verdad?
En esta ocasion, quiero presentarles un demo que me parece de lo mas interesante, este viene instalado por defecto en la version de ActiveState llamada "baterias incluidas"
Para definir el punto de partida, veamos que version de Tcl tengo instalada en esta PC (con windows):
% info tclversion
8.4
% info patchlevel
8.4.20
Desde luego, eso tambien se puede saber desde que ves el prompt completo de la consola (lo cual quite' de la interaccion anterior por motivos de claridad):
(ActiveState ActiveTcl 8.4.20.0) 1 %
El demo "oreilly-oscon", se encuentra localizado en:
C:\Tcl\demos\Tcllib\oreilly-oscon2001
si es que instalaste Tcl/Tk en las opciones por defecto que te da el instalador.
En esa carpeta, se tienen los siguientes archivos:
oscon
osconwrap
README
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html
Primeramente, agregue' extensiones a los primeros 3 archivos para facilitar la asociacion con mi editor preferido (PSPad). quedaron asi:
oscon.tcl
osconwrap.txt
README.txt
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html
El README.txt especifica:
* que depende de 6 librerias
* tcllib htmlparse
* tcllib struct matrix
* tcllib struct tree
* tcllib csv
* tcllib report
* tcllib log
* que genera 6 archivos (2 txt, 2 csv y 2 html) + 2 ps si se cuenta con "a2ps"
* que los archivos html fuente estan incluidos en este mismo directorio para evitar que el script deje de funcionar debido a que la pagina ya no este disponible, o esta haya cambiado de formato.
Debido a algunos cambios a partir de la version 2.0 de la libreria struct::tree,
http://tcllib.sourceforge.net/doc/struct_tree.html#SECTid82038b8
es necesario hacer algunas correcciones al script oscon. (el cual ahora lo tengo con extension tcl)
En resumen, los cambios son:
1) el comando de creacion de la estructura de arbol, tenia (por alguna razon que desconozco), lo siguiente:
::struct::tree::tree t
Es necesario dejarlo asi:
::struct::tree t
2) Hay que eliminar la opcion -key de los comandos "t get..."
Esta es la lista de cambios (ya como deben quedar esas lineas):
#cambio #1
::struct::tree t
--
#cambio #2
set day [escape [t get $day data]]
--
#cambio #3
set start [cvtdate [escape [t get [walkf $sess {0 0}] data]]]
#cambio #4
set track [string trim [escape [t get [walkf $sess {1 0}] data]]]
#cambio #5
set loc [escape [t get [walkf $sess {1 1 0}] data]]
--
#cambio #6
set time [escape [t get $talk data]]
--
#cambio #7
set title [escape [t get [walkf $talk {0 0 0}] data]]
#cambio #8
set speaker [escape [t get [walkf $talk {0 2}] data]]
--
#cambio #9
set tp [$t get $n type]
--
#cambio #10
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([$t get $n data]...)"
--
#change #11
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([string range [$t get $n data] 0 20]...)"
Ahora si, ya podemos lanzar el programa tal como se especifica en el archivo README.txt:
tclsh oscon.tcl wed sessions_wednesday.html
Al finalizar la ejecucion del script, los siguientes archivos seran creados:
wed.main.csv
wed.main.html
wed.main.ps
wed.main.txt
wed.sched.csv
wed.sched.html
wed.sched.ps
wed.sched.txt
Checalos, y comparalos contra la fuente (sessions_wednesday.html), para que veas lo que se puede hacer en termino de "parseo" y reformateo de la informacion.
Interesante, verdad?
Tuesday, April 29, 2014
Loteria parte 2
Una vez que se tienen las 54 imagenes correspondientas a las cartas de loteria, segun se describe en el post de ayer, estamos listos para probar este script el cual consiste en una "barajador" virtual para nuestros juegos de loteria con familiares y amigos.

El codigo siguiente, se basa principalmente en esta pagina del "Tcl wiki":
http://wiki.tcl.tk/9888
El codigo siguiente, se basa principalmente en esta pagina del "Tcl wiki":
http://wiki.tcl.tk/9888
# --------------------------------
#
# loteria
# heavily based on http://wiki.tcl.tk/9888
# --------------------------------
console show
package require Tk
package require Img
if {$tcl_platform(platform) == "unix"} {
sdltk textinput off
borg spinner on;borg toast "Shuffling..."
}
package require struct
package require htmlparse
package require http
set onLine 0
proc iota2 n {
global onLine
::struct::tree t
set url "http://www.random.org/sequences/?min=1&max=54&col=1&format=html&rnd=new"
set http [::http::geturl $url]
set html [::http::data $http]
htmlparse::2tree $html t
htmlparse::removeVisualFluff t
htmlparse::removeFormDefs t
if { [catch {walk {1 4 1 0}} base] } {
tk_messageBox -message "Web Page not available 1"
set onLine 0
t destroy
reset
return
}
if {$base == ""} {
tk_messageBox -message "Web Page not available 2"
set onLine 0
t destroy
reset
return
}
#set base [walk {1 4 1 0}]
set listado [t get $base data]
puts "type(tag): [t get $base type]\n"
set ctr 0
foreach card $listado {
puts "[incr ctr]: $card"
}
t destroy
return $listado
}
proc walkf {n p} {
foreach idx $p {
if {$n == ""} {break}
set n [lindex [t children $n] $idx]
}
return $n
}
proc walk {p} {
return [walkf root $p]
}
# -------------
# parameters
# -------------
proc randomColor {} {format #%06x [expr {int(rand() * 0xFFFFFF)}]}
# name color file
for {set i 1} {$i < 55} {incr i} {
set ctr [format "%02d" $i]
lappend parms [list flower$i [randomColor] lote$ctr.jpg]
}
proc reset {} {
global las54 onLine tcl_platform
.name config -text ""
if {$tcl_platform(platform) == "unix"} {borg spinner on;borg toast "Shuffling..."}
#set las54 [iota1 54]
if $onLine {
set las54 [iota2 54]
} else {
set las54 [iota1 54]
}
foreach i $::list { .0 itemconf $i -state hidden }
for {set i 1} {$i < 55} {incr i} {
.$i itemconf 1 -state hidden
}
.btn configure -state normal
.ckOnLine configure -state normal
if {$tcl_platform(platform) == "unix"} {borg spinner off;borg toast "Ready..."}
}
proc dala {} {
global las54 onLine
.ckOnLine configure -state disabled
if $onLine {
puts "on-line"
set i [ldrawOL las54]
} else {
set i [ldraw las54]
}
bind .$i <1> [list select $i]
set quedan [llength $las54]
.name config -text [expr {54 - $quedan}]
if {$quedan == 0} {
.btn configure -state disabled
}
select $i
}
proc iota1 n {
set res {}
for {set i 1} {$i<=$n} {incr i} {lappend res $i}
set res
}
proc ldraw _list {
puts "local"
upvar 1 $_list list
set pos [expr {int(rand()*[llength $list])}]
K [lindex $list $pos] [set list [lreplace $list $pos $pos]]
}
proc ldrawOL _list {
puts "on-line"
upvar 1 $_list list
set pos 0
K [lindex $list $pos] [set list [lreplace $list $pos $pos]]
}
proc K {a b} {set a}
if $onLine {
set las54 [iota2 54]
} else {
set las54 [iota1 54]
}
# -------------
# nmage/bimage packages
# -------------
# create a canvas with n images
proc nmage {w args} \
{
# take size from the first image
set image [lindex $args 0]
set ww [image width $image]
set hh [image height $image]
# center coordinates
set x [expr {$ww / 2}]
set y [expr {$hh / 2}]
# create canvas
puts "creating canvas $w"
canvas $w -width $ww -height $hh -highlightt 0
# create the images
foreach image $args {
set id [$w create image $x $y -anchor center -image $image -state hidden]
puts "creating $w > $id"
}
}
# create a canvas with a mini image
proc bimage {n} \
{
# take size from the full image
set image $::names($n)
set ww [image width $image]
set hh [image height $image]
# create the mini image from the full image
foreach {type factor} {mini 4} \
{
set ww2 [expr {$ww / $factor}]
set hh2 [expr {$hh / $factor}]
image create photo ${type}$n -width $ww2 -height $hh2
${type}$n copy $image -subsample $factor
}
# create a canvas with the mini image
nmage .$n mini$n
}
# -------------
# mechanism
# -------------
# called on n-th choice (click on canvas)
proc select {n} \
{
# select the little image
#foreach i $::list { choose $i $n }
.$n itemconf 1 -state normal
.0 raise $n
.0 itemconf $n -state normal
if 0 {
foreach i $::list { .0 itemconf $i -state hidden }
.0 itemconf $n -state normal
}
# show its name
# .name config -text $::names($n)
# set background color
set color $::colors($n)
foreach w {. .name .0} { $w config -bg $color }
foreach i $::list { .$i config -bg $color }
}
# choose between the mini & the micro image
proc choose {i n} \
{
set a 1; set b 2
if {$i == $n} { set a 2; set b 1 }
puts "b = $b"
.$i itemconf $b -state normal
}
# -------------
# create images from files
# -------------
set i 0
foreach item $parms \
{
foreach {name color file} $item break
lappend list [incr i]
set names($i) $name
set colors($i) $color
set files($i) $file
}
foreach i $list { image create photo $names($i) -file $files($i) }
# -------------
# create widgets
# -------------
# the canvas with the full size images
foreach i $list { lappend images $names($i) }
eval [linsert $images 0 nmage .0]
# the label with the name
label .name -font {Times -24}
# the selection canvas
# -------------
# place & display widgets
# -------------
button .btn -text Next -command dala
grid .btn -row 1 -column 0 -sticky nswe
button .btnReset -text Reset -command reset
checkbutton .ckOnLine -text "On-Line" -variable onLine -onvalue 1 -offvalue 0
grid .btnReset -row 6 -column 5 -columnspan 3 -sticky nsew
grid .ckOnLine -row 6 -column 8 -columnspan 3
grid .name -row 0 -column 0
grid .0 -row 2 -column 0 -rowspan 5
for {set i 1} {$i < 55} {incr i} {
set row [format "%0.0f" [expr {ceil ($i/10.0)}]]
set col [format "%0.0f" [expr {((($i/10.0) - $row) + 1) * 10}]]
bimage $i
grid .$i -row $row -column $col
#bind .$i <1> [list select $i]
}
# -------------
# do it!
# -------------
wm title . loteria!
after idle {
if {$tcl_platform(platform) == "unix"} {borg spinner off;borg toast "Ready..."}
}
Monday, April 28, 2014
Loteria parte 1
El primer paso para tener lista nuestra "baraja virtual" de loteria mexicana, es obtener las 54 imagenes de las cartas.
Desde luego, este codigo puede ser ejecutado desde tu Android Tablet, si cuentas con Androwish.
Al finalizar la ejecucion de este script, se tendran 54 imagenes:
(desde lote01.jpg, hasta lote54.jpg), en el mismo directorio donde este ubicado este script:
console show
#package require Tk
package require http
#package require base64
package require Img
set um [http::geturl http://loteria.elsewhere.org/miniatura/]
set b [split [http::data $um] "\n"]
for {set i 1} {$i<55} {incr i} {
if {$i < 10} {
set ctr "0$i"
} else {
set ctr $i
}
set ln [lsearch -inline -glob $b "*miniatura-${ctr}_298*"]
puts $ln
regexp {^.*src=\"([^"]+)\".*$} $ln --> picurl
http::cleanup $um
set um [http::geturl http://loteria.elsewhere.org$picurl]
set filename "lote$ctr.jpg"
set fd [open [file join [lindex $argv 0] $filename] w]
fconfigure $fd -translation binary -encoding binary
puts $fd [http::data $um]
close $fd
http::cleanup $um
}
Sunday, April 27, 2014
Tcl/Tk en Android !
Androwish es...Tcl/Tk en Android!
La version mas reciente puede ser descargada de:
http://www.androwish.org
Tuve la oportunidad de contribuir con el icono de la aplicacion, de hecho, mi hija llevo la idea a Illustrator y de ahi a la persona que esta detras de todo este esfuerzo para que nosotros podamos disfrutar y aprovechar Tcl/Tk en Android.
He probado un par de programas que corren bien con Androwish:
Logo: http://wiki.tcl.tk/39563
Flow Colors: http://wiki.tcl.tk/39820
Tambien, hice mi propia "baraja" de loteria mexicana la cual publicare en este mismo espacio en los siguientes dias.
La version mas reciente puede ser descargada de:
http://www.androwish.org
Tuve la oportunidad de contribuir con el icono de la aplicacion, de hecho, mi hija llevo la idea a Illustrator y de ahi a la persona que esta detras de todo este esfuerzo para que nosotros podamos disfrutar y aprovechar Tcl/Tk en Android.
He probado un par de programas que corren bien con Androwish:
Logo: http://wiki.tcl.tk/39563
Flow Colors: http://wiki.tcl.tk/39820
Tambien, hice mi propia "baraja" de loteria mexicana la cual publicare en este mismo espacio en los siguientes dias.
Saturday, April 26, 2014
comando clock
comando clock
Este comando es util para los calculos y operaciones con fechas.
Primeramente, clock seconds, devuelve un entero que representa la cantidad de segundos transcurridos desde la fecha actual en el sistema, contra una fecha de referencia, la cual es una convencion situada alrededor de 1/1/1970.
% clock seconds
1398566136
Para obtener dicha cantidad de segundos de una fecha especifica, se usa el subcomando scan:
% clock scan 4/26/2014
1398488400
En la direccion contraria, para obtener una fecha, a partir de la cantidad de segundos, se usa el subcomando format:
% clock format 1398488400
Sat Apr 26 12:00:00 AM Central Daylight Time (Mexico) 2014
Una de las opciones mas usadas del comando "clock format" es precisamente el tambien llamado "format", con el cual, uno puede especificar el formato que espera en el resultado.
% clock format 1398488400 -format "%Y/%m/%d"
2014/04/26
Por cierto, cual es la fecha de referencia mencionada arriba?
pues lo podemos saber asi:
% clock format 0
Wed Dec 31 6:00:00 PM Central Standard Time (Mexico) 1969
Este comando es util para los calculos y operaciones con fechas.
Primeramente, clock seconds, devuelve un entero que representa la cantidad de segundos transcurridos desde la fecha actual en el sistema, contra una fecha de referencia, la cual es una convencion situada alrededor de 1/1/1970.
% clock seconds
1398566136
Para obtener dicha cantidad de segundos de una fecha especifica, se usa el subcomando scan:
% clock scan 4/26/2014
1398488400
En la direccion contraria, para obtener una fecha, a partir de la cantidad de segundos, se usa el subcomando format:
% clock format 1398488400
Sat Apr 26 12:00:00 AM Central Daylight Time (Mexico) 2014
Una de las opciones mas usadas del comando "clock format" es precisamente el tambien llamado "format", con el cual, uno puede especificar el formato que espera en el resultado.
% clock format 1398488400 -format "%Y/%m/%d"
2014/04/26
Por cierto, cual es la fecha de referencia mencionada arriba?
pues lo podemos saber asi:
% clock format 0
Wed Dec 31 6:00:00 PM Central Standard Time (Mexico) 1969
Friday, April 25, 2014
radiobutton's
Hoy quise ponerle botones de opcion (radio buttons) a una de mis aplicaciones.
partiendo del listado de opciones:
set listado {texto1 val1 texto2 val2 texto3 val3}
Ahora hay que ir tomando cada par de llave-valor y crear (y empacar) los botones:
foreach {caption valor} $listado {
radiobutton .opt$valor -text $caption -value $valor
pack .opt$valor
}
Sunday, November 3, 2013
Saturday, October 26, 2013
Tuesday, August 13, 2013
Usando Windows, pero te gusta Linux
Link con buenos tips si tienes que usar Windows pero quisieras contar con algunos elementos de Linux;
http://www.welton.it/articles/windows_for_linux_users
En esta ocasión, instalé cream, para practicar un poco de vim.
http://www.welton.it/articles/windows_for_linux_users
En esta ocasión, instalé cream, para practicar un poco de vim.
Tuesday, July 9, 2013
Saturday, June 15, 2013
Puerto B refleja estado de Puerto A
Este programa activa los leds del puerto B como un reflejo del puerto A:
1.- Definicion de PIC y archivo de etiquetas:
2.- Configuracion del chip:
3.- El programa propiamente dicho:
1.- Definicion de PIC y archivo de etiquetas:
2.- Configuracion del chip:
3.- El programa propiamente dicho:
Thursday, June 13, 2013
Primer Programa en Ensamblador
Programa sencillito, lo único que hace es transferir un patrón CONSTANTE hacia el puerto B.
Las claves:
Las claves:
- Visualizar bsf a RP0 como un nivel superior el cual es usado para configuración
- Mientras que bcf a RP0 nos regresa "a nivel de cancha" para la operación.
Éste es el cuarto "post" en dia consecutivo..Wow, creo no había logrado esto antes...
Nos vemos!
Wednesday, June 12, 2013
Programa PIC Entrenador-05
Este programa es muy similar al anterior, en este caso, se enciende un led y luego éste es rotado hacia la izquierda en un ciclo infinito.
Se indican con ">>>" las direcciones modificadas con respecto al ejemplo anterior.
Tuesday, June 11, 2013
Programa PIC Entrenador-04
Los leds pares conectados al puerto B encienden durante 0.4 segundos y los impares permanecen apagados. Despues, se encienden los leds impares durante el mismo tiempo y se apagan los pares. Se entra en un ciclo repitiendo esos dos estados.
Observe que se tuvieron que cambiar las 2 direcciones de los registros GPR en el ciclo de retardo.
Se usó el registro en 0x20 en lugar del 0x0C
Se usó el registro en 0x21 en lugar del 0x0D
Ánimo!
Monday, June 10, 2013
Programa PIC Entrenador-03
Por el puerto A, se lee un valor no mayor a 8.
Ese valor indicará cuantos leds deben encenderse en el puerto B.
En el siguiente cuadro se muestra una adecuacion que tuve que hacer debido a que el hardware que tengo usa PA0 para controlar un relevador.
Ese valor indicará cuantos leds deben encenderse en el puerto B.
En el siguiente cuadro se muestra una adecuacion que tuve que hacer debido a que el hardware que tengo usa PA0 para controlar un relevador.
A continuacion se muestra el programa original para PIC16F84 y el adaptado para correr con un PIC16F628 con un relay en PA0.
Observe el llenado de valores dobles (direccion 11 y 12 con valor 3400) debido a tener corridos los valores de entrada por el puerto A, con un factor de 2.
En otras palabras, se espera que 2 patrones en A4-A0, activen un solo patron en puerto B:
- A - - B -
4 3 2 1 0 >>> 7654 3210
0 0 0 0 0 >>> 0000 0000
0 0 0 0 1 >>> 0000 0000
de modo que A0 sea ignorado.
Ánimo!
Friday, May 24, 2013
colorear renglones en tablelist
package require tablelist
console show
set tbl .tbl
tablelist::tablelist $tbl \
-columns {0 "A" 0 "B" 0 "C" 0 "D" 0 "E"}\
-height 15\
-width 100
pack $tbl
$tbl insert end [list a b c d e]
$tbl cellconfigure end,0 -foreground white -background red
$tbl insert end [list a b c d e]
$tbl cellconfigure end,1 -foreground white -background blue
$tbl insert end [list a b c d e]
$tbl cellconfigure end,2 -foreground black -background green
$tbl insert end [list a b c d e]
$tbl rowconfigure end -foreground black -background green
console show
set tbl .tbl
tablelist::tablelist $tbl \
-columns {0 "A" 0 "B" 0 "C" 0 "D" 0 "E"}\
-height 15\
-width 100
pack $tbl
$tbl insert end [list a b c d e]
$tbl cellconfigure end,0 -foreground white -background red
$tbl insert end [list a b c d e]
$tbl cellconfigure end,1 -foreground white -background blue
$tbl insert end [list a b c d e]
$tbl cellconfigure end,2 -foreground black -background green
$tbl insert end [list a b c d e]
$tbl rowconfigure end -foreground black -background green
Interaccion dinámica:
Habiendo seleccionado el cuarto renglon (row 3 debido a que la numeracion empieza en cero)
% $tbl curselection
3
% set fileSize [$tbl cellcget 3,1 -text]
b
% set fileSize [$tbl cellcget [$tbl curselection],1 -text]
b
Si a la 2a columna se le asigna un nombre (column 1)
% $tbl columnconfigure 1 -name fileName
% set fileSize [$tbl cellcget [$tbl curselection],fileName -text]
b
Friday, April 26, 2013
gnuplot por primera vez
Instale gnuplot en mi ubuntu-PC, hice el ejemplo de chihungchan.blogspot.com (ocbc cycling analysis).
en mi "home", tengo una carpeta llamada "plots"
lo que puse en "plots"
bici.plt
data39.png
data39.txt
mytime.txt
para correr bici.plot, me ubico en /home/jorge/plots y...
$ gnuplot bici.plt
lo cual genera:
data39.png
en mi "home", tengo una carpeta llamada "plots"
lo que puse en "plots"
bici.plt
data39.png
data39.txt
mytime.txt
para correr bici.plot, me ubico en /home/jorge/plots y...
$ gnuplot bici.plt
lo cual genera:
data39.png
Wednesday, October 17, 2012
Imprimiendo desde Windows/Linux a impresora conectada a la Mac
Anteriormente, ya había podido imprimir desde Windows a una impresora conectada al USB de la Mac.
Pero, un buen día, (más bien un mal día), el CUPS dejó de funcionar.
me mostraba el error "Internal Server Error", al tratar de entrar al tab "printers" en la interface web http://localhost:631
Éstos son los links que me ayudaron a resolver el problema:
Sharing a USB printer from Mac OS X to Windows
Pero, un buen día, (más bien un mal día), el CUPS dejó de funcionar.
me mostraba el error "Internal Server Error", al tratar de entrar al tab "printers" en la interface web http://localhost:631
Éstos son los links que me ayudaron a resolver el problema:
Sharing a USB printer from Mac OS X to Windows
y éste link me ayudó cuando el CUPS dejó de funcionar:
para el caso de Ubuntu-Linux...
http://elliotth.blogspot.mx/2006/06/printing-from-ubuntu-to-macs-usb.html
http://elliotth.blogspot.mx/2006/06/printing-from-ubuntu-to-macs-usb.html
Saturday, October 13, 2012
mi Palm revive !
Para hacer funcionar el hotmail en el navegador de la Palm TX,
le instalé FileZ desde Handango y con él borre el archivo de cookies de Blazer
http://forums.webosnation.com/archive/index.php?t-41116.html
(from webOS Nation Forum, post "Mobile Hotmail site?")
Por otro lado, me encontré un tutorial para poder configurar hotmail en el cliente "Versa Mail", el truco está en usar "Otro" en la seleccion del mail y los numeros de puerto y usar SSL.
http://ipda.es/palm-os/configurando-hotmail-en-versamail-en-palm-os
le instalé FileZ desde Handango y con él borre el archivo de cookies de Blazer
http://forums.webosnation.com/archive/index.php?t-41116.html
(from webOS Nation Forum, post "Mobile Hotmail site?")
Por otro lado, me encontré un tutorial para poder configurar hotmail en el cliente "Versa Mail", el truco está en usar "Otro" en la seleccion del mail y los numeros de puerto y usar SSL.
http://ipda.es/palm-os/configurando-hotmail-en-versamail-en-palm-os
Saturday, September 22, 2012
Pelicula "Sixty Six"
Es de esas peliculas que puedes ver en familia y que te hacen pasar un buen rato.
Monday, March 19, 2012
Cambiar el SO por default en el GRUB
Tengo una PC viejita donde tengo Windows XP y Ubuntu. El sistema operativo por defecto es Ubuntu.
En este link viene como cambiar la seleccion por defecto del sistema operativo con el que la PC arrancará.
http://www.howtogeek.com/65974/how-to-easily-change-your-dual-booting-pcs-default-os/
En la version 12-04 (unity) el proceso es diferente:
1.- Primero, Instale y ejecute el programa "Grub Customizer"
2.- Seleccione la cejilla "General Settings" y seleccione ahí al SO por defecto
http://www.techsupportalert.com/content/tips-and-tricks-ubuntu-after-installation-ubuntu-1204.htm#Change-Default-Boot-Options
En este link viene como cambiar la seleccion por defecto del sistema operativo con el que la PC arrancará.
http://www.howtogeek.com/65974/how-to-easily-change-your-dual-booting-pcs-default-os/
En la version 12-04 (unity) el proceso es diferente:
1.- Primero, Instale y ejecute el programa "Grub Customizer"
2.- Seleccione la cejilla "General Settings" y seleccione ahí al SO por defecto
http://www.techsupportalert.com/content/tips-and-tricks-ubuntu-after-installation-ubuntu-1204.htm#Change-Default-Boot-Options
Sunday, March 18, 2012
Re-instalar windows 7 en asus netbook
Jorgillo me pidió ayuda para re-instalar windows 7 starter en su netbook. Despues de buscar por varios lados, lo que me funciono fue este link...
http://www.spemi.com/2009/09/reinstall-recover-windows-xp-on-asus.html
http://www.spemi.com/2009/09/reinstall-recover-windows-xp-on-asus.html
Sunday, November 28, 2010
my posts to the Tcl wiki
as said by Arjen Markus:
Dec 16, 2009
- Picking an HTML page apart and showing its structure ...
Again a tree: http://wiki.tcl.tk/25371 and what a nice
reuse of existing code.
Jul 19, 2010
- Displaying the structure of a document as a tree of objects ...
perhaps not simple, but well worth the effort. http://wiki.tcl.tk/25371 shows the result.
Dec 16, 2009
- Picking an HTML page apart and showing its structure ...
Again a tree: http://wiki.tcl.tk/25371 and what a nice
reuse of existing code.
Jul 19, 2010
- Displaying the structure of a document as a tree of objects ...
perhaps not simple, but well worth the effort. http://wiki.tcl.tk/25371 shows the result.
Monday, November 15, 2010
un post desde el iPad
Veamos que tal se puede crear una entrada desde el ipad, al parecer si se puede teclear bien.
Friday, September 10, 2010
Wednesday, September 8, 2010
One Track Mind Web Server
Revisando esta aplicacion de Michael Cleverly en el wiki, descubrí lo siguiente:
- Corre solo en linux
- usando el command line, puedes definir el contenido a servir por el web server, ya sea un simple mensaje de texto, un archivo, una URL a donde redireccionar, etc
Tuve que usar los comandos kill y ps aux para poder detener el web server.
Funcionará con una estructura hecha por ejemplo con MajaMaja?
- Corre solo en linux
- usando el command line, puedes definir el contenido a servir por el web server, ya sea un simple mensaje de texto, un archivo, una URL a donde redireccionar, etc
Tuve que usar los comandos kill y ps aux para poder detener el web server.
Funcionará con una estructura hecha por ejemplo con MajaMaja?
Saturday, September 4, 2010
PIC16F84 y PIC16F628
Programa: Entrenador-02
El siguiente programa activa los leds dependiendo del estado del switch A1 en el EduPIC:
El libro que tengo, trata del PIC16F84, sin embargo, el entrenador que me conseguí, trae el PIC16F628, cuando capturé el segundo programa de ejemplo, el programa no funcionó.
Tuve que revisar algunas de las diferencias basicas entre estos 2 microcontroladores y, de momento, encontré lo siguiente:
- el 628 tiene 4 bancos, contra los 2 bancos del 84.
- el 628 hace uso del puerto A, tambien para algunas funciones de comparador, por lo que hay que realizar algunas deshabilitaciones al principio del codigo para poder usar las lineas del puerto A como entradas/salidas digitales.
La siguiente imagen muestra el programa original para el 16F84 y las adecuaciones realizadas para que pueda ser usado en el EduPIC, con un 16F628:
El siguiente programa activa los leds dependiendo del estado del switch A1 en el EduPIC:
El libro que tengo, trata del PIC16F84, sin embargo, el entrenador que me conseguí, trae el PIC16F628, cuando capturé el segundo programa de ejemplo, el programa no funcionó.
Tuve que revisar algunas de las diferencias basicas entre estos 2 microcontroladores y, de momento, encontré lo siguiente:
- el 628 tiene 4 bancos, contra los 2 bancos del 84.
- el 628 hace uso del puerto A, tambien para algunas funciones de comparador, por lo que hay que realizar algunas deshabilitaciones al principio del codigo para poder usar las lineas del puerto A como entradas/salidas digitales.
La siguiente imagen muestra el programa original para el 16F84 y las adecuaciones realizadas para que pueda ser usado en el EduPIC, con un 16F628:
Conclusiones: Los programas del 16F84 requieren algunas adecuaciones si los quieres usar en un 16F628.
Tuesday, August 31, 2010
Un programa en codigo maquina
Programa: Entrenador-01
Pues bien, en la sesion anterior hemos programado el PIC con un programa existente en formato hex. Aún no hemos hecho ningun programa en ensamblador ni hemos usado el MPLAB para nada.
Este programa es muy sencillo, enciende unicamente los 4 leds correspondientes a los bits de mayor peso, mientras que mantiene apagados a los de menor peso.(Enciende 4 y apaga 4).
Este programa , lo vamos a capturar en el editor del programador WinPic. Haremos la captura directa de los codigos hexadecimales que resultarían despues de ensamblar.
Primero, asegurese que la cejilla "Device, Config" del programa WinPic, tiene la siguiente configuracion:
OSC Oscillator: XT
WDT Watchdog Timer: Off
PUT: Disabled
MCLRE: Enabled
BODEN: Disabled
LVP: Disabled
CPD: Disabled
CP: Off
Si los ajustes son correctos, el parámetro Config word #1 será 3F29 y el parámetro Config word #2 será 3FFF
Este es el programa a grabar y ejecutar:
direccion contenido
0000 1683
0001 0186
0002 1283
0003 30F0
0004 0086
0005 2804
(Quizas sea necesario habilitar el editor a traves de la opcion "Enable HEX editor" del menu "Edit"
Usando el programa WinPic, capturé dichos contenidos en la pantalla de codigo. Quedó así:
Pues bien, en la sesion anterior hemos programado el PIC con un programa existente en formato hex. Aún no hemos hecho ningun programa en ensamblador ni hemos usado el MPLAB para nada.
Este programa es muy sencillo, enciende unicamente los 4 leds correspondientes a los bits de mayor peso, mientras que mantiene apagados a los de menor peso.(Enciende 4 y apaga 4).
Este programa , lo vamos a capturar en el editor del programador WinPic. Haremos la captura directa de los codigos hexadecimales que resultarían despues de ensamblar.
Primero, asegurese que la cejilla "Device, Config" del programa WinPic, tiene la siguiente configuracion:
OSC Oscillator: XT
WDT Watchdog Timer: Off
PUT: Disabled
MCLRE: Enabled
BODEN: Disabled
LVP: Disabled
CPD: Disabled
CP: Off
Si los ajustes son correctos, el parámetro Config word #1 será 3F29 y el parámetro Config word #2 será 3FFF
Este es el programa a grabar y ejecutar:
direccion contenido
0000 1683
0001 0186
0002 1283
0003 30F0
0004 0086
0005 2804
(Quizas sea necesario habilitar el editor a traves de la opcion "Enable HEX editor" del menu "Edit"
Usando el programa WinPic, capturé dichos contenidos en la pantalla de codigo. Quedó así:
Para transferir estos contenidos a nuestro PIC, basta seleccionar la opcion "PROGRAM (CODE+DATA+CONFIG)" desde el menú "Device", espere a que se lleve a cabo la transferencia de informacion desde la PC hasta nuestro EduPIC.
Para ejecutar el programa, seleccione la opcion "Reset/ Disconnect ICSP /Go" desde el menú "Device".
Al ejecutar el programa, se encienden únicamente los leds B4,B5,B6 y B7, tal como se esperaba.
En este punto, lo importante es saber editar los contenidos del editor hexadecimal del WinPic y saber como pasar (programar) dichos contenidos al PIC en el EduPIC.
De momento, no sabemos lo que significan los valores programados, eso lo veremos mas adelante...
Sunday, August 29, 2010
Programar el PIC
La tarea de hoy es cargarle un programa diferente al PIC16F628 del "edupic".
Desconecte el eliminador, desconecte el LCD y, siguiendo el manual que viene en el CD:
Desconecte el eliminador, desconecte el LCD y, siguiendo el manual que viene en el CD:
- Puse el "jumper" S1 en la posicion "PROGRAMAR"
- Volvi a conectar el eliminador, y conecte el cable serial desde la PC hasta el edupic.
- Copie el folder que viene en el CD al escritorio
- abri la carpeta "WINPIC" y corri el programa Winpic.exe
- En la cejilla "Device,Config" puse el control "Part:" igual a "16F628A"
- En la cejilla "Interface" puse el control "Interface Type" igual a "JDM programmer for serial port"
- En la cejilla "Interface" puse el control "on port:" igual a "COM1"
- Activé la cejilla "Code", hice click en el menu "File", luego "Load & Program Device (CODE+DATA+CONFIG)"
- Seleccione el archivo "contadorF628.hex" localizado en el path:
- archivos16F628
- PROGRAMAS EN LENGUAJE ENSAMBLADOR
- LEDS, MICROSWITCHES, RELEVADOR
- hice click en el menu "device" y luego en "Reset/ Disconnect ICSP/ Go"
Saturday, August 28, 2010
Aprender a programar PICs
Siempre quise aprender a programar microcontroladores y por alguna razón, nunca me dí el tiempo para ello. Hace ya bastantes años, hasta me hice del libro "Bebop BYTES Back" el cual incluía un simulador de un sistema microcontrolador para quienes quieren aprender a programar en ensamblador.
Dicho microprocesador virtual era llamado "la beboputer", el libro está en ingles en un tono muy ameno y divertido.
Al retomar este asunto de aprender a programar -ahora microcontroladores-, elejí los PIC's debido a la gran popularidad de la que gozan.
Ademas de aprender, trataré de involucrar a mi hijo para:
1) ver si despierto en él el interés por la programacion y la electronica, y
2) trabajar juntos en algo que nos quede para el recuerdo.
Pues bien, primero, me hice de un libro y compré en linea un tablerito llamado "edupic" a traves del proveedor http://www.puntoflotante.net/ (y no es comercial).
Una noche, me decidí a solicitarlo, y, menos de 48 hrs despues, ya tenía aquel tablerito en mis manos.Esto es lo que venía como parte del paquete:
El micro que trae el kit es el PIC 16F628.
A conectarlo...
El sistema dice venir ya programado con un mensaje que se desliza en el LCD, por lo que me dispuse a conectarlo.
1) El LCD, en el conector cercano a la hilera de leds
2) El eliminador, en el conector cercano al regulador 7805.
Como se puede observar en la foto, el eliminador de baterias es del tipo "universal" por lo que hay que tener cuidado de conectar el cable que tiene los cuatro "plugs" alineando el simbolo "+" de un lado con "TIP" en el otro, de modo que la terminal central de salida sea positiva y el barril externo sea el negativo.
Enseguida, hice presion en el switch "RST" del edupic y...listo!
Observé el mensaje de prueba desplazandose en el LCD.
siguiente paso: Programar el pic
Saturday, August 14, 2010
Friday, May 21, 2010
Tuesday, May 11, 2010
Tcl and home automation
X10 home automation
- scriptkitties link
http://wiki.tcl.tk/3889
- home automation portal appliance
http://www.hometoys.com/htinews/apr06/articles/appliance/part2.htm
- icanprogram website for a good tcl tutorial
http://www.icanprogram.com/09tk/main.html
- Clyf Flynt Tcl Tutorial
http://www.cwflynt.com/CS146GameLab/
- scriptkitties link
http://wiki.tcl.tk/3889
- home automation portal appliance
http://www.hometoys.com/htinews/apr06/articles/appliance/part2.htm
- icanprogram website for a good tcl tutorial
http://www.icanprogram.com/09tk/main.html
- Clyf Flynt Tcl Tutorial
http://www.cwflynt.com/CS146GameLab/
Saturday, January 23, 2010
SQL para Access 2000
Fundamental Microsoft Jet SQL for Access 2000
http://msdn.microsoft.com/en-us/library/aa140011(office.10).aspx#acfundsql_dml
sintaxis SQL usada por Access 2000.
http://msdn.microsoft.com/en-us/library/aa140011(office.10).aspx#acfundsql_dml
sintaxis SQL usada por Access 2000.
Friday, January 15, 2010
Teaching Programming to Children
MSWLogo
MMLogic
http://www.softronix.com/
StarLogo
http://education.mit.edu/starlogo/
Links Logo kids children programming
http://radar.oreilly.com/2008/05/teaching-kids-programming.html
ROBOC
http://www.srcf.ucam.org/~dmi1000/roboc/index.html
Click Here
GameMaker
http://www.yoyogames.com/make
Scratch
http://scratch.mit.edu/
Robot
MindRover
http://www.mindrover.com/index.html
Learning HTML for Kids
http://www.goodellgroup.com/tutorial/
Robot
Colobot
http://www.ceebot.com/colobot/index-e.php
http://www.ceebot.com/ceebot/index-e.php
Juego de Mesa
http://www.c-jump.com/
Java
http://www.greenfoot.org/index.html
Python Book
http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids/
Python
http://www.swaroopch.com/notes/Python
http://news.slashdot.org/article.pl?sid=08/12/10/2257223
MMLogic
http://www.softronix.com/
StarLogo
http://education.mit.edu/starlogo/
Links Logo kids children programming
http://radar.oreilly.com/2008/05/teaching-kids-programming.html
ROBOC
http://www.srcf.ucam.org/~dmi1000/roboc/index.html
Click Here
GameMaker
http://www.yoyogames.com/make
Scratch
http://scratch.mit.edu/
Robot
MindRover
http://www.mindrover.com/index.html
Learning HTML for Kids
http://www.goodellgroup.com/tutorial/
Robot
Colobot
http://www.ceebot.com/colobot/index-e.php
http://www.ceebot.com/ceebot/index-e.php
Juego de Mesa
http://www.c-jump.com/
Java
http://www.greenfoot.org/index.html
Python Book
http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids/
Python
http://www.swaroopch.com/notes/Python
http://news.slashdot.org/article.pl?sid=08/12/10/2257223
Tuesday, January 12, 2010
Sugar and OLPC
Probé el Sugar on a Stick (SoaS), del proyecto OLPC.
1.-A veces se queda inhibido el sistema, parece componerse entrando a la aplicacion
"moon" y del "edge menu" tratar de accesar a la aplicacion que se quedó colgada.
2.-Parece ser que, por default, el audio viene silenciado.
Hay que entrar al "edge menu" y activar la bocina.
(en la esquina inferior derecha)
3.-"F3" te lleva al menú principal.
Al "bootear" se muestra un mensaje de espera de 10 segundos, a lo cual se agregan
aproximadamente 20 segundos adicionales de espera en los que parece que nada esta sucediendo...
1.-A veces se queda inhibido el sistema, parece componerse entrando a la aplicacion
"moon" y del "edge menu" tratar de accesar a la aplicacion que se quedó colgada.
2.-Parece ser que, por default, el audio viene silenciado.
Hay que entrar al "edge menu" y activar la bocina.
(en la esquina inferior derecha)
3.-"F3" te lleva al menú principal.
Al "bootear" se muestra un mensaje de espera de 10 segundos, a lo cual se agregan
aproximadamente 20 segundos adicionales de espera en los que parece que nada esta sucediendo...
Saturday, December 26, 2009
Tuesday, December 22, 2009
Comandos que entiende Robbie
move cuanto?
turn grados?
face a_donde? (n = north)
run
wait cuanto?
repeat {script} veces?
turn grados?
face a_donde? (n = north)
run
wait cuanto?
repeat {script} veces?
Los elementos que pueden ponerse en un cuarto (room), son:
wall
block
gate
switch
robot
post
Decorativos:
caption
line
arrow
compass
Sunday, December 13, 2009
La llanta ponchada
Hoy fuimos al terreno, pero solo Mirthala y yo, los niños se quedaron con
Mine. Solo fuimos a regar y, de regreso, se le ponchó la llanta a Don
Marín, los birlos parecían ser parte del rin de tan pegados que estaban.
Al final, con algo de wd40, se lograron aflojar y me sentí bien de poder
ayudar.
Mine. Solo fuimos a regar y, de regreso, se le ponchó la llanta a Don
Marín, los birlos parecían ser parte del rin de tan pegados que estaban.
Al final, con algo de wd40, se lograron aflojar y me sentí bien de poder
ayudar.
Al llegar con Mine, nos echamos una buena comida.
Ah! y a disfrutar la final con los rayados.
Saturday, December 12, 2009
LemonTree branch
Publiqué en el wiki una version de LemonTree (de Richard suchenwirth) que
permite navegar una estructura "struct::tree", en un "tree bwidget"
permite navegar una estructura "struct::tree", en un "tree bwidget"
La aplicacion permite parsear tanto paginas web como archivos html
almacenados en el sistema de archivos.
A esta pagina en el wiki, le llamé "LemonTree branch" y creo que es un muy
buen nombre que hace referencia a lo que es.
Hoy es sabado, ibamos a ir a Victoria, pero hace frio y nos quedamos.
Tambien, se supone que Marin va a estudiar. A ver si es cierto...
Thursday, December 3, 2009
Robbie the robot
Hemos estado jugando con "Robbie the robot" un juego para aprender a programar y resolver acertijos en base a mover un "robot", a traves de algunos obstaculos, switches que desactivan lasers, otros robots que interfieren en tu camino a la meta, etc.
http://wjduquette.com/projects/robbie.cgi/home
En el camino, descubrí tambien fossil, ya habra tiempo de utilizar esta interesante herramienta de control de versiones y desarrollada por la misma persona que desarrollo sqlite.
comandos para creas tus propios "cuartos" en el mundo de Robbie:
start x y
finish x y
define name laser x y dir dist
toggle name
switch x y {script when off} {script when on}
wall method 1
wall x y dir dist dir dist . . .
wall method 2
wall x1 y1 x2 y2 x3 y3
block x1 y1 x2 y2
http://wjduquette.com/projects/robbie.cgi/home
En el camino, descubrí tambien fossil, ya habra tiempo de utilizar esta interesante herramienta de control de versiones y desarrollada por la misma persona que desarrollo sqlite.
comandos para creas tus propios "cuartos" en el mundo de Robbie:
start x y
finish x y
define name laser x y dir dist
toggle name
switch x y {script when off} {script when on}
wall method 1
wall x y dir dist dir dist . . .
wall method 2
wall x1 y1 x2 y2 x3 y3
block x1 y1 x2 y2
Thursday, September 17, 2009
linux mint
En el afan de seguir probando distribuciones linux, bajé la imagen de linux mint.
Espero encontrar algo que traiga mejor soporte para redes inalambricas, por lo que vi en el live CD, esto luce prometedor (viene instalado ndiswrapper por defecto).
El plan es ir con Eduardo e instalar en su maquina para promover el uso de linux.
Viva Linux !
Espero encontrar algo que traiga mejor soporte para redes inalambricas, por lo que vi en el live CD, esto luce prometedor (viene instalado ndiswrapper por defecto).
El plan es ir con Eduardo e instalar en su maquina para promover el uso de linux.
Viva Linux !
Saturday, August 8, 2009
GR&R Software
GAGEpack by pq systems.
Cuenta con base de datos para la administracion de medidores, programacion de calibraciones, etc.
http://www.pqsystems.com/
GAGEtrack by CyberMetrics.
www.cybermetrics.com
Cuenta con base de datos para la administracion de medidores, programacion de calibraciones, etc.
http://www.pqsystems.com/
GAGEtrack by CyberMetrics.
www.cybermetrics.com
Thursday, January 15, 2009
Web Scrapping con tDOM
tDOM
http://w3.linux-magazine.com/issue/20/tDOM.pdf
Este documento contiene un ejemplo para "parsear" HTML de una manera sencilla.
http://w3.linux-magazine.com/issue/20/tDOM.pdf
Este documento contiene un ejemplo para "parsear" HTML de una manera sencilla.
Sunday, October 12, 2008
Launchers y mas...
buscando un launcher llegue a:
http://lifehacker.com/392569/best-application-launchers
Al encontrar "Launchy", encontre este articulo:
http://lifehacker.com/software/hack-attack/take-launchy-beyond-application-launching-284127.php
De ahi, se hace referencia a:
http://curl.haxx.se/
y tambien a Twitter:
http://twitter.com/timer
Uno de los programas que usan cURL es picklish:
http://www.neurofuzzy.net/2006/11/10/picklish-adds-ftp-upload/
http://lifehacker.com/392569/best-application-launchers
Al encontrar "Launchy", encontre este articulo:
http://lifehacker.com/software/hack-attack/take-launchy-beyond-application-launching-284127.php
De ahi, se hace referencia a:
http://curl.haxx.se/
y tambien a Twitter:
http://twitter.com/timer
Uno de los programas que usan cURL es picklish:
http://www.neurofuzzy.net/2006/11/10/picklish-adds-ftp-upload/
Saturday, October 11, 2008
Tcl Wiki
Generating Syntax Diagrams Using Tk
para crear diagramas de sintaxis de comandos.
http://www.sqlite.org/draft/images/syntax/create-table-stmt.gif
Sunday, September 28, 2008
Aplicaciones Interesantes
Saturday, September 13, 2008
Facilitar el llenado de formas en un navegador
El nuevo reto es facilitar a los usuarios la captura de formas en un navegador.
En este caso, Internet Explorer.
Para FireFox, existe, por ejemplo, el addon "InFormEnter".
hoy lo instale para ver como funciona.
Ya que, en la aplicacion especifica que estoy analizando, se captura texto libre en un campo de comentarios. Pero en realidad, se requiere que lo que se captura no sea texto libre, sino, claves que seria mas facil llenar con un combo box.
Entonces lo que busco es:
como crear una nueva opcion en el menu de contexto?
o hay alguna aplicacion que pueda crear una gui "encima@ del web browser?
En este caso, Internet Explorer.
Para FireFox, existe, por ejemplo, el addon "InFormEnter".
hoy lo instale para ver como funciona.
Ya que, en la aplicacion especifica que estoy analizando, se captura texto libre en un campo de comentarios. Pero en realidad, se requiere que lo que se captura no sea texto libre, sino, claves que seria mas facil llenar con un combo box.
Entonces lo que busco es:
como crear una nueva opcion en el menu de contexto?
o hay alguna aplicacion que pueda crear una gui "encima@ del web browser?
Saturday, November 3, 2007
Activando Telnet
Para activar el servicio de telnet, tuve que hacerlo en dos pasos:
1) Activar el servicio en el checkmark correspondiente en la GUI
2) Salvar ese estado
3) Volver a entrar y ahora si activar el servicio
1) Activar el servicio en el checkmark correspondiente en la GUI
2) Salvar ese estado
3) Volver a entrar y ahora si activar el servicio
Monday, September 24, 2007
Terco ? Ubuntu otra vez?
Instale InfraRecorder segun se recomienda en:
https://help.ubuntu.com/community/BurningIsoHowto
https://help.ubuntu.com/community/BurningIsoHowto
Tuesday, May 15, 2007
Parsing html
Estudiando el "parsing" de tablas en html.
demo de Tcllib (oreilly-oscon2001)
1er problema:
Aparece un error que dice que el proc "struct::tree" esta siendo llamado con un numero incorrecto de parametros.
Causa:
el demo estaba hecho para Tcllib 1.5, la opcion -key era entonces valida
pero la distribucion que tengo es Tcllib 1.9
Solucion:
Eliminar todas las apariciones de "-key" por ""
2do problema:
No veo los mensajes de debug, tuve que leer algo en el wiki, en la pagina "log"
incluso la edité.
Estos son los niveles:
emergency
alert
criticalerror
warning
notice <--- logLevel variable
info........x
debug.......x
Tuve que ponerle lo siguiente al script demo:
log::lvSuppressLE emergency 0; #habilita todos los niveles
log::lvSuppressLE $logLevel 1; # deshabilita todo lo que esté por debajo de este nivel
log::lvSuppress $logLevel 0; # restablece el nivel de interés
siendo logLevel = debug en este caso
Sab 12 de diciembre 2009:
Pude utilizar el programa LemonTree para adaptarlo al demo de O'Reilly de modo que se pueda navegar el arbol (struct::tree) de manera interactiva y usarlo como herramienta para entender la estructura de una pagina web que se quiera "parsear".
demo de Tcllib (oreilly-oscon2001)
1er problema:
Aparece un error que dice que el proc "struct::tree" esta siendo llamado con un numero incorrecto de parametros.
Causa:
el demo estaba hecho para Tcllib 1.5, la opcion -key era entonces valida
pero la distribucion que tengo es Tcllib 1.9
Solucion:
Eliminar todas las apariciones de "-key" por ""
2do problema:
No veo los mensajes de debug, tuve que leer algo en el wiki, en la pagina "log"
incluso la edité.
Estos son los niveles:
emergency
alert
criticalerror
warning
notice <--- logLevel variable
info........x
debug.......x
Tuve que ponerle lo siguiente al script demo:
log::lvSuppressLE emergency 0; #habilita todos los niveles
log::lvSuppressLE $logLevel 1; # deshabilita todo lo que esté por debajo de este nivel
log::lvSuppress $logLevel 0; # restablece el nivel de interés
siendo logLevel = debug en este caso
- si se corre el script con tclsh, aparecen los mensajes en la consola de DOS.
- si se corre el script con wish, aparecen los mensajes en la consola de Tk. (console show)
Sab 12 de diciembre 2009:
Pude utilizar el programa LemonTree para adaptarlo al demo de O'Reilly de modo que se pueda navegar el arbol (struct::tree) de manera interactiva y usarlo como herramienta para entender la estructura de una pagina web que se quiera "parsear".
Thursday, April 19, 2007
mas links de aplicaciones gratis
buscando alternativas para MS Office, encontré este sitio:
http://nedwolf.com/Freeware-Office.htm
destacan, para mi gusto:
evernote y creacion de PDF's.
tambien me llama la atencion AbiWord.
http://nedwolf.com/Freeware-Office.htm
destacan, para mi gusto:
evernote y creacion de PDF's.
tambien me llama la atencion AbiWord.
Subscribe to:
Posts (Atom)



















